/ Hex Artifact Content
Login

Artifact 89848d1ebdf1bb2078c18c173fb05d61a8ee0b35b5f4f26b21d02c9c9e4fe870:


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 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
6300: 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a  ENABLE_SESSION).
6310: 2f 2a 0a 2a 2a 20 53 74 61 74 65 20 69 6e 66 6f  /*.** State info
6320: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 73 69  rmation for a si
6330: 6e 67 6c 65 20 6f 70 65 6e 20 73 65 73 73 69 6f  ngle open sessio
6340: 6e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  n.*/.typedef str
6350: 75 63 74 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20  uct OpenSession 
6360: 4f 70 65 6e 53 65 73 73 69 6f 6e 3b 0a 73 74 72  OpenSession;.str
6370: 75 63 74 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20  uct OpenSession 
6380: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  {.  char *zName;
6390: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
63a0: 53 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 66 6f  Symbolic name fo
63b0: 72 20 74 68 69 73 20 73 65 73 73 69 6f 6e 20 2a  r this session *
63c0: 2f 0a 20 20 69 6e 74 20 6e 46 69 6c 74 65 72 3b  /.  int nFilter;
63d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
63e0: 4e 75 6d 62 65 72 20 6f 66 20 78 46 69 6c 74 65  Number of xFilte
63f0: 72 20 72 65 6a 65 63 74 69 6f 6e 20 47 4c 4f 42  r rejection GLOB
6400: 20 70 61 74 74 65 72 6e 73 20 2a 2f 0a 20 20 63   patterns */.  c
6410: 68 61 72 20 2a 2a 61 7a 46 69 6c 74 65 72 3b 20  har **azFilter; 
6420: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
6430: 20 6f 66 20 78 46 69 6c 74 65 72 20 72 65 6a 65   of xFilter reje
6440: 63 74 69 6f 6e 20 47 4c 4f 42 20 70 61 74 74 65  ction GLOB patte
6450: 72 6e 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  rns */.  sqlite3
6460: 5f 73 65 73 73 69 6f 6e 20 2a 70 3b 20 20 20 20  _session *p;    
6470: 20 20 2f 2a 20 54 68 65 20 6f 70 65 6e 20 73 65    /* The open se
6480: 73 73 69 6f 6e 20 2a 2f 0a 7d 3b 0a 23 65 6e 64  ssion */.};.#end
6490: 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 68 65 6c 6c 20  if../*.** Shell 
64a0: 6f 75 74 70 75 74 20 6d 6f 64 65 20 69 6e 66 6f  output mode info
64b0: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 62 65 66  rmation from bef
64c0: 6f 72 65 20 22 2e 65 78 70 6c 61 69 6e 20 6f 6e  ore ".explain on
64d0: 22 2c 0a 2a 2a 20 73 61 76 65 64 20 73 6f 20 74  ",.** saved so t
64e0: 68 61 74 20 69 74 20 63 61 6e 20 62 65 20 72 65  hat it can be re
64f0: 73 74 6f 72 65 64 20 62 79 20 22 2e 65 78 70 6c  stored by ".expl
6500: 61 69 6e 20 6f 66 66 22 0a 2a 2f 0a 74 79 70 65  ain off".*/.type
6510: 64 65 66 20 73 74 72 75 63 74 20 53 61 76 65 64  def struct Saved
6520: 4d 6f 64 65 49 6e 66 6f 20 53 61 76 65 64 4d 6f  ModeInfo SavedMo
6530: 64 65 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20 53  deInfo;.struct S
6540: 61 76 65 64 4d 6f 64 65 49 6e 66 6f 20 7b 0a 20  avedModeInfo {. 
6550: 20 69 6e 74 20 76 61 6c 69 64 3b 20 20 20 20 20   int valid;     
6560: 20 20 20 20 20 2f 2a 20 49 73 20 74 68 65 72 65       /* Is there
6570: 20 6c 65 67 69 74 20 64 61 74 61 20 69 6e 20 68   legit data in h
6580: 65 72 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f  ere? */.  int mo
6590: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  de;           /*
65a0: 20 4d 6f 64 65 20 70 72 69 6f 72 20 74 6f 20 22   Mode prior to "
65b0: 2e 65 78 70 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a  .explain on" */.
65c0: 20 20 69 6e 74 20 73 68 6f 77 48 65 61 64 65 72    int showHeader
65d0: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 22 2e 68  ;     /* The ".h
65e0: 65 61 64 65 72 22 20 73 65 74 74 69 6e 67 20 70  eader" setting p
65f0: 72 69 6f 72 20 74 6f 20 22 2e 65 78 70 6c 61 69  rior to ".explai
6600: 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74 20 63  n on" */.  int c
6610: 6f 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20 20 2f  olWidth[100];  /
6620: 2a 20 43 6f 6c 75 6d 6e 20 77 69 64 74 68 73 20  * Column widths 
6630: 70 72 69 6f 72 20 74 6f 20 22 2e 65 78 70 6c 61  prior to ".expla
6640: 69 6e 20 6f 6e 22 20 2a 2f 0a 7d 3b 0a 0a 74 79  in on" */.};..ty
6650: 70 65 64 65 66 20 73 74 72 75 63 74 20 45 78 70  pedef struct Exp
6660: 65 72 74 49 6e 66 6f 20 45 78 70 65 72 74 49 6e  ertInfo ExpertIn
6670: 66 6f 3b 0a 73 74 72 75 63 74 20 45 78 70 65 72  fo;.struct Exper
6680: 74 49 6e 66 6f 20 7b 0a 20 20 73 71 6c 69 74 65  tInfo {.  sqlite
6690: 33 65 78 70 65 72 74 20 2a 70 45 78 70 65 72 74  3expert *pExpert
66a0: 3b 0a 20 20 69 6e 74 20 62 56 65 72 62 6f 73 65  ;.  int bVerbose
66b0: 3b 0a 7d 3b 0a 0a 2f 2a 20 41 20 73 69 6e 67 6c  ;.};../* A singl
66c0: 65 20 6c 69 6e 65 20 69 6e 20 74 68 65 20 45 51  e line in the EQ
66d0: 50 20 6f 75 74 70 75 74 20 2a 2f 0a 74 79 70 65  P output */.type
66e0: 64 65 66 20 73 74 72 75 63 74 20 45 51 50 47 72  def struct EQPGr
66f0: 61 70 68 52 6f 77 20 45 51 50 47 72 61 70 68 52  aphRow EQPGraphR
6700: 6f 77 3b 0a 73 74 72 75 63 74 20 45 51 50 47 72  ow;.struct EQPGr
6710: 61 70 68 52 6f 77 20 7b 0a 20 20 69 6e 74 20 69  aphRow {.  int i
6720: 45 71 70 49 64 3b 20 20 20 20 20 20 20 20 20 20  EqpId;          
6730: 20 2f 2a 20 49 44 20 66 6f 72 20 74 68 69 73 20   /* ID for this 
6740: 72 6f 77 20 2a 2f 0a 20 20 69 6e 74 20 69 50 61  row */.  int iPa
6750: 72 65 6e 74 49 64 3b 20 20 20 20 20 20 20 20 2f  rentId;        /
6760: 2a 20 49 44 20 6f 66 20 74 68 65 20 70 61 72 65  * ID of the pare
6770: 6e 74 20 72 6f 77 20 2a 2f 0a 20 20 45 51 50 47  nt row */.  EQPG
6780: 72 61 70 68 52 6f 77 20 2a 70 4e 65 78 74 3b 20  raphRow *pNext; 
6790: 20 20 2f 2a 20 4e 65 78 74 20 72 6f 77 20 69 6e    /* Next row in
67a0: 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 20 20 63   sequence */.  c
67b0: 68 61 72 20 7a 54 65 78 74 5b 31 5d 3b 20 20 20  har zText[1];   
67c0: 20 20 20 20 20 2f 2a 20 54 65 78 74 20 74 6f 20       /* Text to 
67d0: 64 69 73 70 6c 61 79 20 66 6f 72 20 74 68 69 73  display for this
67e0: 20 72 6f 77 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41   row */.};../* A
67f0: 6c 6c 20 45 51 50 20 6f 75 74 70 75 74 20 69 73  ll EQP output is
6800: 20 63 6f 6c 6c 65 63 74 65 64 20 69 6e 74 6f 20   collected into 
6810: 61 6e 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  an instance of t
6820: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 2a 2f 0a  he following */.
6830: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 45  typedef struct E
6840: 51 50 47 72 61 70 68 20 45 51 50 47 72 61 70 68  QPGraph EQPGraph
6850: 3b 0a 73 74 72 75 63 74 20 45 51 50 47 72 61 70  ;.struct EQPGrap
6860: 68 20 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f  h {.  EQPGraphRo
6870: 77 20 2a 70 52 6f 77 3b 20 20 20 20 2f 2a 20 4c  w *pRow;    /* L
6880: 69 6e 6b 65 64 20 6c 69 73 74 20 6f 66 20 61 6c  inked list of al
6890: 6c 20 72 6f 77 73 20 6f 66 20 74 68 65 20 45 51  l rows of the EQ
68a0: 50 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 45 51  P output */.  EQ
68b0: 50 47 72 61 70 68 52 6f 77 20 2a 70 4c 61 73 74  PGraphRow *pLast
68c0: 3b 20 20 20 2f 2a 20 4c 61 73 74 20 65 6c 65 6d  ;   /* Last elem
68d0: 65 6e 74 20 6f 66 20 74 68 65 20 70 52 6f 77 20  ent of the pRow 
68e0: 6c 69 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 7a  list */.  char z
68f0: 50 72 65 66 69 78 5b 31 30 30 5d 3b 20 20 20 20  Prefix[100];    
6900: 2f 2a 20 47 72 61 70 68 20 70 72 65 66 69 78 20  /* Graph prefix 
6910: 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 61  */.};../*.** Sta
6920: 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  te information a
6930: 62 6f 75 74 20 74 68 65 20 64 61 74 61 62 61 73  bout the databas
6940: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
6950: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 61 6e 0a  contained in an.
6960: 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ** instance of t
6970: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
6980: 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64  ucture..*/.typed
6990: 65 66 20 73 74 72 75 63 74 20 53 68 65 6c 6c 53  ef struct ShellS
69a0: 74 61 74 65 20 53 68 65 6c 6c 53 74 61 74 65 3b  tate ShellState;
69b0: 0a 73 74 72 75 63 74 20 53 68 65 6c 6c 53 74 61  .struct ShellSta
69c0: 74 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  te {.  sqlite3 *
69d0: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  db;           /*
69e0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   The database */
69f0: 0a 20 20 75 38 20 61 75 74 6f 45 78 70 6c 61 69  .  u8 autoExplai
6a00: 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 75 74  n;        /* Aut
6a10: 6f 6d 61 74 69 63 61 6c 6c 79 20 74 75 72 6e 20  omatically turn 
6a20: 6f 6e 20 2e 65 78 70 6c 61 69 6e 20 6d 6f 64 65  on .explain mode
6a30: 20 2a 2f 0a 20 20 75 38 20 61 75 74 6f 45 51 50   */.  u8 autoEQP
6a40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
6a50: 52 75 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52  Run EXPLAIN QUER
6a60: 59 20 50 4c 41 4e 20 70 72 69 6f 72 20 74 6f 20  Y PLAN prior to 
6a70: 73 65 61 63 68 20 53 51 4c 20 73 74 6d 74 20 2a  seach SQL stmt *
6a80: 2f 0a 20 20 75 38 20 61 75 74 6f 45 51 50 74 65  /.  u8 autoEQPte
6a90: 73 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 61 75  st;        /* au
6aa0: 74 6f 45 51 50 20 69 73 20 69 6e 20 74 65 73 74  toEQP is in test
6ab0: 20 6d 6f 64 65 20 2a 2f 0a 20 20 75 38 20 61 75   mode */.  u8 au
6ac0: 74 6f 45 51 50 74 72 61 63 65 3b 20 20 20 20 20  toEQPtrace;     
6ad0: 20 20 2f 2a 20 61 75 74 6f 45 51 50 20 69 73 20    /* autoEQP is 
6ae0: 69 6e 20 74 72 61 63 65 20 6d 6f 64 65 20 2a 2f  in trace mode */
6af0: 0a 20 20 75 38 20 73 74 61 74 73 4f 6e 3b 20 20  .  u8 statsOn;  
6b00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
6b10: 65 20 74 6f 20 64 69 73 70 6c 61 79 20 6d 65 6d  e to display mem
6b20: 6f 72 79 20 73 74 61 74 73 20 62 65 66 6f 72 65  ory stats before
6b30: 20 65 61 63 68 20 66 69 6e 61 6c 69 7a 65 20 2a   each finalize *
6b40: 2f 0a 20 20 75 38 20 73 63 61 6e 73 74 61 74 73  /.  u8 scanstats
6b50: 4f 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  On;        /* Tr
6b60: 75 65 20 74 6f 20 64 69 73 70 6c 61 79 20 73 63  ue to display sc
6b70: 61 6e 20 73 74 61 74 73 20 62 65 66 6f 72 65 20  an stats before 
6b80: 65 61 63 68 20 66 69 6e 61 6c 69 7a 65 20 2a 2f  each finalize */
6b90: 0a 20 20 75 38 20 6f 70 65 6e 4d 6f 64 65 3b 20  .  u8 openMode; 
6ba0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 48 45            /* SHE
6bb0: 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 2c 20  LL_OPEN_NORMAL, 
6bc0: 5f 41 50 50 45 4e 44 56 46 53 2c 20 6f 72 20 5f  _APPENDVFS, or _
6bd0: 5a 49 50 46 49 4c 45 20 2a 2f 0a 20 20 75 38 20  ZIPFILE */.  u8 
6be0: 64 6f 58 64 67 4f 70 65 6e 3b 20 20 20 20 20 20  doXdgOpen;      
6bf0: 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 73 74      /* Invoke st
6c00: 61 72 74 2f 6f 70 65 6e 2f 78 64 67 2d 6f 70 65  art/open/xdg-ope
6c10: 6e 20 69 6e 20 6f 75 74 70 75 74 5f 72 65 73 65  n in output_rese
6c20: 74 28 29 20 2a 2f 0a 20 20 75 38 20 6e 45 71 70  t() */.  u8 nEqp
6c30: 4c 65 76 65 6c 3b 20 20 20 20 20 20 20 20 20 20  Level;          
6c40: 2f 2a 20 44 65 70 74 68 20 6f 66 20 74 68 65 20  /* Depth of the 
6c50: 45 51 50 20 6f 75 74 70 75 74 20 67 72 61 70 68  EQP output graph
6c60: 20 2a 2f 0a 20 20 75 38 20 65 54 72 61 63 65 54   */.  u8 eTraceT
6c70: 79 70 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ype;         /* 
6c80: 53 48 45 4c 4c 5f 54 52 41 43 45 5f 2a 20 76 61  SHELL_TRACE_* va
6c90: 6c 75 65 20 66 6f 72 20 74 79 70 65 20 6f 66 20  lue for type of 
6ca0: 74 72 61 63 65 20 2a 2f 0a 20 20 75 6e 73 69 67  trace */.  unsig
6cb0: 6e 65 64 20 6d 45 71 70 4c 69 6e 65 73 3b 20 20  ned mEqpLines;  
6cc0: 20 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 76 65 72    /* Mask of ver
6cd0: 69 74 69 63 61 6c 20 6c 69 6e 65 73 20 69 6e 20  itical lines in 
6ce0: 74 68 65 20 45 51 50 20 6f 75 74 70 75 74 20 67  the EQP output g
6cf0: 72 61 70 68 20 2a 2f 0a 20 20 69 6e 74 20 6f 75  raph */.  int ou
6d00: 74 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20  tCount;         
6d10: 20 2f 2a 20 52 65 76 65 72 74 20 74 6f 20 73 74   /* Revert to st
6d20: 64 6f 75 74 20 77 68 65 6e 20 72 65 61 63 68 69  dout when reachi
6d30: 6e 67 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74  ng zero */.  int
6d40: 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20   cnt;           
6d50: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6d60: 20 72 65 63 6f 72 64 73 20 64 69 73 70 6c 61 79   records display
6d70: 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 69  ed so far */.  i
6d80: 6e 74 20 6c 69 6e 65 6e 6f 3b 20 20 20 20 20 20  nt lineno;      
6d90: 20 20 20 20 20 20 2f 2a 20 4c 69 6e 65 20 6e 75        /* Line nu
6da0: 6d 62 65 72 20 6f 66 20 6c 61 73 74 20 6c 69 6e  mber of last lin
6db0: 65 20 72 65 61 64 20 66 72 6f 6d 20 69 6e 20 2a  e read from in *
6dc0: 2f 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 20 20 20  /.  FILE *in;   
6dd0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
6de0: 61 64 20 63 6f 6d 6d 61 6e 64 73 20 66 72 6f 6d  ad commands from
6df0: 20 74 68 69 73 20 73 74 72 65 61 6d 20 2a 2f 0a   this stream */.
6e00: 20 20 46 49 4c 45 20 2a 6f 75 74 3b 20 20 20 20    FILE *out;    
6e10: 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69 74           /* Writ
6e20: 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a  e results here *
6e30: 2f 0a 20 20 46 49 4c 45 20 2a 74 72 61 63 65 4f  /.  FILE *traceO
6e40: 75 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f 75  ut;        /* Ou
6e50: 74 70 75 74 20 66 6f 72 20 73 71 6c 69 74 65 33  tput for sqlite3
6e60: 5f 74 72 61 63 65 28 29 20 2a 2f 0a 20 20 69 6e  _trace() */.  in
6e70: 74 20 6e 45 72 72 3b 20 20 20 20 20 20 20 20 20  t nErr;         
6e80: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
6e90: 66 20 65 72 72 6f 72 73 20 73 65 65 6e 20 2a 2f  f errors seen */
6ea0: 0a 20 20 69 6e 74 20 6d 6f 64 65 3b 20 20 20 20  .  int mode;    
6eb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
6ec0: 6f 75 74 70 75 74 20 6d 6f 64 65 20 73 65 74 74  output mode sett
6ed0: 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64  ing */.  int mod
6ee0: 65 50 72 69 6f 72 3b 20 20 20 20 20 20 20 20 20  ePrior;         
6ef0: 2f 2a 20 53 61 76 65 64 20 6d 6f 64 65 20 2a 2f  /* Saved mode */
6f00: 0a 20 20 69 6e 74 20 63 4d 6f 64 65 3b 20 20 20  .  int cMode;   
6f10: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 65 6d            /* tem
6f20: 70 6f 72 61 72 79 20 6f 75 74 70 75 74 20 6d 6f  porary output mo
6f30: 64 65 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  de for the curre
6f40: 6e 74 20 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e  nt query */.  in
6f50: 74 20 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 20 20 20  t normalMode;   
6f60: 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74 20 6d       /* Output m
6f70: 6f 64 65 20 62 65 66 6f 72 65 20 22 2e 65 78 70  ode before ".exp
6f80: 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e  lain on" */.  in
6f90: 74 20 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61  t writableSchema
6fa0: 3b 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20  ;    /* True if 
6fb0: 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f  PRAGMA writable_
6fc0: 73 63 68 65 6d 61 3d 4f 4e 20 2a 2f 0a 20 20 69  schema=ON */.  i
6fd0: 6e 74 20 73 68 6f 77 48 65 61 64 65 72 3b 20 20  nt showHeader;  
6fe0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
6ff0: 20 73 68 6f 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d   show column nam
7000: 65 73 20 69 6e 20 4c 69 73 74 20 6f 72 20 43 6f  es in List or Co
7010: 6c 75 6d 6e 20 6d 6f 64 65 20 2a 2f 0a 20 20 69  lumn mode */.  i
7020: 6e 74 20 6e 43 68 65 63 6b 3b 20 20 20 20 20 20  nt nCheck;      
7030: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
7040: 6f 66 20 22 2e 63 68 65 63 6b 22 20 63 6f 6d 6d  of ".check" comm
7050: 61 6e 64 73 20 72 75 6e 20 2a 2f 0a 20 20 75 6e  ands run */.  un
7060: 73 69 67 6e 65 64 20 6e 50 72 6f 67 72 65 73 73  signed nProgress
7070: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
7080: 66 20 70 72 6f 67 72 65 73 73 20 63 61 6c 6c 62  f progress callb
7090: 61 63 6b 73 20 65 6e 63 6f 75 6e 74 65 72 65 64  acks encountered
70a0: 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 6d   */.  unsigned m
70b0: 78 50 72 6f 67 72 65 73 73 3b 20 20 20 2f 2a 20  xProgress;   /* 
70c0: 4d 61 78 69 6d 75 6d 20 70 72 6f 67 72 65 73 73  Maximum progress
70d0: 20 63 61 6c 6c 62 61 63 6b 73 20 62 65 66 6f 72   callbacks befor
70e0: 65 20 66 61 69 6c 69 6e 67 20 2a 2f 0a 20 20 75  e failing */.  u
70f0: 6e 73 69 67 6e 65 64 20 66 6c 67 50 72 6f 67 72  nsigned flgProgr
7100: 65 73 73 3b 20 20 2f 2a 20 46 6c 61 67 73 20 66  ess;  /* Flags f
7110: 6f 72 20 74 68 65 20 70 72 6f 67 72 65 73 73 20  or the progress 
7120: 63 61 6c 6c 62 61 63 6b 20 2a 2f 0a 20 20 75 6e  callback */.  un
7130: 73 69 67 6e 65 64 20 73 68 65 6c 6c 46 6c 67 73  signed shellFlgs
7140: 3b 20 20 20 20 2f 2a 20 56 61 72 69 6f 75 73 20  ;    /* Various 
7150: 66 6c 61 67 73 20 2a 2f 0a 20 20 73 71 6c 69 74  flags */.  sqlit
7160: 65 33 5f 69 6e 74 36 34 20 73 7a 4d 61 78 3b 20  e3_int64 szMax; 
7170: 20 20 2f 2a 20 2d 2d 6d 61 78 73 69 7a 65 20 61    /* --maxsize a
7180: 72 67 75 6d 65 6e 74 20 74 6f 20 2e 6f 70 65 6e  rgument to .open
7190: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 65 73   */.  char *zDes
71a0: 74 54 61 62 6c 65 3b 20 20 20 20 20 20 2f 2a 20  tTable;      /* 
71b0: 4e 61 6d 65 20 6f 66 20 64 65 73 74 69 6e 61 74  Name of destinat
71c0: 69 6f 6e 20 74 61 62 6c 65 20 77 68 65 6e 20 4d  ion table when M
71d0: 4f 44 45 5f 49 6e 73 65 72 74 20 2a 2f 0a 20 20  ODE_Insert */.  
71e0: 63 68 61 72 20 2a 7a 54 65 6d 70 46 69 6c 65 3b  char *zTempFile;
71f0: 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72         /* Tempor
7200: 61 72 79 20 66 69 6c 65 20 74 68 61 74 20 6d 69  ary file that mi
7210: 67 68 74 20 6e 65 65 64 20 64 65 6c 65 74 69 6e  ght need deletin
7220: 67 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 65 73  g */.  char zTes
7230: 74 63 61 73 65 5b 33 30 5d 3b 20 20 20 20 2f 2a  tcase[30];    /*
7240: 20 4e 61 6d 65 20 6f 66 20 63 75 72 72 65 6e 74   Name of current
7250: 20 74 65 73 74 20 63 61 73 65 20 2a 2f 0a 20 20   test case */.  
7260: 63 68 61 72 20 63 6f 6c 53 65 70 61 72 61 74 6f  char colSeparato
7270: 72 5b 32 30 5d 3b 20 2f 2a 20 43 6f 6c 75 6d 6e  r[20]; /* Column
7280: 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72 61   separator chara
7290: 63 74 65 72 20 66 6f 72 20 73 65 76 65 72 61 6c  cter for several
72a0: 20 6d 6f 64 65 73 20 2a 2f 0a 20 20 63 68 61 72   modes */.  char
72b0: 20 72 6f 77 53 65 70 61 72 61 74 6f 72 5b 32 30   rowSeparator[20
72c0: 5d 3b 20 2f 2a 20 52 6f 77 20 73 65 70 61 72 61  ]; /* Row separa
72d0: 74 6f 72 20 63 68 61 72 61 63 74 65 72 20 66 6f  tor character fo
72e0: 72 20 4d 4f 44 45 5f 41 73 63 69 69 20 2a 2f 0a  r MODE_Ascii */.
72f0: 20 20 63 68 61 72 20 63 6f 6c 53 65 70 50 72 69    char colSepPri
7300: 6f 72 5b 32 30 5d 3b 20 20 2f 2a 20 53 61 76 65  or[20];  /* Save
7310: 64 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74  d column separat
7320: 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 72 6f 77  or */.  char row
7330: 53 65 70 50 72 69 6f 72 5b 32 30 5d 3b 20 20 2f  SepPrior[20];  /
7340: 2a 20 53 61 76 65 64 20 72 6f 77 20 73 65 70 61  * Saved row sepa
7350: 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 63  rator */.  int c
7360: 6f 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20 20 20  olWidth[100];   
7370: 20 20 2f 2a 20 52 65 71 75 65 73 74 65 64 20 77    /* Requested w
7380: 69 64 74 68 20 6f 66 20 65 61 63 68 20 63 6f 6c  idth of each col
7390: 75 6d 6e 20 77 68 65 6e 20 69 6e 20 63 6f 6c 75  umn when in colu
73a0: 6d 6e 20 6d 6f 64 65 2a 2f 0a 20 20 69 6e 74 20  mn mode*/.  int 
73b0: 61 63 74 75 61 6c 57 69 64 74 68 5b 31 30 30 5d  actualWidth[100]
73c0: 3b 20 20 2f 2a 20 41 63 74 75 61 6c 20 77 69 64  ;  /* Actual wid
73d0: 74 68 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d  th of each colum
73e0: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 6e 75 6c 6c  n */.  char null
73f0: 56 61 6c 75 65 5b 32 30 5d 3b 20 20 20 20 2f 2a  Value[20];    /*
7400: 20 54 68 65 20 74 65 78 74 20 74 6f 20 70 72 69   The text to pri
7410: 6e 74 20 77 68 65 6e 20 61 20 4e 55 4c 4c 20 63  nt when a NULL c
7420: 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f 6d 0a 20  omes back from. 
7430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7440: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64          ** the d
7450: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61  atabase */.  cha
7460: 72 20 6f 75 74 66 69 6c 65 5b 46 49 4c 45 4e 41  r outfile[FILENA
7470: 4d 45 5f 4d 41 58 5d 3b 20 2f 2a 20 46 69 6c 65  ME_MAX]; /* File
7480: 6e 61 6d 65 20 66 6f 72 20 2a 6f 75 74 20 2a 2f  name for *out */
7490: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
74a0: 44 62 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 2f  DbFilename;    /
74b0: 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * name of the da
74c0: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
74d0: 20 63 68 61 72 20 2a 7a 46 72 65 65 4f 6e 43 6c   char *zFreeOnCl
74e0: 6f 73 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ose;         /* 
74f0: 46 69 6c 65 6e 61 6d 65 20 74 6f 20 66 72 65 65  Filename to free
7500: 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f   when closing */
7510: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7520: 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Vfs;           /
7530: 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53 20 74 6f  * Name of VFS to
7540: 20 75 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65   use */.  sqlite
7550: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20  3_stmt *pStmt;  
7560: 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 74 61 74   /* Current stat
7570: 65 6d 65 6e 74 20 69 66 20 61 6e 79 2e 20 2a 2f  ement if any. */
7580: 0a 20 20 46 49 4c 45 20 2a 70 4c 6f 67 3b 20 20  .  FILE *pLog;  
7590: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
75a0: 74 65 20 6c 6f 67 20 6f 75 74 70 75 74 20 68 65  te log output he
75b0: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 49  re */.  int *aiI
75c0: 6e 64 65 6e 74 3b 20 20 20 20 20 20 20 20 20 2f  ndent;         /
75d0: 2a 20 41 72 72 61 79 20 6f 66 20 69 6e 64 65 6e  * Array of inden
75e0: 74 73 20 75 73 65 64 20 69 6e 20 4d 4f 44 45 5f  ts used in MODE_
75f0: 45 78 70 6c 61 69 6e 20 2a 2f 0a 20 20 69 6e 74  Explain */.  int
7600: 20 6e 49 6e 64 65 6e 74 3b 20 20 20 20 20 20 20   nIndent;       
7610: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
7620: 72 72 61 79 20 61 69 49 6e 64 65 6e 74 5b 5d 20  rray aiIndent[] 
7630: 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65 6e 74  */.  int iIndent
7640: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;           /* I
7650: 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20  ndex of current 
7660: 6f 70 20 69 6e 20 61 69 49 6e 64 65 6e 74 5b 5d  op in aiIndent[]
7670: 20 2a 2f 0a 20 20 45 51 50 47 72 61 70 68 20 73   */.  EQPGraph s
7680: 47 72 61 70 68 3b 20 20 20 20 20 20 20 2f 2a 20  Graph;       /* 
7690: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  Information for 
76a0: 74 68 65 20 67 72 61 70 68 69 63 61 6c 20 45 58  the graphical EX
76b0: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
76c0: 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
76d0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
76e0: 53 53 49 4f 4e 29 0a 20 20 69 6e 74 20 6e 53 65  SSION).  int nSe
76f0: 73 73 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  ssion;          
7700: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7710: 61 63 74 69 76 65 20 73 65 73 73 69 6f 6e 73 20  active sessions 
7720: 2a 2f 0a 20 20 4f 70 65 6e 53 65 73 73 69 6f 6e  */.  OpenSession
7730: 20 61 53 65 73 73 69 6f 6e 5b 34 5d 3b 20 20 2f   aSession[4];  /
7740: 2a 20 41 72 72 61 79 20 6f 66 20 73 65 73 73 69  * Array of sessi
7750: 6f 6e 73 2e 20 20 5b 30 5d 20 69 73 20 69 6e 20  ons.  [0] is in 
7760: 66 6f 63 75 73 2e 20 2a 2f 0a 23 65 6e 64 69 66  focus. */.#endif
7770: 0a 20 20 45 78 70 65 72 74 49 6e 66 6f 20 65 78  .  ExpertInfo ex
7780: 70 65 72 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  pert;        /* 
7790: 56 61 6c 69 64 20 69 66 20 70 72 65 76 69 6f 75  Valid if previou
77a0: 73 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20 22 2e  s command was ".
77b0: 65 78 70 65 72 74 20 4f 50 54 2e 2e 2e 22 20 2a  expert OPT..." *
77c0: 2f 0a 7d 3b 0a 0a 0a 2f 2a 20 41 6c 6c 6f 77 65  /.};.../* Allowe
77d0: 64 20 76 61 6c 75 65 73 20 66 6f 72 20 53 68 65  d values for She
77e0: 6c 6c 53 74 61 74 65 2e 61 75 74 6f 45 51 50 0a  llState.autoEQP.
77f0: 2a 2f 0a 23 64 65 66 69 6e 65 20 41 55 54 4f 45  */.#define AUTOE
7800: 51 50 5f 6f 66 66 20 20 20 20 20 20 30 20 20 20  QP_off      0   
7810: 20 20 20 20 20 20 20 20 2f 2a 20 41 75 74 6f 6d          /* Autom
7820: 61 74 69 63 20 45 58 50 4c 41 49 4e 20 51 55 45  atic EXPLAIN QUE
7830: 52 59 20 50 4c 41 4e 20 69 73 20 6f 66 66 20 2a  RY PLAN is off *
7840: 2f 0a 23 64 65 66 69 6e 65 20 41 55 54 4f 45 51  /.#define AUTOEQ
7850: 50 5f 6f 6e 20 20 20 20 20 20 20 31 20 20 20 20  P_on       1    
7860: 20 20 20 20 20 20 20 2f 2a 20 41 75 74 6f 6d 61         /* Automa
7870: 74 69 63 20 45 51 50 20 69 73 20 6f 6e 20 2a 2f  tic EQP is on */
7880: 0a 23 64 65 66 69 6e 65 20 41 55 54 4f 45 51 50  .#define AUTOEQP
7890: 5f 74 72 69 67 67 65 72 20 20 32 20 20 20 20 20  _trigger  2     
78a0: 20 20 20 20 20 20 2f 2a 20 4f 6e 20 61 6e 64 20        /* On and 
78b0: 61 6c 73 6f 20 73 68 6f 77 20 70 6c 61 6e 73 20  also show plans 
78c0: 66 6f 72 20 74 72 69 67 67 65 72 73 20 2a 2f 0a  for triggers */.
78d0: 23 64 65 66 69 6e 65 20 41 55 54 4f 45 51 50 5f  #define AUTOEQP_
78e0: 66 75 6c 6c 20 20 20 20 20 33 20 20 20 20 20 20  full     3      
78f0: 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 66 75 6c       /* Show ful
7900: 6c 20 45 58 50 4c 41 49 4e 20 2a 2f 0a 0a 2f 2a  l EXPLAIN */../*
7910: 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 20   Allowed values 
7920: 66 6f 72 20 53 68 65 6c 6c 53 74 61 74 65 2e 6f  for ShellState.o
7930: 70 65 6e 4d 6f 64 65 0a 2a 2f 0a 23 64 65 66 69  penMode.*/.#defi
7940: 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e  ne SHELL_OPEN_UN
7950: 53 50 45 43 20 20 20 20 20 20 30 20 20 20 20 20  SPEC      0     
7960: 20 2f 2a 20 4e 6f 20 6f 70 65 6e 2d 6d 6f 64 65   /* No open-mode
7970: 20 73 70 65 63 69 66 69 65 64 20 2a 2f 0a 23 64   specified */.#d
7980: 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e  efine SHELL_OPEN
7990: 5f 4e 4f 52 4d 41 4c 20 20 20 20 20 20 31 20 20  _NORMAL      1  
79a0: 20 20 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 64 61      /* Normal da
79b0: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23  tabase file */.#
79c0: 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45  define SHELL_OPE
79d0: 4e 5f 41 50 50 45 4e 44 56 46 53 20 20 20 32 20  N_APPENDVFS   2 
79e0: 20 20 20 20 20 2f 2a 20 55 73 65 20 61 70 70 65       /* Use appe
79f0: 6e 64 76 66 73 20 2a 2f 0a 23 64 65 66 69 6e 65  ndvfs */.#define
7a00: 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46   SHELL_OPEN_ZIPF
7a10: 49 4c 45 20 20 20 20 20 33 20 20 20 20 20 20 2f  ILE     3      /
7a20: 2a 20 55 73 65 20 74 68 65 20 7a 69 70 66 69 6c  * Use the zipfil
7a30: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
7a40: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c  */.#define SHELL
7a50: 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20  _OPEN_READONLY  
7a60: 20 20 34 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e    4      /* Open
7a70: 20 61 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61   a normal databa
7a80: 73 65 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a  se read-only */.
7a90: 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50  #define SHELL_OP
7aa0: 45 4e 5f 44 45 53 45 52 49 41 4c 49 5a 45 20 35  EN_DESERIALIZE 5
7ab0: 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 75 73        /* Open us
7ac0: 69 6e 67 20 73 71 6c 69 74 65 33 5f 64 65 73 65  ing sqlite3_dese
7ad0: 72 69 61 6c 69 7a 65 28 29 20 2a 2f 0a 23 64 65  rialize() */.#de
7ae0: 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  fine SHELL_OPEN_
7af0: 48 45 58 44 42 20 20 20 20 20 20 20 36 20 20 20  HEXDB       6   
7b00: 20 20 20 2f 2a 20 55 73 65 20 22 64 62 74 6f 74     /* Use "dbtot
7b10: 78 74 22 20 6f 75 74 70 75 74 20 61 73 20 64 61  xt" output as da
7b20: 74 61 20 73 6f 75 72 63 65 20 2a 2f 0a 23 64 65  ta source */.#de
7b30: 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  fine SHELL_OPEN_
7b40: 52 45 55 53 45 53 43 48 45 4d 41 20 37 20 20 20  REUSESCHEMA 7   
7b50: 20 20 20 2f 2a 20 4f 70 65 6e 20 66 6f 72 20 73     /* Open for s
7b60: 63 68 65 6d 61 20 72 65 75 73 65 20 2a 2f 0a 0a  chema reuse */..
7b70: 2f 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65  /* Allowed value
7b80: 73 20 66 6f 72 20 53 68 65 6c 6c 53 74 61 74 65  s for ShellState
7b90: 2e 65 54 72 61 63 65 54 79 70 65 0a 2a 2f 0a 23  .eTraceType.*/.#
7ba0: 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 54 52 41  define SHELL_TRA
7bb0: 43 45 5f 50 4c 41 49 4e 20 20 20 20 20 20 30 20  CE_PLAIN      0 
7bc0: 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 69 6e 70       /* Show inp
7bd0: 75 74 20 53 51 4c 20 74 65 78 74 20 2a 2f 0a 23  ut SQL text */.#
7be0: 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 54 52 41  define SHELL_TRA
7bf0: 43 45 5f 45 58 50 41 4e 44 45 44 20 20 20 31 20  CE_EXPANDED   1 
7c00: 20 20 20 20 20 2f 2a 20 53 68 6f 77 20 65 78 70       /* Show exp
7c10: 61 6e 64 65 64 20 53 51 4c 20 74 65 78 74 20 2a  anded SQL text *
7c20: 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f  /.#define SHELL_
7c30: 54 52 41 43 45 5f 4e 4f 52 4d 41 4c 49 5a 45 44  TRACE_NORMALIZED
7c40: 20 32 20 20 20 20 20 20 2f 2a 20 53 68 6f 77 20   2      /* Show 
7c50: 6e 6f 72 6d 61 6c 69 7a 65 64 20 53 51 4c 20 74  normalized SQL t
7c60: 65 78 74 20 2a 2f 0a 0a 2f 2a 20 42 69 74 73 20  ext */../* Bits 
7c70: 69 6e 20 74 68 65 20 53 68 65 6c 6c 53 74 61 74  in the ShellStat
7c80: 65 2e 66 6c 67 50 72 6f 67 72 65 73 73 20 76 61  e.flgProgress va
7c90: 72 69 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e  riable */.#defin
7ca0: 65 20 53 48 45 4c 4c 5f 50 52 4f 47 52 45 53 53  e SHELL_PROGRESS
7cb0: 5f 51 55 49 45 54 20 30 78 30 31 20 20 2f 2a 20  _QUIET 0x01  /* 
7cc0: 4f 6d 69 74 20 61 6e 6e 6f 75 6e 63 69 6e 67 20  Omit announcing 
7cd0: 65 76 65 72 79 20 70 72 6f 67 72 65 73 73 20 63  every progress c
7ce0: 61 6c 6c 62 61 63 6b 20 2a 2f 0a 23 64 65 66 69  allback */.#defi
7cf0: 6e 65 20 53 48 45 4c 4c 5f 50 52 4f 47 52 45 53  ne SHELL_PROGRES
7d00: 53 5f 52 45 53 45 54 20 30 78 30 32 20 20 2f 2a  S_RESET 0x02  /*
7d10: 20 52 65 73 65 74 20 74 68 65 20 63 6f 75 6e 74   Reset the count
7d20: 20 77 68 65 6e 20 74 68 65 20 70 72 6f 67 72 65   when the progre
7d30: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s.              
7d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d50: 20 20 20 20 20 2a 2a 20 63 61 6c 6c 62 61 63 6b       ** callback
7d60: 20 6c 69 6d 69 74 20 69 73 20 72 65 61 63 68 65   limit is reache
7d70: 64 2c 20 61 6e 64 20 66 6f 72 20 65 61 63 68 0a  d, and for each.
7d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7da0: 20 20 20 2a 2a 20 74 6f 70 2d 6c 65 76 65 6c 20     ** top-level 
7db0: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  SQL statement */
7dc0: 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 50  .#define SHELL_P
7dd0: 52 4f 47 52 45 53 53 5f 4f 4e 43 45 20 20 30 78  ROGRESS_ONCE  0x
7de0: 30 34 20 20 2f 2a 20 43 61 6e 63 65 6c 20 74 68  04  /* Cancel th
7df0: 65 20 2d 2d 6c 69 6d 69 74 20 61 66 74 65 72 20  e --limit after 
7e00: 66 69 72 69 6e 67 20 6f 6e 63 65 20 2a 2f 0a 0a  firing once */..
7e10: 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20  /*.** These are 
7e20: 74 68 65 20 61 6c 6c 6f 77 65 64 20 73 68 65 6c  the allowed shel
7e30: 6c 46 6c 67 73 20 76 61 6c 75 65 73 0a 2a 2f 0a  lFlgs values.*/.
7e40: 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 50 61  #define SHFLG_Pa
7e50: 67 65 63 61 63 68 65 20 20 20 20 20 20 30 78 30  gecache      0x0
7e60: 30 30 30 30 30 30 31 20 2f 2a 20 54 68 65 20 2d  0000001 /* The -
7e70: 2d 70 61 67 65 63 61 63 68 65 20 6f 70 74 69 6f  -pagecache optio
7e80: 6e 20 69 73 20 75 73 65 64 20 2a 2f 0a 23 64 65  n is used */.#de
7e90: 66 69 6e 65 20 53 48 46 4c 47 5f 4c 6f 6f 6b 61  fine SHFLG_Looka
7ea0: 73 69 64 65 20 20 20 20 20 20 30 78 30 30 30 30  side      0x0000
7eb0: 30 30 30 32 20 2f 2a 20 4c 6f 6f 6b 61 73 69 64  0002 /* Lookasid
7ec0: 65 20 6d 65 6d 6f 72 79 20 69 73 20 75 73 65 64  e memory is used
7ed0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c   */.#define SHFL
7ee0: 47 5f 42 61 63 6b 73 6c 61 73 68 20 20 20 20 20  G_Backslash     
7ef0: 20 30 78 30 30 30 30 30 30 30 34 20 2f 2a 20 54   0x00000004 /* T
7f00: 68 65 20 2d 2d 62 61 63 6b 73 6c 61 73 68 20 6f  he --backslash o
7f10: 70 74 69 6f 6e 20 69 73 20 75 73 65 64 20 2a 2f  ption is used */
7f20: 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 50  .#define SHFLG_P
7f30: 72 65 73 65 72 76 65 52 6f 77 69 64 20 20 30 78  reserveRowid  0x
7f40: 30 30 30 30 30 30 30 38 20 2f 2a 20 2e 64 75 6d  00000008 /* .dum
7f50: 70 20 70 72 65 73 65 72 76 65 73 20 72 6f 77 69  p preserves rowi
7f60: 64 20 76 61 6c 75 65 73 20 2a 2f 0a 23 64 65 66  d values */.#def
7f70: 69 6e 65 20 53 48 46 4c 47 5f 4e 65 77 6c 69 6e  ine SHFLG_Newlin
7f80: 65 73 20 20 20 20 20 20 20 30 78 30 30 30 30 30  es       0x00000
7f90: 30 31 30 20 2f 2a 20 2e 64 75 6d 70 20 2d 2d 6e  010 /* .dump --n
7fa0: 65 77 6c 69 6e 65 20 66 6c 61 67 20 2a 2f 0a 23  ewline flag */.#
7fb0: 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 43 6f 75  define SHFLG_Cou
7fc0: 6e 74 43 68 61 6e 67 65 73 20 20 20 30 78 30 30  ntChanges   0x00
7fd0: 30 30 30 30 32 30 20 2f 2a 20 2e 63 68 61 6e 67  000020 /* .chang
7fe0: 65 73 20 73 65 74 74 69 6e 67 20 2a 2f 0a 23 64  es setting */.#d
7ff0: 65 66 69 6e 65 20 53 48 46 4c 47 5f 45 63 68 6f  efine SHFLG_Echo
8000: 20 20 20 20 20 20 20 20 20 20 20 30 78 30 30 30             0x000
8010: 30 30 30 34 30 20 2f 2a 20 2e 65 63 68 6f 20 6f  00040 /* .echo o
8020: 72 20 2d 2d 65 63 68 6f 20 73 65 74 74 69 6e 67  r --echo setting
8030: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f   */../*.** Macro
8040: 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  s for testing an
8050: 64 20 73 65 74 74 69 6e 67 20 73 68 65 6c 6c 46  d setting shellF
8060: 6c 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  lgs.*/.#define S
8070: 68 65 6c 6c 48 61 73 46 6c 61 67 28 50 2c 58 29  hellHasFlag(P,X)
8080: 20 20 20 20 28 28 28 50 29 2d 3e 73 68 65 6c 6c      (((P)->shell
8090: 46 6c 67 73 20 26 20 28 58 29 29 21 3d 30 29 0a  Flgs & (X))!=0).
80a0: 23 64 65 66 69 6e 65 20 53 68 65 6c 6c 53 65 74  #define ShellSet
80b0: 46 6c 61 67 28 50 2c 58 29 20 20 20 20 28 28 50  Flag(P,X)    ((P
80c0: 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 7c 3d 28 58  )->shellFlgs|=(X
80d0: 29 29 0a 23 64 65 66 69 6e 65 20 53 68 65 6c 6c  )).#define Shell
80e0: 43 6c 65 61 72 46 6c 61 67 28 50 2c 58 29 20 20  ClearFlag(P,X)  
80f0: 28 28 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 26  ((P)->shellFlgs&
8100: 3d 28 7e 28 58 29 29 29 0a 0a 2f 2a 0a 2a 2a 20  =(~(X)))../*.** 
8110: 54 68 65 73 65 20 61 72 65 20 74 68 65 20 61 6c  These are the al
8120: 6c 6f 77 65 64 20 6d 6f 64 65 73 2e 0a 2a 2f 0a  lowed modes..*/.
8130: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 4c 69 6e  #define MODE_Lin
8140: 65 20 20 20 20 20 30 20 20 2f 2a 20 4f 6e 65 20  e     0  /* One 
8150: 63 6f 6c 75 6d 6e 20 70 65 72 20 6c 69 6e 65 2e  column per line.
8160: 20 20 42 6c 61 6e 6b 20 6c 69 6e 65 20 62 65 74    Blank line bet
8170: 77 65 65 6e 20 72 65 63 6f 72 64 73 20 2a 2f 0a  ween records */.
8180: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 43 6f 6c  #define MODE_Col
8190: 75 6d 6e 20 20 20 31 20 20 2f 2a 20 4f 6e 65 20  umn   1  /* One 
81a0: 72 65 63 6f 72 64 20 70 65 72 20 6c 69 6e 65 20  record per line 
81b0: 69 6e 20 6e 65 61 74 20 63 6f 6c 75 6d 6e 73 20  in neat columns 
81c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
81d0: 4c 69 73 74 20 20 20 20 20 32 20 20 2f 2a 20 4f  List     2  /* O
81e0: 6e 65 20 72 65 63 6f 72 64 20 70 65 72 20 6c 69  ne record per li
81f0: 6e 65 20 77 69 74 68 20 61 20 73 65 70 61 72 61  ne with a separa
8200: 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  tor */.#define M
8210: 4f 44 45 5f 53 65 6d 69 20 20 20 20 20 33 20 20  ODE_Semi     3  
8220: 2f 2a 20 53 61 6d 65 20 61 73 20 4d 4f 44 45 5f  /* Same as MODE_
8230: 4c 69 73 74 20 62 75 74 20 61 70 70 65 6e 64 20  List but append 
8240: 22 3b 22 20 74 6f 20 65 61 63 68 20 6c 69 6e 65  ";" to each line
8250: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
8260: 5f 48 74 6d 6c 20 20 20 20 20 34 20 20 2f 2a 20  _Html     4  /* 
8270: 47 65 6e 65 72 61 74 65 20 61 6e 20 58 48 54 4d  Generate an XHTM
8280: 4c 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69  L table */.#defi
8290: 6e 65 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20 20  ne MODE_Insert  
82a0: 20 35 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20   5  /* Generate 
82b0: 53 51 4c 20 22 69 6e 73 65 72 74 22 20 73 74 61  SQL "insert" sta
82c0: 74 65 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69  tements */.#defi
82d0: 6e 65 20 4d 4f 44 45 5f 51 75 6f 74 65 20 20 20  ne MODE_Quote   
82e0: 20 36 20 20 2f 2a 20 51 75 6f 74 65 20 76 61 6c   6  /* Quote val
82f0: 75 65 73 20 61 73 20 66 6f 72 20 53 51 4c 20 2a  ues as for SQL *
8300: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 54  /.#define MODE_T
8310: 63 6c 20 20 20 20 20 20 37 20 20 2f 2a 20 47 65  cl      7  /* Ge
8320: 6e 65 72 61 74 65 20 41 4e 53 49 2d 43 20 6f 72  nerate ANSI-C or
8330: 20 54 43 4c 20 71 75 6f 74 65 64 20 65 6c 65 6d   TCL quoted elem
8340: 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ents */.#define 
8350: 4d 4f 44 45 5f 43 73 76 20 20 20 20 20 20 38 20  MODE_Csv      8 
8360: 20 2f 2a 20 51 75 6f 74 65 20 73 74 72 69 6e 67   /* Quote string
8370: 73 2c 20 6e 75 6d 62 65 72 73 20 61 72 65 20 70  s, numbers are p
8380: 6c 61 69 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20  lain */.#define 
8390: 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 20 39 20  MODE_Explain  9 
83a0: 20 2f 2a 20 4c 69 6b 65 20 4d 4f 44 45 5f 43 6f   /* Like MODE_Co
83b0: 6c 75 6d 6e 2c 20 62 75 74 20 64 6f 20 6e 6f 74  lumn, but do not
83c0: 20 74 72 75 6e 63 61 74 65 20 64 61 74 61 20 2a   truncate data *
83d0: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 41  /.#define MODE_A
83e0: 73 63 69 69 20 20 20 31 30 20 20 2f 2a 20 55 73  scii   10  /* Us
83f0: 65 20 41 53 43 49 49 20 75 6e 69 74 20 61 6e 64  e ASCII unit and
8400: 20 72 65 63 6f 72 64 20 73 65 70 61 72 61 74 6f   record separato
8410: 72 73 20 28 30 78 31 46 2f 30 78 31 45 29 20 2a  rs (0x1F/0x1E) *
8420: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 50  /.#define MODE_P
8430: 72 65 74 74 79 20 20 31 31 20 20 2f 2a 20 50 72  retty  11  /* Pr
8440: 65 74 74 79 2d 70 72 69 6e 74 20 73 63 68 65 6d  etty-print schem
8450: 61 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  as */.#define MO
8460: 44 45 5f 45 51 50 20 20 20 20 20 31 32 20 20 2f  DE_EQP     12  /
8470: 2a 20 43 6f 6e 76 65 72 74 73 20 45 58 50 4c 41  * Converts EXPLA
8480: 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 6f 75  IN QUERY PLAN ou
8490: 74 70 75 74 20 69 6e 74 6f 20 61 20 67 72 61 70  tput into a grap
84a0: 68 20 2a 2f 0a 0a 73 74 61 74 69 63 20 63 6f 6e  h */..static con
84b0: 73 74 20 63 68 61 72 20 2a 6d 6f 64 65 44 65 73  st char *modeDes
84c0: 63 72 5b 5d 20 3d 20 7b 0a 20 20 22 6c 69 6e 65  cr[] = {.  "line
84d0: 22 2c 0a 20 20 22 63 6f 6c 75 6d 6e 22 2c 0a 20  ",.  "column",. 
84e0: 20 22 6c 69 73 74 22 2c 0a 20 20 22 73 65 6d 69   "list",.  "semi
84f0: 22 2c 0a 20 20 22 68 74 6d 6c 22 2c 0a 20 20 22  ",.  "html",.  "
8500: 69 6e 73 65 72 74 22 2c 0a 20 20 22 71 75 6f 74  insert",.  "quot
8510: 65 22 2c 0a 20 20 22 74 63 6c 22 2c 0a 20 20 22  e",.  "tcl",.  "
8520: 63 73 76 22 2c 0a 20 20 22 65 78 70 6c 61 69 6e  csv",.  "explain
8530: 22 2c 0a 20 20 22 61 73 63 69 69 22 2c 0a 20 20  ",.  "ascii",.  
8540: 22 70 72 65 74 74 79 70 72 69 6e 74 22 2c 0a 20  "prettyprint",. 
8550: 20 22 65 71 70 22 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a   "eqp".};../*.**
8560: 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20 63   These are the c
8570: 6f 6c 75 6d 6e 2f 72 6f 77 2f 6c 69 6e 65 20 73  olumn/row/line s
8580: 65 70 61 72 61 74 6f 72 73 20 75 73 65 64 20 62  eparators used b
8590: 79 20 74 68 65 20 76 61 72 69 6f 75 73 0a 2a 2a  y the various.**
85a0: 20 69 6d 70 6f 72 74 2f 65 78 70 6f 72 74 20 6d   import/export m
85b0: 6f 64 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65  odes..*/.#define
85c0: 20 53 45 50 5f 43 6f 6c 75 6d 6e 20 20 20 20 22   SEP_Column    "
85d0: 7c 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 52  |".#define SEP_R
85e0: 6f 77 20 20 20 20 20 20 20 22 5c 6e 22 0a 23 64  ow       "\n".#d
85f0: 65 66 69 6e 65 20 53 45 50 5f 54 61 62 20 20 20  efine SEP_Tab   
8600: 20 20 20 20 22 5c 74 22 0a 23 64 65 66 69 6e 65      "\t".#define
8610: 20 53 45 50 5f 53 70 61 63 65 20 20 20 20 20 22   SEP_Space     "
8620: 20 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 43   ".#define SEP_C
8630: 6f 6d 6d 61 20 20 20 20 20 22 2c 22 0a 23 64 65  omma     ",".#de
8640: 66 69 6e 65 20 53 45 50 5f 43 72 4c 66 20 20 20  fine SEP_CrLf   
8650: 20 20 20 22 5c 72 5c 6e 22 0a 23 64 65 66 69 6e     "\r\n".#defin
8660: 65 20 53 45 50 5f 55 6e 69 74 20 20 20 20 20 20  e SEP_Unit      
8670: 22 5c 78 31 46 22 0a 23 64 65 66 69 6e 65 20 53  "\x1F".#define S
8680: 45 50 5f 52 65 63 6f 72 64 20 20 20 20 22 5c 78  EP_Record    "\x
8690: 31 45 22 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61 6c  1E"../*.** A cal
86a0: 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73 71  lback for the sq
86b0: 6c 69 74 65 33 5f 6c 6f 67 28 29 20 69 6e 74 65  lite3_log() inte
86c0: 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rface..*/.static
86d0: 20 76 6f 69 64 20 73 68 65 6c 6c 4c 6f 67 28 76   void shellLog(v
86e0: 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 69  oid *pArg, int i
86f0: 45 72 72 43 6f 64 65 2c 20 63 6f 6e 73 74 20 63  ErrCode, const c
8700: 68 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20 53 68  har *zMsg){.  Sh
8710: 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53  ellState *p = (S
8720: 68 65 6c 6c 53 74 61 74 65 2a 29 70 41 72 67 3b  hellState*)pArg;
8730: 0a 20 20 69 66 28 20 70 2d 3e 70 4c 6f 67 3d 3d  .  if( p->pLog==
8740: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 75 74  0 ) return;.  ut
8750: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 70 4c 6f  f8_printf(p->pLo
8760: 67 2c 20 22 28 25 64 29 20 25 73 5c 6e 22 2c 20  g, "(%d) %s\n", 
8770: 69 45 72 72 43 6f 64 65 2c 20 7a 4d 73 67 29 3b  iErrCode, zMsg);
8780: 0a 20 20 66 66 6c 75 73 68 28 70 2d 3e 70 4c 6f  .  fflush(p->pLo
8790: 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c  g);.}../*.** SQL
87a0: 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73 68 65 6c   function:  shel
87b0: 6c 5f 70 75 74 73 6e 6c 28 58 29 0a 2a 2a 0a 2a  l_putsnl(X).**.*
87c0: 2a 20 57 72 69 74 65 20 74 68 65 20 74 65 78 74  * Write the text
87d0: 20 58 20 74 6f 20 74 68 65 20 73 63 72 65 65 6e   X to the screen
87e0: 20 28 6f 72 20 77 68 61 74 65 76 65 72 20 6f 75   (or whatever ou
87f0: 74 70 75 74 20 69 73 20 62 65 69 6e 67 20 64 69  tput is being di
8800: 72 65 63 74 65 64 29 0a 2a 2a 20 61 64 64 69 6e  rected).** addin
8810: 67 20 61 20 6e 65 77 6c 69 6e 65 20 61 74 20 74  g a newline at t
8820: 68 65 20 65 6e 64 2c 20 61 6e 64 20 74 68 65 6e  he end, and then
8830: 20 72 65 74 75 72 6e 20 58 2e 0a 2a 2f 0a 73 74   return X..*/.st
8840: 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 50  atic void shellP
8850: 75 74 73 46 75 6e 63 28 0a 20 20 73 71 6c 69 74  utsFunc(.  sqlit
8860: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
8870: 2c 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20  ,.  int nVal,.  
8880: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
8890: 61 70 56 61 6c 0a 29 7b 0a 20 20 53 68 65 6c 6c  apVal.){.  Shell
88a0: 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c  State *p = (Shel
88b0: 6c 53 74 61 74 65 2a 29 73 71 6c 69 74 65 33 5f  lState*)sqlite3_
88c0: 75 73 65 72 5f 64 61 74 61 28 70 43 74 78 29 3b  user_data(pCtx);
88d0: 0a 20 20 28 76 6f 69 64 29 6e 56 61 6c 3b 0a 20  .  (void)nVal;. 
88e0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
88f0: 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c  out, "%s\n", sql
8900: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
8910: 61 70 56 61 6c 5b 30 5d 29 29 3b 0a 20 20 73 71  apVal[0]));.  sq
8920: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
8930: 75 65 28 70 43 74 78 2c 20 61 70 56 61 6c 5b 30  ue(pCtx, apVal[0
8940: 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c  ]);.}../*.** SQL
8950: 20 66 75 6e 63 74 69 6f 6e 3a 20 20 20 65 64 69   function:   edi
8960: 74 28 56 41 4c 55 45 29 0a 2a 2a 20 20 20 20 20  t(VALUE).**     
8970: 20 20 20 20 20 20 20 20 20 20 20 20 65 64 69 74              edit
8980: 28 56 41 4c 55 45 2c 45 44 49 54 4f 52 29 0a 2a  (VALUE,EDITOR).*
8990: 2a 0a 2a 2a 20 54 68 65 73 65 20 73 74 65 70 73  *.** These steps
89a0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 28 31 29 20  :.**.**     (1) 
89b0: 57 72 69 74 65 20 56 41 4c 55 45 20 69 6e 74 6f  Write VALUE into
89c0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c   a temporary fil
89d0: 65 2e 0a 2a 2a 20 20 20 20 20 28 32 29 20 52 75  e..**     (2) Ru
89e0: 6e 20 70 72 6f 67 72 61 6d 20 45 44 49 54 4f 52  n program EDITOR
89f0: 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61   on that tempora
8a00: 72 79 20 66 69 6c 65 2e 0a 2a 2a 20 20 20 20 20  ry file..**     
8a10: 28 33 29 20 52 65 61 64 20 74 68 65 20 74 65 6d  (3) Read the tem
8a20: 70 6f 72 61 72 79 20 66 69 6c 65 20 62 61 63 6b  porary file back
8a30: 20 61 6e 64 20 72 65 74 75 72 6e 20 69 74 73 20   and return its 
8a40: 63 6f 6e 74 65 6e 74 20 61 73 20 74 68 65 20 72  content as the r
8a50: 65 73 75 6c 74 2e 0a 2a 2a 20 20 20 20 20 28 34  esult..**     (4
8a60: 29 20 44 65 6c 65 74 65 20 74 68 65 20 74 65 6d  ) Delete the tem
8a70: 70 6f 72 61 72 79 20 66 69 6c 65 0a 2a 2a 0a 2a  porary file.**.*
8a80: 2a 20 49 66 20 74 68 65 20 45 44 49 54 4f 52 20  * If the EDITOR 
8a90: 61 72 67 75 6d 65 6e 74 20 69 73 20 6f 6d 69 74  argument is omit
8aa0: 74 65 64 2c 20 75 73 65 20 74 68 65 20 76 61 6c  ted, use the val
8ab0: 75 65 20 69 6e 20 74 68 65 20 56 49 53 55 41 4c  ue in the VISUAL
8ac0: 0a 2a 2a 20 65 6e 76 69 72 6f 6e 6d 65 6e 74 20  .** environment 
8ad0: 76 61 72 69 61 62 6c 65 2e 20 20 49 66 20 73 74  variable.  If st
8ae0: 69 6c 6c 20 74 68 65 72 65 20 69 73 20 6e 6f 20  ill there is no 
8af0: 45 44 49 54 4f 52 2c 20 74 68 72 6f 75 67 68 20  EDITOR, through 
8b00: 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20  an error..**.** 
8b10: 41 6c 73 6f 20 74 68 72 6f 77 20 61 6e 20 65 72  Also throw an er
8b20: 72 6f 72 20 69 66 20 74 68 65 20 45 44 49 54 4f  ror if the EDITO
8b30: 52 20 70 72 6f 67 72 61 6d 20 72 65 74 75 72 6e  R program return
8b40: 73 20 61 20 6e 6f 6e 2d 7a 65 72 6f 20 65 78 69  s a non-zero exi
8b50: 74 20 63 6f 64 65 2e 0a 2a 2f 0a 23 69 66 6e 64  t code..*/.#ifnd
8b60: 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45  ef SQLITE_NOHAVE
8b70: 5f 53 59 53 54 45 4d 0a 73 74 61 74 69 63 20 76  _SYSTEM.static v
8b80: 6f 69 64 20 65 64 69 74 46 75 6e 63 28 0a 20 20  oid editFunc(.  
8b90: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20  sqlite3_context 
8ba0: 2a 63 6f 6e 74 65 78 74 2c 0a 20 20 69 6e 74 20  *context,.  int 
8bb0: 61 72 67 63 2c 0a 20 20 73 71 6c 69 74 65 33 5f  argc,.  sqlite3_
8bc0: 76 61 6c 75 65 20 2a 2a 61 72 67 76 0a 29 7b 0a  value **argv.){.
8bd0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
8be0: 64 69 74 6f 72 3b 0a 20 20 63 68 61 72 20 2a 7a  ditor;.  char *z
8bf0: 54 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20  TempFile = 0;.  
8c00: 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 63  sqlite3 *db;.  c
8c10: 68 61 72 20 2a 7a 43 6d 64 20 3d 20 30 3b 0a 20  har *zCmd = 0;. 
8c20: 20 69 6e 74 20 62 42 69 6e 3b 0a 20 20 69 6e 74   int bBin;.  int
8c30: 20 72 63 3b 0a 20 20 69 6e 74 20 68 61 73 43 52   rc;.  int hasCR
8c40: 4e 4c 20 3d 20 30 3b 0a 20 20 46 49 4c 45 20 2a  NL = 0;.  FILE *
8c50: 66 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  f = 0;.  sqlite3
8c60: 5f 69 6e 74 36 34 20 73 7a 3b 0a 20 20 73 71 6c  _int64 sz;.  sql
8c70: 69 74 65 33 5f 69 6e 74 36 34 20 78 3b 0a 20 20  ite3_int64 x;.  
8c80: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 70  unsigned char *p
8c90: 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 61 72 67   = 0;..  if( arg
8ca0: 63 3d 3d 32 20 29 7b 0a 20 20 20 20 7a 45 64 69  c==2 ){.    zEdi
8cb0: 74 6f 72 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  tor = (const cha
8cc0: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
8cd0: 5f 74 65 78 74 28 61 72 67 76 5b 31 5d 29 3b 0a  _text(argv[1]);.
8ce0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 45 64    }else{.    zEd
8cf0: 69 74 6f 72 20 3d 20 67 65 74 65 6e 76 28 22 56  itor = getenv("V
8d00: 49 53 55 41 4c 22 29 3b 0a 20 20 7d 0a 20 20 69  ISUAL");.  }.  i
8d10: 66 28 20 7a 45 64 69 74 6f 72 3d 3d 30 20 29 7b  f( zEditor==0 ){
8d20: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
8d30: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
8d40: 74 2c 20 22 6e 6f 20 65 64 69 74 6f 72 20 66 6f  t, "no editor fo
8d50: 72 20 65 64 69 74 28 29 22 2c 20 2d 31 29 3b 0a  r edit()", -1);.
8d60: 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
8d70: 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 76 61    if( sqlite3_va
8d80: 6c 75 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d  lue_type(argv[0]
8d90: 29 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 20 29  )==SQLITE_NULL )
8da0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65  {.    sqlite3_re
8db0: 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65  sult_error(conte
8dc0: 78 74 2c 20 22 4e 55 4c 4c 20 69 6e 70 75 74 20  xt, "NULL input 
8dd0: 74 6f 20 65 64 69 74 28 29 22 2c 20 2d 31 29 3b  to edit()", -1);
8de0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
8df0: 0a 20 20 64 62 20 3d 20 73 71 6c 69 74 65 33 5f  .  db = sqlite3_
8e00: 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c  context_db_handl
8e10: 65 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 7a 54  e(context);.  zT
8e20: 65 6d 70 46 69 6c 65 20 3d 20 30 3b 0a 20 20 73  empFile = 0;.  s
8e30: 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e 74  qlite3_file_cont
8e40: 72 6f 6c 28 64 62 2c 20 30 2c 20 53 51 4c 49 54  rol(db, 0, SQLIT
8e50: 45 5f 46 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45  E_FCNTL_TEMPFILE
8e60: 4e 41 4d 45 2c 20 26 7a 54 65 6d 70 46 69 6c 65  NAME, &zTempFile
8e70: 29 3b 0a 20 20 69 66 28 20 7a 54 65 6d 70 46 69  );.  if( zTempFi
8e80: 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  le==0 ){.    sql
8e90: 69 74 65 33 5f 75 69 6e 74 36 34 20 72 20 3d 20  ite3_uint64 r = 
8ea0: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  0;.    sqlite3_r
8eb0: 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f 66  andomness(sizeof
8ec0: 28 72 29 2c 20 26 72 29 3b 0a 20 20 20 20 7a 54  (r), &r);.    zT
8ed0: 65 6d 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65  empFile = sqlite
8ee0: 33 5f 6d 70 72 69 6e 74 66 28 22 74 65 6d 70 25  3_mprintf("temp%
8ef0: 6c 6c 78 22 2c 20 72 29 3b 0a 20 20 20 20 69 66  llx", r);.    if
8f00: 28 20 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20 29  ( zTempFile==0 )
8f10: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
8f20: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d  result_error_nom
8f30: 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  em(context);.   
8f40: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 7d     return;.    }
8f50: 0a 20 20 7d 0a 20 20 62 42 69 6e 20 3d 20 73 71  .  }.  bBin = sq
8f60: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65  lite3_value_type
8f70: 28 61 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54  (argv[0])==SQLIT
8f80: 45 5f 42 4c 4f 42 3b 0a 20 20 2f 2a 20 57 68 65  E_BLOB;.  /* Whe
8f90: 6e 20 77 72 69 74 69 6e 67 20 74 68 65 20 66 69  n writing the fi
8fa0: 6c 65 20 74 6f 20 62 65 20 65 64 69 74 65 64 2c  le to be edited,
8fb0: 20 64 6f 20 5c 6e 20 74 6f 20 5c 72 5c 6e 20 63   do \n to \r\n c
8fc0: 6f 6e 76 65 72 73 69 6f 6e 73 20 6f 6e 20 73 79  onversions on sy
8fd0: 73 74 65 6d 73 0a 20 20 2a 2a 20 74 68 61 74 20  stems.  ** that 
8fe0: 77 61 6e 74 20 5c 72 5c 6e 20 6c 69 6e 65 20 65  want \r\n line e
8ff0: 6e 64 69 6e 67 73 20 2a 2f 0a 20 20 66 20 3d 20  ndings */.  f = 
9000: 66 6f 70 65 6e 28 7a 54 65 6d 70 46 69 6c 65 2c  fopen(zTempFile,
9010: 20 62 42 69 6e 20 3f 20 22 77 62 22 20 3a 20 22   bBin ? "wb" : "
9020: 77 22 29 3b 0a 20 20 69 66 28 20 66 3d 3d 30 20  w");.  if( f==0 
9030: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
9040: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
9050: 65 78 74 2c 20 22 65 64 69 74 28 29 20 63 61 6e  ext, "edit() can
9060: 6e 6f 74 20 6f 70 65 6e 20 74 65 6d 70 20 66 69  not open temp fi
9070: 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20 67 6f  le", -1);.    go
9080: 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64  to edit_func_end
9090: 3b 0a 20 20 7d 0a 20 20 73 7a 20 3d 20 73 71 6c  ;.  }.  sz = sql
90a0: 69 74 65 33 5f 76 61 6c 75 65 5f 62 79 74 65 73  ite3_value_bytes
90b0: 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20 69 66 28  (argv[0]);.  if(
90c0: 20 62 42 69 6e 20 29 7b 0a 20 20 20 20 78 20 3d   bBin ){.    x =
90d0: 20 66 77 72 69 74 65 28 73 71 6c 69 74 65 33 5f   fwrite(sqlite3_
90e0: 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72 67 76 5b  value_blob(argv[
90f0: 30 5d 29 2c 20 31 2c 20 73 7a 2c 20 66 29 3b 0a  0]), 1, sz, f);.
9100: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e    }else{.    con
9110: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63 6f  st char *z = (co
9120: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
9130: 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67  3_value_text(arg
9140: 76 5b 30 5d 29 3b 0a 20 20 20 20 2f 2a 20 52 65  v[0]);.    /* Re
9150: 6d 65 6d 62 65 72 20 77 68 65 74 68 65 72 20 6f  member whether o
9160: 72 20 6e 6f 74 20 74 68 65 20 76 61 6c 75 65 20  r not the value 
9170: 6f 72 69 67 69 6e 61 6c 6c 79 20 63 6f 6e 74 61  originally conta
9180: 69 6e 65 64 20 5c 72 5c 6e 20 2a 2f 0a 20 20 20  ined \r\n */.   
9190: 20 69 66 28 20 7a 20 26 26 20 73 74 72 73 74 72   if( z && strstr
91a0: 28 7a 2c 22 5c 72 5c 6e 22 29 21 3d 30 20 29 20  (z,"\r\n")!=0 ) 
91b0: 68 61 73 43 52 4e 4c 20 3d 20 31 3b 0a 20 20 20  hasCRNL = 1;.   
91c0: 20 78 20 3d 20 66 77 72 69 74 65 28 73 71 6c 69   x = fwrite(sqli
91d0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
91e0: 72 67 76 5b 30 5d 29 2c 20 31 2c 20 73 7a 2c 20  rgv[0]), 1, sz, 
91f0: 66 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65  f);.  }.  fclose
9200: 28 66 29 3b 0a 20 20 66 20 3d 20 30 3b 0a 20 20  (f);.  f = 0;.  
9210: 69 66 28 20 78 21 3d 73 7a 20 29 7b 0a 20 20 20  if( x!=sz ){.   
9220: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
9230: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22  error(context, "
9240: 65 64 69 74 28 29 20 63 6f 75 6c 64 20 6e 6f 74  edit() could not
9250: 20 77 72 69 74 65 20 74 68 65 20 77 68 6f 6c 65   write the whole
9260: 20 66 69 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20   file", -1);.   
9270: 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f   goto edit_func_
9280: 65 6e 64 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64 20  end;.  }.  zCmd 
9290: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
92a0: 66 28 22 25 73 20 5c 22 25 73 5c 22 22 2c 20 7a  f("%s \"%s\"", z
92b0: 45 64 69 74 6f 72 2c 20 7a 54 65 6d 70 46 69 6c  Editor, zTempFil
92c0: 65 29 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d  e);.  if( zCmd==
92d0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
92e0: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
92f0: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
9300: 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63    goto edit_func
9310: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  _end;.  }.  rc =
9320: 20 73 79 73 74 65 6d 28 7a 43 6d 64 29 3b 0a 20   system(zCmd);. 
9330: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
9340: 6d 64 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  md);.  if( rc ){
9350: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
9360: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
9370: 74 2c 20 22 45 44 49 54 4f 52 20 72 65 74 75 72  t, "EDITOR retur
9380: 6e 65 64 20 6e 6f 6e 2d 7a 65 72 6f 22 2c 20 2d  ned non-zero", -
9390: 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64 69  1);.    goto edi
93a0: 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a  t_func_end;.  }.
93b0: 20 20 66 20 3d 20 66 6f 70 65 6e 28 7a 54 65 6d    f = fopen(zTem
93c0: 70 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20  pFile, "rb");.  
93d0: 69 66 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20  if( f==0 ){.    
93e0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
93f0: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 0a 20 20  rror(context,.  
9400: 20 20 20 20 22 65 64 69 74 28 29 20 63 61 6e 6e      "edit() cann
9410: 6f 74 20 72 65 6f 70 65 6e 20 74 65 6d 70 20 66  ot reopen temp f
9420: 69 6c 65 20 61 66 74 65 72 20 65 64 69 74 22 2c  ile after edit",
9430: 20 2d 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65   -1);.    goto e
9440: 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20  dit_func_end;.  
9450: 7d 0a 20 20 66 73 65 65 6b 28 66 2c 20 30 2c 20  }.  fseek(f, 0, 
9460: 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 73 7a 20  SEEK_END);.  sz 
9470: 3d 20 66 74 65 6c 6c 28 66 29 3b 0a 20 20 72 65  = ftell(f);.  re
9480: 77 69 6e 64 28 66 29 3b 0a 20 20 70 20 3d 20 73  wind(f);.  p = s
9490: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
94a0: 20 73 7a 2b 28 62 42 69 6e 3d 3d 30 29 20 29 3b   sz+(bBin==0) );
94b0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20  .  if( p==0 ){. 
94c0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
94d0: 74 5f 65 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f  t_error_nomem(co
94e0: 6e 74 65 78 74 29 3b 0a 20 20 20 20 67 6f 74 6f  ntext);.    goto
94f0: 20 65 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a   edit_func_end;.
9500: 20 20 7d 0a 20 20 78 20 3d 20 66 72 65 61 64 28    }.  x = fread(
9510: 70 2c 20 31 2c 20 73 7a 2c 20 66 29 3b 0a 20 20  p, 1, sz, f);.  
9520: 66 63 6c 6f 73 65 28 66 29 3b 0a 20 20 66 20 3d  fclose(f);.  f =
9530: 20 30 3b 0a 20 20 69 66 28 20 78 21 3d 73 7a 20   0;.  if( x!=sz 
9540: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72  ){.    sqlite3_r
9550: 65 73 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74  esult_error(cont
9560: 65 78 74 2c 20 22 63 6f 75 6c 64 20 6e 6f 74 20  ext, "could not 
9570: 72 65 61 64 20 62 61 63 6b 20 74 68 65 20 77 68  read back the wh
9580: 6f 6c 65 20 66 69 6c 65 22 2c 20 2d 31 29 3b 0a  ole file", -1);.
9590: 20 20 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75      goto edit_fu
95a0: 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 69 66  nc_end;.  }.  if
95b0: 28 20 62 42 69 6e 20 29 7b 0a 20 20 20 20 73 71  ( bBin ){.    sq
95c0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 62 6c 6f  lite3_result_blo
95d0: 62 36 34 28 63 6f 6e 74 65 78 74 2c 20 70 2c 20  b64(context, p, 
95e0: 73 7a 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  sz, sqlite3_free
95f0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
9600: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 2c  sqlite3_int64 i,
9610: 20 6a 3b 0a 20 20 20 20 69 66 28 20 68 61 73 43   j;.    if( hasC
9620: 52 4e 4c 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  RNL ){.      /* 
9630: 49 66 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  If the original 
9640: 63 6f 6e 74 61 69 6e 73 20 5c 72 5c 6e 20 74 68  contains \r\n th
9650: 65 6e 20 64 6f 20 6e 6f 20 63 6f 6e 76 65 72 73  en do no convers
9660: 69 6f 6e 73 20 62 61 63 6b 20 74 6f 20 5c 6e 20  ions back to \n 
9670: 2a 2f 0a 20 20 20 20 20 20 6a 20 3d 20 73 7a 3b  */.      j = sz;
9680: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9690: 20 20 2f 2a 20 49 66 20 74 68 65 20 66 69 6c 65    /* If the file
96a0: 20 64 69 64 20 6e 6f 74 20 6f 72 69 67 69 6e 61   did not origina
96b0: 6c 6c 79 20 63 6f 6e 74 61 69 6e 20 5c 72 5c 6e  lly contain \r\n
96c0: 20 74 68 65 6e 20 63 6f 6e 76 65 72 74 20 61 6e   then convert an
96d0: 79 20 6e 65 77 0a 20 20 20 20 20 20 2a 2a 20 5c  y new.      ** \
96e0: 72 5c 6e 20 62 61 63 6b 20 69 6e 74 6f 20 5c 6e  r\n back into \n
96f0: 20 2a 2f 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   */.      for(i=
9700: 6a 3d 30 3b 20 69 3c 73 7a 3b 20 69 2b 2b 29 7b  j=0; i<sz; i++){
9710: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 5b 69  .        if( p[i
9720: 5d 3d 3d 27 5c 72 27 20 26 26 20 70 5b 69 2b 31  ]=='\r' && p[i+1
9730: 5d 3d 3d 27 5c 6e 27 20 29 20 69 2b 2b 3b 0a 20  ]=='\n' ) i++;. 
9740: 20 20 20 20 20 20 20 70 5b 6a 2b 2b 5d 20 3d 20         p[j++] = 
9750: 70 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  p[i];.      }.  
9760: 20 20 20 20 73 7a 20 3d 20 6a 3b 0a 20 20 20 20      sz = j;.    
9770: 20 20 70 5b 73 7a 5d 20 3d 20 30 3b 0a 20 20 20    p[sz] = 0;.   
9780: 20 7d 20 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   } .    sqlite3_
9790: 72 65 73 75 6c 74 5f 74 65 78 74 36 34 28 63 6f  result_text64(co
97a0: 6e 74 65 78 74 2c 20 28 63 6f 6e 73 74 20 63 68  ntext, (const ch
97b0: 61 72 2a 29 70 2c 20 73 7a 2c 0a 20 20 20 20 20  ar*)p, sz,.     
97c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
97d0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
97e0: 65 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b  e, SQLITE_UTF8);
97f0: 0a 20 20 7d 0a 20 20 70 20 3d 20 30 3b 0a 0a 65  .  }.  p = 0;..e
9800: 64 69 74 5f 66 75 6e 63 5f 65 6e 64 3a 0a 20 20  dit_func_end:.  
9810: 69 66 28 20 66 20 29 20 66 63 6c 6f 73 65 28 66  if( f ) fclose(f
9820: 29 3b 0a 20 20 75 6e 6c 69 6e 6b 28 7a 54 65 6d  );.  unlink(zTem
9830: 70 46 69 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65  pFile);.  sqlite
9840: 33 5f 66 72 65 65 28 7a 54 65 6d 70 46 69 6c 65  3_free(zTempFile
9850: 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
9860: 65 28 70 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  e(p);.}.#endif /
9870: 2a 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f  * SQLITE_NOHAVE_
9880: 53 59 53 54 45 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  SYSTEM */../*.**
9890: 20 53 61 76 65 20 6f 72 20 72 65 73 74 6f 72 65   Save or restore
98a0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f 75 74   the current out
98b0: 70 75 74 20 6d 6f 64 65 0a 2a 2f 0a 73 74 61 74  put mode.*/.stat
98c0: 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 4d 6f  ic void outputMo
98d0: 64 65 50 75 73 68 28 53 68 65 6c 6c 53 74 61 74  dePush(ShellStat
98e0: 65 20 2a 70 29 7b 0a 20 20 70 2d 3e 6d 6f 64 65  e *p){.  p->mode
98f0: 50 72 69 6f 72 20 3d 20 70 2d 3e 6d 6f 64 65 3b  Prior = p->mode;
9900: 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 63 6f 6c  .  memcpy(p->col
9910: 53 65 70 50 72 69 6f 72 2c 20 70 2d 3e 63 6f 6c  SepPrior, p->col
9920: 53 65 70 61 72 61 74 6f 72 2c 20 73 69 7a 65 6f  Separator, sizeo
9930: 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  f(p->colSeparato
9940: 72 29 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d  r));.  memcpy(p-
9950: 3e 72 6f 77 53 65 70 50 72 69 6f 72 2c 20 70 2d  >rowSepPrior, p-
9960: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 73  >rowSeparator, s
9970: 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61  izeof(p->rowSepa
9980: 72 61 74 6f 72 29 29 3b 0a 7d 0a 73 74 61 74 69  rator));.}.stati
9990: 63 20 76 6f 69 64 20 6f 75 74 70 75 74 4d 6f 64  c void outputMod
99a0: 65 50 6f 70 28 53 68 65 6c 6c 53 74 61 74 65 20  ePop(ShellState 
99b0: 2a 70 29 7b 0a 20 20 70 2d 3e 6d 6f 64 65 20 3d  *p){.  p->mode =
99c0: 20 70 2d 3e 6d 6f 64 65 50 72 69 6f 72 3b 0a 20   p->modePrior;. 
99d0: 20 6d 65 6d 63 70 79 28 70 2d 3e 63 6f 6c 53 65   memcpy(p->colSe
99e0: 70 61 72 61 74 6f 72 2c 20 70 2d 3e 63 6f 6c 53  parator, p->colS
99f0: 65 70 50 72 69 6f 72 2c 20 73 69 7a 65 6f 66 28  epPrior, sizeof(
9a00: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
9a10: 29 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 72  );.  memcpy(p->r
9a20: 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 70 2d 3e  owSeparator, p->
9a30: 72 6f 77 53 65 70 50 72 69 6f 72 2c 20 73 69 7a  rowSepPrior, siz
9a40: 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  eof(p->rowSepara
9a50: 74 6f 72 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tor));.}../*.** 
9a60: 4f 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e  Output the given
9a70: 20 73 74 72 69 6e 67 20 61 73 20 61 20 68 65 78   string as a hex
9a80: 2d 65 6e 63 6f 64 65 64 20 62 6c 6f 62 20 28 65  -encoded blob (e
9a90: 67 2e 20 58 27 31 32 33 34 27 20 29 0a 2a 2f 0a  g. X'1234' ).*/.
9aa0: 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70  static void outp
9ab0: 75 74 5f 68 65 78 5f 62 6c 6f 62 28 46 49 4c 45  ut_hex_blob(FILE
9ac0: 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 76 6f 69   *out, const voi
9ad0: 64 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42  d *pBlob, int nB
9ae0: 6c 6f 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  lob){.  int i;. 
9af0: 20 63 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 28   char *zBlob = (
9b00: 63 68 61 72 20 2a 29 70 42 6c 6f 62 3b 0a 20 20  char *)pBlob;.  
9b10: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22  raw_printf(out,"
9b20: 58 27 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  X'");.  for(i=0;
9b30: 20 69 3c 6e 42 6c 6f 62 3b 20 69 2b 2b 29 7b 20   i<nBlob; i++){ 
9b40: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22  raw_printf(out,"
9b50: 25 30 32 78 22 2c 7a 42 6c 6f 62 5b 69 5d 26 30  %02x",zBlob[i]&0
9b60: 78 66 66 29 3b 20 7d 0a 20 20 72 61 77 5f 70 72  xff); }.  raw_pr
9b70: 69 6e 74 66 28 6f 75 74 2c 22 27 22 29 3b 0a 7d  intf(out,"'");.}
9b80: 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 73  ../*.** Find a s
9b90: 74 72 69 6e 67 20 74 68 61 74 20 69 73 20 6e 6f  tring that is no
9ba0: 74 20 66 6f 75 6e 64 20 61 6e 79 77 68 65 72 65  t found anywhere
9bb0: 20 69 6e 20 7a 5b 5d 2e 20 20 52 65 74 75 72 6e   in z[].  Return
9bc0: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
9bd0: 20 74 68 61 74 20 73 74 72 69 6e 67 2e 0a 2a 2a   that string..**
9be0: 0a 2a 2a 20 54 72 79 20 74 6f 20 75 73 65 20 7a  .** Try to use z
9bf0: 41 20 61 6e 64 20 7a 42 20 66 69 72 73 74 2e 20  A and zB first. 
9c00: 20 49 66 20 62 6f 74 68 20 6f 66 20 74 68 6f 73   If both of thos
9c10: 65 20 61 72 65 20 61 6c 72 65 61 64 79 20 66 6f  e are already fo
9c20: 75 6e 64 20 69 6e 20 7a 5b 5d 0a 2a 2a 20 74 68  und in z[].** th
9c30: 65 6e 20 6d 61 6b 65 20 75 70 20 73 6f 6d 65 20  en make up some 
9c40: 73 74 72 69 6e 67 20 61 6e 64 20 73 74 6f 72 65  string and store
9c50: 20 69 74 20 69 6e 20 74 68 65 20 62 75 66 66 65   it in the buffe
9c60: 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69  r zBuf..*/.stati
9c70: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e  c const char *un
9c80: 75 73 65 64 5f 73 74 72 69 6e 67 28 0a 20 20 63  used_string(.  c
9c90: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 20 20  onst char *z,   
9ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9cb0: 20 2f 2a 20 52 65 73 75 6c 74 20 6d 75 73 74 20   /* Result must 
9cc0: 6e 6f 74 20 61 70 70 65 61 72 20 61 6e 79 77 68  not appear anywh
9cd0: 65 72 65 20 69 6e 20 7a 20 2a 2f 0a 20 20 63 6f  ere in z */.  co
9ce0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c 20 63 6f  nst char *zA, co
9cf0: 6e 73 74 20 63 68 61 72 20 2a 7a 42 2c 20 20 20  nst char *zB,   
9d00: 2f 2a 20 54 72 79 20 74 68 65 73 65 20 66 69 72  /* Try these fir
9d10: 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42  st */.  char *zB
9d20: 75 66 20 20 20 20 20 20 20 20 20 20 20 20 20 20  uf              
9d30: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61            /* Spa
9d40: 63 65 20 74 6f 20 73 74 6f 72 65 20 61 20 67 65  ce to store a ge
9d50: 6e 65 72 61 74 65 64 20 73 74 72 69 6e 67 20 2a  nerated string *
9d60: 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  /.){.  unsigned 
9d70: 69 20 3d 20 30 3b 0a 20 20 69 66 28 20 73 74 72  i = 0;.  if( str
9d80: 73 74 72 28 7a 2c 20 7a 41 29 3d 3d 30 20 29 20  str(z, zA)==0 ) 
9d90: 72 65 74 75 72 6e 20 7a 41 3b 0a 20 20 69 66 28  return zA;.  if(
9da0: 20 73 74 72 73 74 72 28 7a 2c 20 7a 42 29 3d 3d   strstr(z, zB)==
9db0: 30 20 29 20 72 65 74 75 72 6e 20 7a 42 3b 0a 20  0 ) return zB;. 
9dc0: 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33   do{.    sqlite3
9dd0: 5f 73 6e 70 72 69 6e 74 66 28 32 30 2c 7a 42 75  _snprintf(20,zBu
9de0: 66 2c 22 28 25 73 25 75 29 22 2c 20 7a 41 2c 20  f,"(%s%u)", zA, 
9df0: 69 2b 2b 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20  i++);.  }while( 
9e00: 73 74 72 73 74 72 28 7a 2c 7a 42 75 66 29 21 3d  strstr(z,zBuf)!=
9e10: 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 42  0 );.  return zB
9e20: 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74  uf;.}../*.** Out
9e30: 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73 74  put the given st
9e40: 72 69 6e 67 20 61 73 20 61 20 71 75 6f 74 65 64  ring as a quoted
9e50: 20 73 74 72 69 6e 67 20 75 73 69 6e 67 20 53 51   string using SQ
9e60: 4c 20 71 75 6f 74 69 6e 67 20 63 6f 6e 76 65 6e  L quoting conven
9e70: 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65  tions..**.** See
9e80: 20 61 6c 73 6f 3a 20 6f 75 74 70 75 74 5f 71 75   also: output_qu
9e90: 6f 74 65 64 5f 65 73 63 61 70 65 64 5f 73 74 72  oted_escaped_str
9ea0: 69 6e 67 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20  ing().*/.static 
9eb0: 76 6f 69 64 20 6f 75 74 70 75 74 5f 71 75 6f 74  void output_quot
9ec0: 65 64 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a  ed_string(FILE *
9ed0: 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  out, const char 
9ee0: 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *z){.  int i;.  
9ef0: 63 68 61 72 20 63 3b 0a 20 20 73 65 74 42 69 6e  char c;.  setBin
9f00: 61 72 79 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b  aryMode(out, 1);
9f10: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d  .  for(i=0; (c =
9f20: 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d   z[i])!=0 && c!=
9f30: 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69  '\''; i++){}.  i
9f40: 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75  f( c==0 ){.    u
9f50: 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22  tf8_printf(out,"
9f60: 27 25 73 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73  '%s'",z);.  }els
9f70: 65 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  e{.    raw_print
9f80: 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20  f(out, "'");.   
9f90: 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20   while( *z ){.  
9fa0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20      for(i=0; (c 
9fb0: 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21  = z[i])!=0 && c!
9fc0: 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20  ='\''; i++){}.  
9fd0: 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27 27 20      if( c=='\'' 
9fe0: 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  ) i++;.      if(
9ff0: 20 69 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74   i ){.        ut
a000: 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  f8_printf(out, "
a010: 25 2e 2a 73 22 2c 20 69 2c 20 7a 29 3b 0a 20 20  %.*s", i, z);.  
a020: 20 20 20 20 20 20 7a 20 2b 3d 20 69 3b 0a 20 20        z += i;.  
a030: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
a040: 63 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20  c=='\'' ){.     
a050: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
a060: 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 20 20 20  t, "'");.       
a070: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
a080: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d   }.      if( c==
a090: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  0 ){.        bre
a0a0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
a0b0: 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20    z++;.    }.   
a0c0: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
a0d0: 20 22 27 22 29 3b 0a 20 20 7d 0a 20 20 73 65 74   "'");.  }.  set
a0e0: 54 65 78 74 4d 6f 64 65 28 6f 75 74 2c 20 31 29  TextMode(out, 1)
a0f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75  ;.}../*.** Outpu
a100: 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  t the given stri
a110: 6e 67 20 61 73 20 61 20 71 75 6f 74 65 64 20 73  ng as a quoted s
a120: 74 72 69 6e 67 20 75 73 69 6e 67 20 53 51 4c 20  tring using SQL 
a130: 71 75 6f 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69  quoting conventi
a140: 6f 6e 73 2e 0a 2a 2a 20 41 64 64 69 74 69 6f 6e  ons..** Addition
a150: 61 6c 6c 6c 79 20 2c 20 65 73 63 61 70 65 20 74  allly , escape t
a160: 68 65 20 22 5c 6e 22 20 61 6e 64 20 22 5c 72 22  he "\n" and "\r"
a170: 20 63 68 61 72 61 63 74 65 72 73 20 73 6f 20 74   characters so t
a180: 68 61 74 20 74 68 65 79 20 64 6f 20 6e 6f 74 0a  hat they do not.
a190: 2a 2a 20 67 65 74 20 63 6f 72 72 75 70 74 65 64  ** get corrupted
a1a0: 20 62 79 20 65 6e 64 2d 6f 66 2d 6c 69 6e 65 20   by end-of-line 
a1b0: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 66 61 63 69  translation faci
a1c0: 6c 69 74 69 65 73 20 69 6e 20 73 6f 6d 65 20 6f  lities in some o
a1d0: 70 65 72 61 74 69 6e 67 0a 2a 2a 20 73 79 73 74  perating.** syst
a1e0: 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ems..**.** This 
a1f0: 69 73 20 6c 69 6b 65 20 6f 75 74 70 75 74 5f 71  is like output_q
a200: 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 29 20 62  uoted_string() b
a210: 75 74 20 77 69 74 68 20 74 68 65 20 61 64 64 69  ut with the addi
a220: 74 69 6f 6e 20 6f 66 20 74 68 65 20 5c 72 5c 6e  tion of the \r\n
a230: 0a 2a 2a 20 65 73 63 61 70 65 20 6d 65 63 68 61  .** escape mecha
a240: 6e 69 73 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  nism..*/.static 
a250: 76 6f 69 64 20 6f 75 74 70 75 74 5f 71 75 6f 74  void output_quot
a260: 65 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e  ed_escaped_strin
a270: 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e  g(FILE *out, con
a280: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
a290: 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a  nt i;.  char c;.
a2a0: 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28    setBinaryMode(
a2b0: 6f 75 74 2c 20 31 29 3b 0a 20 20 66 6f 72 28 69  out, 1);.  for(i
a2c0: 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d  =0; (c = z[i])!=
a2d0: 30 20 26 26 20 63 21 3d 27 5c 27 27 20 26 26 20  0 && c!='\'' && 
a2e0: 63 21 3d 27 5c 6e 27 20 26 26 20 63 21 3d 27 5c  c!='\n' && c!='\
a2f0: 72 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28  r'; i++){}.  if(
a300: 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66   c==0 ){.    utf
a310: 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 25  8_printf(out,"'%
a320: 73 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b  s'",z);.  }else{
a330: 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
a340: 2a 7a 4e 4c 20 3d 20 30 3b 0a 20 20 20 20 63 6f  *zNL = 0;.    co
a350: 6e 73 74 20 63 68 61 72 20 2a 7a 43 52 20 3d 20  nst char *zCR = 
a360: 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 4c 20 3d  0;.    int nNL =
a370: 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 43 52 20   0;.    int nCR 
a380: 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 7a 42  = 0;.    char zB
a390: 75 66 31 5b 32 30 5d 2c 20 7a 42 75 66 32 5b 32  uf1[20], zBuf2[2
a3a0: 30 5d 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  0];.    for(i=0;
a3b0: 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
a3c0: 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e     if( z[i]=='\n
a3d0: 27 20 29 20 6e 4e 4c 2b 2b 3b 0a 20 20 20 20 20  ' ) nNL++;.     
a3e0: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 72 27 20   if( z[i]=='\r' 
a3f0: 29 20 6e 43 52 2b 2b 3b 0a 20 20 20 20 7d 0a 20  ) nCR++;.    }. 
a400: 20 20 20 69 66 28 20 6e 4e 4c 20 29 7b 0a 20 20     if( nNL ){.  
a410: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
a420: 75 74 2c 20 22 72 65 70 6c 61 63 65 28 22 29 3b  ut, "replace(");
a430: 0a 20 20 20 20 20 20 7a 4e 4c 20 3d 20 75 6e 75  .      zNL = unu
a440: 73 65 64 5f 73 74 72 69 6e 67 28 7a 2c 20 22 5c  sed_string(z, "\
a450: 5c 6e 22 2c 20 22 5c 5c 30 31 32 22 2c 20 7a 42  \n", "\\012", zB
a460: 75 66 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  uf1);.    }.    
a470: 69 66 28 20 6e 43 52 20 29 7b 0a 20 20 20 20 20  if( nCR ){.     
a480: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
a490: 20 22 72 65 70 6c 61 63 65 28 22 29 3b 0a 20 20   "replace(");.  
a4a0: 20 20 20 20 7a 43 52 20 3d 20 75 6e 75 73 65 64      zCR = unused
a4b0: 5f 73 74 72 69 6e 67 28 7a 2c 20 22 5c 5c 72 22  _string(z, "\\r"
a4c0: 2c 20 22 5c 5c 30 31 35 22 2c 20 7a 42 75 66 32  , "\\015", zBuf2
a4d0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77  );.    }.    raw
a4e0: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22  _printf(out, "'"
a4f0: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a  );.    while( *z
a500: 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
a510: 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30  0; (c = z[i])!=0
a520: 20 26 26 20 63 21 3d 27 5c 6e 27 20 26 26 20 63   && c!='\n' && c
a530: 21 3d 27 5c 72 27 20 26 26 20 63 21 3d 27 5c 27  !='\r' && c!='\'
a540: 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  '; i++){}.      
a550: 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 20 69 2b  if( c=='\'' ) i+
a560: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 20 29  +;.      if( i )
a570: 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
a580: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2e 2a 73  rintf(out, "%.*s
a590: 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 20 20 20 20  ", i, z);.      
a5a0: 20 20 7a 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20    z += i;.      
a5b0: 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  }.      if( c=='
a5c0: 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20 72  \'' ){.        r
a5d0: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
a5e0: 27 22 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  '");.        con
a5f0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
a600: 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b       if( c==0 ){
a610: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
a620: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 2b        }.      z+
a630: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  +;.      if( c==
a640: 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\n' ){.        
a650: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
a660: 22 25 73 22 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20  "%s", zNL);.    
a670: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
a680: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f      }.      raw_
a690: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22  printf(out, "%s"
a6a0: 2c 20 7a 43 52 29 3b 0a 20 20 20 20 7d 0a 20 20  , zCR);.    }.  
a6b0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
a6c0: 2c 20 22 27 22 29 3b 0a 20 20 20 20 69 66 28 20  , "'");.    if( 
a6d0: 6e 43 52 20 29 7b 0a 20 20 20 20 20 20 72 61 77  nCR ){.      raw
a6e0: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2c 27  _printf(out, ",'
a6f0: 25 73 27 2c 63 68 61 72 28 31 33 29 29 22 2c 20  %s',char(13))", 
a700: 7a 43 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  zCR);.    }.    
a710: 69 66 28 20 6e 4e 4c 20 29 7b 0a 20 20 20 20 20  if( nNL ){.     
a720: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
a730: 20 22 2c 27 25 73 27 2c 63 68 61 72 28 31 30 29   ",'%s',char(10)
a740: 29 22 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20 7d 0a  )", zNL);.    }.
a750: 20 20 7d 0a 20 20 73 65 74 54 65 78 74 4d 6f 64    }.  setTextMod
a760: 65 28 6f 75 74 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a  e(out, 1);.}../*
a770: 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67  .** Output the g
a780: 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61  iven string as a
a790: 20 71 75 6f 74 65 64 20 61 63 63 6f 72 64 69 6e   quoted accordin
a7a0: 67 20 74 6f 20 43 20 6f 72 20 54 43 4c 20 71 75  g to C or TCL qu
a7b0: 6f 74 69 6e 67 20 72 75 6c 65 73 2e 0a 2a 2f 0a  oting rules..*/.
a7c0: 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70  static void outp
a7d0: 75 74 5f 63 5f 73 74 72 69 6e 67 28 46 49 4c 45  ut_c_string(FILE
a7e0: 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61   *out, const cha
a7f0: 72 20 2a 7a 29 7b 0a 20 20 75 6e 73 69 67 6e 65  r *z){.  unsigne
a800: 64 20 69 6e 74 20 63 3b 0a 20 20 66 70 75 74 63  d int c;.  fputc
a810: 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20 77 68  ('"', out);.  wh
a820: 69 6c 65 28 20 28 63 20 3d 20 2a 28 7a 2b 2b 29  ile( (c = *(z++)
a830: 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )!=0 ){.    if( 
a840: 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20  c=='\\' ){.     
a850: 20 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a   fputc(c, out);.
a860: 20 20 20 20 20 20 66 70 75 74 63 28 63 2c 20 6f        fputc(c, o
a870: 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ut);.    }else i
a880: 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20  f( c=='"' ){.   
a890: 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f     fputc('\\', o
a8a0: 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63  ut);.      fputc
a8b0: 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20  ('"', out);.    
a8c0: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 74  }else if( c=='\t
a8d0: 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63  ' ){.      fputc
a8e0: 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20  ('\\', out);.   
a8f0: 20 20 20 66 70 75 74 63 28 27 74 27 2c 20 6f 75     fputc('t', ou
a900: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  t);.    }else if
a910: 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20  ( c=='\n' ){.   
a920: 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f     fputc('\\', o
a930: 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63  ut);.      fputc
a940: 28 27 6e 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20  ('n', out);.    
a950: 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 72  }else if( c=='\r
a960: 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63  ' ){.      fputc
a970: 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20  ('\\', out);.   
a980: 20 20 20 66 70 75 74 63 28 27 72 27 2c 20 6f 75     fputc('r', ou
a990: 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  t);.    }else if
a9a0: 28 20 21 69 73 70 72 69 6e 74 28 63 26 30 78 66  ( !isprint(c&0xf
a9b0: 66 29 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  f) ){.      raw_
a9c0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c 5c 25  printf(out, "\\%
a9d0: 30 33 6f 22 2c 20 63 26 30 78 66 66 29 3b 0a 20  03o", c&0xff);. 
a9e0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a9f0: 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20  fputc(c, out);. 
aa00: 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 75 74 63     }.  }.  fputc
aa10: 28 27 22 27 2c 20 6f 75 74 29 3b 0a 7d 0a 0a 2f  ('"', out);.}../
aa20: 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20  *.** Output the 
aa30: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 77 69 74  given string wit
aa40: 68 20 63 68 61 72 61 63 74 65 72 73 20 74 68 61  h characters tha
aa50: 74 20 61 72 65 20 73 70 65 63 69 61 6c 20 74 6f  t are special to
aa60: 0a 2a 2a 20 48 54 4d 4c 20 65 73 63 61 70 65 64  .** HTML escaped
aa70: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
aa80: 20 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72   output_html_str
aa90: 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63  ing(FILE *out, c
aaa0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
aab0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 3d   int i;.  if( z=
aac0: 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20 20 77  =0 ) z = "";.  w
aad0: 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20  hile( *z ){.    
aae0: 66 6f 72 28 69 3d 30 3b 20 20 20 7a 5b 69 5d 0a  for(i=0;   z[i].
aaf0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 7a              && z
ab00: 5b 69 5d 21 3d 27 3c 27 0a 20 20 20 20 20 20 20  [i]!='<'.       
ab10: 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 26       && z[i]!='&
ab20: 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26  '.            &&
ab30: 20 7a 5b 69 5d 21 3d 27 3e 27 0a 20 20 20 20 20   z[i]!='>'.     
ab40: 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d         && z[i]!=
ab50: 27 5c 22 27 0a 20 20 20 20 20 20 20 20 20 20 20  '\"'.           
ab60: 20 26 26 20 7a 5b 69 5d 21 3d 27 5c 27 27 3b 0a   && z[i]!='\'';.
ab70: 20 20 20 20 20 20 20 20 69 2b 2b 29 7b 7d 0a 20          i++){}. 
ab80: 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20     if( i>0 ){.  
ab90: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
aba0: 6f 75 74 2c 22 25 2e 2a 73 22 2c 69 2c 7a 29 3b  out,"%.*s",i,z);
abb0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
abc0: 5b 69 5d 3d 3d 27 3c 27 20 29 7b 0a 20 20 20 20  [i]=='<' ){.    
abd0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
abe0: 2c 22 26 6c 74 3b 22 29 3b 0a 20 20 20 20 7d 65  ,"&lt;");.    }e
abf0: 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 26  lse if( z[i]=='&
ac00: 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  ' ){.      raw_p
ac10: 72 69 6e 74 66 28 6f 75 74 2c 22 26 61 6d 70 3b  rintf(out,"&amp;
ac20: 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ");.    }else if
ac30: 28 20 7a 5b 69 5d 3d 3d 27 3e 27 20 29 7b 0a 20  ( z[i]=='>' ){. 
ac40: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
ac50: 6f 75 74 2c 22 26 67 74 3b 22 29 3b 0a 20 20 20  out,"&gt;");.   
ac60: 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d   }else if( z[i]=
ac70: 3d 27 5c 22 27 20 29 7b 0a 20 20 20 20 20 20 72  ='\"' ){.      r
ac80: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26  aw_printf(out,"&
ac90: 71 75 6f 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c  quot;");.    }el
aca0: 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 27  se if( z[i]=='\'
acb0: 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  ' ){.      raw_p
acc0: 72 69 6e 74 66 28 6f 75 74 2c 22 26 23 33 39 3b  rintf(out,"&#39;
acd0: 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ");.    }else{. 
ace0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
acf0: 7d 0a 20 20 20 20 7a 20 2b 3d 20 69 20 2b 20 31  }.    z += i + 1
ad00: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  ;.  }.}../*.** I
ad10: 66 20 61 20 66 69 65 6c 64 20 63 6f 6e 74 61 69  f a field contai
ad20: 6e 73 20 61 6e 79 20 63 68 61 72 61 63 74 65 72  ns any character
ad30: 20 69 64 65 6e 74 69 66 69 65 64 20 62 79 20 61   identified by a
ad40: 20 31 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77   1 in the follow
ad50: 69 6e 67 0a 2a 2a 20 61 72 72 61 79 2c 20 74 68  ing.** array, th
ad60: 65 6e 20 74 68 65 20 73 74 72 69 6e 67 20 6d 75  en the string mu
ad70: 73 74 20 62 65 20 71 75 6f 74 65 64 20 66 6f 72  st be quoted for
ad80: 20 43 53 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   CSV..*/.static 
ad90: 63 6f 6e 73 74 20 63 68 61 72 20 6e 65 65 64 43  const char needC
ada0: 73 76 51 75 6f 74 65 5b 5d 20 3d 20 7b 0a 20 20  svQuote[] = {.  
adb0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
adc0: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
add0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
ade0: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
adf0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
ae00: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
ae10: 31 2c 20 31 2c 0a 20 20 31 2c 20 30 2c 20 31 2c  1, 1,.  1, 0, 1,
ae20: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20   0, 0, 0, 0, 1, 
ae30: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
ae40: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30   0, 0, 0,.  0, 0
ae50: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
ae60: 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,   0, 0, 0, 0
ae70: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
ae80: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
ae90: 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20  , 0, 0,   0, 0, 
aea0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
aeb0: 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,.  0, 0, 0, 0, 
aec0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c  0, 0, 0, 0,   0,
aed0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
aee0: 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c  0, 0,.  0, 0, 0,
aef0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
af00: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
af10: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30   0, 0, 0,.  0, 0
af20: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
af30: 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,   0, 0, 0, 0
af40: 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 0a 20 20  , 0, 0, 0, 1,.  
af50: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
af60: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
af70: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
af80: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
af90: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
afa0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
afb0: 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c  1, 1,.  1, 1, 1,
afc0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
afd0: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
afe0: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31   1, 1, 1,.  1, 1
aff0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
b000: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
b010: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
b020: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
b030: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
b040: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
b050: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
b060: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
b070: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
b080: 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c  1, 1,.  1, 1, 1,
b090: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
b0a0: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
b0b0: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31   1, 1, 1,.  1, 1
b0c0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
b0d0: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
b0e0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 7d 3b  , 1, 1, 1, 1,.};
b0f0: 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 61  ../*.** Output a
b100: 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20   single term of 
b110: 43 53 56 2e 20 20 41 63 74 75 61 6c 6c 79 2c 20  CSV.  Actually, 
b120: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 20  p->colSeparator 
b130: 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74  is used for.** t
b140: 68 65 20 73 65 70 61 72 61 74 6f 72 2c 20 77 68  he separator, wh
b150: 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e  ich may or may n
b160: 6f 74 20 62 65 20 61 20 63 6f 6d 6d 61 2e 20 20  ot be a comma.  
b170: 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 20 69 73 0a  p->nullValue is.
b180: 2a 2a 20 74 68 65 20 6e 75 6c 6c 20 76 61 6c 75  ** the null valu
b190: 65 2e 20 20 53 74 72 69 6e 67 73 20 61 72 65 20  e.  Strings are 
b1a0: 71 75 6f 74 65 64 20 69 66 20 6e 65 63 65 73 73  quoted if necess
b1b0: 61 72 79 2e 20 20 54 68 65 20 73 65 70 61 72 61  ary.  The separa
b1c0: 74 6f 72 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 69  tor.** is only i
b1d0: 73 73 75 65 64 20 69 66 20 62 53 65 70 20 69 73  ssued if bSep is
b1e0: 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   true..*/.static
b1f0: 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 63 73 76   void output_csv
b200: 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20  (ShellState *p, 
b210: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
b220: 6e 74 20 62 53 65 70 29 7b 0a 20 20 46 49 4c 45  nt bSep){.  FILE
b230: 20 2a 6f 75 74 20 3d 20 70 2d 3e 6f 75 74 3b 0a   *out = p->out;.
b240: 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20    if( z==0 ){.  
b250: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
b260: 74 2c 22 25 73 22 2c 70 2d 3e 6e 75 6c 6c 56 61  t,"%s",p->nullVa
b270: 6c 75 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  lue);.  }else{. 
b280: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
b290: 74 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33  t nSep = strlen3
b2a0: 30 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  0(p->colSeparato
b2b0: 72 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  r);.    for(i=0;
b2c0: 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20   z[i]; i++){.   
b2d0: 20 20 20 69 66 28 20 6e 65 65 64 43 73 76 51 75     if( needCsvQu
b2e0: 6f 74 65 5b 28 28 75 6e 73 69 67 6e 65 64 20 63  ote[((unsigned c
b2f0: 68 61 72 2a 29 7a 29 5b 69 5d 5d 0a 20 20 20 20  har*)z)[i]].    
b300: 20 20 20 20 20 7c 7c 20 28 7a 5b 69 5d 3d 3d 70       || (z[i]==p
b310: 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b 30  ->colSeparator[0
b320: 5d 20 26 26 0a 20 20 20 20 20 20 20 20 20 20 20  ] &&.           
b330: 20 20 28 6e 53 65 70 3d 3d 31 20 7c 7c 20 6d 65    (nSep==1 || me
b340: 6d 63 6d 70 28 7a 2c 20 70 2d 3e 63 6f 6c 53 65  mcmp(z, p->colSe
b350: 70 61 72 61 74 6f 72 2c 20 6e 53 65 70 29 3d 3d  parator, nSep)==
b360: 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  0)) ){.        i
b370: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72   = 0;.        br
b380: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
b390: 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 20   }.    if( i==0 
b3a0: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
b3b0: 51 75 6f 74 65 64 20 3d 20 73 71 6c 69 74 65 33  Quoted = sqlite3
b3c0: 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25 77 5c 22  _mprintf("\"%w\"
b3d0: 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 75 74 66  ", z);.      utf
b3e0: 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  8_printf(out, "%
b3f0: 73 22 2c 20 7a 51 75 6f 74 65 64 29 3b 0a 20 20  s", zQuoted);.  
b400: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
b410: 28 7a 51 75 6f 74 65 64 29 3b 0a 20 20 20 20 7d  (zQuoted);.    }
b420: 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 74 66 38  else{.      utf8
b430: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
b440: 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ", z);.    }.  }
b450: 0a 20 20 69 66 28 20 62 53 65 70 20 29 7b 0a 20  .  if( bSep ){. 
b460: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
b470: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e  ->out, "%s", p->
b480: 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  colSeparator);. 
b490: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
b4a0: 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20 77 68   routine runs wh
b4b0: 65 6e 20 74 68 65 20 75 73 65 72 20 70 72 65 73  en the user pres
b4c0: 73 65 73 20 43 74 72 6c 2d 43 0a 2a 2f 0a 73 74  ses Ctrl-C.*/.st
b4d0: 61 74 69 63 20 76 6f 69 64 20 69 6e 74 65 72 72  atic void interr
b4e0: 75 70 74 5f 68 61 6e 64 6c 65 72 28 69 6e 74 20  upt_handler(int 
b4f0: 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53  NotUsed){.  UNUS
b500: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74  ED_PARAMETER(Not
b510: 55 73 65 64 29 3b 0a 20 20 73 65 65 6e 49 6e 74  Used);.  seenInt
b520: 65 72 72 75 70 74 2b 2b 3b 0a 20 20 69 66 28 20  errupt++;.  if( 
b530: 73 65 65 6e 49 6e 74 65 72 72 75 70 74 3e 32 20  seenInterrupt>2 
b540: 29 20 65 78 69 74 28 31 29 3b 0a 20 20 69 66 28  ) exit(1);.  if(
b550: 20 67 6c 6f 62 61 6c 44 62 20 29 20 73 71 6c 69   globalDb ) sqli
b560: 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28 67 6c  te3_interrupt(gl
b570: 6f 62 61 6c 44 62 29 3b 0a 7d 0a 0a 23 69 66 20  obalDb);.}..#if 
b580: 28 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29  (defined(_WIN32)
b590: 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33   || defined(WIN3
b5a0: 32 29 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  2)) && !defined(
b5b0: 5f 57 49 4e 33 32 5f 57 43 45 29 0a 2f 2a 0a 2a  _WIN32_WCE)./*.*
b5c0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
b5d0: 75 6e 73 20 66 6f 72 20 63 6f 6e 73 6f 6c 65 20  uns for console 
b5e0: 65 76 65 6e 74 73 20 28 65 2e 67 2e 20 43 74 72  events (e.g. Ctr
b5f0: 6c 2d 43 29 20 6f 6e 20 57 69 6e 33 32 0a 2a 2f  l-C) on Win32.*/
b600: 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 57 49 4e  .static BOOL WIN
b610: 41 50 49 20 43 6f 6e 73 6f 6c 65 43 74 72 6c 48  API ConsoleCtrlH
b620: 61 6e 64 6c 65 72 28 0a 20 20 44 57 4f 52 44 20  andler(.  DWORD 
b630: 64 77 43 74 72 6c 54 79 70 65 20 2f 2a 20 4f 6e  dwCtrlType /* On
b640: 65 20 6f 66 20 74 68 65 20 43 54 52 4c 5f 2a 5f  e of the CTRL_*_
b650: 45 56 45 4e 54 20 63 6f 6e 73 74 61 6e 74 73 20  EVENT constants 
b660: 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 64 77 43 74  */.){.  if( dwCt
b670: 72 6c 54 79 70 65 3d 3d 43 54 52 4c 5f 43 5f 45  rlType==CTRL_C_E
b680: 56 45 4e 54 20 29 7b 0a 20 20 20 20 69 6e 74 65  VENT ){.    inte
b690: 72 72 75 70 74 5f 68 61 6e 64 6c 65 72 28 30 29  rrupt_handler(0)
b6a0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54 52 55  ;.    return TRU
b6b0: 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  E;.  }.  return 
b6c0: 46 41 4c 53 45 3b 0a 7d 0a 23 65 6e 64 69 66 0a  FALSE;.}.#endif.
b6d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b6e0: 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
b6f0: 4f 4e 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68  ON./*.** When th
b700: 65 20 22 2e 61 75 74 68 20 4f 4e 22 20 69 73 20  e ".auth ON" is 
b710: 73 65 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  set, the followi
b720: 6e 67 20 61 75 74 68 6f 72 69 7a 65 72 20 63 61  ng authorizer ca
b730: 6c 6c 62 61 63 6b 20 69 73 0a 2a 2a 20 69 6e 76  llback is.** inv
b740: 6f 6b 65 64 2e 20 20 49 74 20 61 6c 77 61 79 73  oked.  It always
b750: 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f   returns SQLITE_
b760: 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OK..*/.static in
b770: 74 20 73 68 65 6c 6c 41 75 74 68 28 0a 20 20 76  t shellAuth(.  v
b780: 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44 61 74 61  oid *pClientData
b790: 2c 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f  ,.  int op,.  co
b7a0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 31 2c 0a 20  nst char *zA1,. 
b7b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 32   const char *zA2
b7c0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
b7d0: 7a 41 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  zA3,.  const cha
b7e0: 72 20 2a 7a 41 34 0a 29 7b 0a 20 20 53 68 65 6c  r *zA4.){.  Shel
b7f0: 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65  lState *p = (She
b800: 6c 6c 53 74 61 74 65 2a 29 70 43 6c 69 65 6e 74  llState*)pClient
b810: 44 61 74 61 3b 0a 20 20 73 74 61 74 69 63 20 63  Data;.  static c
b820: 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 41 63 74  onst char *azAct
b830: 69 6f 6e 5b 5d 20 3d 20 7b 20 30 2c 0a 20 20 20  ion[] = { 0,.   
b840: 20 20 22 43 52 45 41 54 45 5f 49 4e 44 45 58 22    "CREATE_INDEX"
b850: 2c 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54  ,         "CREAT
b860: 45 5f 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20  E_TABLE",       
b870: 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50 5f 49    "CREATE_TEMP_I
b880: 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 43 52 45  NDEX",.     "CRE
b890: 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45 22 2c  ATE_TEMP_TABLE",
b8a0: 20 20 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50      "CREATE_TEMP
b8b0: 5f 54 52 49 47 47 45 52 22 2c 20 20 22 43 52 45  _TRIGGER",  "CRE
b8c0: 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 22 2c 0a  ATE_TEMP_VIEW",.
b8d0: 20 20 20 20 20 22 43 52 45 41 54 45 5f 54 52 49       "CREATE_TRI
b8e0: 47 47 45 52 22 2c 20 20 20 20 20 20 20 22 43 52  GGER",       "CR
b8f0: 45 41 54 45 5f 56 49 45 57 22 2c 20 20 20 20 20  EATE_VIEW",     
b900: 20 20 20 20 20 22 44 45 4c 45 54 45 22 2c 0a 20       "DELETE",. 
b910: 20 20 20 20 22 44 52 4f 50 5f 49 4e 44 45 58 22      "DROP_INDEX"
b920: 2c 20 20 20 20 20 20 20 20 20 20 20 22 44 52 4f  ,           "DRO
b930: 50 5f 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20  P_TABLE",       
b940: 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 49      "DROP_TEMP_I
b950: 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 44 52 4f  NDEX",.     "DRO
b960: 50 5f 54 45 4d 50 5f 54 41 42 4c 45 22 2c 20 20  P_TEMP_TABLE",  
b970: 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 54      "DROP_TEMP_T
b980: 52 49 47 47 45 52 22 2c 20 20 20 20 22 44 52 4f  RIGGER",    "DRO
b990: 50 5f 54 45 4d 50 5f 56 49 45 57 22 2c 0a 20 20  P_TEMP_VIEW",.  
b9a0: 20 20 20 22 44 52 4f 50 5f 54 52 49 47 47 45 52     "DROP_TRIGGER
b9b0: 22 2c 20 20 20 20 20 20 20 20 20 22 44 52 4f 50  ",         "DROP
b9c0: 5f 56 49 45 57 22 2c 20 20 20 20 20 20 20 20 20  _VIEW",         
b9d0: 20 20 20 22 49 4e 53 45 52 54 22 2c 0a 20 20 20     "INSERT",.   
b9e0: 20 20 22 50 52 41 47 4d 41 22 2c 20 20 20 20 20    "PRAGMA",     
b9f0: 20 20 20 20 20 20 20 20 20 20 22 52 45 41 44 22            "READ"
ba00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
ba10: 20 20 22 53 45 4c 45 43 54 22 2c 0a 20 20 20 20    "SELECT",.    
ba20: 20 22 54 52 41 4e 53 41 43 54 49 4f 4e 22 2c 20   "TRANSACTION", 
ba30: 20 20 20 20 20 20 20 20 20 22 55 50 44 41 54 45           "UPDATE
ba40: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
ba50: 20 22 41 54 54 41 43 48 22 2c 0a 20 20 20 20 20   "ATTACH",.     
ba60: 22 44 45 54 41 43 48 22 2c 20 20 20 20 20 20 20  "DETACH",       
ba70: 20 20 20 20 20 20 20 20 22 41 4c 54 45 52 5f 54          "ALTER_T
ba80: 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20 20 20  ABLE",          
ba90: 22 52 45 49 4e 44 45 58 22 2c 0a 20 20 20 20 20  "REINDEX",.     
baa0: 22 41 4e 41 4c 59 5a 45 22 2c 20 20 20 20 20 20  "ANALYZE",      
bab0: 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 5f          "CREATE_
bac0: 56 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20  VTABLE",        
bad0: 22 44 52 4f 50 5f 56 54 41 42 4c 45 22 2c 0a 20  "DROP_VTABLE",. 
bae0: 20 20 20 20 22 46 55 4e 43 54 49 4f 4e 22 2c 20      "FUNCTION", 
baf0: 20 20 20 20 20 20 20 20 20 20 20 20 22 53 41 56              "SAV
bb00: 45 50 4f 49 4e 54 22 2c 20 20 20 20 20 20 20 20  EPOINT",        
bb10: 20 20 20 20 22 52 45 43 55 52 53 49 56 45 22 0a      "RECURSIVE".
bb20: 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20    };.  int i;.  
bb30: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 5b 34  const char *az[4
bb40: 5d 3b 0a 20 20 61 7a 5b 30 5d 20 3d 20 7a 41 31  ];.  az[0] = zA1
bb50: 3b 0a 20 20 61 7a 5b 31 5d 20 3d 20 7a 41 32 3b  ;.  az[1] = zA2;
bb60: 0a 20 20 61 7a 5b 32 5d 20 3d 20 7a 41 33 3b 0a  .  az[2] = zA3;.
bb70: 20 20 61 7a 5b 33 5d 20 3d 20 7a 41 34 3b 0a 20    az[3] = zA4;. 
bb80: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
bb90: 6f 75 74 2c 20 22 61 75 74 68 6f 72 69 7a 65 72  out, "authorizer
bba0: 3a 20 25 73 22 2c 20 61 7a 41 63 74 69 6f 6e 5b  : %s", azAction[
bbb0: 6f 70 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  op]);.  for(i=0;
bbc0: 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<4; i++){.    
bbd0: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
bbe0: 74 2c 20 22 20 22 29 3b 0a 20 20 20 20 69 66 28  t, " ");.    if(
bbf0: 20 61 7a 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20   az[i] ){.      
bc00: 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28  output_c_string(
bc10: 70 2d 3e 6f 75 74 2c 20 61 7a 5b 69 5d 29 3b 0a  p->out, az[i]);.
bc20: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
bc30: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
bc40: 75 74 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20  ut, "NULL");.   
bc50: 20 7d 0a 20 20 7d 0a 20 20 72 61 77 5f 70 72 69   }.  }.  raw_pri
bc60: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22  ntf(p->out, "\n"
bc70: 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
bc80: 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a  TE_OK;.}.#endif.
bc90: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73  ./*.** Print a s
bca0: 63 68 65 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e  chema statement.
bcb0: 20 20 50 61 72 74 20 6f 66 20 4d 4f 44 45 5f 53    Part of MODE_S
bcc0: 65 6d 69 20 61 6e 64 20 4d 4f 44 45 5f 50 72 65  emi and MODE_Pre
bcd0: 74 74 79 20 6f 75 74 70 75 74 2e 0a 2a 2a 0a 2a  tty output..**.*
bce0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63  * This routine c
bcf0: 6f 6e 76 65 72 74 73 20 73 6f 6d 65 20 43 52 45  onverts some CRE
bd00: 41 54 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d  ATE TABLE statem
bd10: 65 6e 74 73 20 66 6f 72 20 73 68 61 64 6f 77 20  ents for shadow 
bd20: 74 61 62 6c 65 73 0a 2a 2a 20 69 6e 20 46 54 53  tables.** in FTS
bd30: 33 2f 34 2f 35 20 69 6e 74 6f 20 43 52 45 41 54  3/4/5 into CREAT
bd40: 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
bd50: 58 49 53 54 53 20 73 74 61 74 65 6d 65 6e 74 73  XISTS statements
bd60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
bd70: 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65   printSchemaLine
bd80: 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73  (FILE *out, cons
bd90: 74 20 63 68 61 72 20 2a 7a 2c 20 63 6f 6e 73 74  t char *z, const
bda0: 20 63 68 61 72 20 2a 7a 54 61 69 6c 29 7b 0a 20   char *zTail){. 
bdb0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
bdc0: 67 6c 6f 62 28 22 43 52 45 41 54 45 20 54 41 42  glob("CREATE TAB
bdd0: 4c 45 20 5b 27 5c 22 5d 2a 22 2c 20 7a 29 3d 3d  LE ['\"]*", z)==
bde0: 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  0 ){.    utf8_pr
bdf0: 69 6e 74 66 28 6f 75 74 2c 20 22 43 52 45 41 54  intf(out, "CREAT
be00: 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
be10: 58 49 53 54 53 20 25 73 25 73 22 2c 20 7a 2b 31  XISTS %s%s", z+1
be20: 33 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7d 65 6c  3, zTail);.  }el
be30: 73 65 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69  se{.    utf8_pri
be40: 6e 74 66 28 6f 75 74 2c 20 22 25 73 25 73 22 2c  ntf(out, "%s%s",
be50: 20 7a 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7d 0a   z, zTail);.  }.
be60: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72  }.static void pr
be70: 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28 46  intSchemaLineN(F
be80: 49 4c 45 20 2a 6f 75 74 2c 20 63 68 61 72 20 2a  ILE *out, char *
be90: 7a 2c 20 69 6e 74 20 6e 2c 20 63 6f 6e 73 74 20  z, int n, const 
bea0: 63 68 61 72 20 2a 7a 54 61 69 6c 29 7b 0a 20 20  char *zTail){.  
beb0: 63 68 61 72 20 63 20 3d 20 7a 5b 6e 5d 3b 0a 20  char c = z[n];. 
bec0: 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 70 72 69   z[n] = 0;.  pri
bed0: 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 6f 75 74  ntSchemaLine(out
bee0: 2c 20 7a 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7a  , z, zTail);.  z
bef0: 5b 6e 5d 20 3d 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  [n] = c;.}../*.*
bf00: 2a 20 52 65 74 75 72 6e 20 74 72 75 65 20 69 66  * Return true if
bf10: 20 73 74 72 69 6e 67 20 7a 5b 5d 20 68 61 73 20   string z[] has 
bf20: 6e 6f 74 68 69 6e 67 20 62 75 74 20 77 68 69 74  nothing but whit
bf30: 65 73 70 61 63 65 20 61 6e 64 20 63 6f 6d 6d 65  espace and comme
bf40: 6e 74 73 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e  nts to the.** en
bf50: 64 20 6f 66 20 74 68 65 20 66 69 72 73 74 20 6c  d of the first l
bf60: 69 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ine..*/.static i
bf70: 6e 74 20 77 73 54 6f 45 6f 6c 28 63 6f 6e 73 74  nt wsToEol(const
bf80: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
bf90: 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a   i;.  for(i=0; z
bfa0: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  [i]; i++){.    i
bfb0: 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20  f( z[i]=='\n' ) 
bfc0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66  return 1;.    if
bfd0: 28 20 49 73 53 70 61 63 65 28 7a 5b 69 5d 29 20  ( IsSpace(z[i]) 
bfe0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
bff0: 69 66 28 20 7a 5b 69 5d 3d 3d 27 2d 27 20 26 26  if( z[i]=='-' &&
c000: 20 7a 5b 69 2b 31 5d 3d 3d 27 2d 27 20 29 20 72   z[i+1]=='-' ) r
c010: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 72 65 74  eturn 1;.    ret
c020: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
c030: 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
c040: 41 64 64 20 61 20 6e 65 77 20 65 6e 74 72 79 20  Add a new entry 
c050: 74 6f 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51  to the EXPLAIN Q
c060: 55 45 52 59 20 50 4c 41 4e 20 64 61 74 61 0a 2a  UERY PLAN data.*
c070: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 71  /.static void eq
c080: 70 5f 61 70 70 65 6e 64 28 53 68 65 6c 6c 53 74  p_append(ShellSt
c090: 61 74 65 20 2a 70 2c 20 69 6e 74 20 69 45 71 70  ate *p, int iEqp
c0a0: 49 64 2c 20 69 6e 74 20 70 32 2c 20 63 6f 6e 73  Id, int p2, cons
c0b0: 74 20 63 68 61 72 20 2a 7a 54 65 78 74 29 7b 0a  t char *zText){.
c0c0: 20 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a 70    EQPGraphRow *p
c0d0: 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 54 65 78 74  New;.  int nText
c0e0: 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 54 65 78   = strlen30(zTex
c0f0: 74 29 3b 0a 20 20 69 66 28 20 70 2d 3e 61 75 74  t);.  if( p->aut
c100: 6f 45 51 50 74 65 73 74 20 29 7b 0a 20 20 20 20  oEQPtest ){.    
c110: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
c120: 75 74 2c 20 22 25 64 2c 25 64 2c 25 73 5c 6e 22  ut, "%d,%d,%s\n"
c130: 2c 20 69 45 71 70 49 64 2c 20 70 32 2c 20 7a 54  , iEqpId, p2, zT
c140: 65 78 74 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77  ext);.  }.  pNew
c150: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
c160: 63 36 34 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65  c64( sizeof(*pNe
c170: 77 29 20 2b 20 6e 54 65 78 74 20 29 3b 0a 20 20  w) + nText );.  
c180: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 73 68  if( pNew==0 ) sh
c190: 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72  ell_out_of_memor
c1a0: 79 28 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 45 71  y();.  pNew->iEq
c1b0: 70 49 64 20 3d 20 69 45 71 70 49 64 3b 0a 20 20  pId = iEqpId;.  
c1c0: 70 4e 65 77 2d 3e 69 50 61 72 65 6e 74 49 64 20  pNew->iParentId 
c1d0: 3d 20 70 32 3b 0a 20 20 6d 65 6d 63 70 79 28 70  = p2;.  memcpy(p
c1e0: 4e 65 77 2d 3e 7a 54 65 78 74 2c 20 7a 54 65 78  New->zText, zTex
c1f0: 74 2c 20 6e 54 65 78 74 2b 31 29 3b 0a 20 20 70  t, nText+1);.  p
c200: 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  New->pNext = 0;.
c210: 20 20 69 66 28 20 70 2d 3e 73 47 72 61 70 68 2e    if( p->sGraph.
c220: 70 4c 61 73 74 20 29 7b 0a 20 20 20 20 70 2d 3e  pLast ){.    p->
c230: 73 47 72 61 70 68 2e 70 4c 61 73 74 2d 3e 70 4e  sGraph.pLast->pN
c240: 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 7d 65  ext = pNew;.  }e
c250: 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 73 47 72 61  lse{.    p->sGra
c260: 70 68 2e 70 52 6f 77 20 3d 20 70 4e 65 77 3b 0a  ph.pRow = pNew;.
c270: 20 20 7d 0a 20 20 70 2d 3e 73 47 72 61 70 68 2e    }.  p->sGraph.
c280: 70 4c 61 73 74 20 3d 20 70 4e 65 77 3b 0a 7d 0a  pLast = pNew;.}.
c290: 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 61 6e 64 20  ./*.** Free and 
c2a0: 72 65 73 65 74 20 74 68 65 20 45 58 50 4c 41 49  reset the EXPLAI
c2b0: 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 64 61 74  N QUERY PLAN dat
c2c0: 61 20 74 68 61 74 20 68 61 73 20 62 65 65 6e 20  a that has been 
c2d0: 63 6f 6c 6c 65 63 74 65 64 0a 2a 2a 20 69 6e 20  collected.** in 
c2e0: 70 2d 3e 73 47 72 61 70 68 2e 0a 2a 2f 0a 73 74  p->sGraph..*/.st
c2f0: 61 74 69 63 20 76 6f 69 64 20 65 71 70 5f 72 65  atic void eqp_re
c300: 73 65 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  set(ShellState *
c310: 70 29 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f  p){.  EQPGraphRo
c320: 77 20 2a 70 52 6f 77 2c 20 2a 70 4e 65 78 74 3b  w *pRow, *pNext;
c330: 0a 20 20 66 6f 72 28 70 52 6f 77 20 3d 20 70 2d  .  for(pRow = p-
c340: 3e 73 47 72 61 70 68 2e 70 52 6f 77 3b 20 70 52  >sGraph.pRow; pR
c350: 6f 77 3b 20 70 52 6f 77 20 3d 20 70 4e 65 78 74  ow; pRow = pNext
c360: 29 7b 0a 20 20 20 20 70 4e 65 78 74 20 3d 20 70  ){.    pNext = p
c370: 52 6f 77 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  Row->pNext;.    
c380: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 52 6f  sqlite3_free(pRo
c390: 77 29 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74  w);.  }.  memset
c3a0: 28 26 70 2d 3e 73 47 72 61 70 68 2c 20 30 2c 20  (&p->sGraph, 0, 
c3b0: 73 69 7a 65 6f 66 28 70 2d 3e 73 47 72 61 70 68  sizeof(p->sGraph
c3c0: 29 29 3b 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e  ));.}../* Return
c3d0: 20 74 68 65 20 6e 65 78 74 20 45 58 50 4c 41 49   the next EXPLAI
c3e0: 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 6c 69 6e  N QUERY PLAN lin
c3f0: 65 20 77 69 74 68 20 69 45 71 70 49 64 20 74 68  e with iEqpId th
c400: 61 74 20 6f 63 63 75 72 73 20 61 66 74 65 72 0a  at occurs after.
c410: 2a 2a 20 70 4f 6c 64 2c 20 6f 72 20 72 65 74 75  ** pOld, or retu
c420: 72 6e 20 74 68 65 20 66 69 72 73 74 20 73 75 63  rn the first suc
c430: 68 20 6c 69 6e 65 20 69 66 20 70 4f 6c 64 20 69  h line if pOld i
c440: 73 20 4e 55 4c 4c 0a 2a 2f 0a 73 74 61 74 69 63  s NULL.*/.static
c450: 20 45 51 50 47 72 61 70 68 52 6f 77 20 2a 65 71   EQPGraphRow *eq
c460: 70 5f 6e 65 78 74 5f 72 6f 77 28 53 68 65 6c 6c  p_next_row(Shell
c470: 53 74 61 74 65 20 2a 70 2c 20 69 6e 74 20 69 45  State *p, int iE
c480: 71 70 49 64 2c 20 45 51 50 47 72 61 70 68 52 6f  qpId, EQPGraphRo
c490: 77 20 2a 70 4f 6c 64 29 7b 0a 20 20 45 51 50 47  w *pOld){.  EQPG
c4a0: 72 61 70 68 52 6f 77 20 2a 70 52 6f 77 20 3d 20  raphRow *pRow = 
c4b0: 70 4f 6c 64 20 3f 20 70 4f 6c 64 2d 3e 70 4e 65  pOld ? pOld->pNe
c4c0: 78 74 20 3a 20 70 2d 3e 73 47 72 61 70 68 2e 70  xt : p->sGraph.p
c4d0: 52 6f 77 3b 0a 20 20 77 68 69 6c 65 28 20 70 52  Row;.  while( pR
c4e0: 6f 77 20 26 26 20 70 52 6f 77 2d 3e 69 50 61 72  ow && pRow->iPar
c4f0: 65 6e 74 49 64 21 3d 69 45 71 70 49 64 20 29 20  entId!=iEqpId ) 
c500: 70 52 6f 77 20 3d 20 70 52 6f 77 2d 3e 70 4e 65  pRow = pRow->pNe
c510: 78 74 3b 0a 20 20 72 65 74 75 72 6e 20 70 52 6f  xt;.  return pRo
c520: 77 3b 0a 7d 0a 0a 2f 2a 20 52 65 6e 64 65 72 20  w;.}../* Render 
c530: 61 20 73 69 6e 67 6c 65 20 6c 65 76 65 6c 20 6f  a single level o
c540: 66 20 74 68 65 20 67 72 61 70 68 20 74 68 61 74  f the graph that
c550: 20 68 61 73 20 69 45 71 70 49 64 20 61 73 20 69   has iEqpId as i
c560: 74 73 20 70 61 72 65 6e 74 2e 20 20 43 61 6c 6c  ts parent.  Call
c570: 65 64 0a 2a 2a 20 72 65 63 75 72 73 69 76 65 6c  ed.** recursivel
c580: 79 20 74 6f 20 72 65 6e 64 65 72 20 73 75 62 6c  y to render subl
c590: 65 76 65 6c 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  evels..*/.static
c5a0: 20 76 6f 69 64 20 65 71 70 5f 72 65 6e 64 65 72   void eqp_render
c5b0: 5f 6c 65 76 65 6c 28 53 68 65 6c 6c 53 74 61 74  _level(ShellStat
c5c0: 65 20 2a 70 2c 20 69 6e 74 20 69 45 71 70 49 64  e *p, int iEqpId
c5d0: 29 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77  ){.  EQPGraphRow
c5e0: 20 2a 70 52 6f 77 2c 20 2a 70 4e 65 78 74 3b 0a   *pRow, *pNext;.
c5f0: 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e    int n = strlen
c600: 33 30 28 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72  30(p->sGraph.zPr
c610: 65 66 69 78 29 3b 0a 20 20 63 68 61 72 20 2a 7a  efix);.  char *z
c620: 3b 0a 20 20 66 6f 72 28 70 52 6f 77 20 3d 20 65  ;.  for(pRow = e
c630: 71 70 5f 6e 65 78 74 5f 72 6f 77 28 70 2c 20 69  qp_next_row(p, i
c640: 45 71 70 49 64 2c 20 30 29 3b 20 70 52 6f 77 3b  EqpId, 0); pRow;
c650: 20 70 52 6f 77 20 3d 20 70 4e 65 78 74 29 7b 0a   pRow = pNext){.
c660: 20 20 20 20 70 4e 65 78 74 20 3d 20 65 71 70 5f      pNext = eqp_
c670: 6e 65 78 74 5f 72 6f 77 28 70 2c 20 69 45 71 70  next_row(p, iEqp
c680: 49 64 2c 20 70 52 6f 77 29 3b 0a 20 20 20 20 7a  Id, pRow);.    z
c690: 20 3d 20 70 52 6f 77 2d 3e 7a 54 65 78 74 3b 0a   = pRow->zText;.
c6a0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
c6b0: 70 2d 3e 6f 75 74 2c 20 22 25 73 25 73 25 73 5c  p->out, "%s%s%s\
c6c0: 6e 22 2c 20 70 2d 3e 73 47 72 61 70 68 2e 7a 50  n", p->sGraph.zP
c6d0: 72 65 66 69 78 2c 20 70 4e 65 78 74 20 3f 20 22  refix, pNext ? "
c6e0: 7c 2d 2d 22 20 3a 20 22 60 2d 2d 22 2c 20 7a 29  |--" : "`--", z)
c6f0: 3b 0a 20 20 20 20 69 66 28 20 6e 3c 28 69 6e 74  ;.    if( n<(int
c700: 29 73 69 7a 65 6f 66 28 70 2d 3e 73 47 72 61 70  )sizeof(p->sGrap
c710: 68 2e 7a 50 72 65 66 69 78 29 2d 37 20 29 7b 0a  h.zPrefix)-7 ){.
c720: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 26 70 2d        memcpy(&p-
c730: 3e 73 47 72 61 70 68 2e 7a 50 72 65 66 69 78 5b  >sGraph.zPrefix[
c740: 6e 5d 2c 20 70 4e 65 78 74 20 3f 20 22 7c 20 20  n], pNext ? "|  
c750: 22 20 3a 20 22 20 20 20 22 2c 20 34 29 3b 0a 20  " : "   ", 4);. 
c760: 20 20 20 20 20 65 71 70 5f 72 65 6e 64 65 72 5f       eqp_render_
c770: 6c 65 76 65 6c 28 70 2c 20 70 52 6f 77 2d 3e 69  level(p, pRow->i
c780: 45 71 70 49 64 29 3b 0a 20 20 20 20 20 20 70 2d  EqpId);.      p-
c790: 3e 73 47 72 61 70 68 2e 7a 50 72 65 66 69 78 5b  >sGraph.zPrefix[
c7a0: 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  n] = 0;.    }.  
c7b0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c  }.}../*.** Displ
c7c0: 61 79 20 61 6e 64 20 72 65 73 65 74 20 74 68 65  ay and reset the
c7d0: 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50   EXPLAIN QUERY P
c7e0: 4c 41 4e 20 64 61 74 61 0a 2a 2f 0a 73 74 61 74  LAN data.*/.stat
c7f0: 69 63 20 76 6f 69 64 20 65 71 70 5f 72 65 6e 64  ic void eqp_rend
c800: 65 72 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  er(ShellState *p
c810: 29 7b 0a 20 20 45 51 50 47 72 61 70 68 52 6f 77  ){.  EQPGraphRow
c820: 20 2a 70 52 6f 77 20 3d 20 70 2d 3e 73 47 72 61   *pRow = p->sGra
c830: 70 68 2e 70 52 6f 77 3b 0a 20 20 69 66 28 20 70  ph.pRow;.  if( p
c840: 52 6f 77 20 29 7b 0a 20 20 20 20 69 66 28 20 70  Row ){.    if( p
c850: 52 6f 77 2d 3e 7a 54 65 78 74 5b 30 5d 3d 3d 27  Row->zText[0]=='
c860: 2d 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  -' ){.      if( 
c870: 70 52 6f 77 2d 3e 70 4e 65 78 74 3d 3d 30 20 29  pRow->pNext==0 )
c880: 7b 0a 20 20 20 20 20 20 20 20 65 71 70 5f 72 65  {.        eqp_re
c890: 73 65 74 28 70 29 3b 0a 20 20 20 20 20 20 20 20  set(p);.        
c8a0: 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a  return;.      }.
c8b0: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
c8c0: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22  f(p->out, "%s\n"
c8d0: 2c 20 70 52 6f 77 2d 3e 7a 54 65 78 74 2b 33 29  , pRow->zText+3)
c8e0: 3b 0a 20 20 20 20 20 20 70 2d 3e 73 47 72 61 70  ;.      p->sGrap
c8f0: 68 2e 70 52 6f 77 20 3d 20 70 52 6f 77 2d 3e 70  h.pRow = pRow->p
c900: 4e 65 78 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Next;.      sqli
c910: 74 65 33 5f 66 72 65 65 28 70 52 6f 77 29 3b 0a  te3_free(pRow);.
c920: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c930: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
c940: 6f 75 74 2c 20 22 51 55 45 52 59 20 50 4c 41 4e  out, "QUERY PLAN
c950: 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  \n");.    }.    
c960: 70 2d 3e 73 47 72 61 70 68 2e 7a 50 72 65 66 69  p->sGraph.zPrefi
c970: 78 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 65 71  x[0] = 0;.    eq
c980: 70 5f 72 65 6e 64 65 72 5f 6c 65 76 65 6c 28 70  p_render_level(p
c990: 2c 20 30 29 3b 0a 20 20 20 20 65 71 70 5f 72 65  , 0);.    eqp_re
c9a0: 73 65 74 28 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 23  set(p);.  }.}..#
c9b0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
c9c0: 49 54 5f 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c  IT_PROGRESS_CALL
c9d0: 42 41 43 4b 0a 2f 2a 0a 2a 2a 20 50 72 6f 67 72  BACK./*.** Progr
c9e0: 65 73 73 20 68 61 6e 64 6c 65 72 20 63 61 6c 6c  ess handler call
c9f0: 62 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  back..*/.static 
ca00: 69 6e 74 20 70 72 6f 67 72 65 73 73 5f 68 61 6e  int progress_han
ca10: 64 6c 65 72 28 76 6f 69 64 20 2a 70 43 6c 69 65  dler(void *pClie
ca20: 6e 74 44 61 74 61 29 20 7b 0a 20 20 53 68 65 6c  ntData) {.  Shel
ca30: 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65  lState *p = (She
ca40: 6c 6c 53 74 61 74 65 2a 29 70 43 6c 69 65 6e 74  llState*)pClient
ca50: 44 61 74 61 3b 0a 20 20 70 2d 3e 6e 50 72 6f 67  Data;.  p->nProg
ca60: 72 65 73 73 2b 2b 3b 0a 20 20 69 66 28 20 70 2d  ress++;.  if( p-
ca70: 3e 6e 50 72 6f 67 72 65 73 73 3e 3d 70 2d 3e 6d  >nProgress>=p->m
ca80: 78 50 72 6f 67 72 65 73 73 20 26 26 20 70 2d 3e  xProgress && p->
ca90: 6d 78 50 72 6f 67 72 65 73 73 3e 30 20 29 7b 0a  mxProgress>0 ){.
caa0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
cab0: 2d 3e 6f 75 74 2c 20 22 50 72 6f 67 72 65 73 73  ->out, "Progress
cac0: 20 6c 69 6d 69 74 20 72 65 61 63 68 65 64 20 28   limit reached (
cad0: 25 75 29 5c 6e 22 2c 20 70 2d 3e 6e 50 72 6f 67  %u)\n", p->nProg
cae0: 72 65 73 73 29 3b 0a 20 20 20 20 69 66 28 20 70  ress);.    if( p
caf0: 2d 3e 66 6c 67 50 72 6f 67 72 65 73 73 20 26 20  ->flgProgress & 
cb00: 53 48 45 4c 4c 5f 50 52 4f 47 52 45 53 53 5f 52  SHELL_PROGRESS_R
cb10: 45 53 45 54 20 29 20 70 2d 3e 6e 50 72 6f 67 72  ESET ) p->nProgr
cb20: 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ess = 0;.    if(
cb30: 20 70 2d 3e 66 6c 67 50 72 6f 67 72 65 73 73 20   p->flgProgress 
cb40: 26 20 53 48 45 4c 4c 5f 50 52 4f 47 52 45 53 53  & SHELL_PROGRESS
cb50: 5f 4f 4e 43 45 20 29 20 70 2d 3e 6d 78 50 72 6f  _ONCE ) p->mxPro
cb60: 67 72 65 73 73 20 3d 20 30 3b 0a 20 20 20 20 72  gress = 0;.    r
cb70: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
cb80: 66 28 20 28 70 2d 3e 66 6c 67 50 72 6f 67 72 65  f( (p->flgProgre
cb90: 73 73 20 26 20 53 48 45 4c 4c 5f 50 52 4f 47 52  ss & SHELL_PROGR
cba0: 45 53 53 5f 51 55 49 45 54 29 3d 3d 30 20 29 7b  ESS_QUIET)==0 ){
cbb0: 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
cbc0: 70 2d 3e 6f 75 74 2c 20 22 50 72 6f 67 72 65 73  p->out, "Progres
cbd0: 73 20 25 75 5c 6e 22 2c 20 70 2d 3e 6e 50 72 6f  s %u\n", p->nPro
cbe0: 67 72 65 73 73 29 3b 0a 20 20 7d 0a 20 20 72 65  gress);.  }.  re
cbf0: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
cc00: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
cc10: 50 52 4f 47 52 45 53 53 5f 43 41 4c 4c 42 41 43  PROGRESS_CALLBAC
cc20: 4b 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  K */../*.** This
cc30: 20 69 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b   is the callback
cc40: 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 74 68   routine that th
cc50: 65 20 73 68 65 6c 6c 0a 2a 2a 20 69 6e 76 6f 6b  e shell.** invok
cc60: 65 73 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20  es for each row 
cc70: 6f 66 20 61 20 71 75 65 72 79 20 72 65 73 75 6c  of a query resul
cc80: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
cc90: 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28   shell_callback(
cca0: 0a 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20  .  void *pArg,. 
ccb0: 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20   int nArg,      
ccc0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72    /* Number of r
ccd0: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f  esult columns */
cce0: 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c  .  char **azArg,
ccf0: 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65      /* Text of e
cd00: 61 63 68 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d  ach result colum
cd10: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a  n */.  char **az
cd20: 43 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d  Col,    /* Colum
cd30: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74  n names */.  int
cd40: 20 2a 61 69 54 79 70 65 20 20 20 20 20 20 2f 2a   *aiType      /*
cd50: 20 43 6f 6c 75 6d 6e 20 74 79 70 65 73 20 2a 2f   Column types */
cd60: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53  .){.  int i;.  S
cd70: 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28  hellState *p = (
cd80: 53 68 65 6c 6c 53 74 61 74 65 2a 29 70 41 72 67  ShellState*)pArg
cd90: 3b 0a 0a 20 20 69 66 28 20 61 7a 41 72 67 3d 3d  ;..  if( azArg==
cda0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
cdb0: 73 77 69 74 63 68 28 20 70 2d 3e 63 4d 6f 64 65  switch( p->cMode
cdc0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 4d 4f 44   ){.    case MOD
cdd0: 45 5f 4c 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20  E_Line: {.      
cde0: 69 6e 74 20 77 20 3d 20 35 3b 0a 20 20 20 20 20  int w = 5;.     
cdf0: 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20   if( azArg==0 ) 
ce00: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72  break;.      for
ce10: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
ce20: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
ce30: 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61  len = strlen30(a
ce40: 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b  zCol[i] ? azCol[
ce50: 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20  i] : "");.      
ce60: 20 20 69 66 28 20 6c 65 6e 3e 77 20 29 20 77 20    if( len>w ) w 
ce70: 3d 20 6c 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  = len;.      }. 
ce80: 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b       if( p->cnt+
ce90: 2b 3e 30 20 29 20 75 74 66 38 5f 70 72 69 6e 74  +>0 ) utf8_print
cea0: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
ceb0: 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
cec0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
ced0: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
cee0: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
cef0: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 2a 73 20 3d  tf(p->out,"%*s =
cf00: 20 25 73 25 73 22 2c 20 77 2c 20 61 7a 43 6f 6c   %s%s", w, azCol
cf10: 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [i],.           
cf20: 20 20 20 20 20 61 7a 41 72 67 5b 69 5d 20 3f 20       azArg[i] ? 
cf30: 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75  azArg[i] : p->nu
cf40: 6c 6c 56 61 6c 75 65 2c 20 70 2d 3e 72 6f 77 53  llValue, p->rowS
cf50: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
cf60: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
cf70: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d      }.    case M
cf80: 4f 44 45 5f 45 78 70 6c 61 69 6e 3a 0a 20 20 20  ODE_Explain:.   
cf90: 20 63 61 73 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d   case MODE_Colum
cfa0: 6e 3a 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69  n: {.      stati
cfb0: 63 20 63 6f 6e 73 74 20 69 6e 74 20 61 45 78 70  c const int aExp
cfc0: 6c 61 69 6e 57 69 64 74 68 73 5b 5d 20 3d 20 7b  lainWidths[] = {
cfd0: 34 2c 20 31 33 2c 20 34 2c 20 34 2c 20 34 2c 20  4, 13, 4, 4, 4, 
cfe0: 31 33 2c 20 32 2c 20 31 33 7d 3b 0a 20 20 20 20  13, 2, 13};.    
cff0: 20 20 63 6f 6e 73 74 20 69 6e 74 20 2a 63 6f 6c    const int *col
d000: 57 69 64 74 68 3b 0a 20 20 20 20 20 20 69 6e 74  Width;.      int
d010: 20 73 68 6f 77 48 64 72 3b 0a 20 20 20 20 20 20   showHdr;.      
d020: 63 68 61 72 20 2a 72 6f 77 53 65 70 3b 0a 20 20  char *rowSep;.  
d030: 20 20 20 20 69 66 28 20 70 2d 3e 63 4d 6f 64 65      if( p->cMode
d040: 3d 3d 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 20 29 7b  ==MODE_Column ){
d050: 0a 20 20 20 20 20 20 20 20 63 6f 6c 57 69 64 74  .        colWidt
d060: 68 20 3d 20 70 2d 3e 63 6f 6c 57 69 64 74 68 3b  h = p->colWidth;
d070: 0a 20 20 20 20 20 20 20 20 73 68 6f 77 48 64 72  .        showHdr
d080: 20 3d 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72   = p->showHeader
d090: 3b 0a 20 20 20 20 20 20 20 20 72 6f 77 53 65 70  ;.        rowSep
d0a0: 20 3d 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74   = p->rowSeparat
d0b0: 6f 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  or;.      }else{
d0c0: 0a 20 20 20 20 20 20 20 20 63 6f 6c 57 69 64 74  .        colWidt
d0d0: 68 20 3d 20 61 45 78 70 6c 61 69 6e 57 69 64 74  h = aExplainWidt
d0e0: 68 73 3b 0a 20 20 20 20 20 20 20 20 73 68 6f 77  hs;.        show
d0f0: 48 64 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Hdr = 1;.       
d100: 20 72 6f 77 53 65 70 20 3d 20 53 45 50 5f 52 6f   rowSep = SEP_Ro
d110: 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  w;.      }.     
d120: 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30   if( p->cnt++==0
d130: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
d140: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
d150: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
d160: 20 77 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20   w, n;.         
d170: 20 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65   if( i<ArraySize
d180: 28 70 2d 3e 63 6f 6c 57 69 64 74 68 29 20 29 7b  (p->colWidth) ){
d190: 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d  .            w =
d1a0: 20 63 6f 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20   colWidth[i];.  
d1b0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
d1c0: 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 30             w = 0
d1d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
d1e0: 20 20 20 20 20 20 20 20 69 66 28 20 77 3d 3d 30          if( w==0
d1f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
d200: 77 20 3d 20 73 74 72 6c 65 6e 43 68 61 72 28 61  w = strlenChar(a
d210: 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b  zCol[i] ? azCol[
d220: 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20  i] : "");.      
d230: 20 20 20 20 20 20 69 66 28 20 77 3c 31 30 20 29        if( w<10 )
d240: 20 77 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20   w = 10;.       
d250: 20 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 43       n = strlenC
d260: 68 61 72 28 61 7a 41 72 67 20 26 26 20 61 7a 41  har(azArg && azA
d270: 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d  rg[i] ? azArg[i]
d280: 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29   : p->nullValue)
d290: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
d2a0: 28 20 77 3c 6e 20 29 20 77 20 3d 20 6e 3b 0a 20  ( w<n ) w = n;. 
d2b0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
d2c0: 20 20 20 20 20 69 66 28 20 69 3c 41 72 72 61 79       if( i<Array
d2d0: 53 69 7a 65 28 70 2d 3e 61 63 74 75 61 6c 57 69  Size(p->actualWi
d2e0: 64 74 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20  dth) ){.        
d2f0: 20 20 20 20 70 2d 3e 61 63 74 75 61 6c 57 69 64      p->actualWid
d300: 74 68 5b 69 5d 20 3d 20 77 3b 0a 20 20 20 20 20  th[i] = w;.     
d310: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
d320: 20 69 66 28 20 73 68 6f 77 48 64 72 20 29 7b 0a   if( showHdr ){.
d330: 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38              utf8
d340: 5f 77 69 64 74 68 5f 70 72 69 6e 74 28 70 2d 3e  _width_print(p->
d350: 6f 75 74 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69 5d  out, w, azCol[i]
d360: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  );.            u
d370: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
d380: 74 2c 20 22 25 73 22 2c 20 69 3d 3d 6e 41 72 67  t, "%s", i==nArg
d390: 2d 31 20 3f 20 72 6f 77 53 65 70 20 3a 20 22 20  -1 ? rowSep : " 
d3a0: 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   ");.          }
d3b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d3c0: 20 20 20 69 66 28 20 73 68 6f 77 48 64 72 20 29     if( showHdr )
d3d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  {.          for(
d3e0: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
d3f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
d400: 6e 74 20 77 3b 0a 20 20 20 20 20 20 20 20 20 20  nt w;.          
d410: 20 20 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a    if( i<ArraySiz
d420: 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68  e(p->actualWidth
d430: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
d440: 20 20 20 20 77 20 3d 20 70 2d 3e 61 63 74 75 61      w = p->actua
d450: 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20  lWidth[i];.     
d460: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 77 3c            if( w<
d470: 30 20 29 20 77 20 3d 20 2d 77 3b 0a 20 20 20 20  0 ) w = -w;.    
d480: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
d490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77 20                w 
d4a0: 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20  = 10;.          
d4b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
d4c0: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
d4d0: 75 74 2c 22 25 2d 2a 2e 2a 73 25 73 22 2c 77 2c  ut,"%-*.*s%s",w,
d4e0: 77 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  w,.             
d4f0: 20 20 20 20 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d        "---------
d500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d510: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d520: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
d530: 2d 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  -".             
d540: 20 20 20 20 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d        "---------
d550: 2d 2d 2d 2d 2d 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 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  -",.            
d590: 20 20 20 20 20 20 20 20 69 3d 3d 6e 41 72 67 2d          i==nArg-
d5a0: 31 20 3f 20 72 6f 77 53 65 70 20 3a 20 22 20 20  1 ? rowSep : "  
d5b0: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ");.          }.
d5c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d5d0: 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72  }.      if( azAr
d5e0: 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  g==0 ) break;.  
d5f0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
d600: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
d610: 20 20 20 69 6e 74 20 77 3b 0a 20 20 20 20 20 20     int w;.      
d620: 20 20 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a    if( i<ArraySiz
d630: 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68  e(p->actualWidth
d640: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
d650: 77 20 3d 20 70 2d 3e 61 63 74 75 61 6c 57 69 64  w = p->actualWid
d660: 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d  th[i];.        }
d670: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
d680: 20 77 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20   w = 10;.       
d690: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
d6a0: 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78  ->cMode==MODE_Ex
d6b0: 70 6c 61 69 6e 20 26 26 20 61 7a 41 72 67 5b 69  plain && azArg[i
d6c0: 5d 20 26 26 20 73 74 72 6c 65 6e 43 68 61 72 28  ] && strlenChar(
d6d0: 61 7a 41 72 67 5b 69 5d 29 3e 77 20 29 7b 0a 20  azArg[i])>w ){. 
d6e0: 20 20 20 20 20 20 20 20 20 77 20 3d 20 73 74 72           w = str
d6f0: 6c 65 6e 43 68 61 72 28 61 7a 41 72 67 5b 69 5d  lenChar(azArg[i]
d700: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
d710: 20 20 20 20 20 69 66 28 20 69 3d 3d 31 20 26 26       if( i==1 &&
d720: 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20 26 26 20   p->aiIndent && 
d730: 70 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  p->pStmt ){.    
d740: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 69 49 6e        if( p->iIn
d750: 64 65 6e 74 3c 70 2d 3e 6e 49 6e 64 65 6e 74 20  dent<p->nIndent 
d760: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  ){.            u
d770: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
d780: 74 2c 20 22 25 2a 2e 73 22 2c 20 70 2d 3e 61 69  t, "%*.s", p->ai
d790: 49 6e 64 65 6e 74 5b 70 2d 3e 69 49 6e 64 65 6e  Indent[p->iInden
d7a0: 74 5d 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 20  t], "");.       
d7b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
d7c0: 2d 3e 69 49 6e 64 65 6e 74 2b 2b 3b 0a 20 20 20  ->iIndent++;.   
d7d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75       }.        u
d7e0: 74 66 38 5f 77 69 64 74 68 5f 70 72 69 6e 74 28  tf8_width_print(
d7f0: 70 2d 3e 6f 75 74 2c 20 77 2c 20 61 7a 41 72 67  p->out, w, azArg
d800: 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a  [i] ? azArg[i] :
d810: 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a   p->nullValue);.
d820: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
d830: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
d840: 2c 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f  , i==nArg-1 ? ro
d850: 77 53 65 70 20 3a 20 22 20 20 22 29 3b 0a 20 20  wSep : "  ");.  
d860: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
d870: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
d880: 65 20 4d 4f 44 45 5f 53 65 6d 69 3a 20 7b 20 20  e MODE_Semi: {  
d890: 20 2f 2a 20 2e 73 63 68 65 6d 61 20 61 6e 64 20   /* .schema and 
d8a0: 2e 66 75 6c 6c 73 63 68 65 6d 61 20 6f 75 74 70  .fullschema outp
d8b0: 75 74 20 2a 2f 0a 20 20 20 20 20 20 70 72 69 6e  ut */.      prin
d8c0: 74 53 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f  tSchemaLine(p->o
d8d0: 75 74 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 22 3b  ut, azArg[0], ";
d8e0: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61  \n");.      brea
d8f0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
d900: 65 20 4d 4f 44 45 5f 50 72 65 74 74 79 3a 20 7b  e MODE_Pretty: {
d910: 20 20 2f 2a 20 2e 73 63 68 65 6d 61 20 61 6e 64    /* .schema and
d920: 20 2e 66 75 6c 6c 73 63 68 65 6d 61 20 77 69 74   .fullschema wit
d930: 68 20 2d 2d 69 6e 64 65 6e 74 20 2a 2f 0a 20 20  h --indent */.  
d940: 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20      char *z;.   
d950: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
d960: 69 6e 74 20 6e 50 61 72 65 6e 20 3d 20 30 3b 0a  int nParen = 0;.
d970: 20 20 20 20 20 20 63 68 61 72 20 63 45 6e 64 20        char cEnd 
d980: 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20  = 0;.      char 
d990: 63 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69  c;.      int nLi
d9a0: 6e 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73  ne = 0;.      as
d9b0: 73 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b  sert( nArg==1 );
d9c0: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
d9d0: 5b 30 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  [0]==0 ) break;.
d9e0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
d9f0: 33 5f 73 74 72 6c 69 6b 65 28 22 43 52 45 41 54  3_strlike("CREAT
da00: 45 20 56 49 45 57 25 22 2c 20 61 7a 41 72 67 5b  E VIEW%", azArg[
da10: 30 5d 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20  0], 0)==0.      
da20: 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 6c   || sqlite3_strl
da30: 69 6b 65 28 22 43 52 45 41 54 45 20 54 52 49 47  ike("CREATE TRIG
da40: 25 22 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 30 29  %", azArg[0], 0)
da50: 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ==0.      ){.   
da60: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
da70: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 3b 5c 6e 22  (p->out, "%s;\n"
da80: 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20  , azArg[0]);.   
da90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
daa0: 20 20 7d 0a 20 20 20 20 20 20 7a 20 3d 20 73 71    }.      z = sq
dab0: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
dac0: 73 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20  s", azArg[0]);. 
dad0: 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20       j = 0;.    
dae0: 20 20 66 6f 72 28 69 3d 30 3b 20 49 73 53 70 61    for(i=0; IsSpa
daf0: 63 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d  ce(z[i]); i++){}
db00: 0a 20 20 20 20 20 20 66 6f 72 28 3b 20 28 63 20  .      for(; (c 
db10: 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29  = z[i])!=0; i++)
db20: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73  {.        if( Is
db30: 53 70 61 63 65 28 63 29 20 29 7b 0a 20 20 20 20  Space(c) ){.    
db40: 20 20 20 20 20 20 69 66 28 20 7a 5b 6a 2d 31 5d        if( z[j-1]
db50: 3d 3d 27 5c 72 27 20 29 20 7a 5b 6a 2d 31 5d 20  =='\r' ) z[j-1] 
db60: 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20  = '\n';.        
db70: 20 20 69 66 28 20 49 73 53 70 61 63 65 28 7a 5b    if( IsSpace(z[
db80: 6a 2d 31 5d 29 20 7c 7c 20 7a 5b 6a 2d 31 5d 3d  j-1]) || z[j-1]=
db90: 3d 27 28 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b  ='(' ) continue;
dba0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
dbb0: 66 28 20 28 63 3d 3d 27 28 27 20 7c 7c 20 63 3d  f( (c=='(' || c=
dbc0: 3d 27 29 27 29 20 26 26 20 6a 3e 30 20 26 26 20  =')') && j>0 && 
dbd0: 49 73 53 70 61 63 65 28 7a 5b 6a 2d 31 5d 29 20  IsSpace(z[j-1]) 
dbe0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 2d 2d  ){.          j--
dbf0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
dc00: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a      z[j++] = c;.
dc10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68        }.      wh
dc20: 69 6c 65 28 20 6a 3e 30 20 26 26 20 49 73 53 70  ile( j>0 && IsSp
dc30: 61 63 65 28 7a 5b 6a 2d 31 5d 29 20 29 7b 20 6a  ace(z[j-1]) ){ j
dc40: 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 7a 5b 6a 5d  --; }.      z[j]
dc50: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20   = 0;.      if( 
dc60: 73 74 72 6c 65 6e 33 30 28 7a 29 3e 3d 37 39 20  strlen30(z)>=79 
dc70: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
dc80: 3d 6a 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29  =j=0; (c = z[i])
dc90: 21 3d 30 3b 20 69 2b 2b 29 7b 20 20 2f 2a 20 43  !=0; i++){  /* C
dca0: 6f 70 79 20 63 68 61 6e 67 65 73 20 66 72 6f 6d  opy changes from
dcb0: 20 7a 5b 69 5d 20 62 61 63 6b 20 74 6f 20 7a 5b   z[i] back to z[
dcc0: 6a 5d 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  j] */.          
dcd0: 69 66 28 20 63 3d 3d 63 45 6e 64 20 29 7b 0a 20  if( c==cEnd ){. 
dce0: 20 20 20 20 20 20 20 20 20 20 20 63 45 6e 64 20             cEnd 
dcf0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 0;.          }
dd00: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 22 27 20  else if( c=='"' 
dd10: 7c 7c 20 63 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d  || c=='\'' || c=
dd20: 3d 27 60 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='`' ){.        
dd30: 20 20 20 20 63 45 6e 64 20 3d 20 63 3b 0a 20 20      cEnd = c;.  
dd40: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
dd50: 28 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20  ( c=='[' ){.    
dd60: 20 20 20 20 20 20 20 20 63 45 6e 64 20 3d 20 27          cEnd = '
dd70: 5d 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ]';.          }e
dd80: 6c 73 65 20 69 66 28 20 63 3d 3d 27 2d 27 20 26  lse if( c=='-' &
dd90: 26 20 7a 5b 69 2b 31 5d 3d 3d 27 2d 27 20 29 7b  & z[i+1]=='-' ){
dda0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 45 6e  .            cEn
ddb0: 64 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20  d = '\n';.      
ddc0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
ddd0: 3d 27 28 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='(' ){.        
dde0: 20 20 20 20 6e 50 61 72 65 6e 2b 2b 3b 0a 20 20      nParen++;.  
ddf0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
de00: 28 20 63 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20  ( c==')' ){.    
de10: 20 20 20 20 20 20 20 20 6e 50 61 72 65 6e 2d 2d          nParen--
de20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
de30: 28 20 6e 4c 69 6e 65 3e 30 20 26 26 20 6e 50 61  ( nLine>0 && nPa
de40: 72 65 6e 3d 3d 30 20 26 26 20 6a 3e 30 20 29 7b  ren==0 && j>0 ){
de50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
de60: 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28  rintSchemaLineN(
de70: 70 2d 3e 6f 75 74 2c 20 7a 2c 20 6a 2c 20 22 5c  p->out, z, j, "\
de80: 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  n");.           
de90: 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20     j = 0;.      
dea0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
deb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 5b    }.          z[
dec0: 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20  j++] = c;.      
ded0: 20 20 20 20 69 66 28 20 6e 50 61 72 65 6e 3d 3d      if( nParen==
dee0: 31 20 26 26 20 63 45 6e 64 3d 3d 30 0a 20 20 20  1 && cEnd==0.   
def0: 20 20 20 20 20 20 20 20 26 26 20 28 63 3d 3d 27          && (c=='
df00: 28 27 20 7c 7c 20 63 3d 3d 27 5c 6e 27 20 7c 7c  (' || c=='\n' ||
df10: 20 28 63 3d 3d 27 2c 27 20 26 26 20 21 77 73 54   (c==',' && !wsT
df20: 6f 45 6f 6c 28 7a 2b 69 2b 31 29 29 29 0a 20 20  oEol(z+i+1))).  
df30: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
df40: 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c         if( c=='\
df50: 6e 27 20 29 20 6a 2d 2d 3b 0a 20 20 20 20 20 20  n' ) j--;.      
df60: 20 20 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d        printSchem
df70: 61 4c 69 6e 65 4e 28 70 2d 3e 6f 75 74 2c 20 7a  aLineN(p->out, z
df80: 2c 20 6a 2c 20 22 5c 6e 20 20 22 29 3b 0a 20 20  , j, "\n  ");.  
df90: 20 20 20 20 20 20 20 20 20 20 6a 20 3d 20 30 3b            j = 0;
dfa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c 69  .            nLi
dfb0: 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  ne++;.          
dfc0: 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65    while( IsSpace
dfd0: 28 7a 5b 69 2b 31 5d 29 20 29 7b 20 69 2b 2b 3b  (z[i+1]) ){ i++;
dfe0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
dff0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
e000: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20   z[j] = 0;.     
e010: 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 53 63   }.      printSc
e020: 68 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c  hemaLine(p->out,
e030: 20 7a 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20   z, ";\n");.    
e040: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
e050: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
e060: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d      }.    case M
e070: 4f 44 45 5f 4c 69 73 74 3a 20 7b 0a 20 20 20 20  ODE_List: {.    
e080: 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d    if( p->cnt++==
e090: 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64  0 && p->showHead
e0a0: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  er ){.        fo
e0b0: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
e0c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  ++){.          u
e0d0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
e0e0: 74 2c 22 25 73 25 73 22 2c 61 7a 43 6f 6c 5b 69  t,"%s%s",azCol[i
e0f0: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
e100: 20 20 20 20 20 69 3d 3d 6e 41 72 67 2d 31 20 3f       i==nArg-1 ?
e110: 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
e120: 20 3a 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74   : p->colSeparat
e130: 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  or);.        }. 
e140: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
e150: 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61   azArg==0 ) brea
e160: 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  k;.      for(i=0
e170: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
e180: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20          char *z 
e190: 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20  = azArg[i];.    
e1a0: 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a      if( z==0 ) z
e1b0: 20 3d 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 3b   = p->nullValue;
e1c0: 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
e1d0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
e1e0: 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 69  ", z);.        i
e1f0: 66 28 20 69 3c 6e 41 72 67 2d 31 20 29 7b 0a 20  f( i<nArg-1 ){. 
e200: 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
e210: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
e220: 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  ", p->colSeparat
e230: 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  or);.        }el
e240: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74  se{.          ut
e250: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
e260: 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65  , "%s", p->rowSe
e270: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
e280: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
e290: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
e2a0: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 48 74 6d     case MODE_Htm
e2b0: 6c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  l: {.      if( p
e2c0: 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d  ->cnt++==0 && p-
e2d0: 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20  >showHeader ){. 
e2e0: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
e2f0: 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29  f(p->out,"<TR>")
e300: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
e310: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
e320: 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
e330: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54  rintf(p->out,"<T
e340: 48 3e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  H>");.          
e350: 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69  output_html_stri
e360: 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c  ng(p->out, azCol
e370: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
e380: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
e390: 74 2c 22 3c 2f 54 48 3e 5c 6e 22 29 3b 0a 20 20  t,"</TH>\n");.  
e3a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
e3b0: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
e3c0: 74 2c 22 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20  t,"</TR>\n");.  
e3d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
e3e0: 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b  azArg==0 ) break
e3f0: 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  ;.      raw_prin
e400: 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22  tf(p->out,"<TR>"
e410: 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  );.      for(i=0
e420: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
e430: 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
e440: 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 44 3e 22  tf(p->out,"<TD>"
e450: 29 3b 0a 20 20 20 20 20 20 20 20 6f 75 74 70 75  );.        outpu
e460: 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28 70 2d  t_html_string(p-
e470: 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f  >out, azArg[i] ?
e480: 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e   azArg[i] : p->n
e490: 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  ullValue);.     
e4a0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
e4b0: 3e 6f 75 74 2c 22 3c 2f 54 44 3e 5c 6e 22 29 3b  >out,"</TD>\n");
e4c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
e4d0: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
e4e0: 2c 22 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20  ,"</TR>\n");.   
e4f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
e500: 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 54 63      case MODE_Tc
e510: 6c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  l: {.      if( p
e520: 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d  ->cnt++==0 && p-
e530: 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20  >showHeader ){. 
e540: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
e550: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
e560: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63          output_c
e570: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 61  _string(p->out,a
e580: 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b  zCol[i] ? azCol[
e590: 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20  i] : "");.      
e5a0: 20 20 20 20 69 66 28 69 3c 6e 41 72 67 2d 31 29      if(i<nArg-1)
e5b0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
e5c0: 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f  out, "%s", p->co
e5d0: 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  lSeparator);.   
e5e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75       }.        u
e5f0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
e600: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53  t, "%s", p->rowS
e610: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
e620: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41   }.      if( azA
e630: 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rg==0 ) break;. 
e640: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
e650: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
e660: 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72      output_c_str
e670: 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72  ing(p->out, azAr
e680: 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20  g[i] ? azArg[i] 
e690: 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b  : p->nullValue);
e6a0: 0a 20 20 20 20 20 20 20 20 69 66 28 69 3c 6e 41  .        if(i<nA
e6b0: 72 67 2d 31 29 20 75 74 66 38 5f 70 72 69 6e 74  rg-1) utf8_print
e6c0: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
e6d0: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
e6e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e6f0: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
e700: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77  ut, "%s", p->row
e710: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
e720: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
e730: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 43 73 76     case MODE_Csv
e740: 3a 20 7b 0a 20 20 20 20 20 20 73 65 74 42 69 6e  : {.      setBin
e750: 61 72 79 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20  aryMode(p->out, 
e760: 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  1);.      if( p-
e770: 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e  >cnt++==0 && p->
e780: 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20  showHeader ){.  
e790: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
e7a0: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
e7b0: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 73         output_cs
e7c0: 76 28 70 2c 20 61 7a 43 6f 6c 5b 69 5d 20 3f 20  v(p, azCol[i] ? 
e7d0: 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 2c 20 69  azCol[i] : "", i
e7e0: 3c 6e 41 72 67 2d 31 29 3b 0a 20 20 20 20 20 20  <nArg-1);.      
e7f0: 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38    }.        utf8
e800: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
e810: 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61  "%s", p->rowSepa
e820: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  rator);.      }.
e830: 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3e 30        if( nArg>0
e840: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
e850: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
e860: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74  ){.          out
e870: 70 75 74 5f 63 73 76 28 70 2c 20 61 7a 41 72 67  put_csv(p, azArg
e880: 5b 69 5d 2c 20 69 3c 6e 41 72 67 2d 31 29 3b 0a  [i], i<nArg-1);.
e890: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e8a0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
e8b0: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72  >out, "%s", p->r
e8c0: 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  owSeparator);.  
e8d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 65 74 54      }.      setT
e8e0: 65 78 74 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20  extMode(p->out, 
e8f0: 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
e900: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
e910: 4d 4f 44 45 5f 49 6e 73 65 72 74 3a 20 7b 0a 20  MODE_Insert: {. 
e920: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d       if( azArg==
e930: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
e940: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
e950: 6f 75 74 2c 22 49 4e 53 45 52 54 20 49 4e 54 4f  out,"INSERT INTO
e960: 20 25 73 22 2c 70 2d 3e 7a 44 65 73 74 54 61 62   %s",p->zDestTab
e970: 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  le);.      if( p
e980: 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a  ->showHeader ){.
e990: 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
e9a0: 74 66 28 70 2d 3e 6f 75 74 2c 22 28 22 29 3b 0a  tf(p->out,"(");.
e9b0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
e9c0: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
e9d0: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30           if( i>0
e9e0: 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d   ) raw_printf(p-
e9f0: 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20  >out, ",");.    
ea00: 20 20 20 20 20 20 69 66 28 20 71 75 6f 74 65 43        if( quoteC
ea10: 68 61 72 28 61 7a 43 6f 6c 5b 69 5d 29 20 29 7b  har(azCol[i]) ){
ea20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61  .            cha
ea30: 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d  r *z = sqlite3_m
ea40: 70 72 69 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c  printf("\"%w\"",
ea50: 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20   azCol[i]);.    
ea60: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
ea70: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
ea80: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , z);.          
ea90: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
eaa0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
eab0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
eac0: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
ead0: 74 2c 20 22 25 73 22 2c 20 61 7a 43 6f 6c 5b 69  t, "%s", azCol[i
eae0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ]);.          }.
eaf0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
eb00: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
eb10: 6f 75 74 2c 22 29 22 29 3b 0a 20 20 20 20 20 20  out,")");.      
eb20: 7d 0a 20 20 20 20 20 20 70 2d 3e 63 6e 74 2b 2b  }.      p->cnt++
eb30: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
eb40: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
eb50: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
eb60: 66 28 70 2d 3e 6f 75 74 2c 20 69 3e 30 20 3f 20  f(p->out, i>0 ? 
eb70: 22 2c 22 20 3a 20 22 20 56 41 4c 55 45 53 28 22  "," : " VALUES("
eb80: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
eb90: 61 7a 41 72 67 5b 69 5d 3d 3d 30 29 20 7c 7c 20  azArg[i]==0) || 
eba0: 28 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70  (aiType && aiTyp
ebb0: 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  e[i]==SQLITE_NUL
ebc0: 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  L) ){.          
ebd0: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
ebe0: 75 74 2c 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20  ut,"NULL");.    
ebf0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69      }else if( ai
ec00: 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69  Type && aiType[i
ec10: 5d 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29  ]==SQLITE_TEXT )
ec20: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
ec30: 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20  ShellHasFlag(p, 
ec40: 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29 20  SHFLG_Newlines) 
ec50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  ){.            o
ec60: 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72  utput_quoted_str
ec70: 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72  ing(p->out, azAr
ec80: 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  g[i]);.         
ec90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
eca0: 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65      output_quote
ecb0: 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67  d_escaped_string
ecc0: 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69  (p->out, azArg[i
ecd0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ]);.          }.
ece0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
ecf0: 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79  ( aiType && aiTy
ed00: 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e  pe[i]==SQLITE_IN
ed10: 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20  TEGER ){.       
ed20: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
ed30: 2d 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72  ->out,"%s", azAr
ed40: 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  g[i]);.        }
ed50: 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20  else if( aiType 
ed60: 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51  && aiType[i]==SQ
ed70: 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20  LITE_FLOAT ){.  
ed80: 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 5b 35          char z[5
ed90: 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 6f  0];.          do
eda0: 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33  uble r = sqlite3
edb0: 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70  _column_double(p
edc0: 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  ->pStmt, i);.   
edd0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 75         sqlite3_u
ede0: 69 6e 74 36 34 20 75 72 3b 0a 20 20 20 20 20 20  int64 ur;.      
edf0: 20 20 20 20 6d 65 6d 63 70 79 28 26 75 72 2c 26      memcpy(&ur,&
ee00: 72 2c 73 69 7a 65 6f 66 28 72 29 29 3b 0a 20 20  r,sizeof(r));.  
ee10: 20 20 20 20 20 20 20 20 69 66 28 20 75 72 3d 3d          if( ur==
ee20: 30 78 37 66 66 30 30 30 30 30 30 30 30 30 30 30  0x7ff00000000000
ee30: 30 30 4c 4c 20 29 7b 0a 20 20 20 20 20 20 20 20  00LL ){.        
ee40: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
ee50: 2d 3e 6f 75 74 2c 20 22 31 65 39 39 39 22 29 3b  ->out, "1e999");
ee60: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
ee70: 20 69 66 28 20 75 72 3d 3d 30 78 66 66 66 30 30   if( ur==0xfff00
ee80: 30 30 30 30 30 30 30 30 30 30 30 4c 4c 20 29 7b  00000000000LL ){
ee90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 61 77  .            raw
eea0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
eeb0: 22 2d 31 65 39 39 39 22 29 3b 0a 20 20 20 20 20  "-1e999");.     
eec0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
eed0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
eee0: 73 6e 70 72 69 6e 74 66 28 35 30 2c 7a 2c 22 25  snprintf(50,z,"%
eef0: 21 2e 32 30 67 22 2c 20 72 29 3b 0a 20 20 20 20  !.20g", r);.    
ef00: 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
ef10: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
ef20: 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d   z);.          }
ef30: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
ef40: 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54  f( aiType && aiT
ef50: 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 42  ype[i]==SQLITE_B
ef60: 4c 4f 42 20 26 26 20 70 2d 3e 70 53 74 6d 74 20  LOB && p->pStmt 
ef70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  ){.          con
ef80: 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62 20 3d  st void *pBlob =
ef90: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
efa0: 62 6c 6f 62 28 70 2d 3e 70 53 74 6d 74 2c 20 69  blob(p->pStmt, i
efb0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
efc0: 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   nBlob = sqlite3
efd0: 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 2d  _column_bytes(p-
efe0: 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  >pStmt, i);.    
eff0: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68 65 78        output_hex
f000: 5f 62 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20 70 42  _blob(p->out, pB
f010: 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 20  lob, nBlob);.   
f020: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
f030: 73 4e 75 6d 62 65 72 28 61 7a 41 72 67 5b 69 5d  sNumber(azArg[i]
f040: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
f050: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
f060: 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67  >out,"%s", azArg
f070: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  [i]);.        }e
f080: 6c 73 65 20 69 66 28 20 53 68 65 6c 6c 48 61 73  lse if( ShellHas
f090: 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65  Flag(p, SHFLG_Ne
f0a0: 77 6c 69 6e 65 73 29 20 29 7b 0a 20 20 20 20 20  wlines) ){.     
f0b0: 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74       output_quot
f0c0: 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  ed_string(p->out
f0d0: 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  , azArg[i]);.   
f0e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
f0f0: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f        output_quo
f100: 74 65 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69  ted_escaped_stri
f110: 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67  ng(p->out, azArg
f120: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  [i]);.        }.
f130: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61        }.      ra
f140: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
f150: 22 29 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62  ");\n");.      b
f160: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
f170: 63 61 73 65 20 4d 4f 44 45 5f 51 75 6f 74 65 3a  case MODE_Quote:
f180: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41   {.      if( azA
f190: 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rg==0 ) break;. 
f1a0: 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 3d       if( p->cnt=
f1b0: 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61  =0 && p->showHea
f1c0: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66  der ){.        f
f1d0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
f1e0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
f1f0: 69 66 28 20 69 3e 30 20 29 20 72 61 77 5f 70 72  if( i>0 ) raw_pr
f200: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 22  intf(p->out, ","
f210: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74  );.          out
f220: 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e  put_quoted_strin
f230: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b  g(p->out, azCol[
f240: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
f250: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
f260: 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a  f(p->out,"\n");.
f270: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
f280: 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 66 6f  >cnt++;.      fo
f290: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
f2a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
f2b0: 20 69 3e 30 20 29 20 72 61 77 5f 70 72 69 6e 74   i>0 ) raw_print
f2c0: 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a  f(p->out, ",");.
f2d0: 20 20 20 20 20 20 20 20 69 66 28 20 28 61 7a 41          if( (azA
f2e0: 72 67 5b 69 5d 3d 3d 30 29 20 7c 7c 20 28 61 69  rg[i]==0) || (ai
f2f0: 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69  Type && aiType[i
f300: 5d 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20  ]==SQLITE_NULL) 
f310: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
f320: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
f330: 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 20  "NULL");.       
f340: 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70   }else if( aiTyp
f350: 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d  e && aiType[i]==
f360: 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20  SQLITE_TEXT ){. 
f370: 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f           output_
f380: 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d  quoted_string(p-
f390: 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  >out, azArg[i]);
f3a0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
f3b0: 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54  f( aiType && aiT
f3c0: 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 49  ype[i]==SQLITE_I
f3d0: 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20  NTEGER ){.      
f3e0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
f3f0: 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41  p->out,"%s", azA
f400: 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
f410: 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65  }else if( aiType
f420: 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53   && aiType[i]==S
f430: 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20  QLITE_FLOAT ){. 
f440: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 5b           char z[
f450: 35 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 64  50];.          d
f460: 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65  ouble r = sqlite
f470: 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28  3_column_double(
f480: 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  p->pStmt, i);.  
f490: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
f4a0: 73 6e 70 72 69 6e 74 66 28 35 30 2c 7a 2c 22 25  snprintf(50,z,"%
f4b0: 21 2e 32 30 67 22 2c 20 72 29 3b 0a 20 20 20 20  !.20g", r);.    
f4c0: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
f4d0: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a  (p->out, "%s", z
f4e0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
f4f0: 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61   if( aiType && a
f500: 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45  iType[i]==SQLITE
f510: 5f 42 4c 4f 42 20 26 26 20 70 2d 3e 70 53 74 6d  _BLOB && p->pStm
f520: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  t ){.          c
f530: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62  onst void *pBlob
f540: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
f550: 6e 5f 62 6c 6f 62 28 70 2d 3e 70 53 74 6d 74 2c  n_blob(p->pStmt,
f560: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   i);.          i
f570: 6e 74 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74  nt nBlob = sqlit
f580: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
f590: 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  p->pStmt, i);.  
f5a0: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68          output_h
f5b0: 65 78 5f 62 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20  ex_blob(p->out, 
f5c0: 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20  pBlob, nBlob);. 
f5d0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
f5e0: 20 69 73 4e 75 6d 62 65 72 28 61 7a 41 72 67 5b   isNumber(azArg[
f5f0: 69 5d 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  i], 0) ){.      
f600: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
f610: 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41  p->out,"%s", azA
f620: 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
f630: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
f640: 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73   output_quoted_s
f650: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a  tring(p->out, az
f660: 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[i]);.       
f670: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
f680: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
f690: 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ut,"\n");.      
f6a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
f6b0: 20 63 61 73 65 20 4d 4f 44 45 5f 41 73 63 69 69   case MODE_Ascii
f6c0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  : {.      if( p-
f6d0: 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e  >cnt++==0 && p->
f6e0: 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20  showHeader ){.  
f6f0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
f700: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
f710: 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29         if( i>0 )
f720: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
f730: 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f  out, "%s", p->co
f740: 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  lSeparator);.   
f750: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
f760: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 61  tf(p->out,"%s",a
f770: 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b  zCol[i] ? azCol[
f780: 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20  i] : "");.      
f790: 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38    }.        utf8
f7a0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
f7b0: 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61  "%s", p->rowSepa
f7c0: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  rator);.      }.
f7d0: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d        if( azArg=
f7e0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
f7f0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
f800: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
f810: 20 69 66 28 20 69 3e 30 20 29 20 75 74 66 38 5f   if( i>0 ) utf8_
f820: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
f830: 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  %s", p->colSepar
f840: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 75  ator);.        u
f850: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
f860: 74 2c 22 25 73 22 2c 61 7a 41 72 67 5b 69 5d 20  t,"%s",azArg[i] 
f870: 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e  ? azArg[i] : p->
f880: 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20  nullValue);.    
f890: 20 20 7d 0a 20 20 20 20 20 20 75 74 66 38 5f 70    }.      utf8_p
f8a0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
f8b0: 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  s", p->rowSepara
f8c0: 74 6f 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61  tor);.      brea
f8d0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
f8e0: 65 20 4d 4f 44 45 5f 45 51 50 3a 20 7b 0a 20 20  e MODE_EQP: {.  
f8f0: 20 20 20 20 65 71 70 5f 61 70 70 65 6e 64 28 70      eqp_append(p
f900: 2c 20 61 74 6f 69 28 61 7a 41 72 67 5b 30 5d 29  , atoi(azArg[0])
f910: 2c 20 61 74 6f 69 28 61 7a 41 72 67 5b 31 5d 29  , atoi(azArg[1])
f920: 2c 20 61 7a 41 72 67 5b 33 5d 29 3b 0a 20 20 20  , azArg[3]);.   
f930: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
f940: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
f950: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
f960: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f   the callback ro
f970: 75 74 69 6e 65 20 74 68 61 74 20 74 68 65 20 53  utine that the S
f980: 51 4c 69 74 65 20 6c 69 62 72 61 72 79 0a 2a 2a  QLite library.**
f990: 20 69 6e 76 6f 6b 65 73 20 66 6f 72 20 65 61 63   invokes for eac
f9a0: 68 20 72 6f 77 20 6f 66 20 61 20 71 75 65 72 79  h row of a query
f9b0: 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74   result..*/.stat
f9c0: 69 63 20 69 6e 74 20 63 61 6c 6c 62 61 63 6b 28  ic int callback(
f9d0: 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20  void *pArg, int 
f9e0: 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41  nArg, char **azA
f9f0: 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c  rg, char **azCol
fa00: 29 7b 0a 20 20 2f 2a 20 73 69 6e 63 65 20 77 65  ){.  /* since we
fa10: 20 64 6f 6e 27 74 20 68 61 76 65 20 74 79 70 65   don't have type
fa20: 20 69 6e 66 6f 2c 20 63 61 6c 6c 20 74 68 65 20   info, call the 
fa30: 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 20 77  shell_callback w
fa40: 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65  ith a NULL value
fa50: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 68 65   */.  return she
fa60: 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28 70 41 72 67  ll_callback(pArg
fa70: 2c 20 6e 41 72 67 2c 20 61 7a 41 72 67 2c 20 61  , nArg, azArg, a
fa80: 7a 43 6f 6c 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a  zCol, NULL);.}..
fa90: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
faa0: 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  e callback routi
fab0: 6e 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ne from sqlite3_
fac0: 65 78 65 63 28 29 20 74 68 61 74 20 61 70 70 65  exec() that appe
fad0: 6e 64 73 20 61 6c 6c 0a 2a 2a 20 6f 75 74 70 75  nds all.** outpu
fae0: 74 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  t onto the end o
faf0: 66 20 61 20 53 68 65 6c 6c 54 65 78 74 20 6f 62  f a ShellText ob
fb00: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ject..*/.static 
fb10: 69 6e 74 20 63 61 70 74 75 72 65 4f 75 74 70 75  int captureOutpu
fb20: 74 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a  tCallback(void *
fb30: 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20  pArg, int nArg, 
fb40: 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68  char **azArg, ch
fb50: 61 72 20 2a 2a 61 7a 29 7b 0a 20 20 53 68 65 6c  ar **az){.  Shel
fb60: 6c 54 65 78 74 20 2a 70 20 3d 20 28 53 68 65 6c  lText *p = (Shel
fb70: 6c 54 65 78 74 2a 29 70 41 72 67 3b 0a 20 20 69  lText*)pArg;.  i
fb80: 6e 74 20 69 3b 0a 20 20 55 4e 55 53 45 44 5f 50  nt i;.  UNUSED_P
fb90: 41 52 41 4d 45 54 45 52 28 61 7a 29 3b 0a 20 20  ARAMETER(az);.  
fba0: 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 72  if( azArg==0 ) r
fbb0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
fbc0: 2d 3e 6e 20 29 20 61 70 70 65 6e 64 54 65 78 74  ->n ) appendText
fbd0: 28 70 2c 20 22 7c 22 2c 20 30 29 3b 0a 20 20 66  (p, "|", 0);.  f
fbe0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
fbf0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 20  i++){.    if( i 
fc00: 29 20 61 70 70 65 6e 64 54 65 78 74 28 70 2c 20  ) appendText(p, 
fc10: 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ",", 0);.    if(
fc20: 20 61 7a 41 72 67 5b 69 5d 20 29 20 61 70 70 65   azArg[i] ) appe
fc30: 6e 64 54 65 78 74 28 70 2c 20 61 7a 41 72 67 5b  ndText(p, azArg[
fc40: 69 5d 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  i], 0);.  }.  re
fc50: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
fc60: 20 47 65 6e 65 72 61 74 65 20 61 6e 20 61 70 70   Generate an app
fc70: 72 6f 70 72 69 61 74 65 20 53 45 4c 46 54 45 53  ropriate SELFTES
fc80: 54 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d  T table in the m
fc90: 61 69 6e 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  ain database..*/
fca0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65  .static void cre
fcb0: 61 74 65 53 65 6c 66 74 65 73 74 54 61 62 6c 65  ateSelftestTable
fcc0: 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b  (ShellState *p){
fcd0: 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  .  char *zErrMsg
fce0: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
fcf0: 65 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20  exec(p->db,.    
fd00: 22 53 41 56 45 50 4f 49 4e 54 20 73 65 6c 66 74  "SAVEPOINT selft
fd10: 65 73 74 5f 69 6e 69 74 3b 5c 6e 22 0a 20 20 20  est_init;\n".   
fd20: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49   "CREATE TABLE I
fd30: 46 20 4e 4f 54 20 45 58 49 53 54 53 20 73 65 6c  F NOT EXISTS sel
fd40: 66 74 65 73 74 28 5c 6e 22 0a 20 20 20 20 22 20  ftest(\n".    " 
fd50: 20 74 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49   tno INTEGER PRI
fd60: 4d 41 52 59 20 4b 45 59 2c 5c 6e 22 20 20 20 2f  MARY KEY,\n"   /
fd70: 2a 20 54 65 73 74 20 6e 75 6d 62 65 72 20 2a 2f  * Test number */
fd80: 0a 20 20 20 20 22 20 20 6f 70 20 54 45 58 54 2c  .    "  op TEXT,
fd90: 5c 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20  \n"             
fda0: 20 20 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f        /* Operato
fdb0: 72 3a 20 20 6d 65 6d 6f 20 72 75 6e 20 2a 2f 0a  r:  memo run */.
fdc0: 20 20 20 20 22 20 20 63 6d 64 20 54 45 58 54 2c      "  cmd TEXT,
fdd0: 5c 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20  \n"             
fde0: 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20       /* Command 
fdf0: 74 65 78 74 20 2a 2f 0a 20 20 20 20 22 20 20 61  text */.    "  a
fe00: 6e 73 20 54 45 58 54 5c 6e 22 20 20 20 20 20 20  ns TEXT\n"      
fe10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
fe20: 44 65 73 69 72 65 64 20 61 6e 73 77 65 72 20 2a  Desired answer *
fe30: 2f 0a 20 20 20 20 22 29 3b 22 0a 20 20 20 20 22  /.    ");".    "
fe40: 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c  CREATE TEMP TABL
fe50: 45 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 28  E [_shell$self](
fe60: 6f 70 2c 63 6d 64 2c 61 6e 73 29 3b 5c 6e 22 0a  op,cmd,ans);\n".
fe70: 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
fe80: 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 28 72   [_shell$self](r
fe90: 6f 77 69 64 2c 6f 70 2c 63 6d 64 29 5c 6e 22 0a  owid,op,cmd)\n".
fea0: 20 20 20 20 22 20 20 56 41 4c 55 45 53 28 63 6f      "  VALUES(co
feb0: 61 6c 65 73 63 65 28 28 53 45 4c 45 43 54 20 28  alesce((SELECT (
fec0: 6d 61 78 28 74 6e 6f 29 2b 31 30 30 29 2f 31 30  max(tno)+100)/10
fed0: 20 46 52 4f 4d 20 73 65 6c 66 74 65 73 74 29 2c   FROM selftest),
fee0: 31 30 29 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20  10),\n".    "   
fef0: 20 20 20 20 20 20 27 6d 65 6d 6f 27 2c 27 54 65        'memo','Te
ff00: 73 74 73 20 67 65 6e 65 72 61 74 65 64 20 62 79  sts generated by
ff10: 20 2d 2d 69 6e 69 74 27 29 3b 5c 6e 22 0a 20 20   --init');\n".  
ff20: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b    "INSERT INTO [
ff30: 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a  _shell$self]\n".
ff40: 20 20 20 20 22 20 20 53 45 4c 45 43 54 20 27 72      "  SELECT 'r
ff50: 75 6e 27 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20  un',\n".    "   
ff60: 20 27 53 45 4c 45 43 54 20 68 65 78 28 73 68 61   'SELECT hex(sha
ff70: 33 5f 71 75 65 72 79 28 27 27 53 45 4c 45 43 54  3_query(''SELECT
ff80: 20 74 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e   type,name,tbl_n
ff90: 61 6d 65 2c 73 71 6c 20 22 0a 20 20 20 20 20 20  ame,sql ".      
ffa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ffb0: 20 20 20 20 20 20 20 20 20 20 20 22 46 52 4f 4d             "FROM
ffc0: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 4f   sqlite_master O
ffd0: 52 44 45 52 20 42 59 20 32 27 27 2c 32 32 34 29  RDER BY 2'',224)
ffe0: 29 27 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20  )',\n".    "    
fff0: 68 65 78 28 73 68 61 33 5f 71 75 65 72 79 28 27  hex(sha3_query('
10000 53 45 4c 45 43 54 20 74 79 70 65 2c 6e 61 6d 65  SELECT type,name
10010 2c 74 62 6c 5f 6e 61 6d 65 2c 73 71 6c 20 22 0a  ,tbl_name,sql ".
10020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10030 20 20 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20            "FROM 
10040 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 4f 52  sqlite_master OR
10050 44 45 52 20 42 59 20 32 27 2c 32 32 34 29 29 3b  DER BY 2',224));
10060 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20  \n".    "INSERT 
10070 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c  INTO [_shell$sel
10080 66 5d 5c 6e 22 0a 20 20 20 20 22 20 20 53 45 4c  f]\n".    "  SEL
10090 45 43 54 20 27 72 75 6e 27 2c 22 0a 20 20 20 20  ECT 'run',".    
100a0 22 20 20 20 20 27 53 45 4c 45 43 54 20 68 65 78  "    'SELECT hex
100b0 28 73 68 61 33 5f 71 75 65 72 79 28 27 27 53 45  (sha3_query(''SE
100c0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 27 20  LECT * FROM \"' 
100d0 7c 7c 22 0a 20 20 20 20 22 20 20 20 20 20 20 20  ||".    "       
100e0 20 70 72 69 6e 74 66 28 27 25 77 27 2c 6e 61 6d   printf('%w',nam
100f0 65 29 20 7c 7c 20 27 5c 22 20 4e 4f 54 20 49 4e  e) || '\" NOT IN
10100 44 45 58 45 44 27 27 2c 32 32 34 29 29 27 2c 5c  DEXED'',224))',\
10110 6e 22 0a 20 20 20 20 22 20 20 20 20 68 65 78 28  n".    "    hex(
10120 73 68 61 33 5f 71 75 65 72 79 28 70 72 69 6e 74  sha3_query(print
10130 66 28 27 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  f('SELECT * FROM
10140 20 5c 22 25 77 5c 22 20 4e 4f 54 20 49 4e 44 45   \"%w\" NOT INDE
10150 58 45 44 27 2c 6e 61 6d 65 29 2c 32 32 34 29 29  XED',name),224))
10160 5c 6e 22 0a 20 20 20 20 22 20 20 46 52 4f 4d 20  \n".    "  FROM 
10170 28 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 53 45  (\n".    "    SE
10180 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73  LECT name FROM s
10190 71 6c 69 74 65 5f 6d 61 73 74 65 72 5c 6e 22 0a  qlite_master\n".
101a0 20 20 20 20 22 20 20 20 20 20 57 48 45 52 45 20      "     WHERE 
101b0 74 79 70 65 3d 27 74 61 62 6c 65 27 5c 6e 22 0a  type='table'\n".
101c0 20 20 20 20 22 20 20 20 20 20 20 20 41 4e 44 20      "       AND 
101d0 6e 61 6d 65 3c 3e 27 73 65 6c 66 74 65 73 74 27  name<>'selftest'
101e0 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20 20  \n".    "       
101f0 41 4e 44 20 63 6f 61 6c 65 73 63 65 28 72 6f 6f  AND coalesce(roo
10200 74 70 61 67 65 2c 30 29 3e 30 5c 6e 22 0a 20 20  tpage,0)>0\n".  
10210 20 20 22 20 20 29 5c 6e 22 0a 20 20 20 20 22 20    "  )\n".    " 
10220 4f 52 44 45 52 20 42 59 20 6e 61 6d 65 3b 5c 6e  ORDER BY name;\n
10230 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e  ".    "INSERT IN
10240 54 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d  TO [_shell$self]
10250 5c 6e 22 0a 20 20 20 20 22 20 20 56 41 4c 55 45  \n".    "  VALUE
10260 53 28 27 72 75 6e 27 2c 27 50 52 41 47 4d 41 20  S('run','PRAGMA 
10270 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 27  integrity_check'
10280 2c 27 6f 6b 27 29 3b 5c 6e 22 0a 20 20 20 20 22  ,'ok');\n".    "
10290 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 65 6c 66  INSERT INTO self
102a0 74 65 73 74 28 74 6e 6f 2c 6f 70 2c 63 6d 64 2c  test(tno,op,cmd,
102b0 61 6e 73 29 22 0a 20 20 20 20 22 20 20 53 45 4c  ans)".    "  SEL
102c0 45 43 54 20 72 6f 77 69 64 2a 31 30 2c 6f 70 2c  ECT rowid*10,op,
102d0 63 6d 64 2c 61 6e 73 20 46 52 4f 4d 20 5b 5f 73  cmd,ans FROM [_s
102e0 68 65 6c 6c 24 73 65 6c 66 5d 3b 5c 6e 22 0a 20  hell$self];\n". 
102f0 20 20 20 22 44 52 4f 50 20 54 41 42 4c 45 20 5b     "DROP TABLE [
10300 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 3b 22 0a 20  _shell$self];". 
10310 20 20 20 2c 30 2c 30 2c 26 7a 45 72 72 4d 73 67     ,0,0,&zErrMsg
10320 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 4d 73 67  );.  if( zErrMsg
10330 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
10340 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 45 4c  ntf(stderr, "SEL
10350 46 54 45 53 54 20 69 6e 69 74 69 61 6c 69 7a 61  FTEST initializa
10360 74 69 6f 6e 20 66 61 69 6c 75 72 65 3a 20 25 73  tion failure: %s
10370 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  \n", zErrMsg);. 
10380 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
10390 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20  zErrMsg);.  }.  
103a0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
103b0 64 62 2c 20 22 52 45 4c 45 41 53 45 20 73 65 6c  db, "RELEASE sel
103c0 66 74 65 73 74 5f 69 6e 69 74 22 2c 30 2c 30 2c  ftest_init",0,0,
103d0 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65  0);.}.../*.** Se
103e0 74 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  t the destinatio
103f0 6e 20 74 61 62 6c 65 20 66 69 65 6c 64 20 6f 66  n table field of
10400 20 74 68 65 20 53 68 65 6c 6c 53 74 61 74 65 20   the ShellState 
10410 73 74 72 75 63 74 75 72 65 20 74 6f 0a 2a 2a 20  structure to.** 
10420 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
10430 74 61 62 6c 65 20 67 69 76 65 6e 2e 20 20 45 73  table given.  Es
10440 63 61 70 65 20 61 6e 79 20 71 75 6f 74 65 20 63  cape any quote c
10450 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
10460 0a 2a 2a 20 74 61 62 6c 65 20 6e 61 6d 65 2e 0a  .** table name..
10470 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
10480 65 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 53 68  et_table_name(Sh
10490 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e  ellState *p, con
104a0 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
104b0 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 63  .  int i, n;.  c
104c0 68 61 72 20 63 51 75 6f 74 65 3b 0a 20 20 63 68  har cQuote;.  ch
104d0 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 2d  ar *z;..  if( p-
104e0 3e 7a 44 65 73 74 54 61 62 6c 65 20 29 7b 0a 20  >zDestTable ){. 
104f0 20 20 20 66 72 65 65 28 70 2d 3e 7a 44 65 73 74     free(p->zDest
10500 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 2d 3e 7a  Table);.    p->z
10510 44 65 73 74 54 61 62 6c 65 20 3d 20 30 3b 0a 20  DestTable = 0;. 
10520 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d   }.  if( zName==
10530 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 63 51  0 ) return;.  cQ
10540 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61 72  uote = quoteChar
10550 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 73  (zName);.  n = s
10560 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
10570 20 20 69 66 28 20 63 51 75 6f 74 65 20 29 20 6e    if( cQuote ) n
10580 20 2b 3d 20 6e 2b 32 3b 0a 20 20 7a 20 3d 20 70   += n+2;.  z = p
10590 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 6d  ->zDestTable = m
105a0 61 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20  alloc( n+1 );.  
105b0 69 66 28 20 7a 3d 3d 30 20 29 20 73 68 65 6c 6c  if( z==0 ) shell
105c0 5f 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29  _out_of_memory()
105d0 3b 0a 20 20 6e 20 3d 20 30 3b 0a 20 20 69 66 28  ;.  n = 0;.  if(
105e0 20 63 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d   cQuote ) z[n++]
105f0 20 3d 20 63 51 75 6f 74 65 3b 0a 20 20 66 6f 72   = cQuote;.  for
10600 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20  (i=0; zName[i]; 
10610 69 2b 2b 29 7b 0a 20 20 20 20 7a 5b 6e 2b 2b 5d  i++){.    z[n++]
10620 20 3d 20 7a 4e 61 6d 65 5b 69 5d 3b 0a 20 20 20   = zName[i];.   
10630 20 69 66 28 20 7a 4e 61 6d 65 5b 69 5d 3d 3d 63   if( zName[i]==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 7d 0a 20 20 69   cQuote;.  }.  i
10660 66 28 20 63 51 75 6f 74 65 20 29 20 7a 5b 6e 2b  f( cQuote ) z[n+
10670 2b 5d 20 3d 20 63 51 75 6f 74 65 3b 0a 20 20 7a  +] = cQuote;.  z
10680 5b 6e 5d 20 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a  [n] = 0;.}.../*.
10690 2a 2a 20 45 78 65 63 75 74 65 20 61 20 71 75 65  ** Execute a que
106a0 72 79 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  ry statement tha
106b0 74 20 77 69 6c 6c 20 67 65 6e 65 72 61 74 65 20  t will generate 
106c0 53 51 4c 20 6f 75 74 70 75 74 2e 20 20 50 72 69  SQL output.  Pri
106d0 6e 74 0a 2a 2a 20 74 68 65 20 72 65 73 75 6c 74  nt.** the result
106e0 20 63 6f 6c 75 6d 6e 73 2c 20 63 6f 6d 6d 61 2d   columns, comma-
106f0 73 65 70 61 72 61 74 65 64 2c 20 6f 6e 20 61 20  separated, on a 
10700 6c 69 6e 65 20 61 6e 64 20 74 68 65 6e 20 61 64  line and then ad
10710 64 20 61 0a 2a 2a 20 73 65 6d 69 63 6f 6c 6f 6e  d a.** semicolon
10720 20 74 65 72 6d 69 6e 61 74 6f 72 20 74 6f 20 74   terminator to t
10730 68 65 20 65 6e 64 20 6f 66 20 74 68 61 74 20 6c  he end of that l
10740 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  ine..**.** If th
10750 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75  e number of colu
10760 6d 6e 73 20 69 73 20 31 20 61 6e 64 20 74 68 61  mns is 1 and tha
10770 74 20 63 6f 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e  t column contain
10780 73 20 74 65 78 74 20 22 2d 2d 22 0a 2a 2a 20 74  s text "--".** t
10790 68 65 6e 20 77 72 69 74 65 20 74 68 65 20 73 65  hen write the se
107a0 6d 69 63 6f 6c 6f 6e 20 6f 6e 20 61 20 73 65 70  micolon on a sep
107b0 61 72 61 74 65 20 6c 69 6e 65 2e 20 20 54 68 61  arate line.  Tha
107c0 74 20 77 61 79 2c 20 69 66 20 61 0a 2a 2a 20 22  t way, if a.** "
107d0 2d 2d 22 20 63 6f 6d 6d 65 6e 74 20 6f 63 63 75  --" comment occu
107e0 72 73 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  rs at the end of
107f0 20 74 68 65 20 73 74 61 74 65 6d 65 6e 74 2c 20   the statement, 
10800 74 68 65 20 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 77  the comment.** w
10810 6f 6e 27 74 20 63 6f 6e 73 75 6d 65 20 74 68 65  on't consume the
10820 20 73 65 6d 69 63 6f 6c 6f 6e 20 74 65 72 6d 69   semicolon termi
10830 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63  nator..*/.static
10840 20 69 6e 74 20 72 75 6e 5f 74 61 62 6c 65 5f 64   int run_table_d
10850 75 6d 70 5f 71 75 65 72 79 28 0a 20 20 53 68 65  ump_query(.  She
10860 6c 6c 53 74 61 74 65 20 2a 70 2c 20 20 20 20 20  llState *p,     
10870 20 20 20 20 20 20 2f 2a 20 51 75 65 72 79 20 63        /* Query c
10880 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73  ontext */.  cons
10890 74 20 63 68 61 72 20 2a 7a 53 65 6c 65 63 74 2c  t char *zSelect,
108a0 20 20 20 20 20 2f 2a 20 53 45 4c 45 43 54 20 73       /* SELECT s
108b0 74 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 74 72  tatement to extr
108c0 61 63 74 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  act content */. 
108d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
108e0 72 73 74 52 6f 77 20 20 20 20 2f 2a 20 50 72 69  rstRow    /* Pri
108f0 6e 74 20 62 65 66 6f 72 65 20 66 69 72 73 74 20  nt before first 
10900 72 6f 77 2c 20 69 66 20 6e 6f 74 20 4e 55 4c 4c  row, if not NULL
10910 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
10920 5f 73 74 6d 74 20 2a 70 53 65 6c 65 63 74 3b 0a  _stmt *pSelect;.
10930 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
10940 6e 52 65 73 75 6c 74 3b 0a 20 20 69 6e 74 20 69  nResult;.  int i
10950 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
10960 7a 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  z;.  rc = sqlite
10970 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
10980 64 62 2c 20 7a 53 65 6c 65 63 74 2c 20 2d 31 2c  db, zSelect, -1,
10990 20 26 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20   &pSelect, 0);. 
109a0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
109b0 4f 4b 20 7c 7c 20 21 70 53 65 6c 65 63 74 20 29  OK || !pSelect )
109c0 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
109d0 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a  f(p->out, "/****
109e0 20 45 52 52 4f 52 3a 20 28 25 64 29 20 25 73 20   ERROR: (%d) %s 
109f0 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c 0a 20  *****/\n", rc,. 
10a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
10a10 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
10a20 3e 64 62 29 29 3b 0a 20 20 20 20 69 66 28 20 28  >db));.    if( (
10a30 72 63 26 30 78 66 66 29 21 3d 53 51 4c 49 54 45  rc&0xff)!=SQLITE
10a40 5f 43 4f 52 52 55 50 54 20 29 20 70 2d 3e 6e 45  _CORRUPT ) p->nE
10a50 72 72 2b 2b 3b 0a 20 20 20 20 72 65 74 75 72 6e  rr++;.    return
10a60 20 72 63 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20   rc;.  }.  rc = 
10a70 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65  sqlite3_step(pSe
10a80 6c 65 63 74 29 3b 0a 20 20 6e 52 65 73 75 6c 74  lect);.  nResult
10a90 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
10aa0 6e 5f 63 6f 75 6e 74 28 70 53 65 6c 65 63 74 29  n_count(pSelect)
10ab0 3b 0a 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53  ;.  while( rc==S
10ac0 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
10ad0 20 69 66 28 20 7a 46 69 72 73 74 52 6f 77 20 29   if( zFirstRow )
10ae0 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
10af0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
10b00 2c 20 7a 46 69 72 73 74 52 6f 77 29 3b 0a 20 20  , zFirstRow);.  
10b10 20 20 20 20 7a 46 69 72 73 74 52 6f 77 20 3d 20      zFirstRow = 
10b20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20 3d  0;.    }.    z =
10b30 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
10b40 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
10b50 74 28 70 53 65 6c 65 63 74 2c 20 30 29 3b 0a 20  t(pSelect, 0);. 
10b60 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
10b70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b  ->out, "%s", z);
10b80 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
10b90 6e 52 65 73 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20  nResult; i++){. 
10ba0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
10bb0 28 70 2d 3e 6f 75 74 2c 20 22 2c 25 73 22 2c 20  (p->out, ",%s", 
10bc0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
10bd0 65 78 74 28 70 53 65 6c 65 63 74 2c 20 69 29 29  ext(pSelect, i))
10be0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
10bf0 7a 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20  z==0 ) z = "";. 
10c00 20 20 20 77 68 69 6c 65 28 20 7a 5b 30 5d 20 26     while( z[0] &
10c10 26 20 28 7a 5b 30 5d 21 3d 27 2d 27 20 7c 7c 20  & (z[0]!='-' || 
10c20 7a 5b 31 5d 21 3d 27 2d 27 29 20 29 20 7a 2b 2b  z[1]!='-') ) z++
10c30 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 20 29  ;.    if( z[0] )
10c40 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
10c50 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 3b 5c  tf(p->out, "\n;\
10c60 6e 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  n");.    }else{.
10c70 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
10c80 28 70 2d 3e 6f 75 74 2c 20 22 3b 5c 6e 22 29 3b  (p->out, ";\n");
10c90 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
10ca0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 65  sqlite3_step(pSe
10cb0 6c 65 63 74 29 3b 0a 20 20 7d 0a 20 20 72 63 20  lect);.  }.  rc 
10cc0 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
10cd0 7a 65 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 69  ze(pSelect);.  i
10ce0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
10cf0 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
10d00 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a  ntf(p->out, "/**
10d10 2a 2a 20 45 52 52 4f 52 3a 20 28 25 64 29 20 25  ** ERROR: (%d) %
10d20 73 20 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c  s *****/\n", rc,
10d30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10d40 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
10d50 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 69 66 28  p->db));.    if(
10d60 20 28 72 63 26 30 78 66 66 29 21 3d 53 51 4c 49   (rc&0xff)!=SQLI
10d70 54 45 5f 43 4f 52 52 55 50 54 20 29 20 70 2d 3e  TE_CORRUPT ) p->
10d80 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  nErr++;.  }.  re
10d90 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
10da0 2a 20 41 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * Allocate space
10db0 20 61 6e 64 20 73 61 76 65 20 6f 66 66 20 63 75   and save off cu
10dc0 72 72 65 6e 74 20 65 72 72 6f 72 20 73 74 72 69  rrent error stri
10dd0 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ng..*/.static ch
10de0 61 72 20 2a 73 61 76 65 5f 65 72 72 5f 6d 73 67  ar *save_err_msg
10df0 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  (.  sqlite3 *db 
10e00 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61             /* Da
10e10 74 61 62 61 73 65 20 74 6f 20 71 75 65 72 79 20  tabase to query 
10e20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72  */.){.  int nErr
10e30 4d 73 67 20 3d 20 31 2b 73 74 72 6c 65 6e 33 30  Msg = 1+strlen30
10e40 28 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28  (sqlite3_errmsg(
10e50 64 62 29 29 3b 0a 20 20 63 68 61 72 20 2a 7a 45  db));.  char *zE
10e60 72 72 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 5f  rrMsg = sqlite3_
10e70 6d 61 6c 6c 6f 63 36 34 28 6e 45 72 72 4d 73 67  malloc64(nErrMsg
10e80 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 4d 73 67  );.  if( zErrMsg
10e90 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79 28 7a   ){.    memcpy(z
10ea0 45 72 72 4d 73 67 2c 20 73 71 6c 69 74 65 33 5f  ErrMsg, sqlite3_
10eb0 65 72 72 6d 73 67 28 64 62 29 2c 20 6e 45 72 72  errmsg(db), nErr
10ec0 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Msg);.  }.  retu
10ed0 72 6e 20 7a 45 72 72 4d 73 67 3b 0a 7d 0a 0a 23  rn zErrMsg;.}..#
10ee0 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a  ifdef __linux__.
10ef0 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  /*.** Attempt to
10f00 20 64 69 73 70 6c 61 79 20 49 2f 4f 20 73 74 61   display I/O sta
10f10 74 73 20 6f 6e 20 4c 69 6e 75 78 20 75 73 69 6e  ts on Linux usin
10f20 67 20 2f 70 72 6f 63 2f 50 49 44 2f 69 6f 0a 2a  g /proc/PID/io.*
10f30 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69  /.static void di
10f40 73 70 6c 61 79 4c 69 6e 75 78 49 6f 53 74 61 74  splayLinuxIoStat
10f50 73 28 46 49 4c 45 20 2a 6f 75 74 29 7b 0a 20 20  s(FILE *out){.  
10f60 46 49 4c 45 20 2a 69 6e 3b 0a 20 20 63 68 61 72  FILE *in;.  char
10f70 20 7a 5b 32 30 30 5d 3b 0a 20 20 73 71 6c 69 74   z[200];.  sqlit
10f80 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
10f90 6f 66 28 7a 29 2c 20 7a 2c 20 22 2f 70 72 6f 63  of(z), z, "/proc
10fa0 2f 25 64 2f 69 6f 22 2c 20 67 65 74 70 69 64 28  /%d/io", getpid(
10fb0 29 29 3b 0a 20 20 69 6e 20 3d 20 66 6f 70 65 6e  ));.  in = fopen
10fc0 28 7a 2c 20 22 72 62 22 29 3b 0a 20 20 69 66 28  (z, "rb");.  if(
10fd0 20 69 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b   in==0 ) return;
10fe0 0a 20 20 77 68 69 6c 65 28 20 66 67 65 74 73 28  .  while( fgets(
10ff0 7a 2c 20 73 69 7a 65 6f 66 28 7a 29 2c 20 69 6e  z, sizeof(z), in
11000 29 21 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74  )!=0 ){.    stat
11010 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
11020 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
11030 61 72 20 2a 7a 50 61 74 74 65 72 6e 3b 0a 20 20  ar *zPattern;.  
11040 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
11050 7a 44 65 73 63 3b 0a 20 20 20 20 7d 20 61 54 72  zDesc;.    } aTr
11060 61 6e 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ans[] = {.      
11070 7b 20 22 72 63 68 61 72 3a 20 22 2c 20 20 20 20  { "rchar: ",    
11080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 42                "B
11090 79 74 65 73 20 72 65 63 65 69 76 65 64 20 62 79  ytes received by
110a0 20 72 65 61 64 28 29 3a 22 20 7d 2c 0a 20 20 20   read():" },.   
110b0 20 20 20 7b 20 22 77 63 68 61 72 3a 20 22 2c 20     { "wchar: ", 
110c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
110d0 20 22 42 79 74 65 73 20 73 65 6e 74 20 74 6f 20   "Bytes sent to 
110e0 77 72 69 74 65 28 29 3a 22 20 20 20 20 7d 2c 0a  write():"    },.
110f0 20 20 20 20 20 20 7b 20 22 73 79 73 63 72 3a 20        { "syscr: 
11100 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
11110 20 20 20 20 22 52 65 61 64 28 29 20 73 79 73 74      "Read() syst
11120 65 6d 20 63 61 6c 6c 73 3a 22 20 20 20 20 20 20  em calls:"      
11130 7d 2c 0a 20 20 20 20 20 20 7b 20 22 73 79 73 63  },.      { "sysc
11140 77 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20 20  w: ",           
11150 20 20 20 20 20 20 20 22 57 72 69 74 65 28 29 20         "Write() 
11160 73 79 73 74 65 6d 20 63 61 6c 6c 73 3a 22 20 20  system calls:"  
11170 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 72     },.      { "r
11180 65 61 64 5f 62 79 74 65 73 3a 20 22 2c 20 20 20  ead_bytes: ",   
11190 20 20 20 20 20 20 20 20 20 20 22 42 79 74 65 73            "Bytes
111a0 20 72 65 61 64 20 66 72 6f 6d 20 73 74 6f 72 61   read from stora
111b0 67 65 3a 22 20 20 7d 2c 0a 20 20 20 20 20 20 7b  ge:"  },.      {
111c0 20 22 77 72 69 74 65 5f 62 79 74 65 73 3a 20 22   "write_bytes: "
111d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 22 42 79  ,            "By
111e0 74 65 73 20 77 72 69 74 74 65 6e 20 74 6f 20 73  tes written to s
111f0 74 6f 72 61 67 65 3a 22 20 7d 2c 0a 20 20 20 20  torage:" },.    
11200 20 20 7b 20 22 63 61 6e 63 65 6c 6c 65 64 5f 77    { "cancelled_w
11210 72 69 74 65 5f 62 79 74 65 73 3a 20 22 2c 20 20  rite_bytes: ",  
11220 22 43 61 6e 63 65 6c 6c 65 64 20 77 72 69 74 65  "Cancelled write
11230 20 62 79 74 65 73 3a 22 20 20 20 20 7d 2c 0a 20   bytes:"    },. 
11240 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 3b     };.    int i;
11250 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
11260 41 72 72 61 79 53 69 7a 65 28 61 54 72 61 6e 73  ArraySize(aTrans
11270 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
11280 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28  nt n = strlen30(
11290 61 54 72 61 6e 73 5b 69 5d 2e 7a 50 61 74 74 65  aTrans[i].zPatte
112a0 72 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73  rn);.      if( s
112b0 74 72 6e 63 6d 70 28 61 54 72 61 6e 73 5b 69 5d  trncmp(aTrans[i]
112c0 2e 7a 50 61 74 74 65 72 6e 2c 20 7a 2c 20 6e 29  .zPattern, z, n)
112d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ==0 ){.        u
112e0 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  tf8_printf(out, 
112f0 22 25 2d 33 36 73 20 25 73 22 2c 20 61 54 72 61  "%-36s %s", aTra
11300 6e 73 5b 69 5d 2e 7a 44 65 73 63 2c 20 26 7a 5b  ns[i].zDesc, &z[
11310 6e 5d 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  n]);.        bre
11320 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
11330 7d 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 69  }.  }.  fclose(i
11340 6e 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  n);.}.#endif../*
11350 0a 2a 2a 20 44 69 73 70 6c 61 79 20 61 20 73 69  .** Display a si
11360 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20 73 74 61  ngle line of sta
11370 74 75 73 20 75 73 69 6e 67 20 36 34 2d 62 69 74  tus using 64-bit
11380 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74   values..*/.stat
11390 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79 53  ic void displayS
113a0 74 61 74 4c 69 6e 65 28 0a 20 20 53 68 65 6c 6c  tatLine(.  Shell
113b0 53 74 61 74 65 20 2a 70 2c 20 20 20 20 20 20 20  State *p,       
113c0 20 20 20 20 20 2f 2a 20 54 68 65 20 73 68 65 6c       /* The shel
113d0 6c 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63  l context */.  c
113e0 68 61 72 20 2a 7a 4c 61 62 65 6c 2c 20 20 20 20  har *zLabel,    
113f0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 62 65           /* Labe
11400 6c 20 66 6f 72 20 74 68 69 73 20 6f 6e 65 20 6c  l for this one l
11410 69 6e 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ine */.  char *z
11420 46 6f 72 6d 61 74 2c 20 20 20 20 20 20 20 20 20  Format,         
11430 20 20 20 2f 2a 20 46 6f 72 6d 61 74 20 66 6f 72     /* Format for
11440 20 74 68 65 20 72 65 73 75 6c 74 20 2a 2f 0a 20   the result */. 
11450 20 69 6e 74 20 69 53 74 61 74 75 73 43 74 72 6c   int iStatusCtrl
11460 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 68  ,          /* Wh
11470 69 63 68 20 73 74 61 74 75 73 20 74 6f 20 64 69  ich status to di
11480 73 70 6c 61 79 20 2a 2f 0a 20 20 69 6e 74 20 62  splay */.  int b
11490 52 65 73 65 74 20 20 20 20 20 20 20 20 20 20 20  Reset           
114a0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
114b0 72 65 73 65 74 20 74 68 65 20 73 74 61 74 73 20  reset the stats 
114c0 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  */.){.  sqlite3_
114d0 69 6e 74 36 34 20 69 43 75 72 20 3d 20 2d 31 3b  int64 iCur = -1;
114e0 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
114f0 20 69 48 69 77 74 72 20 3d 20 2d 31 3b 0a 20 20   iHiwtr = -1;.  
11500 69 6e 74 20 69 2c 20 6e 50 65 72 63 65 6e 74 3b  int i, nPercent;
11510 0a 20 20 63 68 61 72 20 7a 4c 69 6e 65 5b 32 30  .  char zLine[20
11520 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  0];.  sqlite3_st
11530 61 74 75 73 36 34 28 69 53 74 61 74 75 73 43 74  atus64(iStatusCt
11540 72 6c 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77  rl, &iCur, &iHiw
11550 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 66  tr, bReset);.  f
11560 6f 72 28 69 3d 30 2c 20 6e 50 65 72 63 65 6e 74  or(i=0, nPercent
11570 3d 30 3b 20 7a 46 6f 72 6d 61 74 5b 69 5d 3b 20  =0; zFormat[i]; 
11580 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a 46  i++){.    if( zF
11590 6f 72 6d 61 74 5b 69 5d 3d 3d 27 25 27 20 29 20  ormat[i]=='%' ) 
115a0 6e 50 65 72 63 65 6e 74 2b 2b 3b 0a 20 20 7d 0a  nPercent++;.  }.
115b0 20 20 69 66 28 20 6e 50 65 72 63 65 6e 74 3e 31    if( nPercent>1
115c0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
115d0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
115e0 7a 4c 69 6e 65 29 2c 20 7a 4c 69 6e 65 2c 20 7a  zLine), zLine, z
115f0 46 6f 72 6d 61 74 2c 20 69 43 75 72 2c 20 69 48  Format, iCur, iH
11600 69 77 74 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  iwtr);.  }else{.
11610 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
11620 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e  intf(sizeof(zLin
11630 65 29 2c 20 7a 4c 69 6e 65 2c 20 7a 46 6f 72 6d  e), zLine, zForm
11640 61 74 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 7d  at, iHiwtr);.  }
11650 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d  .  raw_printf(p-
11660 3e 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 73 5c  >out, "%-36s %s\
11670 6e 22 2c 20 7a 4c 61 62 65 6c 2c 20 7a 4c 69 6e  n", zLabel, zLin
11680 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73  e);.}../*.** Dis
11690 70 6c 61 79 20 6d 65 6d 6f 72 79 20 73 74 61 74  play memory stat
116a0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
116b0 20 64 69 73 70 6c 61 79 5f 73 74 61 74 73 28 0a   display_stats(.
116c0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20    sqlite3 *db,  
116d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
116e0 20 44 61 74 61 62 61 73 65 20 74 6f 20 71 75 65   Database to que
116f0 72 79 20 2a 2f 0a 20 20 53 68 65 6c 6c 53 74 61  ry */.  ShellSta
11700 74 65 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20  te *pArg,       
11710 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
11720 6f 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a  o ShellState */.
11730 20 20 69 6e 74 20 62 52 65 73 65 74 20 20 20 20    int bReset    
11740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11750 20 54 72 75 65 20 74 6f 20 72 65 73 65 74 20 74   True to reset t
11760 68 65 20 73 74 61 74 73 20 2a 2f 0a 29 7b 0a 20  he stats */.){. 
11770 20 69 6e 74 20 69 43 75 72 3b 0a 20 20 69 6e 74   int iCur;.  int
11780 20 69 48 69 77 74 72 3b 0a 20 20 46 49 4c 45 20   iHiwtr;.  FILE 
11790 2a 6f 75 74 3b 0a 20 20 69 66 28 20 70 41 72 67  *out;.  if( pArg
117a0 3d 3d 30 20 7c 7c 20 70 41 72 67 2d 3e 6f 75 74  ==0 || pArg->out
117b0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
117c0 20 20 6f 75 74 20 3d 20 70 41 72 67 2d 3e 6f 75    out = pArg->ou
117d0 74 3b 0a 0a 20 20 69 66 28 20 70 41 72 67 2d 3e  t;..  if( pArg->
117e0 70 53 74 6d 74 20 26 26 20 28 70 41 72 67 2d 3e  pStmt && (pArg->
117f0 73 74 61 74 73 4f 6e 20 26 20 32 29 20 29 7b 0a  statsOn & 2) ){.
11800 20 20 20 20 69 6e 74 20 6e 43 6f 6c 2c 20 69 2c      int nCol, i,
11810 20 78 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   x;.    sqlite3_
11820 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 70 41  stmt *pStmt = pA
11830 72 67 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20 63  rg->pStmt;.    c
11840 68 61 72 20 7a 5b 31 30 30 5d 3b 0a 20 20 20 20  har z[100];.    
11850 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  nCol = sqlite3_c
11860 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d  olumn_count(pStm
11870 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  t);.    raw_prin
11880 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25  tf(out, "%-36s %
11890 64 5c 6e 22 2c 20 22 4e 75 6d 62 65 72 20 6f 66  d\n", "Number of
118a0 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 73 3a   output columns:
118b0 22 2c 20 6e 43 6f 6c 29 3b 0a 20 20 20 20 66 6f  ", nCol);.    fo
118c0 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
118d0 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
118e0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
118f0 6f 66 28 7a 29 2c 7a 2c 22 43 6f 6c 75 6d 6e 20  of(z),z,"Column 
11900 25 64 20 25 6e 6e 61 6d 65 3a 22 2c 20 69 2c 20  %d %nname:", i, 
11910 26 78 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f  &x);.      utf8_
11920 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33  printf(out, "%-3
11930 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c  6s %s\n", z, sql
11940 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65  ite3_column_name
11950 28 70 53 74 6d 74 2c 69 29 29 3b 0a 23 69 66 6e  (pStmt,i));.#ifn
11960 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
11970 44 45 43 4c 54 59 50 45 0a 20 20 20 20 20 20 73  DECLTYPE.      s
11980 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
11990 33 30 2c 20 7a 2b 78 2c 20 22 64 65 63 6c 61 72  30, z+x, "declar
119a0 65 64 20 74 79 70 65 3a 22 29 3b 0a 20 20 20 20  ed type:");.    
119b0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
119c0 74 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e 22 2c  t, "%-36s %s\n",
119d0 20 7a 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75   z, sqlite3_colu
119e0 6d 6e 5f 64 65 63 6c 74 79 70 65 28 70 53 74 6d  mn_decltype(pStm
119f0 74 2c 20 69 29 29 3b 0a 23 65 6e 64 69 66 0a 23  t, i));.#endif.#
11a00 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
11a10 42 4c 45 5f 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44  BLE_COLUMN_METAD
11a20 41 54 41 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ATA.      sqlite
11a30 33 5f 73 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a  3_snprintf(30, z
11a40 2b 78 2c 20 22 64 61 74 61 62 61 73 65 20 6e 61  +x, "database na
11a50 6d 65 3a 22 29 3b 0a 20 20 20 20 20 20 75 74 66  me:");.      utf
11a60 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  8_printf(out, "%
11a70 2d 33 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73  -36s %s\n", z, s
11a80 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61  qlite3_column_da
11a90 74 61 62 61 73 65 5f 6e 61 6d 65 28 70 53 74 6d  tabase_name(pStm
11aa0 74 2c 69 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  t,i));.      sql
11ab0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 30  ite3_snprintf(30
11ac0 2c 20 7a 2b 78 2c 20 22 74 61 62 6c 65 20 6e 61  , z+x, "table na
11ad0 6d 65 3a 22 29 3b 0a 20 20 20 20 20 20 75 74 66  me:");.      utf
11ae0 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  8_printf(out, "%
11af0 2d 33 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73  -36s %s\n", z, s
11b00 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61  qlite3_column_ta
11b10 62 6c 65 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69  ble_name(pStmt,i
11b20 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
11b30 33 5f 73 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a  3_snprintf(30, z
11b40 2b 78 2c 20 22 6f 72 69 67 69 6e 20 6e 61 6d 65  +x, "origin name
11b50 3a 22 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f  :");.      utf8_
11b60 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33  printf(out, "%-3
11b70 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c  6s %s\n", z, sql
11b80 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67  ite3_column_orig
11b90 69 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29  in_name(pStmt,i)
11ba0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 0a  );.#endif.    }.
11bb0 20 20 7d 0a 0a 20 20 64 69 73 70 6c 61 79 53 74    }..  displaySt
11bc0 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4d 65  atLine(pArg, "Me
11bd0 6d 6f 72 79 20 55 73 65 64 3a 22 2c 0a 20 20 20  mory Used:",.   
11be0 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c    "%lld (max %ll
11bf0 64 29 20 62 79 74 65 73 22 2c 20 53 51 4c 49 54  d) bytes", SQLIT
11c00 45 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f  E_STATUS_MEMORY_
11c10 55 53 45 44 2c 20 62 52 65 73 65 74 29 3b 0a 20  USED, bReset);. 
11c20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65   displayStatLine
11c30 28 70 41 72 67 2c 20 22 4e 75 6d 62 65 72 20 6f  (pArg, "Number o
11c40 66 20 4f 75 74 73 74 61 6e 64 69 6e 67 20 41 6c  f Outstanding Al
11c50 6c 6f 63 61 74 69 6f 6e 73 3a 22 2c 0a 20 20 20  locations:",.   
11c60 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c    "%lld (max %ll
11c70 64 29 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  d)", SQLITE_STAT
11c80 55 53 5f 4d 41 4c 4c 4f 43 5f 43 4f 55 4e 54 2c  US_MALLOC_COUNT,
11c90 20 62 52 65 73 65 74 29 3b 0a 20 20 69 66 28 20   bReset);.  if( 
11ca0 70 41 72 67 2d 3e 73 68 65 6c 6c 46 6c 67 73 20  pArg->shellFlgs 
11cb0 26 20 53 48 46 4c 47 5f 50 61 67 65 63 61 63 68  & SHFLG_Pagecach
11cc0 65 20 29 7b 0a 20 20 20 20 64 69 73 70 6c 61 79  e ){.    display
11cd0 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22  StatLine(pArg, "
11ce0 4e 75 6d 62 65 72 20 6f 66 20 50 63 61 63 68 65  Number of Pcache
11cf0 20 50 61 67 65 73 20 55 73 65 64 3a 22 2c 0a 20   Pages Used:",. 
11d00 20 20 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78        "%lld (max
11d10 20 25 6c 6c 64 29 20 70 61 67 65 73 22 2c 20 53   %lld) pages", S
11d20 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47  QLITE_STATUS_PAG
11d30 45 43 41 43 48 45 5f 55 53 45 44 2c 20 62 52 65  ECACHE_USED, bRe
11d40 73 65 74 29 3b 0a 20 20 7d 0a 20 20 64 69 73 70  set);.  }.  disp
11d50 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67  layStatLine(pArg
11d60 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 50 63 61  , "Number of Pca
11d70 63 68 65 20 4f 76 65 72 66 6c 6f 77 20 42 79 74  che Overflow Byt
11d80 65 73 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64  es:",.     "%lld
11d90 20 28 6d 61 78 20 25 6c 6c 64 29 20 62 79 74 65   (max %lld) byte
11da0 73 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55  s", SQLITE_STATU
11db0 53 5f 50 41 47 45 43 41 43 48 45 5f 4f 56 45 52  S_PAGECACHE_OVER
11dc0 46 4c 4f 57 2c 20 62 52 65 73 65 74 29 3b 0a 20  FLOW, bReset);. 
11dd0 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65   displayStatLine
11de0 28 70 41 72 67 2c 20 22 4c 61 72 67 65 73 74 20  (pArg, "Largest 
11df0 41 6c 6c 6f 63 61 74 69 6f 6e 3a 22 2c 0a 20 20  Allocation:",.  
11e00 20 20 20 22 25 6c 6c 64 20 62 79 74 65 73 22 2c     "%lld bytes",
11e10 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d   SQLITE_STATUS_M
11e20 41 4c 4c 4f 43 5f 53 49 5a 45 2c 20 62 52 65 73  ALLOC_SIZE, bRes
11e30 65 74 29 3b 0a 20 20 64 69 73 70 6c 61 79 53 74  et);.  displaySt
11e40 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4c 61  atLine(pArg, "La
11e50 72 67 65 73 74 20 50 63 61 63 68 65 20 41 6c 6c  rgest Pcache All
11e60 6f 63 61 74 69 6f 6e 3a 22 2c 0a 20 20 20 20 20  ocation:",.     
11e70 22 25 6c 6c 64 20 62 79 74 65 73 22 2c 20 53 51  "%lld bytes", SQ
11e80 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45  LITE_STATUS_PAGE
11e90 43 41 43 48 45 5f 53 49 5a 45 2c 20 62 52 65 73  CACHE_SIZE, bRes
11ea0 65 74 29 3b 0a 23 69 66 64 65 66 20 59 59 54 52  et);.#ifdef YYTR
11eb0 41 43 4b 4d 41 58 53 54 41 43 4b 44 45 50 54 48  ACKMAXSTACKDEPTH
11ec0 0a 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69  .  displayStatLi
11ed0 6e 65 28 70 41 72 67 2c 20 22 44 65 65 70 65 73  ne(pArg, "Deepes
11ee0 74 20 50 61 72 73 65 72 20 53 74 61 63 6b 3a 22  t Parser Stack:"
11ef0 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20 28 6d 61  ,.     "%lld (ma
11f00 78 20 25 6c 6c 64 29 22 2c 20 53 51 4c 49 54 45  x %lld)", SQLITE
11f10 5f 53 54 41 54 55 53 5f 50 41 52 53 45 52 5f 53  _STATUS_PARSER_S
11f20 54 41 43 4b 2c 20 62 52 65 73 65 74 29 3b 0a 23  TACK, bReset);.#
11f30 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 64 62 20  endif..  if( db 
11f40 29 7b 0a 20 20 20 20 69 66 28 20 70 41 72 67 2d  ){.    if( pArg-
11f50 3e 73 68 65 6c 6c 46 6c 67 73 20 26 20 53 48 46  >shellFlgs & SHF
11f60 4c 47 5f 4c 6f 6f 6b 61 73 69 64 65 20 29 7b 0a  LG_Lookaside ){.
11f70 20 20 20 20 20 20 69 48 69 77 74 72 20 3d 20 69        iHiwtr = i
11f80 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Cur = -1;.      
11f90 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
11fa0 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53  s(db, SQLITE_DBS
11fb0 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f  TATUS_LOOKASIDE_
11fc0 55 53 45 44 2c 0a 20 20 20 20 20 20 20 20 20 20  USED,.          
11fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 69                &i
11fe0 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52  Cur, &iHiwtr, bR
11ff0 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72 61 77  eset);.      raw
12000 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
12010 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
12020 20 22 4c 6f 6f 6b 61 73 69 64 65 20 53 6c 6f 74   "Lookaside Slot
12030 73 20 55 73 65 64 3a 20 20 20 20 20 20 20 20 20  s Used:         
12040 20 20 20 20 20 20 20 25 64 20 28 6d 61 78 20 25         %d (max %
12050 64 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  d)\n",.         
12060 20 20 20 20 20 69 43 75 72 2c 20 69 48 69 77 74       iCur, iHiwt
12070 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
12080 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
12090 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
120a0 4c 4f 4f 4b 41 53 49 44 45 5f 48 49 54 2c 0a 20  LOOKASIDE_HIT,. 
120b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
120c0 20 20 20 20 20 20 20 26 69 43 75 72 2c 20 26 69         &iCur, &i
120d0 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a  Hiwtr, bReset);.
120e0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
120f0 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53 75 63  (pArg->out, "Suc
12100 63 65 73 73 66 75 6c 20 6c 6f 6f 6b 61 73 69 64  cessful lookasid
12110 65 20 61 74 74 65 6d 70 74 73 3a 20 20 20 20 20  e attempts:     
12120 20 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20    %d\n",.       
12130 20 20 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a         iHiwtr);.
12140 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62        sqlite3_db
12150 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
12160 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b  TE_DBSTATUS_LOOK
12170 41 53 49 44 45 5f 4d 49 53 53 5f 53 49 5a 45 2c  ASIDE_MISS_SIZE,
12180 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12190 20 20 20 20 20 20 20 20 20 26 69 43 75 72 2c 20           &iCur, 
121a0 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29  &iHiwtr, bReset)
121b0 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  ;.      raw_prin
121c0 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c  tf(pArg->out, "L
121d0 6f 6f 6b 61 73 69 64 65 20 66 61 69 6c 75 72 65  ookaside failure
121e0 73 20 64 75 65 20 74 6f 20 73 69 7a 65 3a 20 20  s due to size:  
121f0 20 20 20 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20      %d\n",.     
12200 20 20 20 20 20 20 20 20 20 69 48 69 77 74 72 29           iHiwtr)
12210 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
12220 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
12230 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f  LITE_DBSTATUS_LO
12240 4f 4b 41 53 49 44 45 5f 4d 49 53 53 5f 46 55 4c  OKASIDE_MISS_FUL
12250 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
12260 20 20 20 20 20 20 20 20 20 20 20 26 69 43 75 72             &iCur
12270 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65  , &iHiwtr, bRese
12280 74 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  t);.      raw_pr
12290 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
122a0 22 4c 6f 6f 6b 61 73 69 64 65 20 66 61 69 6c 75  "Lookaside failu
122b0 72 65 73 20 64 75 65 20 74 6f 20 4f 4f 4d 3a 20  res due to OOM: 
122c0 20 20 20 20 20 20 25 64 5c 6e 22 2c 0a 20 20 20        %d\n",.   
122d0 20 20 20 20 20 20 20 20 20 20 20 69 48 69 77 74             iHiwt
122e0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 48  r);.    }.    iH
122f0 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31  iwtr = iCur = -1
12300 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62  ;.    sqlite3_db
12310 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
12320 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48  TE_DBSTATUS_CACH
12330 45 5f 55 53 45 44 2c 20 26 69 43 75 72 2c 20 26  E_USED, &iCur, &
12340 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b  iHiwtr, bReset);
12350 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
12360 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65  pArg->out, "Page
12370 72 20 48 65 61 70 20 55 73 61 67 65 3a 20 20 20  r Heap Usage:   
12380 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12390 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20   %d bytes\n",.  
123a0 20 20 20 20 20 20 20 20 20 20 69 43 75 72 29 3b            iCur);
123b0 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43  .    iHiwtr = iC
123c0 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c  ur = -1;.    sql
123d0 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64  ite3_db_status(d
123e0 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  b, SQLITE_DBSTAT
123f0 55 53 5f 43 41 43 48 45 5f 48 49 54 2c 20 26 69  US_CACHE_HIT, &i
12400 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29  Cur, &iHiwtr, 1)
12410 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
12420 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67  (pArg->out, "Pag
12430 65 20 63 61 63 68 65 20 68 69 74 73 3a 20 20 20  e cache hits:   
12440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12450 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a    %d\n", iCur);.
12460 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75      iHiwtr = iCu
12470 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69  r = -1;.    sqli
12480 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
12490 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
124a0 53 5f 43 41 43 48 45 5f 4d 49 53 53 2c 20 26 69  S_CACHE_MISS, &i
124b0 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29  Cur, &iHiwtr, 1)
124c0 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
124d0 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67  (pArg->out, "Pag
124e0 65 20 63 61 63 68 65 20 6d 69 73 73 65 73 3a 20  e cache misses: 
124f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12500 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a    %d\n", iCur);.
12510 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75      iHiwtr = iCu
12520 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69  r = -1;.    sqli
12530 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
12540 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
12550 53 5f 43 41 43 48 45 5f 57 52 49 54 45 2c 20 26  S_CACHE_WRITE, &
12560 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 31  iCur, &iHiwtr, 1
12570 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  );.    raw_print
12580 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61  f(pArg->out, "Pa
12590 67 65 20 63 61 63 68 65 20 77 72 69 74 65 73 3a  ge cache writes:
125a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125b0 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b     %d\n", iCur);
125c0 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43  .    iHiwtr = iC
125d0 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c  ur = -1;.    sql
125e0 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64  ite3_db_status(d
125f0 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  b, SQLITE_DBSTAT
12600 55 53 5f 43 41 43 48 45 5f 53 50 49 4c 4c 2c 20  US_CACHE_SPILL, 
12610 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
12620 31 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  1);.    raw_prin
12630 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50  tf(pArg->out, "P
12640 61 67 65 20 63 61 63 68 65 20 73 70 69 6c 6c 73  age cache spills
12650 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
12660 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29      %d\n", iCur)
12670 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69  ;.    iHiwtr = i
12680 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71  Cur = -1;.    sq
12690 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
126a0 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
126b0 54 55 53 5f 53 43 48 45 4d 41 5f 55 53 45 44 2c  TUS_SCHEMA_USED,
126c0 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c   &iCur, &iHiwtr,
126d0 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61   bReset);.    ra
126e0 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
126f0 75 74 2c 20 22 53 63 68 65 6d 61 20 48 65 61 70  ut, "Schema Heap
12700 20 55 73 61 67 65 3a 20 20 20 20 20 20 20 20 20   Usage:         
12710 20 20 20 20 20 20 20 20 20 20 25 64 20 62 79 74            %d byt
12720 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  es\n",.         
12730 20 20 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48     iCur);.    iH
12740 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31  iwtr = iCur = -1
12750 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62  ;.    sqlite3_db
12760 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
12770 54 45 5f 44 42 53 54 41 54 55 53 5f 53 54 4d 54  TE_DBSTATUS_STMT
12780 5f 55 53 45 44 2c 20 26 69 43 75 72 2c 20 26 69  _USED, &iCur, &i
12790 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a  Hiwtr, bReset);.
127a0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
127b0 41 72 67 2d 3e 6f 75 74 2c 20 22 53 74 61 74 65  Arg->out, "State
127c0 6d 65 6e 74 20 48 65 61 70 2f 4c 6f 6f 6b 61 73  ment Heap/Lookas
127d0 69 64 65 20 55 73 61 67 65 3a 20 20 20 20 20 20  ide Usage:      
127e0 25 64 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20  %d bytes\n",.   
127f0 20 20 20 20 20 20 20 20 20 69 43 75 72 29 3b 0a           iCur);.
12800 20 20 7d 0a 0a 20 20 69 66 28 20 70 41 72 67 2d    }..  if( pArg-
12810 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 43  >pStmt ){.    iC
12820 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d  ur = sqlite3_stm
12830 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70  t_status(pArg->p
12840 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d  Stmt, SQLITE_STM
12850 54 53 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e  TSTATUS_FULLSCAN
12860 5f 53 54 45 50 2c 0a 20 20 20 20 20 20 20 20 20  _STEP,.         
12870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12880 20 20 20 20 20 20 62 52 65 73 65 74 29 3b 0a 20        bReset);. 
12890 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
128a0 72 67 2d 3e 6f 75 74 2c 20 22 46 75 6c 6c 73 63  rg->out, "Fullsc
128b0 61 6e 20 53 74 65 70 73 3a 20 20 20 20 20 20 20  an Steps:       
128c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
128d0 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20  d\n", iCur);.   
128e0 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f   iCur = sqlite3_
128f0 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67  stmt_status(pArg
12900 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f  ->pStmt, SQLITE_
12910 53 54 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 2c  STMTSTATUS_SORT,
12920 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61   bReset);.    ra
12930 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
12940 75 74 2c 20 22 53 6f 72 74 20 4f 70 65 72 61 74  ut, "Sort Operat
12950 69 6f 6e 73 3a 20 20 20 20 20 20 20 20 20 20 20  ions:           
12960 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c            %d\n",
12970 20 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72   iCur);.    iCur
12980 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f   = sqlite3_stmt_
12990 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74  status(pArg->pSt
129a0 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  mt, SQLITE_STMTS
129b0 54 41 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 2c  TATUS_AUTOINDEX,
129c0 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77  bReset);.    raw
129d0 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
129e0 74 2c 20 22 41 75 74 6f 69 6e 64 65 78 20 49 6e  t, "Autoindex In
129f0 73 65 72 74 73 3a 20 20 20 20 20 20 20 20 20 20  serts:          
12a00 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20           %d\n", 
12a10 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20  iCur);.    iCur 
12a20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
12a30 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d  tatus(pArg->pStm
12a40 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  t, SQLITE_STMTST
12a50 41 54 55 53 5f 56 4d 5f 53 54 45 50 2c 20 62 52  ATUS_VM_STEP, bR
12a60 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70  eset);.    raw_p
12a70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
12a80 20 22 56 69 72 74 75 61 6c 20 4d 61 63 68 69 6e   "Virtual Machin
12a90 65 20 53 74 65 70 73 3a 20 20 20 20 20 20 20 20  e Steps:        
12aa0 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43         %d\n", iC
12ab0 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20  ur);.    iCur = 
12ac0 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
12ad0 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c  tus(pArg->pStmt,
12ae0 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
12af0 55 53 5f 52 45 50 52 45 50 41 52 45 2c 20 62 52  US_REPREPARE, bR
12b00 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70  eset);.    raw_p
12b10 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
12b20 20 22 52 65 70 72 65 70 61 72 65 20 6f 70 65 72   "Reprepare oper
12b30 61 74 69 6f 6e 73 3a 20 20 20 20 20 20 20 20 20  ations:         
12b40 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43         %d\n", iC
12b50 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20  ur);.    iCur = 
12b60 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
12b70 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c  tus(pArg->pStmt,
12b80 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
12b90 55 53 5f 52 55 4e 2c 20 62 52 65 73 65 74 29 3b  US_RUN, bReset);
12ba0 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
12bb0 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4e 75 6d 62  pArg->out, "Numb
12bc0 65 72 20 6f 66 20 74 69 6d 65 73 20 72 75 6e 3a  er of times run:
12bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12be0 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20   %d\n", iCur);. 
12bf0 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65     iCur = sqlite
12c00 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41  3_stmt_status(pA
12c10 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54  rg->pStmt, SQLIT
12c20 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 4d 45 4d  E_STMTSTATUS_MEM
12c30 55 53 45 44 2c 20 62 52 65 73 65 74 29 3b 0a 20  USED, bReset);. 
12c40 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
12c50 72 67 2d 3e 6f 75 74 2c 20 22 4d 65 6d 6f 72 79  rg->out, "Memory
12c60 20 75 73 65 64 20 62 79 20 70 72 65 70 61 72 65   used by prepare
12c70 64 20 73 74 6d 74 3a 20 20 20 20 20 20 20 20 25  d stmt:        %
12c80 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 7d  d\n", iCur);.  }
12c90 0a 0a 23 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78  ..#ifdef __linux
12ca0 5f 5f 0a 20 20 64 69 73 70 6c 61 79 4c 69 6e 75  __.  displayLinu
12cb0 78 49 6f 53 74 61 74 73 28 70 41 72 67 2d 3e 6f  xIoStats(pArg->o
12cc0 75 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  ut);.#endif..  /
12cd0 2a 20 44 6f 20 6e 6f 74 20 72 65 6d 6f 76 65 20  * Do not remove 
12ce0 74 68 69 73 20 6d 61 63 68 69 6e 65 20 72 65 61  this machine rea
12cf0 64 61 62 6c 65 20 63 6f 6d 6d 65 6e 74 3a 20 65  dable comment: e
12d00 78 74 72 61 2d 73 74 61 74 73 2d 6f 75 74 70 75  xtra-stats-outpu
12d10 74 2d 68 65 72 65 20 2a 2f 0a 0a 20 20 72 65 74  t-here */..  ret
12d20 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
12d30 44 69 73 70 6c 61 79 20 73 63 61 6e 20 73 74 61  Display scan sta
12d40 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
12d50 69 64 20 64 69 73 70 6c 61 79 5f 73 63 61 6e 73  id display_scans
12d60 74 61 74 73 28 0a 20 20 73 71 6c 69 74 65 33 20  tats(.  sqlite3 
12d70 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
12d80 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
12d90 61 73 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a  ase to query */.
12da0 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41    ShellState *pA
12db0 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
12dc0 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
12dd0 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 29 7b  ShellState */.){
12de0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
12df0 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
12e00 53 54 41 54 55 53 0a 20 20 55 4e 55 53 45 44 5f  STATUS.  UNUSED_
12e10 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20  PARAMETER(db);. 
12e20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
12e30 52 28 70 41 72 67 29 3b 0a 23 65 6c 73 65 0a 20  R(pArg);.#else. 
12e40 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 2c 20 6d 78   int i, k, n, mx
12e50 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70  ;.  raw_printf(p
12e60 41 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d  Arg->out, "-----
12e70 2d 2d 2d 20 73 63 61 6e 73 74 61 74 73 20 2d 2d  --- scanstats --
12e80 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 6d 78  ------\n");.  mx
12e90 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6b 3d 30 3b   = 0;.  for(k=0;
12ea0 20 6b 3c 3d 6d 78 3b 20 6b 2b 2b 29 7b 0a 20 20   k<=mx; k++){.  
12eb0 20 20 64 6f 75 62 6c 65 20 72 45 73 74 4c 6f 6f    double rEstLoo
12ec0 70 20 3d 20 31 2e 30 3b 0a 20 20 20 20 66 6f 72  p = 1.0;.    for
12ed0 28 69 3d 6e 3d 30 3b 20 31 3b 20 69 2b 2b 29 7b  (i=n=0; 1; i++){
12ee0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
12ef0 74 6d 74 20 2a 70 20 3d 20 70 41 72 67 2d 3e 70  tmt *p = pArg->p
12f00 53 74 6d 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Stmt;.      sqli
12f10 74 65 33 5f 69 6e 74 36 34 20 6e 4c 6f 6f 70 2c  te3_int64 nLoop,
12f20 20 6e 56 69 73 69 74 3b 0a 20 20 20 20 20 20 64   nVisit;.      d
12f30 6f 75 62 6c 65 20 72 45 73 74 3b 0a 20 20 20 20  ouble rEst;.    
12f40 20 20 69 6e 74 20 69 53 69 64 3b 0a 20 20 20 20    int iSid;.    
12f50 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
12f60 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 69 66  xplain;.      if
12f70 28 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  ( sqlite3_stmt_s
12f80 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20  canstatus(p, i, 
12f90 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f  SQLITE_SCANSTAT_
12fa0 4e 4c 4f 4f 50 2c 20 28 76 6f 69 64 2a 29 26 6e  NLOOP, (void*)&n
12fb0 4c 6f 6f 70 29 20 29 7b 0a 20 20 20 20 20 20 20  Loop) ){.       
12fc0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
12fd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
12fe0 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 70 2c  mt_scanstatus(p,
12ff0 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53   i, SQLITE_SCANS
13000 54 41 54 5f 53 45 4c 45 43 54 49 44 2c 20 28 76  TAT_SELECTID, (v
13010 6f 69 64 2a 29 26 69 53 69 64 29 3b 0a 20 20 20  oid*)&iSid);.   
13020 20 20 20 69 66 28 20 69 53 69 64 3e 6d 78 20 29     if( iSid>mx )
13030 20 6d 78 20 3d 20 69 53 69 64 3b 0a 20 20 20 20   mx = iSid;.    
13040 20 20 69 66 28 20 69 53 69 64 21 3d 6b 20 29 20    if( iSid!=k ) 
13050 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
13060 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
13070 20 20 20 20 72 45 73 74 4c 6f 6f 70 20 3d 20 28      rEstLoop = (
13080 64 6f 75 62 6c 65 29 6e 4c 6f 6f 70 3b 0a 20 20  double)nLoop;.  
13090 20 20 20 20 20 20 69 66 28 20 6b 3e 30 20 29 20        if( k>0 ) 
130a0 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
130b0 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20  >out, "-------- 
130c0 73 75 62 71 75 65 72 79 20 25 64 20 2d 2d 2d 2d  subquery %d ----
130d0 2d 2d 2d 5c 6e 22 2c 20 6b 29 3b 0a 20 20 20 20  ---\n", k);.    
130e0 20 20 7d 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20    }.      n++;. 
130f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
13100 74 5f 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20  t_scanstatus(p, 
13110 69 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54  i, SQLITE_SCANST
13120 41 54 5f 4e 56 49 53 49 54 2c 20 28 76 6f 69 64  AT_NVISIT, (void
13130 2a 29 26 6e 56 69 73 69 74 29 3b 0a 20 20 20 20  *)&nVisit);.    
13140 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73    sqlite3_stmt_s
13150 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20  canstatus(p, i, 
13160 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f  SQLITE_SCANSTAT_
13170 45 53 54 2c 20 28 76 6f 69 64 2a 29 26 72 45 73  EST, (void*)&rEs
13180 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
13190 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75  3_stmt_scanstatu
131a0 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53  s(p, i, SQLITE_S
131b0 43 41 4e 53 54 41 54 5f 45 58 50 4c 41 49 4e 2c  CANSTAT_EXPLAIN,
131c0 20 28 76 6f 69 64 2a 29 26 7a 45 78 70 6c 61 69   (void*)&zExplai
131d0 6e 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  n);.      utf8_p
131e0 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
131f0 20 22 4c 6f 6f 70 20 25 32 64 3a 20 25 73 5c 6e   "Loop %2d: %s\n
13200 22 2c 20 6e 2c 20 7a 45 78 70 6c 61 69 6e 29 3b  ", n, zExplain);
13210 0a 20 20 20 20 20 20 72 45 73 74 4c 6f 6f 70 20  .      rEstLoop 
13220 2a 3d 20 72 45 73 74 3b 0a 20 20 20 20 20 20 72  *= rEst;.      r
13230 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
13240 6f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 22  out,.          "
13250 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f 70 3d 25           nLoop=%
13260 2d 38 6c 6c 64 20 6e 52 6f 77 3d 25 2d 38 6c 6c  -8lld nRow=%-8ll
13270 64 20 65 73 74 52 6f 77 3d 25 2d 38 6c 6c 64 20  d estRow=%-8lld 
13280 65 73 74 52 6f 77 2f 4c 6f 6f 70 3d 25 2d 38 67  estRow/Loop=%-8g
13290 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6e  \n",.          n
132a0 4c 6f 6f 70 2c 20 6e 56 69 73 69 74 2c 20 28 73  Loop, nVisit, (s
132b0 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 72 45  qlite3_int64)(rE
132c0 73 74 4c 6f 6f 70 2b 30 2e 35 29 2c 20 72 45 73  stLoop+0.5), rEs
132d0 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  t.      );.    }
132e0 0a 20 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74  .  }.  raw_print
132f0 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d  f(pArg->out, "--
13300 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13310 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 23  ---------\n");.#
13320 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  endif.}../*.** P
13330 61 72 61 6d 65 74 65 72 20 61 7a 41 72 72 61 79  arameter azArray
13340 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 7a 65 72   points to a zer
13350 6f 2d 74 65 72 6d 69 6e 61 74 65 64 20 61 72 72  o-terminated arr
13360 61 79 20 6f 66 20 73 74 72 69 6e 67 73 2e 20 7a  ay of strings. z
13370 53 74 72 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  Str.** points to
13380 20 61 20 73 69 6e 67 6c 65 20 6e 75 6c 2d 74 65   a single nul-te
13390 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e  rminated string.
133a0 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
133b0 20 69 66 20 7a 53 74 72 0a 2a 2a 20 69 73 20 65   if zStr.** is e
133c0 71 75 61 6c 2c 20 61 63 63 6f 72 64 69 6e 67 20  qual, according 
133d0 74 6f 20 73 74 72 63 6d 70 28 29 2c 20 74 6f 20  to strcmp(), to 
133e0 61 6e 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e  any of the strin
133f0 67 73 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e  gs in the array.
13400 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72  .** Otherwise, r
13410 65 74 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  eturn zero..*/.s
13420 74 61 74 69 63 20 69 6e 74 20 73 74 72 5f 69 6e  tatic int str_in
13430 5f 61 72 72 61 79 28 63 6f 6e 73 74 20 63 68 61  _array(const cha
13440 72 20 2a 7a 53 74 72 2c 20 63 6f 6e 73 74 20 63  r *zStr, const c
13450 68 61 72 20 2a 2a 61 7a 41 72 72 61 79 29 7b 0a  har **azArray){.
13460 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
13470 3d 30 3b 20 61 7a 41 72 72 61 79 5b 69 5d 3b 20  =0; azArray[i]; 
13480 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 30 3d  i++){.    if( 0=
13490 3d 73 74 72 63 6d 70 28 7a 53 74 72 2c 20 61 7a  =strcmp(zStr, az
134a0 41 72 72 61 79 5b 69 5d 29 20 29 20 72 65 74 75  Array[i]) ) retu
134b0 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
134c0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 0;.}../*.** I
134d0 66 20 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65  f compiled state
134e0 6d 65 6e 74 20 70 53 71 6c 20 61 70 70 65 61 72  ment pSql appear
134f0 73 20 74 6f 20 62 65 20 61 6e 20 45 58 50 4c 41  s to be an EXPLA
13500 49 4e 20 73 74 61 74 65 6d 65 6e 74 2c 20 61 6c  IN statement, al
13510 6c 6f 63 61 74 65 0a 2a 2a 20 61 6e 64 20 70 6f  locate.** and po
13520 70 75 6c 61 74 65 20 74 68 65 20 53 68 65 6c 6c  pulate the Shell
13530 53 74 61 74 65 2e 61 69 49 6e 64 65 6e 74 5b 5d  State.aiIndent[]
13540 20 61 72 72 61 79 20 77 69 74 68 20 74 68 65 20   array with the 
13550 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 73 70 61  number of.** spa
13560 63 65 73 20 65 61 63 68 20 6f 70 63 6f 64 65 20  ces each opcode 
13570 73 68 6f 75 6c 64 20 62 65 20 69 6e 64 65 6e 74  should be indent
13580 65 64 20 62 65 66 6f 72 65 20 69 74 20 69 73 20  ed before it is 
13590 6f 75 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  output..**.** Th
135a0 65 20 69 6e 64 65 6e 74 69 6e 67 20 72 75 6c 65  e indenting rule
135b0 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  s are:.**.**    
135c0 20 2a 20 46 6f 72 20 65 61 63 68 20 22 4e 65 78   * For each "Nex
135d0 74 22 2c 20 22 50 72 65 76 22 2c 20 22 56 4e 65  t", "Prev", "VNe
135e0 78 74 22 20 6f 72 20 22 56 50 72 65 76 22 20 69  xt" or "VPrev" i
135f0 6e 73 74 72 75 63 74 69 6f 6e 2c 20 69 6e 64 65  nstruction, inde
13600 6e 74 0a 2a 2a 20 20 20 20 20 20 20 61 6c 6c 20  nt.**       all 
13610 6f 70 63 6f 64 65 73 20 74 68 61 74 20 6f 63 63  opcodes that occ
13620 75 72 20 62 65 74 77 65 65 6e 20 74 68 65 20 70  ur between the p
13630 32 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  2 jump destinati
13640 6f 6e 20 61 6e 64 20 74 68 65 20 6f 70 63 6f 64  on and the opcod
13650 65 0a 2a 2a 20 20 20 20 20 20 20 69 74 73 65 6c  e.**       itsel
13660 66 20 62 79 20 32 20 73 70 61 63 65 73 2e 0a 2a  f by 2 spaces..*
13670 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 6f 72 20 65  *.**     * For e
13680 61 63 68 20 22 47 6f 74 6f 22 2c 20 69 66 20 74  ach "Goto", if t
13690 68 65 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74  he jump destinat
136a0 69 6f 6e 20 69 73 20 65 61 72 6c 69 65 72 20 69  ion is earlier i
136b0 6e 20 74 68 65 20 70 72 6f 67 72 61 6d 0a 2a 2a  n the program.**
136c0 20 20 20 20 20 20 20 61 6e 64 20 65 6e 64 73 20         and ends 
136d0 6f 6e 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 20 20 20  on one of:.**   
136e0 20 20 20 20 20 20 20 59 69 65 6c 64 20 20 53 65         Yield  Se
136f0 65 6b 47 74 20 20 53 65 65 6b 4c 74 20 20 52 6f  ekGt  SeekLt  Ro
13700 77 53 65 74 52 65 61 64 20 20 52 65 77 69 6e 64  wSetRead  Rewind
13710 0a 2a 2a 20 20 20 20 20 20 20 6f 72 20 69 66 20  .**       or if 
13720 74 68 65 20 50 31 20 70 61 72 61 6d 65 74 65 72  the P1 parameter
13730 20 69 73 20 6f 6e 65 20 69 6e 73 74 65 61 64 20   is one instead 
13740 6f 66 20 7a 65 72 6f 2c 0a 2a 2a 20 20 20 20 20  of zero,.**     
13750 20 20 74 68 65 6e 20 69 6e 64 65 6e 74 20 61 6c    then indent al
13760 6c 20 6f 70 63 6f 64 65 73 20 62 65 74 77 65 65  l opcodes betwee
13770 6e 20 74 68 65 20 65 61 72 6c 69 65 72 20 69 6e  n the earlier in
13780 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 20 20 20  struction.**    
13790 20 20 20 61 6e 64 20 22 47 6f 74 6f 22 20 62 79     and "Goto" by
137a0 20 32 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74   2 spaces..*/.st
137b0 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
137c0 6e 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28 53  n_data_prepare(S
137d0 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 73 71  hellState *p, sq
137e0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c  lite3_stmt *pSql
137f0 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
13800 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20  *zSql;          
13810 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74       /* The text
13820 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74 61 74   of the SQL stat
13830 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ement */.  const
13840 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20   char *z;       
13850 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
13860 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74  ed to check if t
13870 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49  his is an EXPLAI
13880 4e 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 62 59 69  N */.  int *abYi
13890 65 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  eld = 0;        
138a0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
138b0 66 20 6f 70 20 69 73 20 61 6e 20 4f 50 5f 59 69  f op is an OP_Yi
138c0 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c  eld */.  int nAl
138d0 6c 6f 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20  loc = 0;        
138e0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
138f0 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 70 2d  cated size of p-
13900 3e 61 69 49 6e 64 65 6e 74 5b 5d 2c 20 61 62 59  >aiIndent[], abY
13910 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  ield */.  int iO
13920 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
13930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
13940 65 78 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 20  ex of operation 
13950 69 6e 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 5d  in p->aiIndent[]
13960 20 2a 2f 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61   */..  const cha
13970 72 20 2a 61 7a 4e 65 78 74 5b 5d 20 3d 20 7b 20  r *azNext[] = { 
13980 22 4e 65 78 74 22 2c 20 22 50 72 65 76 22 2c 20  "Next", "Prev", 
13990 22 56 50 72 65 76 22 2c 20 22 56 4e 65 78 74 22  "VPrev", "VNext"
139a0 2c 20 22 53 6f 72 74 65 72 4e 65 78 74 22 2c 20  , "SorterNext", 
139b0 30 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  0 };.  const cha
139c0 72 20 2a 61 7a 59 69 65 6c 64 5b 5d 20 3d 20 7b  r *azYield[] = {
139d0 20 22 59 69 65 6c 64 22 2c 20 22 53 65 65 6b 4c   "Yield", "SeekL
139e0 54 22 2c 20 22 53 65 65 6b 47 54 22 2c 20 22 52  T", "SeekGT", "R
139f0 6f 77 53 65 74 52 65 61 64 22 2c 0a 20 20 20 20  owSetRead",.    
13a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13a10 20 20 20 20 20 20 20 20 22 52 65 77 69 6e 64 22          "Rewind"
13a20 2c 20 30 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63  , 0 };.  const c
13a30 68 61 72 20 2a 61 7a 47 6f 74 6f 5b 5d 20 3d 20  har *azGoto[] = 
13a40 7b 20 22 47 6f 74 6f 22 2c 20 30 20 7d 3b 0a 0a  { "Goto", 0 };..
13a50 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69 67 75    /* Try to figu
13a60 72 65 20 6f 75 74 20 69 66 20 74 68 69 73 20 69  re out if this i
13a70 73 20 72 65 61 6c 6c 79 20 61 6e 20 45 58 50 4c  s really an EXPL
13a80 41 49 4e 20 73 74 61 74 65 6d 65 6e 74 2e 20 49  AIN statement. I
13a90 66 20 74 68 69 73 0a 20 20 2a 2a 20 63 61 6e 6e  f this.  ** cann
13aa0 6f 74 20 62 65 20 76 65 72 69 66 69 65 64 2c 20  ot be verified, 
13ab0 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20 20 2a  return early.  *
13ac0 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  /.  if( sqlite3_
13ad0 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 71  column_count(pSq
13ae0 6c 29 21 3d 38 20 29 7b 0a 20 20 20 20 70 2d 3e  l)!=8 ){.    p->
13af0 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b  cMode = p->mode;
13b00 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
13b10 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
13b20 33 5f 73 71 6c 28 70 53 71 6c 29 3b 0a 20 20 69  3_sql(pSql);.  i
13b30 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74  f( zSql==0 ) ret
13b40 75 72 6e 3b 0a 20 20 66 6f 72 28 7a 3d 7a 53 71  urn;.  for(z=zSq
13b50 6c 3b 20 2a 7a 3d 3d 27 20 27 20 7c 7c 20 2a 7a  l; *z==' ' || *z
13b60 3d 3d 27 5c 74 27 20 7c 7c 20 2a 7a 3d 3d 27 5c  =='\t' || *z=='\
13b70 6e 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 66 27 20 7c  n' || *z=='\f' |
13b80 7c 20 2a 7a 3d 3d 27 5c 72 27 3b 20 7a 2b 2b 29  | *z=='\r'; z++)
13b90 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
13ba0 73 74 72 6e 69 63 6d 70 28 7a 2c 20 22 65 78 70  strnicmp(z, "exp
13bb0 6c 61 69 6e 22 2c 20 37 29 20 29 7b 0a 20 20 20  lain", 7) ){.   
13bc0 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d   p->cMode = p->m
13bd0 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  ode;.    return;
13be0 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 4f 70 3d  .  }..  for(iOp=
13bf0 30 3b 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  0; SQLITE_ROW==s
13c00 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c  qlite3_step(pSql
13c10 29 3b 20 69 4f 70 2b 2b 29 7b 0a 20 20 20 20 69  ); iOp++){.    i
13c20 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 69 41  nt i;.    int iA
13c30 64 64 72 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  ddr = sqlite3_co
13c40 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 30  lumn_int(pSql, 0
13c50 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  );.    const cha
13c60 72 20 2a 7a 4f 70 20 3d 20 28 63 6f 6e 73 74 20  r *zOp = (const 
13c70 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
13c80 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20  lumn_text(pSql, 
13c90 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20  1);..    /* Set 
13ca0 70 32 20 74 6f 20 74 68 65 20 50 32 20 66 69 65  p2 to the P2 fie
13cb0 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ld of the curren
13cc0 74 20 6f 70 63 6f 64 65 2e 20 54 68 65 6e 2c 20  t opcode. Then, 
13cd0 61 73 73 75 6d 69 6e 67 20 74 68 61 74 0a 20 20  assuming that.  
13ce0 20 20 2a 2a 20 70 32 20 69 73 20 61 6e 20 69 6e    ** p2 is an in
13cf0 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72 65 73  struction addres
13d00 73 2c 20 73 65 74 20 76 61 72 69 61 62 6c 65 20  s, set variable 
13d10 70 32 6f 70 20 74 6f 20 74 68 65 20 69 6e 64 65  p2op to the inde
13d20 78 20 6f 66 20 74 68 61 74 0a 20 20 20 20 2a 2a  x of that.    **
13d30 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 6e 20   instruction in 
13d40 74 68 65 20 61 69 49 6e 64 65 6e 74 5b 5d 20 61  the aiIndent[] a
13d50 72 72 61 79 2e 20 70 32 20 61 6e 64 20 70 32 6f  rray. p2 and p2o
13d60 70 20 6d 61 79 20 62 65 20 64 69 66 66 65 72 65  p may be differe
13d70 6e 74 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65  nt if.    ** the
13d80 20 63 75 72 72 65 6e 74 20 69 6e 73 74 72 75 63   current instruc
13d90 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f 66 20  tion is part of 
13da0 61 20 73 75 62 2d 70 72 6f 67 72 61 6d 20 67 65  a sub-program ge
13db0 6e 65 72 61 74 65 64 20 62 79 20 61 6e 0a 20 20  nerated by an.  
13dc0 20 20 2a 2a 20 53 51 4c 20 74 72 69 67 67 65 72    ** SQL trigger
13dd0 20 6f 72 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e   or foreign key.
13de0 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 70 32 20    */.    int p2 
13df0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
13e00 5f 69 6e 74 28 70 53 71 6c 2c 20 33 29 3b 0a 20  _int(pSql, 3);. 
13e10 20 20 20 69 6e 74 20 70 32 6f 70 20 3d 20 28 70     int p2op = (p
13e20 32 20 2b 20 28 69 4f 70 2d 69 41 64 64 72 29 29  2 + (iOp-iAddr))
13e30 3b 0a 0a 20 20 20 20 2f 2a 20 47 72 6f 77 20 74  ;..    /* Grow t
13e40 68 65 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20 61  he p->aiIndent a
13e50 72 72 61 79 20 61 73 20 72 65 71 75 69 72 65 64  rray as required
13e60 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 4f 70 3e   */.    if( iOp>
13e70 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20  =nAlloc ){.     
13e80 20 69 66 28 20 69 4f 70 3d 3d 30 20 29 7b 0a 20   if( iOp==0 ){. 
13e90 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 66 75 72         /* Do fur
13ea0 74 68 65 72 20 76 65 72 66 69 63 61 74 69 6f 6e  ther verfication
13eb0 20 74 68 61 74 20 74 68 69 73 20 69 73 20 65 78   that this is ex
13ec0 70 6c 61 69 6e 20 6f 75 74 70 75 74 2e 20 20 41  plain output.  A
13ed0 62 6f 72 74 20 69 66 0a 20 20 20 20 20 20 20 20  bort if.        
13ee0 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 2a 2f 0a  ** it is not */.
13ef0 20 20 20 20 20 20 20 20 73 74 61 74 69 63 20 63          static c
13f00 6f 6e 73 74 20 63 68 61 72 20 2a 65 78 70 6c 61  onst char *expla
13f10 69 6e 43 6f 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20  inCols[] = {.   
13f20 20 20 20 20 20 20 20 20 22 61 64 64 72 22 2c 20          "addr", 
13f30 22 6f 70 63 6f 64 65 22 2c 20 22 70 31 22 2c 20  "opcode", "p1", 
13f40 22 70 32 22 2c 20 22 70 33 22 2c 20 22 70 34 22  "p2", "p3", "p4"
13f50 2c 20 22 70 35 22 2c 20 22 63 6f 6d 6d 65 6e 74  , "p5", "comment
13f60 22 20 7d 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  " };.        int
13f70 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 66 6f 72   jj;.        for
13f80 28 6a 6a 3d 30 3b 20 6a 6a 3c 41 72 72 61 79 53  (jj=0; jj<ArrayS
13f90 69 7a 65 28 65 78 70 6c 61 69 6e 43 6f 6c 73 29  ize(explainCols)
13fa0 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; jj++){.       
13fb0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 73 71     if( strcmp(sq
13fc0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d  lite3_column_nam
13fd0 65 28 70 53 71 6c 2c 6a 6a 29 2c 65 78 70 6c 61  e(pSql,jj),expla
13fe0 69 6e 43 6f 6c 73 5b 6a 6a 5d 29 21 3d 30 20 29  inCols[jj])!=0 )
13ff0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 2d  {.            p-
14000 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65  >cMode = p->mode
14010 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ;.            sq
14020 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 71 6c  lite3_reset(pSql
14030 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
14040 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 20  eturn;.         
14050 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
14060 20 20 20 7d 0a 20 20 20 20 20 20 6e 41 6c 6c 6f     }.      nAllo
14070 63 20 2b 3d 20 31 30 30 3b 0a 20 20 20 20 20 20  c += 100;.      
14080 70 2d 3e 61 69 49 6e 64 65 6e 74 20 3d 20 28 69  p->aiIndent = (i
14090 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c  nt*)sqlite3_real
140a0 6c 6f 63 36 34 28 70 2d 3e 61 69 49 6e 64 65 6e  loc64(p->aiInden
140b0 74 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66  t, nAlloc*sizeof
140c0 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20 69 66  (int));.      if
140d0 28 20 70 2d 3e 61 69 49 6e 64 65 6e 74 3d 3d 30  ( p->aiIndent==0
140e0 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f   ) shell_out_of_
140f0 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20 20 20  memory();.      
14100 61 62 59 69 65 6c 64 20 3d 20 28 69 6e 74 2a 29  abYield = (int*)
14110 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36  sqlite3_realloc6
14120 34 28 61 62 59 69 65 6c 64 2c 20 6e 41 6c 6c 6f  4(abYield, nAllo
14130 63 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a  c*sizeof(int));.
14140 20 20 20 20 20 20 69 66 28 20 61 62 59 69 65 6c        if( abYiel
14150 64 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74  d==0 ) shell_out
14160 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20  _of_memory();.  
14170 20 20 7d 0a 20 20 20 20 61 62 59 69 65 6c 64 5b    }.    abYield[
14180 69 4f 70 5d 20 3d 20 73 74 72 5f 69 6e 5f 61 72  iOp] = str_in_ar
14190 72 61 79 28 7a 4f 70 2c 20 61 7a 59 69 65 6c 64  ray(zOp, azYield
141a0 29 3b 0a 20 20 20 20 70 2d 3e 61 69 49 6e 64 65  );.    p->aiInde
141b0 6e 74 5b 69 4f 70 5d 20 3d 20 30 3b 0a 20 20 20  nt[iOp] = 0;.   
141c0 20 70 2d 3e 6e 49 6e 64 65 6e 74 20 3d 20 69 4f   p->nIndent = iO
141d0 70 2b 31 3b 0a 0a 20 20 20 20 69 66 28 20 73 74  p+1;..    if( st
141e0 72 5f 69 6e 5f 61 72 72 61 79 28 7a 4f 70 2c 20  r_in_array(zOp, 
141f0 61 7a 4e 65 78 74 29 20 29 7b 0a 20 20 20 20 20  azNext) ){.     
14200 20 66 6f 72 28 69 3d 70 32 6f 70 3b 20 69 3c 69   for(i=p2op; i<i
14210 4f 70 3b 20 69 2b 2b 29 20 70 2d 3e 61 69 49 6e  Op; i++) p->aiIn
14220 64 65 6e 74 5b 69 5d 20 2b 3d 20 32 3b 0a 20 20  dent[i] += 2;.  
14230 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72 5f    }.    if( str_
14240 69 6e 5f 61 72 72 61 79 28 7a 4f 70 2c 20 61 7a  in_array(zOp, az
14250 47 6f 74 6f 29 20 26 26 20 70 32 6f 70 3c 70 2d  Goto) && p2op<p-
14260 3e 6e 49 6e 64 65 6e 74 0a 20 20 20 20 20 26 26  >nIndent.     &&
14270 20 28 61 62 59 69 65 6c 64 5b 70 32 6f 70 5d 20   (abYield[p2op] 
14280 7c 7c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  || sqlite3_colum
14290 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 32 29 29 0a  n_int(pSql, 2)).
142a0 20 20 20 20 29 7b 0a 20 20 20 20 20 20 66 6f 72      ){.      for
142b0 28 69 3d 70 32 6f 70 3b 20 69 3c 69 4f 70 3b 20  (i=p2op; i<iOp; 
142c0 69 2b 2b 29 20 70 2d 3e 61 69 49 6e 64 65 6e 74  i++) p->aiIndent
142d0 5b 69 5d 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 0a  [i] += 2;.    }.
142e0 20 20 7d 0a 0a 20 20 70 2d 3e 69 49 6e 64 65 6e    }..  p->iInden
142f0 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  t = 0;.  sqlite3
14300 5f 66 72 65 65 28 61 62 59 69 65 6c 64 29 3b 0a  _free(abYield);.
14310 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28    sqlite3_reset(
14320 70 53 71 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pSql);.}../*.** 
14330 46 72 65 65 20 74 68 65 20 61 72 72 61 79 20 61  Free the array a
14340 6c 6c 6f 63 61 74 65 64 20 62 79 20 65 78 70 6c  llocated by expl
14350 61 69 6e 5f 64 61 74 61 5f 70 72 65 70 61 72 65  ain_data_prepare
14360 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ()..*/.static vo
14370 69 64 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f  id explain_data_
14380 64 65 6c 65 74 65 28 53 68 65 6c 6c 53 74 61 74  delete(ShellStat
14390 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74 65 33  e *p){.  sqlite3
143a0 5f 66 72 65 65 28 70 2d 3e 61 69 49 6e 64 65 6e  _free(p->aiInden
143b0 74 29 3b 0a 20 20 70 2d 3e 61 69 49 6e 64 65 6e  t);.  p->aiInden
143c0 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 49 6e 64  t = 0;.  p->nInd
143d0 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 49  ent = 0;.  p->iI
143e0 6e 64 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a  ndent = 0;.}../*
143f0 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61 6e 64 20  .** Disable and 
14400 72 65 73 74 6f 72 65 20 2e 77 68 65 72 65 74 72  restore .wheretr
14410 61 63 65 20 61 6e 64 20 2e 73 65 6c 65 63 74 74  ace and .selectt
14420 72 61 63 65 20 73 65 74 74 69 6e 67 73 2e 0a 2a  race settings..*
14430 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
14440 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64  LITE_DEBUG) && d
14450 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
14460 41 42 4c 45 5f 53 45 4c 45 43 54 54 52 41 43 45  ABLE_SELECTTRACE
14470 29 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c  ).extern int sql
14480 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 3b  ite3SelectTrace;
14490 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76 65  .static int save
144a0 64 53 65 6c 65 63 74 54 72 61 63 65 3b 0a 23 65  dSelectTrace;.#e
144b0 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
144c0 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26  (SQLITE_DEBUG) &
144d0 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
144e0 5f 45 4e 41 42 4c 45 5f 57 48 45 52 45 54 52 41  _ENABLE_WHERETRA
144f0 43 45 29 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  CE).extern int s
14500 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
14510 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61 76  ;.static int sav
14520 65 64 57 68 65 72 65 54 72 61 63 65 3b 0a 23 65  edWhereTrace;.#e
14530 6e 64 69 66 0a 73 74 61 74 69 63 20 76 6f 69 64  ndif.static void
14540 20 64 69 73 61 62 6c 65 5f 64 65 62 75 67 5f 74   disable_debug_t
14550 72 61 63 65 5f 6d 6f 64 65 73 28 76 6f 69 64 29  race_modes(void)
14560 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  {.#if defined(SQ
14570 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64  LITE_DEBUG) && d
14580 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
14590 41 42 4c 45 5f 53 45 4c 45 43 54 54 52 41 43 45  ABLE_SELECTTRACE
145a0 29 0a 20 20 73 61 76 65 64 53 65 6c 65 63 74 54  ).  savedSelectT
145b0 72 61 63 65 20 3d 20 73 71 6c 69 74 65 33 53 65  race = sqlite3Se
145c0 6c 65 63 74 54 72 61 63 65 3b 0a 20 20 73 71 6c  lectTrace;.  sql
145d0 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20  ite3SelectTrace 
145e0 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  = 0;.#endif.#if 
145f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
14600 45 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64  EBUG) && defined
14610 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57  (SQLITE_ENABLE_W
14620 48 45 52 45 54 52 41 43 45 29 0a 20 20 73 61 76  HERETRACE).  sav
14630 65 64 57 68 65 72 65 54 72 61 63 65 20 3d 20 73  edWhereTrace = s
14640 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
14650 3b 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65  ;.  sqlite3Where
14660 54 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Trace = 0;.#endi
14670 66 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  f.}.static void 
14680 72 65 73 74 6f 72 65 5f 64 65 62 75 67 5f 74 72  restore_debug_tr
14690 61 63 65 5f 6d 6f 64 65 73 28 76 6f 69 64 29 7b  ace_modes(void){
146a0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
146b0 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64 65  ITE_DEBUG) && de
146c0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
146d0 42 4c 45 5f 53 45 4c 45 43 54 54 52 41 43 45 29  BLE_SELECTTRACE)
146e0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
146f0 54 72 61 63 65 20 3d 20 73 61 76 65 64 53 65 6c  Trace = savedSel
14700 65 63 74 54 72 61 63 65 3b 0a 23 65 6e 64 69 66  ectTrace;.#endif
14710 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
14720 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64 65  ITE_DEBUG) && de
14730 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
14740 42 4c 45 5f 57 48 45 52 45 54 52 41 43 45 29 0a  BLE_WHERETRACE).
14750 20 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72    sqlite3WhereTr
14760 61 63 65 20 3d 20 73 61 76 65 64 57 68 65 72 65  ace = savedWhere
14770 54 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 7d 0a  Trace;.#endif.}.
14780 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 70 72 65  ./*.** Run a pre
14790 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e 74 0a  pared statement.
147a0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
147b0 78 65 63 5f 70 72 65 70 61 72 65 64 5f 73 74 6d  xec_prepared_stm
147c0 74 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  t(.  ShellState 
147d0 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20 20 20  *pArg,          
147e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
147f0 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72        /* Pointer
14800 20 74 6f 20 53 68 65 6c 6c 53 74 61 74 65 20 2a   to ShellState *
14810 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  /.  sqlite3_stmt
14820 20 2a 70 53 74 6d 74 20 20 20 20 20 20 20 20 20   *pStmt         
14830 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14840 20 20 20 20 20 2f 2a 20 53 74 61 74 6d 65 6e 74       /* Statment
14850 20 74 6f 20 72 75 6e 20 2a 2f 0a 29 7b 0a 20 20   to run */.){.  
14860 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 70 65  int rc;..  /* pe
14870 72 66 6f 72 6d 20 74 68 65 20 66 69 72 73 74 20  rform the first 
14880 73 74 65 70 2e 20 20 74 68 69 73 20 77 69 6c 6c  step.  this will
14890 20 74 65 6c 6c 20 75 73 20 69 66 20 77 65 0a 20   tell us if we. 
148a0 20 2a 2a 20 68 61 76 65 20 61 20 72 65 73 75 6c   ** have a resul
148b0 74 20 73 65 74 20 6f 72 20 6e 6f 74 20 61 6e 64  t set or not and
148c0 20 68 6f 77 20 77 69 64 65 20 69 74 20 69 73 2e   how wide it is.
148d0 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71 6c  .  */.  rc = sql
148e0 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
148f0 3b 0a 20 20 2f 2a 20 69 66 20 77 65 20 68 61 76  ;.  /* if we hav
14900 65 20 61 20 72 65 73 75 6c 74 20 73 65 74 2e 2e  e a result set..
14910 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49 54  . */.  if( SQLIT
14920 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b 0a 20  E_ROW == rc ){. 
14930 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73     /* allocate s
14940 70 61 63 65 20 66 6f 72 20 63 6f 6c 20 6e 61 6d  pace for col nam
14950 65 20 70 74 72 2c 20 76 61 6c 75 65 20 70 74 72  e ptr, value ptr
14960 2c 20 61 6e 64 20 74 79 70 65 20 2a 2f 0a 20 20  , and type */.  
14970 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 73 71 6c    int nCol = sql
14980 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
14990 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 76 6f  t(pStmt);.    vo
149a0 69 64 20 2a 70 44 61 74 61 20 3d 20 73 71 6c 69  id *pData = sqli
149b0 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 33 2a 6e  te3_malloc64(3*n
149c0 43 6f 6c 2a 73 69 7a 65 6f 66 28 63 6f 6e 73 74  Col*sizeof(const
149d0 20 63 68 61 72 2a 29 20 2b 20 31 29 3b 0a 20 20   char*) + 1);.  
149e0 20 20 69 66 28 20 21 70 44 61 74 61 20 29 7b 0a    if( !pData ){.
149f0 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
14a00 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
14a10 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  se{.      char *
14a20 2a 61 7a 43 6f 6c 73 20 3d 20 28 63 68 61 72 20  *azCols = (char 
14a30 2a 2a 29 70 44 61 74 61 3b 20 20 20 20 20 20 2f  **)pData;      /
14a40 2a 20 4e 61 6d 65 73 20 6f 66 20 72 65 73 75 6c  * Names of resul
14a50 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20  t columns */.   
14a60 20 20 20 63 68 61 72 20 2a 2a 61 7a 56 61 6c 73     char **azVals
14a70 20 3d 20 26 61 7a 43 6f 6c 73 5b 6e 43 6f 6c 5d   = &azCols[nCol]
14a80 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c  ;       /* Resul
14a90 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
14aa0 2a 61 69 54 79 70 65 73 20 3d 20 28 69 6e 74 20  *aiTypes = (int 
14ab0 2a 29 26 61 7a 56 61 6c 73 5b 6e 43 6f 6c 5d 3b  *)&azVals[nCol];
14ac0 20 2f 2a 20 52 65 73 75 6c 74 20 74 79 70 65 73   /* Result types
14ad0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 2c   */.      int i,
14ae0 20 78 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   x;.      assert
14af0 28 73 69 7a 65 6f 66 28 69 6e 74 29 20 3c 3d 20  (sizeof(int) <= 
14b00 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 29 3b  sizeof(char *));
14b10 0a 20 20 20 20 20 20 2f 2a 20 73 61 76 65 20 6f  .      /* save o
14b20 66 66 20 70 74 72 73 20 74 6f 20 63 6f 6c 75 6d  ff ptrs to colum
14b30 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20 20  n names */.     
14b40 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c   for(i=0; i<nCol
14b50 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
14b60 61 7a 43 6f 6c 73 5b 69 5d 20 3d 20 28 63 68 61  azCols[i] = (cha
14b70 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  r *)sqlite3_colu
14b80 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 20 69  mn_name(pStmt, i
14b90 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
14ba0 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20   do{.        /* 
14bb0 65 78 74 72 61 63 74 20 74 68 65 20 64 61 74 61  extract the data
14bc0 20 61 6e 64 20 64 61 74 61 20 74 79 70 65 73 20   and data types 
14bd0 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  */.        for(i
14be0 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
14bf0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 69 54 79  {.          aiTy
14c00 70 65 73 5b 69 5d 20 3d 20 78 20 3d 20 73 71 6c  pes[i] = x = sql
14c10 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
14c20 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  (pStmt, i);.    
14c30 20 20 20 20 20 20 69 66 28 20 78 3d 3d 53 51 4c        if( x==SQL
14c40 49 54 45 5f 42 4c 4f 42 20 26 26 20 70 41 72 67  ITE_BLOB && pArg
14c50 20 26 26 20 70 41 72 67 2d 3e 63 4d 6f 64 65 3d   && pArg->cMode=
14c60 3d 4d 4f 44 45 5f 49 6e 73 65 72 74 20 29 7b 0a  =MODE_Insert ){.
14c70 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 56 61              azVa
14c80 6c 73 5b 69 5d 20 3d 20 22 22 3b 0a 20 20 20 20  ls[i] = "";.    
14c90 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
14ca0 20 20 20 20 20 20 20 20 20 61 7a 56 61 6c 73 5b           azVals[
14cb0 69 5d 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69  i] = (char*)sqli
14cc0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
14cd0 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
14ce0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
14cf0 20 69 66 28 20 21 61 7a 56 61 6c 73 5b 69 5d 20   if( !azVals[i] 
14d00 26 26 20 28 61 69 54 79 70 65 73 5b 69 5d 21 3d  && (aiTypes[i]!=
14d10 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a  SQLITE_NULL) ){.
14d20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
14d30 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
14d40 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
14d50 3b 20 2f 2a 20 66 72 6f 6d 20 66 6f 72 20 2a 2f  ; /* from for */
14d60 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
14d70 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 66 6f       } /* end fo
14d80 72 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20 2f 2a  r */..        /*
14d90 20 69 66 20 64 61 74 61 20 61 6e 64 20 74 79 70   if data and typ
14da0 65 73 20 65 78 74 72 61 63 74 65 64 20 73 75 63  es extracted suc
14db0 63 65 73 73 66 75 6c 6c 79 2e 2e 2e 20 2a 2f 0a  cessfully... */.
14dc0 20 20 20 20 20 20 20 20 69 66 28 20 53 51 4c 49          if( SQLI
14dd0 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b 0a  TE_ROW == rc ){.
14de0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 61 6c            /* cal
14df0 6c 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 63  l the supplied c
14e00 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65  allback with the
14e10 20 72 65 73 75 6c 74 20 72 6f 77 20 64 61 74 61   result row data
14e20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
14e30 28 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b  ( shell_callback
14e40 28 70 41 72 67 2c 20 6e 43 6f 6c 2c 20 61 7a 56  (pArg, nCol, azV
14e50 61 6c 73 2c 20 61 7a 43 6f 6c 73 2c 20 61 69 54  als, azCols, aiT
14e60 79 70 65 73 29 20 29 7b 0a 20 20 20 20 20 20 20  ypes) ){.       
14e70 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
14e80 5f 41 42 4f 52 54 3b 0a 20 20 20 20 20 20 20 20  _ABORT;.        
14e90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
14ea0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
14eb0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
14ec0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
14ed0 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 77 68 69     }.      } whi
14ee0 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 20 3d  le( SQLITE_ROW =
14ef0 3d 20 72 63 20 29 3b 0a 20 20 20 20 20 20 73 71  = rc );.      sq
14f00 6c 69 74 65 33 5f 66 72 65 65 28 70 44 61 74 61  lite3_free(pData
14f10 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
14f20 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
14f30 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
14f40 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
14f50 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 74  tion is called t
14f60 6f 20 70 72 6f 63 65 73 73 20 53 51 4c 20 69 66  o process SQL if
14f70 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 73 68   the previous sh
14f80 65 6c 6c 20 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 77  ell command.** w
14f90 61 73 20 22 2e 65 78 70 65 72 74 22 2e 20 49 74  as ".expert". It
14fa0 20 70 61 73 73 65 73 20 74 68 65 20 53 51 4c 20   passes the SQL 
14fb0 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72  in the second ar
14fc0 67 75 6d 65 6e 74 20 64 69 72 65 63 74 6c 79 20  gument directly 
14fd0 74 6f 0a 2a 2a 20 74 68 65 20 73 71 6c 69 74 65  to.** the sqlite
14fe0 33 65 78 70 65 72 74 20 6f 62 6a 65 63 74 2e 0a  3expert object..
14ff0 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
15000 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
15010 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
15020 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65  rwise, an SQLite
15030 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 2e 20   error.** code. 
15040 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 28 2a  In this case, (*
15050 70 7a 45 72 72 29 20 6d 61 79 20 62 65 20 73 65  pzErr) may be se
15060 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  t to point to a 
15070 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
15080 67 0a 2a 2a 20 61 6e 20 45 6e 67 6c 69 73 68 20  g.** an English 
15090 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20 6d  language error m
150a0 65 73 73 61 67 65 2e 20 49 74 20 69 73 20 74 68  essage. It is th
150b0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
150c0 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65   of the.** calle
150d0 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
150e0 66 72 65 65 20 74 68 69 73 20 62 75 66 66 65 72  free this buffer
150f0 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66   using sqlite3_f
15100 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ree()..*/.static
15110 20 69 6e 74 20 65 78 70 65 72 74 48 61 6e 64 6c   int expertHandl
15120 65 53 51 4c 28 0a 20 20 53 68 65 6c 6c 53 74 61  eSQL(.  ShellSta
15130 74 65 20 2a 70 53 74 61 74 65 2c 20 0a 20 20 63  te *pState, .  c
15140 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c  onst char *zSql,
15150 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72   .  char **pzErr
15160 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 53  .){.  assert( pS
15170 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78  tate->expert.pEx
15180 70 65 72 74 20 29 3b 0a 20 20 61 73 73 65 72 74  pert );.  assert
15190 28 20 70 7a 45 72 72 3d 3d 30 20 7c 7c 20 2a 70  ( pzErr==0 || *p
151a0 7a 45 72 72 3d 3d 30 20 29 3b 0a 20 20 72 65 74  zErr==0 );.  ret
151b0 75 72 6e 20 73 71 6c 69 74 65 33 5f 65 78 70 65  urn sqlite3_expe
151c0 72 74 5f 73 71 6c 28 70 53 74 61 74 65 2d 3e 65  rt_sql(pState->e
151d0 78 70 65 72 74 2e 70 45 78 70 65 72 74 2c 20 7a  xpert.pExpert, z
151e0 53 71 6c 2c 20 70 7a 45 72 72 29 3b 0a 7d 0a 0a  Sql, pzErr);.}..
151f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
15200 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20 65 69  ion is called ei
15210 74 68 65 72 20 74 6f 20 73 69 6c 65 6e 74 6c 79  ther to silently
15220 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20 6f 62   clean up the ob
15230 6a 65 63 74 0a 2a 2a 20 63 72 65 61 74 65 64 20  ject.** created 
15240 62 79 20 74 68 65 20 22 2e 65 78 70 65 72 74 22  by the ".expert"
15250 20 63 6f 6d 6d 61 6e 64 20 28 69 66 20 62 43 61   command (if bCa
15260 6e 63 65 6c 3d 3d 31 29 2c 20 6f 72 20 74 6f 20  ncel==1), or to 
15270 67 65 6e 65 72 61 74 65 20 61 20 0a 2a 2a 20 72  generate a .** r
15280 65 70 6f 72 74 20 66 72 6f 6d 20 69 74 20 61 6e  eport from it an
15290 64 20 74 68 65 6e 20 63 6c 65 61 6e 20 69 74 20  d then clean it 
152a0 75 70 20 28 69 66 20 62 43 61 6e 63 65 6c 3d 3d  up (if bCancel==
152b0 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63  0)..**.** If suc
152c0 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f  cessful, SQLITE_
152d0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  OK is returned. 
152e0 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51  Otherwise, an SQ
152f0 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f  Lite error.** co
15300 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65  de. In this case
15310 2c 20 28 2a 70 7a 45 72 72 29 20 6d 61 79 20 62  , (*pzErr) may b
15320 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74  e set to point t
15330 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61  o a buffer conta
15340 69 6e 69 6e 67 0a 2a 2a 20 61 6e 20 45 6e 67 6c  ining.** an Engl
15350 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72  ish language err
15360 6f 72 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69  or message. It i
15370 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69  s the responsibi
15380 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63  lity of the.** c
15390 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61  aller to eventua
153a0 6c 6c 79 20 66 72 65 65 20 74 68 69 73 20 62 75  lly free this bu
153b0 66 66 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74  ffer using sqlit
153c0 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74  e3_free()..*/.st
153d0 61 74 69 63 20 69 6e 74 20 65 78 70 65 72 74 46  atic int expertF
153e0 69 6e 69 73 68 28 0a 20 20 53 68 65 6c 6c 53 74  inish(.  ShellSt
153f0 61 74 65 20 2a 70 53 74 61 74 65 2c 0a 20 20 69  ate *pState,.  i
15400 6e 74 20 62 43 61 6e 63 65 6c 2c 0a 20 20 63 68  nt bCancel,.  ch
15410 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20  ar **pzErr.){.  
15420 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
15430 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 65 78 70  OK;.  sqlite3exp
15440 65 72 74 20 2a 70 20 3d 20 70 53 74 61 74 65 2d  ert *p = pState-
15450 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 3b  >expert.pExpert;
15460 0a 20 20 61 73 73 65 72 74 28 20 70 20 29 3b 0a  .  assert( p );.
15470 20 20 61 73 73 65 72 74 28 20 62 43 61 6e 63 65    assert( bCance
15480 6c 20 7c 7c 20 70 7a 45 72 72 3d 3d 30 20 7c 7c  l || pzErr==0 ||
15490 20 2a 70 7a 45 72 72 3d 3d 30 20 29 3b 0a 20 20   *pzErr==0 );.  
154a0 69 66 28 20 62 43 61 6e 63 65 6c 3d 3d 30 20 29  if( bCancel==0 )
154b0 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20  {.    FILE *out 
154c0 3d 20 70 53 74 61 74 65 2d 3e 6f 75 74 3b 0a 20  = pState->out;. 
154d0 20 20 20 69 6e 74 20 62 56 65 72 62 6f 73 65 20     int bVerbose 
154e0 3d 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74  = pState->expert
154f0 2e 62 56 65 72 62 6f 73 65 3b 0a 0a 20 20 20 20  .bVerbose;..    
15500 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70  rc = sqlite3_exp
15510 65 72 74 5f 61 6e 61 6c 79 7a 65 28 70 2c 20 70  ert_analyze(p, p
15520 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 72  zErr);.    if( r
15530 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
15540 20 20 20 20 20 20 69 6e 74 20 6e 51 75 65 72 79        int nQuery
15550 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72   = sqlite3_exper
15560 74 5f 63 6f 75 6e 74 28 70 29 3b 0a 20 20 20 20  t_count(p);.    
15570 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 20 20    int i;..      
15580 69 66 28 20 62 56 65 72 62 6f 73 65 20 29 7b 0a  if( bVerbose ){.
15590 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
155a0 61 72 20 2a 7a 43 61 6e 64 20 3d 20 73 71 6c 69  ar *zCand = sqli
155b0 74 65 33 5f 65 78 70 65 72 74 5f 72 65 70 6f 72  te3_expert_repor
155c0 74 28 70 2c 30 2c 45 58 50 45 52 54 5f 52 45 50  t(p,0,EXPERT_REP
155d0 4f 52 54 5f 43 41 4e 44 49 44 41 54 45 53 29 3b  ORT_CANDIDATES);
155e0 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
155f0 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 43 61 6e  ntf(out, "-- Can
15600 64 69 64 61 74 65 73 20 2d 2d 2d 2d 2d 2d 2d 2d  didates --------
15610 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
15620 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 20 20 20  -----\n");.     
15630 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
15640 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 43 61 6e 64  t, "%s\n", zCand
15650 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
15660 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 51 75 65   for(i=0; i<nQue
15670 72 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ry; i++){.      
15680 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
15690 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70  ql = sqlite3_exp
156a0 65 72 74 5f 72 65 70 6f 72 74 28 70 2c 20 69 2c  ert_report(p, i,
156b0 20 45 58 50 45 52 54 5f 52 45 50 4f 52 54 5f 53   EXPERT_REPORT_S
156c0 51 4c 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  QL);.        con
156d0 73 74 20 63 68 61 72 20 2a 7a 49 64 78 20 3d 20  st char *zIdx = 
156e0 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 72  sqlite3_expert_r
156f0 65 70 6f 72 74 28 70 2c 20 69 2c 20 45 58 50 45  eport(p, i, EXPE
15700 52 54 5f 52 45 50 4f 52 54 5f 49 4e 44 45 58 45  RT_REPORT_INDEXE
15710 53 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  S);.        cons
15720 74 20 63 68 61 72 20 2a 7a 45 51 50 20 3d 20 73  t char *zEQP = s
15730 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 72 65  qlite3_expert_re
15740 70 6f 72 74 28 70 2c 20 69 2c 20 45 58 50 45 52  port(p, i, EXPER
15750 54 5f 52 45 50 4f 52 54 5f 50 4c 41 4e 29 3b 0a  T_REPORT_PLAN);.
15760 20 20 20 20 20 20 20 20 69 66 28 20 7a 49 64 78          if( zIdx
15770 3d 3d 30 20 29 20 7a 49 64 78 20 3d 20 22 28 6e  ==0 ) zIdx = "(n
15780 6f 20 6e 65 77 20 69 6e 64 65 78 65 73 29 5c 6e  o new indexes)\n
15790 22 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62  ";.        if( b
157a0 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20  Verbose ){.     
157b0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
157c0 6f 75 74 2c 20 22 2d 2d 20 51 75 65 72 79 20 25  out, "-- Query %
157d0 64 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  d --------------
157e0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
157f0 2d 2d 5c 6e 22 2c 69 2b 31 29 3b 0a 20 20 20 20  --\n",i+1);.    
15800 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
15810 28 6f 75 74 2c 20 22 25 73 5c 6e 5c 6e 22 2c 20  (out, "%s\n\n", 
15820 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  zSql);.        }
15830 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
15840 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  ntf(out, "%s\n",
15850 20 7a 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20   zIdx);.        
15860 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
15870 22 25 73 5c 6e 22 2c 20 7a 45 51 50 29 3b 0a 20  "%s\n", zEQP);. 
15880 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
15890 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72  .  sqlite3_exper
158a0 74 5f 64 65 73 74 72 6f 79 28 70 29 3b 0a 20 20  t_destroy(p);.  
158b0 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70  pState->expert.p
158c0 45 78 70 65 72 74 20 3d 20 30 3b 0a 20 20 72 65  Expert = 0;.  re
158d0 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
158e0 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
158f0 20 6f 66 20 22 2e 65 78 70 65 72 74 22 20 64 6f   of ".expert" do
15900 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74  t command..*/.st
15910 61 74 69 63 20 69 6e 74 20 65 78 70 65 72 74 44  atic int expertD
15920 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 53 68 65  otCommand(.  She
15930 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c  llState *pState,
15940 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
15950 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f  Current shell to
15960 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 63 68  ol state */.  ch
15970 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20  ar **azArg,     
15980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
15990 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65   Array of argume
159a0 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 64 6f  nts passed to do
159b0 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  t command */.  i
159c0 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20 20 20  nt nArg         
159d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
159e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
159f0 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a  ies in azArg[] *
15a00 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20  /.){.  int rc = 
15a10 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61  SQLITE_OK;.  cha
15a20 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 69  r *zErr = 0;.  i
15a30 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 53 61 6d  nt i;.  int iSam
15a40 70 6c 65 20 3d 20 30 3b 0a 0a 20 20 61 73 73 65  ple = 0;..  asse
15a50 72 74 28 20 70 53 74 61 74 65 2d 3e 65 78 70 65  rt( pState->expe
15a60 72 74 2e 70 45 78 70 65 72 74 3d 3d 30 20 29 3b  rt.pExpert==0 );
15a70 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 74 61 74  .  memset(&pStat
15a80 65 2d 3e 65 78 70 65 72 74 2c 20 30 2c 20 73 69  e->expert, 0, si
15a90 7a 65 6f 66 28 45 78 70 65 72 74 49 6e 66 6f 29  zeof(ExpertInfo)
15aa0 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 31 3b 20 72  );..  for(i=1; r
15ab0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
15ac0 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
15ad0 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72    char *z = azAr
15ae0 67 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20 6e 3b  g[i];.    int n;
15af0 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27  .    if( z[0]=='
15b00 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20  -' && z[1]=='-' 
15b10 29 20 7a 2b 2b 3b 0a 20 20 20 20 6e 20 3d 20 73  ) z++;.    n = s
15b20 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20  trlen30(z);.    
15b30 69 66 28 20 6e 3e 3d 32 20 26 26 20 30 3d 3d 73  if( n>=2 && 0==s
15b40 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 76 65 72 62  trncmp(z, "-verb
15b50 6f 73 65 22 2c 20 6e 29 20 29 7b 0a 20 20 20 20  ose", n) ){.    
15b60 20 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74    pState->expert
15b70 2e 62 56 65 72 62 6f 73 65 20 3d 20 31 3b 0a 20  .bVerbose = 1;. 
15b80 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66     }.    else if
15b90 28 20 6e 3e 3d 32 20 26 26 20 30 3d 3d 73 74 72  ( n>=2 && 0==str
15ba0 6e 63 6d 70 28 7a 2c 20 22 2d 73 61 6d 70 6c 65  ncmp(z, "-sample
15bb0 22 2c 20 6e 29 20 29 7b 0a 20 20 20 20 20 20 69  ", n) ){.      i
15bc0 66 28 20 69 3d 3d 28 6e 41 72 67 2d 31 29 20 29  f( i==(nArg-1) )
15bd0 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
15be0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6f 70  intf(stderr, "op
15bf0 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e  tion requires an
15c00 20 61 72 67 75 6d 65 6e 74 3a 20 25 73 5c 6e 22   argument: %s\n"
15c10 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 72 63  , z);.        rc
15c20 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
15c30 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
15c40 20 20 20 20 20 20 69 53 61 6d 70 6c 65 20 3d 20        iSample = 
15c50 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75  (int)integerValu
15c60 65 28 61 7a 41 72 67 5b 2b 2b 69 5d 29 3b 0a 20  e(azArg[++i]);. 
15c70 20 20 20 20 20 20 20 69 66 28 20 69 53 61 6d 70         if( iSamp
15c80 6c 65 3c 30 20 7c 7c 20 69 53 61 6d 70 6c 65 3e  le<0 || iSample>
15c90 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  100 ){.         
15ca0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
15cb0 72 72 2c 20 22 76 61 6c 75 65 20 6f 75 74 20 6f  rr, "value out o
15cc0 66 20 72 61 6e 67 65 3a 20 25 73 5c 6e 22 2c 20  f range: %s\n", 
15cd0 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20  azArg[i]);.     
15ce0 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
15cf0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
15d00 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
15d10 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20 20 20      else{.      
15d20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
15d30 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69  r, "unknown opti
15d40 6f 6e 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20  on: %s\n", z);. 
15d50 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
15d60 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
15d70 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
15d80 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 70 53  ITE_OK ){.    pS
15d90 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78  tate->expert.pEx
15da0 70 65 72 74 20 3d 20 73 71 6c 69 74 65 33 5f 65  pert = sqlite3_e
15db0 78 70 65 72 74 5f 6e 65 77 28 70 53 74 61 74 65  xpert_new(pState
15dc0 2d 3e 64 62 2c 20 26 7a 45 72 72 29 3b 0a 20 20  ->db, &zErr);.  
15dd0 20 20 69 66 28 20 70 53 74 61 74 65 2d 3e 65 78    if( pState->ex
15de0 70 65 72 74 2e 70 45 78 70 65 72 74 3d 3d 30 20  pert.pExpert==0 
15df0 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
15e00 6e 74 66 28 73 74 64 65 72 72 2c 20 22 73 71 6c  ntf(stderr, "sql
15e10 69 74 65 33 5f 65 78 70 65 72 74 5f 6e 65 77 3a  ite3_expert_new:
15e20 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20   %s\n", zErr);. 
15e30 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45       rc = SQLITE
15e40 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65 6c 73  _ERROR;.    }els
15e50 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e{.      sqlite3
15e60 5f 65 78 70 65 72 74 5f 63 6f 6e 66 69 67 28 0a  _expert_config(.
15e70 20 20 20 20 20 20 20 20 20 20 70 53 74 61 74 65            pState
15e80 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74  ->expert.pExpert
15e90 2c 20 45 58 50 45 52 54 5f 43 4f 4e 46 49 47 5f  , EXPERT_CONFIG_
15ea0 53 41 4d 50 4c 45 2c 20 69 53 61 6d 70 6c 65 0a  SAMPLE, iSample.
15eb0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20        );.    }. 
15ec0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
15ed0 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69 66 6e  .}.#endif /* ifn
15ee0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
15ef0 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a 2f 0a  VIRTUALTABLE */.
15f00 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65  .static void she
15f10 6c 6c 50 72 65 70 61 72 65 28 0a 20 20 73 71 6c  llPrepare(.  sql
15f20 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74  ite3 *db, .  int
15f30 20 2a 70 52 63 2c 20 0a 20 20 63 6f 6e 73 74 20   *pRc, .  const 
15f40 63 68 61 72 20 2a 7a 53 71 6c 2c 20 0a 20 20 73  char *zSql, .  s
15f50 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70  qlite3_stmt **pp
15f60 53 74 6d 74 0a 29 7b 0a 20 20 2a 70 70 53 74 6d  Stmt.){.  *ppStm
15f70 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52  t = 0;.  if( *pR
15f80 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
15f90 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
15fa0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
15fb0 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 70 70  db, zSql, -1, pp
15fc0 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  Stmt, 0);.    if
15fd0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
15fe0 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
15ff0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 73 71 6c  ntf(stderr, "sql
16000 20 65 72 72 6f 72 3a 20 25 73 20 28 25 64 29 5c   error: %s (%d)\
16010 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73  n", .          s
16020 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62  qlite3_errmsg(db
16030 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 63 6f  ), sqlite3_errco
16040 64 65 28 64 62 29 0a 20 20 20 20 20 20 29 3b 0a  de(db).      );.
16050 20 20 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b        *pRc = rc;
16060 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74  .    }.  }.}..st
16070 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 45  atic void shellE
16080 78 65 63 50 72 69 6e 74 66 28 0a 20 20 73 71 6c  xecPrintf(.  sql
16090 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74  ite3 *db, .  int
160a0 20 2a 70 52 63 2c 20 0a 20 20 63 6f 6e 73 74 20   *pRc, .  const 
160b0 63 68 61 72 20 2a 7a 46 6d 74 2c 20 0a 20 20 2e  char *zFmt, .  .
160c0 2e 2e 0a 29 7b 0a 20 20 69 66 28 20 2a 70 52 63  ...){.  if( *pRc
160d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
160e0 20 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20     va_list ap;. 
160f0 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20     char *z;.    
16100 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d  va_start(ap, zFm
16110 74 29 3b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69  t);.    z = sqli
16120 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d  te3_vmprintf(zFm
16130 74 2c 20 61 70 29 3b 0a 20 20 20 20 76 61 5f 65  t, ap);.    va_e
16140 6e 64 28 61 70 29 3b 0a 20 20 20 20 69 66 28 20  nd(ap);.    if( 
16150 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70  z==0 ){.      *p
16160 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  Rc = SQLITE_NOME
16170 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  M;.    }else{.  
16180 20 20 20 20 2a 70 52 63 20 3d 20 73 71 6c 69 74      *pRc = sqlit
16190 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 2c 20 30  e3_exec(db, z, 0
161a0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
161b0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
161c0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61      }.  }.}..sta
161d0 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 50 72  tic void shellPr
161e0 65 70 61 72 65 50 72 69 6e 74 66 28 0a 20 20 73  eparePrintf(.  s
161f0 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20 69  qlite3 *db, .  i
16200 6e 74 20 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69  nt *pRc, .  sqli
16210 74 65 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d  te3_stmt **ppStm
16220 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  t,.  const char 
16230 2a 7a 46 6d 74 2c 20 0a 20 20 2e 2e 2e 0a 29 7b  *zFmt, .  ....){
16240 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a  .  *ppStmt = 0;.
16250 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49    if( *pRc==SQLI
16260 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 76 61 5f  TE_OK ){.    va_
16270 6c 69 73 74 20 61 70 3b 0a 20 20 20 20 63 68 61  list ap;.    cha
16280 72 20 2a 7a 3b 0a 20 20 20 20 76 61 5f 73 74 61  r *z;.    va_sta
16290 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20  rt(ap, zFmt);.  
162a0 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d    z = sqlite3_vm
162b0 70 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29  printf(zFmt, ap)
162c0 3b 0a 20 20 20 20 76 61 5f 65 6e 64 28 61 70 29  ;.    va_end(ap)
162d0 3b 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29  ;.    if( z==0 )
162e0 7b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 53  {.      *pRc = S
162f0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
16300 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 68   }else{.      sh
16310 65 6c 6c 50 72 65 70 61 72 65 28 64 62 2c 20 70  ellPrepare(db, p
16320 52 63 2c 20 7a 2c 20 70 70 53 74 6d 74 29 3b 0a  Rc, z, ppStmt);.
16330 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
16340 65 65 28 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  ee(z);.    }.  }
16350 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
16360 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 0a 20  shellFinalize(. 
16370 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 73 71   int *pRc, .  sq
16380 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
16390 74 0a 29 7b 0a 20 20 69 66 28 20 70 53 74 6d 74  t.){.  if( pStmt
163a0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   ){.    sqlite3 
163b0 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 64 62  *db = sqlite3_db
163c0 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 3b 0a  _handle(pStmt);.
163d0 20 20 20 20 69 6e 74 20 72 63 20 3d 20 73 71 6c      int rc = sql
163e0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
163f0 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 2a 70  tmt);.    if( *p
16400 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  Rc==SQLITE_OK ){
16410 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
16420 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
16430 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
16440 74 64 65 72 72 2c 20 22 53 51 4c 20 65 72 72 6f  tderr, "SQL erro
16450 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  r: %s\n", sqlite
16460 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
16470 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2a 70 52       }.      *pR
16480 63 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  c = rc;.    }.  
16490 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
164a0 20 73 68 65 6c 6c 52 65 73 65 74 28 0a 20 20 69   shellReset(.  i
164b0 6e 74 20 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69  nt *pRc, .  sqli
164c0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 0a  te3_stmt *pStmt.
164d0 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 73 71  ){.  int rc = sq
164e0 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
164f0 74 29 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d  t);.  if( *pRc==
16500 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
16510 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
16520 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  OK ){.      sqli
16530 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65  te3 *db = sqlite
16540 33 5f 64 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d  3_db_handle(pStm
16550 74 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  t);.      raw_pr
16560 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 51  intf(stderr, "SQ
16570 4c 20 65 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20  L error: %s\n", 
16580 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
16590 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a  b));.    }.    *
165a0 70 52 63 20 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a  pRc = rc;.  }.}.
165b0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68 61 72  .static int shar
165c0 65 64 53 63 68 65 6d 61 46 69 78 28 53 68 65 6c  edSchemaFix(Shel
165d0 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20  lState *pState, 
165e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c  const char *zDb,
165f0 20 69 6e 74 20 65 46 69 78 29 7b 0a 20 20 69 6e   int eFix){.  in
16600 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
16610 3b 0a 20 20 69 36 34 20 69 4c 61 73 74 20 3d 20  ;.  i64 iLast = 
16620 30 3b 0a 20 20 69 6e 74 20 69 43 6f 6f 6b 69 65  0;.  int iCookie
16630 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 41 75 74   = 0;.  int iAut
16640 6f 56 61 63 75 75 6d 20 3d 20 30 3b 0a 20 20 73  oVacuum = 0;.  s
16650 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
16660 6d 74 20 3d 20 30 3b 0a 0a 20 20 73 68 65 6c 6c  mt = 0;..  shell
16670 45 78 65 63 50 72 69 6e 74 66 28 70 53 74 61 74  ExecPrintf(pStat
16680 65 2d 3e 64 62 2c 20 26 72 63 2c 20 22 41 54 54  e->db, &rc, "ATT
16690 41 43 48 20 27 25 71 27 20 41 53 20 5f 73 68 61  ACH '%q' AS _sha
166a0 72 65 64 5f 73 63 68 65 6d 61 5f 74 6d 70 22 2c  red_schema_tmp",
166b0 20 7a 44 62 29 3b 0a 20 20 73 68 65 6c 6c 45 78   zDb);.  shellEx
166c0 65 63 50 72 69 6e 74 66 28 70 53 74 61 74 65 2d  ecPrintf(pState-
166d0 3e 64 62 2c 20 26 72 63 2c 20 22 50 52 41 47 4d  >db, &rc, "PRAGM
166e0 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
166f0 61 20 3d 20 31 22 29 3b 0a 20 20 73 68 65 6c 6c  a = 1");.  shell
16700 45 78 65 63 50 72 69 6e 74 66 28 70 53 74 61 74  ExecPrintf(pStat
16710 65 2d 3e 64 62 2c 20 26 72 63 2c 20 22 42 45 47  e->db, &rc, "BEG
16720 49 4e 22 29 3b 0a 20 20 73 68 65 6c 6c 50 72 65  IN");.  shellPre
16730 70 61 72 65 50 72 69 6e 74 66 28 70 53 74 61 74  parePrintf(pStat
16740 65 2d 3e 64 62 2c 20 26 72 63 2c 20 26 70 53 74  e->db, &rc, &pSt
16750 6d 74 2c 20 0a 20 20 20 20 20 20 22 53 45 4c 45  mt, .      "SELE
16760 43 54 20 6d 61 78 28 72 6f 77 69 64 29 20 46 52  CT max(rowid) FR
16770 4f 4d 20 5f 73 68 61 72 65 64 5f 73 63 68 65 6d  OM _shared_schem
16780 61 5f 74 6d 70 2e 73 71 6c 69 74 65 5f 6d 61 73  a_tmp.sqlite_mas
16790 74 65 72 22 0a 20 20 29 3b 0a 20 20 73 71 6c 69  ter".  );.  sqli
167a0 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b  te3_step(pStmt);
167b0 0a 20 20 69 4c 61 73 74 20 3d 20 73 71 6c 69 74  .  iLast = sqlit
167c0 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
167d0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 73 68 65  pStmt, 0);.  she
167e0 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20  llFinalize(&rc, 
167f0 70 53 74 6d 74 29 3b 0a 20 20 73 68 65 6c 6c 50  pStmt);.  shellP
16800 72 65 70 61 72 65 50 72 69 6e 74 66 28 70 53 74  reparePrintf(pSt
16810 61 74 65 2d 3e 64 62 2c 20 26 72 63 2c 20 26 70  ate->db, &rc, &p
16820 53 74 6d 74 2c 0a 20 20 20 20 20 20 22 49 4e 53  Stmt,.      "INS
16830 45 52 54 20 49 4e 54 4f 20 5f 73 68 61 72 65 64  ERT INTO _shared
16840 5f 73 63 68 65 6d 61 5f 74 6d 70 2e 73 71 6c 69  _schema_tmp.sqli
16850 74 65 5f 6d 61 73 74 65 72 20 53 45 4c 45 43 54  te_master SELECT
16860 20 22 0a 20 20 20 20 20 20 22 20 20 74 79 70 65   ".      "  type
16870 2c 20 6e 61 6d 65 2c 20 74 62 6c 5f 6e 61 6d 65  , name, tbl_name
16880 2c 20 28 22 0a 20 20 20 20 20 20 22 20 20 20 20  , (".      "    
16890 53 45 4c 45 43 54 20 72 6f 6f 74 70 61 67 65 20  SELECT rootpage 
168a0 46 52 4f 4d 20 5f 73 68 61 72 65 64 5f 73 63 68  FROM _shared_sch
168b0 65 6d 61 5f 74 6d 70 2e 73 71 6c 69 74 65 5f 6d  ema_tmp.sqlite_m
168c0 61 73 74 65 72 20 57 48 45 52 45 20 22 0a 20 20  aster WHERE ".  
168d0 20 20 20 20 22 20 20 20 20 20 20 74 79 70 65 20      "      type 
168e0 49 53 20 6f 2e 74 79 70 65 20 41 4e 44 20 6e 61  IS o.type AND na
168f0 6d 65 20 49 53 20 6f 2e 6e 61 6d 65 20 41 4e 44  me IS o.name AND
16900 20 72 6f 77 69 64 3c 3d 3f 22 0a 20 20 20 20 20   rowid<=?".     
16910 20 22 20 20 29 2c 20 73 71 6c 20 46 52 4f 4d 20   "  ), sql FROM 
16920 6d 61 69 6e 2e 73 71 6c 69 74 65 5f 6d 61 73 74  main.sqlite_mast
16930 65 72 20 41 53 20 6f 22 0a 20 20 29 3b 0a 20 20  er AS o".  );.  
16940 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
16950 36 34 28 70 53 74 6d 74 2c 20 31 2c 20 69 4c 61  64(pStmt, 1, iLa
16960 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  st);.  sqlite3_s
16970 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 73 68  tep(pStmt);.  sh
16980 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c  ellFinalize(&rc,
16990 20 70 53 74 6d 74 29 3b 0a 0a 20 20 73 68 65 6c   pStmt);..  shel
169a0 6c 45 78 65 63 50 72 69 6e 74 66 28 70 53 74 61  lExecPrintf(pSta
169b0 74 65 2d 3e 64 62 2c 20 26 72 63 2c 0a 20 20 20  te->db, &rc,.   
169c0 20 20 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20     "DELETE FROM 
169d0 5f 73 68 61 72 65 64 5f 73 63 68 65 6d 61 5f 74  _shared_schema_t
169e0 6d 70 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  mp.sqlite_master
169f0 20 57 48 45 52 45 20 72 6f 77 69 64 3c 3d 25 6c   WHERE rowid<=%l
16a00 6c 64 22 2c 0a 20 20 20 20 20 20 69 4c 61 73 74  ld",.      iLast
16a10 0a 20 20 29 3b 0a 20 20 73 68 65 6c 6c 45 78 65  .  );.  shellExe
16a20 63 50 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e  cPrintf(pState->
16a30 64 62 2c 20 26 72 63 2c 20 22 43 4f 4d 4d 49 54  db, &rc, "COMMIT
16a40 22 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65 78  ");.  sqlite3_ex
16a50 65 63 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 22  ec(pState->db, "
16a60 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f  PRAGMA writable_
16a70 73 63 68 65 6d 61 20 3d 20 30 22 2c 20 30 2c 20  schema = 0", 0, 
16a80 30 2c 20 30 29 3b 0a 0a 20 20 2f 2a 20 43 6f 70  0, 0);..  /* Cop
16a90 79 20 74 68 65 20 61 75 74 6f 2d 76 61 63 75 75  y the auto-vacuu
16aa0 6d 20 73 65 74 74 69 6e 67 20 66 72 6f 6d 20 6d  m setting from m
16ab0 61 69 6e 20 74 6f 20 74 68 65 20 74 61 72 67 65  ain to the targe
16ac0 74 20 64 62 20 2a 2f 0a 20 20 73 68 65 6c 6c 50  t db */.  shellP
16ad0 72 65 70 61 72 65 50 72 69 6e 74 66 28 70 53 74  reparePrintf(pSt
16ae0 61 74 65 2d 3e 64 62 2c 20 26 72 63 2c 20 26 70  ate->db, &rc, &p
16af0 53 74 6d 74 2c 20 22 50 52 41 47 4d 41 20 6d 61  Stmt, "PRAGMA ma
16b00 69 6e 2e 61 75 74 6f 5f 76 61 63 75 75 6d 22 29  in.auto_vacuum")
16b10 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70  ;.  sqlite3_step
16b20 28 70 53 74 6d 74 29 3b 0a 20 20 69 41 75 74 6f  (pStmt);.  iAuto
16b30 56 61 63 75 75 6d 20 3d 20 73 71 6c 69 74 65 33  Vacuum = sqlite3
16b40 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
16b50 74 2c 20 30 29 3b 0a 20 20 73 68 65 6c 6c 46 69  t, 0);.  shellFi
16b60 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 53 74 6d  nalize(&rc, pStm
16b70 74 29 3b 0a 20 20 73 68 65 6c 6c 45 78 65 63 50  t);.  shellExecP
16b80 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 64 62  rintf(pState->db
16b90 2c 20 26 72 63 2c 20 0a 20 20 20 20 20 20 22 50  , &rc, .      "P
16ba0 52 41 47 4d 41 20 5f 73 68 61 72 65 64 5f 73 63  RAGMA _shared_sc
16bb0 68 65 6d 61 5f 74 6d 70 2e 61 75 74 6f 5f 76 61  hema_tmp.auto_va
16bc0 63 75 75 6d 20 3d 20 25 64 22 2c 20 69 41 75 74  cuum = %d", iAut
16bd0 6f 56 61 63 75 75 6d 0a 20 20 29 3b 0a 0a 20 20  oVacuum.  );..  
16be0 2f 2a 20 56 61 63 75 75 6d 20 74 68 65 20 64 62  /* Vacuum the db
16bf0 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 73 74 61   in order to sta
16c00 6e 64 61 72 64 69 7a 65 20 74 68 65 20 72 6f 6f  ndardize the roo
16c10 74 70 61 67 65 20 6e 75 6d 62 65 72 73 2e 20 2a  tpage numbers. *
16c20 2f 0a 20 20 73 68 65 6c 6c 45 78 65 63 50 72 69  /.  shellExecPri
16c30 6e 74 66 28 70 53 74 61 74 65 2d 3e 64 62 2c 20  ntf(pState->db, 
16c40 26 72 63 2c 20 22 56 41 43 55 55 4d 20 5f 73 68  &rc, "VACUUM _sh
16c50 61 72 65 64 5f 73 63 68 65 6d 61 5f 74 6d 70 22  ared_schema_tmp"
16c60 29 3b 0a 0a 20 20 2f 2a 20 53 65 74 20 74 68 65  );..  /* Set the
16c70 20 73 63 68 65 6d 61 2d 63 6f 6f 6b 69 65 20 76   schema-cookie v
16c80 61 6c 75 65 20 74 6f 20 74 68 65 20 73 61 6d 65  alue to the same
16c90 20 61 73 20 64 61 74 61 62 61 73 65 20 22 6d 61   as database "ma
16ca0 69 6e 22 20 2a 2f 0a 20 20 73 68 65 6c 6c 50 72  in" */.  shellPr
16cb0 65 70 61 72 65 50 72 69 6e 74 66 28 70 53 74 61  eparePrintf(pSta
16cc0 74 65 2d 3e 64 62 2c 20 26 72 63 2c 20 26 70 53  te->db, &rc, &pS
16cd0 74 6d 74 2c 20 22 50 52 41 47 4d 41 20 6d 61 69  tmt, "PRAGMA mai
16ce0 6e 2e 73 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e  n.schema_version
16cf0 22 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  ");.  sqlite3_st
16d00 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 69 43 6f  ep(pStmt);.  iCo
16d10 6f 6b 69 65 20 3d 20 73 71 6c 69 74 65 33 5f 63  okie = sqlite3_c
16d20 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
16d30 20 30 29 3b 0a 20 20 73 68 65 6c 6c 46 69 6e 61   0);.  shellFina
16d40 6c 69 7a 65 28 26 72 63 2c 20 70 53 74 6d 74 29  lize(&rc, pStmt)
16d50 3b 0a 20 20 73 68 65 6c 6c 45 78 65 63 50 72 69  ;.  shellExecPri
16d60 6e 74 66 28 70 53 74 61 74 65 2d 3e 64 62 2c 20  ntf(pState->db, 
16d70 26 72 63 2c 20 0a 20 20 20 20 20 20 22 50 52 41  &rc, .      "PRA
16d80 47 4d 41 20 5f 73 68 61 72 65 64 5f 73 63 68 65  GMA _shared_sche
16d90 6d 61 5f 74 6d 70 2e 73 63 68 65 6d 61 5f 76 65  ma_tmp.schema_ve
16da0 72 73 69 6f 6e 20 3d 20 25 64 22 2c 20 69 43 6f  rsion = %d", iCo
16db0 6f 6b 69 65 0a 20 20 29 3b 0a 0a 20 20 73 71 6c  okie.  );..  sql
16dc0 69 74 65 33 5f 65 78 65 63 28 70 53 74 61 74 65  ite3_exec(pState
16dd0 2d 3e 64 62 2c 20 22 44 45 54 41 43 48 20 5f 73  ->db, "DETACH _s
16de0 68 61 72 65 64 5f 73 63 68 65 6d 61 5f 74 6d 70  hared_schema_tmp
16df0 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 72  ", 0, 0, 0);.  r
16e00 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 73 74 61  eturn rc;.}..sta
16e10 74 69 63 20 69 6e 74 20 73 68 61 72 65 64 53 63  tic int sharedSc
16e20 68 65 6d 61 43 68 65 63 6b 28 53 68 65 6c 6c 53  hemaCheck(ShellS
16e30 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20 63 6f  tate *pState, co
16e40 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 69  nst char *zDb, i
16e50 6e 74 20 2a 70 65 46 69 78 29 7b 0a 20 20 69 6e  nt *peFix){.  in
16e60 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
16e70 3b 0a 20 20 69 6e 74 20 62 46 61 69 6c 65 64 20  ;.  int bFailed 
16e80 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  = 0;.  sqlite3_s
16e90 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a  tmt *pStmt = 0;.
16ea0 0a 20 20 69 66 28 20 70 65 46 69 78 20 29 20 2a  .  if( peFix ) *
16eb0 70 65 46 69 78 20 3d 20 30 3b 0a 20 20 73 68 65  peFix = 0;.  she
16ec0 6c 6c 45 78 65 63 50 72 69 6e 74 66 28 70 53 74  llExecPrintf(pSt
16ed0 61 74 65 2d 3e 64 62 2c 20 26 72 63 2c 20 22 41  ate->db, &rc, "A
16ee0 54 54 41 43 48 20 27 25 71 27 20 41 53 20 5f 73  TTACH '%q' AS _s
16ef0 68 61 72 65 64 5f 73 63 68 65 6d 61 5f 74 6d 70  hared_schema_tmp
16f00 22 2c 20 7a 44 62 29 3b 0a 0a 20 20 2f 2a 20 43  ", zDb);..  /* C
16f10 68 65 63 6b 20 69 66 20 74 68 69 73 20 64 61 74  heck if this dat
16f20 61 62 61 73 65 20 68 61 73 20 74 68 65 20 73 61  abase has the sa
16f30 6d 65 20 73 65 74 20 6f 66 20 6f 62 6a 65 63 74  me set of object
16f40 73 20 61 73 20 74 68 65 20 63 75 72 72 65 6e 74  s as the current
16f50 20 64 62 20 2a 2f 0a 20 20 73 68 65 6c 6c 50 72   db */.  shellPr
16f60 65 70 61 72 65 50 72 69 6e 74 66 28 70 53 74 61  eparePrintf(pSta
16f70 74 65 2d 3e 64 62 2c 20 26 72 63 2c 20 26 70 53  te->db, &rc, &pS
16f80 74 6d 74 2c 20 0a 20 20 20 20 22 53 45 4c 45 43  tmt, .    "SELEC
16f90 54 20 74 79 70 65 2c 20 6e 61 6d 65 20 46 52 4f  T type, name FRO
16fa0 4d 20 5f 73 68 61 72 65 64 5f 73 63 68 65 6d 61  M _shared_schema
16fb0 5f 74 6d 70 2e 73 71 6c 69 74 65 5f 6d 61 73 74  _tmp.sqlite_mast
16fc0 65 72 20 41 53 20 6f 20 22 0a 20 20 20 20 22 57  er AS o ".    "W
16fd0 48 45 52 45 20 4e 4f 54 20 45 58 49 53 54 53 20  HERE NOT EXISTS 
16fe0 28 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43 54  (".    "  SELECT
16ff0 20 31 20 46 52 4f 4d 20 6d 61 69 6e 2e 73 71 6c   1 FROM main.sql
17000 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20  ite_master ".   
17010 20 22 20 20 20 20 57 48 45 52 45 20 6e 61 6d 65   "    WHERE name
17020 20 49 53 20 6f 2e 6e 61 6d 65 20 41 4e 44 20 74   IS o.name AND t
17030 79 70 65 20 49 53 20 6f 2e 74 79 70 65 22 0a 20  ype IS o.type". 
17040 20 20 20 22 29 22 0a 20 20 20 20 22 20 55 4e 49     ")".    " UNI
17050 4f 4e 20 41 4c 4c 20 22 0a 20 20 20 20 22 53 45  ON ALL ".    "SE
17060 4c 45 43 54 20 74 79 70 65 2c 20 6e 61 6d 65 20  LECT type, name 
17070 46 52 4f 4d 20 6d 61 69 6e 2e 73 71 6c 69 74 65  FROM main.sqlite
17080 5f 6d 61 73 74 65 72 20 41 53 20 6f 20 22 0a 20  _master AS o ". 
17090 20 20 20 22 57 48 45 52 45 20 4e 4f 54 20 45 58     "WHERE NOT EX
170a0 49 53 54 53 20 28 22 0a 20 20 20 20 22 20 20 53  ISTS (".    "  S
170b0 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 5f 73 68  ELECT 1 FROM _sh
170c0 61 72 65 64 5f 73 63 68 65 6d 61 5f 74 6d 70 2e  ared_schema_tmp.
170d0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a  sqlite_master ".
170e0 20 20 20 20 22 20 20 20 20 57 48 45 52 45 20 6e      "    WHERE n
170f0 61 6d 65 20 49 53 20 6f 2e 6e 61 6d 65 20 41 4e  ame IS o.name AN
17100 44 20 74 79 70 65 20 49 53 20 6f 2e 74 79 70 65  D type IS o.type
17110 22 0a 20 20 20 20 22 29 22 0a 20 20 29 3b 0a 20  ".    ")".  );. 
17120 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
17130 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
17140 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
17150 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 75 74 66  Stmt) ){.    utf
17160 38 5f 70 72 69 6e 74 66 28 70 53 74 61 74 65 2d  8_printf(pState-
17170 3e 6f 75 74 2c 20 22 25 73 20 69 73 20 4e 4f 54  >out, "%s is NOT
17180 20 63 6f 6d 70 61 74 69 62 6c 65 20 28 6f 62 6a   compatible (obj
17190 65 63 74 73 29 5c 6e 22 2c 20 7a 44 62 29 3b 0a  ects)\n", zDb);.
171a0 20 20 20 20 62 46 61 69 6c 65 64 20 3d 20 31 3b      bFailed = 1;
171b0 0a 20 20 7d 0a 20 20 73 68 65 6c 6c 46 69 6e 61  .  }.  shellFina
171c0 6c 69 7a 65 28 26 72 63 2c 20 70 53 74 6d 74 29  lize(&rc, pStmt)
171d0 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b 20 69 66  ;..  /* Check if
171e0 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 68   this database h
171f0 61 73 20 74 68 65 20 73 61 6d 65 20 73 65 74 20  as the same set 
17200 6f 66 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  of SQL statement
17210 73 20 61 73 20 74 68 65 20 0a 20 20 2a 2a 20 63  s as the .  ** c
17220 75 72 72 65 6e 74 20 64 62 2e 20 2a 2f 0a 20 20  urrent db. */.  
17230 69 66 28 20 62 46 61 69 6c 65 64 3d 3d 30 20 29  if( bFailed==0 )
17240 7b 0a 20 20 20 20 73 68 65 6c 6c 50 72 65 70 61  {.    shellPrepa
17250 72 65 50 72 69 6e 74 66 28 70 53 74 61 74 65 2d  rePrintf(pState-
17260 3e 64 62 2c 20 26 72 63 2c 20 26 70 53 74 6d 74  >db, &rc, &pStmt
17270 2c 20 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45  , .        "SELE
17280 43 54 20 31 20 46 52 4f 4d 20 5f 73 68 61 72 65  CT 1 FROM _share
17290 64 5f 73 63 68 65 6d 61 5f 74 6d 70 2e 73 71 6c  d_schema_tmp.sql
172a0 69 74 65 5f 6d 61 73 74 65 72 20 41 53 20 6f 20  ite_master AS o 
172b0 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45  ".        "WHERE
172c0 20 73 71 6c 20 49 53 20 4e 4f 54 20 28 22 0a 20   sql IS NOT (". 
172d0 20 20 20 20 20 20 20 22 20 20 53 45 4c 45 43 54         "  SELECT
172e0 20 73 71 6c 20 46 52 4f 4d 20 6d 61 69 6e 2e 73   sql FROM main.s
172f0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20  qlite_master ". 
17300 20 20 20 20 20 20 20 22 20 20 20 20 57 48 45 52         "    WHER
17310 45 20 6e 61 6d 65 20 49 53 20 6f 2e 6e 61 6d 65  E name IS o.name
17320 20 41 4e 44 20 74 79 70 65 20 49 53 20 6f 2e 74   AND type IS o.t
17330 79 70 65 22 0a 20 20 20 20 20 20 20 20 22 29 22  ype".        ")"
17340 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20  .    );.    if( 
17350 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
17360 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
17370 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
17380 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
17390 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75  rintf(pState->ou
173a0 74 2c 20 22 25 73 20 69 73 20 4e 4f 54 20 63 6f  t, "%s is NOT co
173b0 6d 70 61 74 69 62 6c 65 20 28 53 51 4c 29 5c 6e  mpatible (SQL)\n
173c0 22 2c 20 7a 44 62 29 3b 0a 20 20 20 20 20 20 62  ", zDb);.      b
173d0 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
173e0 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c  }.    shellFinal
173f0 69 7a 65 28 26 72 63 2c 20 70 53 74 6d 74 29 3b  ize(&rc, pStmt);
17400 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  .  }..  /* Check
17410 20 69 66 20 74 68 69 73 20 64 61 74 61 62 61 73   if this databas
17420 65 20 68 61 73 20 74 68 65 20 73 61 6d 65 20 73  e has the same s
17430 65 74 20 6f 66 20 72 6f 6f 74 20 70 61 67 65 73  et of root pages
17440 20 61 73 20 74 68 65 20 63 75 72 72 65 6e 74 20   as the current 
17450 0a 20 20 2a 2a 20 64 62 2e 20 2a 2f 0a 20 20 69  .  ** db. */.  i
17460 66 28 20 62 46 61 69 6c 65 64 3d 3d 30 20 29 7b  f( bFailed==0 ){
17470 0a 20 20 20 20 73 68 65 6c 6c 50 72 65 70 61 72  .    shellPrepar
17480 65 50 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e  ePrintf(pState->
17490 64 62 2c 20 26 72 63 2c 20 26 70 53 74 6d 74 2c  db, &rc, &pStmt,
174a0 20 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43   .        "SELEC
174b0 54 20 31 20 46 52 4f 4d 20 5f 73 68 61 72 65 64  T 1 FROM _shared
174c0 5f 73 63 68 65 6d 61 5f 74 6d 70 2e 73 71 6c 69  _schema_tmp.sqli
174d0 74 65 5f 6d 61 73 74 65 72 20 41 53 20 6f 20 22  te_master AS o "
174e0 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20  .        "WHERE 
174f0 72 6f 6f 74 70 61 67 65 20 49 53 20 4e 4f 54 20  rootpage IS NOT 
17500 28 22 0a 20 20 20 20 20 20 20 20 22 20 20 53 45  (".        "  SE
17510 4c 45 43 54 20 72 6f 6f 74 70 61 67 65 20 46 52  LECT rootpage FR
17520 4f 4d 20 6d 61 69 6e 2e 73 71 6c 69 74 65 5f 6d  OM main.sqlite_m
17530 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20  aster ".        
17540 22 20 20 20 20 57 48 45 52 45 20 6e 61 6d 65 20  "    WHERE name 
17550 49 53 20 6f 2e 6e 61 6d 65 20 41 4e 44 20 74 79  IS o.name AND ty
17560 70 65 20 49 53 20 6f 2e 74 79 70 65 22 0a 20 20  pe IS o.type".  
17570 20 20 20 20 20 20 22 29 22 0a 20 20 20 20 29 3b        ")".    );
17580 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
17590 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45  ITE_OK && SQLITE
175a0 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
175b0 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20 20  ep(pStmt) ){.   
175c0 20 20 20 69 66 28 20 70 65 46 69 78 3d 3d 30 20     if( peFix==0 
175d0 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
175e0 70 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f  printf(pState->o
175f0 75 74 2c 20 22 25 73 20 69 73 20 4e 4f 54 20 63  ut, "%s is NOT c
17600 6f 6d 70 61 74 69 62 6c 65 20 28 72 6f 6f 74 20  ompatible (root 
17610 70 61 67 65 73 29 5c 6e 22 2c 20 7a 44 62 29 3b  pages)\n", zDb);
17620 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
17630 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20 20 20  Failed = 1;.    
17640 20 20 69 66 28 20 70 65 46 69 78 20 29 20 2a 70    if( peFix ) *p
17650 65 46 69 78 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  eFix = 1;.    }.
17660 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a      shellFinaliz
17670 65 28 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a 20  e(&rc, pStmt);. 
17680 20 7d 0a 0a 20 20 69 66 28 20 62 46 61 69 6c 65   }..  if( bFaile
17690 64 3d 3d 30 20 29 7b 0a 20 20 20 20 73 68 65 6c  d==0 ){.    shel
176a0 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66 28 70  lPreparePrintf(p
176b0 53 74 61 74 65 2d 3e 64 62 2c 20 26 72 63 2c 20  State->db, &rc, 
176c0 26 70 53 74 6d 74 2c 20 0a 20 20 20 20 20 20 20  &pStmt, .       
176d0 20 22 53 45 4c 45 43 54 20 31 20 57 48 45 52 45   "SELECT 1 WHERE
176e0 20 28 22 0a 20 20 20 20 20 20 20 20 22 20 20 53   (".        "  S
176f0 45 4c 45 43 54 20 67 72 6f 75 70 5f 63 6f 6e 63  ELECT group_conc
17700 61 74 28 72 6f 6f 74 70 61 67 65 20 7c 7c 20 27  at(rootpage || '
17710 2e 27 20 7c 7c 20 6e 61 6d 65 20 7c 7c 20 27 2e  .' || name || '.
17720 27 20 7c 7c 20 73 71 6c 2c 20 27 2e 27 29 20 22  ' || sql, '.') "
17730 0a 20 20 20 20 20 20 20 20 22 20 20 46 52 4f 4d  .        "  FROM
17740 20 5f 73 68 61 72 65 64 5f 73 63 68 65 6d 61 5f   _shared_schema_
17750 74 6d 70 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65  tmp.sqlite_maste
17760 72 22 0a 20 20 20 20 20 20 20 20 22 29 20 49 53  r".        ") IS
17770 20 4e 4f 54 20 28 22 0a 20 20 20 20 20 20 20 20   NOT (".        
17780 22 20 20 53 45 4c 45 43 54 20 67 72 6f 75 70 5f  "  SELECT group_
17790 63 6f 6e 63 61 74 28 72 6f 6f 74 70 61 67 65 20  concat(rootpage 
177a0 7c 7c 20 27 2e 27 20 7c 7c 20 6e 61 6d 65 20 7c  || '.' || name |
177b0 7c 20 27 2e 27 20 7c 7c 20 73 71 6c 2c 20 27 2e  | '.' || sql, '.
177c0 27 29 20 22 0a 20 20 20 20 20 20 20 20 22 20 20  ') ".        "  
177d0 46 52 4f 4d 20 6d 61 69 6e 2e 73 71 6c 69 74 65  FROM main.sqlite
177e0 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20 20  _master".       
177f0 20 22 29 22 0a 20 20 20 20 29 3b 0a 20 20 20 20   ")".    );.    
17800 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
17810 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d  K && SQLITE_ROW=
17820 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
17830 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 69 66  tmt) ){.      if
17840 28 20 70 65 46 69 78 3d 3d 30 20 29 7b 0a 20 20  ( peFix==0 ){.  
17850 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
17860 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 0a  f(pState->out, .
17870 20 20 20 20 20 20 20 20 20 20 20 20 22 25 73 20              "%s 
17880 69 73 20 4e 4f 54 20 63 6f 6d 70 61 74 69 62 6c  is NOT compatibl
17890 65 20 28 6f 72 64 65 72 20 6f 66 20 73 71 6c 69  e (order of sqli
178a0 74 65 5f 6d 61 73 74 65 72 20 72 6f 77 73 29 5c  te_master rows)\
178b0 6e 22 2c 20 7a 44 62 0a 20 20 20 20 20 20 20 20  n", zDb.        
178c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
178d0 20 62 46 61 69 6c 65 64 20 3d 20 31 3b 0a 20 20   bFailed = 1;.  
178e0 20 20 20 20 69 66 28 20 70 65 46 69 78 20 29 20      if( peFix ) 
178f0 2a 70 65 46 69 78 20 3d 20 32 3b 0a 20 20 20 20  *peFix = 2;.    
17900 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c  }.    shellFinal
17910 69 7a 65 28 26 72 63 2c 20 70 53 74 6d 74 29 3b  ize(&rc, pStmt);
17920 0a 20 20 7d 0a 0a 20 20 69 66 28 20 62 46 61 69  .  }..  if( bFai
17930 6c 65 64 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  led==0 ){.    in
17940 74 20 69 4d 61 69 6e 20 3d 20 2d 31 3b 0a 20 20  t iMain = -1;.  
17950 20 20 69 6e 74 20 69 4e 65 77 20 3d 20 2b 31 3b    int iNew = +1;
17960 0a 20 20 20 20 73 68 65 6c 6c 50 72 65 70 61 72  .    shellPrepar
17970 65 50 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e  ePrintf(pState->
17980 64 62 2c 20 26 72 63 2c 20 26 70 53 74 6d 74 2c  db, &rc, &pStmt,
17990 20 0a 20 20 20 20 20 20 20 20 22 50 52 41 47 4d   .        "PRAGM
179a0 41 20 6d 61 69 6e 2e 73 63 68 65 6d 61 5f 76 65  A main.schema_ve
179b0 72 73 69 6f 6e 22 0a 20 20 20 20 29 3b 0a 20 20  rsion".    );.  
179c0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
179d0 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f  _OK && SQLITE_RO
179e0 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
179f0 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20  pStmt) ){.      
17a00 69 4d 61 69 6e 20 3d 20 73 71 6c 69 74 65 33 5f  iMain = sqlite3_
17a10 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
17a20 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
17a30 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72  shellFinalize(&r
17a40 63 2c 20 70 53 74 6d 74 29 3b 0a 20 20 20 20 73  c, pStmt);.    s
17a50 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74  hellPreparePrint
17a60 66 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 26 72  f(pState->db, &r
17a70 63 2c 20 26 70 53 74 6d 74 2c 20 0a 20 20 20 20  c, &pStmt, .    
17a80 20 20 20 20 22 50 52 41 47 4d 41 20 5f 73 68 61      "PRAGMA _sha
17a90 72 65 64 5f 73 63 68 65 6d 61 5f 74 6d 70 2e 73  red_schema_tmp.s
17aa0 63 68 65 6d 61 5f 76 65 72 73 69 6f 6e 22 0a 20  chema_version". 
17ab0 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63     );.    if( rc
17ac0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53  ==SQLITE_OK && S
17ad0 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
17ae0 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 20 29  e3_step(pStmt) )
17af0 7b 0a 20 20 20 20 20 20 69 4e 65 77 20 3d 20 73  {.      iNew = s
17b00 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
17b10 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  t(pStmt, 0);.   
17b20 20 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61   }.    shellFina
17b30 6c 69 7a 65 28 26 72 63 2c 20 70 53 74 6d 74 29  lize(&rc, pStmt)
17b40 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
17b50 4c 49 54 45 5f 4f 4b 20 26 26 20 69 4d 61 69 6e  LITE_OK && iMain
17b60 21 3d 69 4e 65 77 20 29 7b 0a 20 20 20 20 20 20  !=iNew ){.      
17b70 69 66 28 20 70 65 46 69 78 3d 3d 30 20 29 7b 0a  if( peFix==0 ){.
17b80 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
17b90 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74 2c  ntf(pState->out,
17ba0 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 25   .            "%
17bb0 73 20 69 73 20 4e 4f 54 20 63 6f 6d 70 61 74 69  s is NOT compati
17bc0 62 6c 65 20 28 73 63 68 65 6d 61 20 63 6f 6f 6b  ble (schema cook
17bd0 69 65 29 5c 6e 22 2c 20 7a 44 62 0a 20 20 20 20  ie)\n", zDb.    
17be0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20      );.      }. 
17bf0 20 20 20 20 20 62 46 61 69 6c 65 64 20 3d 20 31       bFailed = 1
17c00 3b 0a 20 20 20 20 20 20 69 66 28 20 70 65 46 69  ;.      if( peFi
17c10 78 20 29 20 2a 70 65 46 69 78 20 3d 20 33 3b 0a  x ) *peFix = 3;.
17c20 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
17c30 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
17c40 26 20 62 46 61 69 6c 65 64 3d 3d 30 20 29 7b 0a  & bFailed==0 ){.
17c50 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
17c60 70 53 74 61 74 65 2d 3e 6f 75 74 2c 20 22 25 73  pState->out, "%s
17c70 20 69 73 20 63 6f 6d 70 61 74 69 62 6c 65 5c 6e   is compatible\n
17c80 22 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 0a 20 20  ", zDb);.  }..  
17c90 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 53 74  sqlite3_exec(pSt
17ca0 61 74 65 2d 3e 64 62 2c 20 22 44 45 54 41 43 48  ate->db, "DETACH
17cb0 20 5f 73 68 61 72 65 64 5f 73 63 68 65 6d 61 5f   _shared_schema_
17cc0 74 6d 70 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  tmp", 0, 0, 0);.
17cd0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
17ce0 2f 2a 0a 2a 2a 20 2e 73 68 61 72 65 64 2d 73 63  /*.** .shared-sc
17cf0 68 65 6d 61 20 63 68 65 63 6b 7c 66 69 78 20 44  hema check|fix D
17d00 42 31 20 44 42 32 2e 2e 2e 0a 2a 2f 0a 73 74 61  B1 DB2....*/.sta
17d10 74 69 63 20 69 6e 74 20 73 68 61 72 65 64 53 63  tic int sharedSc
17d20 68 65 6d 61 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a  hemaDotCommand(.
17d30 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53    ShellState *pS
17d40 74 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  tate,           
17d50 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68 65    /* Current she
17d60 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f  ll tool state */
17d70 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c  .  char **azArg,
17d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17d90 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61     /* Array of a
17da0 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20  rguments passed 
17db0 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a  to dot command *
17dc0 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20  /.  int nArg    
17dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17de0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
17df0 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72   entries in azAr
17e00 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  g[] */.){.  int 
17e10 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
17e20 20 20 69 6e 74 20 62 46 69 78 20 3d 20 30 3b 20    int bFix = 0; 
17e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17e40 20 20 2f 2a 20 46 69 78 20 64 61 74 61 62 61 73    /* Fix databas
17e50 65 73 20 69 66 20 70 6f 73 73 69 62 6c 65 20 2a  es if possible *
17e60 2f 0a 20 20 69 6e 74 20 6e 31 3b 0a 20 20 69 6e  /.  int n1;.  in
17e70 74 20 69 3b 0a 20 20 69 66 28 20 6e 41 72 67 3c  t i;.  if( nArg<
17e80 33 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 73 68  3 ){.    goto sh
17e90 61 72 65 64 5f 73 63 68 65 6d 61 5f 75 73 61 67  ared_schema_usag
17ea0 65 3b 0a 20 20 7d 0a 0a 20 20 6e 31 20 3d 20 28  e;.  }..  n1 = (
17eb0 69 6e 74 29 73 74 72 6c 65 6e 28 61 7a 41 72 67  int)strlen(azArg
17ec0 5b 31 5d 29 3b 0a 20 20 69 66 28 20 6e 31 3e 30  [1]);.  if( n1>0
17ed0 20 26 26 20 6e 31 3c 3d 33 20 26 26 20 6d 65 6d   && n1<=3 && mem
17ee0 63 6d 70 28 22 66 69 78 22 2c 20 61 7a 41 72 67  cmp("fix", azArg
17ef0 5b 31 5d 2c 20 6e 31 29 3d 3d 30 20 29 7b 0a 20  [1], n1)==0 ){. 
17f00 20 20 20 62 46 69 78 20 3d 20 31 3b 0a 20 20 7d     bFix = 1;.  }
17f10 65 6c 73 65 20 69 66 28 20 6e 31 3d 3d 30 20 7c  else if( n1==0 |
17f20 7c 20 6e 31 3e 35 20 7c 7c 20 6d 65 6d 63 6d 70  | n1>5 || memcmp
17f30 28 22 63 68 65 63 6b 22 2c 20 61 7a 41 72 67 5b  ("check", azArg[
17f40 31 5d 2c 20 6e 31 29 20 29 7b 0a 20 20 20 20 67  1], n1) ){.    g
17f50 6f 74 6f 20 73 68 61 72 65 64 5f 73 63 68 65 6d  oto shared_schem
17f60 61 5f 75 73 61 67 65 3b 0a 20 20 7d 0a 0a 20 20  a_usage;.  }..  
17f70 66 6f 72 28 69 3d 32 3b 20 72 63 3d 3d 53 51 4c  for(i=2; rc==SQL
17f80 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 41 72 67  ITE_OK && i<nArg
17f90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
17fa0 65 46 69 78 20 3d 20 30 3b 0a 20 20 20 20 72 63  eFix = 0;.    rc
17fb0 20 3d 20 73 68 61 72 65 64 53 63 68 65 6d 61 43   = sharedSchemaC
17fc0 68 65 63 6b 28 70 53 74 61 74 65 2c 20 61 7a 41  heck(pState, azA
17fd0 72 67 5b 69 5d 2c 20 62 46 69 78 20 3f 20 26 65  rg[i], bFix ? &e
17fe0 46 69 78 20 3a 20 30 29 3b 0a 20 20 20 20 69 66  Fix : 0);.    if
17ff0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
18000 26 26 20 62 46 69 78 20 26 26 20 65 46 69 78 20  && bFix && eFix 
18010 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
18020 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75 74  intf(pState->out
18030 2c 20 22 46 69 78 69 6e 67 20 25 73 2e 2e 2e 20  , "Fixing %s... 
18040 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  ", azArg[i]);.  
18050 20 20 20 20 66 66 6c 75 73 68 28 70 53 74 61 74      fflush(pStat
18060 65 2d 3e 6f 75 74 29 3b 0a 20 20 20 20 20 20 72  e->out);.      r
18070 63 20 3d 20 73 68 61 72 65 64 53 63 68 65 6d 61  c = sharedSchema
18080 46 69 78 28 70 53 74 61 74 65 2c 20 61 7a 41 72  Fix(pState, azAr
18090 67 5b 69 5d 2c 20 65 46 69 78 29 3b 0a 20 20 20  g[i], eFix);.   
180a0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
180b0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
180c0 72 63 20 3d 20 73 68 61 72 65 64 53 63 68 65 6d  rc = sharedSchem
180d0 61 43 68 65 63 6b 28 70 53 74 61 74 65 2c 20 61  aCheck(pState, a
180e0 7a 41 72 67 5b 69 5d 2c 20 26 65 46 69 78 29 3b  zArg[i], &eFix);
180f0 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
18100 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 65 46  =SQLITE_OK && eF
18110 69 78 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ix ){.          
18120 75 74 66 38 5f 70 72 69 6e 74 66 28 70 53 74 61  utf8_printf(pSta
18130 74 65 2d 3e 6f 75 74 2c 20 22 56 41 43 55 55 4d  te->out, "VACUUM
18140 69 6e 67 20 6d 61 69 6e 2e 2e 2e 20 22 29 3b 0a  ing main... ");.
18150 20 20 20 20 20 20 20 20 20 20 66 66 6c 75 73 68            fflush
18160 28 70 53 74 61 74 65 2d 3e 6f 75 74 29 3b 0a 20  (pState->out);. 
18170 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
18180 6c 69 74 65 33 5f 65 78 65 63 28 70 53 74 61 74  lite3_exec(pStat
18190 65 2d 3e 64 62 2c 20 22 56 41 43 55 55 4d 20 6d  e->db, "VACUUM m
181a0 61 69 6e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ain", 0, 0, 0);.
181b0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 72 63            if( rc
181c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
181d0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
181e0 73 68 61 72 65 64 53 63 68 65 6d 61 43 68 65 63  sharedSchemaChec
181f0 6b 28 70 53 74 61 74 65 2c 20 61 7a 41 72 67 5b  k(pState, azArg[
18200 69 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  i], 0);.        
18210 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
18220 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
18230 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 73  .  return rc;. s
18240 68 61 72 65 64 5f 73 63 68 65 6d 61 5f 75 73 61  hared_schema_usa
18250 67 65 3a 0a 20 20 72 61 77 5f 70 72 69 6e 74 66  ge:.  raw_printf
18260 28 73 74 64 65 72 72 2c 20 22 75 73 61 67 65 3a  (stderr, "usage:
18270 20 2e 73 68 61 72 65 64 2d 73 63 68 65 6d 61 20   .shared-schema 
18280 63 68 65 63 6b 7c 66 69 78 20 44 42 31 20 44 42  check|fix DB1 DB
18290 32 2e 2e 2e 5c 6e 22 29 3b 0a 20 20 72 65 74 75  2...\n");.  retu
182a0 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
182b0 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75  .}.../*.** Execu
182c0 74 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  te a statement o
182d0 72 20 73 65 74 20 6f 66 20 73 74 61 74 65 6d 65  r set of stateme
182e0 6e 74 73 2e 20 20 50 72 69 6e 74 0a 2a 2a 20 61  nts.  Print.** a
182f0 6e 79 20 72 65 73 75 6c 74 20 72 6f 77 73 2f 63  ny result rows/c
18300 6f 6c 75 6d 6e 73 20 64 65 70 65 6e 64 69 6e 67  olumns depending
18310 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
18320 6d 6f 64 65 0a 2a 2a 20 73 65 74 20 76 69 61 20  mode.** set via 
18330 74 68 65 20 73 75 70 70 6c 69 65 64 20 63 61 6c  the supplied cal
18340 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  lback..**.** Thi
18350 73 20 69 73 20 76 65 72 79 20 73 69 6d 69 6c 61  s is very simila
18360 72 20 74 6f 20 53 51 4c 69 74 65 27 73 20 62 75  r to SQLite's bu
18370 69 6c 74 2d 69 6e 20 73 71 6c 69 74 65 33 5f 65  ilt-in sqlite3_e
18380 78 65 63 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f  xec().** functio
18390 6e 20 65 78 63 65 70 74 20 69 74 20 74 61 6b 65  n except it take
183a0 73 20 61 20 73 6c 69 67 68 74 6c 79 20 64 69 66  s a slightly dif
183b0 66 65 72 65 6e 74 20 63 61 6c 6c 62 61 63 6b 0a  ferent callback.
183c0 2a 2a 20 61 6e 64 20 63 61 6c 6c 62 61 63 6b 20  ** and callback 
183d0 64 61 74 61 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  data argument..*
183e0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68 65  /.static int she
183f0 6c 6c 5f 65 78 65 63 28 0a 20 20 53 68 65 6c 6c  ll_exec(.  Shell
18400 53 74 61 74 65 20 2a 70 41 72 67 2c 20 20 20 20  State *pArg,    
18410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18420 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20       /* Pointer 
18430 74 6f 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f  to ShellState */
18440 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
18450 53 71 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20  Sql,            
18460 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
18470 53 51 4c 20 74 6f 20 62 65 20 65 76 61 6c 75 61  SQL to be evalua
18480 74 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ted */.  char **
18490 70 7a 45 72 72 4d 73 67 20 20 20 20 20 20 20 20  pzErrMsg        
184a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184b0 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 73 67 20     /* Error msg 
184c0 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a  written here */.
184d0 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
184e0 74 20 2a 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b  t *pStmt = NULL;
184f0 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e       /* Statemen
18500 74 20 74 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f  t to execute. */
18510 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
18520 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
18530 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
18540 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 3b 0a  e */.  int rc2;.
18550 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c    const char *zL
18560 65 66 74 6f 76 65 72 3b 20 20 20 20 20 20 20 20  eftover;        
18570 20 20 2f 2a 20 54 61 69 6c 20 6f 66 20 75 6e 70    /* Tail of unp
18580 72 6f 63 65 73 73 65 64 20 53 51 4c 20 2a 2f 0a  rocessed SQL */.
18590 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
185a0 70 41 72 67 2d 3e 64 62 3b 0a 0a 20 20 69 66 28  pArg->db;..  if(
185b0 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20   pzErrMsg ){.   
185c0 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 4e 55 4c   *pzErrMsg = NUL
185d0 4c 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  L;.  }..#ifndef 
185e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
185f0 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70  UALTABLE.  if( p
18600 41 72 67 2d 3e 65 78 70 65 72 74 2e 70 45 78 70  Arg->expert.pExp
18610 65 72 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ert ){.    rc = 
18620 65 78 70 65 72 74 48 61 6e 64 6c 65 53 51 4c 28  expertHandleSQL(
18630 70 41 72 67 2c 20 7a 53 71 6c 2c 20 70 7a 45 72  pArg, zSql, pzEr
18640 72 4d 73 67 29 3b 0a 20 20 20 20 72 65 74 75 72  rMsg);.    retur
18650 6e 20 65 78 70 65 72 74 46 69 6e 69 73 68 28 70  n expertFinish(p
18660 41 72 67 2c 20 28 72 63 21 3d 53 51 4c 49 54 45  Arg, (rc!=SQLITE
18670 5f 4f 4b 29 2c 20 70 7a 45 72 72 4d 73 67 29 3b  _OK), pzErrMsg);
18680 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 77  .  }.#endif..  w
18690 68 69 6c 65 28 20 7a 53 71 6c 5b 30 5d 20 26 26  hile( zSql[0] &&
186a0 20 28 53 51 4c 49 54 45 5f 4f 4b 20 3d 3d 20 72   (SQLITE_OK == r
186b0 63 29 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63  c) ){.    static
186c0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74   const char *zSt
186d0 6d 74 53 71 6c 3b 0a 20 20 20 20 72 63 20 3d 20  mtSql;.    rc = 
186e0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
186f0 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  v2(db, zSql, -1,
18700 20 26 70 53 74 6d 74 2c 20 26 7a 4c 65 66 74 6f   &pStmt, &zLefto
18710 76 65 72 29 3b 0a 20 20 20 20 69 66 28 20 53 51  ver);.    if( SQ
18720 4c 49 54 45 5f 4f 4b 20 21 3d 20 72 63 20 29 7b  LITE_OK != rc ){
18730 0a 20 20 20 20 20 20 69 66 28 20 70 7a 45 72 72  .      if( pzErr
18740 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  Msg ){.        *
18750 70 7a 45 72 72 4d 73 67 20 3d 20 73 61 76 65 5f  pzErrMsg = save_
18760 65 72 72 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20  err_msg(db);.   
18770 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
18780 20 20 20 20 20 20 69 66 28 20 21 70 53 74 6d 74        if( !pStmt
18790 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 74   ){.        /* t
187a0 68 69 73 20 68 61 70 70 65 6e 73 20 66 6f 72 20  his happens for 
187b0 61 20 63 6f 6d 6d 65 6e 74 20 6f 72 20 77 68 69  a comment or whi
187c0 74 65 2d 73 70 61 63 65 20 2a 2f 0a 20 20 20 20  te-space */.    
187d0 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74      zSql = zLeft
187e0 6f 76 65 72 3b 0a 20 20 20 20 20 20 20 20 77 68  over;.        wh
187f0 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 53 71  ile( IsSpace(zSq
18800 6c 5b 30 5d 29 20 29 20 7a 53 71 6c 2b 2b 3b 0a  l[0]) ) zSql++;.
18810 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
18820 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
18830 7a 53 74 6d 74 53 71 6c 20 3d 20 73 71 6c 69 74  zStmtSql = sqlit
18840 65 33 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20  e3_sql(pStmt);. 
18850 20 20 20 20 20 69 66 28 20 7a 53 74 6d 74 53 71       if( zStmtSq
18860 6c 3d 3d 30 20 29 20 7a 53 74 6d 74 53 71 6c 20  l==0 ) zStmtSql 
18870 3d 20 22 22 3b 0a 20 20 20 20 20 20 77 68 69 6c  = "";.      whil
18880 65 28 20 49 73 53 70 61 63 65 28 7a 53 74 6d 74  e( IsSpace(zStmt
18890 53 71 6c 5b 30 5d 29 20 29 20 7a 53 74 6d 74 53  Sql[0]) ) zStmtS
188a0 71 6c 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  ql++;..      /* 
188b0 73 61 76 65 20 6f 66 66 20 74 68 65 20 70 72 65  save off the pre
188c0 70 61 72 65 64 20 73 74 61 74 6d 65 6e 74 20 68  pared statment h
188d0 61 6e 64 6c 65 20 61 6e 64 20 72 65 73 65 74 20  andle and reset 
188e0 72 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20  row count */.   
188f0 20 20 20 69 66 28 20 70 41 72 67 20 29 7b 0a 20     if( pArg ){. 
18900 20 20 20 20 20 20 20 70 41 72 67 2d 3e 70 53 74         pArg->pSt
18910 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20  mt = pStmt;.    
18920 20 20 20 20 70 41 72 67 2d 3e 63 6e 74 20 3d 20      pArg->cnt = 
18930 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  0;.      }..    
18940 20 20 2f 2a 20 65 63 68 6f 20 74 68 65 20 73 71    /* echo the sq
18950 6c 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 65  l statement if e
18960 63 68 6f 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  cho on */.      
18970 69 66 28 20 70 41 72 67 20 26 26 20 53 68 65 6c  if( pArg && Shel
18980 6c 48 61 73 46 6c 61 67 28 70 41 72 67 2c 20 53  lHasFlag(pArg, S
18990 48 46 4c 47 5f 45 63 68 6f 29 20 29 7b 0a 20 20  HFLG_Echo) ){.  
189a0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
189b0 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 25 73  f(pArg->out, "%s
189c0 5c 6e 22 2c 20 7a 53 74 6d 74 53 71 6c 20 3f 20  \n", zStmtSql ? 
189d0 7a 53 74 6d 74 53 71 6c 20 3a 20 7a 53 71 6c 29  zStmtSql : zSql)
189e0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
189f0 20 2f 2a 20 53 68 6f 77 20 74 68 65 20 45 58 50   /* Show the EXP
18a00 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
18a10 69 66 20 2e 65 71 70 20 69 73 20 6f 6e 20 2a 2f  if .eqp is on */
18a20 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20  .      if( pArg 
18a30 26 26 20 70 41 72 67 2d 3e 61 75 74 6f 45 51 50  && pArg->autoEQP
18a40 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6c   && sqlite3_strl
18a50 69 6b 65 28 22 45 58 50 4c 41 49 4e 25 22 2c 7a  ike("EXPLAIN%",z
18a60 53 74 6d 74 53 71 6c 2c 30 29 21 3d 30 20 29 7b  StmtSql,0)!=0 ){
18a70 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18a80 5f 73 74 6d 74 20 2a 70 45 78 70 6c 61 69 6e 3b  _stmt *pExplain;
18a90 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
18aa0 45 51 50 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  EQP;.        int
18ab0 20 74 72 69 67 67 65 72 45 51 50 20 3d 20 30 3b   triggerEQP = 0;
18ac0 0a 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65  .        disable
18ad0 5f 64 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64  _debug_trace_mod
18ae0 65 73 28 29 3b 0a 20 20 20 20 20 20 20 20 73 71  es();.        sq
18af0 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28  lite3_db_config(
18b00 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e  db, SQLITE_DBCON
18b10 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51 50 2c  FIG_TRIGGER_EQP,
18b20 20 2d 31 2c 20 26 74 72 69 67 67 65 72 45 51 50   -1, &triggerEQP
18b30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
18b40 41 72 67 2d 3e 61 75 74 6f 45 51 50 3e 3d 41 55  Arg->autoEQP>=AU
18b50 54 4f 45 51 50 5f 74 72 69 67 67 65 72 20 29 7b  TOEQP_trigger ){
18b60 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
18b70 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 64 62 2c  e3_db_config(db,
18b80 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47   SQLITE_DBCONFIG
18b90 5f 54 52 49 47 47 45 52 5f 45 51 50 2c 20 31 2c  _TRIGGER_EQP, 1,
18ba0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
18bb0 20 20 20 20 20 20 20 7a 45 51 50 20 3d 20 73 71         zEQP = sq
18bc0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 45  lite3_mprintf("E
18bd0 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
18be0 4e 20 25 73 22 2c 20 7a 53 74 6d 74 53 71 6c 29  N %s", zStmtSql)
18bf0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  ;.        rc = s
18c00 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
18c10 32 28 64 62 2c 20 7a 45 51 50 2c 20 2d 31 2c 20  2(db, zEQP, -1, 
18c20 26 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20  &pExplain, 0);. 
18c30 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
18c40 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
18c50 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c        while( sql
18c60 69 74 65 33 5f 73 74 65 70 28 70 45 78 70 6c 61  ite3_step(pExpla
18c70 69 6e 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  in)==SQLITE_ROW 
18c80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
18c90 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 51 50 4c  onst char *zEQPL
18ca0 69 6e 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ine = (const cha
18cb0 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
18cc0 6e 5f 74 65 78 74 28 70 45 78 70 6c 61 69 6e 2c  n_text(pExplain,
18cd0 33 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  3);.            
18ce0 69 6e 74 20 69 45 71 70 49 64 20 3d 20 73 71 6c  int iEqpId = sql
18cf0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
18d00 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20  pExplain, 0);.  
18d10 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 69 50            int iP
18d20 61 72 65 6e 74 49 64 20 3d 20 73 71 6c 69 74 65  arentId = sqlite
18d30 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78  3_column_int(pEx
18d40 70 6c 61 69 6e 2c 20 31 29 3b 0a 20 20 20 20 20  plain, 1);.     
18d50 20 20 20 20 20 20 20 69 66 28 20 7a 45 51 50 4c         if( zEQPL
18d60 69 6e 65 5b 30 5d 3d 3d 27 2d 27 20 29 20 65 71  ine[0]=='-' ) eq
18d70 70 5f 72 65 6e 64 65 72 28 70 41 72 67 29 3b 0a  p_render(pArg);.
18d80 20 20 20 20 20 20 20 20 20 20 20 20 65 71 70 5f              eqp_
18d90 61 70 70 65 6e 64 28 70 41 72 67 2c 20 69 45 71  append(pArg, iEq
18da0 70 49 64 2c 20 69 50 61 72 65 6e 74 49 64 2c 20  pId, iParentId, 
18db0 7a 45 51 50 4c 69 6e 65 29 3b 0a 20 20 20 20 20  zEQPLine);.     
18dc0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
18dd0 20 65 71 70 5f 72 65 6e 64 65 72 28 70 41 72 67   eqp_render(pArg
18de0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
18df0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
18e00 61 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b  alize(pExplain);
18e10 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
18e20 5f 66 72 65 65 28 7a 45 51 50 29 3b 0a 20 20 20  _free(zEQP);.   
18e30 20 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e 61       if( pArg->a
18e40 75 74 6f 45 51 50 3e 3d 41 55 54 4f 45 51 50 5f  utoEQP>=AUTOEQP_
18e50 66 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  full ){.        
18e60 20 20 2f 2a 20 41 6c 73 6f 20 64 6f 20 61 6e 20    /* Also do an 
18e70 45 58 50 4c 41 49 4e 20 66 6f 72 20 22 2e 65 71  EXPLAIN for ".eq
18e80 70 20 66 75 6c 6c 22 20 6d 6f 64 65 20 2a 2f 0a  p full" mode */.
18e90 20 20 20 20 20 20 20 20 20 20 7a 45 51 50 20 3d            zEQP =
18ea0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
18eb0 28 22 45 58 50 4c 41 49 4e 20 25 73 22 2c 20 7a  ("EXPLAIN %s", z
18ec0 53 74 6d 74 53 71 6c 29 3b 0a 20 20 20 20 20 20  StmtSql);.      
18ed0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
18ee0 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
18ef0 7a 45 51 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c  zEQP, -1, &pExpl
18f00 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ain, 0);.       
18f10 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
18f20 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
18f30 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20      pArg->cMode 
18f40 3d 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 3b 0a  = MODE_Explain;.
18f50 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70 6c              expl
18f60 61 69 6e 5f 64 61 74 61 5f 70 72 65 70 61 72 65  ain_data_prepare
18f70 28 70 41 72 67 2c 20 70 45 78 70 6c 61 69 6e 29  (pArg, pExplain)
18f80 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 78  ;.            ex
18f90 65 63 5f 70 72 65 70 61 72 65 64 5f 73 74 6d 74  ec_prepared_stmt
18fa0 28 70 41 72 67 2c 20 70 45 78 70 6c 61 69 6e 29  (pArg, pExplain)
18fb0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 78  ;.            ex
18fc0 70 6c 61 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74  plain_data_delet
18fd0 65 28 70 41 72 67 29 3b 0a 20 20 20 20 20 20 20  e(pArg);.       
18fe0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73     }.          s
18ff0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
19000 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20  pExplain);.     
19010 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
19020 65 28 7a 45 51 50 29 3b 0a 20 20 20 20 20 20 20  e(zEQP);.       
19030 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
19040 41 72 67 2d 3e 61 75 74 6f 45 51 50 3e 3d 41 55  Arg->autoEQP>=AU
19050 54 4f 45 51 50 5f 74 72 69 67 67 65 72 20 26 26  TOEQP_trigger &&
19060 20 74 72 69 67 67 65 72 45 51 50 3d 3d 30 20 29   triggerEQP==0 )
19070 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
19080 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 64 62  te3_db_config(db
19090 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  , SQLITE_DBCONFI
190a0 47 5f 54 52 49 47 47 45 52 5f 45 51 50 2c 20 30  G_TRIGGER_EQP, 0
190b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
190c0 2f 2a 20 52 65 70 72 65 70 61 72 65 20 70 53 74  /* Reprepare pSt
190d0 6d 74 20 62 65 66 6f 72 65 20 72 65 61 63 74 69  mt before reacti
190e0 76 69 6e 67 20 74 72 61 63 65 20 6d 6f 64 65 73  ving trace modes
190f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
19100 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
19110 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 20  Stmt);.         
19120 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
19130 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  _v2(db, zSql, -1
19140 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
19150 20 20 20 20 20 20 20 20 69 66 28 20 70 41 72 67          if( pArg
19160 20 29 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d   ) pArg->pStmt =
19170 20 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20   pStmt;.        
19180 7d 0a 20 20 20 20 20 20 20 20 72 65 73 74 6f 72  }.        restor
19190 65 5f 64 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f  e_debug_trace_mo
191a0 64 65 73 28 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  des();.      }..
191b0 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20 29        if( pArg )
191c0 7b 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e  {.        pArg->
191d0 63 4d 6f 64 65 20 3d 20 70 41 72 67 2d 3e 6d 6f  cMode = pArg->mo
191e0 64 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  de;.        if( 
191f0 70 41 72 67 2d 3e 61 75 74 6f 45 78 70 6c 61 69  pArg->autoExplai
19200 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  n ){.          i
19210 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  f( sqlite3_colum
19220 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3d 3d  n_count(pStmt)==
19230 38 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  8.           && 
19240 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28  sqlite3_strlike(
19250 22 45 58 50 4c 41 49 4e 25 22 2c 20 7a 53 74 6d  "EXPLAIN%", zStm
19260 74 53 71 6c 2c 30 29 3d 3d 30 0a 20 20 20 20 20  tSql,0)==0.     
19270 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
19280 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20      pArg->cMode 
19290 3d 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 3b 0a  = MODE_Explain;.
192a0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
192b0 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
192c0 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
192d0 53 74 6d 74 29 3d 3d 34 0a 20 20 20 20 20 20 20  Stmt)==4.       
192e0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 73      && sqlite3_s
192f0 74 72 6c 69 6b 65 28 22 45 58 50 4c 41 49 4e 20  trlike("EXPLAIN 
19300 51 55 45 52 59 20 50 4c 41 4e 25 22 2c 20 7a 53  QUERY PLAN%", zS
19310 74 6d 74 53 71 6c 2c 30 29 3d 3d 30 20 29 7b 0a  tmtSql,0)==0 ){.
19320 20 20 20 20 20 20 20 20 20 20 20 20 70 41 72 67              pArg
19330 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45  ->cMode = MODE_E
19340 51 50 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  QP;.          }.
19350 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
19360 20 20 20 2f 2a 20 49 66 20 74 68 65 20 73 68 65     /* If the she
19370 6c 6c 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  ll is currently 
19380 69 6e 20 22 2e 65 78 70 6c 61 69 6e 22 20 6d 6f  in ".explain" mo
19390 64 65 2c 20 67 61 74 68 65 72 20 74 68 65 20 65  de, gather the e
193a0 78 74 72 61 0a 20 20 20 20 20 20 20 20 2a 2a 20  xtra.        ** 
193b0 64 61 74 61 20 72 65 71 75 69 72 65 64 20 74 6f  data required to
193c0 20 61 64 64 20 69 6e 64 65 6e 74 73 20 74 6f 20   add indents to 
193d0 74 68 65 20 6f 75 74 70 75 74 2e 2a 2f 0a 20 20  the output.*/.  
193e0 20 20 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e        if( pArg->
193f0 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c  cMode==MODE_Expl
19400 61 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ain ){.         
19410 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72   explain_data_pr
19420 65 70 61 72 65 28 70 41 72 67 2c 20 70 53 74 6d  epare(pArg, pStm
19430 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
19440 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 65 78 65      }..      exe
19450 63 5f 70 72 65 70 61 72 65 64 5f 73 74 6d 74 28  c_prepared_stmt(
19460 70 41 72 67 2c 20 70 53 74 6d 74 29 3b 0a 20 20  pArg, pStmt);.  
19470 20 20 20 20 65 78 70 6c 61 69 6e 5f 64 61 74 61      explain_data
19480 5f 64 65 6c 65 74 65 28 70 41 72 67 29 3b 0a 20  _delete(pArg);. 
19490 20 20 20 20 20 65 71 70 5f 72 65 6e 64 65 72 28       eqp_render(
194a0 70 41 72 67 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  pArg);..      /*
194b0 20 70 72 69 6e 74 20 75 73 61 67 65 20 73 74 61   print usage sta
194c0 74 73 20 69 66 20 73 74 61 74 73 20 6f 6e 20 2a  ts if stats on *
194d0 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67  /.      if( pArg
194e0 20 26 26 20 70 41 72 67 2d 3e 73 74 61 74 73 4f   && pArg->statsO
194f0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73  n ){.        dis
19500 70 6c 61 79 5f 73 74 61 74 73 28 64 62 2c 20 70  play_stats(db, p
19510 41 72 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Arg, 0);.      }
19520 0a 0a 20 20 20 20 20 20 2f 2a 20 70 72 69 6e 74  ..      /* print
19530 20 6c 6f 6f 70 2d 63 6f 75 6e 74 65 72 73 20 69   loop-counters i
19540 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  f required */.  
19550 20 20 20 20 69 66 28 20 70 41 72 67 20 26 26 20      if( pArg && 
19560 70 41 72 67 2d 3e 73 63 61 6e 73 74 61 74 73 4f  pArg->scanstatsO
19570 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73  n ){.        dis
19580 70 6c 61 79 5f 73 63 61 6e 73 74 61 74 73 28 64  play_scanstats(d
19590 62 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 20 20  b, pArg);.      
195a0 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e 61  }..      /* Fina
195b0 6c 69 7a 65 20 74 68 65 20 73 74 61 74 65 6d 65  lize the stateme
195c0 6e 74 20 6a 75 73 74 20 65 78 65 63 75 74 65 64  nt just executed
195d0 2e 20 49 66 20 74 68 69 73 20 66 61 69 6c 73 2c  . If this fails,
195e0 20 73 61 76 65 20 61 0a 20 20 20 20 20 20 2a 2a   save a.      **
195f0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 72 72   copy of the err
19600 6f 72 20 6d 65 73 73 61 67 65 2e 20 4f 74 68 65  or message. Othe
19610 72 77 69 73 65 2c 20 73 65 74 20 7a 53 71 6c 20  rwise, set zSql 
19620 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a  to point to the.
19630 20 20 20 20 20 20 2a 2a 20 6e 65 78 74 20 73 74        ** next st
19640 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 65 63 75  atement to execu
19650 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 32  te. */.      rc2
19660 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
19670 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
19680 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
19690 5f 4e 4f 4d 45 4d 20 29 20 72 63 20 3d 20 72 63  _NOMEM ) rc = rc
196a0 32 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  2;.      if( rc=
196b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
196c0 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65        zSql = zLe
196d0 66 74 6f 76 65 72 3b 0a 20 20 20 20 20 20 20 20  ftover;.        
196e0 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a  while( IsSpace(z
196f0 53 71 6c 5b 30 5d 29 20 29 20 7a 53 71 6c 2b 2b  Sql[0]) ) zSql++
19700 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
19710 28 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  ( pzErrMsg ){.  
19720 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20        *pzErrMsg 
19730 3d 20 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 64  = save_err_msg(d
19740 62 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  b);.      }..   
19750 20 20 20 2f 2a 20 63 6c 65 61 72 20 73 61 76 65     /* clear save
19760 64 20 73 74 6d 74 20 68 61 6e 64 6c 65 20 2a 2f  d stmt handle */
19770 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20  .      if( pArg 
19780 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d  ){.        pArg-
19790 3e 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 0a 20  >pStmt = NULL;. 
197a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
197b0 20 2f 2a 20 65 6e 64 20 77 68 69 6c 65 20 2a 2f   /* end while */
197c0 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
197d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
197e0 6d 65 6d 6f 72 79 20 70 72 65 76 69 6f 75 73 6c  memory previousl
197f0 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74  y allocated by t
19800 61 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 29  ableColumnList()
19810 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
19820 20 66 72 65 65 43 6f 6c 75 6d 6e 4c 69 73 74 28   freeColumnList(
19830 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20  char **azCol){. 
19840 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
19850 31 3b 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b  1; azCol[i]; i++
19860 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
19870 72 65 65 28 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20  ree(azCol[i]);. 
19880 20 7d 0a 20 20 2f 2a 20 61 7a 43 6f 6c 5b 30 5d   }.  /* azCol[0]
19890 20 69 73 20 61 20 73 74 61 74 69 63 20 73 74 72   is a static str
198a0 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ing */.  sqlite3
198b0 5f 66 72 65 65 28 61 7a 43 6f 6c 29 3b 0a 7d 0a  _free(azCol);.}.
198c0 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
198d0 6c 69 73 74 20 6f 66 20 70 6f 69 6e 74 65 72 73  list of pointers
198e0 20 74 6f 20 73 74 72 69 6e 67 73 20 77 68 69 63   to strings whic
198f0 68 20 61 72 65 20 74 68 65 20 6e 61 6d 65 73 20  h are the names 
19900 6f 66 20 61 6c 6c 0a 2a 2a 20 63 6f 6c 75 6d 6e  of all.** column
19910 73 20 69 6e 20 74 61 62 6c 65 20 7a 54 61 62 2e  s in table zTab.
19920 20 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 74 6f     The memory to
19930 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73 20   hold the names 
19940 69 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a  is dynamically.*
19950 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  * allocated and 
19960 6d 75 73 74 20 62 65 20 72 65 6c 65 61 73 65 64  must be released
19970 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75   by the caller u
19980 73 69 6e 67 20 61 20 73 75 62 73 65 71 75 65 6e  sing a subsequen
19990 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 72 65  t call.** to fre
199a0 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 29 2e 0a 2a  eColumnList()..*
199b0 2a 0a 2a 2a 20 54 68 65 20 61 7a 43 6f 6c 5b 30  *.** The azCol[0
199c0 5d 20 65 6e 74 72 79 20 69 73 20 75 73 75 61 6c  ] entry is usual
199d0 6c 79 20 4e 55 4c 4c 2e 20 20 48 6f 77 65 76 65  ly NULL.  Howeve
199e0 72 2c 20 69 66 20 7a 54 61 62 20 63 6f 6e 74 61  r, if zTab conta
199f0 69 6e 73 20 61 20 72 6f 77 69 64 0a 2a 2a 20 76  ins a rowid.** v
19a00 61 6c 75 65 20 74 68 61 74 20 6e 65 65 64 73 20  alue that needs 
19a10 74 6f 20 62 65 20 70 72 65 73 65 72 76 65 64 2c  to be preserved,
19a20 20 74 68 65 6e 20 61 7a 43 6f 6c 5b 30 5d 20 69   then azCol[0] i
19a30 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68  s filled in with
19a40 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20   the.** name of 
19a50 74 68 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e  the rowid column
19a60 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
19a70 74 20 72 65 67 75 6c 61 72 20 63 6f 6c 75 6d 6e  t regular column
19a80 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 69 73   in the table is
19a90 20 61 7a 43 6f 6c 5b 31 5d 2e 20 20 54 68 65 20   azCol[1].  The 
19aa0 6c 69 73 74 20 69 73 20 74 65 72 6d 69 6e 61 74  list is terminat
19ab0 65 64 0a 2a 2a 20 62 79 20 61 6e 20 65 6e 74 72  ed.** by an entr
19ac0 79 20 77 69 74 68 20 61 7a 43 6f 6c 5b 69 5d 3d  y with azCol[i]=
19ad0 3d 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  =0..*/.static ch
19ae0 61 72 20 2a 2a 74 61 62 6c 65 43 6f 6c 75 6d 6e  ar **tableColumn
19af0 4c 69 73 74 28 53 68 65 6c 6c 53 74 61 74 65 20  List(ShellState 
19b00 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
19b10 7a 54 61 62 29 7b 0a 20 20 63 68 61 72 20 2a 2a  zTab){.  char **
19b20 61 7a 43 6f 6c 20 3d 20 30 3b 0a 20 20 73 71 6c  azCol = 0;.  sql
19b30 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
19b40 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  ;.  char *zSql;.
19b50 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 30 3b 0a    int nCol = 0;.
19b60 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 30    int nAlloc = 0
19b70 3b 0a 20 20 69 6e 74 20 6e 50 4b 20 3d 20 30 3b  ;.  int nPK = 0;
19b80 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
19b90 20 6f 66 20 50 52 49 4d 41 52 59 20 4b 45 59 20   of PRIMARY KEY 
19ba0 63 6f 6c 75 6d 6e 73 20 73 65 65 6e 20 2a 2f 0a  columns seen */.
19bb0 20 20 69 6e 74 20 69 73 49 50 4b 20 3d 20 30 3b    int isIPK = 0;
19bc0 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
19bd0 6f 6e 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  one PRIMARY KEY 
19be0 63 6f 6c 75 6d 6e 20 6f 66 20 74 79 70 65 20 49  column of type I
19bf0 4e 54 45 47 45 52 20 2a 2f 0a 20 20 69 6e 74 20  NTEGER */.  int 
19c00 70 72 65 73 65 72 76 65 52 6f 77 69 64 20 3d 20  preserveRowid = 
19c10 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20  ShellHasFlag(p, 
19c20 53 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52 6f  SHFLG_PreserveRo
19c30 77 69 64 29 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  wid);.  int rc;.
19c40 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
19c50 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d  3_mprintf("PRAGM
19c60 41 20 74 61 62 6c 65 5f 69 6e 66 6f 3d 25 51 22  A table_info=%Q"
19c70 2c 20 7a 54 61 62 29 3b 0a 20 20 72 63 20 3d 20  , zTab);.  rc = 
19c80 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
19c90 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  v2(p->db, zSql, 
19ca0 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
19cb0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
19cc0 53 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Sql);.  if( rc )
19cd0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 68 69   return 0;.  whi
19ce0 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  le( sqlite3_step
19cf0 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f  (pStmt)==SQLITE_
19d00 52 4f 57 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ROW ){.    if( n
19d10 43 6f 6c 3e 3d 6e 41 6c 6c 6f 63 2d 32 20 29 7b  Col>=nAlloc-2 ){
19d20 0a 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20 3d 20  .      nAlloc = 
19d30 6e 41 6c 6c 6f 63 2a 32 20 2b 20 6e 43 6f 6c 20  nAlloc*2 + nCol 
19d40 2b 20 31 30 3b 0a 20 20 20 20 20 20 61 7a 43 6f  + 10;.      azCo
19d50 6c 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  l = sqlite3_real
19d60 6c 6f 63 28 61 7a 43 6f 6c 2c 20 6e 41 6c 6c 6f  loc(azCol, nAllo
19d70 63 2a 73 69 7a 65 6f 66 28 61 7a 43 6f 6c 5b 30  c*sizeof(azCol[0
19d80 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  ]));.      if( a
19d90 7a 43 6f 6c 3d 3d 30 20 29 20 73 68 65 6c 6c 5f  zCol==0 ) shell_
19da0 6f 75 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b  out_of_memory();
19db0 0a 20 20 20 20 7d 0a 20 20 20 20 61 7a 43 6f 6c  .    }.    azCol
19dc0 5b 2b 2b 6e 43 6f 6c 5d 20 3d 20 73 71 6c 69 74  [++nCol] = sqlit
19dd0 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
19de0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
19df0 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29 29 3b  text(pStmt, 1));
19e00 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
19e10 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
19e20 74 2c 20 35 29 20 29 7b 0a 20 20 20 20 20 20 6e  t, 5) ){.      n
19e30 50 4b 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  PK++;.      if( 
19e40 6e 50 4b 3d 3d 31 0a 20 20 20 20 20 20 20 26 26  nPK==1.       &&
19e50 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
19e60 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71  ((const char*)sq
19e70 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
19e80 74 28 70 53 74 6d 74 2c 32 29 2c 0a 20 20 20 20  t(pStmt,2),.    
19e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19ea0 20 20 20 20 20 20 22 49 4e 54 45 47 45 52 22 29        "INTEGER")
19eb0 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ==0.      ){.   
19ec0 20 20 20 20 20 69 73 49 50 4b 20 3d 20 31 3b 0a       isIPK = 1;.
19ed0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
19ee0 20 20 20 20 20 69 73 49 50 4b 20 3d 20 30 3b 0a       isIPK = 0;.
19ef0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
19f00 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  }.  sqlite3_fina
19f10 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69  lize(pStmt);.  i
19f20 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 20 72 65  f( azCol==0 ) re
19f30 74 75 72 6e 20 30 3b 0a 20 20 61 7a 43 6f 6c 5b  turn 0;.  azCol[
19f40 30 5d 20 3d 20 30 3b 0a 20 20 61 7a 43 6f 6c 5b  0] = 0;.  azCol[
19f50 6e 43 6f 6c 2b 31 5d 20 3d 20 30 3b 0a 0a 20 20  nCol+1] = 0;..  
19f60 2f 2a 20 54 68 65 20 64 65 63 69 73 69 6f 6e 20  /* The decision 
19f70 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f  of whether or no
19f80 74 20 61 20 72 6f 77 69 64 20 72 65 61 6c 6c 79  t a rowid really
19f90 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 72 65   needs to be pre
19fa0 73 65 72 76 65 64 0a 20 20 2a 2a 20 69 73 20 74  served.  ** is t
19fb0 72 69 63 6b 79 2e 20 20 57 65 20 6e 65 76 65 72  ricky.  We never
19fc0 20 6e 65 65 64 20 74 6f 20 70 72 65 73 65 72 76   need to preserv
19fd0 65 20 61 20 72 6f 77 69 64 20 66 6f 72 20 61 20  e a rowid for a 
19fe0 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
19ff0 62 6c 65 0a 20 20 2a 2a 20 6f 72 20 61 20 74 61  ble.  ** or a ta
1a000 62 6c 65 20 77 69 74 68 20 61 6e 20 49 4e 54 45  ble with an INTE
1a010 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2e  GER PRIMARY KEY.
1a020 20 20 57 65 20 61 72 65 20 75 6e 61 62 6c 65 20    We are unable 
1a030 74 6f 20 70 72 65 73 65 72 76 65 0a 20 20 2a 2a  to preserve.  **
1a040 20 72 6f 77 69 64 73 20 6f 6e 20 74 61 62 6c 65   rowids on table
1a050 73 20 77 68 65 72 65 20 74 68 65 20 72 6f 77 69  s where the rowi
1a060 64 20 69 73 20 69 6e 61 63 63 65 73 73 69 62 6c  d is inaccessibl
1a070 65 20 62 65 63 61 75 73 65 20 74 68 65 72 65 20  e because there 
1a080 61 72 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20 63  are other.  ** c
1a090 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61  olumns in the ta
1a0a0 62 6c 65 20 6e 61 6d 65 64 20 22 72 6f 77 69 64  ble named "rowid
1a0b0 22 2c 20 22 5f 72 6f 77 69 64 5f 22 2c 20 61 6e  ", "_rowid_", an
1a0c0 64 20 22 6f 69 64 22 2e 0a 20 20 2a 2f 0a 20 20  d "oid"..  */.  
1a0d0 69 66 28 20 70 72 65 73 65 72 76 65 52 6f 77 69  if( preserveRowi
1a0e0 64 20 26 26 20 69 73 49 50 4b 20 29 7b 0a 20 20  d && isIPK ){.  
1a0f0 20 20 2f 2a 20 49 66 20 61 20 73 69 6e 67 6c 65    /* If a single
1a100 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c   PRIMARY KEY col
1a110 75 6d 6e 20 77 69 74 68 20 74 79 70 65 20 49 4e  umn with type IN
1a120 54 45 47 45 52 20 77 61 73 20 73 65 65 6e 2c 20  TEGER was seen, 
1a130 74 68 65 6e 20 69 74 0a 20 20 20 20 2a 2a 20 6d  then it.    ** m
1a140 69 67 68 74 20 62 65 20 61 6e 20 61 6c 69 73 65  ight be an alise
1a150 20 66 6f 72 20 74 68 65 20 52 4f 57 49 44 2e 20   for the ROWID. 
1a160 20 42 75 74 20 69 74 20 6d 69 67 68 74 20 61 6c   But it might al
1a170 73 6f 20 62 65 20 61 20 57 49 54 48 4f 55 54 20  so be a WITHOUT 
1a180 52 4f 57 49 44 0a 20 20 20 20 2a 2a 20 74 61 62  ROWID.    ** tab
1a190 6c 65 20 6f 72 20 61 20 49 4e 54 45 47 45 52 20  le or a INTEGER 
1a1a0 50 52 49 4d 41 52 59 20 4b 45 59 20 44 45 53 43  PRIMARY KEY DESC
1a1b0 20 63 6f 6c 75 6d 6e 2c 20 6e 65 69 74 68 65 72   column, neither
1a1c0 20 6f 66 20 77 68 69 63 68 20 61 72 65 0a 20 20   of which are.  
1a1d0 20 20 2a 2a 20 52 4f 57 49 44 20 61 6c 69 61 73    ** ROWID alias
1a1e0 65 73 2e 20 20 54 6f 20 64 69 73 74 69 6e 67 75  es.  To distingu
1a1f0 69 73 68 20 74 68 65 73 65 20 63 61 73 65 73 2c  ish these cases,
1a200 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   check to see if
1a210 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20 69 73  .    ** there is
1a220 20 61 20 22 70 6b 22 20 65 6e 74 72 79 20 69 6e   a "pk" entry in
1a230 20 22 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 6c   "PRAGMA index_l
1a240 69 73 74 22 2e 20 20 54 68 65 72 65 20 77 69 6c  ist".  There wil
1a250 6c 20 62 65 0a 20 20 20 20 2a 2a 20 6e 6f 20 22  l be.    ** no "
1a260 70 6b 22 20 69 6e 64 65 78 20 69 66 20 74 68 65  pk" index if the
1a270 20 50 52 49 4d 41 52 59 20 4b 45 59 20 72 65 61   PRIMARY KEY rea
1a280 6c 6c 79 20 69 73 20 61 6e 20 61 6c 69 61 73 20  lly is an alias 
1a290 66 6f 72 20 74 68 65 20 52 4f 57 49 44 2e 0a 20  for the ROWID.. 
1a2a0 20 20 20 2a 2f 0a 20 20 20 20 7a 53 71 6c 20 3d     */.    zSql =
1a2b0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1a2c0 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20  ("SELECT 1 FROM 
1a2d0 70 72 61 67 6d 61 5f 69 6e 64 65 78 5f 6c 69 73  pragma_index_lis
1a2e0 74 28 25 51 29 22 0a 20 20 20 20 20 20 20 20 20  t(%Q)".         
1a2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a300 20 20 22 20 57 48 45 52 45 20 6f 72 69 67 69 6e    " WHERE origin
1a310 3d 27 70 6b 27 22 2c 20 7a 54 61 62 29 3b 0a 20  ='pk'", zTab);. 
1a320 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
1a330 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
1a340 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
1a350 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  mt, 0);.    sqli
1a360 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
1a370 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
1a380 20 20 20 20 66 72 65 65 43 6f 6c 75 6d 6e 4c 69      freeColumnLi
1a390 73 74 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20 20  st(azCol);.     
1a3a0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
1a3b0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1a3c0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20  3_step(pStmt);. 
1a3d0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
1a3e0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
1a3f0 70 72 65 73 65 72 76 65 52 6f 77 69 64 20 3d 20  preserveRowid = 
1a400 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 3b 0a  rc==SQLITE_ROW;.
1a410 20 20 7d 0a 20 20 69 66 28 20 70 72 65 73 65 72    }.  if( preser
1a420 76 65 52 6f 77 69 64 20 29 7b 0a 20 20 20 20 2f  veRowid ){.    /
1a430 2a 20 4f 6e 6c 79 20 70 72 65 73 65 72 76 65 20  * Only preserve 
1a440 74 68 65 20 72 6f 77 69 64 20 69 66 20 77 65 20  the rowid if we 
1a450 63 61 6e 20 66 69 6e 64 20 61 20 6e 61 6d 65 20  can find a name 
1a460 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 0a 20  to use for the. 
1a470 20 20 20 2a 2a 20 72 6f 77 69 64 20 2a 2f 0a 20     ** rowid */. 
1a480 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20 2a     static char *
1a490 61 7a 52 6f 77 69 64 5b 5d 20 3d 20 7b 20 22 72  azRowid[] = { "r
1a4a0 6f 77 69 64 22 2c 20 22 5f 72 6f 77 69 64 5f 22  owid", "_rowid_"
1a4b0 2c 20 22 6f 69 64 22 20 7d 3b 0a 20 20 20 20 69  , "oid" };.    i
1a4c0 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f 72  nt i, j;.    for
1a4d0 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29 7b  (j=0; j<3; j++){
1a4e0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  .      for(i=1; 
1a4f0 69 3c 3d 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20  i<=nCol; i++){. 
1a500 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1a510 65 33 5f 73 74 72 69 63 6d 70 28 61 7a 52 6f 77  e3_stricmp(azRow
1a520 69 64 5b 6a 5d 2c 61 7a 43 6f 6c 5b 69 5d 29 3d  id[j],azCol[i])=
1a530 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
1a540 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e    }.      if( i>
1a550 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  nCol ){.        
1a560 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e 74  /* At this point
1a570 2c 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 61  , we know that a
1a580 7a 52 6f 77 69 64 5b 6a 5d 20 69 73 20 6e 6f 74  zRowid[j] is not
1a590 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e 79   the name of any
1a5a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 64 69  .        ** ordi
1a5b0 6e 61 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  nary column in t
1a5c0 68 65 20 74 61 62 6c 65 2e 20 20 56 65 72 69 66  he table.  Verif
1a5d0 79 20 74 68 61 74 20 61 7a 52 6f 77 69 64 5b 6a  y that azRowid[j
1a5e0 5d 20 69 73 20 61 20 76 61 6c 69 64 0a 20 20 20  ] is a valid.   
1a5f0 20 20 20 20 20 2a 2a 20 6e 61 6d 65 20 66 6f 72       ** name for
1a600 20 74 68 65 20 72 6f 77 69 64 20 62 65 66 6f 72   the rowid befor
1a610 65 20 61 64 64 69 6e 67 20 69 74 20 74 6f 20 61  e adding it to a
1a620 7a 43 6f 6c 5b 30 5d 2e 20 20 57 49 54 48 4f 55  zCol[0].  WITHOU
1a630 54 20 52 4f 57 49 44 0a 20 20 20 20 20 20 20 20  T ROWID.        
1a640 2a 2a 20 74 61 62 6c 65 73 20 77 69 6c 6c 20 66  ** tables will f
1a650 61 69 6c 20 74 68 69 73 20 6c 61 73 74 20 63 68  ail this last ch
1a660 65 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20 72  eck */.        r
1a670 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61 62 6c  c = sqlite3_tabl
1a680 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
1a690 61 28 70 2d 3e 64 62 2c 30 2c 7a 54 61 62 2c 61  a(p->db,0,zTab,a
1a6a0 7a 52 6f 77 69 64 5b 6a 5d 2c 30 2c 30 2c 30 2c  zRowid[j],0,0,0,
1a6b0 30 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  0,0);.        if
1a6c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
1a6d0 29 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 61 7a 52  ) azCol[0] = azR
1a6e0 6f 77 69 64 5b 6a 5d 3b 0a 20 20 20 20 20 20 20  owid[j];.       
1a6f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
1a700 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
1a710 72 6e 20 61 7a 43 6f 6c 3b 0a 7d 0a 0a 2f 2a 0a  rn azCol;.}../*.
1a720 2a 2a 20 54 6f 67 67 6c 65 20 74 68 65 20 72 65  ** Toggle the re
1a730 76 65 72 73 65 5f 75 6e 6f 72 64 65 72 65 64 5f  verse_unordered_
1a740 73 65 6c 65 63 74 73 20 73 65 74 74 69 6e 67 2e  selects setting.
1a750 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1a760 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f 72 64 65  toggleSelectOrde
1a770 72 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a  r(sqlite3 *db){.
1a780 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1a790 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 6e 74  pStmt = 0;.  int
1a7a0 20 69 53 65 74 74 69 6e 67 20 3d 20 30 3b 0a 20   iSetting = 0;. 
1a7b0 20 63 68 61 72 20 7a 53 74 6d 74 5b 31 30 30 5d   char zStmt[100]
1a7c0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ;.  sqlite3_prep
1a7d0 61 72 65 5f 76 32 28 64 62 2c 20 22 50 52 41 47  are_v2(db, "PRAG
1a7e0 4d 41 20 72 65 76 65 72 73 65 5f 75 6e 6f 72 64  MA reverse_unord
1a7f0 65 72 65 64 5f 73 65 6c 65 63 74 73 22 2c 20 2d  ered_selects", -
1a800 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
1a810 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65   if( sqlite3_ste
1a820 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
1a830 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 53 65 74  _ROW ){.    iSet
1a840 74 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 5f 63  ting = sqlite3_c
1a850 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
1a860 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74   0);.  }.  sqlit
1a870 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
1a880 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  t);.  sqlite3_sn
1a890 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 53  printf(sizeof(zS
1a8a0 74 6d 74 29 2c 20 7a 53 74 6d 74 2c 0a 20 20 20  tmt), zStmt,.   
1a8b0 20 20 20 20 22 50 52 41 47 4d 41 20 72 65 76 65      "PRAGMA reve
1a8c0 72 73 65 5f 75 6e 6f 72 64 65 72 65 64 5f 73 65  rse_unordered_se
1a8d0 6c 65 63 74 73 28 25 64 29 22 2c 20 21 69 53 65  lects(%d)", !iSe
1a8e0 74 74 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74 65  tting);.  sqlite
1a8f0 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 74 6d 74  3_exec(db, zStmt
1a900 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a 2f  , 0, 0, 0);.}../
1a910 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20 64  *.** This is a d
1a920 69 66 66 65 72 65 6e 74 20 63 61 6c 6c 62 61 63  ifferent callbac
1a930 6b 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20 66  k routine used f
1a940 6f 72 20 64 75 6d 70 69 6e 67 20 74 68 65 20 64  or dumping the d
1a950 61 74 61 62 61 73 65 2e 0a 2a 2a 20 45 61 63 68  atabase..** Each
1a960 20 72 6f 77 20 72 65 63 65 69 76 65 64 20 62 79   row received by
1a970 20 74 68 69 73 20 63 61 6c 6c 62 61 63 6b 20 63   this callback c
1a980 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 74 61 62  onsists of a tab
1a990 6c 65 20 6e 61 6d 65 2c 0a 2a 2a 20 74 68 65 20  le name,.** the 
1a9a0 74 61 62 6c 65 20 74 79 70 65 20 28 22 69 6e 64  table type ("ind
1a9b0 65 78 22 20 6f 72 20 22 74 61 62 6c 65 22 29 20  ex" or "table") 
1a9c0 61 6e 64 20 53 51 4c 20 74 6f 20 63 72 65 61 74  and SQL to creat
1a9d0 65 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  e the table..** 
1a9e0 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  This routine sho
1a9f0 75 6c 64 20 70 72 69 6e 74 20 74 65 78 74 20 73  uld print text s
1aa00 75 66 66 69 63 69 65 6e 74 20 74 6f 20 72 65 63  ufficient to rec
1aa10 72 65 61 74 65 20 74 68 65 20 74 61 62 6c 65 2e  reate the table.
1aa20 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
1aa30 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 28 76 6f 69  ump_callback(voi
1aa40 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41 72  d *pArg, int nAr
1aa50 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c  g, char **azArg,
1aa60 20 63 68 61 72 20 2a 2a 61 7a 4e 6f 74 55 73 65   char **azNotUse
1aa70 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  d){.  int rc;.  
1aa80 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
1aa90 6c 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  le;.  const char
1aaa0 20 2a 7a 54 79 70 65 3b 0a 20 20 63 6f 6e 73 74   *zType;.  const
1aab0 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 53   char *zSql;.  S
1aac0 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28  hellState *p = (
1aad0 53 68 65 6c 6c 53 74 61 74 65 20 2a 29 70 41 72  ShellState *)pAr
1aae0 67 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  g;..  UNUSED_PAR
1aaf0 41 4d 45 54 45 52 28 61 7a 4e 6f 74 55 73 65 64  AMETER(azNotUsed
1ab00 29 3b 0a 20 20 69 66 28 20 6e 41 72 67 21 3d 33  );.  if( nArg!=3
1ab10 20 7c 7c 20 61 7a 41 72 67 3d 3d 30 20 29 20 72   || azArg==0 ) r
1ab20 65 74 75 72 6e 20 30 3b 0a 20 20 7a 54 61 62 6c  eturn 0;.  zTabl
1ab30 65 20 3d 20 61 7a 41 72 67 5b 30 5d 3b 0a 20 20  e = azArg[0];.  
1ab40 7a 54 79 70 65 20 3d 20 61 7a 41 72 67 5b 31 5d  zType = azArg[1]
1ab50 3b 0a 20 20 7a 53 71 6c 20 3d 20 61 7a 41 72 67  ;.  zSql = azArg
1ab60 5b 32 5d 3b 0a 0a 20 20 69 66 28 20 73 74 72 63  [2];..  if( strc
1ab70 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69  mp(zTable, "sqli
1ab80 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d 30  te_sequence")==0
1ab90 20 29 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e   ){.    raw_prin
1aba0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 44 45 4c 45  tf(p->out, "DELE
1abb0 54 45 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73  TE FROM sqlite_s
1abc0 65 71 75 65 6e 63 65 3b 5c 6e 22 29 3b 0a 20 20  equence;\n");.  
1abd0 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74 65  }else if( sqlite
1abe0 33 5f 73 74 72 67 6c 6f 62 28 22 73 71 6c 69 74  3_strglob("sqlit
1abf0 65 5f 73 74 61 74 3f 22 2c 20 7a 54 61 62 6c 65  e_stat?", zTable
1ac00 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61 77 5f  )==0 ){.    raw_
1ac10 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
1ac20 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d  ANALYZE sqlite_m
1ac30 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20 20 7d 65  aster;\n");.  }e
1ac40 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28  lse if( strncmp(
1ac50 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69 74 65 5f  zTable, "sqlite_
1ac60 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", 7)==0 ){.    
1ac70 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73  return 0;.  }els
1ac80 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 53  e if( strncmp(zS
1ac90 71 6c 2c 20 22 43 52 45 41 54 45 20 56 49 52 54  ql, "CREATE VIRT
1aca0 55 41 4c 20 54 41 42 4c 45 22 2c 20 32 30 29 3d  UAL TABLE", 20)=
1acb0 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =0 ){.    char *
1acc0 7a 49 6e 73 3b 0a 20 20 20 20 69 66 28 20 21 70  zIns;.    if( !p
1acd0 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61  ->writableSchema
1ace0 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
1acf0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50 52  intf(p->out, "PR
1ad00 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
1ad10 68 65 6d 61 3d 4f 4e 3b 5c 6e 22 29 3b 0a 20 20  hema=ON;\n");.  
1ad20 20 20 20 20 70 2d 3e 77 72 69 74 61 62 6c 65 53      p->writableS
1ad30 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 7d  chema = 1;.    }
1ad40 0a 20 20 20 20 7a 49 6e 73 20 3d 20 73 71 6c 69  .    zIns = sqli
1ad50 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
1ad60 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
1ad70 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 28 74   sqlite_master(t
1ad80 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d  ype,name,tbl_nam
1ad90 65 2c 72 6f 6f 74 70 61 67 65 2c 73 71 6c 29 22  e,rootpage,sql)"
1ada0 0a 20 20 20 20 20 20 20 22 56 41 4c 55 45 53 28  .       "VALUES(
1adb0 27 74 61 62 6c 65 27 2c 27 25 71 27 2c 27 25 71  'table','%q','%q
1adc0 27 2c 30 2c 27 25 71 27 29 3b 22 2c 0a 20 20 20  ',0,'%q');",.   
1add0 20 20 20 20 7a 54 61 62 6c 65 2c 20 7a 54 61 62      zTable, zTab
1ade0 6c 65 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 75  le, zSql);.    u
1adf0 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
1ae00 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 49 6e 73 29  t, "%s\n", zIns)
1ae10 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
1ae20 65 65 28 7a 49 6e 73 29 3b 0a 20 20 20 20 72 65  ee(zIns);.    re
1ae30 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65 7b  turn 0;.  }else{
1ae40 0a 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61  .    printSchema
1ae50 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20 7a 53 71  Line(p->out, zSq
1ae60 6c 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 7d 0a 0a  l, ";\n");.  }..
1ae70 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54 79    if( strcmp(zTy
1ae80 70 65 2c 20 22 74 61 62 6c 65 22 29 3d 3d 30 20  pe, "table")==0 
1ae90 29 7b 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74  ){.    ShellText
1aea0 20 73 53 65 6c 65 63 74 3b 0a 20 20 20 20 53 68   sSelect;.    Sh
1aeb0 65 6c 6c 54 65 78 74 20 73 54 61 62 6c 65 3b 0a  ellText sTable;.
1aec0 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c      char **azCol
1aed0 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
1aee0 20 63 68 61 72 20 2a 73 61 76 65 64 44 65 73 74   char *savedDest
1aef0 54 61 62 6c 65 3b 0a 20 20 20 20 69 6e 74 20 73  Table;.    int s
1af00 61 76 65 64 4d 6f 64 65 3b 0a 0a 20 20 20 20 61  avedMode;..    a
1af10 7a 43 6f 6c 20 3d 20 74 61 62 6c 65 43 6f 6c 75  zCol = tableColu
1af20 6d 6e 4c 69 73 74 28 70 2c 20 7a 54 61 62 6c 65  mnList(p, zTable
1af30 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43 6f 6c  );.    if( azCol
1af40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
1af50 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65  nErr++;.      re
1af60 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  turn 0;.    }.. 
1af70 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 71 75 6f     /* Always quo
1af80 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  te the table nam
1af90 65 2c 20 65 76 65 6e 20 69 66 20 69 74 20 61 70  e, even if it ap
1afa0 70 65 61 72 73 20 74 6f 20 62 65 20 70 75 72 65  pears to be pure
1afb0 20 61 73 63 69 69 2c 0a 20 20 20 20 2a 2a 20 69   ascii,.    ** i
1afc0 6e 20 63 61 73 65 20 69 74 20 69 73 20 61 20 6b  n case it is a k
1afd0 65 79 77 6f 72 64 2e 20 45 78 3a 20 20 49 4e 53  eyword. Ex:  INS
1afe0 45 52 54 20 49 4e 54 4f 20 22 74 61 62 6c 65 22  ERT INTO "table"
1aff0 20 2e 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e 69 74   ... */.    init
1b000 54 65 78 74 28 26 73 54 61 62 6c 65 29 3b 0a 20  Text(&sTable);. 
1b010 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
1b020 54 61 62 6c 65 2c 20 7a 54 61 62 6c 65 2c 20 71  Table, zTable, q
1b030 75 6f 74 65 43 68 61 72 28 7a 54 61 62 6c 65 29  uoteChar(zTable)
1b040 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 70 72 65  );.    /* If pre
1b050 73 65 72 76 69 6e 67 20 74 68 65 20 72 6f 77 69  serving the rowi
1b060 64 2c 20 61 64 64 20 61 20 63 6f 6c 75 6d 6e 20  d, add a column 
1b070 6c 69 73 74 20 61 66 74 65 72 20 74 68 65 20 74  list after the t
1b080 61 62 6c 65 20 6e 61 6d 65 2e 0a 20 20 20 20 2a  able name..    *
1b090 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73  * In other words
1b0a0 3a 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  :  "INSERT INTO 
1b0b0 74 61 62 28 72 6f 77 69 64 2c 61 2c 62 2c 63 2c  tab(rowid,a,b,c,
1b0c0 2e 2e 2e 29 20 56 41 4c 55 45 53 28 2e 2e 2e 29  ...) VALUES(...)
1b0d0 22 0a 20 20 20 20 2a 2a 20 69 6e 73 74 65 61 64  ".    ** instead
1b0e0 20 6f 66 20 74 68 65 20 75 73 75 61 6c 20 22 49   of the usual "I
1b0f0 4e 53 45 52 54 20 49 4e 54 4f 20 74 61 62 20 56  NSERT INTO tab V
1b100 41 4c 55 45 53 28 2e 2e 2e 29 22 2e 0a 20 20 20  ALUES(...)"..   
1b110 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 7a 43 6f   */.    if( azCo
1b120 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 61 70  l[0] ){.      ap
1b130 70 65 6e 64 54 65 78 74 28 26 73 54 61 62 6c 65  pendText(&sTable
1b140 2c 20 22 28 22 2c 20 30 29 3b 0a 20 20 20 20 20  , "(", 0);.     
1b150 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 54 61   appendText(&sTa
1b160 62 6c 65 2c 20 61 7a 43 6f 6c 5b 30 5d 2c 20 30  ble, azCol[0], 0
1b170 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31  );.      for(i=1
1b180 3b 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29  ; azCol[i]; i++)
1b190 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  {.        append
1b1a0 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20 22 2c  Text(&sTable, ",
1b1b0 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  ", 0);.        a
1b1c0 70 70 65 6e 64 54 65 78 74 28 26 73 54 61 62 6c  ppendText(&sTabl
1b1d0 65 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 71 75 6f  e, azCol[i], quo
1b1e0 74 65 43 68 61 72 28 61 7a 43 6f 6c 5b 69 5d 29  teChar(azCol[i])
1b1f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1b200 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 54 61   appendText(&sTa
1b210 62 6c 65 2c 20 22 29 22 2c 20 30 29 3b 0a 20 20  ble, ")", 0);.  
1b220 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 42 75 69 6c    }..    /* Buil
1b230 64 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  d an appropriate
1b240 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
1b250 74 20 2a 2f 0a 20 20 20 20 69 6e 69 74 54 65 78  t */.    initTex
1b260 74 28 26 73 53 65 6c 65 63 74 29 3b 0a 20 20 20  t(&sSelect);.   
1b270 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
1b280 6c 65 63 74 2c 20 22 53 45 4c 45 43 54 20 22 2c  lect, "SELECT ",
1b290 20 30 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43   0);.    if( azC
1b2a0 6f 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 61  ol[0] ){.      a
1b2b0 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
1b2c0 63 74 2c 20 61 7a 43 6f 6c 5b 30 5d 2c 20 30 29  ct, azCol[0], 0)
1b2d0 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65  ;.      appendTe
1b2e0 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 2c 22  xt(&sSelect, ","
1b2f0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
1b300 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b 69  for(i=1; azCol[i
1b310 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61  ]; i++){.      a
1b320 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
1b330 63 74 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 71 75  ct, azCol[i], qu
1b340 6f 74 65 43 68 61 72 28 61 7a 43 6f 6c 5b 69 5d  oteChar(azCol[i]
1b350 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 7a  ));.      if( az
1b360 43 6f 6c 5b 69 2b 31 5d 20 29 7b 0a 20 20 20 20  Col[i+1] ){.    
1b370 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
1b380 73 53 65 6c 65 63 74 2c 20 22 2c 22 2c 20 30 29  sSelect, ",", 0)
1b390 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
1b3a0 20 20 20 20 66 72 65 65 43 6f 6c 75 6d 6e 4c 69      freeColumnLi
1b3b0 73 74 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20 61  st(azCol);.    a
1b3c0 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
1b3d0 63 74 2c 20 22 20 46 52 4f 4d 20 22 2c 20 30 29  ct, " FROM ", 0)
1b3e0 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78 74  ;.    appendText
1b3f0 28 26 73 53 65 6c 65 63 74 2c 20 7a 54 61 62 6c  (&sSelect, zTabl
1b400 65 2c 20 71 75 6f 74 65 43 68 61 72 28 7a 54 61  e, quoteChar(zTa
1b410 62 6c 65 29 29 3b 0a 0a 20 20 20 20 73 61 76 65  ble));..    save
1b420 64 44 65 73 74 54 61 62 6c 65 20 3d 20 70 2d 3e  dDestTable = p->
1b430 7a 44 65 73 74 54 61 62 6c 65 3b 0a 20 20 20 20  zDestTable;.    
1b440 73 61 76 65 64 4d 6f 64 65 20 3d 20 70 2d 3e 6d  savedMode = p->m
1b450 6f 64 65 3b 0a 20 20 20 20 70 2d 3e 7a 44 65 73  ode;.    p->zDes
1b460 74 54 61 62 6c 65 20 3d 20 73 54 61 62 6c 65 2e  tTable = sTable.
1b470 7a 3b 0a 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d  z;.    p->mode =
1b480 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f 44 45   p->cMode = MODE
1b490 5f 49 6e 73 65 72 74 3b 0a 20 20 20 20 72 63 20  _Insert;.    rc 
1b4a0 3d 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2c 20  = shell_exec(p, 
1b4b0 73 53 65 6c 65 63 74 2e 7a 2c 20 30 29 3b 0a 20  sSelect.z, 0);. 
1b4c0 20 20 20 69 66 28 20 28 72 63 26 30 78 66 66 29     if( (rc&0xff)
1b4d0 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  ==SQLITE_CORRUPT
1b4e0 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
1b4f0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a  intf(p->out, "/*
1b500 2a 2a 2a 2a 2a 20 43 4f 52 52 55 50 54 49 4f 4e  ***** CORRUPTION
1b510 20 45 52 52 4f 52 20 2a 2a 2a 2a 2a 2a 2a 2f 5c   ERROR *******/\
1b520 6e 22 29 3b 0a 20 20 20 20 20 20 74 6f 67 67 6c  n");.      toggl
1b530 65 53 65 6c 65 63 74 4f 72 64 65 72 28 70 2d 3e  eSelectOrder(p->
1b540 64 62 29 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c  db);.      shell
1b550 5f 65 78 65 63 28 70 2c 20 73 53 65 6c 65 63 74  _exec(p, sSelect
1b560 2e 7a 2c 20 30 29 3b 0a 20 20 20 20 20 20 74 6f  .z, 0);.      to
1b570 67 67 6c 65 53 65 6c 65 63 74 4f 72 64 65 72 28  ggleSelectOrder(
1b580 70 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  p->db);.    }.  
1b590 20 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20    p->zDestTable 
1b5a0 3d 20 73 61 76 65 64 44 65 73 74 54 61 62 6c 65  = savedDestTable
1b5b0 3b 0a 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20  ;.    p->mode = 
1b5c0 73 61 76 65 64 4d 6f 64 65 3b 0a 20 20 20 20 66  savedMode;.    f
1b5d0 72 65 65 54 65 78 74 28 26 73 54 61 62 6c 65 29  reeText(&sTable)
1b5e0 3b 0a 20 20 20 20 66 72 65 65 54 65 78 74 28 26  ;.    freeText(&
1b5f0 73 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 69 66  sSelect);.    if
1b600 28 20 72 63 20 29 20 70 2d 3e 6e 45 72 72 2b 2b  ( rc ) p->nErr++
1b610 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
1b620 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 7a  ;.}../*.** Run z
1b630 51 75 65 72 79 2e 20 20 55 73 65 20 64 75 6d 70  Query.  Use dump
1b640 5f 63 61 6c 6c 62 61 63 6b 28 29 20 61 73 20 74  _callback() as t
1b650 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  he callback rout
1b660 69 6e 65 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74  ine so that.** t
1b670 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
1b680 68 65 20 71 75 65 72 79 20 61 72 65 20 6f 75 74  he query are out
1b690 70 75 74 20 61 73 20 53 51 4c 20 73 74 61 74 65  put as SQL state
1b6a0 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ments..**.** If 
1b6b0 77 65 20 67 65 74 20 61 20 53 51 4c 49 54 45 5f  we get a SQLITE_
1b6c0 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2c 20 72  CORRUPT error, r
1b6d0 65 72 75 6e 20 74 68 65 20 71 75 65 72 79 20 61  erun the query a
1b6e0 66 74 65 72 20 61 70 70 65 6e 64 69 6e 67 0a 2a  fter appending.*
1b6f0 2a 20 22 4f 52 44 45 52 20 42 59 20 72 6f 77 69  * "ORDER BY rowi
1b700 64 20 44 45 53 43 22 20 74 6f 20 74 68 65 20 65  d DESC" to the e
1b710 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
1b720 74 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d  t run_schema_dum
1b730 70 5f 71 75 65 72 79 28 0a 20 20 53 68 65 6c 6c  p_query(.  Shell
1b740 53 74 61 74 65 20 2a 70 2c 0a 20 20 63 6f 6e 73  State *p,.  cons
1b750 74 20 63 68 61 72 20 2a 7a 51 75 65 72 79 0a 29  t char *zQuery.)
1b760 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  {.  int rc;.  ch
1b770 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20  ar *zErr = 0;.  
1b780 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
1b790 63 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c  c(p->db, zQuery,
1b7a0 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 2c 20   dump_callback, 
1b7b0 70 2c 20 26 7a 45 72 72 29 3b 0a 20 20 69 66 28  p, &zErr);.  if(
1b7c0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52   rc==SQLITE_CORR
1b7d0 55 50 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20  UPT ){.    char 
1b7e0 2a 7a 51 32 3b 0a 20 20 20 20 69 6e 74 20 6c 65  *zQ2;.    int le
1b7f0 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 51 75  n = strlen30(zQu
1b800 65 72 79 29 3b 0a 20 20 20 20 72 61 77 5f 70 72  ery);.    raw_pr
1b810 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a  intf(p->out, "/*
1b820 2a 2a 2a 2a 2a 20 43 4f 52 52 55 50 54 49 4f 4e  ***** CORRUPTION
1b830 20 45 52 52 4f 52 20 2a 2a 2a 2a 2a 2a 2a 2f 5c   ERROR *******/\
1b840 6e 22 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 72  n");.    if( zEr
1b850 72 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  r ){.      utf8_
1b860 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
1b870 2f 2a 2a 2a 2a 2a 2a 20 25 73 20 2a 2a 2a 2a 2a  /****** %s *****
1b880 2a 2f 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20  */\n", zErr);.  
1b890 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
1b8a0 28 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 7a 45  (zErr);.      zE
1b8b0 72 72 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  rr = 0;.    }.  
1b8c0 20 20 7a 51 32 20 3d 20 6d 61 6c 6c 6f 63 28 20    zQ2 = malloc( 
1b8d0 6c 65 6e 2b 31 30 30 20 29 3b 0a 20 20 20 20 69  len+100 );.    i
1b8e0 66 28 20 7a 51 32 3d 3d 30 20 29 20 72 65 74 75  f( zQ2==0 ) retu
1b8f0 72 6e 20 72 63 3b 0a 20 20 20 20 73 71 6c 69 74  rn rc;.    sqlit
1b900 65 33 5f 73 6e 70 72 69 6e 74 66 28 6c 65 6e 2b  e3_snprintf(len+
1b910 31 30 30 2c 20 7a 51 32 2c 20 22 25 73 20 4f 52  100, zQ2, "%s OR
1b920 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45 53  DER BY rowid DES
1b930 43 22 2c 20 7a 51 75 65 72 79 29 3b 0a 20 20 20  C", zQuery);.   
1b940 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
1b950 65 63 28 70 2d 3e 64 62 2c 20 7a 51 32 2c 20 64  ec(p->db, zQ2, d
1b960 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2c  ump_callback, p,
1b970 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28   &zErr);.    if(
1b980 20 72 63 20 29 7b 0a 20 20 20 20 20 20 75 74 66   rc ){.      utf
1b990 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
1b9a0 20 22 2f 2a 2a 2a 2a 2a 2a 20 45 52 52 4f 52 3a   "/****** ERROR:
1b9b0 20 25 73 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20   %s ******/\n", 
1b9c0 7a 45 72 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  zErr);.    }else
1b9d0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
1b9e0 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  ITE_CORRUPT;.   
1b9f0 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
1ba00 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 66  ree(zErr);.    f
1ba10 72 65 65 28 7a 51 32 29 3b 0a 20 20 7d 0a 20 20  ree(zQ2);.  }.  
1ba20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
1ba30 0a 2a 2a 20 54 65 78 74 20 6f 66 20 68 65 6c 70  .** Text of help
1ba40 20 6d 65 73 73 61 67 65 73 2e 0a 2a 2a 0a 2a 2a   messages..**.**
1ba50 20 54 68 65 20 68 65 6c 70 20 74 65 78 74 20 66   The help text f
1ba60 6f 72 20 65 61 63 68 20 69 6e 64 69 76 69 64 75  or each individu
1ba70 61 6c 20 63 6f 6d 6d 61 6e 64 20 62 65 67 69 6e  al command begin
1ba80 73 20 77 69 74 68 20 61 20 6c 69 6e 65 20 74 68  s with a line th
1ba90 61 74 20 73 74 61 72 74 73 0a 2a 2a 20 77 69 74  at starts.** wit
1baa0 68 20 22 2e 22 2e 20 20 53 75 62 73 65 71 75 65  h ".".  Subseque
1bab0 6e 74 20 6c 69 6e 65 73 20 61 72 65 20 73 75 70  nt lines are sup
1bac0 70 6c 69 6d 65 6e 74 61 6c 20 69 6e 66 6f 72 6d  plimental inform
1bad0 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ation..**.** The
1bae0 72 65 20 6d 75 73 74 20 62 65 20 74 77 6f 20 6f  re must be two o
1baf0 72 20 6d 6f 72 65 20 73 70 61 63 65 73 20 62 65  r more spaces be
1bb00 74 77 65 65 6e 20 74 68 65 20 65 6e 64 20 6f 66  tween the end of
1bb10 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 61 6e 64   the command and
1bb20 20 74 68 65 0a 2a 2a 20 73 74 61 72 74 20 6f 66   the.** start of
1bb30 20 74 68 65 20 64 65 73 63 72 69 70 74 69 6f 6e   the description
1bb40 20 6f 66 20 77 68 61 74 20 74 68 61 74 20 63 6f   of what that co
1bb50 6d 6d 61 6e 64 20 64 6f 65 73 2e 0a 2a 2f 0a 73  mmand does..*/.s
1bb60 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
1bb70 20 2a 28 61 7a 48 65 6c 70 5b 5d 29 20 3d 20 7b   *(azHelp[]) = {
1bb80 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1bb90 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 29 20 26  ITE_HAVE_ZLIB) &
1bba0 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
1bbb0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
1bbc0 42 4c 45 29 0a 20 20 22 2e 61 72 63 68 69 76 65  BLE).  ".archive
1bbd0 20 2e 2e 2e 20 20 20 20 20 20 20 20 20 20 20 20   ...            
1bbe0 20 4d 61 6e 61 67 65 20 53 51 4c 20 61 72 63 68   Manage SQL arch
1bbf0 69 76 65 73 22 2c 0a 20 20 22 20 20 20 45 61 63  ives",.  "   Eac
1bc00 68 20 63 6f 6d 6d 61 6e 64 20 6d 75 73 74 20 68  h command must h
1bc10 61 76 65 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  ave exactly one 
1bc20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
1bc30 20 6f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20   options:",.  " 
1bc40 20 20 20 20 2d 63 2c 20 2d 2d 63 72 65 61 74 65      -c, --create
1bc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43                 C
1bc60 72 65 61 74 65 20 61 20 6e 65 77 20 61 72 63 68  reate a new arch
1bc70 69 76 65 22 2c 0a 20 20 22 20 20 20 20 20 2d 75  ive",.  "     -u
1bc80 2c 20 2d 2d 75 70 64 61 74 65 20 20 20 20 20 20  , --update      
1bc90 20 20 20 20 20 20 20 20 20 55 70 64 61 74 65 20           Update 
1bca0 6f 72 20 61 64 64 20 66 69 6c 65 73 20 74 6f 20  or add files to 
1bcb0 61 6e 20 65 78 69 73 74 69 6e 67 20 61 72 63 68  an existing arch
1bcc0 69 76 65 22 2c 0a 20 20 22 20 20 20 20 20 2d 74  ive",.  "     -t
1bcd0 2c 20 2d 2d 6c 69 73 74 20 20 20 20 20 20 20 20  , --list        
1bce0 20 20 20 20 20 20 20 20 20 4c 69 73 74 20 63 6f           List co
1bcf0 6e 74 65 6e 74 73 20 6f 66 20 61 72 63 68 69 76  ntents of archiv
1bd00 65 22 2c 0a 20 20 22 20 20 20 20 20 2d 78 2c 20  e",.  "     -x, 
1bd10 2d 2d 65 78 74 72 61 63 74 20 20 20 20 20 20 20  --extract       
1bd20 20 20 20 20 20 20 20 45 78 74 72 61 63 74 20 66         Extract f
1bd30 69 6c 65 73 20 66 72 6f 6d 20 61 72 63 68 69 76  iles from archiv
1bd40 65 22 2c 0a 20 20 22 20 20 20 4f 70 74 69 6f 6e  e",.  "   Option
1bd50 61 6c 20 61 72 67 75 6d 65 6e 74 73 3a 22 2c 0a  al arguments:",.
1bd60 20 20 22 20 20 20 20 20 2d 76 2c 20 2d 2d 76 65    "     -v, --ve
1bd70 72 62 6f 73 65 20 20 20 20 20 20 20 20 20 20 20  rbose           
1bd80 20 20 20 50 72 69 6e 74 20 65 61 63 68 20 66 69     Print each fi
1bd90 6c 65 6e 61 6d 65 20 61 73 20 69 74 20 69 73 20  lename as it is 
1bda0 70 72 6f 63 65 73 73 65 64 22 2c 0a 20 20 22 20  processed",.  " 
1bdb0 20 20 20 20 2d 66 20 46 49 4c 45 2c 20 2d 2d 66      -f FILE, --f
1bdc0 69 6c 65 20 46 49 4c 45 20 20 20 20 20 20 20 4f  ile FILE       O
1bdd0 70 65 72 61 74 65 20 6f 6e 20 61 72 63 68 69 76  perate on archiv
1bde0 65 20 46 49 4c 45 20 28 64 65 66 61 75 6c 74 20  e FILE (default 
1bdf0 69 73 20 63 75 72 72 65 6e 74 20 64 62 29 22 2c  is current db)",
1be00 0a 20 20 22 20 20 20 20 20 2d 61 20 46 49 4c 45  .  "     -a FILE
1be10 2c 20 2d 2d 61 70 70 65 6e 64 20 46 49 4c 45 20  , --append FILE 
1be20 20 20 20 20 4f 70 65 72 61 74 65 20 6f 6e 20 46      Operate on F
1be30 49 4c 45 20 6f 70 65 6e 65 64 20 75 73 69 6e 67  ILE opened using
1be40 20 74 68 65 20 61 70 6e 64 76 66 73 20 56 46 53   the apndvfs VFS
1be50 22 2c 0a 20 20 22 20 20 20 20 20 2d 43 20 44 49  ",.  "     -C DI
1be60 52 2c 20 2d 2d 64 69 72 65 63 74 6f 72 79 20 44  R, --directory D
1be70 49 52 20 20 20 20 43 68 61 6e 67 65 20 74 6f 20  IR    Change to 
1be80 64 69 72 65 63 74 6f 72 79 20 44 49 52 20 74 6f  directory DIR to
1be90 20 72 65 61 64 2f 65 78 74 72 61 63 74 20 66 69   read/extract fi
1bea0 6c 65 73 22 2c 0a 20 20 22 20 20 20 20 20 2d 6e  les",.  "     -n
1beb0 2c 20 2d 2d 64 72 79 72 75 6e 20 20 20 20 20 20  , --dryrun      
1bec0 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 74 68           Show th
1bed0 65 20 53 51 4c 20 74 68 61 74 20 77 6f 75 6c 64  e SQL that would
1bee0 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 22 2c   have occurred",
1bef0 0a 20 20 22 20 20 20 45 78 61 6d 70 6c 65 73 3a  .  "   Examples:
1bf00 22 2c 0a 20 20 22 20 20 20 20 20 2e 61 72 20 2d  ",.  "     .ar -
1bf10 63 66 20 61 72 63 68 69 76 65 2e 73 61 72 20 66  cf archive.sar f
1bf20 6f 6f 20 62 61 72 20 20 23 20 43 72 65 61 74 65  oo bar  # Create
1bf30 20 61 72 63 68 69 76 65 2e 73 61 72 20 66 72 6f   archive.sar fro
1bf40 6d 20 66 69 6c 65 73 20 66 6f 6f 20 61 6e 64 20  m files foo and 
1bf50 62 61 72 22 2c 0a 20 20 22 20 20 20 20 20 2e 61  bar",.  "     .a
1bf60 72 20 2d 74 66 20 61 72 63 68 69 76 65 2e 73 61  r -tf archive.sa
1bf70 72 20 20 20 20 20 20 20 20 20 20 23 20 4c 69 73  r          # Lis
1bf80 74 20 6d 65 6d 62 65 72 73 20 6f 66 20 61 72 63  t members of arc
1bf90 68 69 76 65 2e 73 61 72 22 2c 0a 20 20 22 20 20  hive.sar",.  "  
1bfa0 20 20 20 2e 61 72 20 2d 78 76 66 20 61 72 63 68     .ar -xvf arch
1bfb0 69 76 65 2e 73 61 72 20 20 20 20 20 20 20 20 20  ive.sar         
1bfc0 23 20 56 65 72 62 6f 73 65 6c 79 20 65 78 74 72  # Verbosely extr
1bfd0 61 63 74 20 66 69 6c 65 73 20 66 72 6f 6d 20 61  act files from a
1bfe0 72 63 68 69 76 65 2e 73 61 72 22 2c 0a 20 20 22  rchive.sar",.  "
1bff0 20 20 20 53 65 65 20 61 6c 73 6f 3a 22 2c 0a 20     See also:",. 
1c000 20 22 20 20 20 20 20 20 68 74 74 70 3a 2f 2f 73   "      http://s
1c010 71 6c 69 74 65 2e 6f 72 67 2f 63 6c 69 2e 68 74  qlite.org/cli.ht
1c020 6d 6c 23 73 71 6c 61 72 5f 61 72 63 68 69 76 65  ml#sqlar_archive
1c030 5f 73 75 70 70 6f 72 74 22 2c 0a 23 65 6e 64 69  _support",.#endi
1c040 66 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  f.#ifndef SQLITE
1c050 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
1c060 49 4f 4e 0a 20 20 22 2e 61 75 74 68 20 4f 4e 7c  ION.  ".auth ON|
1c070 4f 46 46 20 20 20 20 20 20 20 20 20 20 20 20 20  OFF             
1c080 53 68 6f 77 20 61 75 74 68 6f 72 69 7a 65 72 20  Show authorizer 
1c090 63 61 6c 6c 62 61 63 6b 73 22 2c 0a 23 65 6e 64  callbacks",.#end
1c0a0 69 66 0a 20 20 22 2e 62 61 63 6b 75 70 20 3f 44  if.  ".backup ?D
1c0b0 42 3f 20 46 49 4c 45 20 20 20 20 20 20 20 20 42  B? FILE        B
1c0c0 61 63 6b 75 70 20 44 42 20 28 64 65 66 61 75 6c  ackup DB (defaul
1c0d0 74 20 5c 22 6d 61 69 6e 5c 22 29 20 74 6f 20 46  t \"main\") to F
1c0e0 49 4c 45 22 2c 0a 20 20 22 20 20 20 20 20 20 20  ILE",.  "       
1c0f0 2d 2d 61 70 70 65 6e 64 20 20 20 20 20 20 20 20  --append        
1c100 20 20 20 20 55 73 65 20 74 68 65 20 61 70 70 65      Use the appe
1c110 6e 64 76 66 73 22 2c 0a 20 20 22 20 20 20 20 20  ndvfs",.  "     
1c120 20 20 2d 2d 61 73 79 6e 63 20 20 20 20 20 20 20    --async       
1c130 20 20 20 20 20 20 57 72 69 74 65 20 74 6f 20 46        Write to F
1c140 49 4c 45 20 77 69 74 68 6f 75 74 20 61 20 6a 6f  ILE without a jo
1c150 75 72 6e 61 6c 20 61 6e 64 20 77 69 74 68 6f 75  urnal and withou
1c160 74 20 66 73 79 6e 63 28 29 22 2c 0a 20 20 22 2e  t fsync()",.  ".
1c170 62 61 69 6c 20 6f 6e 7c 6f 66 66 20 20 20 20 20  bail on|off     
1c180 20 20 20 20 20 20 20 20 53 74 6f 70 20 61 66 74          Stop aft
1c190 65 72 20 68 69 74 74 69 6e 67 20 61 6e 20 65 72  er hitting an er
1c1a0 72 6f 72 2e 20 20 44 65 66 61 75 6c 74 20 4f 46  ror.  Default OF
1c1b0 46 22 2c 0a 20 20 22 2e 62 69 6e 61 72 79 20 6f  F",.  ".binary o
1c1c0 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20 20  n|off           
1c1d0 54 75 72 6e 20 62 69 6e 61 72 79 20 6f 75 74 70  Turn binary outp
1c1e0 75 74 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 44  ut on or off.  D
1c1f0 65 66 61 75 6c 74 20 4f 46 46 22 2c 0a 20 20 22  efault OFF",.  "
1c200 2e 63 64 20 44 49 52 45 43 54 4f 52 59 20 20 20  .cd DIRECTORY   
1c210 20 20 20 20 20 20 20 20 20 43 68 61 6e 67 65 20           Change 
1c220 74 68 65 20 77 6f 72 6b 69 6e 67 20 64 69 72 65  the working dire
1c230 63 74 6f 72 79 20 74 6f 20 44 49 52 45 43 54 4f  ctory to DIRECTO
1c240 52 59 22 2c 0a 20 20 22 2e 63 68 61 6e 67 65 73  RY",.  ".changes
1c250 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20   on|off         
1c260 20 53 68 6f 77 20 6e 75 6d 62 65 72 20 6f 66 20   Show number of 
1c270 72 6f 77 73 20 63 68 61 6e 67 65 64 20 62 79 20  rows changed by 
1c280 53 51 4c 22 2c 0a 20 20 22 2e 63 68 65 63 6b 20  SQL",.  ".check 
1c290 47 4c 4f 42 20 20 20 20 20 20 20 20 20 20 20 20  GLOB            
1c2a0 20 20 46 61 69 6c 20 69 66 20 6f 75 74 70 75 74    Fail if output
1c2b0 20 73 69 6e 63 65 20 2e 74 65 73 74 63 61 73 65   since .testcase
1c2c0 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 22   does not match"
1c2d0 2c 0a 20 20 22 2e 63 6c 6f 6e 65 20 4e 45 57 44  ,.  ".clone NEWD
1c2e0 42 20 20 20 20 20 20 20 20 20 20 20 20 20 43 6c  B             Cl
1c2f0 6f 6e 65 20 64 61 74 61 20 69 6e 74 6f 20 4e 45  one data into NE
1c300 57 44 42 20 66 72 6f 6d 20 74 68 65 20 65 78 69  WDB from the exi
1c310 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 22 2c  sting database",
1c320 0a 20 20 22 2e 64 61 74 61 62 61 73 65 73 20 20  .  ".databases  
1c330 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 69 73               Lis
1c340 74 20 6e 61 6d 65 73 20 61 6e 64 20 66 69 6c 65  t names and file
1c350 73 20 6f 66 20 61 74 74 61 63 68 65 64 20 64 61  s of attached da
1c360 74 61 62 61 73 65 73 22 2c 0a 20 20 22 2e 64 62  tabases",.  ".db
1c370 63 6f 6e 66 69 67 20 3f 6f 70 3f 20 3f 76 61 6c  config ?op? ?val
1c380 3f 20 20 20 20 20 4c 69 73 74 20 6f 72 20 63 68  ?     List or ch
1c390 61 6e 67 65 20 73 71 6c 69 74 65 33 5f 64 62 5f  ange sqlite3_db_
1c3a0 63 6f 6e 66 69 67 28 29 20 6f 70 74 69 6f 6e 73  config() options
1c3b0 22 2c 0a 20 20 22 2e 64 62 69 6e 66 6f 20 3f 44  ",.  ".dbinfo ?D
1c3c0 42 3f 20 20 20 20 20 20 20 20 20 20 20 20 20 53  B?             S
1c3d0 68 6f 77 20 73 74 61 74 75 73 20 69 6e 66 6f 72  how status infor
1c3e0 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65  mation about the
1c3f0 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 22 2e   database",.  ".
1c400 64 75 6d 70 20 3f 54 41 42 4c 45 3f 20 2e 2e 2e  dump ?TABLE? ...
1c410 20 20 20 20 20 20 20 20 52 65 6e 64 65 72 20 61          Render a
1c420 6c 6c 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  ll database cont
1c430 65 6e 74 20 61 73 20 53 51 4c 22 2c 0a 20 20 22  ent as SQL",.  "
1c440 20 20 20 4f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20     Options:",.  
1c450 22 20 20 20 20 20 2d 2d 70 72 65 73 65 72 76 65  "     --preserve
1c460 2d 72 6f 77 69 64 73 20 20 20 20 20 20 49 6e 63  -rowids      Inc
1c470 6c 75 64 65 20 52 4f 57 49 44 20 76 61 6c 75 65  lude ROWID value
1c480 73 20 69 6e 20 74 68 65 20 6f 75 74 70 75 74 22  s in the output"
1c490 2c 0a 20 20 22 20 20 20 20 20 2d 2d 6e 65 77 6c  ,.  "     --newl
1c4a0 69 6e 65 73 20 20 20 20 20 20 20 20 20 20 20 20  ines            
1c4b0 20 41 6c 6c 6f 77 20 75 6e 65 73 63 61 70 65 64   Allow unescaped
1c4c0 20 6e 65 77 6c 69 6e 65 20 63 68 61 72 61 63 74   newline charact
1c4d0 65 72 73 20 69 6e 20 6f 75 74 70 75 74 22 2c 0a  ers in output",.
1c4e0 20 20 22 20 20 20 54 41 42 4c 45 20 69 73 20 4c    "   TABLE is L
1c4f0 49 4b 45 20 70 61 74 74 65 72 6e 20 66 6f 72 20  IKE pattern for 
1c500 74 68 65 20 74 61 62 6c 65 73 20 74 6f 20 64 75  the tables to du
1c510 6d 70 22 2c 0a 20 20 22 2e 65 63 68 6f 20 6f 6e  mp",.  ".echo on
1c520 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20 20 20  |off            
1c530 20 54 75 72 6e 20 63 6f 6d 6d 61 6e 64 20 65 63   Turn command ec
1c540 68 6f 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a 20  ho on or off",. 
1c550 20 22 2e 65 71 70 20 6f 6e 7c 6f 66 66 7c 66 75   ".eqp on|off|fu
1c560 6c 6c 7c 2e 2e 2e 20 20 20 20 20 45 6e 61 62 6c  ll|...     Enabl
1c570 65 20 6f 72 20 64 69 73 61 62 6c 65 20 61 75 74  e or disable aut
1c580 6f 6d 61 74 69 63 20 45 58 50 4c 41 49 4e 20 51  omatic EXPLAIN Q
1c590 55 45 52 59 20 50 4c 41 4e 22 2c 0a 20 20 22 20  UERY PLAN",.  " 
1c5a0 20 20 4f 74 68 65 72 20 4d 6f 64 65 73 3a 22 2c    Other Modes:",
1c5b0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 44  .#ifdef SQLITE_D
1c5c0 45 42 55 47 0a 20 20 22 20 20 20 20 20 20 74 65  EBUG.  "      te
1c5d0 73 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  st              
1c5e0 20 20 20 20 53 68 6f 77 20 72 61 77 20 45 58 50      Show raw EXP
1c5f0 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
1c600 6f 75 74 70 75 74 22 2c 0a 20 20 22 20 20 20 20  output",.  "    
1c610 20 20 74 72 61 63 65 20 20 20 20 20 20 20 20 20    trace         
1c620 20 20 20 20 20 20 20 20 4c 69 6b 65 20 5c 22 66          Like \"f
1c630 75 6c 6c 5c 22 20 62 75 74 20 61 6c 73 6f 20 65  ull\" but also e
1c640 6e 61 62 6c 65 20 5c 22 50 52 41 47 4d 41 20 76  nable \"PRAGMA v
1c650 64 62 65 5f 74 72 61 63 65 5c 22 22 2c 0a 23 65  dbe_trace\"",.#e
1c660 6e 64 69 66 0a 20 20 22 20 20 20 20 20 20 74 72  ndif.  "      tr
1c670 69 67 67 65 72 20 20 20 20 20 20 20 20 20 20 20  igger           
1c680 20 20 20 20 4c 69 6b 65 20 5c 22 66 75 6c 6c 5c      Like \"full\
1c690 22 20 62 75 74 20 61 6c 73 6f 20 73 68 6f 77 20  " but also show 
1c6a0 74 72 69 67 67 65 72 20 62 79 74 65 63 6f 64 65  trigger bytecode
1c6b0 22 2c 0a 20 20 22 2e 65 78 63 65 6c 20 20 20 20  ",.  ".excel    
1c6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 44                 D
1c6d0 69 73 70 6c 61 79 20 74 68 65 20 6f 75 74 70 75  isplay the outpu
1c6e0 74 20 6f 66 20 6e 65 78 74 20 63 6f 6d 6d 61 6e  t of next comman
1c6f0 64 20 69 6e 20 61 20 73 70 72 65 61 64 73 68 65  d in a spreadshe
1c700 65 74 22 2c 0a 20 20 22 2e 65 78 69 74 20 3f 43  et",.  ".exit ?C
1c710 4f 44 45 3f 20 20 20 20 20 20 20 20 20 20 20 20  ODE?            
1c720 20 45 78 69 74 20 74 68 69 73 20 70 72 6f 67 72   Exit this progr
1c730 61 6d 20 77 69 74 68 20 72 65 74 75 72 6e 2d 63  am with return-c
1c740 6f 64 65 20 43 4f 44 45 22 2c 0a 20 20 22 2e 65  ode CODE",.  ".e
1c750 78 70 65 72 74 20 20 20 20 20 20 20 20 20 20 20  xpert           
1c760 20 20 20 20 20 20 20 45 58 50 45 52 49 4d 45 4e         EXPERIMEN
1c770 54 41 4c 2e 20 53 75 67 67 65 73 74 20 69 6e 64  TAL. Suggest ind
1c780 65 78 65 73 20 66 6f 72 20 73 70 65 63 69 66 69  exes for specifi
1c790 65 64 20 71 75 65 72 69 65 73 22 2c 0a 2f 2a 20  ed queries",./* 
1c7a0 42 65 63 61 75 73 65 20 65 78 70 6c 61 69 6e 20  Because explain 
1c7b0 6d 6f 64 65 20 63 6f 6d 65 73 20 6f 6e 20 61 75  mode comes on au
1c7c0 74 6f 6d 61 74 69 63 61 6c 6c 79 20 6e 6f 77 2c  tomatically now,
1c7d0 20 74 68 65 20 22 2e 65 78 70 6c 61 69 6e 22 20   the ".explain" 
1c7e0 6d 6f 64 65 0a 2a 2a 20 69 73 20 72 65 6d 6f 76  mode.** is remov
1c7f0 65 64 20 66 72 6f 6d 20 74 68 65 20 68 65 6c 70  ed from the help
1c800 20 73 63 72 65 65 6e 2e 20 20 49 74 20 69 73 20   screen.  It is 
1c810 73 74 69 6c 6c 20 73 75 70 70 6f 72 74 65 64 20  still supported 
1c820 66 6f 72 20 6c 65 67 61 63 79 2c 20 68 6f 77 65  for legacy, howe
1c830 76 65 72 20 2a 2f 0a 2f 2a 22 2e 65 78 70 6c 61  ver */./*".expla
1c840 69 6e 20 3f 6f 6e 7c 6f 66 66 7c 61 75 74 6f 3f  in ?on|off|auto?
1c850 20 20 20 54 75 72 6e 20 45 58 50 4c 41 49 4e 20     Turn EXPLAIN 
1c860 6f 75 74 70 75 74 20 6d 6f 64 65 20 6f 6e 20 6f  output mode on o
1c870 72 20 6f 66 66 20 6f 72 20 74 6f 20 61 75 74 6f  r off or to auto
1c880 6d 61 74 69 63 22 2c 2a 2f 0a 20 20 22 2e 66 75  matic",*/.  ".fu
1c890 6c 6c 73 63 68 65 6d 61 20 3f 2d 2d 69 6e 64 65  llschema ?--inde
1c8a0 6e 74 3f 20 20 20 53 68 6f 77 20 73 63 68 65 6d  nt?   Show schem
1c8b0 61 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65 6e  a and the conten
1c8c0 74 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61 74  t of sqlite_stat
1c8d0 20 74 61 62 6c 65 73 22 2c 0a 20 20 22 2e 68 65   tables",.  ".he
1c8e0 61 64 65 72 73 20 6f 6e 7c 6f 66 66 20 20 20 20  aders on|off    
1c8f0 20 20 20 20 20 20 54 75 72 6e 20 64 69 73 70 6c        Turn displ
1c900 61 79 20 6f 66 20 68 65 61 64 65 72 73 20 6f 6e  ay of headers on
1c910 20 6f 72 20 6f 66 66 22 2c 0a 20 20 22 2e 68 65   or off",.  ".he
1c920 6c 70 20 3f 2d 61 6c 6c 3f 20 3f 50 41 54 54 45  lp ?-all? ?PATTE
1c930 52 4e 3f 20 20 20 53 68 6f 77 20 68 65 6c 70 20  RN?   Show help 
1c940 74 65 78 74 20 66 6f 72 20 50 41 54 54 45 52 4e  text for PATTERN
1c950 22 2c 0a 20 20 22 2e 69 6d 70 6f 72 74 20 46 49  ",.  ".import FI
1c960 4c 45 20 54 41 42 4c 45 20 20 20 20 20 20 20 49  LE TABLE       I
1c970 6d 70 6f 72 74 20 64 61 74 61 20 66 72 6f 6d 20  mport data from 
1c980 46 49 4c 45 20 69 6e 74 6f 20 54 41 42 4c 45 22  FILE into TABLE"
1c990 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ,.#ifndef SQLITE
1c9a0 5f 4f 4d 49 54 5f 54 45 53 54 5f 43 4f 4e 54 52  _OMIT_TEST_CONTR
1c9b0 4f 4c 0a 20 20 22 2e 69 6d 70 6f 73 74 65 72 20  OL.  ".imposter 
1c9c0 49 4e 44 45 58 20 54 41 42 4c 45 20 20 20 20 43  INDEX TABLE    C
1c9d0 72 65 61 74 65 20 69 6d 70 6f 73 74 65 72 20 74  reate imposter t
1c9e0 61 62 6c 65 20 54 41 42 4c 45 20 6f 6e 20 69 6e  able TABLE on in
1c9f0 64 65 78 20 49 4e 44 45 58 22 2c 0a 23 65 6e 64  dex INDEX",.#end
1ca00 69 66 0a 20 20 22 2e 69 6e 64 65 78 65 73 20 3f  if.  ".indexes ?
1ca10 54 41 42 4c 45 3f 20 20 20 20 20 20 20 20 20 53  TABLE?         S
1ca20 68 6f 77 20 6e 61 6d 65 73 20 6f 66 20 69 6e 64  how names of ind
1ca30 65 78 65 73 22 2c 0a 20 20 22 20 20 20 20 20 20  exes",.  "      
1ca40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ca50 20 20 20 20 20 49 66 20 54 41 42 4c 45 20 69 73       If TABLE is
1ca60 20 73 70 65 63 69 66 69 65 64 2c 20 6f 6e 6c 79   specified, only
1ca70 20 73 68 6f 77 20 69 6e 64 65 78 65 73 20 66 6f   show indexes fo
1ca80 72 22 2c 0a 20 20 22 20 20 20 20 20 20 20 20 20  r",.  "         
1ca90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1caa0 20 20 74 61 62 6c 65 73 20 6d 61 74 63 68 69 6e    tables matchin
1cab0 67 20 54 41 42 4c 45 20 75 73 69 6e 67 20 74 68  g TABLE using th
1cac0 65 20 4c 49 4b 45 20 6f 70 65 72 61 74 6f 72 2e  e LIKE operator.
1cad0 22 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  ",.#ifdef SQLITE
1cae0 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 0a  _ENABLE_IOTRACE.
1caf0 20 20 22 2e 69 6f 74 72 61 63 65 20 46 49 4c 45    ".iotrace FILE
1cb00 20 20 20 20 20 20 20 20 20 20 20 20 45 6e 61 62              Enab
1cb10 6c 65 20 49 2f 4f 20 64 69 61 67 6e 6f 73 74 69  le I/O diagnosti
1cb20 63 20 6c 6f 67 67 69 6e 67 20 74 6f 20 46 49 4c  c logging to FIL
1cb30 45 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 6c  E",.#endif.  ".l
1cb40 69 6d 69 74 20 3f 4c 49 4d 49 54 3f 20 3f 56 41  imit ?LIMIT? ?VA
1cb50 4c 3f 20 20 20 20 20 44 69 73 70 6c 61 79 20 6f  L?     Display o
1cb60 72 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c  r change the val
1cb70 75 65 20 6f 66 20 61 6e 20 53 51 4c 49 54 45 5f  ue of an SQLITE_
1cb80 4c 49 4d 49 54 22 2c 0a 20 20 22 2e 6c 69 6e 74  LIMIT",.  ".lint
1cb90 20 4f 50 54 49 4f 4e 53 20 20 20 20 20 20 20 20   OPTIONS        
1cba0 20 20 20 20 52 65 70 6f 72 74 20 70 6f 74 65 6e      Report poten
1cbb0 74 69 61 6c 20 73 63 68 65 6d 61 20 69 73 73 75  tial schema issu
1cbc0 65 73 2e 22 2c 0a 20 20 22 20 20 20 20 20 4f 70  es.",.  "     Op
1cbd0 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20 20  tions:",.  "    
1cbe0 20 20 20 20 66 6b 65 79 2d 69 6e 64 65 78 65 73      fkey-indexes
1cbf0 20 20 20 20 20 46 69 6e 64 20 6d 69 73 73 69 6e       Find missin
1cc00 67 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 6e  g foreign key in
1cc10 64 65 78 65 73 22 2c 0a 23 69 66 6e 64 65 66 20  dexes",.#ifndef 
1cc20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44  SQLITE_OMIT_LOAD
1cc30 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 22 2e 6c  _EXTENSION.  ".l
1cc40 6f 61 64 20 46 49 4c 45 20 3f 45 4e 54 52 59 3f  oad FILE ?ENTRY?
1cc50 20 20 20 20 20 20 20 4c 6f 61 64 20 61 6e 20 65         Load an e
1cc60 78 74 65 6e 73 69 6f 6e 20 6c 69 62 72 61 72 79  xtension library
1cc70 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 6c 6f  ",.#endif.  ".lo
1cc80 67 20 46 49 4c 45 7c 6f 66 66 20 20 20 20 20 20  g FILE|off      
1cc90 20 20 20 20 20 20 54 75 72 6e 20 6c 6f 67 67 69        Turn loggi
1cca0 6e 67 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 46  ng on or off.  F
1ccb0 49 4c 45 20 63 61 6e 20 62 65 20 73 74 64 65 72  ILE can be stder
1ccc0 72 2f 73 74 64 6f 75 74 22 2c 0a 20 20 22 2e 6d  r/stdout",.  ".m
1ccd0 6f 64 65 20 4d 4f 44 45 20 3f 54 41 42 4c 45 3f  ode MODE ?TABLE?
1cce0 20 20 20 20 20 20 20 53 65 74 20 6f 75 74 70 75         Set outpu
1ccf0 74 20 6d 6f 64 65 22 2c 0a 20 20 22 20 20 20 4d  t mode",.  "   M
1cd00 4f 44 45 20 69 73 20 6f 6e 65 20 6f 66 3a 22 2c  ODE is one of:",
1cd10 0a 20 20 22 20 20 20 20 20 61 73 63 69 69 20 20  .  "     ascii  
1cd20 20 20 43 6f 6c 75 6d 6e 73 2f 72 6f 77 73 20 64    Columns/rows d
1cd30 65 6c 69 6d 69 74 65 64 20 62 79 20 30 78 31 46  elimited by 0x1F
1cd40 20 61 6e 64 20 30 78 31 45 22 2c 0a 20 20 22 20   and 0x1E",.  " 
1cd50 20 20 20 20 63 73 76 20 20 20 20 20 20 43 6f 6d      csv      Com
1cd60 6d 61 2d 73 65 70 61 72 61 74 65 64 20 76 61 6c  ma-separated val
1cd70 75 65 73 22 2c 0a 20 20 22 20 20 20 20 20 63 6f  ues",.  "     co
1cd80 6c 75 6d 6e 20 20 20 4c 65 66 74 2d 61 6c 69 67  lumn   Left-alig
1cd90 6e 65 64 20 63 6f 6c 75 6d 6e 73 2e 20 20 28 53  ned columns.  (S
1cda0 65 65 20 2e 77 69 64 74 68 29 22 2c 0a 20 20 22  ee .width)",.  "
1cdb0 20 20 20 20 20 68 74 6d 6c 20 20 20 20 20 48 54       html     HT
1cdc0 4d 4c 20 3c 74 61 62 6c 65 3e 20 63 6f 64 65 22  ML <table> code"
1cdd0 2c 0a 20 20 22 20 20 20 20 20 69 6e 73 65 72 74  ,.  "     insert
1cde0 20 20 20 53 51 4c 20 69 6e 73 65 72 74 20 73 74     SQL insert st
1cdf0 61 74 65 6d 65 6e 74 73 20 66 6f 72 20 54 41 42  atements for TAB
1ce00 4c 45 22 2c 0a 20 20 22 20 20 20 20 20 6c 69 6e  LE",.  "     lin
1ce10 65 20 20 20 20 20 4f 6e 65 20 76 61 6c 75 65 20  e     One value 
1ce20 70 65 72 20 6c 69 6e 65 22 2c 0a 20 20 22 20 20  per line",.  "  
1ce30 20 20 20 6c 69 73 74 20 20 20 20 20 56 61 6c 75     list     Valu
1ce40 65 73 20 64 65 6c 69 6d 69 74 65 64 20 62 79 20  es delimited by 
1ce50 5c 22 7c 5c 22 22 2c 0a 20 20 22 20 20 20 20 20  \"|\"",.  "     
1ce60 71 75 6f 74 65 20 20 20 20 45 73 63 61 70 65 20  quote    Escape 
1ce70 61 6e 73 77 65 72 73 20 61 73 20 66 6f 72 20 53  answers as for S
1ce80 51 4c 22 2c 0a 20 20 22 20 20 20 20 20 74 61 62  QL",.  "     tab
1ce90 73 20 20 20 20 20 54 61 62 2d 73 65 70 61 72 61  s     Tab-separa
1cea0 74 65 64 20 76 61 6c 75 65 73 22 2c 0a 20 20 22  ted values",.  "
1ceb0 20 20 20 20 20 74 63 6c 20 20 20 20 20 20 54 43       tcl      TC
1cec0 4c 20 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73 22  L list elements"
1ced0 2c 0a 20 20 22 2e 6e 75 6c 6c 76 61 6c 75 65 20  ,.  ".nullvalue 
1cee0 53 54 52 49 4e 47 20 20 20 20 20 20 20 20 55 73  STRING        Us
1cef0 65 20 53 54 52 49 4e 47 20 69 6e 20 70 6c 61 63  e STRING in plac
1cf00 65 20 6f 66 20 4e 55 4c 4c 20 76 61 6c 75 65 73  e of NULL values
1cf10 22 2c 0a 20 20 22 2e 6f 6e 63 65 20 28 2d 65 7c  ",.  ".once (-e|
1cf20 2d 78 7c 46 49 4c 45 29 20 20 20 20 20 20 20 4f  -x|FILE)       O
1cf30 75 74 70 75 74 20 66 6f 72 20 74 68 65 20 6e 65  utput for the ne
1cf40 78 74 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 6f  xt SQL command o
1cf50 6e 6c 79 20 74 6f 20 46 49 4c 45 22 2c 0a 20 20  nly to FILE",.  
1cf60 22 20 20 20 20 20 49 66 20 46 49 4c 45 20 62 65  "     If FILE be
1cf70 67 69 6e 73 20 77 69 74 68 20 27 7c 27 20 74 68  gins with '|' th
1cf80 65 6e 20 6f 70 65 6e 20 61 73 20 61 20 70 69 70  en open as a pip
1cf90 65 22 2c 0a 20 20 22 20 20 20 20 20 4f 74 68 65  e",.  "     Othe
1cfa0 72 20 6f 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22  r options:",.  "
1cfb0 20 20 20 20 20 20 20 2d 65 20 20 20 20 49 6e 76         -e    Inv
1cfc0 6f 6b 65 20 73 79 73 74 65 6d 20 74 65 78 74 20  oke system text 
1cfd0 65 64 69 74 6f 72 22 2c 0a 20 20 22 20 20 20 20  editor",.  "    
1cfe0 20 20 20 2d 78 20 20 20 20 4f 70 65 6e 20 69 6e     -x    Open in
1cff0 20 61 20 73 70 72 65 61 64 73 68 65 65 74 22 2c   a spreadsheet",
1d000 0a 20 20 22 2e 6f 70 65 6e 20 3f 4f 50 54 49 4f  .  ".open ?OPTIO
1d010 4e 53 3f 20 3f 46 49 4c 45 3f 20 20 20 43 6c 6f  NS? ?FILE?   Clo
1d020 73 65 20 65 78 69 73 74 69 6e 67 20 64 61 74 61  se existing data
1d030 62 61 73 65 20 61 6e 64 20 72 65 6f 70 65 6e 20  base and reopen 
1d040 46 49 4c 45 22 2c 0a 20 20 22 20 20 20 20 20 4f  FILE",.  "     O
1d050 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20  ptions:",.  "   
1d060 20 20 20 20 20 2d 2d 61 70 70 65 6e 64 20 20 20       --append   
1d070 20 20 20 20 20 55 73 65 20 61 70 70 65 6e 64 76       Use appendv
1d080 66 73 20 74 6f 20 61 70 70 65 6e 64 20 64 61 74  fs to append dat
1d090 61 62 61 73 65 20 74 6f 20 74 68 65 20 65 6e 64  abase to the end
1d0a0 20 6f 66 20 46 49 4c 45 22 2c 0a 23 69 66 64 65   of FILE",.#ifde
1d0b0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1d0c0 44 45 53 45 52 49 41 4c 49 5a 45 0a 20 20 22 20  DESERIALIZE.  " 
1d0d0 20 20 20 20 20 20 20 2d 2d 64 65 73 65 72 69 61         --deseria
1d0e0 6c 69 7a 65 20 20 20 4c 6f 61 64 20 69 6e 74 6f  lize   Load into
1d0f0 20 6d 65 6d 6f 72 79 20 75 73 65 69 6e 67 20 73   memory useing s
1d100 71 6c 69 74 65 33 5f 64 65 73 65 72 69 61 6c 69  qlite3_deseriali
1d110 7a 65 28 29 22 2c 0a 20 20 22 20 20 20 20 20 20  ze()",.  "      
1d120 20 20 2d 2d 68 65 78 64 62 20 20 20 20 20 20 20    --hexdb       
1d130 20 20 4c 6f 61 64 20 74 68 65 20 6f 75 74 70 75    Load the outpu
1d140 74 20 6f 66 20 5c 22 64 62 74 6f 74 78 74 5c 22  t of \"dbtotxt\"
1d150 20 61 73 20 61 6e 20 69 6e 2d 6d 65 6d 6f 72 79   as an in-memory
1d160 20 64 61 74 61 62 61 73 65 22 2c 0a 20 20 22 20   database",.  " 
1d170 20 20 20 20 20 20 20 2d 2d 6d 61 78 73 69 7a 65         --maxsize
1d180 20 4e 20 20 20 20 20 4d 61 78 69 6d 75 6d 20 73   N     Maximum s
1d190 69 7a 65 20 66 6f 72 20 2d 2d 68 65 78 64 62 20  ize for --hexdb 
1d1a0 6f 72 20 2d 2d 64 65 73 65 72 69 61 6c 69 7a 65  or --deserialize
1d1b0 64 20 64 61 74 61 62 61 73 65 22 2c 0a 23 65 6e  d database",.#en
1d1c0 64 69 66 0a 20 20 22 20 20 20 20 20 20 20 20 2d  dif.  "        -
1d1d0 2d 6e 65 77 20 20 20 20 20 20 20 20 20 20 20 49  -new           I
1d1e0 6e 69 74 69 61 6c 69 7a 65 20 46 49 4c 45 20 74  nitialize FILE t
1d1f0 6f 20 61 6e 20 65 6d 70 74 79 20 64 61 74 61 62  o an empty datab
1d200 61 73 65 22 2c 0a 20 20 22 20 20 20 20 20 20 20  ase",.  "       
1d210 20 2d 2d 72 65 61 64 6f 6e 6c 79 20 20 20 20 20   --readonly     
1d220 20 4f 70 65 6e 20 46 49 4c 45 20 72 65 61 64 6f   Open FILE reado
1d230 6e 6c 79 22 2c 0a 20 20 22 20 20 20 20 20 20 20  nly",.  "       
1d240 20 2d 2d 7a 69 70 20 20 20 20 20 20 20 20 20 20   --zip          
1d250 20 46 49 4c 45 20 69 73 20 61 20 5a 49 50 20 61   FILE is a ZIP a
1d260 72 63 68 69 76 65 22 2c 0a 20 20 22 2e 6f 75 74  rchive",.  ".out
1d270 70 75 74 20 3f 46 49 4c 45 3f 20 20 20 20 20 20  put ?FILE?      
1d280 20 20 20 20 20 53 65 6e 64 20 6f 75 74 70 75 74       Send output
1d290 20 74 6f 20 46 49 4c 45 20 6f 72 20 73 74 64 6f   to FILE or stdo
1d2a0 75 74 20 69 66 20 46 49 4c 45 20 69 73 20 6f 6d  ut if FILE is om
1d2b0 69 74 74 65 64 22 2c 0a 20 20 22 20 20 20 20 20  itted",.  "     
1d2c0 49 66 20 46 49 4c 45 20 62 65 67 69 6e 73 20 77  If FILE begins w
1d2d0 69 74 68 20 27 7c 27 20 74 68 65 6e 20 6f 70 65  ith '|' then ope
1d2e0 6e 20 69 74 20 61 73 20 61 20 70 69 70 65 2e 22  n it as a pipe."
1d2f0 2c 0a 20 20 22 2e 70 72 69 6e 74 20 53 54 52 49  ,.  ".print STRI
1d300 4e 47 2e 2e 2e 20 20 20 20 20 20 20 20 20 50 72  NG...         Pr
1d310 69 6e 74 20 6c 69 74 65 72 61 6c 20 53 54 52 49  int literal STRI
1d320 4e 47 22 2c 0a 23 69 66 6e 64 65 66 20 53 51 4c  NG",.#ifndef SQL
1d330 49 54 45 5f 4f 4d 49 54 5f 50 52 4f 47 52 45 53  ITE_OMIT_PROGRES
1d340 53 5f 43 41 4c 4c 42 41 43 4b 0a 20 20 22 2e 70  S_CALLBACK.  ".p
1d350 72 6f 67 72 65 73 73 20 4e 20 20 20 20 20 20 20  rogress N       
1d360 20 20 20 20 20 20 20 49 6e 76 6f 6b 65 20 70 72         Invoke pr
1d370 6f 67 72 65 73 73 20 68 61 6e 64 6c 65 72 20 61  ogress handler a
1d380 66 74 65 72 20 65 76 65 72 79 20 4e 20 6f 70 63  fter every N opc
1d390 6f 64 65 73 22 2c 0a 20 20 22 20 20 20 2d 2d 6c  odes",.  "   --l
1d3a0 69 6d 69 74 20 4e 20 20 20 20 20 20 20 20 20 20  imit N          
1d3b0 20 20 20 20 20 20 20 49 6e 74 65 72 72 75 70 74         Interrupt
1d3c0 20 61 66 74 65 72 20 4e 20 70 72 6f 67 72 65 73   after N progres
1d3d0 73 20 63 61 6c 6c 62 61 63 6b 73 22 2c 0a 20 20  s callbacks",.  
1d3e0 22 20 20 20 2d 2d 6f 6e 63 65 20 20 20 20 20 20  "   --once      
1d3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 44 6f                Do
1d400 20 6e 6f 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e   no more than on
1d410 65 20 70 72 6f 67 72 65 73 73 20 69 6e 74 65 72  e progress inter
1d420 72 75 70 74 22 2c 0a 20 20 22 20 20 20 2d 2d 71  rupt",.  "   --q
1d430 75 69 65 74 7c 2d 71 20 20 20 20 20 20 20 20 20  uiet|-q         
1d440 20 20 20 20 20 20 20 4e 6f 20 6f 75 74 70 75 74         No output
1d450 20 65 78 63 65 70 74 20 61 74 20 69 6e 74 65 72   except at inter
1d460 72 75 70 74 73 22 2c 0a 20 20 22 20 20 20 2d 2d  rupts",.  "   --
1d470 72 65 73 65 74 20 20 20 20 20 20 20 20 20 20 20  reset           
1d480 20 20 20 20 20 20 20 20 52 65 73 65 74 20 74 68          Reset th
1d490 65 20 63 6f 75 6e 74 20 66 6f 72 20 65 61 63 68  e count for each
1d4a0 20 69 6e 70 75 74 20 61 6e 64 20 69 6e 74 65 72   input and inter
1d4b0 72 75 70 74 22 2c 0a 23 65 6e 64 69 66 0a 20 20  rupt",.#endif.  
1d4c0 22 2e 70 72 6f 6d 70 74 20 4d 41 49 4e 20 43 4f  ".prompt MAIN CO
1d4d0 4e 54 49 4e 55 45 20 20 20 20 52 65 70 6c 61 63  NTINUE    Replac
1d4e0 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20 70  e the standard p
1d4f0 72 6f 6d 70 74 73 22 2c 0a 20 20 22 2e 71 75 69  rompts",.  ".qui
1d500 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
1d510 20 20 20 20 20 45 78 69 74 20 74 68 69 73 20 70       Exit this p
1d520 72 6f 67 72 61 6d 22 2c 0a 20 20 22 2e 72 65 61  rogram",.  ".rea
1d530 64 20 46 49 4c 45 20 20 20 20 20 20 20 20 20 20  d FILE          
1d540 20 20 20 20 20 52 65 61 64 20 69 6e 70 75 74 20       Read input 
1d550 66 72 6f 6d 20 46 49 4c 45 22 2c 0a 20 20 22 2e  from FILE",.  ".
1d560 72 65 73 74 6f 72 65 20 3f 44 42 3f 20 46 49 4c  restore ?DB? FIL
1d570 45 20 20 20 20 20 20 20 52 65 73 74 6f 72 65 20  E       Restore 
1d580 63 6f 6e 74 65 6e 74 20 6f 66 20 44 42 20 28 64  content of DB (d
1d590 65 66 61 75 6c 74 20 5c 22 6d 61 69 6e 5c 22 29  efault \"main\")
1d5a0 20 66 72 6f 6d 20 46 49 4c 45 22 2c 0a 20 20 22   from FILE",.  "
1d5b0 2e 73 61 76 65 20 46 49 4c 45 20 20 20 20 20 20  .save FILE      
1d5c0 20 20 20 20 20 20 20 20 20 57 72 69 74 65 20 69           Write i
1d5d0 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
1d5e0 65 20 69 6e 74 6f 20 46 49 4c 45 22 2c 0a 20 20  e into FILE",.  
1d5f0 22 2e 73 63 61 6e 73 74 61 74 73 20 6f 6e 7c 6f  ".scanstats on|o
1d600 66 66 20 20 20 20 20 20 20 20 54 75 72 6e 20 73  ff        Turn s
1d610 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e  qlite3_stmt_scan
1d620 73 74 61 74 75 73 28 29 20 6d 65 74 72 69 63 73  status() metrics
1d630 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a 20 20 22   on or off",.  "
1d640 2e 73 63 68 65 6d 61 20 3f 50 41 54 54 45 52 4e  .schema ?PATTERN
1d650 3f 20 20 20 20 20 20 20 20 53 68 6f 77 20 74 68  ?        Show th
1d660 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65  e CREATE stateme
1d670 6e 74 73 20 6d 61 74 63 68 69 6e 67 20 50 41 54  nts matching PAT
1d680 54 45 52 4e 22 2c 0a 20 20 22 20 20 20 20 20 4f  TERN",.  "     O
1d690 70 74 69 6f 6e 73 3a 22 2c 0a 20 20 22 20 20 20  ptions:",.  "   
1d6a0 20 20 20 20 20 20 2d 2d 69 6e 64 65 6e 74 20 20        --indent  
1d6b0 20 20 20 20 20 20 20 20 20 20 54 72 79 20 74 6f            Try to
1d6c0 20 70 72 65 74 74 79 2d 70 72 69 6e 74 20 74 68   pretty-print th
1d6d0 65 20 73 63 68 65 6d 61 22 2c 0a 20 20 22 2e 73  e schema",.  ".s
1d6e0 65 6c 66 74 65 73 74 20 3f 4f 50 54 49 4f 4e 53  elftest ?OPTIONS
1d6f0 3f 20 20 20 20 20 20 52 75 6e 20 74 65 73 74 73  ?      Run tests
1d700 20 64 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20   defined in the 
1d710 53 45 4c 46 54 45 53 54 20 74 61 62 6c 65 22 2c  SELFTEST table",
1d720 0a 20 20 22 20 20 20 20 4f 70 74 69 6f 6e 73 3a  .  "    Options:
1d730 22 2c 0a 20 20 22 20 20 20 20 20 20 20 2d 2d 69  ",.  "       --i
1d740 6e 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  nit             
1d750 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20 53    Create a new S
1d760 45 4c 46 54 45 53 54 20 74 61 62 6c 65 22 2c 0a  ELFTEST table",.
1d770 20 20 22 20 20 20 20 20 20 20 2d 76 20 20 20 20    "       -v    
1d780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 56                 V
1d790 65 72 62 6f 73 65 20 6f 75 74 70 75 74 22 2c 0a  erbose output",.
1d7a0 20 20 22 2e 73 65 70 61 72 61 74 6f 72 20 43 4f    ".separator CO
1d7b0 4c 20 3f 52 4f 57 3f 20 20 20 20 20 43 68 61 6e  L ?ROW?     Chan
1d7c0 67 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 61 6e  ge the column an
1d7d0 64 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 73  d row separators
1d7e0 22 2c 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ",.#if defined(S
1d7f0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53  QLITE_ENABLE_SES
1d800 53 49 4f 4e 29 0a 20 20 22 2e 73 65 73 73 69 6f  SION).  ".sessio
1d810 6e 20 3f 4e 41 4d 45 3f 20 43 4d 44 20 2e 2e 2e  n ?NAME? CMD ...
1d820 20 20 43 72 65 61 74 65 20 6f 72 20 63 6f 6e 74    Create or cont
1d830 72 6f 6c 20 73 65 73 73 69 6f 6e 73 22 2c 0a 20  rol sessions",. 
1d840 20 22 20 20 20 53 75 62 63 6f 6d 6d 61 6e 64 73   "   Subcommands
1d850 3a 22 2c 0a 20 20 22 20 20 20 20 20 61 74 74 61  :",.  "     atta
1d860 63 68 20 54 41 42 4c 45 20 20 20 20 20 20 20 20  ch TABLE        
1d870 20 20 20 20 20 41 74 74 61 63 68 20 54 41 42 4c       Attach TABL
1d880 45 22 2c 0a 20 20 22 20 20 20 20 20 63 68 61 6e  E",.  "     chan
1d890 67 65 73 65 74 20 46 49 4c 45 20 20 20 20 20 20  geset FILE      
1d8a0 20 20 20 20 20 57 72 69 74 65 20 61 20 63 68 61       Write a cha
1d8b0 6e 67 65 73 65 74 20 69 6e 74 6f 20 46 49 4c 45  ngeset into FILE
1d8c0 22 2c 0a 20 20 22 20 20 20 20 20 63 6c 6f 73 65  ",.  "     close
1d8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d8e0 20 20 20 20 43 6c 6f 73 65 20 6f 6e 65 20 73 65      Close one se
1d8f0 73 73 69 6f 6e 22 2c 0a 20 20 22 20 20 20 20 20  ssion",.  "     
1d900 65 6e 61 62 6c 65 20 3f 42 4f 4f 4c 45 41 4e 3f  enable ?BOOLEAN?
1d910 20 20 20 20 20 20 20 20 20 53 65 74 20 6f 72 20           Set or 
1d920 71 75 65 72 79 20 74 68 65 20 65 6e 61 62 6c 65  query the enable
1d930 20 62 69 74 22 2c 0a 20 20 22 20 20 20 20 20 66   bit",.  "     f
1d940 69 6c 74 65 72 20 47 4c 4f 42 2e 2e 2e 20 20 20  ilter GLOB...   
1d950 20 20 20 20 20 20 20 20 52 65 6a 65 63 74 20 74          Reject t
1d960 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67 20 47  ables matching G
1d970 4c 4f 42 73 22 2c 0a 20 20 22 20 20 20 20 20 69  LOBs",.  "     i
1d980 6e 64 69 72 65 63 74 20 3f 42 4f 4f 4c 45 41 4e  ndirect ?BOOLEAN
1d990 3f 20 20 20 20 20 20 20 4d 61 72 6b 20 6f 72 20  ?       Mark or 
1d9a0 71 75 65 72 79 20 74 68 65 20 69 6e 64 69 72 65  query the indire
1d9b0 63 74 20 73 74 61 74 75 73 22 2c 0a 20 20 22 20  ct status",.  " 
1d9c0 20 20 20 20 69 73 65 6d 70 74 79 20 20 20 20 20      isempty     
1d9d0 20 20 20 20 20 20 20 20 20 20 20 20 20 51 75 65               Que
1d9e0 72 79 20 77 68 65 74 68 65 72 20 74 68 65 20 73  ry whether the s
1d9f0 65 73 73 69 6f 6e 20 69 73 20 65 6d 70 74 79 22  ession is empty"
1da00 2c 0a 20 20 22 20 20 20 20 20 6c 69 73 74 20 20  ,.  "     list  
1da10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da20 20 20 20 4c 69 73 74 20 63 75 72 72 65 6e 74 6c     List currentl
1da30 79 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e 20 6e  y open session n
1da40 61 6d 65 73 22 2c 0a 20 20 22 20 20 20 20 20 6f  ames",.  "     o
1da50 70 65 6e 20 44 42 20 4e 41 4d 45 20 20 20 20 20  pen DB NAME     
1da60 20 20 20 20 20 20 20 20 4f 70 65 6e 20 61 20 6e          Open a n
1da70 65 77 20 73 65 73 73 69 6f 6e 20 6f 6e 20 44 42  ew session on DB
1da80 22 2c 0a 20 20 22 20 20 20 20 20 70 61 74 63 68  ",.  "     patch
1da90 73 65 74 20 46 49 4c 45 20 20 20 20 20 20 20 20  set FILE        
1daa0 20 20 20 20 57 72 69 74 65 20 61 20 70 61 74 63      Write a patc
1dab0 68 73 65 74 20 69 6e 74 6f 20 46 49 4c 45 22 2c  hset into FILE",
1dac0 0a 20 20 22 20 20 20 49 66 20 3f 4e 41 4d 45 3f  .  "   If ?NAME?
1dad0 20 69 73 20 6f 6d 69 74 74 65 64 2c 20 74 68 65   is omitted, the
1dae0 20 66 69 72 73 74 20 64 65 66 69 6e 65 64 20 73   first defined s
1daf0 65 73 73 69 6f 6e 20 69 73 20 75 73 65 64 2e 22  ession is used."
1db00 2c 0a 23 65 6e 64 69 66 0a 20 20 22 2e 73 68 61  ,.#endif.  ".sha
1db10 33 73 75 6d 20 2e 2e 2e 20 20 20 20 20 20 20 20  3sum ...        
1db20 20 20 20 20 20 43 6f 6d 70 75 74 65 20 61 20 53       Compute a S
1db30 48 41 33 20 68 61 73 68 20 6f 66 20 64 61 74 61  HA3 hash of data
1db40 62 61 73 65 20 63 6f 6e 74 65 6e 74 22 2c 0a 20  base content",. 
1db50 20 22 20 20 20 20 4f 70 74 69 6f 6e 73 3a 22 2c   "    Options:",
1db60 0a 20 20 22 20 20 20 20 20 20 2d 2d 73 63 68 65  .  "      --sche
1db70 6d 61 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ma              
1db80 41 6c 73 6f 20 68 61 73 68 20 74 68 65 20 73 71  Also hash the sq
1db90 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
1dba0 65 22 2c 0a 20 20 22 20 20 20 20 20 20 2d 2d 73  e",.  "      --s
1dbb0 68 61 33 2d 32 32 34 20 20 20 20 20 20 20 20 20  ha3-224         
1dbc0 20 20 20 55 73 65 20 74 68 65 20 73 68 61 33 2d     Use the sha3-
1dbd0 32 32 34 20 61 6c 67 6f 72 69 74 68 6d 22 2c 0a  224 algorithm",.
1dbe0 20 20 22 20 20 20 20 20 20 2d 2d 73 68 61 33 2d    "      --sha3-
1dbf0 32 35 36 20 20 20 20 20 20 20 20 20 20 20 20 55  256            U
1dc00 73 65 20 74 68 65 20 73 68 61 33 2d 32 35 36 20  se the sha3-256 
1dc10 61 6c 67 6f 72 69 74 68 6d 2e 20 20 54 68 69 73  algorithm.  This
1dc20 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 2e   is the default.
1dc30 22 2c 0a 20 20 22 20 20 20 20 20 20 2d 2d 73 68  ",.  "      --sh
1dc40 61 33 2d 33 38 34 20 20 20 20 20 20 20 20 20 20  a3-384          
1dc50 20 20 55 73 65 20 74 68 65 20 73 68 61 33 2d 33    Use the sha3-3
1dc60 38 34 20 61 6c 67 6f 72 69 74 68 6d 22 2c 0a 20  84 algorithm",. 
1dc70 20 22 20 20 20 20 20 20 2d 2d 73 68 61 33 2d 35   "      --sha3-5
1dc80 31 32 20 20 20 20 20 20 20 20 20 20 20 20 55 73  12            Us
1dc90 65 20 74 68 65 20 73 68 61 33 2d 35 31 32 20 61  e the sha3-512 a
1dca0 6c 67 6f 72 69 74 68 6d 22 2c 0a 20 20 22 20 20  lgorithm",.  "  
1dcb0 20 20 41 6e 79 20 6f 74 68 65 72 20 61 72 67 75    Any other argu
1dcc0 6d 65 6e 74 20 69 73 20 61 20 4c 49 4b 45 20 70  ment is a LIKE p
1dcd0 61 74 74 65 72 6e 20 66 6f 72 20 74 61 62 6c 65  attern for table
1dce0 73 20 74 6f 20 68 61 73 68 22 2c 0a 23 69 66 6e  s to hash",.#ifn
1dcf0 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56  def SQLITE_NOHAV
1dd00 45 5f 53 59 53 54 45 4d 0a 20 20 22 2e 73 68 65  E_SYSTEM.  ".she
1dd10 6c 6c 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20 20  ll CMD ARGS...  
1dd20 20 20 20 20 20 52 75 6e 20 43 4d 44 20 41 52 47       Run CMD ARG
1dd30 53 2e 2e 2e 20 69 6e 20 61 20 73 79 73 74 65 6d  S... in a system
1dd40 20 73 68 65 6c 6c 22 2c 0a 23 65 6e 64 69 66 0a   shell",.#endif.
1dd50 20 20 22 2e 73 68 6f 77 20 20 20 20 20 20 20 20    ".show        
1dd60 20 20 20 20 20 20 20 20 20 20 20 20 53 68 6f 77              Show
1dd70 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
1dd80 75 65 73 20 66 6f 72 20 76 61 72 69 6f 75 73 20  ues for various 
1dd90 73 65 74 74 69 6e 67 73 22 2c 0a 20 20 22 2e 73  settings",.  ".s
1dda0 74 61 74 73 20 3f 6f 6e 7c 6f 66 66 3f 20 20 20  tats ?on|off?   
1ddb0 20 20 20 20 20 20 20 53 68 6f 77 20 73 74 61 74         Show stat
1ddc0 73 20 6f 72 20 74 75 72 6e 20 73 74 61 74 73 20  s or turn stats 
1ddd0 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a 23 69 66 6e  on or off",.#ifn
1dde0 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56  def SQLITE_NOHAV
1ddf0 45 5f 53 59 53 54 45 4d 0a 20 20 22 2e 73 79 73  E_SYSTEM.  ".sys
1de00 74 65 6d 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20  tem CMD ARGS... 
1de10 20 20 20 20 20 52 75 6e 20 43 4d 44 20 41 52 47       Run CMD ARG
1de20 53 2e 2e 2e 20 69 6e 20 61 20 73 79 73 74 65 6d  S... in a system
1de30 20 73 68 65 6c 6c 22 2c 0a 23 65 6e 64 69 66 0a   shell",.#endif.
1de40 20 20 22 2e 74 61 62 6c 65 73 20 3f 54 41 42 4c    ".tables ?TABL
1de50 45 3f 20 20 20 20 20 20 20 20 20 20 4c 69 73 74  E?          List
1de60 20 6e 61 6d 65 73 20 6f 66 20 74 61 62 6c 65 73   names of tables
1de70 20 6d 61 74 63 68 69 6e 67 20 4c 49 4b 45 20 70   matching LIKE p
1de80 61 74 74 65 72 6e 20 54 41 42 4c 45 22 2c 0a 20  attern TABLE",. 
1de90 20 22 2e 74 65 73 74 63 61 73 65 20 4e 41 4d 45   ".testcase NAME
1dea0 20 20 20 20 20 20 20 20 20 20 20 42 65 67 69 6e             Begin
1deb0 20 72 65 64 69 72 65 63 74 69 6e 67 20 6f 75 74   redirecting out
1dec0 70 75 74 20 74 6f 20 27 74 65 73 74 63 61 73 65  put to 'testcase
1ded0 2d 6f 75 74 2e 74 78 74 27 22 2c 0a 20 20 22 2e  -out.txt'",.  ".
1dee0 74 69 6d 65 6f 75 74 20 4d 53 20 20 20 20 20 20  timeout MS      
1def0 20 20 20 20 20 20 20 20 54 72 79 20 6f 70 65 6e          Try open
1df00 69 6e 67 20 6c 6f 63 6b 65 64 20 74 61 62 6c 65  ing locked table
1df10 73 20 66 6f 72 20 4d 53 20 6d 69 6c 6c 69 73 65  s for MS millise
1df20 63 6f 6e 64 73 22 2c 0a 20 20 22 2e 74 69 6d 65  conds",.  ".time
1df30 72 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20  r on|off        
1df40 20 20 20 20 54 75 72 6e 20 53 51 4c 20 74 69 6d      Turn SQL tim
1df50 65 72 20 6f 6e 20 6f 72 20 6f 66 66 22 2c 0a 23  er on or off",.#
1df60 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
1df70 49 54 5f 54 52 41 43 45 0a 20 20 22 2e 74 72 61  IT_TRACE.  ".tra
1df80 63 65 20 3f 4f 50 54 49 4f 4e 53 3f 20 20 20 20  ce ?OPTIONS?    
1df90 20 20 20 20 20 4f 75 74 70 75 74 20 65 61 63 68       Output each
1dfa0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61   SQL statement a
1dfb0 73 20 69 74 20 69 73 20 72 75 6e 22 2c 0a 20 20  s it is run",.  
1dfc0 22 20 20 20 20 46 49 4c 45 20 20 20 20 20 20 20  "    FILE       
1dfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 65 6e               Sen
1dfe0 64 20 6f 75 74 70 75 74 20 74 6f 20 46 49 4c 45  d output to FILE
1dff0 22 2c 0a 20 20 22 20 20 20 20 73 74 64 6f 75 74  ",.  "    stdout
1e000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e010 20 20 53 65 6e 64 20 6f 75 74 70 75 74 20 74 6f    Send output to
1e020 20 73 74 64 6f 75 74 22 2c 0a 20 20 22 20 20 20   stdout",.  "   
1e030 20 73 74 64 65 72 72 20 20 20 20 20 20 20 20 20   stderr         
1e040 20 20 20 20 20 20 20 20 20 53 65 6e 64 20 6f 75           Send ou
1e050 74 70 75 74 20 74 6f 20 73 74 64 65 72 72 22 2c  tput to stderr",
1e060 0a 20 20 22 20 20 20 20 6f 66 66 20 20 20 20 20  .  "    off     
1e070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e080 44 69 73 61 62 6c 65 20 74 72 61 63 69 6e 67 22  Disable tracing"
1e090 2c 0a 20 20 22 20 20 20 20 2d 2d 65 78 70 61 6e  ,.  "    --expan
1e0a0 64 65 64 20 20 20 20 20 20 20 20 20 20 20 20 20  ded             
1e0b0 20 45 78 70 61 6e 64 20 71 75 65 72 79 20 70 61   Expand query pa
1e0c0 72 61 6d 65 74 65 72 73 22 2c 0a 23 69 66 64 65  rameters",.#ifde
1e0d0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
1e0e0 4e 4f 52 4d 41 4c 49 5a 45 0a 20 20 22 20 20 20  NORMALIZE.  "   
1e0f0 20 2d 2d 6e 6f 72 6d 61 6c 69 7a 65 64 20 20 20   --normalized   
1e100 20 20 20 20 20 20 20 20 20 4e 6f 72 6d 61 6c 20           Normal 
1e110 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
1e120 74 73 22 2c 0a 23 65 6e 64 69 66 0a 20 20 22 20  ts",.#endif.  " 
1e130 20 20 20 2d 2d 70 6c 61 69 6e 20 20 20 20 20 20     --plain      
1e140 20 20 20 20 20 20 20 20 20 20 20 53 68 6f 77 20             Show 
1e150 53 51 4c 20 61 73 20 69 74 20 69 73 20 69 6e 70  SQL as it is inp
1e160 75 74 22 2c 0a 20 20 22 20 20 20 20 2d 2d 73 74  ut",.  "    --st
1e170 6d 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  mt              
1e180 20 20 20 20 54 72 61 63 65 20 73 74 61 74 65 6d      Trace statem
1e190 65 6e 74 20 65 78 65 63 75 74 69 6f 6e 20 28 53  ent execution (S
1e1a0 51 4c 49 54 45 5f 54 52 41 43 45 5f 53 54 4d 54  QLITE_TRACE_STMT
1e1b0 29 22 2c 0a 20 20 22 20 20 20 20 2d 2d 70 72 6f  )",.  "    --pro
1e1c0 66 69 6c 65 20 20 20 20 20 20 20 20 20 20 20 20  file            
1e1d0 20 20 20 50 72 6f 66 69 6c 65 20 73 74 61 74 65     Profile state
1e1e0 6d 65 6e 74 73 20 28 53 51 4c 49 54 45 5f 54 52  ments (SQLITE_TR
1e1f0 41 43 45 5f 50 52 4f 46 49 4c 45 29 22 2c 0a 20  ACE_PROFILE)",. 
1e200 20 22 20 20 20 20 2d 2d 72 6f 77 20 20 20 20 20   "    --row     
1e210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 72                Tr
1e220 61 63 65 20 65 61 63 68 20 72 6f 77 20 28 53 51  ace each row (SQ
1e230 4c 49 54 45 5f 54 52 41 43 45 5f 52 4f 57 29 22  LITE_TRACE_ROW)"
1e240 2c 0a 20 20 22 20 20 20 20 2d 2d 63 6c 6f 73 65  ,.  "    --close
1e250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e260 20 54 72 61 63 65 20 63 6f 6e 6e 65 63 74 69 6f   Trace connectio
1e270 6e 20 63 6c 6f 73 65 20 28 53 51 4c 49 54 45 5f  n close (SQLITE_
1e280 54 52 41 43 45 5f 43 4c 4f 53 45 29 22 2c 0a 23  TRACE_CLOSE)",.#
1e290 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
1e2a0 4f 4d 49 54 5f 54 52 41 43 45 20 2a 2f 0a 20 20  OMIT_TRACE */.  
1e2b0 22 2e 76 66 73 69 6e 66 6f 20 3f 41 55 58 3f 20  ".vfsinfo ?AUX? 
1e2c0 20 20 20 20 20 20 20 20 20 20 49 6e 66 6f 72 6d            Inform
1e2d0 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
1e2e0 74 6f 70 2d 6c 65 76 65 6c 20 56 46 53 22 2c 0a  top-level VFS",.
1e2f0 20 20 22 2e 76 66 73 6c 69 73 74 20 20 20 20 20    ".vfslist     
1e300 20 20 20 20 20 20 20 20 20 20 20 20 4c 69 73 74              List
1e310 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 56   all available V
1e320 46 53 65 73 22 2c 0a 20 20 22 2e 76 66 73 6e 61  FSes",.  ".vfsna
1e330 6d 65 20 3f 41 55 58 3f 20 20 20 20 20 20 20 20  me ?AUX?        
1e340 20 20 20 50 72 69 6e 74 20 74 68 65 20 6e 61 6d     Print the nam
1e350 65 20 6f 66 20 74 68 65 20 56 46 53 20 73 74 61  e of the VFS sta
1e360 63 6b 22 2c 0a 20 20 22 2e 77 69 64 74 68 20 4e  ck",.  ".width N
1e370 55 4d 31 20 4e 55 4d 32 20 2e 2e 2e 20 20 20 20  UM1 NUM2 ...    
1e380 20 53 65 74 20 63 6f 6c 75 6d 6e 20 77 69 64 74   Set column widt
1e390 68 73 20 66 6f 72 20 5c 22 63 6f 6c 75 6d 6e 5c  hs for \"column\
1e3a0 22 20 6d 6f 64 65 22 2c 0a 20 20 22 20 20 20 20  " mode",.  "    
1e3b0 20 4e 65 67 61 74 69 76 65 20 76 61 6c 75 65 73   Negative values
1e3c0 20 72 69 67 68 74 2d 6a 75 73 74 69 66 79 22 2c   right-justify",
1e3d0 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75  .};../*.** Outpu
1e3e0 74 20 68 65 6c 70 20 74 65 78 74 2e 0a 2a 2a 0a  t help text..**.
1e3f0 2a 2a 20 7a 50 61 74 74 65 72 6e 20 64 65 73 63  ** zPattern desc
1e400 72 69 62 65 73 20 74 68 65 20 73 65 74 20 6f 66  ribes the set of
1e410 20 63 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 77 68   commands for wh
1e420 69 63 68 20 68 65 6c 70 20 74 65 78 74 20 69 73  ich help text is
1e430 20 70 72 6f 76 69 64 65 64 2e 0a 2a 2a 20 49 66   provided..** If
1e440 20 7a 50 61 74 74 65 72 6e 20 69 73 20 4e 55 4c   zPattern is NUL
1e450 4c 2c 20 74 68 65 6e 20 73 68 6f 77 20 61 6c 6c  L, then show all
1e460 20 63 6f 6d 6d 61 6e 64 73 2c 20 62 75 74 20 6f   commands, but o
1e470 6e 6c 79 20 67 69 76 65 20 61 20 6f 6e 65 2d 6c  nly give a one-l
1e480 69 6e 65 0a 2a 2a 20 64 65 73 63 72 69 70 74 69  ine.** descripti
1e490 6f 6e 20 6f 66 20 65 61 63 68 2e 0a 2a 2a 0a 2a  on of each..**.*
1e4a0 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
1e4b0 62 65 72 20 6f 66 20 6d 61 74 63 68 65 73 2e 0a  ber of matches..
1e4c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68  */.static int sh
1e4d0 6f 77 48 65 6c 70 28 46 49 4c 45 20 2a 6f 75 74  owHelp(FILE *out
1e4e0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50  , const char *zP
1e4f0 61 74 74 65 72 6e 29 7b 0a 20 20 69 6e 74 20 69  attern){.  int i
1e500 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6a 20 3d 20   = 0;.  int j = 
1e510 30 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a  0;.  int n = 0;.
1e520 20 20 63 68 61 72 20 2a 7a 50 61 74 3b 0a 20 20    char *zPat;.  
1e530 69 66 28 20 7a 50 61 74 74 65 72 6e 3d 3d 30 0a  if( zPattern==0.
1e540 20 20 20 7c 7c 20 7a 50 61 74 74 65 72 6e 5b 30     || zPattern[0
1e550 5d 3d 3d 27 30 27 0a 20 20 20 7c 7c 20 73 74 72  ]=='0'.   || str
1e560 63 6d 70 28 7a 50 61 74 74 65 72 6e 2c 22 2d 61  cmp(zPattern,"-a
1e570 22 29 3d 3d 30 0a 20 20 20 7c 7c 20 73 74 72 63  ")==0.   || strc
1e580 6d 70 28 7a 50 61 74 74 65 72 6e 2c 22 2d 61 6c  mp(zPattern,"-al
1e590 6c 22 29 3d 3d 30 0a 20 20 29 7b 0a 20 20 20 20  l")==0.  ){.    
1e5a0 2f 2a 20 53 68 6f 77 20 61 6c 6c 20 63 6f 6d 6d  /* Show all comm
1e5b0 61 6e 64 73 2c 20 62 75 74 20 6f 6e 6c 79 20 6f  ands, but only o
1e5c0 6e 65 20 6c 69 6e 65 20 70 65 72 20 63 6f 6d 6d  ne line per comm
1e5d0 61 6e 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a  and */.    if( z
1e5e0 50 61 74 74 65 72 6e 3d 3d 30 20 29 20 7a 50 61  Pattern==0 ) zPa
1e5f0 74 74 65 72 6e 20 3d 20 22 22 3b 0a 20 20 20 20  ttern = "";.    
1e600 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
1e610 53 69 7a 65 28 61 7a 48 65 6c 70 29 3b 20 69 2b  Size(azHelp); i+
1e620 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 61 7a  +){.      if( az
1e630 48 65 6c 70 5b 69 5d 5b 30 5d 3d 3d 27 2e 27 20  Help[i][0]=='.' 
1e640 7c 7c 20 7a 50 61 74 74 65 72 6e 5b 30 5d 20 29  || zPattern[0] )
1e650 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
1e660 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e  rintf(out, "%s\n
1e670 22 2c 20 61 7a 48 65 6c 70 5b 69 5d 29 3b 0a 20  ", azHelp[i]);. 
1e680 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20         n++;.    
1e690 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
1e6a0 65 7b 0a 20 20 20 20 2f 2a 20 4c 6f 6f 6b 20 66  e{.    /* Look f
1e6b0 6f 72 20 63 6f 6d 6d 61 6e 64 73 20 74 68 61 74  or commands that
1e6c0 20 66 6f 72 20 77 68 69 63 68 20 7a 50 61 74 74   for which zPatt
1e6d0 65 72 6e 20 69 73 20 61 6e 20 65 78 61 63 74 20  ern is an exact 
1e6e0 70 72 65 66 69 78 20 2a 2f 0a 20 20 20 20 7a 50  prefix */.    zP
1e6f0 61 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  at = sqlite3_mpr
1e700 69 6e 74 66 28 22 2e 25 73 2a 22 2c 20 7a 50 61  intf(".%s*", zPa
1e710 74 74 65 72 6e 29 3b 0a 20 20 20 20 66 6f 72 28  ttern);.    for(
1e720 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
1e730 28 61 7a 48 65 6c 70 29 3b 20 69 2b 2b 29 7b 0a  (azHelp); i++){.
1e740 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1e750 33 5f 73 74 72 67 6c 6f 62 28 7a 50 61 74 2c 20  3_strglob(zPat, 
1e760 61 7a 48 65 6c 70 5b 69 5d 29 3d 3d 30 20 29 7b  azHelp[i])==0 ){
1e770 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
1e780 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22  intf(out, "%s\n"
1e790 2c 20 61 7a 48 65 6c 70 5b 69 5d 29 3b 0a 20 20  , azHelp[i]);.  
1e7a0 20 20 20 20 20 20 6a 20 3d 20 69 2b 31 3b 0a 20        j = i+1;. 
1e7b0 20 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20         n++;.    
1e7c0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
1e7d0 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 61 74 29  lite3_free(zPat)
1e7e0 3b 0a 20 20 20 20 69 66 28 20 6e 20 29 7b 0a 20  ;.    if( n ){. 
1e7f0 20 20 20 20 20 69 66 28 20 6e 3d 3d 31 20 29 7b       if( n==1 ){
1e800 0a 20 20 20 20 20 20 20 20 2f 2a 20 77 68 65 6e  .        /* when
1e810 20 7a 50 61 74 74 65 72 6e 20 69 73 20 61 20 70   zPattern is a p
1e820 72 65 66 69 78 20 6f 66 20 65 78 61 63 74 6c 79  refix of exactly
1e830 20 6f 6e 65 20 63 6f 6d 6d 61 6e 64 2c 20 74 68   one command, th
1e840 65 6e 20 69 6e 63 6c 75 64 65 20 74 68 65 0a 20  en include the. 
1e850 20 20 20 20 20 20 20 2a 2a 20 64 65 74 61 69 6c         ** detail
1e860 73 20 6f 66 20 74 68 61 74 20 63 6f 6d 6d 61 6e  s of that comman
1e870 64 2c 20 77 68 69 63 68 20 73 68 6f 75 6c 64 20  d, which should 
1e880 62 65 67 69 6e 20 61 74 20 6f 66 66 73 65 74 20  begin at offset 
1e890 6a 20 2a 2f 0a 20 20 20 20 20 20 20 20 77 68 69  j */.        whi
1e8a0 6c 65 28 20 6a 3c 41 72 72 61 79 53 69 7a 65 28  le( j<ArraySize(
1e8b0 61 7a 48 65 6c 70 29 2d 31 20 26 26 20 61 7a 48  azHelp)-1 && azH
1e8c0 65 6c 70 5b 6a 5d 5b 30 5d 21 3d 27 2e 27 20 29  elp[j][0]!='.' )
1e8d0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
1e8e0 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
1e8f0 5c 6e 22 2c 20 61 7a 48 65 6c 70 5b 6a 5d 29 3b  \n", azHelp[j]);
1e900 0a 20 20 20 20 20 20 20 20 20 20 6a 2b 2b 3b 0a  .          j++;.
1e910 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e920 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e  }.      return n
1e930 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 4c  ;.    }.    /* L
1e940 6f 6f 6b 20 66 6f 72 20 63 6f 6d 6d 61 6e 64 73  ook for commands
1e950 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 7a 50   that contain zP
1e960 61 74 74 65 72 6e 20 61 6e 79 77 68 65 72 65 2e  attern anywhere.
1e970 20 20 53 68 6f 77 20 74 68 65 20 63 6f 6d 70 6c    Show the compl
1e980 65 74 65 0a 20 20 20 20 2a 2a 20 74 65 78 74 20  ete.    ** text 
1e990 6f 66 20 61 6c 6c 20 63 6f 6d 6d 61 6e 64 73 20  of all commands 
1e9a0 74 68 61 74 20 6d 61 74 63 68 2e 20 2a 2f 0a 20  that match. */. 
1e9b0 20 20 20 7a 50 61 74 20 3d 20 73 71 6c 69 74 65     zPat = sqlite
1e9c0 33 5f 6d 70 72 69 6e 74 66 28 22 25 25 25 73 25  3_mprintf("%%%s%
1e9d0 25 22 2c 20 7a 50 61 74 74 65 72 6e 29 3b 0a 20  %", zPattern);. 
1e9e0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
1e9f0 72 61 79 53 69 7a 65 28 61 7a 48 65 6c 70 29 3b  raySize(azHelp);
1ea00 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28   i++){.      if(
1ea10 20 61 7a 48 65 6c 70 5b 69 5d 5b 30 5d 3d 3d 27   azHelp[i][0]=='
1ea20 2e 27 20 29 20 6a 20 3d 20 69 3b 0a 20 20 20 20  .' ) j = i;.    
1ea30 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
1ea40 72 6c 69 6b 65 28 7a 50 61 74 2c 20 61 7a 48 65  rlike(zPat, azHe
1ea50 6c 70 5b 69 5d 2c 20 30 29 3d 3d 30 20 29 7b 0a  lp[i], 0)==0 ){.
1ea60 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
1ea70 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  ntf(out, "%s\n",
1ea80 20 61 7a 48 65 6c 70 5b 6a 5d 29 3b 0a 20 20 20   azHelp[j]);.   
1ea90 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3c 41 72       while( j<Ar
1eaa0 72 61 79 53 69 7a 65 28 61 7a 48 65 6c 70 29 2d  raySize(azHelp)-
1eab0 31 20 26 26 20 61 7a 48 65 6c 70 5b 6a 2b 31 5d  1 && azHelp[j+1]
1eac0 5b 30 5d 21 3d 27 2e 27 20 29 7b 0a 20 20 20 20  [0]!='.' ){.    
1ead0 20 20 20 20 20 20 6a 2b 2b 3b 0a 20 20 20 20 20        j++;.     
1eae0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
1eaf0 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 61 7a  (out, "%s\n", az
1eb00 48 65 6c 70 5b 6a 5d 29 3b 0a 20 20 20 20 20 20  Help[j]);.      
1eb10 20 20 7d 0a 20 20 20 20 20 20 20 20 69 20 3d 20    }.        i = 
1eb20 6a 3b 0a 20 20 20 20 20 20 20 20 6e 2b 2b 3b 0a  j;.        n++;.
1eb30 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1eb40 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1eb50 50 61 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Pat);.  }.  retu
1eb60 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 20 46 6f 72 77  rn n;.}../* Forw
1eb70 61 72 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f  ard reference */
1eb80 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72 6f 63  .static int proc
1eb90 65 73 73 5f 69 6e 70 75 74 28 53 68 65 6c 6c 53  ess_input(ShellS
1eba0 74 61 74 65 20 2a 70 29 3b 0a 0a 2f 2a 0a 2a 2a  tate *p);../*.**
1ebb0 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   Read the conten
1ebc0 74 20 6f 66 20 66 69 6c 65 20 7a 4e 61 6d 65 20  t of file zName 
1ebd0 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61  into memory obta
1ebe0 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65  ined from sqlite
1ebf0 33 5f 6d 61 6c 6c 6f 63 36 34 28 29 0a 2a 2a 20  3_malloc64().** 
1ec00 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69  and return a poi
1ec10 6e 74 65 72 20 74 6f 20 74 68 65 20 62 75 66 66  nter to the buff
1ec20 65 72 2e 20 54 68 65 20 63 61 6c 6c 65 72 20 69  er. The caller i
1ec30 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f  s responsible fo
1ec40 72 20 66 72 65 65 69 6e 67 0a 2a 2a 20 74 68 65  r freeing.** the
1ec50 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 49   memory..**.** I
1ec60 66 20 70 61 72 61 6d 65 74 65 72 20 70 6e 42 79  f parameter pnBy
1ec70 74 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  te is not NULL, 
1ec80 28 2a 70 6e 42 79 74 65 29 20 69 73 20 73 65 74  (*pnByte) is set
1ec90 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f   to the number o
1eca0 66 20 62 79 74 65 73 0a 2a 2a 20 72 65 61 64 2e  f bytes.** read.
1ecb0 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 63 6f 6e 76 65  .**.** For conve
1ecc0 6e 69 65 6e 63 65 2c 20 61 20 6e 75 6c 2d 74 65  nience, a nul-te
1ecd0 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 69 73  rminator byte is
1ece0 20 61 6c 77 61 79 73 20 61 70 70 65 6e 64 65 64   always appended
1ecf0 20 74 6f 20 74 68 65 20 64 61 74 61 20 72 65 61   to the data rea
1ed00 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66 69  d.** from the fi
1ed10 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 62 75  le before the bu
1ed20 66 66 65 72 20 69 73 20 72 65 74 75 72 6e 65 64  ffer is returned
1ed30 2e 20 54 68 69 73 20 62 79 74 65 20 69 73 20 6e  . This byte is n
1ed40 6f 74 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a 2a  ot included in.*
1ed50 2a 20 74 68 65 20 66 69 6e 61 6c 20 76 61 6c 75  * the final valu
1ed60 65 20 6f 66 20 28 2a 70 6e 42 79 74 65 29 2c 20  e of (*pnByte), 
1ed70 69 66 20 61 70 70 6c 69 63 61 62 6c 65 2e 0a 2a  if applicable..*
1ed80 2a 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74  *.** NULL is ret
1ed90 75 72 6e 65 64 20 69 66 20 61 6e 79 20 65 72 72  urned if any err
1eda0 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72 65  or is encountere
1edb0 64 2e 20 54 68 65 20 66 69 6e 61 6c 20 76 61 6c  d. The final val
1edc0 75 65 20 6f 66 20 2a 70 6e 42 79 74 65 0a 2a 2a  ue of *pnByte.**
1edd0 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69 6e   is undefined in
1ede0 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73   this case..*/.s
1edf0 74 61 74 69 63 20 63 68 61 72 20 2a 72 65 61 64  tatic char *read
1ee00 46 69 6c 65 28 63 6f 6e 73 74 20 63 68 61 72 20  File(const char 
1ee10 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 2a 70 6e 42  *zName, int *pnB
1ee20 79 74 65 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e  yte){.  FILE *in
1ee30 20 3d 20 66 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20   = fopen(zName, 
1ee40 22 72 62 22 29 3b 0a 20 20 6c 6f 6e 67 20 6e 49  "rb");.  long nI
1ee50 6e 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 52 65 61  n;.  size_t nRea
1ee60 64 3b 0a 20 20 63 68 61 72 20 2a 70 42 75 66 3b  d;.  char *pBuf;
1ee70 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 20 72  .  if( in==0 ) r
1ee80 65 74 75 72 6e 20 30 3b 0a 20 20 66 73 65 65 6b  eturn 0;.  fseek
1ee90 28 69 6e 2c 20 30 2c 20 53 45 45 4b 5f 45 4e 44  (in, 0, SEEK_END
1eea0 29 3b 0a 20 20 6e 49 6e 20 3d 20 66 74 65 6c 6c  );.  nIn = ftell
1eeb0 28 69 6e 29 3b 0a 20 20 72 65 77 69 6e 64 28 69  (in);.  rewind(i
1eec0 6e 29 3b 0a 20 20 70 42 75 66 20 3d 20 73 71 6c  n);.  pBuf = sql
1eed0 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e  ite3_malloc64( n
1eee0 49 6e 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 42  In+1 );.  if( pB
1eef0 75 66 3d 3d 30 20 29 7b 20 66 63 6c 6f 73 65 28  uf==0 ){ fclose(
1ef00 69 6e 29 3b 20 72 65 74 75 72 6e 20 30 3b 20 7d  in); return 0; }
1ef10 0a 20 20 6e 52 65 61 64 20 3d 20 66 72 65 61 64  .  nRead = fread
1ef20 28 70 42 75 66 2c 20 6e 49 6e 2c 20 31 2c 20 69  (pBuf, nIn, 1, i
1ef30 6e 29 3b 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29  n);.  fclose(in)
1ef40 3b 0a 20 20 69 66 28 20 6e 52 65 61 64 21 3d 31  ;.  if( nRead!=1
1ef50 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
1ef60 66 72 65 65 28 70 42 75 66 29 3b 0a 20 20 20 20  free(pBuf);.    
1ef70 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1ef80 70 42 75 66 5b 6e 49 6e 5d 20 3d 20 30 3b 0a 20  pBuf[nIn] = 0;. 
1ef90 20 69 66 28 20 70 6e 42 79 74 65 20 29 20 2a 70   if( pnByte ) *p
1efa0 6e 42 79 74 65 20 3d 20 6e 49 6e 3b 0a 20 20 72  nByte = nIn;.  r
1efb0 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 23  eturn pBuf;.}..#
1efc0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1efd0 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e  E_ENABLE_SESSION
1efe0 29 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20  )./*.** Close a 
1eff0 73 69 6e 67 6c 65 20 4f 70 65 6e 53 65 73 73 69  single OpenSessi
1f000 6f 6e 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65  on object and re
1f010 6c 65 61 73 65 20 61 6c 6c 20 6f 66 20 69 74 73  lease all of its
1f020 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 72   associated.** r
1f030 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 73 74 61  esources..*/.sta
1f040 74 69 63 20 76 6f 69 64 20 73 65 73 73 69 6f 6e  tic void session
1f050 5f 63 6c 6f 73 65 28 4f 70 65 6e 53 65 73 73 69  _close(OpenSessi
1f060 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 29 7b 0a 20  on *pSession){. 
1f070 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65   int i;.  sqlite
1f080 33 73 65 73 73 69 6f 6e 5f 64 65 6c 65 74 65 28  3session_delete(
1f090 70 53 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20 20  pSession->p);.  
1f0a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 65  sqlite3_free(pSe
1f0b0 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  ssion->zName);. 
1f0c0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 65 73   for(i=0; i<pSes
1f0d0 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72 3b 20 69  sion->nFilter; i
1f0e0 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
1f0f0 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e  _free(pSession->
1f100 61 7a 46 69 6c 74 65 72 5b 69 5d 29 3b 0a 20 20  azFilter[i]);.  
1f110 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
1f120 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c  (pSession->azFil
1f130 74 65 72 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70  ter);.  memset(p
1f140 53 65 73 73 69 6f 6e 2c 20 30 2c 20 73 69 7a 65  Session, 0, size
1f150 6f 66 28 4f 70 65 6e 53 65 73 73 69 6f 6e 29 29  of(OpenSession))
1f160 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
1f170 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 4f 70 65 6e  * Close all Open
1f180 53 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74 73 20  Session objects 
1f190 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20  and release all 
1f1a0 61 73 73 6f 63 69 61 74 65 64 20 72 65 73 6f 75  associated resou
1f1b0 72 63 65 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  rces..*/.#if def
1f1c0 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
1f1d0 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 73 74 61 74  LE_SESSION).stat
1f1e0 69 63 20 76 6f 69 64 20 73 65 73 73 69 6f 6e 5f  ic void session_
1f1f0 63 6c 6f 73 65 5f 61 6c 6c 28 53 68 65 6c 6c 53  close_all(ShellS
1f200 74 61 74 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tate *p){.  int 
1f210 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  i;.  for(i=0; i<
1f220 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b 20 69 2b 2b  p->nSession; i++
1f230 29 7b 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 63  ){.    session_c
1f240 6c 6f 73 65 28 26 70 2d 3e 61 53 65 73 73 69 6f  lose(&p->aSessio
1f250 6e 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e  n[i]);.  }.  p->
1f260 6e 53 65 73 73 69 6f 6e 20 3d 20 30 3b 0a 7d 0a  nSession = 0;.}.
1f270 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73  #else.# define s
1f280 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c 6c  ession_close_all
1f290 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  (X).#endif../*.*
1f2a0 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
1f2b0 20 6f 66 20 74 68 65 20 78 46 69 6c 74 65 72 20   of the xFilter 
1f2c0 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6e 20  function for an 
1f2d0 6f 70 65 6e 20 73 65 73 73 69 6f 6e 2e 20 20 4f  open session.  O
1f2e0 6d 69 74 0a 2a 2a 20 61 6e 79 20 74 61 62 6c 65  mit.** any table
1f2f0 73 20 6e 61 6d 65 64 20 62 79 20 22 2e 73 65 73  s named by ".ses
1f300 73 69 6f 6e 20 66 69 6c 74 65 72 22 20 62 75 74  sion filter" but
1f310 20 6c 65 74 20 61 6c 6c 20 6f 74 68 65 72 20 74   let all other t
1f320 61 62 6c 65 20 74 68 72 6f 75 67 68 2e 0a 2a 2f  able through..*/
1f330 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
1f340 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49  ITE_ENABLE_SESSI
1f350 4f 4e 29 0a 73 74 61 74 69 63 20 69 6e 74 20 73  ON).static int s
1f360 65 73 73 69 6f 6e 5f 66 69 6c 74 65 72 28 76 6f  ession_filter(vo
1f370 69 64 20 2a 70 43 74 78 2c 20 63 6f 6e 73 74 20  id *pCtx, const 
1f380 63 68 61 72 20 2a 7a 54 61 62 29 7b 0a 20 20 4f  char *zTab){.  O
1f390 70 65 6e 53 65 73 73 69 6f 6e 20 2a 70 53 65 73  penSession *pSes
1f3a0 73 69 6f 6e 20 3d 20 28 4f 70 65 6e 53 65 73 73  sion = (OpenSess
1f3b0 69 6f 6e 2a 29 70 43 74 78 3b 0a 20 20 69 6e 74  ion*)pCtx;.  int
1f3c0 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   i;.  for(i=0; i
1f3d0 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74  <pSession->nFilt
1f3e0 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  er; i++){.    if
1f3f0 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  ( sqlite3_strglo
1f400 62 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69  b(pSession->azFi
1f410 6c 74 65 72 5b 69 5d 2c 20 7a 54 61 62 29 3d 3d  lter[i], zTab)==
1f420 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1f430 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  }.  return 1;.}.
1f440 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72  #endif../*.** Tr
1f450 79 20 74 6f 20 64 65 64 75 63 65 20 74 68 65 20  y to deduce the 
1f460 74 79 70 65 20 6f 66 20 66 69 6c 65 20 66 6f 72  type of file for
1f470 20 7a 4e 61 6d 65 20 62 61 73 65 64 20 6f 6e 20   zName based on 
1f480 69 74 73 20 63 6f 6e 74 65 6e 74 2e 20 20 52 65  its content.  Re
1f490 74 75 72 6e 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74  turn.** one of t
1f4a0 68 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 2a 20  he SHELL_OPEN_* 
1f4b0 63 6f 6e 73 74 61 6e 74 73 2e 0a 2a 2a 0a 2a 2a  constants..**.**
1f4c0 20 49 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65   If the file doe
1f4d0 73 20 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 69  s not exist or i
1f4e0 73 20 65 6d 70 74 79 20 62 75 74 20 69 74 73 20  s empty but its 
1f4f0 6e 61 6d 65 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20  name looks like 
1f500 61 20 5a 49 50 0a 2a 2a 20 61 72 63 68 69 76 65  a ZIP.** archive
1f510 20 61 6e 64 20 74 68 65 20 64 66 6c 74 5a 69 70   and the dfltZip
1f520 20 66 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74   flag is true, t
1f530 68 65 6e 20 61 73 73 75 6d 65 20 69 74 20 69 73  hen assume it is
1f540 20 61 20 5a 49 50 20 61 72 63 68 69 76 65 2e 0a   a ZIP archive..
1f550 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73  ** Otherwise, as
1f560 73 75 6d 65 20 61 6e 20 6f 72 64 69 6e 61 72 79  sume an ordinary
1f570 20 64 61 74 61 62 61 73 65 20 72 65 67 61 72 64   database regard
1f580 6c 65 73 73 20 6f 66 20 74 68 65 20 66 69 6c 65  less of the file
1f590 6e 61 6d 65 20 69 66 0a 2a 2a 20 74 68 65 20 74  name if.** the t
1f5a0 79 70 65 20 63 61 6e 6e 6f 74 20 62 65 20 64 65  ype cannot be de
1f5b0 74 65 72 6d 69 6e 65 64 20 66 72 6f 6d 20 63 6f  termined from co
1f5c0 6e 74 65 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 64 65  ntent..*/.int de
1f5d0 64 75 63 65 44 61 74 61 62 61 73 65 54 79 70 65  duceDatabaseType
1f5e0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61  (const char *zNa
1f5f0 6d 65 2c 20 69 6e 74 20 64 66 6c 74 5a 69 70 29  me, int dfltZip)
1f600 7b 0a 20 20 46 49 4c 45 20 2a 66 20 3d 20 66 6f  {.  FILE *f = fo
1f610 70 65 6e 28 7a 4e 61 6d 65 2c 20 22 72 62 22 29  pen(zName, "rb")
1f620 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 3b 0a 20 20  ;.  size_t n;.  
1f630 69 6e 74 20 72 63 20 3d 20 53 48 45 4c 4c 5f 4f  int rc = SHELL_O
1f640 50 45 4e 5f 55 4e 53 50 45 43 3b 0a 20 20 63 68  PEN_UNSPEC;.  ch
1f650 61 72 20 7a 42 75 66 5b 31 30 30 5d 3b 0a 20 20  ar zBuf[100];.  
1f660 69 66 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20  if( f==0 ){.    
1f670 69 66 28 20 64 66 6c 74 5a 69 70 20 26 26 20 73  if( dfltZip && s
1f680 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22  qlite3_strlike("
1f690 25 2e 7a 69 70 22 2c 7a 4e 61 6d 65 2c 30 29 3d  %.zip",zName,0)=
1f6a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 72 65 74  =0 ){.       ret
1f6b0 75 72 6e 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a  urn SHELL_OPEN_Z
1f6c0 49 50 46 49 4c 45 3b 0a 20 20 20 20 7d 65 6c 73  IPFILE;.    }els
1f6d0 65 7b 0a 20 20 20 20 20 20 20 72 65 74 75 72 6e  e{.       return
1f6e0 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d   SHELL_OPEN_NORM
1f6f0 41 4c 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  AL;.    }.  }.  
1f700 6e 20 3d 20 66 72 65 61 64 28 7a 42 75 66 2c 20  n = fread(zBuf, 
1f710 31 36 2c 20 31 2c 20 66 29 3b 0a 20 20 69 66 28  16, 1, f);.  if(
1f720 20 6e 3d 3d 31 20 26 26 20 6d 65 6d 63 6d 70 28   n==1 && memcmp(
1f730 7a 42 75 66 2c 20 22 53 51 4c 69 74 65 20 66 6f  zBuf, "SQLite fo
1f740 72 6d 61 74 20 33 22 2c 20 31 36 29 3d 3d 30 20  rmat 3", 16)==0 
1f750 29 7b 0a 20 20 20 20 66 63 6c 6f 73 65 28 66 29  ){.    fclose(f)
1f760 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 48 45  ;.    return SHE
1f770 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 3b 0a  LL_OPEN_NORMAL;.
1f780 20 20 7d 0a 20 20 66 73 65 65 6b 28 66 2c 20 2d    }.  fseek(f, -
1f790 32 35 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20  25, SEEK_END);. 
1f7a0 20 6e 20 3d 20 66 72 65 61 64 28 7a 42 75 66 2c   n = fread(zBuf,
1f7b0 20 32 35 2c 20 31 2c 20 66 29 3b 0a 20 20 69 66   25, 1, f);.  if
1f7c0 28 20 6e 3d 3d 31 20 26 26 20 6d 65 6d 63 6d 70  ( n==1 && memcmp
1f7d0 28 7a 42 75 66 2c 20 22 53 74 61 72 74 2d 4f 66  (zBuf, "Start-Of
1f7e0 2d 53 51 4c 69 74 65 33 2d 22 2c 20 31 37 29 3d  -SQLite3-", 17)=
1f7f0 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 53  =0 ){.    rc = S
1f800 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44  HELL_OPEN_APPEND
1f810 56 46 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  VFS;.  }else{.  
1f820 20 20 66 73 65 65 6b 28 66 2c 20 2d 32 32 2c 20    fseek(f, -22, 
1f830 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 20 20 6e  SEEK_END);.    n
1f840 20 3d 20 66 72 65 61 64 28 7a 42 75 66 2c 20 32   = fread(zBuf, 2
1f850 32 2c 20 31 2c 20 66 29 3b 0a 20 20 20 20 69 66  2, 1, f);.    if
1f860 28 20 6e 3d 3d 31 20 26 26 20 7a 42 75 66 5b 30  ( n==1 && zBuf[0
1f870 5d 3d 3d 30 78 35 30 20 26 26 20 7a 42 75 66 5b  ]==0x50 && zBuf[
1f880 31 5d 3d 3d 30 78 34 62 20 26 26 20 7a 42 75 66  1]==0x4b && zBuf
1f890 5b 32 5d 3d 3d 30 78 30 35 0a 20 20 20 20 20 20  [2]==0x05.      
1f8a0 20 26 26 20 7a 42 75 66 5b 33 5d 3d 3d 30 78 30   && zBuf[3]==0x0
1f8b0 36 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  6 ){.      rc = 
1f8c0 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49  SHELL_OPEN_ZIPFI
1f8d0 4c 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  LE;.    }else if
1f8e0 28 20 6e 3d 3d 30 20 26 26 20 64 66 6c 74 5a 69  ( n==0 && dfltZi
1f8f0 70 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72  p && sqlite3_str
1f900 6c 69 6b 65 28 22 25 2e 7a 69 70 22 2c 7a 4e 61  like("%.zip",zNa
1f910 6d 65 2c 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20  me,0)==0 ){.    
1f920 20 20 72 63 20 3d 20 53 48 45 4c 4c 5f 4f 50 45    rc = SHELL_OPE
1f930 4e 5f 5a 49 50 46 49 4c 45 3b 0a 20 20 20 20 7d  N_ZIPFILE;.    }
1f940 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66 29  .  }.  fclose(f)
1f950 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20  ;.  return rc;  
1f960 0a 7d 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .}..#ifdef SQLIT
1f970 45 5f 45 4e 41 42 4c 45 5f 44 45 53 45 52 49 41  E_ENABLE_DESERIA
1f980 4c 49 5a 45 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 6e  LIZE./*.** Recon
1f990 73 74 72 75 63 74 20 61 6e 20 69 6e 2d 6d 65 6d  struct an in-mem
1f9a0 6f 72 79 20 64 61 74 61 62 61 73 65 20 75 73 69  ory database usi
1f9b0 6e 67 20 74 68 65 20 6f 75 74 70 75 74 20 66 72  ng the output fr
1f9c0 6f 6d 20 74 68 65 20 22 64 62 74 6f 74 78 74 22  om the "dbtotxt"
1f9d0 0a 2a 2a 20 70 72 6f 67 72 61 6d 2e 20 20 52 65  .** program.  Re
1f9e0 61 64 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20  ad content from 
1f9f0 74 68 65 20 66 69 6c 65 20 69 6e 20 70 2d 3e 7a  the file in p->z
1fa00 44 62 46 69 6c 65 6e 61 6d 65 2e 20 20 49 66 20  DbFilename.  If 
1fa10 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 0a 2a  p->zDbFilename.*
1fa20 2a 20 69 73 20 30 2c 20 74 68 65 6e 20 72 65 61  * is 0, then rea
1fa30 64 20 66 72 6f 6d 20 73 74 61 6e 64 61 72 64 20  d from standard 
1fa40 69 6e 70 75 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  input..*/.static
1fa50 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1fa60 72 65 61 64 48 65 78 44 62 28 53 68 65 6c 6c 53  readHexDb(ShellS
1fa70 74 61 74 65 20 2a 70 2c 20 69 6e 74 20 2a 70 6e  tate *p, int *pn
1fa80 44 61 74 61 29 7b 0a 20 20 75 6e 73 69 67 6e 65  Data){.  unsigne
1fa90 64 20 63 68 61 72 20 2a 61 20 3d 20 30 3b 0a 20  d char *a = 0;. 
1faa0 20 69 6e 74 20 6e 4c 69 6e 65 3b 0a 20 20 69 6e   int nLine;.  in
1fab0 74 20 6e 20 3d 20 30 3b 0a 20 20 69 6e 74 20 70  t n = 0;.  int p
1fac0 67 73 7a 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  gsz = 0;.  int i
1fad0 4f 66 66 73 65 74 20 3d 20 30 3b 0a 20 20 69 6e  Offset = 0;.  in
1fae0 74 20 6a 2c 20 6b 3b 0a 20 20 69 6e 74 20 72 63  t j, k;.  int rc
1faf0 3b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20  ;.  FILE *in;.  
1fb00 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 78 5b  unsigned char x[
1fb10 31 36 5d 3b 0a 20 20 63 68 61 72 20 7a 4c 69 6e  16];.  char zLin
1fb20 65 5b 31 30 30 30 5d 3b 0a 20 20 69 66 28 20 70  e[1000];.  if( p
1fb30 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 29 7b  ->zDbFilename ){
1fb40 0a 20 20 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28  .    in = fopen(
1fb50 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20  p->zDbFilename, 
1fb60 22 72 22 29 3b 0a 20 20 20 20 69 66 28 20 69 6e  "r");.    if( in
1fb70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66  ==0 ){.      utf
1fb80 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
1fb90 20 22 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22   "cannot open \"
1fba0 25 73 5c 22 20 66 6f 72 20 72 65 61 64 69 6e 67  %s\" for reading
1fbb0 5c 6e 22 2c 20 70 2d 3e 7a 44 62 46 69 6c 65 6e  \n", p->zDbFilen
1fbc0 61 6d 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75  ame);.      retu
1fbd0 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
1fbe0 6e 4c 69 6e 65 20 3d 20 30 3b 0a 20 20 7d 65 6c  nLine = 0;.  }el
1fbf0 73 65 7b 0a 20 20 20 20 69 6e 20 3d 20 70 2d 3e  se{.    in = p->
1fc00 69 6e 3b 0a 20 20 20 20 6e 4c 69 6e 65 20 3d 20  in;.    nLine = 
1fc10 70 2d 3e 6c 69 6e 65 6e 6f 3b 0a 20 20 7d 0a 20  p->lineno;.  }. 
1fc20 20 2a 70 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20   *pnData = 0;.  
1fc30 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 69 66 28 20 66  nLine++;.  if( f
1fc40 67 65 74 73 28 7a 4c 69 6e 65 2c 20 73 69 7a 65  gets(zLine, size
1fc50 6f 66 28 7a 4c 69 6e 65 29 2c 20 69 6e 29 3d 3d  of(zLine), in)==
1fc60 30 20 29 20 67 6f 74 6f 20 72 65 61 64 48 65 78  0 ) goto readHex
1fc70 44 62 5f 65 72 72 6f 72 3b 0a 20 20 72 63 20 3d  Db_error;.  rc =
1fc80 20 73 73 63 61 6e 66 28 7a 4c 69 6e 65 2c 20 22   sscanf(zLine, "
1fc90 7c 20 73 69 7a 65 20 25 64 20 70 61 67 65 73 69  | size %d pagesi
1fca0 7a 65 20 25 64 22 2c 20 26 6e 2c 20 26 70 67 73  ze %d", &n, &pgs
1fcb0 7a 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 32 20  z);.  if( rc!=2 
1fcc0 29 20 67 6f 74 6f 20 72 65 61 64 48 65 78 44 62  ) goto readHexDb
1fcd0 5f 65 72 72 6f 72 3b 0a 20 20 69 66 28 20 6e 3c  _error;.  if( n<
1fce0 3d 30 20 29 20 67 6f 74 6f 20 72 65 61 64 48 65  =0 ) goto readHe
1fcf0 78 44 62 5f 65 72 72 6f 72 3b 0a 20 20 61 20 3d  xDb_error;.  a =
1fd00 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28   sqlite3_malloc(
1fd10 20 6e 20 29 3b 0a 20 20 69 66 28 20 61 3d 3d 30   n );.  if( a==0
1fd20 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
1fd30 6e 74 66 28 73 74 64 65 72 72 2c 20 22 4f 75 74  ntf(stderr, "Out
1fd40 20 6f 66 20 6d 65 6d 6f 72 79 21 5c 6e 22 29 3b   of memory!\n");
1fd50 0a 20 20 20 20 67 6f 74 6f 20 72 65 61 64 48 65  .    goto readHe
1fd60 78 44 62 5f 65 72 72 6f 72 3b 0a 20 20 7d 0a 20  xDb_error;.  }. 
1fd70 20 6d 65 6d 73 65 74 28 61 2c 20 30 2c 20 6e 29   memset(a, 0, n)
1fd80 3b 0a 20 20 69 66 28 20 70 67 73 7a 3c 35 31 32  ;.  if( pgsz<512
1fd90 20 7c 7c 20 70 67 73 7a 3e 36 35 35 33 36 20 7c   || pgsz>65536 |
1fda0 7c 20 28 70 67 73 7a 20 26 20 28 70 67 73 7a 2d  | (pgsz & (pgsz-
1fdb0 31 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 75 74  1))!=0 ){.    ut
1fdc0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
1fdd0 2c 20 22 69 6e 76 61 6c 69 64 20 70 61 67 65 73  , "invalid pages
1fde0 69 7a 65 5c 6e 22 29 3b 0a 20 20 20 20 67 6f 74  ize\n");.    got
1fdf0 6f 20 72 65 61 64 48 65 78 44 62 5f 65 72 72 6f  o readHexDb_erro
1fe00 72 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 6e 4c 69  r;.  }.  for(nLi
1fe10 6e 65 2b 2b 3b 20 66 67 65 74 73 28 7a 4c 69 6e  ne++; fgets(zLin
1fe20 65 2c 20 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29  e, sizeof(zLine)
1fe30 2c 20 69 6e 29 21 3d 30 3b 20 6e 4c 69 6e 65 2b  , in)!=0; nLine+
1fe40 2b 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 73 63  +){.    rc = ssc
1fe50 61 6e 66 28 7a 4c 69 6e 65 2c 20 22 7c 20 70 61  anf(zLine, "| pa
1fe60 67 65 20 25 64 20 6f 66 66 73 65 74 20 25 64 22  ge %d offset %d"
1fe70 2c 20 26 6a 2c 20 26 6b 29 3b 0a 20 20 20 20 69  , &j, &k);.    i
1fe80 66 28 20 72 63 3d 3d 32 20 29 7b 0a 20 20 20 20  f( rc==2 ){.    
1fe90 20 20 69 4f 66 66 73 65 74 20 3d 20 6b 3b 0a 20    iOffset = k;. 
1fea0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
1feb0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74 72     }.    if( str
1fec0 6e 63 6d 70 28 7a 4c 69 6e 65 2c 20 22 7c 20 65  ncmp(zLine, "| e
1fed0 6e 64 20 22 2c 20 36 29 3d 3d 30 20 29 7b 0a 20  nd ", 6)==0 ){. 
1fee0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1fef0 7d 0a 20 20 20 20 72 63 20 3d 20 73 73 63 61 6e  }.    rc = sscan
1ff00 66 28 7a 4c 69 6e 65 2c 22 7c 20 25 64 3a 20 25  f(zLine,"| %d: %
1ff10 68 68 78 20 25 68 68 78 20 25 68 68 78 20 25 68  hhx %hhx %hhx %h
1ff20 68 78 20 25 68 68 78 20 25 68 68 78 20 25 68 68  hx %hhx %hhx %hh
1ff30 78 20 25 68 68 78 22 0a 20 20 20 20 20 20 20 20  x %hhx".        
1ff40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
1ff50 20 25 68 68 78 20 25 68 68 78 20 25 68 68 78 20   %hhx %hhx %hhx 
1ff60 25 68 68 78 20 25 68 68 78 20 25 68 68 78 20 25  %hhx %hhx %hhx %
1ff70 68 68 78 20 25 68 68 78 22 2c 0a 20 20 20 20 20  hhx %hhx",.     
1ff80 20 20 20 20 20 20 20 20 20 20 20 26 6a 2c 20 26             &j, &
1ff90 78 5b 30 5d 2c 20 26 78 5b 31 5d 2c 20 26 78 5b  x[0], &x[1], &x[
1ffa0 32 5d 2c 20 26 78 5b 33 5d 2c 20 26 78 5b 34 5d  2], &x[3], &x[4]
1ffb0 2c 20 26 78 5b 35 5d 2c 20 26 78 5b 36 5d 2c 20  , &x[5], &x[6], 
1ffc0 26 78 5b 37 5d 2c 0a 20 20 20 20 20 20 20 20 20  &x[7],.         
1ffd0 20 20 20 20 20 20 20 26 78 5b 38 5d 2c 20 26 78         &x[8], &x
1ffe0 5b 39 5d 2c 20 26 78 5b 31 30 5d 2c 20 26 78 5b  [9], &x[10], &x[
1fff0 31 31 5d 2c 20 26 78 5b 31 32 5d 2c 20 26 78 5b  11], &x[12], &x[
20000 31 33 5d 2c 20 26 78 5b 31 34 5d 2c 20 26 78 5b  13], &x[14], &x[
20010 31 35 5d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  15]);.    if( rc
20020 3d 3d 31 37 20 29 7b 0a 20 20 20 20 20 20 6b 20  ==17 ){.      k 
20030 3d 20 69 4f 66 66 73 65 74 2b 6a 3b 0a 20 20 20  = iOffset+j;.   
20040 20 20 20 69 66 28 20 6b 2b 31 36 3c 3d 6e 20 29     if( k+16<=n )
20050 7b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70 79  {.        memcpy
20060 28 61 2b 6b 2c 20 78 2c 20 31 36 29 3b 0a 20 20  (a+k, x, 16);.  
20070 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
20080 20 20 2a 70 6e 44 61 74 61 20 3d 20 6e 3b 0a 20    *pnData = n;. 
20090 20 69 66 28 20 69 6e 21 3d 70 2d 3e 69 6e 20 29   if( in!=p->in )
200a0 7b 0a 20 20 20 20 66 63 6c 6f 73 65 28 69 6e 29  {.    fclose(in)
200b0 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
200c0 2d 3e 6c 69 6e 65 6e 6f 20 3d 20 6e 4c 69 6e 65  ->lineno = nLine
200d0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  ;.  }.  return a
200e0 3b 0a 0a 72 65 61 64 48 65 78 44 62 5f 65 72 72  ;..readHexDb_err
200f0 6f 72 3a 0a 20 20 69 66 28 20 69 6e 21 3d 73 74  or:.  if( in!=st
20100 64 69 6e 20 29 7b 0a 20 20 20 20 66 63 6c 6f 73  din ){.    fclos
20110 65 28 69 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e(in);.  }else{.
20120 20 20 20 20 77 68 69 6c 65 28 20 66 67 65 74 73      while( fgets
20130 28 7a 4c 69 6e 65 2c 20 73 69 7a 65 6f 66 28 7a  (zLine, sizeof(z
20140 4c 69 6e 65 29 2c 20 70 2d 3e 69 6e 29 21 3d 30  Line), p->in)!=0
20150 20 29 7b 0a 20 20 20 20 20 20 6e 4c 69 6e 65 2b   ){.      nLine+
20160 2b 3b 0a 20 20 20 20 20 20 69 66 28 73 74 72 6e  +;.      if(strn
20170 63 6d 70 28 7a 4c 69 6e 65 2c 20 22 7c 20 65 6e  cmp(zLine, "| en
20180 64 20 22 2c 20 36 29 3d 3d 30 20 29 20 62 72 65  d ", 6)==0 ) bre
20190 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d  ak;.    }.    p-
201a0 3e 6c 69 6e 65 6e 6f 20 3d 20 6e 4c 69 6e 65 3b  >lineno = nLine;
201b0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
201c0 72 65 65 28 61 29 3b 0a 20 20 75 74 66 38 5f 70  ree(a);.  utf8_p
201d0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72  rintf(stderr,"Er
201e0 72 6f 72 20 6f 6e 20 6c 69 6e 65 20 25 64 20 6f  ror on line %d o
201f0 66 20 2d 2d 68 65 78 64 62 20 69 6e 70 75 74 5c  f --hexdb input\
20200 6e 22 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20 72 65  n", nLine);.  re
20210 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
20220 20 2f 2a 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c   /* SQLITE_ENABL
20230 45 5f 44 45 53 45 52 49 41 4c 49 5a 45 20 2a 2f  E_DESERIALIZE */
20240 0a 0a 2f 2a 20 46 6c 61 67 73 20 66 6f 72 20 6f  ../* Flags for o
20250 70 65 6e 5f 64 62 28 29 2e 0a 2a 2a 0a 2a 2a 20  pen_db()..**.** 
20260 54 68 65 20 64 65 66 61 75 6c 74 20 62 65 68 61  The default beha
20270 76 69 6f 72 20 6f 66 20 6f 70 65 6e 5f 64 62 28  vior of open_db(
20280 29 20 69 73 20 74 6f 20 65 78 69 74 28 31 29 20  ) is to exit(1) 
20290 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  if the database 
202a0 66 61 69 6c 73 20 74 6f 0a 2a 2a 20 6f 70 65 6e  fails to.** open
202b0 2e 20 20 54 68 65 20 4f 50 45 4e 5f 44 42 5f 4b  .  The OPEN_DB_K
202c0 45 45 50 41 4c 49 56 45 20 66 6c 61 67 20 63 68  EEPALIVE flag ch
202d0 61 6e 67 65 73 20 74 68 61 74 20 73 6f 20 74 68  anges that so th
202e0 61 74 20 69 74 20 70 72 69 6e 74 73 20 61 6e 20  at it prints an 
202f0 65 72 72 6f 72 0a 2a 2a 20 62 75 74 20 73 74 69  error.** but sti
20300 6c 6c 20 72 65 74 75 72 6e 73 20 77 69 74 68 6f  ll returns witho
20310 75 74 20 63 61 6c 6c 69 6e 67 20 65 78 69 74 2e  ut calling exit.
20320 0a 2a 2a 0a 2a 2a 20 54 68 65 20 4f 50 45 4e 5f  .**.** The OPEN_
20330 44 42 5f 5a 49 50 46 49 4c 45 20 66 6c 61 67 20  DB_ZIPFILE flag 
20340 63 61 75 73 65 73 20 6f 70 65 6e 5f 64 62 28 29  causes open_db()
20350 20 74 6f 20 70 72 65 66 65 72 20 74 6f 20 6f 70   to prefer to op
20360 65 6e 20 66 69 6c 65 73 20 61 73 20 61 0a 2a 2a  en files as a.**
20370 20 5a 49 50 20 61 72 63 68 69 76 65 20 69 66 20   ZIP archive if 
20380 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e 6f  the file does no
20390 74 20 65 78 69 73 74 20 6f 72 20 69 73 20 65 6d  t exist or is em
203a0 70 74 79 20 61 6e 64 20 69 74 73 20 6e 61 6d 65  pty and its name
203b0 20 6d 61 74 63 68 65 73 0a 2a 2a 20 74 68 65 20   matches.** the 
203c0 2a 2e 7a 69 70 20 70 61 74 74 65 72 6e 2e 0a 2a  *.zip pattern..*
203d0 2f 0a 23 64 65 66 69 6e 65 20 4f 50 45 4e 5f 44  /.#define OPEN_D
203e0 42 5f 4b 45 45 50 41 4c 49 56 45 20 20 20 30 78  B_KEEPALIVE   0x
203f0 30 30 31 20 20 20 2f 2a 20 52 65 74 75 72 6e 20  001   /* Return 
20400 61 66 74 65 72 20 65 72 72 6f 72 20 69 66 20 74  after error if t
20410 72 75 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4f  rue */.#define O
20420 50 45 4e 5f 44 42 5f 5a 49 50 46 49 4c 45 20 20  PEN_DB_ZIPFILE  
20430 20 20 20 30 78 30 30 32 20 20 20 2f 2a 20 4f 70     0x002   /* Op
20440 65 6e 20 61 73 20 5a 49 50 20 69 66 20 6e 61 6d  en as ZIP if nam
20450 65 20 6d 61 74 63 68 65 73 20 2a 2e 7a 69 70 20  e matches *.zip 
20460 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  */../*.** Make s
20470 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ure the database
20480 20 69 73 20 6f 70 65 6e 2e 20 20 49 66 20 69 74   is open.  If it
20490 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 6f 70   is not, then op
204a0 65 6e 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68  en it.  If.** th
204b0 65 20 64 61 74 61 62 61 73 65 20 66 61 69 6c 73  e database fails
204c0 20 74 6f 20 6f 70 65 6e 2c 20 70 72 69 6e 74 20   to open, print 
204d0 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
204e0 20 61 6e 64 20 65 78 69 74 2e 0a 2a 2f 0a 73 74   and exit..*/.st
204f0 61 74 69 63 20 76 6f 69 64 20 6f 70 65 6e 5f 64  atic void open_d
20500 62 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c  b(ShellState *p,
20510 20 69 6e 74 20 6f 70 65 6e 46 6c 61 67 73 29 7b   int openFlags){
20520 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20  .  if( p->db==0 
20530 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70  ){.    if( p->op
20540 65 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50  enMode==SHELL_OP
20550 45 4e 5f 55 4e 53 50 45 43 20 29 7b 0a 20 20 20  EN_UNSPEC ){.   
20560 20 20 20 69 66 28 20 70 2d 3e 7a 44 62 46 69 6c     if( p->zDbFil
20570 65 6e 61 6d 65 3d 3d 30 20 7c 7c 20 70 2d 3e 7a  ename==0 || p->z
20580 44 62 46 69 6c 65 6e 61 6d 65 5b 30 5d 3d 3d 30  DbFilename[0]==0
20590 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f   ){.        p->o
205a0 70 65 6e 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f  penMode = SHELL_
205b0 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 20  OPEN_NORMAL;.   
205c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
205d0 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20    p->openMode = 
205e0 28 75 38 29 64 65 64 75 63 65 44 61 74 61 62 61  (u8)deduceDataba
205f0 73 65 54 79 70 65 28 70 2d 3e 7a 44 62 46 69 6c  seType(p->zDbFil
20600 65 6e 61 6d 65 2c 20 0a 20 20 20 20 20 20 20 20  ename, .        
20610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20620 20 20 20 20 20 28 6f 70 65 6e 46 6c 61 67 73 20       (openFlags 
20630 26 20 4f 50 45 4e 5f 44 42 5f 5a 49 50 46 49 4c  & OPEN_DB_ZIPFIL
20640 45 29 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a  E)!=0);.      }.
20650 20 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68      }.    switch
20660 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 29 7b  ( p->openMode ){
20670 0a 20 20 20 20 20 20 63 61 73 65 20 53 48 45 4c  .      case SHEL
20680 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53  L_OPEN_APPENDVFS
20690 3a 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  : {.        sqli
206a0 74 65 33 5f 6f 70 65 6e 5f 76 32 28 70 2d 3e 7a  te3_open_v2(p->z
206b0 44 62 46 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e  DbFilename, &p->
206c0 64 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  db, .           
206d0 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44  SQLITE_OPEN_READ
206e0 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45  WRITE|SQLITE_OPE
206f0 4e 5f 43 52 45 41 54 45 2c 20 22 61 70 6e 64 76  N_CREATE, "apndv
20700 66 73 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72  fs");.        br
20710 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
20720 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50     case SHELL_OP
20730 45 4e 5f 48 45 58 44 42 3a 0a 20 20 20 20 20 20  EN_HEXDB:.      
20740 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  case SHELL_OPEN_
20750 44 45 53 45 52 49 41 4c 49 5a 45 3a 20 7b 0a 20  DESERIALIZE: {. 
20760 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f         sqlite3_o
20770 70 65 6e 28 30 2c 20 26 70 2d 3e 64 62 29 3b 0a  pen(0, &p->db);.
20780 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
20790 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
207a0 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50  e SHELL_OPEN_ZIP
207b0 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 20 20  FILE: {.        
207c0 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 22 3a 6d  sqlite3_open(":m
207d0 65 6d 6f 72 79 3a 22 2c 20 26 70 2d 3e 64 62 29  emory:", &p->db)
207e0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
207f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
20800 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 52  ase SHELL_OPEN_R
20810 45 41 44 4f 4e 4c 59 3a 20 7b 0a 20 20 20 20 20  EADONLY: {.     
20820 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f     sqlite3_open_
20830 76 32 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d  v2(p->zDbFilenam
20840 65 2c 20 26 70 2d 3e 64 62 2c 20 53 51 4c 49 54  e, &p->db, SQLIT
20850 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c  E_OPEN_READONLY,
20860 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65   0);.        bre
20870 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
20880 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45    case SHELL_OPE
20890 4e 5f 52 45 55 53 45 53 43 48 45 4d 41 3a 20 7b  N_REUSESCHEMA: {
208a0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
208b0 5f 6f 70 65 6e 5f 76 32 28 70 2d 3e 7a 44 62 46  _open_v2(p->zDbF
208c0 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e 64 62 2c  ilename, &p->db,
208d0 0a 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  .          SQLIT
208e0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
208f0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
20900 41 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ATE|SQLITE_OPEN_
20910 53 48 41 52 45 44 5f 53 43 48 45 4d 41 2c 30 29  SHARED_SCHEMA,0)
20920 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
20930 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
20940 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55  ase SHELL_OPEN_U
20950 4e 53 50 45 43 3a 0a 20 20 20 20 20 20 63 61 73  NSPEC:.      cas
20960 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52  e SHELL_OPEN_NOR
20970 4d 41 4c 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  MAL: {.        s
20980 71 6c 69 74 65 33 5f 6f 70 65 6e 28 70 2d 3e 7a  qlite3_open(p->z
20990 44 62 46 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e  DbFilename, &p->
209a0 64 62 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  db);.        bre
209b0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
209c0 7d 0a 20 20 20 20 67 6c 6f 62 61 6c 44 62 20 3d  }.    globalDb =
209d0 20 70 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20   p->db;.    if( 
209e0 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 53 51 4c 49  p->db==0 || SQLI
209f0 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33 5f 65  TE_OK!=sqlite3_e
20a00 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 20 29 7b  rrcode(p->db) ){
20a10 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
20a20 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
20a30 3a 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e  : unable to open
20a40 20 64 61 74 61 62 61 73 65 20 5c 22 25 73 5c 22   database \"%s\"
20a50 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  : %s\n",.       
20a60 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d     p->zDbFilenam
20a70 65 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  e, sqlite3_errms
20a80 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  g(p->db));.     
20a90 20 69 66 28 20 6f 70 65 6e 46 6c 61 67 73 20 26   if( openFlags &
20aa0 20 4f 50 45 4e 5f 44 42 5f 4b 45 45 50 41 4c 49   OPEN_DB_KEEPALI
20ab0 56 45 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  VE ){.        sq
20ac0 6c 69 74 65 33 5f 6f 70 65 6e 28 22 3a 6d 65 6d  lite3_open(":mem
20ad0 6f 72 79 3a 22 2c 20 26 70 2d 3e 64 62 29 3b 0a  ory:", &p->db);.
20ae0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
20af0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65 78        }.      ex
20b00 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 23 69 66  it(1);.    }.#if
20b10 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
20b20 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
20b30 20 20 20 20 73 71 6c 69 74 65 33 5f 65 6e 61 62      sqlite3_enab
20b40 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  le_load_extensio
20b50 6e 28 70 2d 3e 64 62 2c 20 31 29 3b 0a 23 65 6e  n(p->db, 1);.#en
20b60 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  dif.    sqlite3_
20b70 66 69 6c 65 69 6f 5f 69 6e 69 74 28 70 2d 3e 64  fileio_init(p->d
20b80 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  b, 0, 0);.    sq
20b90 6c 69 74 65 33 5f 73 68 61 74 68 72 65 65 5f 69  lite3_shathree_i
20ba0 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29  nit(p->db, 0, 0)
20bb0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f  ;.    sqlite3_co
20bc0 6d 70 6c 65 74 69 6f 6e 5f 69 6e 69 74 28 70 2d  mpletion_init(p-
20bd0 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 23 69 66 64  >db, 0, 0);.#ifd
20be0 65 66 20 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a  ef SQLITE_HAVE_Z
20bf0 4c 49 42 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  LIB.    sqlite3_
20c00 7a 69 70 66 69 6c 65 5f 69 6e 69 74 28 70 2d 3e  zipfile_init(p->
20c10 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  db, 0, 0);.    s
20c20 71 6c 69 74 65 33 5f 73 71 6c 61 72 5f 69 6e 69  qlite3_sqlar_ini
20c30 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a  t(p->db, 0, 0);.
20c40 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
20c50 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69  e3_create_functi
20c60 6f 6e 28 70 2d 3e 64 62 2c 20 22 73 68 65 6c 6c  on(p->db, "shell
20c70 5f 61 64 64 5f 73 63 68 65 6d 61 22 2c 20 33 2c  _add_schema", 3,
20c80 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
20c90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68 65               she
20cb0 6c 6c 41 64 64 53 63 68 65 6d 61 4e 61 6d 65 2c  llAddSchemaName,
20cc0 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
20cd0 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74  te3_create_funct
20ce0 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 73 68 65 6c  ion(p->db, "shel
20cf0 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68 65 6d 61 22  l_module_schema"
20d00 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 1, SQLITE_UTF8
20d10 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
20d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d30 20 73 68 65 6c 6c 4d 6f 64 75 6c 65 53 63 68 65   shellModuleSche
20d40 6d 61 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  ma, 0, 0);.    s
20d50 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
20d60 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 73  nction(p->db, "s
20d70 68 65 6c 6c 5f 70 75 74 73 6e 6c 22 2c 20 31 2c  hell_putsnl", 1,
20d80 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 70 2c   SQLITE_UTF8, p,
20d90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
20da0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68 65               she
20db0 6c 6c 50 75 74 73 46 75 6e 63 2c 20 30 2c 20 30  llPutsFunc, 0, 0
20dc0 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  );.#ifndef SQLIT
20dd0 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a  E_NOHAVE_SYSTEM.
20de0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61      sqlite3_crea
20df0 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64  te_function(p->d
20e00 62 2c 20 22 65 64 69 74 22 2c 20 31 2c 20 53 51  b, "edit", 1, SQ
20e10 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20  LITE_UTF8, 0,.  
20e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e30 20 20 20 20 20 20 20 20 20 20 65 64 69 74 46 75            editFu
20e40 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  nc, 0, 0);.    s
20e50 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
20e60 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 65  nction(p->db, "e
20e70 64 69 74 22 2c 20 32 2c 20 53 51 4c 49 54 45 5f  dit", 2, SQLITE_
20e80 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20  UTF8, 0,.       
20e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20ea0 20 20 20 20 20 65 64 69 74 46 75 6e 63 2c 20 30       editFunc, 0
20eb0 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
20ec0 20 69 66 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65   if( p->openMode
20ed0 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50  ==SHELL_OPEN_ZIP
20ee0 46 49 4c 45 20 29 7b 0a 20 20 20 20 20 20 63 68  FILE ){.      ch
20ef0 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ar *zSql = sqlit
20f00 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
20f10 20 20 20 20 20 22 43 52 45 41 54 45 20 56 49 52       "CREATE VIR
20f20 54 55 41 4c 20 54 41 42 4c 45 20 7a 69 70 20 55  TUAL TABLE zip U
20f30 53 49 4e 47 20 7a 69 70 66 69 6c 65 28 25 51 29  SING zipfile(%Q)
20f40 3b 22 2c 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61  ;", p->zDbFilena
20f50 6d 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  me);.      sqlit
20f60 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a  e3_exec(p->db, z
20f70 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  Sql, 0, 0, 0);. 
20f80 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
20f90 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 23  e(zSql);.    }.#
20fa0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
20fb0 42 4c 45 5f 44 45 53 45 52 49 41 4c 49 5a 45 0a  BLE_DESERIALIZE.
20fc0 20 20 20 20 65 6c 73 65 0a 20 20 20 20 69 66 28      else.    if(
20fd0 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53 48   p->openMode==SH
20fe0 45 4c 4c 5f 4f 50 45 4e 5f 44 45 53 45 52 49 41  ELL_OPEN_DESERIA
20ff0 4c 49 5a 45 20 7c 7c 20 70 2d 3e 6f 70 65 6e 4d  LIZE || p->openM
21000 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f  ode==SHELL_OPEN_
21010 48 45 58 44 42 20 29 7b 0a 20 20 20 20 20 20 69  HEXDB ){.      i
21020 6e 74 20 72 63 3b 0a 20 20 20 20 20 20 69 6e 74  nt rc;.      int
21030 20 6e 44 61 74 61 20 3d 20 30 3b 0a 20 20 20 20   nData = 0;.    
21040 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20    unsigned char 
21050 2a 61 44 61 74 61 3b 0a 20 20 20 20 20 20 69 66  *aData;.      if
21060 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 3d 3d 53  ( p->openMode==S
21070 48 45 4c 4c 5f 4f 50 45 4e 5f 44 45 53 45 52 49  HELL_OPEN_DESERI
21080 41 4c 49 5a 45 20 29 7b 0a 20 20 20 20 20 20 20  ALIZE ){.       
21090 20 61 44 61 74 61 20 3d 20 28 75 6e 73 69 67 6e   aData = (unsign
210a0 65 64 20 63 68 61 72 2a 29 72 65 61 64 46 69 6c  ed char*)readFil
210b0 65 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65  e(p->zDbFilename
210c0 2c 20 26 6e 44 61 74 61 29 3b 0a 20 20 20 20 20  , &nData);.     
210d0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
210e0 61 44 61 74 61 20 3d 20 72 65 61 64 48 65 78 44  aData = readHexD
210f0 62 28 70 2c 20 26 6e 44 61 74 61 29 3b 0a 20 20  b(p, &nData);.  
21100 20 20 20 20 20 20 69 66 28 20 61 44 61 74 61 3d        if( aData=
21110 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
21120 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
21130 72 72 2c 20 22 45 72 72 6f 72 20 69 6e 20 68 65  rr, "Error in he
21140 78 64 62 20 69 6e 70 75 74 5c 6e 22 29 3b 0a 20  xdb input\n");. 
21150 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b           return;
21160 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
21170 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   }.      rc = sq
21180 6c 69 74 65 33 5f 64 65 73 65 72 69 61 6c 69 7a  lite3_deserializ
21190 65 28 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22 2c  e(p->db, "main",
211a0 20 61 44 61 74 61 2c 20 6e 44 61 74 61 2c 20 6e   aData, nData, n
211b0 44 61 74 61 2c 0a 20 20 20 20 20 20 20 20 20 20  Data,.          
211c0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
211d0 44 45 53 45 52 49 41 4c 49 5a 45 5f 52 45 53 49  DESERIALIZE_RESI
211e0 5a 45 41 42 4c 45 20 7c 0a 20 20 20 20 20 20 20  ZEABLE |.       
211f0 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
21200 54 45 5f 44 45 53 45 52 49 41 4c 49 5a 45 5f 46  TE_DESERIALIZE_F
21210 52 45 45 4f 4e 43 4c 4f 53 45 29 3b 0a 20 20 20  REEONCLOSE);.   
21220 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
21230 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
21240 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
21250 20 73 71 6c 69 74 65 33 5f 64 65 73 65 72 69 61   sqlite3_deseria
21260 6c 69 7a 65 28 29 20 72 65 74 75 72 6e 73 20 25  lize() returns %
21270 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20 20  d\n", rc);.     
21280 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
21290 73 7a 4d 61 78 3e 30 20 29 7b 0a 20 20 20 20 20  szMax>0 ){.     
212a0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f     sqlite3_file_
212b0 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 2c 20 22  control(p->db, "
212c0 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f 46 43  main", SQLITE_FC
212d0 4e 54 4c 5f 53 49 5a 45 5f 4c 49 4d 49 54 2c 20  NTL_SIZE_LIMIT, 
212e0 26 70 2d 3e 73 7a 4d 61 78 29 3b 0a 20 20 20 20  &p->szMax);.    
212f0 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
21300 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  .  }.}../*.** At
21310 74 65 6d 70 74 20 74 6f 20 63 6c 6f 73 65 20 74  tempt to close t
21320 68 65 20 64 61 74 61 62 61 65 73 20 63 6f 6e 6e  he databaes conn
21330 65 63 74 69 6f 6e 2e 20 20 52 65 70 6f 72 74 20  ection.  Report 
21340 65 72 72 6f 72 73 2e 0a 2a 2f 0a 76 6f 69 64 20  errors..*/.void 
21350 63 6c 6f 73 65 5f 64 62 28 73 71 6c 69 74 65 33  close_db(sqlite3
21360 20 2a 64 62 29 7b 0a 20 20 69 6e 74 20 72 63 20   *db){.  int rc 
21370 3d 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28  = sqlite3_close(
21380 64 62 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  db);.  if( rc ){
21390 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
213a0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
213b0 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 29   sqlite3_close()
213c0 20 72 65 74 75 72 6e 73 20 25 64 3a 20 25 73 5c   returns %d: %s\
213d0 6e 22 2c 0a 20 20 20 20 20 20 20 20 72 63 2c 20  n",.        rc, 
213e0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
213f0 62 29 29 3b 0a 20 20 7d 20 0a 7d 0a 0a 23 69 66  b));.  } .}..#if
21400 20 48 41 56 45 5f 52 45 41 44 4c 49 4e 45 20 7c   HAVE_READLINE |
21410 7c 20 48 41 56 45 5f 45 44 49 54 4c 49 4e 45 0a  | HAVE_EDITLINE.
21420 2f 2a 0a 2a 2a 20 52 65 61 64 6c 69 6e 65 20 63  /*.** Readline c
21430 6f 6d 70 6c 65 74 69 6f 6e 20 63 61 6c 6c 62 61  ompletion callba
21440 63 6b 73 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  cks.*/.static ch
21450 61 72 20 2a 72 65 61 64 6c 69 6e 65 5f 63 6f 6d  ar *readline_com
21460 70 6c 65 74 69 6f 6e 5f 67 65 6e 65 72 61 74 6f  pletion_generato
21470 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 74 65  r(const char *te
21480 78 74 2c 20 69 6e 74 20 73 74 61 74 65 29 7b 0a  xt, int state){.
21490 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33    static sqlite3
214a0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
214b0 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a  ;.  char *zRet;.
214c0 20 20 69 66 28 20 73 74 61 74 65 3d 3d 30 20 29    if( state==0 )
214d0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c  {.    char *zSql
214e0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
214f0 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
21500 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
21510 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43  3_mprintf("SELEC
21520 54 20 44 49 53 54 49 4e 43 54 20 63 61 6e 64 69  T DISTINCT candi
21530 64 61 74 65 20 43 4f 4c 4c 41 54 45 20 6e 6f 63  date COLLATE noc
21540 61 73 65 22 0a 20 20 20 20 20 20 20 20 20 20 20  ase".           
21550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21560 22 20 20 46 52 4f 4d 20 63 6f 6d 70 6c 65 74 69  "  FROM completi
21570 6f 6e 28 25 51 29 20 4f 52 44 45 52 20 42 59 20  on(%Q) ORDER BY 
21580 31 22 2c 20 74 65 78 74 29 3b 0a 20 20 20 20 73  1", text);.    s
21590 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
215a0 32 28 67 6c 6f 62 61 6c 44 62 2c 20 7a 53 71 6c  2(globalDb, zSql
215b0 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
215c0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
215d0 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20 20  ee(zSql);.  }.  
215e0 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  if( sqlite3_step
215f0 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f  (pStmt)==SQLITE_
21600 52 4f 57 20 29 7b 0a 20 20 20 20 7a 52 65 74 20  ROW ){.    zRet 
21610 3d 20 73 74 72 64 75 70 28 28 63 6f 6e 73 74 20  = strdup((const 
21620 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
21630 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
21640 20 30 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   0));.  }else{. 
21650 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
21660 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
21670 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7a  pStmt = 0;.    z
21680 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  Ret = 0;.  }.  r
21690 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 73 74  eturn zRet;.}.st
216a0 61 74 69 63 20 63 68 61 72 20 2a 2a 72 65 61 64  atic char **read
216b0 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 28  line_completion(
216c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65 78  const char *zTex
216d0 74 2c 20 69 6e 74 20 69 53 74 61 72 74 2c 20 69  t, int iStart, i
216e0 6e 74 20 69 45 6e 64 29 7b 0a 20 20 72 6c 5f 61  nt iEnd){.  rl_a
216f0 74 74 65 6d 70 74 65 64 5f 63 6f 6d 70 6c 65 74  ttempted_complet
21700 69 6f 6e 5f 6f 76 65 72 20 3d 20 31 3b 0a 20 20  ion_over = 1;.  
21710 72 65 74 75 72 6e 20 72 6c 5f 63 6f 6d 70 6c 65  return rl_comple
21720 74 69 6f 6e 5f 6d 61 74 63 68 65 73 28 7a 54 65  tion_matches(zTe
21730 78 74 2c 20 72 65 61 64 6c 69 6e 65 5f 63 6f 6d  xt, readline_com
21740 70 6c 65 74 69 6f 6e 5f 67 65 6e 65 72 61 74 6f  pletion_generato
21750 72 29 3b 0a 7d 0a 0a 23 65 6c 69 66 20 48 41 56  r);.}..#elif HAV
21760 45 5f 4c 49 4e 45 4e 4f 49 53 45 0a 2f 2a 0a 2a  E_LINENOISE./*.*
21770 2a 20 4c 69 6e 65 6e 6f 69 73 65 20 63 6f 6d 70  * Linenoise comp
21780 6c 65 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 0a  letion callback.
21790 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6c  */.static void l
217a0 69 6e 65 6e 6f 69 73 65 5f 63 6f 6d 70 6c 65 74  inenoise_complet
217b0 69 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ion(const char *
217c0 7a 4c 69 6e 65 2c 20 6c 69 6e 65 6e 6f 69 73 65  zLine, linenoise
217d0 43 6f 6d 70 6c 65 74 69 6f 6e 73 20 2a 6c 63 29  Completions *lc)
217e0 7b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 20 3d 20  {.  int nLine = 
217f0 73 74 72 6c 65 6e 33 30 28 7a 4c 69 6e 65 29 3b  strlen30(zLine);
21800 0a 20 20 69 6e 74 20 69 2c 20 69 53 74 61 72 74  .  int i, iStart
21810 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  ;.  sqlite3_stmt
21820 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63   *pStmt = 0;.  c
21830 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61  har *zSql;.  cha
21840 72 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 0a 20  r zBuf[1000];.. 
21850 20 69 66 28 20 6e 4c 69 6e 65 3e 73 69 7a 65 6f   if( nLine>sizeo
21860 66 28 7a 42 75 66 29 2d 33 30 20 29 20 72 65 74  f(zBuf)-30 ) ret
21870 75 72 6e 3b 0a 20 20 69 66 28 20 7a 4c 69 6e 65  urn;.  if( zLine
21880 5b 30 5d 3d 3d 27 2e 27 20 7c 7c 20 7a 4c 69 6e  [0]=='.' || zLin
21890 65 5b 30 5d 3d 3d 27 23 27 29 20 72 65 74 75 72  e[0]=='#') retur
218a0 6e 3b 0a 20 20 66 6f 72 28 69 3d 6e 4c 69 6e 65  n;.  for(i=nLine
218b0 2d 31 3b 20 69 3e 3d 30 20 26 26 20 28 69 73 61  -1; i>=0 && (isa
218c0 6c 6e 75 6d 28 7a 4c 69 6e 65 5b 69 5d 29 20 7c  lnum(zLine[i]) |
218d0 7c 20 7a 4c 69 6e 65 5b 69 5d 3d 3d 27 5f 27 29  | zLine[i]=='_')
218e0 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69  ; i--){}.  if( i
218f0 3d 3d 6e 4c 69 6e 65 2d 31 20 29 20 72 65 74 75  ==nLine-1 ) retu
21900 72 6e 3b 0a 20 20 69 53 74 61 72 74 20 3d 20 69  rn;.  iStart = i
21910 2b 31 3b 0a 20 20 6d 65 6d 63 70 79 28 7a 42 75  +1;.  memcpy(zBu
21920 66 2c 20 7a 4c 69 6e 65 2c 20 69 53 74 61 72 74  f, zLine, iStart
21930 29 3b 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  );.  zSql = sqli
21940 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
21950 45 43 54 20 44 49 53 54 49 4e 43 54 20 63 61 6e  ECT DISTINCT can
21960 64 69 64 61 74 65 20 43 4f 4c 4c 41 54 45 20 6e  didate COLLATE n
21970 6f 63 61 73 65 22 0a 20 20 20 20 20 20 20 20 20  ocase".         
21980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21990 22 20 20 46 52 4f 4d 20 63 6f 6d 70 6c 65 74 69  "  FROM completi
219a0 6f 6e 28 25 51 2c 25 51 29 20 4f 52 44 45 52 20  on(%Q,%Q) ORDER 
219b0 42 59 20 31 22 2c 0a 20 20 20 20 20 20 20 20 20  BY 1",.         
219c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219d0 26 7a 4c 69 6e 65 5b 69 53 74 61 72 74 5d 2c 20  &zLine[iStart], 
219e0 7a 4c 69 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65  zLine);.  sqlite
219f0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 67 6c 6f  3_prepare_v2(glo
21a00 62 61 6c 44 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  balDb, zSql, -1,
21a10 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 73   &pStmt, 0);.  s
21a20 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
21a30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65  );.  sqlite3_exe
21a40 63 28 67 6c 6f 62 61 6c 44 62 2c 20 22 50 52 41  c(globalDb, "PRA
21a50 47 4d 41 20 70 61 67 65 5f 63 6f 75 6e 74 22 2c  GMA page_count",
21a60 20 30 2c 20 30 2c 20 30 29 3b 20 2f 2a 20 4c 6f   0, 0, 0); /* Lo
21a70 61 64 20 74 68 65 20 73 63 68 65 6d 61 20 2a 2f  ad the schema */
21a80 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65  .  while( sqlite
21a90 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53  3_step(pStmt)==S
21aa0 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
21ab0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
21ac0 6d 70 6c 65 74 69 6f 6e 20 3d 20 28 63 6f 6e 73  mpletion = (cons
21ad0 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
21ae0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
21af0 74 2c 20 30 29 3b 0a 20 20 20 20 69 6e 74 20 6e  t, 0);.    int n
21b00 43 6f 6d 70 6c 65 74 69 6f 6e 20 3d 20 73 71 6c  Completion = sql
21b10 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
21b20 73 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  s(pStmt, 0);.   
21b30 20 69 66 28 20 69 53 74 61 72 74 2b 6e 43 6f 6d   if( iStart+nCom
21b40 70 6c 65 74 69 6f 6e 20 3c 20 73 69 7a 65 6f 66  pletion < sizeof
21b50 28 7a 42 75 66 29 2d 31 20 29 7b 0a 20 20 20 20  (zBuf)-1 ){.    
21b60 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2b 69 53    memcpy(zBuf+iS
21b70 74 61 72 74 2c 20 7a 43 6f 6d 70 6c 65 74 69 6f  tart, zCompletio
21b80 6e 2c 20 6e 43 6f 6d 70 6c 65 74 69 6f 6e 2b 31  n, nCompletion+1
21b90 29 3b 0a 20 20 20 20 20 20 6c 69 6e 65 6e 6f 69  );.      linenoi
21ba0 73 65 41 64 64 43 6f 6d 70 6c 65 74 69 6f 6e 28  seAddCompletion(
21bb0 6c 63 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 7d  lc, zBuf);.    }
21bc0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
21bd0 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
21be0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
21bf0 44 6f 20 43 2d 6c 61 6e 67 75 61 67 65 20 73 74  Do C-language st
21c00 79 6c 65 20 64 65 71 75 6f 74 69 6e 67 2e 0a 2a  yle dequoting..*
21c10 2a 0a 2a 2a 20 20 20 20 5c 61 20 20 20 20 2d 3e  *.**    \a    ->
21c20 20 61 6c 61 72 6d 0a 2a 2a 20 20 20 20 5c 62 20   alarm.**    \b 
21c30 20 20 20 2d 3e 20 62 61 63 6b 73 70 61 63 65 0a     -> backspace.
21c40 2a 2a 20 20 20 20 5c 74 20 20 20 20 2d 3e 20 74  **    \t    -> t
21c50 61 62 0a 2a 2a 20 20 20 20 5c 6e 20 20 20 20 2d  ab.**    \n    -
21c60 3e 20 6e 65 77 6c 69 6e 65 0a 2a 2a 20 20 20 20  > newline.**    
21c70 5c 76 20 20 20 20 2d 3e 20 76 65 72 74 69 63 61  \v    -> vertica
21c80 6c 20 74 61 62 0a 2a 2a 20 20 20 20 5c 66 20 20  l tab.**    \f  
21c90 20 20 2d 3e 20 66 6f 72 6d 20 66 65 65 64 0a 2a    -> form feed.*
21ca0 2a 20 20 20 20 5c 72 20 20 20 20 2d 3e 20 63 61  *    \r    -> ca
21cb0 72 72 69 61 67 65 20 72 65 74 75 72 6e 0a 2a 2a  rriage return.**
21cc0 20 20 20 20 5c 73 20 20 20 20 2d 3e 20 73 70 61      \s    -> spa
21cd0 63 65 0a 2a 2a 20 20 20 20 5c 22 20 20 20 20 2d  ce.**    \"    -
21ce0 3e 20 22 0a 2a 2a 20 20 20 20 5c 27 20 20 20 20  > ".**    \'    
21cf0 2d 3e 20 27 0a 2a 2a 20 20 20 20 5c 5c 20 20 20  -> '.**    \\   
21d00 20 2d 3e 20 62 61 63 6b 73 6c 61 73 68 0a 2a 2a   -> backslash.**
21d10 20 20 20 20 5c 4e 4e 4e 20 20 2d 3e 20 61 73 63      \NNN  -> asc
21d20 69 69 20 63 68 61 72 61 63 74 65 72 20 4e 4e 4e  ii character NNN
21d30 20 69 6e 20 6f 63 74 61 6c 0a 2a 2f 0a 73 74 61   in octal.*/.sta
21d40 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65  tic void resolve
21d50 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 63 68 61  _backslashes(cha
21d60 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 2c 20  r *z){.  int i, 
21d70 6a 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 77  j;.  char c;.  w
21d80 68 69 6c 65 28 20 2a 7a 20 26 26 20 2a 7a 21 3d  hile( *z && *z!=
21d90 27 5c 5c 27 20 29 20 7a 2b 2b 3b 0a 20 20 66 6f  '\\' ) z++;.  fo
21da0 72 28 69 3d 6a 3d 30 3b 20 28 63 20 3d 20 7a 5b  r(i=j=0; (c = z[
21db0 69 5d 29 21 3d 30 3b 20 69 2b 2b 2c 20 6a 2b 2b  i])!=0; i++, j++
21dc0 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27 5c  ){.    if( c=='\
21dd0 5c 27 20 26 26 20 7a 5b 69 2b 31 5d 21 3d 30 20  \' && z[i+1]!=0 
21de0 29 7b 0a 20 20 20 20 20 20 63 20 3d 20 7a 5b 2b  ){.      c = z[+
21df0 2b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 63  +i];.      if( c
21e00 3d 3d 27 61 27 20 29 7b 0a 20 20 20 20 20 20 20  =='a' ){.       
21e10 20 63 20 3d 20 27 5c 61 27 3b 0a 20 20 20 20 20   c = '\a';.     
21e20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 62   }else if( c=='b
21e30 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
21e40 20 27 5c 62 27 3b 0a 20 20 20 20 20 20 7d 65 6c   '\b';.      }el
21e50 73 65 20 69 66 28 20 63 3d 3d 27 74 27 20 29 7b  se if( c=='t' ){
21e60 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 74  .        c = '\t
21e70 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
21e80 66 28 20 63 3d 3d 27 6e 27 20 29 7b 0a 20 20 20  f( c=='n' ){.   
21e90 20 20 20 20 20 63 20 3d 20 27 5c 6e 27 3b 0a 20       c = '\n';. 
21ea0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
21eb0 3d 3d 27 76 27 20 29 7b 0a 20 20 20 20 20 20 20  =='v' ){.       
21ec0 20 63 20 3d 20 27 5c 76 27 3b 0a 20 20 20 20 20   c = '\v';.     
21ed0 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 66   }else if( c=='f
21ee0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
21ef0 20 27 5c 66 27 3b 0a 20 20 20 20 20 20 7d 65 6c   '\f';.      }el
21f00 73 65 20 69 66 28 20 63 3d 3d 27 72 27 20 29 7b  se if( c=='r' ){
21f10 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 72  .        c = '\r
21f20 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
21f30 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20  f( c=='"' ){.   
21f40 20 20 20 20 20 63 20 3d 20 27 22 27 3b 0a 20 20       c = '"';.  
21f50 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
21f60 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20  ='\'' ){.       
21f70 20 63 20 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20   c = '\'';.     
21f80 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c   }else if( c=='\
21f90 5c 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  \' ){.        c 
21fa0 3d 20 27 5c 5c 27 3b 0a 20 20 20 20 20 20 7d 65  = '\\';.      }e
21fb0 6c 73 65 20 69 66 28 20 63 3e 3d 27 30 27 20 26  lse if( c>='0' &
21fc0 26 20 63 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20  & c<='7' ){.    
21fd0 20 20 20 20 63 20 2d 3d 20 27 30 27 3b 0a 20 20      c -= '0';.  
21fe0 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d        if( z[i+1]
21ff0 3e 3d 27 30 27 20 26 26 20 7a 5b 69 2b 31 5d 3c  >='0' && z[i+1]<
22000 3d 27 37 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='7' ){.        
22010 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    i++;.         
22020 20 63 20 3d 20 28 63 3c 3c 33 29 20 2b 20 7a 5b   c = (c<<3) + z[
22030 69 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20  i] - '0';.      
22040 20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3e 3d      if( z[i+1]>=
22050 27 30 27 20 26 26 20 7a 5b 69 2b 31 5d 3c 3d 27  '0' && z[i+1]<='
22060 37 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  7' ){.          
22070 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20    i++;.         
22080 20 20 20 63 20 3d 20 28 63 3c 3c 33 29 20 2b 20     c = (c<<3) + 
22090 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20  z[i] - '0';.    
220a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
220b0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
220c0 20 20 20 20 7a 5b 6a 5d 20 3d 20 63 3b 0a 20 20      z[j] = c;.  
220d0 7d 0a 20 20 69 66 28 20 6a 3c 69 20 29 20 7a 5b  }.  if( j<i ) z[
220e0 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  j] = 0;.}../*.**
220f0 20 49 6e 74 65 72 70 72 65 74 20 7a 41 72 67 20   Interpret zArg 
22100 61 73 20 65 69 74 68 65 72 20 61 6e 20 69 6e 74  as either an int
22110 65 67 65 72 20 6f 72 20 61 20 62 6f 6f 6c 65 61  eger or a boolea
22120 6e 20 76 61 6c 75 65 2e 20 20 52 65 74 75 72 6e  n value.  Return
22130 20 31 20 6f 72 20 30 0a 2a 2a 20 66 6f 72 20 54   1 or 0.** for T
22140 52 55 45 20 61 6e 64 20 46 41 4c 53 45 2e 20 20  RUE and FALSE.  
22150 52 65 74 75 72 6e 20 74 68 65 20 69 6e 74 65 67  Return the integ
22160 65 72 20 76 61 6c 75 65 20 69 66 20 61 70 70 72  er value if appr
22170 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  opriate..*/.stat
22180 69 63 20 69 6e 74 20 62 6f 6f 6c 65 61 6e 56 61  ic int booleanVa
22190 6c 75 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  lue(const char *
221a0 7a 41 72 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  zArg){.  int i;.
221b0 20 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27    if( zArg[0]=='
221c0 30 27 20 26 26 20 7a 41 72 67 5b 31 5d 3d 3d 27  0' && zArg[1]=='
221d0 78 27 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  x' ){.    for(i=
221e0 32 3b 20 68 65 78 44 69 67 69 74 56 61 6c 75 65  2; hexDigitValue
221f0 28 7a 41 72 67 5b 69 5d 29 3e 3d 30 3b 20 69 2b  (zArg[i])>=0; i+
22200 2b 29 7b 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  +){}.  }else{.  
22210 20 20 66 6f 72 28 69 3d 30 3b 20 7a 41 72 67 5b    for(i=0; zArg[
22220 69 5d 3e 3d 27 30 27 20 26 26 20 7a 41 72 67 5b  i]>='0' && zArg[
22230 69 5d 3c 3d 27 39 27 3b 20 69 2b 2b 29 7b 7d 0a  i]<='9'; i++){}.
22240 20 20 7d 0a 20 20 69 66 28 20 69 3e 30 20 26 26    }.  if( i>0 &&
22250 20 7a 41 72 67 5b 69 5d 3d 3d 30 20 29 20 72 65   zArg[i]==0 ) re
22260 74 75 72 6e 20 28 69 6e 74 29 28 69 6e 74 65 67  turn (int)(integ
22270 65 72 56 61 6c 75 65 28 7a 41 72 67 29 20 26 20  erValue(zArg) & 
22280 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 69  0xffffffff);.  i
22290 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
222a0 6d 70 28 7a 41 72 67 2c 20 22 6f 6e 22 29 3d 3d  mp(zArg, "on")==
222b0 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72  0 || sqlite3_str
222c0 69 63 6d 70 28 7a 41 72 67 2c 22 79 65 73 22 29  icmp(zArg,"yes")
222d0 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
222e0 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 1;.  }.  if( s
222f0 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
22300 41 72 67 2c 20 22 6f 66 66 22 29 3d 3d 30 20 7c  Arg, "off")==0 |
22310 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  | sqlite3_stricm
22320 70 28 7a 41 72 67 2c 22 6e 6f 22 29 3d 3d 30 20  p(zArg,"no")==0 
22330 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
22340 0a 20 20 7d 0a 20 20 75 74 66 38 5f 70 72 69 6e  .  }.  utf8_prin
22350 74 66 28 73 74 64 65 72 72 2c 20 22 45 52 52 4f  tf(stderr, "ERRO
22360 52 3a 20 4e 6f 74 20 61 20 62 6f 6f 6c 65 61 6e  R: Not a boolean
22370 20 76 61 6c 75 65 3a 20 5c 22 25 73 5c 22 2e 20   value: \"%s\". 
22380 41 73 73 75 6d 69 6e 67 20 5c 22 6e 6f 5c 22 2e  Assuming \"no\".
22390 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 7a  \n",.          z
223a0 41 72 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  Arg);.  return 0
223b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f  ;.}../*.** Set o
223c0 72 20 63 6c 65 61 72 20 61 20 73 68 65 6c 6c 20  r clear a shell 
223d0 66 6c 61 67 20 61 63 63 6f 72 64 69 6e 67 20 74  flag according t
223e0 6f 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  o a boolean valu
223f0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
22400 64 20 73 65 74 4f 72 43 6c 65 61 72 46 6c 61 67  d setOrClearFlag
22410 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20  (ShellState *p, 
22420 75 6e 73 69 67 6e 65 64 20 6d 46 6c 61 67 2c 20  unsigned mFlag, 
22430 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
22440 29 7b 0a 20 20 69 66 28 20 62 6f 6f 6c 65 61 6e  ){.  if( boolean
22450 56 61 6c 75 65 28 7a 41 72 67 29 20 29 7b 0a 20  Value(zArg) ){. 
22460 20 20 20 53 68 65 6c 6c 53 65 74 46 6c 61 67 28     ShellSetFlag(
22470 70 2c 20 6d 46 6c 61 67 29 3b 0a 20 20 7d 65 6c  p, mFlag);.  }el
22480 73 65 7b 0a 20 20 20 20 53 68 65 6c 6c 43 6c 65  se{.    ShellCle
22490 61 72 46 6c 61 67 28 70 2c 20 6d 46 6c 61 67 29  arFlag(p, mFlag)
224a0 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
224b0 6c 6f 73 65 20 61 6e 20 6f 75 74 70 75 74 20 66  lose an output f
224c0 69 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 69 74  ile, assuming it
224d0 20 69 73 20 6e 6f 74 20 73 74 64 65 72 72 20 6f   is not stderr o
224e0 72 20 73 74 64 6f 75 74 0a 2a 2f 0a 73 74 61 74  r stdout.*/.stat
224f0 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 66  ic void output_f
22500 69 6c 65 5f 63 6c 6f 73 65 28 46 49 4c 45 20 2a  ile_close(FILE *
22510 66 29 7b 0a 20 20 69 66 28 20 66 20 26 26 20 66  f){.  if( f && f
22520 21 3d 73 74 64 6f 75 74 20 26 26 20 66 21 3d 73  !=stdout && f!=s
22530 74 64 65 72 72 20 29 20 66 63 6c 6f 73 65 28 66  tderr ) fclose(f
22540 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20  );.}../*.** Try 
22550 74 6f 20 6f 70 65 6e 20 61 6e 20 6f 75 74 70 75  to open an outpu
22560 74 20 66 69 6c 65 2e 20 20 20 54 68 65 20 6e 61  t file.   The na
22570 6d 65 73 20 22 73 74 64 6f 75 74 22 20 61 6e 64  mes "stdout" and
22580 20 22 73 74 64 65 72 72 22 20 61 72 65 0a 2a 2a   "stderr" are.**
22590 20 72 65 63 6f 67 6e 69 7a 65 64 20 61 6e 64 20   recognized and 
225a0 64 6f 20 74 68 65 20 72 69 67 68 74 20 74 68 69  do the right thi
225b0 6e 67 2e 20 20 4e 55 4c 4c 20 69 73 20 72 65 74  ng.  NULL is ret
225c0 75 72 6e 65 64 20 69 66 20 74 68 65 20 6f 75 74  urned if the out
225d0 70 75 74 0a 2a 2a 20 66 69 6c 65 6e 61 6d 65 20  put.** filename 
225e0 69 73 20 22 6f 66 66 22 2e 0a 2a 2f 0a 73 74 61  is "off"..*/.sta
225f0 74 69 63 20 46 49 4c 45 20 2a 6f 75 74 70 75 74  tic FILE *output
22600 5f 66 69 6c 65 5f 6f 70 65 6e 28 63 6f 6e 73 74  _file_open(const
22610 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e   char *zFile, in
22620 74 20 62 54 65 78 74 4d 6f 64 65 29 7b 0a 20 20  t bTextMode){.  
22630 46 49 4c 45 20 2a 66 3b 0a 20 20 69 66 28 20 73  FILE *f;.  if( s
22640 74 72 63 6d 70 28 7a 46 69 6c 65 2c 22 73 74 64  trcmp(zFile,"std
22650 6f 75 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  out")==0 ){.    
22660 66 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7d 65  f = stdout;.  }e
22670 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
22680 46 69 6c 65 2c 20 22 73 74 64 65 72 72 22 29 3d  File, "stderr")=
22690 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d 20 73 74  =0 ){.    f = st
226a0 64 65 72 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66  derr;.  }else if
226b0 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20  ( strcmp(zFile, 
226c0 22 6f 66 66 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "off")==0 ){.   
226d0 20 66 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b   f = 0;.  }else{
226e0 0a 20 20 20 20 66 20 3d 20 66 6f 70 65 6e 28 7a  .    f = fopen(z
226f0 46 69 6c 65 2c 20 62 54 65 78 74 4d 6f 64 65 20  File, bTextMode 
22700 3f 20 22 77 22 20 3a 20 22 77 62 22 29 3b 0a 20  ? "w" : "wb");. 
22710 20 20 20 69 66 28 20 66 3d 3d 30 20 29 7b 0a 20     if( f==0 ){. 
22720 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
22730 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
22740 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25   cannot open \"%
22750 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a  s\"\n", zFile);.
22760 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
22770 72 6e 20 66 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  rn f;.}..#ifndef
22780 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41   SQLITE_OMIT_TRA
22790 43 45 0a 2f 2a 0a 2a 2a 20 41 20 72 6f 75 74 69  CE./*.** A routi
227a0 6e 65 20 66 6f 72 20 68 61 6e 64 6c 69 6e 67 20  ne for handling 
227b0 6f 75 74 70 75 74 20 66 72 6f 6d 20 73 71 6c 69  output from sqli
227c0 74 65 33 5f 74 72 61 63 65 28 29 2e 0a 2a 2f 0a  te3_trace()..*/.
227d0 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 5f 74  static int sql_t
227e0 72 61 63 65 5f 63 61 6c 6c 62 61 63 6b 28 0a 20  race_callback(. 
227f0 20 75 6e 73 69 67 6e 65 64 20 6d 54 79 70 65 2c   unsigned mType,
22800 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
22810 74 72 61 63 65 20 74 79 70 65 20 2a 2f 0a 20 20  trace type */.  
22820 76 6f 69 64 20 2a 70 41 72 67 2c 20 20 20 20 20  void *pArg,     
22830 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53          /* The S
22840 68 65 6c 6c 53 74 61 74 65 20 70 6f 69 6e 74 65  hellState pointe
22850 72 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 50 2c  r */.  void *pP,
22860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22870 2a 20 55 73 75 61 6c 6c 79 20 61 20 70 6f 69 6e  * Usually a poin
22880 74 65 72 20 74 6f 20 73 71 6c 69 74 65 5f 73 74  ter to sqlite_st
22890 6d 74 20 2a 2f 0a 20 20 76 6f 69 64 20 2a 70 58  mt */.  void *pX
228a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
228b0 2f 2a 20 41 75 78 69 6c 69 61 72 79 20 6f 75 74  /* Auxiliary out
228c0 70 75 74 20 2a 2f 0a 29 7b 0a 20 20 53 68 65 6c  put */.){.  Shel
228d0 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65  lState *p = (She
228e0 6c 6c 53 74 61 74 65 2a 29 70 41 72 67 3b 0a 20  llState*)pArg;. 
228f0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
22900 53 74 6d 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68  Stmt;.  const ch
22910 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20  ar *zSql;.  int 
22920 6e 53 71 6c 3b 0a 20 20 69 66 28 20 70 2d 3e 74  nSql;.  if( p->t
22930 72 61 63 65 4f 75 74 3d 3d 30 20 29 20 72 65 74  raceOut==0 ) ret
22940 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 6d 54 79  urn 0;.  if( mTy
22950 70 65 3d 3d 53 51 4c 49 54 45 5f 54 52 41 43 45  pe==SQLITE_TRACE
22960 5f 43 4c 4f 53 45 20 29 7b 0a 20 20 20 20 75 74  _CLOSE ){.    ut
22970 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 74 72 61  f8_printf(p->tra
22980 63 65 4f 75 74 2c 20 22 2d 2d 20 63 6c 6f 73 69  ceOut, "-- closi
22990 6e 67 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  ng database conn
229a0 65 63 74 69 6f 6e 5c 6e 22 29 3b 0a 20 20 20 20  ection\n");.    
229b0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
229c0 69 66 28 20 6d 54 79 70 65 21 3d 53 51 4c 49 54  if( mType!=SQLIT
229d0 45 5f 54 52 41 43 45 5f 52 4f 57 20 26 26 20 28  E_TRACE_ROW && (
229e0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 58 29  (const char*)pX)
229f0 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20  [0]=='-' ){.    
22a00 7a 53 71 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68  zSql = (const ch
22a10 61 72 2a 29 70 58 3b 0a 20 20 7d 65 6c 73 65 7b  ar*)pX;.  }else{
22a20 0a 20 20 20 20 70 53 74 6d 74 20 3d 20 28 73 71  .    pStmt = (sq
22a30 6c 69 74 65 33 5f 73 74 6d 74 2a 29 70 50 3b 0a  lite3_stmt*)pP;.
22a40 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 65      switch( p->e
22a50 54 72 61 63 65 54 79 70 65 20 29 7b 0a 20 20 20  TraceType ){.   
22a60 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 54 52     case SHELL_TR
22a70 41 43 45 5f 45 58 50 41 4e 44 45 44 3a 20 7b 0a  ACE_EXPANDED: {.
22a80 20 20 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73          zSql = s
22a90 71 6c 69 74 65 33 5f 65 78 70 61 6e 64 65 64 5f  qlite3_expanded_
22aa0 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  sql(pStmt);.    
22ab0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
22ac0 20 7d 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45   }.#ifdef SQLITE
22ad0 5f 45 4e 41 42 4c 45 5f 4e 4f 52 4d 41 4c 49 5a  _ENABLE_NORMALIZ
22ae0 45 0a 20 20 20 20 20 20 63 61 73 65 20 53 48 45  E.      case SHE
22af0 4c 4c 5f 54 52 41 43 45 5f 4e 4f 52 4d 41 4c 49  LL_TRACE_NORMALI
22b00 5a 45 44 3a 20 7b 0a 20 20 20 20 20 20 20 20 7a  ZED: {.        z
22b10 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6e 6f  Sql = sqlite3_no
22b20 72 6d 61 6c 69 7a 65 64 5f 73 71 6c 28 70 53 74  rmalized_sql(pSt
22b30 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  mt);.        bre
22b40 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64  ak;.      }.#end
22b50 69 66 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74  if.      default
22b60 3a 20 7b 0a 20 20 20 20 20 20 20 20 7a 53 71 6c  : {.        zSql
22b70 20 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70   = sqlite3_sql(p
22b80 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 62  Stmt);.        b
22b90 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
22ba0 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 7a 53    }.  }.  if( zS
22bb0 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ql==0 ) return 0
22bc0 3b 0a 20 20 6e 53 71 6c 20 3d 20 73 74 72 6c 65  ;.  nSql = strle
22bd0 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 77 68 69  n30(zSql);.  whi
22be0 6c 65 28 20 6e 53 71 6c 3e 30 20 26 26 20 7a 53  le( nSql>0 && zS
22bf0 71 6c 5b 6e 53 71 6c 2d 31 5d 3d 3d 27 3b 27 20  ql[nSql-1]==';' 
22c00 29 7b 20 6e 53 71 6c 2d 2d 3b 20 7d 0a 20 20 73  ){ nSql--; }.  s
22c10 77 69 74 63 68 28 20 6d 54 79 70 65 20 29 7b 0a  witch( mType ){.
22c20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
22c30 54 52 41 43 45 5f 52 4f 57 3a 0a 20 20 20 20 63  TRACE_ROW:.    c
22c40 61 73 65 20 53 51 4c 49 54 45 5f 54 52 41 43 45  ase SQLITE_TRACE
22c50 5f 53 54 4d 54 3a 20 7b 0a 20 20 20 20 20 20 75  _STMT: {.      u
22c60 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 74 72  tf8_printf(p->tr
22c70 61 63 65 4f 75 74 2c 20 22 25 2e 2a 73 3b 5c 6e  aceOut, "%.*s;\n
22c80 22 2c 20 6e 53 71 6c 2c 20 7a 53 71 6c 29 3b 0a  ", nSql, zSql);.
22c90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
22ca0 20 7d 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49   }.    case SQLI
22cb0 54 45 5f 54 52 41 43 45 5f 50 52 4f 46 49 4c 45  TE_TRACE_PROFILE
22cc0 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
22cd0 33 5f 69 6e 74 36 34 20 6e 4e 61 6e 6f 73 65 63  3_int64 nNanosec
22ce0 20 3d 20 2a 28 73 71 6c 69 74 65 33 5f 69 6e 74   = *(sqlite3_int
22cf0 36 34 2a 29 70 58 3b 0a 20 20 20 20 20 20 75 74  64*)pX;.      ut
22d00 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 74 72 61  f8_printf(p->tra
22d10 63 65 4f 75 74 2c 20 22 25 2e 2a 73 3b 20 2d 2d  ceOut, "%.*s; --
22d20 20 25 6c 6c 64 20 6e 73 5c 6e 22 2c 20 6e 53 71   %lld ns\n", nSq
22d30 6c 2c 20 7a 53 71 6c 2c 20 6e 4e 61 6e 6f 73 65  l, zSql, nNanose
22d40 63 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  c);.      break;
22d50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
22d60 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
22d70 0a 2f 2a 0a 2a 2a 20 41 20 6e 6f 2d 6f 70 20 72  ./*.** A no-op r
22d80 6f 75 74 69 6e 65 20 74 68 61 74 20 72 75 6e 73  outine that runs
22d90 20 77 69 74 68 20 74 68 65 20 22 2e 62 72 65 61   with the ".brea
22da0 6b 70 6f 69 6e 74 22 20 64 6f 63 2d 63 6f 6d 6d  kpoint" doc-comm
22db0 61 6e 64 2e 20 20 54 68 69 73 20 69 73 0a 2a 2a  and.  This is.**
22dc0 20 61 20 75 73 65 66 75 6c 20 73 70 6f 74 20 74   a useful spot t
22dd0 6f 20 73 65 74 20 61 20 64 65 62 75 67 67 65 72  o set a debugger
22de0 20 62 72 65 61 6b 70 6f 69 6e 74 2e 0a 2a 2f 0a   breakpoint..*/.
22df0 73 74 61 74 69 63 20 76 6f 69 64 20 74 65 73 74  static void test
22e00 5f 62 72 65 61 6b 70 6f 69 6e 74 28 76 6f 69 64  _breakpoint(void
22e10 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e 74 20  ){.  static int 
22e20 6e 43 61 6c 6c 20 3d 20 30 3b 0a 20 20 6e 43 61  nCall = 0;.  nCa
22e30 6c 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  ll++;.}../*.** A
22e40 6e 20 6f 62 6a 65 63 74 20 75 73 65 64 20 74 6f  n object used to
22e50 20 72 65 61 64 20 61 20 43 53 56 20 61 6e 64 20   read a CSV and 
22e60 6f 74 68 65 72 20 66 69 6c 65 73 20 66 6f 72 20  other files for 
22e70 69 6d 70 6f 72 74 2e 0a 2a 2f 0a 74 79 70 65 64  import..*/.typed
22e80 65 66 20 73 74 72 75 63 74 20 49 6d 70 6f 72 74  ef struct Import
22e90 43 74 78 20 49 6d 70 6f 72 74 43 74 78 3b 0a 73  Ctx ImportCtx;.s
22ea0 74 72 75 63 74 20 49 6d 70 6f 72 74 43 74 78 20  truct ImportCtx 
22eb0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
22ec0 7a 46 69 6c 65 3b 20 20 2f 2a 20 4e 61 6d 65 20  zFile;  /* Name 
22ed0 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66 69 6c  of the input fil
22ee0 65 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 69 6e 3b  e */.  FILE *in;
22ef0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
22f00 61 64 20 74 68 65 20 43 53 56 20 74 65 78 74 20  ad the CSV text 
22f10 66 72 6f 6d 20 74 68 69 73 20 69 6e 70 75 74 20  from this input 
22f20 73 74 72 65 61 6d 20 2a 2f 0a 20 20 63 68 61 72  stream */.  char
22f30 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20   *z;            
22f40 2f 2a 20 41 63 63 75 6d 75 6c 61 74 65 64 20 74  /* Accumulated t
22f50 65 78 74 20 66 6f 72 20 61 20 66 69 65 6c 64 20  ext for a field 
22f60 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20 20 20  */.  int n;     
22f70 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
22f80 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 7a  er of bytes in z
22f90 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63   */.  int nAlloc
22fa0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61  ;         /* Spa
22fb0 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66 6f 72  ce allocated for
22fc0 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 6e 4c   z[] */.  int nL
22fd0 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  ine;          /*
22fe0 20 43 75 72 72 65 6e 74 20 6c 69 6e 65 20 6e 75   Current line nu
22ff0 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20 62 4e  mber */.  int bN
23000 6f 74 46 69 72 73 74 3b 20 20 20 20 20 20 2f 2a  otFirst;      /*
23010 20 54 72 75 65 20 69 66 20 6f 6e 65 20 6f 72 20   True if one or 
23020 6d 6f 72 65 20 62 79 74 65 73 20 61 6c 72 65 61  more bytes alrea
23030 64 79 20 72 65 61 64 20 2a 2f 0a 20 20 69 6e 74  dy read */.  int
23040 20 63 54 65 72 6d 3b 20 20 20 20 20 20 20 20 20   cTerm;         
23050 20 2f 2a 20 43 68 61 72 61 63 74 65 72 20 74 68   /* Character th
23060 61 74 20 74 65 72 6d 69 6e 61 74 65 64 20 74 68  at terminated th
23070 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 66 69  e most recent fi
23080 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 63 43 6f  eld */.  int cCo
23090 6c 53 65 70 3b 20 20 20 20 20 20 20 20 2f 2a 20  lSep;        /* 
230a0 54 68 65 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72  The column separ
230b0 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 2e 20  ator character. 
230c0 20 28 55 73 75 61 6c 6c 79 20 22 2c 22 29 20 2a   (Usually ",") *
230d0 2f 0a 20 20 69 6e 74 20 63 52 6f 77 53 65 70 3b  /.  int cRowSep;
230e0 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 72          /* The r
230f0 6f 77 20 73 65 70 61 72 61 74 6f 72 20 63 68 61  ow separator cha
23100 72 61 63 74 65 72 2e 20 20 28 55 73 75 61 6c 6c  racter.  (Usuall
23110 79 20 22 5c 6e 22 29 20 2a 2f 0a 7d 3b 0a 0a 2f  y "\n") */.};../
23120 2a 20 41 70 70 65 6e 64 20 61 20 73 69 6e 67 6c  * Append a singl
23130 65 20 62 79 74 65 20 74 6f 20 7a 5b 5d 20 2a 2f  e byte to z[] */
23140 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69 6d 70  .static void imp
23150 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28  ort_append_char(
23160 49 6d 70 6f 72 74 43 74 78 20 2a 70 2c 20 69 6e  ImportCtx *p, in
23170 74 20 63 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6e  t c){.  if( p->n
23180 2b 31 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b  +1>=p->nAlloc ){
23190 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 2b  .    p->nAlloc +
231a0 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 20 2b 20 31 30  = p->nAlloc + 10
231b0 30 3b 0a 20 20 20 20 70 2d 3e 7a 20 3d 20 73 71  0;.    p->z = sq
231c0 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28  lite3_realloc64(
231d0 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c 6f 63 29  p->z, p->nAlloc)
231e0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 3d 3d  ;.    if( p->z==
231f0 30 20 29 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66  0 ) shell_out_of
23200 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20 7d 0a 20  _memory();.  }. 
23210 20 70 2d 3e 7a 5b 70 2d 3e 6e 2b 2b 5d 20 3d 20   p->z[p->n++] = 
23220 28 63 68 61 72 29 63 3b 0a 7d 0a 0a 2f 2a 20 52  (char)c;.}../* R
23230 65 61 64 20 61 20 73 69 6e 67 6c 65 20 66 69 65  ead a single fie
23240 6c 64 20 6f 66 20 43 53 56 20 74 65 78 74 2e 20  ld of CSV text. 
23250 20 43 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68   Compatible with
23260 20 72 66 63 34 31 38 30 20 61 6e 64 20 65 78 74   rfc4180 and ext
23270 65 6e 64 65 64 0a 2a 2a 20 77 69 74 68 20 74 68  ended.** with th
23280 65 20 6f 70 74 69 6f 6e 20 6f 66 20 68 61 76 69  e option of havi
23290 6e 67 20 61 20 73 65 70 61 72 61 74 6f 72 20 6f  ng a separator o
232a0 74 68 65 72 20 74 68 61 6e 20 22 2c 22 2e 0a 2a  ther than ","..*
232b0 2a 0a 2a 2a 20 20 20 2b 20 20 49 6e 70 75 74 20  *.**   +  Input 
232c0 63 6f 6d 65 73 20 66 72 6f 6d 20 70 2d 3e 69 6e  comes from p->in
232d0 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65 20  ..**   +  Store 
232e0 72 65 73 75 6c 74 73 20 69 6e 20 70 2d 3e 7a 20  results in p->z 
232f0 6f 66 20 6c 65 6e 67 74 68 20 70 2d 3e 6e 2e 20  of length p->n. 
23300 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 70   Space to hold p
23310 2d 3e 7a 20 63 6f 6d 65 73 0a 2a 2a 20 20 20 20  ->z comes.**    
23320 20 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d    from sqlite3_m
23330 61 6c 6c 6f 63 36 34 28 29 2e 0a 2a 2a 20 20 20  alloc64()..**   
23340 2b 20 20 55 73 65 20 70 2d 3e 63 53 65 70 20 61  +  Use p->cSep a
23350 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 73 65 70  s the column sep
23360 61 72 61 74 6f 72 2e 20 20 54 68 65 20 64 65 66  arator.  The def
23370 61 75 6c 74 20 69 73 20 22 2c 22 2e 0a 2a 2a 20  ault is ","..** 
23380 20 20 2b 20 20 55 73 65 20 70 2d 3e 72 53 65 70    +  Use p->rSep
23390 20 61 73 20 74 68 65 20 72 6f 77 20 73 65 70 61   as the row sepa
233a0 72 61 74 6f 72 2e 20 20 54 68 65 20 64 65 66 61  rator.  The defa
233b0 75 6c 74 20 69 73 20 22 5c 6e 22 2e 0a 2a 2a 20  ult is "\n"..** 
233c0 20 20 2b 20 20 4b 65 65 70 20 74 72 61 63 6b 20    +  Keep track 
233d0 6f 66 20 74 68 65 20 6c 69 6e 65 20 6e 75 6d 62  of the line numb
233e0 65 72 20 69 6e 20 70 2d 3e 6e 4c 69 6e 65 2e 0a  er in p->nLine..
233f0 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65 20 74 68  **   +  Store th
23400 65 20 63 68 61 72 61 63 74 65 72 20 74 68 61 74  e character that
23410 20 74 65 72 6d 69 6e 61 74 65 73 20 74 68 65 20   terminates the 
23420 66 69 65 6c 64 20 69 6e 20 70 2d 3e 63 54 65 72  field in p->cTer
23430 6d 2e 20 20 53 74 6f 72 65 0a 2a 2a 20 20 20 20  m.  Store.**    
23440 20 20 45 4f 46 20 6f 6e 20 65 6e 64 2d 6f 66 2d    EOF on end-of-
23450 66 69 6c 65 2e 0a 2a 2a 20 20 20 2b 20 20 52 65  file..**   +  Re
23460 70 6f 72 74 20 73 79 6e 74 61 78 20 65 72 72 6f  port syntax erro
23470 72 73 20 6f 6e 20 73 74 64 65 72 72 0a 2a 2f 0a  rs on stderr.*/.
23480 73 74 61 74 69 63 20 63 68 61 72 20 2a 53 51 4c  static char *SQL
23490 49 54 45 5f 43 44 45 43 4c 20 63 73 76 5f 72 65  ITE_CDECL csv_re
234a0 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 28 49 6d 70  ad_one_field(Imp
234b0 6f 72 74 43 74 78 20 2a 70 29 7b 0a 20 20 69 6e  ortCtx *p){.  in
234c0 74 20 63 3b 0a 20 20 69 6e 74 20 63 53 65 70 20  t c;.  int cSep 
234d0 3d 20 70 2d 3e 63 43 6f 6c 53 65 70 3b 0a 20 20  = p->cColSep;.  
234e0 69 6e 74 20 72 53 65 70 20 3d 20 70 2d 3e 63 52  int rSep = p->cR
234f0 6f 77 53 65 70 3b 0a 20 20 70 2d 3e 6e 20 3d 20  owSep;.  p->n = 
23500 30 3b 0a 20 20 63 20 3d 20 66 67 65 74 63 28 70  0;.  c = fgetc(p
23510 2d 3e 69 6e 29 3b 0a 20 20 69 66 28 20 63 3d 3d  ->in);.  if( c==
23520 45 4f 46 20 7c 7c 20 73 65 65 6e 49 6e 74 65 72  EOF || seenInter
23530 72 75 70 74 20 29 7b 0a 20 20 20 20 70 2d 3e 63  rupt ){.    p->c
23540 54 65 72 6d 20 3d 20 45 4f 46 3b 0a 20 20 20 20  Term = EOF;.    
23550 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
23560 69 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20  if( c=='"' ){.  
23570 20 20 69 6e 74 20 70 63 2c 20 70 70 63 3b 0a 20    int pc, ppc;. 
23580 20 20 20 69 6e 74 20 73 74 61 72 74 4c 69 6e 65     int startLine
23590 20 3d 20 70 2d 3e 6e 4c 69 6e 65 3b 0a 20 20 20   = p->nLine;.   
235a0 20 69 6e 74 20 63 51 75 6f 74 65 20 3d 20 63 3b   int cQuote = c;
235b0 0a 20 20 20 20 70 63 20 3d 20 70 70 63 20 3d 20  .    pc = ppc = 
235c0 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20  0;.    while( 1 
235d0 29 7b 0a 20 20 20 20 20 20 63 20 3d 20 66 67 65  ){.      c = fge
235e0 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 20  tc(p->in);.     
235f0 20 69 66 28 20 63 3d 3d 72 53 65 70 20 29 20 70   if( c==rSep ) p
23600 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20  ->nLine++;.     
23610 20 69 66 28 20 63 3d 3d 63 51 75 6f 74 65 20 29   if( c==cQuote )
23620 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63  {.        if( pc
23630 3d 3d 63 51 75 6f 74 65 20 29 7b 0a 20 20 20 20  ==cQuote ){.    
23640 20 20 20 20 20 20 70 63 20 3d 20 30 3b 0a 20 20        pc = 0;.  
23650 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
23660 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
23670 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 63    }.      if( (c
23680 3d 3d 63 53 65 70 20 26 26 20 70 63 3d 3d 63 51  ==cSep && pc==cQ
23690 75 6f 74 65 29 0a 20 20 20 20 20 20 20 7c 7c 20  uote).       || 
236a0 28 63 3d 3d 72 53 65 70 20 26 26 20 70 63 3d 3d  (c==rSep && pc==
236b0 63 51 75 6f 74 65 29 0a 20 20 20 20 20 20 20 7c  cQuote).       |
236c0 7c 20 28 63 3d 3d 72 53 65 70 20 26 26 20 70 63  | (c==rSep && pc
236d0 3d 3d 27 5c 72 27 20 26 26 20 70 70 63 3d 3d 63  =='\r' && ppc==c
236e0 51 75 6f 74 65 29 0a 20 20 20 20 20 20 20 7c 7c  Quote).       ||
236f0 20 28 63 3d 3d 45 4f 46 20 26 26 20 70 63 3d 3d   (c==EOF && pc==
23700 63 51 75 6f 74 65 29 0a 20 20 20 20 20 20 29 7b  cQuote).      ){
23710 0a 20 20 20 20 20 20 20 20 64 6f 7b 20 70 2d 3e  .        do{ p->
23720 6e 2d 2d 3b 20 7d 77 68 69 6c 65 28 20 70 2d 3e  n--; }while( p->
23730 7a 5b 70 2d 3e 6e 5d 21 3d 63 51 75 6f 74 65 20  z[p->n]!=cQuote 
23740 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 54  );.        p->cT
23750 65 72 6d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20  erm = c;.       
23760 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
23770 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d 63 51        if( pc==cQ
23780 75 6f 74 65 20 26 26 20 63 21 3d 27 5c 72 27 20  uote && c!='\r' 
23790 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
237a0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
237b0 25 73 3a 25 64 3a 20 75 6e 65 73 63 61 70 65 64  %s:%d: unescaped
237c0 20 25 63 20 63 68 61 72 61 63 74 65 72 5c 6e 22   %c character\n"
237d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
237e0 20 20 70 2d 3e 7a 46 69 6c 65 2c 20 70 2d 3e 6e    p->zFile, p->n
237f0 4c 69 6e 65 2c 20 63 51 75 6f 74 65 29 3b 0a 20  Line, cQuote);. 
23800 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
23810 20 63 3d 3d 45 4f 46 20 29 7b 0a 20 20 20 20 20   c==EOF ){.     
23820 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
23830 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 75  tderr, "%s:%d: u
23840 6e 74 65 72 6d 69 6e 61 74 65 64 20 25 63 2d 71  nterminated %c-q
23850 75 6f 74 65 64 20 66 69 65 6c 64 5c 6e 22 2c 0a  uoted field\n",.
23860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23870 70 2d 3e 7a 46 69 6c 65 2c 20 73 74 61 72 74 4c  p->zFile, startL
23880 69 6e 65 2c 20 63 51 75 6f 74 65 29 3b 0a 20 20  ine, cQuote);.  
23890 20 20 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d        p->cTerm =
238a0 20 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   c;.        brea
238b0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
238c0 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63   import_append_c
238d0 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20  har(p, c);.     
238e0 20 70 70 63 20 3d 20 70 63 3b 0a 20 20 20 20 20   ppc = pc;.     
238f0 20 70 63 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20   pc = c;.    }. 
23900 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49   }else{.    /* I
23910 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69  f this is the fi
23920 72 73 74 20 66 69 65 6c 64 20 62 65 69 6e 67 20  rst field being 
23930 70 61 72 73 65 64 20 61 6e 64 20 69 74 20 62 65  parsed and it be
23940 67 69 6e 73 20 77 69 74 68 20 74 68 65 0a 20 20  gins with the.  
23950 20 20 2a 2a 20 55 54 46 2d 38 20 42 4f 4d 20 20    ** UTF-8 BOM  
23960 28 30 78 45 46 20 42 42 20 42 46 29 20 74 68 65  (0xEF BB BF) the
23970 6e 20 73 6b 69 70 20 74 68 65 20 42 4f 4d 20 2a  n skip the BOM *
23980 2f 0a 20 20 20 20 69 66 28 20 28 63 26 30 78 66  /.    if( (c&0xf
23990 66 29 3d 3d 30 78 65 66 20 26 26 20 70 2d 3e 62  f)==0xef && p->b
239a0 4e 6f 74 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20  NotFirst==0 ){. 
239b0 20 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65       import_appe
239c0 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20  nd_char(p, c);. 
239d0 20 20 20 20 20 63 20 3d 20 66 67 65 74 63 28 70       c = fgetc(p
239e0 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  ->in);.      if(
239f0 20 28 63 26 30 78 66 66 29 3d 3d 30 78 62 62 20   (c&0xff)==0xbb 
23a00 29 7b 0a 20 20 20 20 20 20 20 20 69 6d 70 6f 72  ){.        impor
23a10 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c  t_append_char(p,
23a20 20 63 29 3b 0a 20 20 20 20 20 20 20 20 63 20 3d   c);.        c =
23a30 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20   fgetc(p->in);. 
23a40 20 20 20 20 20 20 20 69 66 28 20 28 63 26 30 78         if( (c&0x
23a50 66 66 29 3d 3d 30 78 62 66 20 29 7b 0a 20 20 20  ff)==0xbf ){.   
23a60 20 20 20 20 20 20 20 70 2d 3e 62 4e 6f 74 46 69         p->bNotFi
23a70 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  rst = 1;.       
23a80 20 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20     p->n = 0;.   
23a90 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 63 73         return cs
23aa0 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64  v_read_one_field
23ab0 28 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  (p);.        }. 
23ac0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
23ad0 20 77 68 69 6c 65 28 20 63 21 3d 45 4f 46 20 26   while( c!=EOF &
23ae0 26 20 63 21 3d 63 53 65 70 20 26 26 20 63 21 3d  & c!=cSep && c!=
23af0 72 53 65 70 20 29 7b 0a 20 20 20 20 20 20 69 6d  rSep ){.      im
23b00 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72  port_append_char
23b10 28 70 2c 20 63 29 3b 0a 20 20 20 20 20 20 63 20  (p, c);.      c 
23b20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a  = fgetc(p->in);.
23b30 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 3d      }.    if( c=
23b40 3d 72 53 65 70 20 29 7b 0a 20 20 20 20 20 20 70  =rSep ){.      p
23b50 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20  ->nLine++;.     
23b60 20 69 66 28 20 70 2d 3e 6e 3e 30 20 26 26 20 70   if( p->n>0 && p
23b70 2d 3e 7a 5b 70 2d 3e 6e 2d 31 5d 3d 3d 27 5c 72  ->z[p->n-1]=='\r
23b80 27 20 29 20 70 2d 3e 6e 2d 2d 3b 0a 20 20 20 20  ' ) p->n--;.    
23b90 7d 0a 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d  }.    p->cTerm =
23ba0 20 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d   c;.  }.  if( p-
23bb0 3e 7a 20 29 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20  >z ) p->z[p->n] 
23bc0 3d 20 30 3b 0a 20 20 70 2d 3e 62 4e 6f 74 46 69  = 0;.  p->bNotFi
23bd0 72 73 74 20 3d 20 31 3b 0a 20 20 72 65 74 75 72  rst = 1;.  retur
23be0 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a 2f 2a 20 52 65  n p->z;.}../* Re
23bf0 61 64 20 61 20 73 69 6e 67 6c 65 20 66 69 65 6c  ad a single fiel
23c00 64 20 6f 66 20 41 53 43 49 49 20 64 65 6c 69 6d  d of ASCII delim
23c10 69 74 65 64 20 74 65 78 74 2e 0a 2a 2a 0a 2a 2a  ited text..**.**
23c20 20 20 20 2b 20 20 49 6e 70 75 74 20 63 6f 6d 65     +  Input come
23c30 73 20 66 72 6f 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a  s from p->in..**
23c40 20 20 20 2b 20 20 53 74 6f 72 65 20 72 65 73 75     +  Store resu
23c50 6c 74 73 20 69 6e 20 70 2d 3e 7a 20 6f 66 20 6c  lts in p->z of l
23c60 65 6e 67 74 68 20 70 2d 3e 6e 2e 20 20 53 70 61  ength p->n.  Spa
23c70 63 65 20 74 6f 20 68 6f 6c 64 20 70 2d 3e 7a 20  ce to hold p->z 
23c80 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 66 72  comes.**      fr
23c90 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  om sqlite3_mallo
23ca0 63 36 34 28 29 2e 0a 2a 2a 20 20 20 2b 20 20 55  c64()..**   +  U
23cb0 73 65 20 70 2d 3e 63 53 65 70 20 61 73 20 74 68  se p->cSep as th
23cc0 65 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74  e column separat
23cd0 6f 72 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74  or.  The default
23ce0 20 69 73 20 22 5c 78 31 46 22 2e 0a 2a 2a 20 20   is "\x1F"..**  
23cf0 20 2b 20 20 55 73 65 20 70 2d 3e 72 53 65 70 20   +  Use p->rSep 
23d00 61 73 20 74 68 65 20 72 6f 77 20 73 65 70 61 72  as the row separ
23d10 61 74 6f 72 2e 20 20 54 68 65 20 64 65 66 61 75  ator.  The defau
23d20 6c 74 20 69 73 20 22 5c 78 31 45 22 2e 0a 2a 2a  lt is "\x1E"..**
23d30 20 20 20 2b 20 20 4b 65 65 70 20 74 72 61 63 6b     +  Keep track
23d40 20 6f 66 20 74 68 65 20 72 6f 77 20 6e 75 6d 62   of the row numb
23d50 65 72 20 69 6e 20 70 2d 3e 6e 4c 69 6e 65 2e 0a  er in p->nLine..
23d60 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65 20 74 68  **   +  Store th
23d70 65 20 63 68 61 72 61 63 74 65 72 20 74 68 61 74  e character that
23d80 20 74 65 72 6d 69 6e 61 74 65 73 20 74 68 65 20   terminates the 
23d90 66 69 65 6c 64 20 69 6e 20 70 2d 3e 63 54 65 72  field in p->cTer
23da0 6d 2e 20 20 53 74 6f 72 65 0a 2a 2a 20 20 20 20  m.  Store.**    
23db0 20 20 45 4f 46 20 6f 6e 20 65 6e 64 2d 6f 66 2d    EOF on end-of-
23dc0 66 69 6c 65 2e 0a 2a 2a 20 20 20 2b 20 20 52 65  file..**   +  Re
23dd0 70 6f 72 74 20 73 79 6e 74 61 78 20 65 72 72 6f  port syntax erro
23de0 72 73 20 6f 6e 20 73 74 64 65 72 72 0a 2a 2f 0a  rs on stderr.*/.
23df0 73 74 61 74 69 63 20 63 68 61 72 20 2a 53 51 4c  static char *SQL
23e00 49 54 45 5f 43 44 45 43 4c 20 61 73 63 69 69 5f  ITE_CDECL ascii_
23e10 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 28 49  read_one_field(I
23e20 6d 70 6f 72 74 43 74 78 20 2a 70 29 7b 0a 20 20  mportCtx *p){.  
23e30 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 63 53 65  int c;.  int cSe
23e40 70 20 3d 20 70 2d 3e 63 43 6f 6c 53 65 70 3b 0a  p = p->cColSep;.
23e50 20 20 69 6e 74 20 72 53 65 70 20 3d 20 70 2d 3e    int rSep = p->
23e60 63 52 6f 77 53 65 70 3b 0a 20 20 70 2d 3e 6e 20  cRowSep;.  p->n 
23e70 3d 20 30 3b 0a 20 20 63 20 3d 20 66 67 65 74 63  = 0;.  c = fgetc
23e80 28 70 2d 3e 69 6e 29 3b 0a 20 20 69 66 28 20 63  (p->in);.  if( c
23e90 3d 3d 45 4f 46 20 7c 7c 20 73 65 65 6e 49 6e 74  ==EOF || seenInt
23ea0 65 72 72 75 70 74 20 29 7b 0a 20 20 20 20 70 2d  errupt ){.    p-
23eb0 3e 63 54 65 72 6d 20 3d 20 45 4f 46 3b 0a 20 20  >cTerm = EOF;.  
23ec0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
23ed0 20 20 77 68 69 6c 65 28 20 63 21 3d 45 4f 46 20    while( c!=EOF 
23ee0 26 26 20 63 21 3d 63 53 65 70 20 26 26 20 63 21  && c!=cSep && c!
23ef0 3d 72 53 65 70 20 29 7b 0a 20 20 20 20 69 6d 70  =rSep ){.    imp
23f00 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28  ort_append_char(
23f10 70 2c 20 63 29 3b 0a 20 20 20 20 63 20 3d 20 66  p, c);.    c = f
23f20 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 7d  getc(p->in);.  }
23f30 0a 20 20 69 66 28 20 63 3d 3d 72 53 65 70 20 29  .  if( c==rSep )
23f40 7b 0a 20 20 20 20 70 2d 3e 6e 4c 69 6e 65 2b 2b  {.    p->nLine++
23f50 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 54 65 72 6d  ;.  }.  p->cTerm
23f60 20 3d 20 63 3b 0a 20 20 69 66 28 20 70 2d 3e 7a   = c;.  if( p->z
23f70 20 29 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20   ) p->z[p->n] = 
23f80 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 7a  0;.  return p->z
23f90 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  ;.}../*.** Try t
23fa0 6f 20 74 72 61 6e 73 66 65 72 20 64 61 74 61 20  o transfer data 
23fb0 66 6f 72 20 74 61 62 6c 65 20 7a 54 61 62 6c 65  for table zTable
23fc0 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69  .  If an error i
23fd0 73 20 73 65 65 6e 20 77 68 69 6c 65 0a 2a 2a 20  s seen while.** 
23fe0 6d 6f 76 69 6e 67 20 66 6f 72 77 61 72 64 2c 20  moving forward, 
23ff0 74 72 79 20 74 6f 20 67 6f 20 62 61 63 6b 77 61  try to go backwa
24000 72 64 73 2e 20 20 54 68 65 20 62 61 63 6b 77 61  rds.  The backwa
24010 72 64 73 20 6d 6f 76 65 6d 65 6e 74 20 77 6f 6e  rds movement won
24020 27 74 0a 2a 2a 20 77 6f 72 6b 20 66 6f 72 20 57  't.** work for W
24030 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62  ITHOUT ROWID tab
24040 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  les..*/.static v
24050 6f 69 64 20 74 72 79 54 6f 43 6c 6f 6e 65 44 61  oid tryToCloneDa
24060 74 61 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  ta(.  ShellState
24070 20 2a 70 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a   *p,.  sqlite3 *
24080 6e 65 77 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63  newDb,.  const c
24090 68 61 72 20 2a 7a 54 61 62 6c 65 0a 29 7b 0a 20  har *zTable.){. 
240a0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
240b0 51 75 65 72 79 20 3d 20 30 3b 0a 20 20 73 71 6c  Query = 0;.  sql
240c0 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 6e 73 65  ite3_stmt *pInse
240d0 72 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  rt = 0;.  char *
240e0 7a 51 75 65 72 79 20 3d 20 30 3b 0a 20 20 63 68  zQuery = 0;.  ch
240f0 61 72 20 2a 7a 49 6e 73 65 72 74 20 3d 20 30 3b  ar *zInsert = 0;
24100 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74  .  int rc;.  int
24110 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 69 6e 74 20   i, j, n;.  int 
24120 6e 54 61 62 6c 65 20 3d 20 73 74 72 6c 65 6e 33  nTable = strlen3
24130 30 28 7a 54 61 62 6c 65 29 3b 0a 20 20 69 6e 74  0(zTable);.  int
24140 20 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63 6e   k = 0;.  int cn
24150 74 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20 69  t = 0;.  const i
24160 6e 74 20 73 70 69 6e 52 61 74 65 20 3d 20 31 30  nt spinRate = 10
24170 30 30 30 3b 0a 0a 20 20 7a 51 75 65 72 79 20 3d  000;..  zQuery =
24180 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
24190 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ("SELECT * FROM 
241a0 5c 22 25 77 5c 22 22 2c 20 7a 54 61 62 6c 65 29  \"%w\"", zTable)
241b0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
241c0 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
241d0 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26  b, zQuery, -1, &
241e0 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 69 66  pQuery, 0);.  if
241f0 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38  ( rc ){.    utf8
24200 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
24210 22 45 72 72 6f 72 20 25 64 3a 20 25 73 20 6f 6e  "Error %d: %s on
24220 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20   [%s]\n",.      
24230 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78        sqlite3_ex
24240 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 70  tended_errcode(p
24250 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65 33 5f 65  ->db), sqlite3_e
24260 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c 0a 20 20  rrmsg(p->db),.  
24270 20 20 20 20 20 20 20 20 20 20 7a 51 75 65 72 79            zQuery
24280 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f  );.    goto end_
24290 64 61 74 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20  data_xfer;.  }. 
242a0 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c   n = sqlite3_col
242b0 75 6d 6e 5f 63 6f 75 6e 74 28 70 51 75 65 72 79  umn_count(pQuery
242c0 29 3b 0a 20 20 7a 49 6e 73 65 72 74 20 3d 20 73  );.  zInsert = s
242d0 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
242e0 32 30 30 20 2b 20 6e 54 61 62 6c 65 20 2b 20 6e  200 + nTable + n
242f0 2a 33 29 3b 0a 20 20 69 66 28 20 7a 49 6e 73 65  *3);.  if( zInse
24300 72 74 3d 3d 30 20 29 20 73 68 65 6c 6c 5f 6f 75  rt==0 ) shell_ou
24310 74 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20  t_of_memory();. 
24320 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
24330 66 28 32 30 30 2b 6e 54 61 62 6c 65 2c 7a 49 6e  f(200+nTable,zIn
24340 73 65 72 74 2c 0a 20 20 20 20 20 20 20 20 20 20  sert,.          
24350 20 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54           "INSERT
24360 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54 4f 20   OR IGNORE INTO 
24370 5c 22 25 73 5c 22 20 56 41 4c 55 45 53 28 3f 22  \"%s\" VALUES(?"
24380 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 69 20 3d  , zTable);.  i =
24390 20 73 74 72 6c 65 6e 33 30 28 7a 49 6e 73 65 72   strlen30(zInser
243a0 74 29 3b 0a 20 20 66 6f 72 28 6a 3d 31 3b 20 6a  t);.  for(j=1; j
243b0 3c 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 6d 65  <n; j++){.    me
243c0 6d 63 70 79 28 7a 49 6e 73 65 72 74 2b 69 2c 20  mcpy(zInsert+i, 
243d0 22 2c 3f 22 2c 20 32 29 3b 0a 20 20 20 20 69 20  ",?", 2);.    i 
243e0 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 6d 65 6d 63  += 2;.  }.  memc
243f0 70 79 28 7a 49 6e 73 65 72 74 2b 69 2c 20 22 29  py(zInsert+i, ")
24400 3b 22 2c 20 33 29 3b 0a 20 20 72 63 20 3d 20 73  ;", 3);.  rc = s
24410 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
24420 32 28 6e 65 77 44 62 2c 20 7a 49 6e 73 65 72 74  2(newDb, zInsert
24430 2c 20 2d 31 2c 20 26 70 49 6e 73 65 72 74 2c 20  , -1, &pInsert, 
24440 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  0);.  if( rc ){.
24450 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
24460 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 20 25  stderr, "Error %
24470 64 3a 20 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22  d: %s on [%s]\n"
24480 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ,.            sq
24490 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65  lite3_extended_e
244a0 72 72 63 6f 64 65 28 6e 65 77 44 62 29 2c 20 73  rrcode(newDb), s
244b0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 6e 65  qlite3_errmsg(ne
244c0 77 44 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20  wDb),.          
244d0 20 20 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 67    zQuery);.    g
244e0 6f 74 6f 20 65 6e 64 5f 64 61 74 61 5f 78 66 65  oto end_data_xfe
244f0 72 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 6b 3d 30  r;.  }.  for(k=0
24500 3b 20 6b 3c 32 3b 20 6b 2b 2b 29 7b 0a 20 20 20  ; k<2; k++){.   
24510 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71   while( (rc = sq
24520 6c 69 74 65 33 5f 73 74 65 70 28 70 51 75 65 72  lite3_step(pQuer
24530 79 29 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  y))==SQLITE_ROW 
24540 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
24550 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<n; i++){.   
24560 20 20 20 20 20 73 77 69 74 63 68 28 20 73 71 6c       switch( sql
24570 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
24580 28 70 51 75 65 72 79 2c 20 69 29 20 29 7b 0a 20  (pQuery, i) ){. 
24590 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
245a0 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  LITE_NULL: {.   
245b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
245c0 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 49 6e 73 65  _bind_null(pInse
245d0 72 74 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20  rt, i+1);.      
245e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
245f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
24600 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 49     case SQLITE_I
24610 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
24620 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
24630 6e 64 5f 69 6e 74 36 34 28 70 49 6e 73 65 72 74  nd_int64(pInsert
24640 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63  , i+1, sqlite3_c
24650 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 51 75 65  olumn_int64(pQue
24660 72 79 2c 69 29 29 3b 0a 20 20 20 20 20 20 20 20  ry,i));.        
24670 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
24680 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
24690 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46 4c 4f   case SQLITE_FLO
246a0 41 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  AT: {.          
246b0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 64    sqlite3_bind_d
246c0 6f 75 62 6c 65 28 70 49 6e 73 65 72 74 2c 20 69  ouble(pInsert, i
246d0 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  +1, sqlite3_colu
246e0 6d 6e 5f 64 6f 75 62 6c 65 28 70 51 75 65 72 79  mn_double(pQuery
246f0 2c 69 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ,i));.          
24700 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
24710 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 63     }.          c
24720 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58 54 3a  ase SQLITE_TEXT:
24730 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   {.            s
24740 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
24750 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c 0a 20  (pInsert, i+1,. 
24760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24770 20 20 20 20 20 20 20 20 20 20 20 20 28 63 6f 6e              (con
24780 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
24790 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75  _column_text(pQu
247a0 65 72 79 2c 69 29 2c 0a 20 20 20 20 20 20 20 20  ery,i),.        
247b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
247c0 20 20 20 20 20 2d 31 2c 20 53 51 4c 49 54 45 5f       -1, SQLITE_
247d0 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
247e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
247f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24800 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 42 4c    case SQLITE_BL
24810 4f 42 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  OB: {.          
24820 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 62    sqlite3_bind_b
24830 6c 6f 62 28 70 49 6e 73 65 72 74 2c 20 69 2b 31  lob(pInsert, i+1
24840 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
24850 5f 62 6c 6f 62 28 70 51 75 65 72 79 2c 69 29 2c  _blob(pQuery,i),
24860 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24880 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
24890 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65  ite3_column_byte
248a0 73 28 70 51 75 65 72 79 2c 69 29 2c 0a 20 20 20  s(pQuery,i),.   
248b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
248d0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
248e0 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
248f0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
24900 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
24910 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64  }.      } /* End
24920 20 66 6f 72 20 2a 2f 0a 20 20 20 20 20 20 72 63   for */.      rc
24930 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
24940 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 20 20  pInsert);.      
24950 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
24960 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54 45 5f  K && rc!=SQLITE_
24970 52 4f 57 20 26 26 20 72 63 21 3d 53 51 4c 49 54  ROW && rc!=SQLIT
24980 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
24990 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
249a0 64 65 72 72 2c 20 22 45 72 72 6f 72 20 25 64 3a  derr, "Error %d:
249b0 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f   %s\n", sqlite3_
249c0 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65  extended_errcode
249d0 28 6e 65 77 44 62 29 2c 0a 20 20 20 20 20 20 20  (newDb),.       
249e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
249f0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
24a00 6e 65 77 44 62 29 29 3b 0a 20 20 20 20 20 20 7d  newDb));.      }
24a10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72  .      sqlite3_r
24a20 65 73 65 74 28 70 49 6e 73 65 72 74 29 3b 0a 20  eset(pInsert);. 
24a30 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20       cnt++;.    
24a40 20 20 69 66 28 20 28 63 6e 74 25 73 70 69 6e 52    if( (cnt%spinR
24a50 61 74 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ate)==0 ){.     
24a60 20 20 20 70 72 69 6e 74 66 28 22 25 63 5c 62 22     printf("%c\b"
24a70 2c 20 22 7c 2f 2d 5c 5c 22 5b 28 63 6e 74 2f 73  , "|/-\\"[(cnt/s
24a80 70 69 6e 52 61 74 65 29 25 34 5d 29 3b 0a 20 20  pinRate)%4]);.  
24a90 20 20 20 20 20 20 66 66 6c 75 73 68 28 73 74 64        fflush(std
24aa0 6f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  out);.      }.  
24ab0 20 20 7d 20 2f 2a 20 45 6e 64 20 77 68 69 6c 65    } /* End while
24ac0 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d   */.    if( rc==
24ad0 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20 62 72  SQLITE_DONE ) br
24ae0 65 61 6b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  eak;.    sqlite3
24af0 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75 65 72 79  _finalize(pQuery
24b00 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
24b10 72 65 65 28 7a 51 75 65 72 79 29 3b 0a 20 20 20  ree(zQuery);.   
24b20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69 74 65   zQuery = sqlite
24b30 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43  3_mprintf("SELEC
24b40 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c 22 20  T * FROM \"%w\" 
24b50 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 20 44  ORDER BY rowid D
24b60 45 53 43 3b 22 2c 0a 20 20 20 20 20 20 20 20 20  ESC;",.         
24b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24b80 20 20 20 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20      zTable);.   
24b90 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
24ba0 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20  epare_v2(p->db, 
24bb0 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75  zQuery, -1, &pQu
24bc0 65 72 79 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ery, 0);.    if(
24bd0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 75 74 66   rc ){.      utf
24be0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
24bf0 20 22 57 61 72 6e 69 6e 67 3a 20 63 61 6e 6e 6f   "Warning: canno
24c00 74 20 73 74 65 70 20 5c 22 25 73 5c 22 20 62 61  t step \"%s\" ba
24c10 63 6b 77 61 72 64 73 22 2c 20 7a 54 61 62 6c 65  ckwards", zTable
24c20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
24c30 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 45 6e 64      }.  } /* End
24c40 20 66 6f 72 28 6b 3d 30 2e 2e 2e 29 20 2a 2f 0a   for(k=0...) */.
24c50 0a 65 6e 64 5f 64 61 74 61 5f 78 66 65 72 3a 0a  .end_data_xfer:.
24c60 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
24c70 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20 73 71  ze(pQuery);.  sq
24c80 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
24c90 49 6e 73 65 72 74 29 3b 0a 20 20 73 71 6c 69 74  Insert);.  sqlit
24ca0 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b  e3_free(zQuery);
24cb0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
24cc0 7a 49 6e 73 65 72 74 29 3b 0a 7d 0a 0a 0a 2f 2a  zInsert);.}.../*
24cd0 0a 2a 2a 20 54 72 79 20 74 6f 20 74 72 61 6e 73  .** Try to trans
24ce0 66 65 72 20 61 6c 6c 20 72 6f 77 73 20 6f 66 20  fer all rows of 
24cf0 74 68 65 20 73 63 68 65 6d 61 20 74 68 61 74 20  the schema that 
24d00 6d 61 74 63 68 20 7a 57 68 65 72 65 2e 20 20 46  match zWhere.  F
24d10 6f 72 0a 2a 2a 20 65 61 63 68 20 72 6f 77 2c 20  or.** each row, 
24d20 69 6e 76 6f 6b 65 20 78 46 6f 72 45 61 63 68 28  invoke xForEach(
24d30 29 20 6f 6e 20 74 68 65 20 6f 62 6a 65 63 74 20  ) on the object 
24d40 64 65 66 69 6e 65 64 20 62 79 20 74 68 61 74 20  defined by that 
24d50 72 6f 77 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 72  row..** If an er
24d60 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
24d70 65 64 20 77 68 69 6c 65 20 6d 6f 76 69 6e 67 20  ed while moving 
24d80 66 6f 72 77 61 72 64 20 74 68 72 6f 75 67 68 20  forward through 
24d90 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 5f 6d 61  the.** sqlite_ma
24da0 73 74 65 72 20 74 61 62 6c 65 2c 20 74 72 79 20  ster table, try 
24db0 61 67 61 69 6e 20 6d 6f 76 69 6e 67 20 62 61 63  again moving bac
24dc0 6b 77 61 72 64 73 2e 0a 2a 2f 0a 73 74 61 74 69  kwards..*/.stati
24dd0 63 20 76 6f 69 64 20 74 72 79 54 6f 43 6c 6f 6e  c void tryToClon
24de0 65 53 63 68 65 6d 61 28 0a 20 20 53 68 65 6c 6c  eSchema(.  Shell
24df0 53 74 61 74 65 20 2a 70 2c 0a 20 20 73 71 6c 69  State *p,.  sqli
24e00 74 65 33 20 2a 6e 65 77 44 62 2c 0a 20 20 63 6f  te3 *newDb,.  co
24e10 6e 73 74 20 63 68 61 72 20 2a 7a 57 68 65 72 65  nst char *zWhere
24e20 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 6f 72 45  ,.  void (*xForE
24e30 61 63 68 29 28 53 68 65 6c 6c 53 74 61 74 65 2a  ach)(ShellState*
24e40 2c 73 71 6c 69 74 65 33 2a 2c 63 6f 6e 73 74 20  ,sqlite3*,const 
24e50 63 68 61 72 2a 29 0a 29 7b 0a 20 20 73 71 6c 69  char*).){.  sqli
24e60 74 65 33 5f 73 74 6d 74 20 2a 70 51 75 65 72 79  te3_stmt *pQuery
24e70 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 51   = 0;.  char *zQ
24e80 75 65 72 79 20 3d 20 30 3b 0a 20 20 69 6e 74 20  uery = 0;.  int 
24e90 72 63 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  rc;.  const unsi
24ea0 67 6e 65 64 20 63 68 61 72 20 2a 7a 4e 61 6d 65  gned char *zName
24eb0 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69 67 6e  ;.  const unsign
24ec0 65 64 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  ed char *zSql;. 
24ed0 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
24ee0 20 30 3b 0a 0a 20 20 7a 51 75 65 72 79 20 3d 20   0;..  zQuery = 
24ef0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
24f00 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 73 71  "SELECT name, sq
24f10 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  l FROM sqlite_ma
24f20 73 74 65 72 22 0a 20 20 20 20 20 20 20 20 20 20  ster".          
24f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f40 20 22 20 57 48 45 52 45 20 25 73 22 2c 20 7a 57   " WHERE %s", zW
24f50 68 65 72 65 29 3b 0a 20 20 72 63 20 3d 20 73 71  here);.  rc = sq
24f60 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
24f70 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20  (p->db, zQuery, 
24f80 2d 31 2c 20 26 70 51 75 65 72 79 2c 20 30 29 3b  -1, &pQuery, 0);
24f90 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20  .  if( rc ){.   
24fa0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
24fb0 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 28 25 64  err, "Error: (%d
24fc0 29 20 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c  ) %s on [%s]\n",
24fd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
24fe0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 74       sqlite3_ext
24ff0 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 70 2d  ended_errcode(p-
25000 3e 64 62 29 2c 20 73 71 6c 69 74 65 33 5f 65 72  >db), sqlite3_er
25010 72 6d 73 67 28 70 2d 3e 64 62 29 2c 0a 20 20 20  rmsg(p->db),.   
25020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25030 20 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 67 6f   zQuery);.    go
25040 74 6f 20 65 6e 64 5f 73 63 68 65 6d 61 5f 78 66  to end_schema_xf
25050 65 72 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28  er;.  }.  while(
25060 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73   (rc = sqlite3_s
25070 74 65 70 28 70 51 75 65 72 79 29 29 3d 3d 53 51  tep(pQuery))==SQ
25080 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
25090 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f  zName = sqlite3_
250a0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65  column_text(pQue
250b0 72 79 2c 20 30 29 3b 0a 20 20 20 20 7a 53 71 6c  ry, 0);.    zSql
250c0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
250d0 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c 20 31  n_text(pQuery, 1
250e0 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28 22 25  );.    printf("%
250f0 73 2e 2e 2e 20 22 2c 20 7a 4e 61 6d 65 29 3b 20  s... ", zName); 
25100 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a  fflush(stdout);.
25110 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
25120 28 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74 20 63  (newDb, (const c
25130 68 61 72 2a 29 7a 53 71 6c 2c 20 30 2c 20 30 2c  har*)zSql, 0, 0,
25140 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20   &zErrMsg);.    
25150 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20  if( zErrMsg ){. 
25160 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
25170 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
25180 20 25 73 5c 6e 53 51 4c 3a 20 5b 25 73 5d 5c 6e   %s\nSQL: [%s]\n
25190 22 2c 20 7a 45 72 72 4d 73 67 2c 20 7a 53 71 6c  ", zErrMsg, zSql
251a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
251b0 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
251c0 20 20 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20        zErrMsg = 
251d0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  0;.    }.    if(
251e0 20 78 46 6f 72 45 61 63 68 20 29 7b 0a 20 20 20   xForEach ){.   
251f0 20 20 20 78 46 6f 72 45 61 63 68 28 70 2c 20 6e     xForEach(p, n
25200 65 77 44 62 2c 20 28 63 6f 6e 73 74 20 63 68 61  ewDb, (const cha
25210 72 2a 29 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  r*)zName);.    }
25220 0a 20 20 20 20 70 72 69 6e 74 66 28 22 64 6f 6e  .    printf("don
25230 65 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28  e\n");.  }.  if(
25240 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc!=SQLITE_DONE
25250 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
25260 66 69 6e 61 6c 69 7a 65 28 70 51 75 65 72 79 29  finalize(pQuery)
25270 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
25280 65 65 28 7a 51 75 65 72 79 29 3b 0a 20 20 20 20  ee(zQuery);.    
25290 7a 51 75 65 72 79 20 3d 20 73 71 6c 69 74 65 33  zQuery = sqlite3
252a0 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
252b0 20 6e 61 6d 65 2c 20 73 71 6c 20 46 52 4f 4d 20   name, sql FROM 
252c0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20  sqlite_master". 
252d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252e0 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48              " WH
252f0 45 52 45 20 25 73 20 4f 52 44 45 52 20 42 59 20  ERE %s ORDER BY 
25300 72 6f 77 69 64 20 44 45 53 43 22 2c 20 7a 57 68  rowid DESC", zWh
25310 65 72 65 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ere);.    rc = s
25320 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
25330 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c  2(p->db, zQuery,
25340 20 2d 31 2c 20 26 70 51 75 65 72 79 2c 20 30 29   -1, &pQuery, 0)
25350 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
25360 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
25370 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
25380 3a 20 28 25 64 29 20 25 73 20 6f 6e 20 5b 25 73  : (%d) %s on [%s
25390 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ]\n",.          
253a0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
253b0 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72  te3_extended_err
253c0 63 6f 64 65 28 70 2d 3e 64 62 29 2c 20 73 71 6c  code(p->db), sql
253d0 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
253e0 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  b),.            
253f0 20 20 20 20 20 20 20 20 20 20 7a 51 75 65 72 79            zQuery
25400 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 65 6e  );.      goto en
25410 64 5f 73 63 68 65 6d 61 5f 78 66 65 72 3b 0a 20  d_schema_xfer;. 
25420 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20     }.    while( 
25430 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  (rc = sqlite3_st
25440 65 70 28 70 51 75 65 72 79 29 29 3d 3d 53 51 4c  ep(pQuery))==SQL
25450 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
25460 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33   zName = sqlite3
25470 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75  _column_text(pQu
25480 65 72 79 2c 20 30 29 3b 0a 20 20 20 20 20 20 7a  ery, 0);.      z
25490 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Sql = sqlite3_co
254a0 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79  lumn_text(pQuery
254b0 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 72 69 6e  , 1);.      prin
254c0 74 66 28 22 25 73 2e 2e 2e 20 22 2c 20 7a 4e 61  tf("%s... ", zNa
254d0 6d 65 29 3b 20 66 66 6c 75 73 68 28 73 74 64 6f  me); fflush(stdo
254e0 75 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ut);.      sqlit
254f0 65 33 5f 65 78 65 63 28 6e 65 77 44 62 2c 20 28  e3_exec(newDb, (
25500 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 53 71 6c  const char*)zSql
25510 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 4d 73 67  , 0, 0, &zErrMsg
25520 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 45 72  );.      if( zEr
25530 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 20 20  rMsg ){.        
25540 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
25550 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e  rr, "Error: %s\n
25560 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20 7a 45  SQL: [%s]\n", zE
25570 72 72 4d 73 67 2c 20 7a 53 71 6c 29 3b 0a 20 20  rrMsg, zSql);.  
25580 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
25590 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
255a0 20 20 20 20 20 7a 45 72 72 4d 73 67 20 3d 20 30       zErrMsg = 0
255b0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
255c0 69 66 28 20 78 46 6f 72 45 61 63 68 20 29 7b 0a  if( xForEach ){.
255d0 20 20 20 20 20 20 20 20 78 46 6f 72 45 61 63 68          xForEach
255e0 28 70 2c 20 6e 65 77 44 62 2c 20 28 63 6f 6e 73  (p, newDb, (cons
255f0 74 20 63 68 61 72 2a 29 7a 4e 61 6d 65 29 3b 0a  t char*)zName);.
25600 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 72        }.      pr
25610 69 6e 74 66 28 22 64 6f 6e 65 5c 6e 22 29 3b 0a  intf("done\n");.
25620 20 20 20 20 7d 0a 20 20 7d 0a 65 6e 64 5f 73 63      }.  }.end_sc
25630 68 65 6d 61 5f 78 66 65 72 3a 0a 20 20 73 71 6c  hema_xfer:.  sql
25640 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51  ite3_finalize(pQ
25650 75 65 72 79 29 3b 0a 20 20 73 71 6c 69 74 65 33  uery);.  sqlite3
25660 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b 0a 7d  _free(zQuery);.}
25670 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61 20 6e  ../*.** Open a n
25680 65 77 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  ew database file
25690 20 6e 61 6d 65 64 20 22 7a 4e 65 77 44 62 22 2e   named "zNewDb".
256a0 20 20 54 72 79 20 74 6f 20 72 65 63 6f 76 65 72    Try to recover
256b0 20 61 73 20 6d 75 63 68 20 69 6e 66 6f 72 6d 61   as much informa
256c0 74 69 6f 6e 0a 2a 2a 20 61 73 20 70 6f 73 73 69  tion.** as possi
256d0 62 6c 65 20 6f 75 74 20 6f 66 20 74 68 65 20 6d  ble out of the m
256e0 61 69 6e 20 64 61 74 61 62 61 73 65 20 28 77 68  ain database (wh
256f0 69 63 68 20 6d 69 67 68 74 20 62 65 20 63 6f 72  ich might be cor
25700 72 75 70 74 29 20 61 6e 64 20 77 72 69 74 65 20  rupt) and write 
25710 69 74 0a 2a 2a 20 69 6e 74 6f 20 7a 4e 65 77 44  it.** into zNewD
25720 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  b..*/.static voi
25730 64 20 74 72 79 54 6f 43 6c 6f 6e 65 28 53 68 65  d tryToClone(She
25740 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73  llState *p, cons
25750 74 20 63 68 61 72 20 2a 7a 4e 65 77 44 62 29 7b  t char *zNewDb){
25760 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73 71 6c  .  int rc;.  sql
25770 69 74 65 33 20 2a 6e 65 77 44 62 20 3d 20 30 3b  ite3 *newDb = 0;
25780 0a 20 20 69 66 28 20 61 63 63 65 73 73 28 7a 4e  .  if( access(zN
25790 65 77 44 62 2c 30 29 3d 3d 30 20 29 7b 0a 20 20  ewDb,0)==0 ){.  
257a0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
257b0 64 65 72 72 2c 20 22 46 69 6c 65 20 5c 22 25 73  derr, "File \"%s
257c0 5c 22 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  \" already exist
257d0 73 2e 5c 6e 22 2c 20 7a 4e 65 77 44 62 29 3b 0a  s.\n", zNewDb);.
257e0 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a      return;.  }.
257f0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f    rc = sqlite3_o
25800 70 65 6e 28 7a 4e 65 77 44 62 2c 20 26 6e 65 77  pen(zNewDb, &new
25810 44 62 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  Db);.  if( rc ){
25820 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
25830 28 73 74 64 65 72 72 2c 20 22 43 61 6e 6e 6f 74  (stderr, "Cannot
25840 20 63 72 65 61 74 65 20 6f 75 74 70 75 74 20 64   create output d
25850 61 74 61 62 61 73 65 3a 20 25 73 5c 6e 22 2c 0a  atabase: %s\n",.
25860 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
25870 74 65 33 5f 65 72 72 6d 73 67 28 6e 65 77 44 62  te3_errmsg(newDb
25880 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ));.  }else{.   
25890 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
258a0 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 77 72 69  >db, "PRAGMA wri
258b0 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 3b  table_schema=ON;
258c0 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ", 0, 0, 0);.   
258d0 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65   sqlite3_exec(ne
258e0 77 44 62 2c 20 22 42 45 47 49 4e 20 45 58 43 4c  wDb, "BEGIN EXCL
258f0 55 53 49 56 45 3b 22 2c 20 30 2c 20 30 2c 20 30  USIVE;", 0, 0, 0
25900 29 3b 0a 20 20 20 20 74 72 79 54 6f 43 6c 6f 6e  );.    tryToClon
25910 65 53 63 68 65 6d 61 28 70 2c 20 6e 65 77 44 62  eSchema(p, newDb
25920 2c 20 22 74 79 70 65 3d 27 74 61 62 6c 65 27 22  , "type='table'"
25930 2c 20 74 72 79 54 6f 43 6c 6f 6e 65 44 61 74 61  , tryToCloneData
25940 29 3b 0a 20 20 20 20 74 72 79 54 6f 43 6c 6f 6e  );.    tryToClon
25950 65 53 63 68 65 6d 61 28 70 2c 20 6e 65 77 44 62  eSchema(p, newDb
25960 2c 20 22 74 79 70 65 21 3d 27 74 61 62 6c 65 27  , "type!='table'
25970 22 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  ", 0);.    sqlit
25980 65 33 5f 65 78 65 63 28 6e 65 77 44 62 2c 20 22  e3_exec(newDb, "
25990 43 4f 4d 4d 49 54 3b 22 2c 20 30 2c 20 30 2c 20  COMMIT;", 0, 0, 
259a0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
259b0 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 50 52 41  exec(p->db, "PRA
259c0 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68  GMA writable_sch
259d0 65 6d 61 3d 4f 46 46 3b 22 2c 20 30 2c 20 30 2c  ema=OFF;", 0, 0,
259e0 20 30 29 3b 0a 20 20 7d 0a 20 20 63 6c 6f 73 65   0);.  }.  close
259f0 5f 64 62 28 6e 65 77 44 62 29 3b 0a 7d 0a 0a 2f  _db(newDb);.}../
25a00 2a 0a 2a 2a 20 43 68 61 6e 67 65 20 74 68 65 20  *.** Change the 
25a10 6f 75 74 70 75 74 20 66 69 6c 65 20 62 61 63 6b  output file back
25a20 20 74 6f 20 73 74 64 6f 75 74 2e 0a 2a 2a 0a 2a   to stdout..**.*
25a30 2a 20 49 66 20 74 68 65 20 70 2d 3e 64 6f 58 64  * If the p->doXd
25a40 67 4f 70 65 6e 20 66 6c 61 67 20 69 73 20 73 65  gOpen flag is se
25a50 74 2c 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68  t, that means th
25a60 65 20 6f 75 74 70 75 74 20 77 61 73 20 62 65 69  e output was bei
25a70 6e 67 0a 2a 2a 20 72 65 64 69 72 65 63 74 65 64  ng.** redirected
25a80 20 74 6f 20 61 20 74 65 6d 70 6f 72 61 72 79 20   to a temporary 
25a90 66 69 6c 65 20 6e 61 6d 65 64 20 62 79 20 70 2d  file named by p-
25aa0 3e 7a 54 65 6d 70 46 69 6c 65 2e 20 20 49 6e 20  >zTempFile.  In 
25ab0 74 68 61 74 20 63 61 73 65 2c 0a 2a 2a 20 6c 61  that case,.** la
25ac0 75 6e 63 68 20 73 74 61 72 74 2f 6f 70 65 6e 2f  unch start/open/
25ad0 78 64 67 2d 6f 70 65 6e 20 6f 6e 20 74 68 61 74  xdg-open on that
25ae0 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
25af0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
25b00 6f 75 74 70 75 74 5f 72 65 73 65 74 28 53 68 65  output_reset(She
25b10 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 69  llState *p){.  i
25b20 66 28 20 70 2d 3e 6f 75 74 66 69 6c 65 5b 30 5d  f( p->outfile[0]
25b30 3d 3d 27 7c 27 20 29 7b 0a 23 69 66 6e 64 65 66  =='|' ){.#ifndef
25b40 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f 50   SQLITE_OMIT_POP
25b50 45 4e 0a 20 20 20 20 70 63 6c 6f 73 65 28 70 2d  EN.    pclose(p-
25b60 3e 6f 75 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20  >out);.#endif.  
25b70 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 75 74 70 75  }else{.    outpu
25b80 74 5f 66 69 6c 65 5f 63 6c 6f 73 65 28 70 2d 3e  t_file_close(p->
25b90 6f 75 74 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  out);.#ifndef SQ
25ba0 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54  LITE_NOHAVE_SYST
25bb0 45 4d 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 6f  EM.    if( p->do
25bc0 58 64 67 4f 70 65 6e 20 29 7b 0a 20 20 20 20 20  XdgOpen ){.     
25bd0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 58 64   const char *zXd
25be0 67 4f 70 65 6e 43 6d 64 20 3d 0a 23 69 66 20 64  gOpenCmd =.#if d
25bf0 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 0a 20  efined(_WIN32). 
25c00 20 20 20 20 20 22 73 74 61 72 74 22 3b 0a 23 65       "start";.#e
25c10 6c 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 41 50  lif defined(__AP
25c20 50 4c 45 5f 5f 29 0a 20 20 20 20 20 20 22 6f 70  PLE__).      "op
25c30 65 6e 22 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  en";.#else.     
25c40 20 22 78 64 67 2d 6f 70 65 6e 22 3b 0a 23 65 6e   "xdg-open";.#en
25c50 64 69 66 0a 20 20 20 20 20 20 63 68 61 72 20 2a  dif.      char *
25c60 7a 43 6d 64 3b 0a 20 20 20 20 20 20 7a 43 6d 64  zCmd;.      zCmd
25c70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
25c80 74 66 28 22 25 73 20 25 73 22 2c 20 7a 58 64 67  tf("%s %s", zXdg
25c90 4f 70 65 6e 43 6d 64 2c 20 70 2d 3e 7a 54 65 6d  OpenCmd, p->zTem
25ca0 70 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 69 66  pFile);.      if
25cb0 28 20 73 79 73 74 65 6d 28 7a 43 6d 64 29 20 29  ( system(zCmd) )
25cc0 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
25cd0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 46  rintf(stderr, "F
25ce0 61 69 6c 65 64 3a 20 5b 25 73 5d 5c 6e 22 2c 20  ailed: [%s]\n", 
25cf0 7a 43 6d 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20  zCmd);.      }. 
25d00 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
25d10 65 28 7a 43 6d 64 29 3b 0a 20 20 20 20 20 20 6f  e(zCmd);.      o
25d20 75 74 70 75 74 4d 6f 64 65 50 6f 70 28 70 29 3b  utputModePop(p);
25d30 0a 20 20 20 20 20 20 70 2d 3e 64 6f 58 64 67 4f  .      p->doXdgO
25d40 70 65 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 23  pen = 0;.    }.#
25d50 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65  endif /* !define
25d60 64 28 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f  d(SQLITE_NOHAVE_
25d70 53 59 53 54 45 4d 29 20 2a 2f 0a 20 20 7d 0a 20  SYSTEM) */.  }. 
25d80 20 70 2d 3e 6f 75 74 66 69 6c 65 5b 30 5d 20 3d   p->outfile[0] =
25d90 20 30 3b 0a 20 20 70 2d 3e 6f 75 74 20 3d 20 73   0;.  p->out = s
25da0 74 64 6f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tdout;.}../*.** 
25db0 52 75 6e 20 61 6e 20 53 51 4c 20 63 6f 6d 6d 61  Run an SQL comma
25dc0 6e 64 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  nd and return th
25dd0 65 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72  e single integer
25de0 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74   result..*/.stat
25df0 69 63 20 69 6e 74 20 64 62 5f 69 6e 74 28 53 68  ic int db_int(Sh
25e00 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e  ellState *p, con
25e10 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a  st char *zSql){.
25e20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
25e30 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 65 73  pStmt;.  int res
25e40 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
25e50 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
25e60 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
25e70 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53  mt, 0);.  if( pS
25e80 74 6d 74 20 26 26 20 73 71 6c 69 74 65 33 5f 73  tmt && sqlite3_s
25e90 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
25ea0 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 72 65  TE_ROW ){.    re
25eb0 73 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  s = sqlite3_colu
25ec0 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 30 29 3b  mn_int(pStmt,0);
25ed0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
25ee0 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
25ef0 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
25f00 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
25f10 20 32 2d 62 79 74 65 20 6f 72 20 34 2d 62 79 74   2-byte or 4-byt
25f20 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
25f30 65 67 65 72 20 69 6e 74 6f 20 61 20 6e 61 74 69  eger into a nati
25f40 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 73 74  ve integer.*/.st
25f50 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e  atic unsigned in
25f60 74 20 67 65 74 32 62 79 74 65 49 6e 74 28 75 6e  t get2byteInt(un
25f70 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 29 7b  signed char *a){
25f80 0a 20 20 72 65 74 75 72 6e 20 28 61 5b 30 5d 3c  .  return (a[0]<
25f90 3c 38 29 20 2b 20 61 5b 31 5d 3b 0a 7d 0a 73 74  <8) + a[1];.}.st
25fa0 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e  atic unsigned in
25fb0 74 20 67 65 74 34 62 79 74 65 49 6e 74 28 75 6e  t get4byteInt(un
25fc0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 29 7b  signed char *a){
25fd0 0a 20 20 72 65 74 75 72 6e 20 28 61 5b 30 5d 3c  .  return (a[0]<
25fe0 3c 32 34 29 20 2b 20 28 61 5b 31 5d 3c 3c 31 36  <24) + (a[1]<<16
25ff0 29 20 2b 20 28 61 5b 32 5d 3c 3c 38 29 20 2b 20  ) + (a[2]<<8) + 
26000 61 5b 33 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  a[3];.}../*.** I
26010 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
26020 20 74 68 65 20 22 2e 69 6e 66 6f 22 20 63 6f 6d   the ".info" com
26030 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  mand..**.** Retu
26040 72 6e 20 31 20 6f 6e 20 65 72 72 6f 72 2c 20 32  rn 1 on error, 2
26050 20 74 6f 20 65 78 69 74 2c 20 61 6e 64 20 30 20   to exit, and 0 
26060 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
26070 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f 64  atic int shell_d
26080 62 69 6e 66 6f 5f 63 6f 6d 6d 61 6e 64 28 53 68  binfo_command(Sh
26090 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e 74  ellState *p, int
260a0 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a   nArg, char **az
260b0 41 72 67 29 7b 0a 20 20 73 74 61 74 69 63 20 63  Arg){.  static c
260c0 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 20 63 6f  onst struct { co
260d0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
260e0 20 69 6e 74 20 6f 66 73 74 3b 20 7d 20 61 46 69   int ofst; } aFi
260f0 65 6c 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b  eld[] = {.     {
26100 20 22 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f   "file change co
26110 75 6e 74 65 72 3a 22 2c 20 20 32 34 20 20 7d 2c  unter:",  24  },
26120 0a 20 20 20 20 20 7b 20 22 64 61 74 61 62 61 73  .     { "databas
26130 65 20 70 61 67 65 20 63 6f 75 6e 74 3a 22 2c 20  e page count:", 
26140 20 32 38 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   28  },.     { "
26150 66 72 65 65 6c 69 73 74 20 70 61 67 65 20 63 6f  freelist page co
26160 75 6e 74 3a 22 2c 20 20 33 36 20 20 7d 2c 0a 20  unt:",  36  },. 
26170 20 20 20 20 7b 20 22 73 63 68 65 6d 61 20 63 6f      { "schema co
26180 6f 6b 69 65 3a 22 2c 20 20 20 20 20 20 20 20 34  okie:",        4
26190 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63  0  },.     { "sc
261a0 68 65 6d 61 20 66 6f 72 6d 61 74 3a 22 2c 20 20  hema format:",  
261b0 20 20 20 20 20 20 34 34 20 20 7d 2c 0a 20 20 20        44  },.   
261c0 20 20 7b 20 22 64 65 66 61 75 6c 74 20 63 61 63    { "default cac
261d0 68 65 20 73 69 7a 65 3a 22 2c 20 20 20 34 38 20  he size:",   48 
261e0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 75 74 6f   },.     { "auto
261f0 76 61 63 75 75 6d 20 74 6f 70 20 72 6f 6f 74 3a  vacuum top root:
26200 22 2c 20 20 35 32 20 20 7d 2c 0a 20 20 20 20 20  ",  52  },.     
26210 7b 20 22 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  { "incremental v
26220 61 63 75 75 6d 3a 22 2c 20 20 20 36 34 20 20 7d  acuum:",   64  }
26230 2c 0a 20 20 20 20 20 7b 20 22 74 65 78 74 20 65  ,.     { "text e
26240 6e 63 6f 64 69 6e 67 3a 22 2c 20 20 20 20 20 20  ncoding:",      
26250 20 20 35 36 20 20 7d 2c 0a 20 20 20 20 20 7b 20    56  },.     { 
26260 22 75 73 65 72 20 76 65 72 73 69 6f 6e 3a 22 2c  "user version:",
26270 20 20 20 20 20 20 20 20 20 36 30 20 20 7d 2c 0a           60  },.
26280 20 20 20 20 20 7b 20 22 61 70 70 6c 69 63 61 74       { "applicat
26290 69 6f 6e 20 69 64 3a 22 2c 20 20 20 20 20 20 20  ion id:",       
262a0 36 38 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  68  },.     { "s
262b0 6f 66 74 77 61 72 65 20 76 65 72 73 69 6f 6e 3a  oftware version:
262c0 22 2c 20 20 20 20 20 39 36 20 20 7d 2c 0a 20 20  ",     96  },.  
262d0 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  };.  static cons
262e0 74 20 73 74 72 75 63 74 20 7b 20 63 6f 6e 73 74  t struct { const
262f0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 63 6f   char *zName; co
26300 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20  nst char *zSql; 
26310 7d 20 61 51 75 65 72 79 5b 5d 20 3d 20 7b 0a 20  } aQuery[] = {. 
26320 20 20 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66      { "number of
26330 20 74 61 62 6c 65 73 3a 22 2c 0a 20 20 20 20 20   tables:",.     
26340 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28    "SELECT count(
26350 2a 29 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45  *) FROM %s WHERE
26360 20 74 79 70 65 3d 27 74 61 62 6c 65 27 22 20 7d   type='table'" }
26370 2c 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62 65 72  ,.     { "number
26380 20 6f 66 20 69 6e 64 65 78 65 73 3a 22 2c 0a 20   of indexes:",. 
26390 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f        "SELECT co
263a0 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20 57  unt(*) FROM %s W
263b0 48 45 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78  HERE type='index
263c0 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6e 75  '" },.     { "nu
263d0 6d 62 65 72 20 6f 66 20 74 72 69 67 67 65 72 73  mber of triggers
263e0 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45  :",.       "SELE
263f0 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
26400 20 25 73 20 57 48 45 52 45 20 74 79 70 65 3d 27   %s WHERE type='
26410 74 72 69 67 67 65 72 27 22 20 7d 2c 0a 20 20 20  trigger'" },.   
26420 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20 76    { "number of v
26430 69 65 77 73 3a 22 2c 0a 20 20 20 20 20 20 20 22  iews:",.       "
26440 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
26450 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20 74 79  FROM %s WHERE ty
26460 70 65 3d 27 76 69 65 77 27 22 20 7d 2c 0a 20 20  pe='view'" },.  
26470 20 20 20 7b 20 22 73 63 68 65 6d 61 20 73 69 7a     { "schema siz
26480 65 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c  e:",.       "SEL
26490 45 43 54 20 74 6f 74 61 6c 28 6c 65 6e 67 74 68  ECT total(length
264a0 28 73 71 6c 29 29 20 46 52 4f 4d 20 25 73 22 20  (sql)) FROM %s" 
264b0 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b  },.  };.  int i;
264c0 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 44 61 74  .  unsigned iDat
264d0 61 56 65 72 73 69 6f 6e 3b 0a 20 20 63 68 61 72  aVersion;.  char
264e0 20 2a 7a 53 63 68 65 6d 61 54 61 62 3b 0a 20 20   *zSchemaTab;.  
264f0 63 68 61 72 20 2a 7a 44 62 20 3d 20 6e 41 72 67  char *zDb = nArg
26500 3e 3d 32 20 3f 20 61 7a 41 72 67 5b 31 5d 20 3a  >=2 ? azArg[1] :
26510 20 22 6d 61 69 6e 22 3b 0a 20 20 73 71 6c 69 74   "main";.  sqlit
26520 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
26530 20 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   0;.  unsigned c
26540 68 61 72 20 61 48 64 72 5b 31 30 30 5d 3b 0a 20  har aHdr[100];. 
26550 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
26560 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29    if( p->db==0 )
26570 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 73 71 6c   return 1;.  sql
26580 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
26590 70 2d 3e 64 62 2c 22 53 45 4c 45 43 54 20 64 61  p->db,"SELECT da
265a0 74 61 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64  ta FROM sqlite_d
265b0 62 70 61 67 65 28 3f 31 29 20 57 48 45 52 45 20  bpage(?1) WHERE 
265c0 70 67 6e 6f 3d 31 22 2c 0a 20 20 20 20 20 20 20  pgno=1",.       
265d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31                -1
265e0 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
265f0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
26600 74 28 70 53 74 6d 74 2c 20 31 2c 20 7a 44 62 2c  t(pStmt, 1, zDb,
26610 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
26620 49 43 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  IC);.  if( sqlit
26630 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
26640 53 51 4c 49 54 45 5f 52 4f 57 0a 20 20 20 26 26  SQLITE_ROW.   &&
26650 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
26660 62 79 74 65 73 28 70 53 74 6d 74 2c 30 29 3e 31  bytes(pStmt,0)>1
26670 30 30 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63  00.  ){.    memc
26680 70 79 28 61 48 64 72 2c 20 73 71 6c 69 74 65 33  py(aHdr, sqlite3
26690 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74  _column_blob(pSt
266a0 6d 74 2c 30 29 2c 20 31 30 30 29 3b 0a 20 20 20  mt,0), 100);.   
266b0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
266c0 65 28 70 53 74 6d 74 29 3b 0a 20 20 7d 65 6c 73  e(pStmt);.  }els
266d0 65 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  e{.    raw_print
266e0 66 28 73 74 64 65 72 72 2c 20 22 75 6e 61 62 6c  f(stderr, "unabl
266f0 65 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61  e to read databa
26700 73 65 20 68 65 61 64 65 72 5c 6e 22 29 3b 0a 20  se header\n");. 
26710 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
26720 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
26730 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
26740 69 20 3d 20 67 65 74 32 62 79 74 65 49 6e 74 28  i = get2byteInt(
26750 61 48 64 72 2b 31 36 29 3b 0a 20 20 69 66 28 20  aHdr+16);.  if( 
26760 69 3d 3d 31 20 29 20 69 20 3d 20 36 35 35 33 36  i==1 ) i = 65536
26770 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28  ;.  utf8_printf(
26780 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25  p->out, "%-20s %
26790 64 5c 6e 22 2c 20 22 64 61 74 61 62 61 73 65 20  d\n", "database 
267a0 70 61 67 65 20 73 69 7a 65 3a 22 2c 20 69 29 3b  page size:", i);
267b0 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70  .  utf8_printf(p
267c0 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64  ->out, "%-20s %d
267d0 5c 6e 22 2c 20 22 77 72 69 74 65 20 66 6f 72 6d  \n", "write form
267e0 61 74 3a 22 2c 20 61 48 64 72 5b 31 38 5d 29 3b  at:", aHdr[18]);
267f0 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70  .  utf8_printf(p
26800 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64  ->out, "%-20s %d
26810 5c 6e 22 2c 20 22 72 65 61 64 20 66 6f 72 6d 61  \n", "read forma
26820 74 3a 22 2c 20 61 48 64 72 5b 31 39 5d 29 3b 0a  t:", aHdr[19]);.
26830 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
26840 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64 5c  >out, "%-20s %d\
26850 6e 22 2c 20 22 72 65 73 65 72 76 65 64 20 62 79  n", "reserved by
26860 74 65 73 3a 22 2c 20 61 48 64 72 5b 32 30 5d 29  tes:", aHdr[20])
26870 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41  ;.  for(i=0; i<A
26880 72 72 61 79 53 69 7a 65 28 61 46 69 65 6c 64 29  rraySize(aField)
26890 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
268a0 6f 66 73 74 20 3d 20 61 46 69 65 6c 64 5b 69 5d  ofst = aField[i]
268b0 2e 6f 66 73 74 3b 0a 20 20 20 20 75 6e 73 69 67  .ofst;.    unsig
268c0 6e 65 64 20 69 6e 74 20 76 61 6c 20 3d 20 67 65  ned int val = ge
268d0 74 34 62 79 74 65 49 6e 74 28 61 48 64 72 20 2b  t4byteInt(aHdr +
268e0 20 6f 66 73 74 29 3b 0a 20 20 20 20 75 74 66 38   ofst);.    utf8
268f0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
26900 22 25 2d 32 30 73 20 25 75 22 2c 20 61 46 69 65  "%-20s %u", aFie
26910 6c 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 76 61 6c  ld[i].zName, val
26920 29 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f  );.    switch( o
26930 66 73 74 20 29 7b 0a 20 20 20 20 20 20 63 61 73  fst ){.      cas
26940 65 20 35 36 3a 20 7b 0a 20 20 20 20 20 20 20 20  e 56: {.        
26950 69 66 28 20 76 61 6c 3d 3d 31 20 29 20 72 61 77  if( val==1 ) raw
26960 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
26970 22 20 28 75 74 66 38 29 22 29 3b 0a 20 20 20 20  " (utf8)");.    
26980 20 20 20 20 69 66 28 20 76 61 6c 3d 3d 32 20 29      if( val==2 )
26990 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
269a0 75 74 2c 20 22 20 28 75 74 66 31 36 6c 65 29 22  ut, " (utf16le)"
269b0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 76  );.        if( v
269c0 61 6c 3d 3d 33 20 29 20 72 61 77 5f 70 72 69 6e  al==3 ) raw_prin
269d0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 28 75 74  tf(p->out, " (ut
269e0 66 31 36 62 65 29 22 29 3b 0a 20 20 20 20 20 20  f16be)");.      
269f0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f  }.    }.    raw_
26a00 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
26a10 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  \n");.  }.  if( 
26a20 7a 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53  zDb==0 ){.    zS
26a30 63 68 65 6d 61 54 61 62 20 3d 20 73 71 6c 69 74  chemaTab = sqlit
26a40 65 33 5f 6d 70 72 69 6e 74 66 28 22 6d 61 69 6e  e3_mprintf("main
26a50 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 29  .sqlite_master")
26a60 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
26a70 72 63 6d 70 28 7a 44 62 2c 22 74 65 6d 70 22 29  rcmp(zDb,"temp")
26a80 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53 63 68 65  ==0 ){.    zSche
26a90 6d 61 54 61 62 20 3d 20 73 71 6c 69 74 65 33 5f  maTab = sqlite3_
26aa0 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 22 73  mprintf("%s", "s
26ab0 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
26ac0 72 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  r");.  }else{.  
26ad0 20 20 7a 53 63 68 65 6d 61 54 61 62 20 3d 20 73    zSchemaTab = s
26ae0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
26af0 5c 22 25 77 5c 22 2e 73 71 6c 69 74 65 5f 6d 61  \"%w\".sqlite_ma
26b00 73 74 65 72 22 2c 20 7a 44 62 29 3b 0a 20 20 7d  ster", zDb);.  }
26b10 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72  .  for(i=0; i<Ar
26b20 72 61 79 53 69 7a 65 28 61 51 75 65 72 79 29 3b  raySize(aQuery);
26b30 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
26b40 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f  *zSql = sqlite3_
26b50 6d 70 72 69 6e 74 66 28 61 51 75 65 72 79 5b 69  mprintf(aQuery[i
26b60 5d 2e 7a 53 71 6c 2c 20 7a 53 63 68 65 6d 61 54  ].zSql, zSchemaT
26b70 61 62 29 3b 0a 20 20 20 20 69 6e 74 20 76 61 6c  ab);.    int val
26b80 20 3d 20 64 62 5f 69 6e 74 28 70 2c 20 7a 53 71   = db_int(p, zSq
26b90 6c 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  l);.    sqlite3_
26ba0 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
26bb0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
26bc0 75 74 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e 22  ut, "%-20s %d\n"
26bd0 2c 20 61 51 75 65 72 79 5b 69 5d 2e 7a 4e 61 6d  , aQuery[i].zNam
26be0 65 2c 20 76 61 6c 29 3b 0a 20 20 7d 0a 20 20 73  e, val);.  }.  s
26bf0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 63 68  qlite3_free(zSch
26c00 65 6d 61 54 61 62 29 3b 0a 20 20 73 71 6c 69 74  emaTab);.  sqlit
26c10 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
26c20 70 2d 3e 64 62 2c 20 7a 44 62 2c 20 53 51 4c 49  p->db, zDb, SQLI
26c30 54 45 5f 46 43 4e 54 4c 5f 44 41 54 41 5f 56 45  TE_FCNTL_DATA_VE
26c40 52 53 49 4f 4e 2c 20 26 69 44 61 74 61 56 65 72  RSION, &iDataVer
26c50 73 69 6f 6e 29 3b 0a 20 20 75 74 66 38 5f 70 72  sion);.  utf8_pr
26c60 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d  intf(p->out, "%-
26c70 32 30 73 20 25 75 5c 6e 22 2c 20 22 64 61 74 61  20s %u\n", "data
26c80 20 76 65 72 73 69 6f 6e 22 2c 20 69 44 61 74 61   version", iData
26c90 56 65 72 73 69 6f 6e 29 3b 0a 20 20 72 65 74 75  Version);.  retu
26ca0 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  rn 0;.}../*.** P
26cb0 72 69 6e 74 20 74 68 65 20 63 75 72 72 65 6e 74  rint the current
26cc0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
26cd0 29 20 76 61 6c 75 65 20 74 6f 20 73 74 64 65 72  ) value to stder
26ce0 72 20 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 0a  r and return 1..
26cf0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68  */.static int sh
26d00 65 6c 6c 44 61 74 61 62 61 73 65 45 72 72 6f 72  ellDatabaseError
26d10 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20  (sqlite3 *db){. 
26d20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
26d30 72 20 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  r = sqlite3_errm
26d40 73 67 28 64 62 29 3b 0a 20 20 75 74 66 38 5f 70  sg(db);.  utf8_p
26d50 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
26d60 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72  rror: %s\n", zEr
26d70 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a  r);.  return 1;.
26d80 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
26d90 20 74 68 65 20 70 61 74 74 65 72 6e 20 69 6e 20   the pattern in 
26da0 7a 47 6c 6f 62 5b 5d 20 61 67 61 69 6e 73 74 20  zGlob[] against 
26db0 74 68 65 20 74 65 78 74 20 69 6e 20 7a 5b 5d 2e  the text in z[].
26dc0 20 20 52 65 74 75 72 6e 20 54 52 55 45 0a 2a 2a    Return TRUE.**
26dd0 20 69 66 20 74 68 65 79 20 6d 61 74 63 68 20 61   if they match a
26de0 6e 64 20 46 41 4c 53 45 20 28 30 29 20 69 66 20  nd FALSE (0) if 
26df0 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63  they do not matc
26e00 68 2e 0a 2a 2a 0a 2a 2a 20 47 6c 6f 62 62 69 6e  h..**.** Globbin
26e10 67 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  g rules:.**.**  
26e20 20 20 20 20 27 2a 27 20 20 20 20 20 20 20 4d 61      '*'       Ma
26e30 74 63 68 65 73 20 61 6e 79 20 73 65 71 75 65 6e  tches any sequen
26e40 63 65 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f  ce of zero or mo
26e50 72 65 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a  re characters..*
26e60 2a 0a 2a 2a 20 20 20 20 20 20 27 3f 27 20 20 20  *.**      '?'   
26e70 20 20 20 20 4d 61 74 63 68 65 73 20 65 78 61 63      Matches exac
26e80 74 6c 79 20 6f 6e 65 20 63 68 61 72 61 63 74 65  tly one characte
26e90 72 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 2e 2e  r..**.**     [..
26ea0 2e 5d 20 20 20 20 20 20 4d 61 74 63 68 65 73 20  .]      Matches 
26eb0 6f 6e 65 20 63 68 61 72 61 63 74 65 72 20 66 72  one character fr
26ec0 6f 6d 20 74 68 65 20 65 6e 63 6c 6f 73 65 64 20  om the enclosed 
26ed0 6c 69 73 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20  list of.**      
26ee0 20 20 20 20 20 20 20 20 20 20 63 68 61 72 61 63            charac
26ef0 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ters..**.**     
26f00 5b 5e 2e 2e 2e 5d 20 20 20 20 20 4d 61 74 63 68  [^...]     Match
26f10 65 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72  es one character
26f20 20 6e 6f 74 20 69 6e 20 74 68 65 20 65 6e 63 6c   not in the encl
26f30 6f 73 65 64 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a  osed list..**.**
26f40 20 20 20 20 20 20 27 23 27 20 20 20 20 20 20 20        '#'       
26f50 4d 61 74 63 68 65 73 20 61 6e 79 20 73 65 71 75  Matches any sequ
26f60 65 6e 63 65 20 6f 66 20 6f 6e 65 20 6f 72 20 6d  ence of one or m
26f70 6f 72 65 20 64 69 67 69 74 73 20 77 69 74 68 20  ore digits with 
26f80 61 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  an.**           
26f90 20 20 20 20 20 6f 70 74 69 6f 6e 61 6c 20 2b 20       optional + 
26fa0 6f 72 20 2d 20 73 69 67 6e 20 69 6e 20 66 72 6f  or - sign in fro
26fb0 6e 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 20  nt.**.**      ' 
26fc0 27 20 20 20 20 20 20 20 41 6e 79 20 73 70 61 6e  '       Any span
26fd0 20 6f 66 20 77 68 69 74 65 73 70 61 63 65 20 6d   of whitespace m
26fe0 61 74 63 68 65 73 20 61 6e 79 20 6f 74 68 65 72  atches any other
26ff0 20 73 70 61 6e 20 6f 66 0a 2a 2a 20 20 20 20 20   span of.**     
27000 20 20 20 20 20 20 20 20 20 20 20 77 68 69 74 65             white
27010 73 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 74  space..**.** Ext
27020 72 61 20 77 68 69 74 65 73 70 61 63 65 20 61 74  ra whitespace at
27030 20 74 68 65 20 65 6e 64 20 6f 66 20 7a 5b 5d 20   the end of z[] 
27040 69 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 73  is ignored..*/.s
27050 74 61 74 69 63 20 69 6e 74 20 74 65 73 74 63 61  tatic int testca
27060 73 65 5f 67 6c 6f 62 28 63 6f 6e 73 74 20 63 68  se_glob(const ch
27070 61 72 20 2a 7a 47 6c 6f 62 2c 20 63 6f 6e 73 74  ar *zGlob, const
27080 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
27090 20 63 2c 20 63 32 3b 0a 20 20 69 6e 74 20 69 6e   c, c2;.  int in
270a0 76 65 72 74 3b 0a 20 20 69 6e 74 20 73 65 65 6e  vert;.  int seen
270b0 3b 0a 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d  ;..  while( (c =
270c0 20 28 2a 28 7a 47 6c 6f 62 2b 2b 29 29 29 21 3d   (*(zGlob++)))!=
270d0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 49 73 53  0 ){.    if( IsS
270e0 70 61 63 65 28 63 29 20 29 7b 0a 20 20 20 20 20  pace(c) ){.     
270f0 20 69 66 28 20 21 49 73 53 70 61 63 65 28 2a 7a   if( !IsSpace(*z
27100 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
27110 20 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61      while( IsSpa
27120 63 65 28 2a 7a 47 6c 6f 62 29 20 29 20 7a 47 6c  ce(*zGlob) ) zGl
27130 6f 62 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c  ob++;.      whil
27140 65 28 20 49 73 53 70 61 63 65 28 2a 7a 29 20 29  e( IsSpace(*z) )
27150 20 7a 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20   z++;.    }else 
27160 69 66 28 20 63 3d 3d 27 2a 27 20 29 7b 0a 20 20  if( c=='*' ){.  
27170 20 20 20 20 77 68 69 6c 65 28 20 28 63 3d 28 2a      while( (c=(*
27180 28 7a 47 6c 6f 62 2b 2b 29 29 29 20 3d 3d 20 27  (zGlob++))) == '
27190 2a 27 20 7c 7c 20 63 3d 3d 27 3f 27 20 29 7b 0a  *' || c=='?' ){.
271a0 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
271b0 3f 27 20 26 26 20 28 2a 28 7a 2b 2b 29 29 3d 3d  ?' && (*(z++))==
271c0 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
271d0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
271e0 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  c==0 ){.        
271f0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
27200 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b 27  }else if( c=='['
27210 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
27220 65 28 20 2a 7a 20 26 26 20 74 65 73 74 63 61 73  e( *z && testcas
27230 65 5f 67 6c 6f 62 28 7a 47 6c 6f 62 2d 31 2c 7a  e_glob(zGlob-1,z
27240 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
27250 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d    z++;.        }
27260 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
27270 28 2a 7a 29 21 3d 30 3b 0a 20 20 20 20 20 20 7d  (*z)!=0;.      }
27280 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63  .      while( (c
27290 32 20 3d 20 28 2a 28 7a 2b 2b 29 29 29 21 3d 30  2 = (*(z++)))!=0
272a0 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
272b0 65 28 20 63 32 21 3d 63 20 29 7b 0a 20 20 20 20  e( c2!=c ){.    
272c0 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 2b 2b        c2 = *(z++
272d0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
272e0 20 63 32 3d 3d 30 20 29 20 72 65 74 75 72 6e 20   c2==0 ) return 
272f0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
27300 20 20 20 20 20 69 66 28 20 74 65 73 74 63 61 73       if( testcas
27310 65 5f 67 6c 6f 62 28 7a 47 6c 6f 62 2c 7a 29 20  e_glob(zGlob,z) 
27320 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
27330 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e    }.      return
27340 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
27350 28 20 63 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20  ( c=='?' ){.    
27360 20 20 69 66 28 20 28 2a 28 7a 2b 2b 29 29 3d 3d    if( (*(z++))==
27370 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
27380 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
27390 5b 27 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  [' ){.      int 
273a0 70 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20  prior_c = 0;.   
273b0 20 20 20 73 65 65 6e 20 3d 20 30 3b 0a 20 20 20     seen = 0;.   
273c0 20 20 20 69 6e 76 65 72 74 20 3d 20 30 3b 0a 20     invert = 0;. 
273d0 20 20 20 20 20 63 20 3d 20 2a 28 7a 2b 2b 29 3b       c = *(z++);
273e0 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
273f0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
27400 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b    c2 = *(zGlob++
27410 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d  );.      if( c2=
27420 3d 27 5e 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='^' ){.        
27430 69 6e 76 65 72 74 20 3d 20 31 3b 0a 20 20 20 20  invert = 1;.    
27440 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62      c2 = *(zGlob
27450 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ++);.      }.   
27460 20 20 20 69 66 28 20 63 32 3d 3d 27 5d 27 20 29     if( c2==']' )
27470 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d  {.        if( c=
27480 3d 27 5d 27 20 29 20 73 65 65 6e 20 3d 20 31 3b  =']' ) seen = 1;
27490 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28  .        c2 = *(
274a0 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20  zGlob++);.      
274b0 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 63  }.      while( c
274c0 32 20 26 26 20 63 32 21 3d 27 5d 27 20 29 7b 0a  2 && c2!=']' ){.
274d0 20 20 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d          if( c2==
274e0 27 2d 27 20 26 26 20 7a 47 6c 6f 62 5b 30 5d 21  '-' && zGlob[0]!
274f0 3d 27 5d 27 20 26 26 20 7a 47 6c 6f 62 5b 30 5d  =']' && zGlob[0]
27500 21 3d 30 20 26 26 20 70 72 69 6f 72 5f 63 3e 30  !=0 && prior_c>0
27510 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 32   ){.          c2
27520 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20   = *(zGlob++);. 
27530 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3e 3d           if( c>=
27540 70 72 69 6f 72 5f 63 20 26 26 20 63 3c 3d 63 32  prior_c && c<=c2
27550 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20   ) seen = 1;.   
27560 20 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d         prior_c =
27570 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   0;.        }els
27580 65 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e{.          if(
27590 20 63 3d 3d 63 32 20 29 7b 0a 20 20 20 20 20 20   c==c2 ){.      
275a0 20 20 20 20 20 20 73 65 65 6e 20 3d 20 31 3b 0a        seen = 1;.
275b0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
275c0 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d 20        prior_c = 
275d0 63 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  c2;.        }.  
275e0 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c        c2 = *(zGl
275f0 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ob++);.      }. 
27600 20 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20 7c       if( c2==0 |
27610 7c 20 28 73 65 65 6e 20 5e 20 69 6e 76 65 72 74  | (seen ^ invert
27620 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )==0 ) return 0;
27630 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
27640 3d 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20 69  =='#' ){.      i
27650 66 28 20 28 7a 5b 30 5d 3d 3d 27 2d 27 20 7c 7c  f( (z[0]=='-' ||
27660 20 7a 5b 30 5d 3d 3d 27 2b 27 29 20 26 26 20 49   z[0]=='+') && I
27670 73 44 69 67 69 74 28 7a 5b 31 5d 29 20 29 20 7a  sDigit(z[1]) ) z
27680 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 21 49  ++;.      if( !I
27690 73 44 69 67 69 74 28 7a 5b 30 5d 29 20 29 20 72  sDigit(z[0]) ) r
276a0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7a  eturn 0;.      z
276b0 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ++;.      while(
276c0 20 49 73 44 69 67 69 74 28 7a 5b 30 5d 29 20 29   IsDigit(z[0]) )
276d0 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65 6c  { z++; }.    }el
276e0 73 65 7b 0a 20 20 20 20 20 20 69 66 28 20 63 21  se{.      if( c!
276f0 3d 28 2a 28 7a 2b 2b 29 29 20 29 20 72 65 74 75  =(*(z++)) ) retu
27700 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  rn 0;.    }.  }.
27710 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65    while( IsSpace
27720 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20  (*z) ){ z++; }. 
27730 20 72 65 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d   return *z==0;.}
27740 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  .../*.** Compare
27750 20 74 68 65 20 73 74 72 69 6e 67 20 61 73 20 61   the string as a
27760 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70   command-line op
27770 74 69 6f 6e 20 77 69 74 68 20 65 69 74 68 65 72  tion with either
27780 20 6f 6e 65 20 6f 72 20 74 77 6f 0a 2a 2a 20 69   one or two.** i
27790 6e 69 74 69 61 6c 20 22 2d 22 20 63 68 61 72 61  nitial "-" chara
277a0 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cters..*/.static
277b0 20 69 6e 74 20 6f 70 74 69 6f 6e 4d 61 74 63 68   int optionMatch
277c0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74  (const char *zSt
277d0 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  r, const char *z
277e0 4f 70 74 29 7b 0a 20 20 69 66 28 20 7a 53 74 72  Opt){.  if( zStr
277f0 5b 30 5d 21 3d 27 2d 27 20 29 20 72 65 74 75 72  [0]!='-' ) retur
27800 6e 20 30 3b 0a 20 20 7a 53 74 72 2b 2b 3b 0a 20  n 0;.  zStr++;. 
27810 20 69 66 28 20 7a 53 74 72 5b 30 5d 3d 3d 27 2d   if( zStr[0]=='-
27820 27 20 29 20 7a 53 74 72 2b 2b 3b 0a 20 20 72 65  ' ) zStr++;.  re
27830 74 75 72 6e 20 73 74 72 63 6d 70 28 7a 53 74 72  turn strcmp(zStr
27840 2c 20 7a 4f 70 74 29 3d 3d 30 3b 0a 7d 0a 0a 2f  , zOpt)==0;.}../
27850 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 66 69  *.** Delete a fi
27860 6c 65 2e 0a 2a 2f 0a 69 6e 74 20 73 68 65 6c 6c  le..*/.int shell
27870 44 65 6c 65 74 65 46 69 6c 65 28 63 6f 6e 73 74  DeleteFile(const
27880 20 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65   char *zFilename
27890 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 23 69 66  ){.  int rc;.#if
278a0 64 65 66 20 5f 57 49 4e 33 32 0a 20 20 77 63 68  def _WIN32.  wch
278b0 61 72 5f 74 20 2a 7a 20 3d 20 73 71 6c 69 74 65  ar_t *z = sqlite
278c0 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f  3_win32_utf8_to_
278d0 75 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d  unicode(zFilenam
278e0 65 29 3b 0a 20 20 72 63 20 3d 20 5f 77 75 6e 6c  e);.  rc = _wunl
278f0 69 6e 6b 28 7a 29 3b 0a 20 20 73 71 6c 69 74 65  ink(z);.  sqlite
27900 33 5f 66 72 65 65 28 7a 29 3b 0a 23 65 6c 73 65  3_free(z);.#else
27910 0a 20 20 72 63 20 3d 20 75 6e 6c 69 6e 6b 28 7a  .  rc = unlink(z
27920 46 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69  Filename);.#endi
27930 66 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  f.  return rc;.}
27940 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 64  ../*.** Try to d
27950 65 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72  elete the tempor
27960 61 72 79 20 66 69 6c 65 20 28 69 66 20 74 68 65  ary file (if the
27970 72 65 20 69 73 20 6f 6e 65 29 20 61 6e 64 20 66  re is one) and f
27980 72 65 65 20 74 68 65 0a 2a 2a 20 6d 65 6d 6f 72  ree the.** memor
27990 79 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 74  y used to hold t
279a0 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
279b0 65 6d 70 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61  emp file..*/.sta
279c0 74 69 63 20 76 6f 69 64 20 63 6c 65 61 72 54 65  tic void clearTe
279d0 6d 70 46 69 6c 65 28 53 68 65 6c 6c 53 74 61 74  mpFile(ShellStat
279e0 65 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e  e *p){.  if( p->
279f0 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20 29 20 72  zTempFile==0 ) r
27a00 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e  eturn;.  if( p->
27a10 64 6f 58 64 67 4f 70 65 6e 20 29 20 72 65 74 75  doXdgOpen ) retu
27a20 72 6e 3b 0a 20 20 69 66 28 20 73 68 65 6c 6c 44  rn;.  if( shellD
27a30 65 6c 65 74 65 46 69 6c 65 28 70 2d 3e 7a 54 65  eleteFile(p->zTe
27a40 6d 70 46 69 6c 65 29 20 29 20 72 65 74 75 72 6e  mpFile) ) return
27a50 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
27a60 28 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 3b 0a  (p->zTempFile);.
27a70 20 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 20 3d    p->zTempFile =
27a80 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65   0;.}../*.** Cre
27a90 61 74 65 20 61 20 6e 65 77 20 74 65 6d 70 20 66  ate a new temp f
27aa0 69 6c 65 20 6e 61 6d 65 20 77 69 74 68 20 74 68  ile name with th
27ab0 65 20 67 69 76 65 6e 20 73 75 66 66 69 78 2e 0a  e given suffix..
27ac0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e  */.static void n
27ad0 65 77 54 65 6d 70 46 69 6c 65 28 53 68 65 6c 6c  ewTempFile(Shell
27ae0 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20  State *p, const 
27af0 63 68 61 72 20 2a 7a 53 75 66 66 69 78 29 7b 0a  char *zSuffix){.
27b00 20 20 63 6c 65 61 72 54 65 6d 70 46 69 6c 65 28    clearTempFile(
27b10 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  p);.  sqlite3_fr
27b20 65 65 28 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29  ee(p->zTempFile)
27b30 3b 0a 20 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65  ;.  p->zTempFile
27b40 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 64   = 0;.  if( p->d
27b50 62 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  b ){.    sqlite3
27b60 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d  _file_control(p-
27b70 3e 64 62 2c 20 30 2c 20 53 51 4c 49 54 45 5f 46  >db, 0, SQLITE_F
27b80 43 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d  CNTL_TEMPFILENAM
27b90 45 2c 20 26 70 2d 3e 7a 54 65 6d 70 46 69 6c 65  E, &p->zTempFile
27ba0 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  );.  }.  if( p->
27bb0 7a 54 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a  zTempFile==0 ){.
27bc0 20 20 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74      sqlite3_uint
27bd0 36 34 20 72 3b 0a 20 20 20 20 73 71 6c 69 74 65  64 r;.    sqlite
27be0 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a  3_randomness(siz
27bf0 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20 20 20  eof(r), &r);.   
27c00 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 20 3d 20   p->zTempFile = 
27c10 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
27c20 22 74 65 6d 70 25 6c 6c 78 2e 25 73 22 2c 20 72  "temp%llx.%s", r
27c30 2c 20 7a 53 75 66 66 69 78 29 3b 0a 20 20 7d 65  , zSuffix);.  }e
27c40 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 7a 54 65 6d  lse{.    p->zTem
27c50 70 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f  pFile = sqlite3_
27c60 6d 70 72 69 6e 74 66 28 22 25 7a 2e 25 73 22 2c  mprintf("%z.%s",
27c70 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 2c 20 7a   p->zTempFile, z
27c80 53 75 66 66 69 78 29 3b 0a 20 20 7d 0a 20 20 69  Suffix);.  }.  i
27c90 66 28 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 3d  f( p->zTempFile=
27ca0 3d 30 20 29 7b 0a 20 20 20 20 72 61 77 5f 70 72  =0 ){.    raw_pr
27cb0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6f 75  intf(stderr, "ou
27cc0 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b  t of memory\n");
27cd0 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20  .    exit(1);.  
27ce0 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  }.}.../*.** The 
27cf0 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  implementation o
27d00 66 20 53 51 4c 20 73 63 61 6c 61 72 20 66 75 6e  f SQL scalar fun
27d10 63 74 69 6f 6e 20 66 6b 65 79 5f 63 6f 6c 6c 61  ction fkey_colla
27d20 74 65 5f 63 6c 61 75 73 65 28 29 2c 20 75 73 65  te_clause(), use
27d30 64 0a 2a 2a 20 62 79 20 74 68 65 20 22 2e 6c 69  d.** by the ".li
27d40 6e 74 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 22  nt fkey-indexes"
27d50 20 63 6f 6d 6d 61 6e 64 2e 20 54 68 69 73 20 73   command. This s
27d60 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 69  calar function i
27d70 73 20 61 6c 77 61 79 73 0a 2a 2a 20 63 61 6c 6c  s always.** call
27d80 65 64 20 77 69 74 68 20 66 6f 75 72 20 61 72 67  ed with four arg
27d90 75 6d 65 6e 74 73 20 2d 20 74 68 65 20 70 61 72  uments - the par
27da0 65 6e 74 20 74 61 62 6c 65 20 6e 61 6d 65 2c 20  ent table name, 
27db0 74 68 65 20 70 61 72 65 6e 74 20 63 6f 6c 75 6d  the parent colum
27dc0 6e 20 6e 61 6d 65 2c 0a 2a 2a 20 74 68 65 20 63  n name,.** the c
27dd0 68 69 6c 64 20 74 61 62 6c 65 20 6e 61 6d 65 20  hild table name 
27de0 61 6e 64 20 74 68 65 20 63 68 69 6c 64 20 63 6f  and the child co
27df0 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a  lumn name..**.**
27e00 20 20 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f     fkey_collate_
27e10 63 6c 61 75 73 65 28 27 70 61 72 65 6e 74 2d 74  clause('parent-t
27e20 61 62 27 2c 20 27 70 61 72 65 6e 74 2d 63 6f 6c  ab', 'parent-col
27e30 27 2c 20 27 63 68 69 6c 64 2d 74 61 62 27 2c 20  ', 'child-tab', 
27e40 27 63 68 69 6c 64 2d 63 6f 6c 27 29 0a 2a 2a 0a  'child-col').**.
27e50 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66 20  ** If either of 
27e60 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 73  the named tables
27e70 20 6f 72 20 63 6f 6c 75 6d 6e 73 20 64 6f 20 6e   or columns do n
27e80 6f 74 20 65 78 69 73 74 2c 20 74 68 69 73 20 66  ot exist, this f
27e90 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72  unction.** retur
27ea0 6e 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69  ns an empty stri
27eb0 6e 67 2e 20 41 6e 20 65 6d 70 74 79 20 73 74 72  ng. An empty str
27ec0 69 6e 67 20 69 73 20 61 6c 73 6f 20 72 65 74 75  ing is also retu
27ed0 72 6e 65 64 20 69 66 20 62 6f 74 68 20 74 61 62  rned if both tab
27ee0 6c 65 73 0a 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d  les.** and colum
27ef0 6e 73 20 65 78 69 73 74 20 62 75 74 20 68 61 76  ns exist but hav
27f00 65 20 74 68 65 20 73 61 6d 65 20 64 65 66 61 75  e the same defau
27f10 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  lt collation seq
27f20 75 65 6e 63 65 2e 20 4f 72 2c 0a 2a 2a 20 69 66  uence. Or,.** if
27f30 20 62 6f 74 68 20 65 78 69 73 74 20 62 75 74 20   both exist but 
27f40 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c  the default coll
27f50 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20  ation sequences 
27f60 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20 74  are different, t
27f70 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  his.** function 
27f80 72 65 74 75 72 6e 73 20 74 68 65 20 73 74 72 69  returns the stri
27f90 6e 67 20 22 20 43 4f 4c 4c 41 54 45 20 3c 70 61  ng " COLLATE <pa
27fa0 72 65 6e 74 2d 63 6f 6c 6c 61 74 69 6f 6e 3e 22  rent-collation>"
27fb0 2c 20 77 68 65 72 65 0a 2a 2a 20 3c 70 61 72 65  , where.** <pare
27fc0 6e 74 2d 63 6f 6c 6c 61 74 69 6f 6e 3e 20 69 73  nt-collation> is
27fd0 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c   the default col
27fe0 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
27ff0 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20 63 6f  of the parent co
28000 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lumn..*/.static 
28010 76 6f 69 64 20 73 68 65 6c 6c 46 6b 65 79 43 6f  void shellFkeyCo
28020 6c 6c 61 74 65 43 6c 61 75 73 65 28 0a 20 20 73  llateClause(.  s
28030 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
28040 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 56 61 6c  pCtx,.  int nVal
28050 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
28060 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 73  e **apVal.){.  s
28070 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
28080 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
28090 68 61 6e 64 6c 65 28 70 43 74 78 29 3b 0a 20 20  handle(pCtx);.  
280a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72  const char *zPar
280b0 65 6e 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ent;.  const cha
280c0 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6c 3b 0a 20  r *zParentCol;. 
280d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61   const char *zPa
280e0 72 65 6e 74 53 65 71 3b 0a 20 20 63 6f 6e 73 74  rentSeq;.  const
280f0 20 63 68 61 72 20 2a 7a 43 68 69 6c 64 3b 0a 20   char *zChild;. 
28100 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68   const char *zCh
28110 69 6c 64 43 6f 6c 3b 0a 20 20 63 6f 6e 73 74 20  ildCol;.  const 
28120 63 68 61 72 20 2a 7a 43 68 69 6c 64 53 65 71 20  char *zChildSeq 
28130 3d 20 30 3b 20 20 2f 2a 20 49 6e 69 74 69 61 6c  = 0;  /* Initial
28140 69 7a 65 20 74 6f 20 61 76 6f 69 64 20 66 61 6c  ize to avoid fal
28150 73 65 2d 70 6f 73 69 74 69 76 65 20 77 61 72 6e  se-positive warn
28160 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b  ing */.  int rc;
28170 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 56 61 6c  ..  assert( nVal
28180 3d 3d 34 20 29 3b 0a 20 20 7a 50 61 72 65 6e 74  ==4 );.  zParent
28190 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
281a0 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
281b0 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20  xt(apVal[0]);.  
281c0 7a 50 61 72 65 6e 74 43 6f 6c 20 3d 20 28 63 6f  zParentCol = (co
281d0 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
281e0 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56  3_value_text(apV
281f0 61 6c 5b 31 5d 29 3b 0a 20 20 7a 43 68 69 6c 64  al[1]);.  zChild
28200 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
28210 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
28220 78 74 28 61 70 56 61 6c 5b 32 5d 29 3b 0a 20 20  xt(apVal[2]);.  
28230 7a 43 68 69 6c 64 43 6f 6c 20 3d 20 28 63 6f 6e  zChildCol = (con
28240 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
28250 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61  _value_text(apVa
28260 6c 5b 33 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65  l[3]);..  sqlite
28270 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43  3_result_text(pC
28280 74 78 2c 20 22 22 2c 20 2d 31 2c 20 53 51 4c 49  tx, "", -1, SQLI
28290 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 63  TE_STATIC);.  rc
282a0 20 3d 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65   = sqlite3_table
282b0 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61  _column_metadata
282c0 28 0a 20 20 20 20 20 20 64 62 2c 20 22 6d 61 69  (.      db, "mai
282d0 6e 22 2c 20 7a 50 61 72 65 6e 74 2c 20 7a 50 61  n", zParent, zPa
282e0 72 65 6e 74 43 6f 6c 2c 20 30 2c 20 26 7a 50 61  rentCol, 0, &zPa
282f0 72 65 6e 74 53 65 71 2c 20 30 2c 20 30 2c 20 30  rentSeq, 0, 0, 0
28300 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d  .  );.  if( rc==
28310 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28320 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61   rc = sqlite3_ta
28330 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64  ble_column_metad
28340 61 74 61 28 0a 20 20 20 20 20 20 20 20 64 62 2c  ata(.        db,
28350 20 22 6d 61 69 6e 22 2c 20 7a 43 68 69 6c 64 2c   "main", zChild,
28360 20 7a 43 68 69 6c 64 43 6f 6c 2c 20 30 2c 20 26   zChildCol, 0, &
28370 7a 43 68 69 6c 64 53 65 71 2c 20 30 2c 20 30 2c  zChildSeq, 0, 0,
28380 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20   0.    );.  }.. 
28390 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
283a0 4f 4b 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  OK && sqlite3_st
283b0 72 69 63 6d 70 28 7a 50 61 72 65 6e 74 53 65 71  ricmp(zParentSeq
283c0 2c 20 7a 43 68 69 6c 64 53 65 71 29 20 29 7b 0a  , zChildSeq) ){.
283d0 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71      char *z = sq
283e0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 20  lite3_mprintf(" 
283f0 43 4f 4c 4c 41 54 45 20 25 73 22 2c 20 7a 50 61  COLLATE %s", zPa
28400 72 65 6e 74 53 65 71 29 3b 0a 20 20 20 20 73 71  rentSeq);.    sq
28410 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
28420 74 28 70 43 74 78 2c 20 7a 2c 20 2d 31 2c 20 53  t(pCtx, z, -1, S
28430 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
28440 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
28450 65 65 28 7a 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f  ee(z);.  }.}.../
28460 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65  *.** The impleme
28470 6e 74 61 74 69 6f 6e 20 6f 66 20 64 6f 74 2d 63  ntation of dot-c
28480 6f 6d 6d 61 6e 64 20 22 2e 6c 69 6e 74 20 66 6b  ommand ".lint fk
28490 65 79 2d 69 6e 64 65 78 65 73 22 2e 0a 2a 2f 0a  ey-indexes"..*/.
284a0 73 74 61 74 69 63 20 69 6e 74 20 6c 69 6e 74 46  static int lintF
284b0 6b 65 79 49 6e 64 65 78 65 73 28 0a 20 20 53 68  keyIndexes(.  Sh
284c0 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65  ellState *pState
284d0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
284e0 20 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74   Current shell t
284f0 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 63  ool state */.  c
28500 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20  har **azArg,    
28510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
28520 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d  * Array of argum
28530 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 64  ents passed to d
28540 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ot command */.  
28550 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20 20  int nArg        
28560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28570 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
28580 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20  ries in azArg[] 
28590 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20  */.){.  sqlite3 
285a0 2a 64 62 20 3d 20 70 53 74 61 74 65 2d 3e 64 62  *db = pState->db
285b0 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62  ;       /* Datab
285c0 61 73 65 20 68 61 6e 64 6c 65 20 74 6f 20 71 75  ase handle to qu
285d0 65 72 79 20 22 6d 61 69 6e 22 20 64 62 20 6f 66  ery "main" db of
285e0 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 6f 75 74 20   */.  FILE *out 
285f0 3d 20 70 53 74 61 74 65 2d 3e 6f 75 74 3b 20 20  = pState->out;  
28600 20 20 20 20 20 20 2f 2a 20 53 74 72 65 61 6d 20        /* Stream 
28610 74 6f 20 77 72 69 74 65 20 6e 6f 6e 2d 65 72 72  to write non-err
28620 6f 72 20 6f 75 74 70 75 74 20 74 6f 20 2a 2f 0a  or output to */.
28630 20 20 69 6e 74 20 62 56 65 72 62 6f 73 65 20 3d    int bVerbose =
28640 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
28650 20 20 2f 2a 20 49 66 20 2d 76 65 72 62 6f 73 65    /* If -verbose
28660 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20   is present */. 
28670 20 69 6e 74 20 62 47 72 6f 75 70 42 79 50 61 72   int bGroupByPar
28680 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ent = 0;        
28690 20 2f 2a 20 49 66 20 2d 67 72 6f 75 70 62 79 70   /* If -groupbyp
286a0 61 72 65 6e 74 20 69 73 20 70 72 65 73 65 6e 74  arent is present
286b0 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   */.  int i;    
286c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
286d0 20 20 20 20 20 20 2f 2a 20 54 6f 20 69 74 65 72        /* To iter
286e0 61 74 65 20 74 68 72 6f 75 67 68 20 61 7a 41 72  ate through azAr
286f0 67 5b 5d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  g[] */.  const c
28700 68 61 72 20 2a 7a 49 6e 64 65 6e 74 20 3d 20 22  har *zIndent = "
28710 22 3b 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20  ";       /* How 
28720 6d 75 63 68 20 74 6f 20 69 6e 64 65 6e 74 20 43  much to indent C
28730 52 45 41 54 45 20 49 4e 44 45 58 20 62 79 20 2a  REATE INDEX by *
28740 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20  /.  int rc;     
28750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28760 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
28770 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  de */.  sqlite3_
28780 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30 3b 20  stmt *pSql = 0; 
28790 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 69          /* Compi
287a0 6c 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 53  led version of S
287b0 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 6c  QL statement bel
287c0 6f 77 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ow */..  /*.  **
287d0 20 54 68 69 73 20 53 45 4c 45 43 54 20 73 74 61   This SELECT sta
287e0 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 6f  tement returns o
287f0 6e 65 20 72 6f 77 20 66 6f 72 20 65 61 63 68 20  ne row for each 
28800 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
28810 74 72 61 69 6e 74 0a 20 20 2a 2a 20 69 6e 20 74  traint.  ** in t
28820 68 65 20 73 63 68 65 6d 61 20 6f 66 20 74 68 65  he schema of the
28830 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e 20   main database. 
28840 54 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  The column value
28850 73 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  s are:.  **.  **
28860 20 30 2e 20 54 68 65 20 74 65 78 74 20 6f 66 20   0. The text of 
28870 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  an SQL statement
28880 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 20 20 2a   similar to:.  *
28890 2a 0a 20 20 2a 2a 20 20 20 20 20 20 22 45 58 50  *.  **      "EXP
288a0 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
288b0 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 63 68  SELECT 1 FROM ch
288c0 69 6c 64 5f 74 61 62 6c 65 20 57 48 45 52 45 20  ild_table WHERE 
288d0 63 68 69 6c 64 5f 6b 65 79 3d 3f 22 0a 20 20 2a  child_key=?".  *
288e0 2a 0a 20 20 2a 2a 20 20 20 20 54 68 69 73 20 53  *.  **    This S
288f0 45 4c 45 43 54 20 69 73 20 73 69 6d 69 6c 61 72  ELECT is similar
28900 20 74 6f 20 74 68 65 20 6f 6e 65 20 74 68 61 74   to the one that
28910 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79   the foreign key
28920 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  s implementation
28930 0a 20 20 2a 2a 20 20 20 20 6e 65 65 64 73 20 74  .  **    needs t
28940 6f 20 72 75 6e 20 69 6e 74 65 72 6e 61 6c 6c 79  o run internally
28950 20 6f 6e 20 63 68 69 6c 64 20 74 61 62 6c 65 73   on child tables
28960 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  . If there is an
28970 20 69 6e 64 65 78 20 74 68 61 74 20 63 61 6e 0a   index that can.
28980 20 20 2a 2a 20 20 20 20 62 65 20 75 73 65 64 20    **    be used 
28990 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 69 73  to optimize this
289a0 20 71 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20   query, then it 
289b0 63 61 6e 20 61 6c 73 6f 20 62 65 20 75 73 65 64  can also be used
289c0 20 62 79 20 74 68 65 20 46 4b 0a 20 20 2a 2a 20   by the FK.  ** 
289d0 20 20 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f     implementatio
289e0 6e 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 44 45  n to optimize DE
289f0 4c 45 54 45 20 6f 72 20 55 50 44 41 54 45 20 73  LETE or UPDATE s
28a00 74 61 74 65 6d 65 6e 74 73 20 6f 6e 20 74 68 65  tatements on the
28a10 20 70 61 72 65 6e 74 0a 20 20 2a 2a 20 20 20 20   parent.  **    
28a20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  table..  **.  **
28a30 20 31 2e 20 41 20 47 4c 4f 42 20 70 61 74 74 65   1. A GLOB patte
28a40 72 6e 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20  rn suitable for 
28a50 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28  sqlite3_strglob(
28a60 29 2e 20 49 66 20 74 68 65 20 70 6c 61 6e 20 6f  ). If the plan o
28a70 75 74 70 75 74 20 62 79 0a 20 20 2a 2a 20 20 20  utput by.  **   
28a80 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45   the EXPLAIN QUE
28a90 52 59 20 50 4c 41 4e 20 63 6f 6d 6d 61 6e 64 20  RY PLAN command 
28aa0 6d 61 74 63 68 65 73 20 74 68 69 73 20 70 61 74  matches this pat
28ab0 74 65 72 6e 2c 20 74 68 65 6e 20 74 68 65 20 73  tern, then the s
28ac0 63 68 65 6d 61 0a 20 20 2a 2a 20 20 20 20 63 6f  chema.  **    co
28ad0 6e 74 61 69 6e 73 20 61 6e 20 69 6e 64 65 78 20  ntains an index 
28ae0 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
28af0 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 65   to optimize the
28b00 20 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a   query..  **.  *
28b10 2a 20 32 2e 20 48 75 6d 61 6e 20 72 65 61 64 61  * 2. Human reada
28b20 62 6c 65 20 74 65 78 74 20 74 68 61 74 20 64 65  ble text that de
28b30 73 63 72 69 62 65 73 20 74 68 65 20 63 68 69 6c  scribes the chil
28b40 64 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  d table and colu
28b50 6d 6e 73 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20  mns. e.g..  **. 
28b60 20 2a 2a 20 20 20 20 20 20 20 22 63 68 69 6c 64   **       "child
28b70 5f 74 61 62 6c 65 28 63 68 69 6c 64 5f 6b 65 79  _table(child_key
28b80 31 2c 20 63 68 69 6c 64 5f 6b 65 79 32 29 22 0a  1, child_key2)".
28b90 20 20 2a 2a 0a 20 20 2a 2a 20 33 2e 20 48 75 6d    **.  ** 3. Hum
28ba0 61 6e 20 72 65 61 64 61 62 6c 65 20 74 65 78 74  an readable text
28bb0 20 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20   that describes 
28bc0 74 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65  the parent table
28bd0 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 2e 20 65 2e   and columns. e.
28be0 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  g..  **.  **    
28bf0 20 20 20 22 70 61 72 65 6e 74 5f 74 61 62 6c 65     "parent_table
28c00 28 70 61 72 65 6e 74 5f 6b 65 79 31 2c 20 70 61  (parent_key1, pa
28c10 72 65 6e 74 5f 6b 65 79 32 29 22 0a 20 20 2a 2a  rent_key2)".  **
28c20 0a 20 20 2a 2a 20 34 2e 20 41 20 66 75 6c 6c 20  .  ** 4. A full 
28c30 43 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61  CREATE INDEX sta
28c40 74 65 6d 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e  tement for an in
28c50 64 65 78 20 74 68 61 74 20 63 6f 75 6c 64 20 62  dex that could b
28c60 65 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 20  e used to.  **  
28c70 20 20 6f 70 74 69 6d 69 7a 65 20 44 45 4c 45 54    optimize DELET
28c80 45 20 6f 72 20 55 50 44 41 54 45 20 73 74 61 74  E or UPDATE stat
28c90 65 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61  ements on the pa
28ca0 72 65 6e 74 20 74 61 62 6c 65 2e 20 65 2e 67 2e  rent table. e.g.
28cb0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
28cc0 20 22 43 52 45 41 54 45 20 49 4e 44 45 58 20 63   "CREATE INDEX c
28cd0 68 69 6c 64 5f 74 61 62 6c 65 5f 63 68 69 6c 64  hild_table_child
28ce0 5f 6b 65 79 20 4f 4e 20 63 68 69 6c 64 5f 74 61  _key ON child_ta
28cf0 62 6c 65 28 63 68 69 6c 64 5f 6b 65 79 29 22 0a  ble(child_key)".
28d00 20 20 2a 2a 0a 20 20 2a 2a 20 35 2e 20 54 68 65    **.  ** 5. The
28d10 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 70 61 72   name of the par
28d20 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a  ent table..  **.
28d30 20 20 2a 2a 20 54 68 65 73 65 20 73 69 78 20 76    ** These six v
28d40 61 6c 75 65 73 20 61 72 65 20 75 73 65 64 20 62  alues are used b
28d50 79 20 74 68 65 20 43 20 6c 6f 67 69 63 20 62 65  y the C logic be
28d60 6c 6f 77 20 74 6f 20 67 65 6e 65 72 61 74 65 20  low to generate 
28d70 74 68 65 20 72 65 70 6f 72 74 2e 0a 20 20 2a 2f  the report..  */
28d80 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
28d90 53 71 6c 20 3d 0a 20 20 22 53 45 4c 45 43 54 20  Sql =.  "SELECT 
28da0 22 0a 20 20 20 20 22 20 20 20 20 20 27 45 58 50  ".    "     'EXP
28db0 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
28dc0 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 27 20  SELECT 1 FROM ' 
28dd0 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61 6d 65 29  || quote(s.name)
28de0 20 7c 7c 20 27 20 57 48 45 52 45 20 27 22 0a 20   || ' WHERE '". 
28df0 20 20 20 22 20 20 7c 7c 20 67 72 6f 75 70 5f 63     "  || group_c
28e00 6f 6e 63 61 74 28 71 75 6f 74 65 28 73 2e 6e 61  oncat(quote(s.na
28e10 6d 65 29 20 7c 7c 20 27 2e 27 20 7c 7c 20 71 75  me) || '.' || qu
28e20 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d 29 20 7c 7c  ote(f.[from]) ||
28e30 20 27 3d 3f 27 20 22 0a 20 20 20 20 22 20 20 7c   '=?' ".    "  |
28e40 7c 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63  | fkey_collate_c
28e50 6c 61 75 73 65 28 22 0a 20 20 20 20 22 20 20 20  lause(".    "   
28e60 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d 2c 20 43      f.[table], C
28e70 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f 5d 2c 20  OALESCE(f.[to], 
28e80 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73 2e 6e 61 6d  p.[name]), s.nam
28e90 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29 2c 27 20 41  e, f.[from]),' A
28ea0 4e 44 20 27 29 22 0a 20 20 20 20 22 2c 20 22 0a  ND ')".    ", ".
28eb0 20 20 20 20 22 20 20 20 20 20 27 53 45 41 52 43      "     'SEARC
28ec0 48 20 54 41 42 4c 45 20 27 20 7c 7c 20 73 2e 6e  H TABLE ' || s.n
28ed0 61 6d 65 20 7c 7c 20 27 20 55 53 49 4e 47 20 43  ame || ' USING C
28ee0 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 2a 28 27  OVERING INDEX*('
28ef0 22 0a 20 20 20 20 22 20 20 7c 7c 20 67 72 6f 75  ".    "  || grou
28f00 70 5f 63 6f 6e 63 61 74 28 27 2a 3d 3f 27 2c 20  p_concat('*=?', 
28f10 27 20 41 4e 44 20 27 29 20 7c 7c 20 27 29 27 22  ' AND ') || ')'"
28f20 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20  .    ", ".    " 
28f30 20 20 20 20 73 2e 6e 61 6d 65 20 20 7c 7c 20 27      s.name  || '
28f40 28 27 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63  (' || group_conc
28f50 61 74 28 66 2e 5b 66 72 6f 6d 5d 2c 20 20 27 2c  at(f.[from],  ',
28f60 20 27 29 20 7c 7c 20 27 29 27 22 0a 20 20 20 20   ') || ')'".    
28f70 22 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20 66  ", ".    "     f
28f80 2e 5b 74 61 62 6c 65 5d 20 7c 7c 20 27 28 27 20  .[table] || '(' 
28f90 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  || group_concat(
28fa0 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f 5d 2c  COALESCE(f.[to],
28fb0 20 70 2e 5b 6e 61 6d 65 5d 29 29 20 7c 7c 20 27   p.[name])) || '
28fc0 29 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20  )'".    ", ".   
28fd0 20 22 20 20 20 20 20 27 43 52 45 41 54 45 20 49   "     'CREATE I
28fe0 4e 44 45 58 20 27 20 7c 7c 20 71 75 6f 74 65 28  NDEX ' || quote(
28ff0 73 2e 6e 61 6d 65 20 7c 7c 27 5f 27 7c 7c 20 67  s.name ||'_'|| g
29000 72 6f 75 70 5f 63 6f 6e 63 61 74 28 66 2e 5b 66  roup_concat(f.[f
29010 72 6f 6d 5d 2c 20 27 5f 27 29 29 22 0a 20 20 20  rom], '_'))".   
29020 20 22 20 20 7c 7c 20 27 20 4f 4e 20 27 20 7c 7c   "  || ' ON ' ||
29030 20 71 75 6f 74 65 28 73 2e 6e 61 6d 65 29 20 7c   quote(s.name) |
29040 7c 20 27 28 27 22 0a 20 20 20 20 22 20 20 7c 7c  | '('".    "  ||
29050 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 71 75   group_concat(qu
29060 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d 29 20 7c 7c  ote(f.[from]) ||
29070 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 66  ".    "        f
29080 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75  key_collate_clau
29090 73 65 28 22 0a 20 20 20 20 22 20 20 20 20 20 20  se(".    "      
290a0 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d 2c 20 43      f.[table], C
290b0 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f 5d 2c 20  OALESCE(f.[to], 
290c0 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73 2e 6e 61 6d  p.[name]), s.nam
290d0 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29 2c 20 27 2c  e, f.[from]), ',
290e0 20 27 29 22 0a 20 20 20 20 22 20 20 7c 7c 20 27   ')".    "  || '
290f0 29 3b 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20  );'".    ", ".  
29100 20 20 22 20 20 20 20 20 66 2e 5b 74 61 62 6c 65    "     f.[table
29110 5d 20 22 0a 20 20 20 20 22 46 52 4f 4d 20 73 71  ] ".    "FROM sq
29120 6c 69 74 65 5f 6d 61 73 74 65 72 20 41 53 20 73  lite_master AS s
29130 2c 20 70 72 61 67 6d 61 5f 66 6f 72 65 69 67 6e  , pragma_foreign
29140 5f 6b 65 79 5f 6c 69 73 74 28 73 2e 6e 61 6d 65  _key_list(s.name
29150 29 20 41 53 20 66 20 22 0a 20 20 20 20 22 4c 45  ) AS f ".    "LE
29160 46 54 20 4a 4f 49 4e 20 70 72 61 67 6d 61 5f 74  FT JOIN pragma_t
29170 61 62 6c 65 5f 69 6e 66 6f 20 41 53 20 70 20 4f  able_info AS p O
29180 4e 20 28 70 6b 2d 31 3d 73 65 71 20 41 4e 44 20  N (pk-1=seq AND 
29190 70 2e 61 72 67 3d 66 2e 5b 74 61 62 6c 65 5d 29  p.arg=f.[table])
291a0 20 22 0a 20 20 20 20 22 47 52 4f 55 50 20 42 59   ".    "GROUP BY
291b0 20 73 2e 6e 61 6d 65 2c 20 66 2e 69 64 20 22 0a   s.name, f.id ".
291c0 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 28 43      "ORDER BY (C
291d0 41 53 45 20 57 48 45 4e 20 3f 20 54 48 45 4e 20  ASE WHEN ? THEN 
291e0 66 2e 5b 74 61 62 6c 65 5d 20 45 4c 53 45 20 73  f.[table] ELSE s
291f0 2e 6e 61 6d 65 20 45 4e 44 29 22 0a 20 20 3b 0a  .name END)".  ;.
29200 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47    const char *zG
29210 6c 6f 62 49 50 4b 20 3d 20 22 53 45 41 52 43 48  lobIPK = "SEARCH
29220 20 54 41 42 4c 45 20 2a 20 55 53 49 4e 47 20 49   TABLE * USING I
29230 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
29240 45 59 20 28 72 6f 77 69 64 3d 3f 29 22 3b 0a 0a  EY (rowid=?)";..
29250 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 6e 41 72    for(i=2; i<nAr
29260 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74  g; i++){.    int
29270 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a   n = strlen30(az
29280 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28  Arg[i]);.    if(
29290 20 6e 3e 31 20 26 26 20 73 71 6c 69 74 65 33 5f   n>1 && sqlite3_
292a0 73 74 72 6e 69 63 6d 70 28 22 2d 76 65 72 62 6f  strnicmp("-verbo
292b0 73 65 22 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 6e  se", azArg[i], n
292c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 56  )==0 ){.      bV
292d0 65 72 62 6f 73 65 20 3d 20 31 3b 0a 20 20 20 20  erbose = 1;.    
292e0 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 6e  }.    else if( n
292f0 3e 31 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  >1 && sqlite3_st
29300 72 6e 69 63 6d 70 28 22 2d 67 72 6f 75 70 62 79  rnicmp("-groupby
29310 70 61 72 65 6e 74 22 2c 20 61 7a 41 72 67 5b 69  parent", azArg[i
29320 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ], n)==0 ){.    
29330 20 20 62 47 72 6f 75 70 42 79 50 61 72 65 6e 74    bGroupByParent
29340 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 49 6e 64   = 1;.      zInd
29350 65 6e 74 20 3d 20 22 20 20 20 20 22 3b 0a 20 20  ent = "    ";.  
29360 20 20 7d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20    }.    else{.  
29370 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
29380 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 25  tderr, "Usage: %
29390 73 20 25 73 20 3f 2d 76 65 72 62 6f 73 65 3f 20  s %s ?-verbose? 
293a0 3f 2d 67 72 6f 75 70 62 79 70 61 72 65 6e 74 3f  ?-groupbyparent?
293b0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 61  \n",.          a
293c0 7a 41 72 67 5b 30 5d 2c 20 61 7a 41 72 67 5b 31  zArg[0], azArg[1
293d0 5d 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  ].      );.     
293e0 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
293f0 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  RROR;.    }.  }.
29400 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74  .  /* Register t
29410 68 65 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f  he fkey_collate_
29420 63 6c 61 75 73 65 28 29 20 53 51 4c 20 66 75 6e  clause() SQL fun
29430 63 74 69 6f 6e 20 2a 2f 0a 20 20 72 63 20 3d 20  ction */.  rc = 
29440 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
29450 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 66 6b 65  unction(db, "fke
29460 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65  y_collate_clause
29470 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 4, SQLITE_UTF
29480 38 2c 0a 20 20 20 20 20 20 30 2c 20 73 68 65 6c  8,.      0, shel
29490 6c 46 6b 65 79 43 6f 6c 6c 61 74 65 43 6c 61 75  lFkeyCollateClau
294a0 73 65 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 0a 0a  se, 0, 0.  );...
294b0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
294c0 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  _OK ){.    rc = 
294d0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
294e0 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  v2(db, zSql, -1,
294f0 20 26 70 53 71 6c 2c 20 30 29 3b 0a 20 20 7d 0a   &pSql, 0);.  }.
29500 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
29510 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  _OK ){.    sqlit
29520 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 71 6c  e3_bind_int(pSql
29530 2c 20 31 2c 20 62 47 72 6f 75 70 42 79 50 61 72  , 1, bGroupByPar
29540 65 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  ent);.  }..  if(
29550 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
29560 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20  {.    int rc2;. 
29570 20 20 20 63 68 61 72 20 2a 7a 50 72 65 76 20 3d     char *zPrev =
29580 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 53   0;.    while( S
29590 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
295a0 65 33 5f 73 74 65 70 28 70 53 71 6c 29 20 29 7b  e3_step(pSql) ){
295b0 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d  .      int res =
295c0 20 2d 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   -1;.      sqlit
295d0 65 33 5f 73 74 6d 74 20 2a 70 45 78 70 6c 61 69  e3_stmt *pExplai
295e0 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e  n = 0;.      con
295f0 73 74 20 63 68 61 72 20 2a 7a 45 51 50 20 3d 20  st char *zEQP = 
29600 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
29610 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
29620 28 70 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20 20  (pSql, 0);.     
29630 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47 6c   const char *zGl
29640 6f 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ob = (const char
29650 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
29660 5f 74 65 78 74 28 70 53 71 6c 2c 20 31 29 3b 0a  _text(pSql, 1);.
29670 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
29680 20 2a 7a 46 72 6f 6d 20 3d 20 28 63 6f 6e 73 74   *zFrom = (const
29690 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
296a0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
296b0 20 32 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74   2);.      const
296c0 20 63 68 61 72 20 2a 7a 54 61 72 67 65 74 20 3d   char *zTarget =
296d0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
296e0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
296f0 74 28 70 53 71 6c 2c 20 33 29 3b 0a 20 20 20 20  t(pSql, 3);.    
29700 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
29710 49 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  I = (const char*
29720 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
29730 74 65 78 74 28 70 53 71 6c 2c 20 34 29 3b 0a 20  text(pSql, 4);. 
29740 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
29750 2a 7a 50 61 72 65 6e 74 20 3d 20 28 63 6f 6e 73  *zParent = (cons
29760 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
29770 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
29780 2c 20 35 29 3b 0a 0a 20 20 20 20 20 20 72 63 20  , 5);..      rc 
29790 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
297a0 65 5f 76 32 28 64 62 2c 20 7a 45 51 50 2c 20 2d  e_v2(db, zEQP, -
297b0 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20 30 29  1, &pExplain, 0)
297c0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
297d0 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61  SQLITE_OK ) brea
297e0 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  k;.      if( SQL
297f0 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
29800 5f 73 74 65 70 28 70 45 78 70 6c 61 69 6e 29 20  _step(pExplain) 
29810 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
29820 20 63 68 61 72 20 2a 7a 50 6c 61 6e 20 3d 20 28   char *zPlan = (
29830 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
29840 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
29850 70 45 78 70 6c 61 69 6e 2c 20 33 29 3b 0a 20 20  pExplain, 3);.  
29860 20 20 20 20 20 20 72 65 73 20 3d 20 28 0a 20 20        res = (.  
29870 20 20 20 20 20 20 20 20 20 20 20 20 30 3d 3d 73              0==s
29880 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 7a  qlite3_strglob(z
29890 47 6c 6f 62 2c 20 7a 50 6c 61 6e 29 0a 20 20 20  Glob, zPlan).   
298a0 20 20 20 20 20 20 20 20 7c 7c 20 30 3d 3d 73 71          || 0==sq
298b0 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 7a 47  lite3_strglob(zG
298c0 6c 6f 62 49 50 4b 2c 20 7a 50 6c 61 6e 29 0a 20  lobIPK, zPlan). 
298d0 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
298e0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
298f0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45  ite3_finalize(pE
29900 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 69  xplain);.      i
29910 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
29920 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20   ) break;..     
29930 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20   if( res<0 ){.  
29940 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
29950 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
29960 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 22   internal error"
29970 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
29980 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
29990 20 20 20 20 20 20 20 69 66 28 20 62 47 72 6f 75         if( bGrou
299a0 70 42 79 50 61 72 65 6e 74 0a 20 20 20 20 20 20  pByParent.      
299b0 20 20 26 26 20 28 62 56 65 72 62 6f 73 65 20 7c    && (bVerbose |
299c0 7c 20 72 65 73 3d 3d 30 29 0a 20 20 20 20 20 20  | res==0).      
299d0 20 20 26 26 20 28 7a 50 72 65 76 3d 3d 30 20 7c    && (zPrev==0 |
299e0 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  | sqlite3_stricm
299f0 70 28 7a 50 61 72 65 6e 74 2c 20 7a 50 72 65 76  p(zParent, zPrev
29a00 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  )).        ){.  
29a10 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
29a20 74 66 28 6f 75 74 2c 20 22 2d 2d 20 50 61 72 65  tf(out, "-- Pare
29a30 6e 74 20 74 61 62 6c 65 20 25 73 5c 6e 22 2c 20  nt table %s\n", 
29a40 7a 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20 20  zParent);.      
29a50 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
29a60 28 7a 50 72 65 76 29 3b 0a 20 20 20 20 20 20 20  (zPrev);.       
29a70 20 20 20 7a 50 72 65 76 20 3d 20 73 71 6c 69 74     zPrev = sqlit
29a80 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c  e3_mprintf("%s",
29a90 20 7a 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20   zParent);.     
29aa0 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66     }..        if
29ab0 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20  ( res==0 ){.    
29ac0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
29ad0 28 6f 75 74 2c 20 22 25 73 25 73 20 2d 2d 3e 20  (out, "%s%s --> 
29ae0 25 73 5c 6e 22 2c 20 7a 49 6e 64 65 6e 74 2c 20  %s\n", zIndent, 
29af0 7a 43 49 2c 20 7a 54 61 72 67 65 74 29 3b 0a 20  zCI, zTarget);. 
29b00 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
29b10 20 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20   bVerbose ){.   
29b20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
29b30 66 28 6f 75 74 2c 20 22 25 73 2f 2a 20 6e 6f 20  f(out, "%s/* no 
29b40 65 78 74 72 61 20 69 6e 64 65 78 65 73 20 72 65  extra indexes re
29b50 71 75 69 72 65 64 20 66 6f 72 20 25 73 20 2d 3e  quired for %s ->
29b60 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20 20 20 20   %s */\n",.     
29b70 20 20 20 20 20 20 20 20 20 7a 49 6e 64 65 6e 74           zIndent
29b80 2c 20 7a 46 72 6f 6d 2c 20 7a 54 61 72 67 65 74  , zFrom, zTarget
29b90 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
29ba0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
29bb0 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
29bc0 33 5f 66 72 65 65 28 7a 50 72 65 76 29 3b 0a 0a  3_free(zPrev);..
29bd0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
29be0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
29bf0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
29c00 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  , "%s\n", sqlite
29c10 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
29c20 20 20 20 7d 0a 0a 20 20 20 20 72 63 32 20 3d 20     }..    rc2 = 
29c30 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
29c40 28 70 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20  (pSql);.    if( 
29c50 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
29c60 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20   rc2!=SQLITE_OK 
29c70 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63  ){.      rc = rc
29c80 32 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  2;.      raw_pri
29c90 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 5c  ntf(stderr, "%s\
29ca0 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
29cb0 73 67 28 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20  sg(db));.    }. 
29cc0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 61 77 5f   }else{.    raw_
29cd0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
29ce0 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  %s\n", sqlite3_e
29cf0 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d 0a  rrmsg(db));.  }.
29d00 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
29d10 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
29d20 61 74 69 6f 6e 20 6f 66 20 22 2e 6c 69 6e 74 22  ation of ".lint"
29d30 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f   dot command..*/
29d40 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 69 6e 74  .static int lint
29d50 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 53 68  DotCommand(.  Sh
29d60 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65  ellState *pState
29d70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
29d80 20 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74   Current shell t
29d90 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 63  ool state */.  c
29da0 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20  har **azArg,    
29db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29dc0 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d  * Array of argum
29dd0 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 64  ents passed to d
29de0 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20  ot command */.  
29df0 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20 20  int nArg        
29e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e10 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74  /* Number of ent
29e20 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20  ries in azArg[] 
29e30 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20  */.){.  int n;. 
29e40 20 6e 20 3d 20 28 6e 41 72 67 3e 3d 32 20 3f 20   n = (nArg>=2 ? 
29e50 73 74 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 31  strlen30(azArg[1
29e60 5d 29 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 6e  ]) : 0);.  if( n
29e70 3c 31 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74  <1 || sqlite3_st
29e80 72 6e 69 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  rnicmp(azArg[1],
29e90 20 22 66 6b 65 79 2d 69 6e 64 65 78 65 73 22 2c   "fkey-indexes",
29ea0 20 6e 29 20 29 20 67 6f 74 6f 20 75 73 61 67 65   n) ) goto usage
29eb0 3b 0a 20 20 72 65 74 75 72 6e 20 6c 69 6e 74 46  ;.  return lintF
29ec0 6b 65 79 49 6e 64 65 78 65 73 28 70 53 74 61 74  keyIndexes(pStat
29ed0 65 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b  e, azArg, nArg);
29ee0 0a 0a 20 75 73 61 67 65 3a 0a 20 20 72 61 77 5f  .. usage:.  raw_
29ef0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
29f00 55 73 61 67 65 20 25 73 20 73 75 62 2d 63 6f 6d  Usage %s sub-com
29f10 6d 61 6e 64 20 3f 73 77 69 74 63 68 65 73 2e 2e  mand ?switches..
29f20 2e 3f 5c 6e 22 2c 20 61 7a 41 72 67 5b 30 5d 29  .?\n", azArg[0])
29f30 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73  ;.  raw_printf(s
29f40 74 64 65 72 72 2c 20 22 57 68 65 72 65 20 73 75  tderr, "Where su
29f50 62 2d 63 6f 6d 6d 61 6e 64 73 20 61 72 65 3a 5c  b-commands are:\
29f60 6e 22 29 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74  n");.  raw_print
29f70 66 28 73 74 64 65 72 72 2c 20 22 20 20 20 20 66  f(stderr, "    f
29f80 6b 65 79 2d 69 6e 64 65 78 65 73 5c 6e 22 29 3b  key-indexes\n");
29f90 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
29fa0 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 23 69 66 20 21  _ERROR;.}..#if !
29fb0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
29fc0 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
29fd0 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
29fe0 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 29 0a 2f  ITE_HAVE_ZLIB)./
29ff0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a000 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a010 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a020 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2a040 2a 0a 2a 2a 20 54 68 65 20 22 2e 61 72 63 68 69  *.** The ".archi
2a050 76 65 22 20 6f 72 20 22 2e 61 72 22 20 63 6f 6d  ve" or ".ar" com
2a060 6d 61 6e 64 2e 0a 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  mand..*/../*.** 
2a070 53 74 72 75 63 74 75 72 65 20 72 65 70 72 65 73  Structure repres
2a080 65 6e 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20  enting a single 
2a090 22 2e 61 72 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a  ".ar" command..*
2a0a0 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
2a0b0 20 41 72 43 6f 6d 6d 61 6e 64 20 41 72 43 6f 6d   ArCommand ArCom
2a0c0 6d 61 6e 64 3b 0a 73 74 72 75 63 74 20 41 72 43  mand;.struct ArC
2a0d0 6f 6d 6d 61 6e 64 20 7b 0a 20 20 75 38 20 65 43  ommand {.  u8 eC
2a0e0 6d 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  md;             
2a0f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
2a100 20 41 52 5f 43 4d 44 5f 2a 20 76 61 6c 75 65 20   AR_CMD_* value 
2a110 2a 2f 0a 20 20 75 38 20 62 56 65 72 62 6f 73 65  */.  u8 bVerbose
2a120 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2a130 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
2a140 2d 2d 76 65 72 62 6f 73 65 20 2a 2f 0a 20 20 75  --verbose */.  u
2a150 38 20 62 5a 69 70 3b 20 20 20 20 20 20 20 20 20  8 bZip;         
2a160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a170 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 61 72  * True if the ar
2a180 63 68 69 76 65 20 69 73 20 61 20 5a 49 50 20 2a  chive is a ZIP *
2a190 2f 0a 20 20 75 38 20 62 44 72 79 52 75 6e 3b 20  /.  u8 bDryRun; 
2a1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1b0 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 2d      /* True if -
2a1c0 2d 64 72 79 2d 72 75 6e 20 2a 2f 0a 20 20 75 38  -dry-run */.  u8
2a1d0 20 62 41 70 70 65 6e 64 3b 20 20 20 20 20 20 20   bAppend;       
2a1e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a1f0 20 54 72 75 65 20 69 66 20 2d 2d 61 70 70 65 6e   True if --appen
2a200 64 20 2a 2f 0a 20 20 75 38 20 66 72 6f 6d 43 6d  d */.  u8 fromCm
2a210 64 4c 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20  dLine;          
2a220 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 20 66 72         /* Run fr
2a230 6f 6d 20 2d 41 20 69 6e 73 74 65 61 64 20 6f 66  om -A instead of
2a240 20 2e 61 72 63 68 69 76 65 20 2a 2f 0a 20 20 69   .archive */.  i
2a250 6e 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20 20  nt nArg;        
2a260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a270 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6d 6d  * Number of comm
2a280 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  and arguments */
2a290 0a 20 20 63 68 61 72 20 2a 7a 53 72 63 54 61 62  .  char *zSrcTab
2a2a0 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
2a2b0 20 20 20 2f 2a 20 22 73 71 6c 61 72 22 2c 20 22     /* "sqlar", "
2a2c0 7a 69 70 66 69 6c 65 28 24 66 69 6c 65 29 22 20  zipfile($file)" 
2a2d0 6f 72 20 22 7a 69 70 22 20 2a 2f 0a 20 20 63 6f  or "zip" */.  co
2a2e0 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b  nst char *zFile;
2a2f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a300 20 2d 2d 66 69 6c 65 20 61 72 67 75 6d 65 6e 74   --file argument
2a310 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63  , or NULL */.  c
2a320 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 69 72 3b  onst char *zDir;
2a330 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a340 2a 20 2d 2d 64 69 72 65 63 74 6f 72 79 20 61 72  * --directory ar
2a350 67 75 6d 65 6e 74 2c 20 6f 72 20 4e 55 4c 4c 20  gument, or NULL 
2a360 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72  */.  char **azAr
2a370 67 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g;              
2a380 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
2a390 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   command argumen
2a3a0 74 73 20 2a 2f 0a 20 20 53 68 65 6c 6c 53 74 61  ts */.  ShellSta
2a3b0 74 65 20 2a 70 3b 20 20 20 20 20 20 20 20 20 20  te *p;          
2a3c0 20 20 20 20 20 20 20 20 2f 2a 20 53 68 65 6c 6c          /* Shell
2a3d0 20 73 74 61 74 65 20 2a 2f 0a 20 20 73 71 6c 69   state */.  sqli
2a3e0 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
2a3f0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
2a400 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
2a410 6e 67 20 74 68 65 20 61 72 63 68 69 76 65 20 2a  ng the archive *
2a420 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  /.};../*.** Prin
2a430 74 20 61 20 75 73 61 67 65 20 6d 65 73 73 61 67  t a usage messag
2a440 65 20 66 6f 72 20 74 68 65 20 2e 61 72 20 63 6f  e for the .ar co
2a450 6d 6d 61 6e 64 20 74 6f 20 73 74 64 65 72 72 20  mmand to stderr 
2a460 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
2a470 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 73 74 61 74  E_ERROR..*/.stat
2a480 69 63 20 69 6e 74 20 61 72 55 73 61 67 65 28 46  ic int arUsage(F
2a490 49 4c 45 20 2a 66 29 7b 0a 20 20 73 68 6f 77 48  ILE *f){.  showH
2a4a0 65 6c 70 28 66 2c 22 61 72 63 68 69 76 65 22 29  elp(f,"archive")
2a4b0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2a4c0 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a  E_ERROR;.}../*.*
2a4d0 2a 20 50 72 69 6e 74 20 61 6e 20 65 72 72 6f 72  * Print an error
2a4e0 20 6d 65 73 73 61 67 65 20 66 6f 72 20 74 68 65   message for the
2a4f0 20 2e 61 72 20 63 6f 6d 6d 61 6e 64 20 74 6f 20   .ar command to 
2a500 73 74 64 65 72 72 20 61 6e 64 20 72 65 74 75 72  stderr and retur
2a510 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52  n .** SQLITE_ERR
2a520 4f 52 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OR..*/.static in
2a530 74 20 61 72 45 72 72 6f 72 4d 73 67 28 41 72 43  t arErrorMsg(ArC
2a540 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 63 6f 6e  ommand *pAr, con
2a550 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e  st char *zFmt, .
2a560 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
2a570 70 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  p;.  char *z;.  
2a580 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d  va_start(ap, zFm
2a590 74 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  t);.  z = sqlite
2a5a0 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c  3_vmprintf(zFmt,
2a5b0 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
2a5c0 70 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74  p);.  utf8_print
2a5d0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
2a5e0 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 69  : %s\n", z);.  i
2a5f0 66 28 20 70 41 72 2d 3e 66 72 6f 6d 43 6d 64 4c  f( pAr->fromCmdL
2a600 69 6e 65 20 29 7b 0a 20 20 20 20 75 74 66 38 5f  ine ){.    utf8_
2a610 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2a620 55 73 65 20 5c 22 2d 41 5c 22 20 66 6f 72 20 6d  Use \"-A\" for m
2a630 6f 72 65 20 68 65 6c 70 5c 6e 22 29 3b 0a 20 20  ore help\n");.  
2a640 7d 65 6c 73 65 7b 0a 20 20 20 20 75 74 66 38 5f  }else{.    utf8_
2a650 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2a660 55 73 65 20 5c 22 2e 61 72 63 68 69 76 65 20 2d  Use \".archive -
2a670 2d 68 65 6c 70 5c 22 20 66 6f 72 20 6d 6f 72 65  -help\" for more
2a680 20 68 65 6c 70 5c 6e 22 29 3b 0a 20 20 7d 0a 20   help\n");.  }. 
2a690 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
2a6a0 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
2a6b0 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a  E_ERROR;.}../*.*
2a6c0 2a 20 56 61 6c 75 65 73 20 66 6f 72 20 41 72 43  * Values for ArC
2a6d0 6f 6d 6d 61 6e 64 2e 65 43 6d 64 2e 0a 2a 2f 0a  ommand.eCmd..*/.
2a6e0 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 43  #define AR_CMD_C
2a6f0 52 45 41 54 45 20 20 20 20 20 20 20 31 0a 23 64  REATE       1.#d
2a700 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 45 58 54  efine AR_CMD_EXT
2a710 52 41 43 54 20 20 20 20 20 20 32 0a 23 64 65 66  RACT      2.#def
2a720 69 6e 65 20 41 52 5f 43 4d 44 5f 4c 49 53 54 20  ine AR_CMD_LIST 
2a730 20 20 20 20 20 20 20 20 33 0a 23 64 65 66 69 6e          3.#defin
2a740 65 20 41 52 5f 43 4d 44 5f 55 50 44 41 54 45 20  e AR_CMD_UPDATE 
2a750 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e 65 20        4.#define 
2a760 41 52 5f 43 4d 44 5f 48 45 4c 50 20 20 20 20 20  AR_CMD_HELP     
2a770 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 4f 74 68      5../*.** Oth
2a780 65 72 20 28 6e 6f 6e 2d 63 6f 6d 6d 61 6e 64 29  er (non-command)
2a790 20 73 77 69 74 63 68 65 73 2e 0a 2a 2f 0a 23 64   switches..*/.#d
2a7a0 65 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f  efine AR_SWITCH_
2a7b0 56 45 52 42 4f 53 45 20 20 20 20 20 36 0a 23 64  VERBOSE     6.#d
2a7c0 65 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f  efine AR_SWITCH_
2a7d0 46 49 4c 45 20 20 20 20 20 20 20 20 37 0a 23 64  FILE        7.#d
2a7e0 65 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f  efine AR_SWITCH_
2a7f0 44 49 52 45 43 54 4f 52 59 20 20 20 38 0a 23 64  DIRECTORY   8.#d
2a800 65 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f  efine AR_SWITCH_
2a810 41 50 50 45 4e 44 20 20 20 20 20 20 39 0a 23 64  APPEND      9.#d
2a820 65 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f  efine AR_SWITCH_
2a830 44 52 59 52 55 4e 20 20 20 20 20 31 30 0a 0a 73  DRYRUN     10..s
2a840 74 61 74 69 63 20 69 6e 74 20 61 72 50 72 6f 63  tatic int arProc
2a850 65 73 73 53 77 69 74 63 68 28 41 72 43 6f 6d 6d  essSwitch(ArComm
2a860 61 6e 64 20 2a 70 41 72 2c 20 69 6e 74 20 65 53  and *pAr, int eS
2a870 77 69 74 63 68 2c 20 63 6f 6e 73 74 20 63 68 61  witch, const cha
2a880 72 20 2a 7a 41 72 67 29 7b 0a 20 20 73 77 69 74  r *zArg){.  swit
2a890 63 68 28 20 65 53 77 69 74 63 68 20 29 7b 0a 20  ch( eSwitch ){. 
2a8a0 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 43     case AR_CMD_C
2a8b0 52 45 41 54 45 3a 0a 20 20 20 20 63 61 73 65 20  REATE:.    case 
2a8c0 41 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 3a 0a  AR_CMD_EXTRACT:.
2a8d0 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f      case AR_CMD_
2a8e0 4c 49 53 54 3a 0a 20 20 20 20 63 61 73 65 20 41  LIST:.    case A
2a8f0 52 5f 43 4d 44 5f 55 50 44 41 54 45 3a 0a 20 20  R_CMD_UPDATE:.  
2a900 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 48 45    case AR_CMD_HE
2a910 4c 50 3a 0a 20 20 20 20 20 20 69 66 28 20 70 41  LP:.      if( pA
2a920 72 2d 3e 65 43 6d 64 20 29 7b 0a 20 20 20 20 20  r->eCmd ){.     
2a930 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f     return arErro
2a940 72 4d 73 67 28 70 41 72 2c 20 22 6d 75 6c 74 69  rMsg(pAr, "multi
2a950 70 6c 65 20 63 6f 6d 6d 61 6e 64 20 6f 70 74 69  ple command opti
2a960 6f 6e 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ons");.      }. 
2a970 20 20 20 20 20 70 41 72 2d 3e 65 43 6d 64 20 3d       pAr->eCmd =
2a980 20 65 53 77 69 74 63 68 3b 0a 20 20 20 20 20 20   eSwitch;.      
2a990 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
2a9a0 20 41 52 5f 53 57 49 54 43 48 5f 44 52 59 52 55   AR_SWITCH_DRYRU
2a9b0 4e 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 62 44  N:.      pAr->bD
2a9c0 72 79 52 75 6e 20 3d 20 31 3b 0a 20 20 20 20 20  ryRun = 1;.     
2a9d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
2a9e0 20 41 52 5f 53 57 49 54 43 48 5f 56 45 52 42 4f   AR_SWITCH_VERBO
2a9f0 53 45 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 62  SE:.      pAr->b
2aa00 56 65 72 62 6f 73 65 20 3d 20 31 3b 0a 20 20 20  Verbose = 1;.   
2aa10 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
2aa20 73 65 20 41 52 5f 53 57 49 54 43 48 5f 41 50 50  se AR_SWITCH_APP
2aa30 45 4e 44 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e  END:.      pAr->
2aa40 62 41 70 70 65 6e 64 20 3d 20 31 3b 0a 20 20 20  bAppend = 1;.   
2aa50 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20     /* Fall thru 
2aa60 69 6e 74 6f 20 2d 2d 66 69 6c 65 20 2a 2f 0a 20  into --file */. 
2aa70 20 20 20 63 61 73 65 20 41 52 5f 53 57 49 54 43     case AR_SWITC
2aa80 48 5f 46 49 4c 45 3a 0a 20 20 20 20 20 20 70 41  H_FILE:.      pA
2aa90 72 2d 3e 7a 46 69 6c 65 20 3d 20 7a 41 72 67 3b  r->zFile = zArg;
2aaa0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
2aab0 20 20 63 61 73 65 20 41 52 5f 53 57 49 54 43 48    case AR_SWITCH
2aac0 5f 44 49 52 45 43 54 4f 52 59 3a 0a 20 20 20 20  _DIRECTORY:.    
2aad0 20 20 70 41 72 2d 3e 7a 44 69 72 20 3d 20 7a 41    pAr->zDir = zA
2aae0 72 67 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  rg;.      break;
2aaf0 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53  .  }..  return S
2ab00 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a  QLITE_OK;.}../*.
2ab10 2a 2a 20 50 61 72 73 65 20 74 68 65 20 63 6f 6d  ** Parse the com
2ab20 6d 61 6e 64 20 6c 69 6e 65 20 66 6f 72 20 61 6e  mand line for an
2ab30 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e 64 2e 20   ".ar" command. 
2ab40 54 68 65 20 72 65 73 75 6c 74 73 20 61 72 65 20  The results are 
2ab50 77 72 69 74 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20  written into.** 
2ab60 73 74 72 75 63 74 75 72 65 20 28 2a 70 41 72 29  structure (*pAr)
2ab70 2e 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72  . SQLITE_OK is r
2ab80 65 74 75 72 6e 65 64 20 69 66 20 74 68 65 20 63  eturned if the c
2ab90 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 69 73 20 70  ommand line is p
2aba0 61 72 73 65 64 0a 2a 2a 20 73 75 63 63 65 73 73  arsed.** success
2abb0 66 75 6c 6c 79 2c 20 6f 74 68 65 72 77 69 73 65  fully, otherwise
2abc0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
2abd0 65 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  e is written to 
2abe0 73 74 64 65 72 72 20 61 6e 64 20 0a 2a 2a 20 53  stderr and .** S
2abf0 51 4c 49 54 45 5f 45 52 52 4f 52 20 72 65 74 75  QLITE_ERROR retu
2ac00 72 6e 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rned..*/.static 
2ac10 69 6e 74 20 61 72 50 61 72 73 65 43 6f 6d 6d 61  int arParseComma
2ac20 6e 64 28 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41  nd(.  char **azA
2ac30 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
2ac40 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
2ac50 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  f arguments pass
2ac60 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e  ed to dot comman
2ac70 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c  d */.  int nArg,
2ac80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac90 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2aca0 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
2acb0 7a 41 72 67 5b 5d 20 2a 2f 0a 20 20 41 72 43 6f  zArg[] */.  ArCo
2acc0 6d 6d 61 6e 64 20 2a 70 41 72 20 20 20 20 20 20  mmand *pAr      
2acd0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
2ace0 6f 70 75 6c 61 74 65 20 74 68 69 73 20 6f 62 6a  opulate this obj
2acf0 65 63 74 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ect */.){.  stru
2ad00 63 74 20 41 72 53 77 69 74 63 68 20 7b 0a 20 20  ct ArSwitch {.  
2ad10 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c    const char *zL
2ad20 6f 6e 67 3b 0a 20 20 20 20 63 68 61 72 20 63 53  ong;.    char cS
2ad30 68 6f 72 74 3b 0a 20 20 20 20 75 38 20 65 53 77  hort;.    u8 eSw
2ad40 69 74 63 68 3b 0a 20 20 20 20 75 38 20 62 41 72  itch;.    u8 bAr
2ad50 67 3b 0a 20 20 7d 20 61 53 77 69 74 63 68 5b 5d  g;.  } aSwitch[]
2ad60 20 3d 20 7b 0a 20 20 20 20 7b 20 22 63 72 65 61   = {.    { "crea
2ad70 74 65 22 2c 20 20 20 20 27 63 27 2c 20 41 52 5f  te",    'c', AR_
2ad80 43 4d 44 5f 43 52 45 41 54 45 2c 20 20 20 20 20  CMD_CREATE,     
2ad90 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 65 78    0 },.    { "ex
2ada0 74 72 61 63 74 22 2c 20 20 20 27 78 27 2c 20 41  tract",   'x', A
2adb0 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 2c 20 20  R_CMD_EXTRACT,  
2adc0 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22      0 },.    { "
2add0 6c 69 73 74 22 2c 20 20 20 20 20 20 27 74 27 2c  list",      't',
2ade0 20 41 52 5f 43 4d 44 5f 4c 49 53 54 2c 20 20 20   AR_CMD_LIST,   
2adf0 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b        0 },.    {
2ae00 20 22 75 70 64 61 74 65 22 2c 20 20 20 20 27 75   "update",    'u
2ae10 27 2c 20 41 52 5f 43 4d 44 5f 55 50 44 41 54 45  ', AR_CMD_UPDATE
2ae20 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20 20  ,       0 },.   
2ae30 20 7b 20 22 68 65 6c 70 22 2c 20 20 20 20 20 20   { "help",      
2ae40 27 68 27 2c 20 41 52 5f 43 4d 44 5f 48 45 4c 50  'h', AR_CMD_HELP
2ae50 2c 20 20 20 20 20 20 20 20 20 30 20 7d 2c 0a 20  ,         0 },. 
2ae60 20 20 20 7b 20 22 76 65 72 62 6f 73 65 22 2c 20     { "verbose", 
2ae70 20 20 27 76 27 2c 20 41 52 5f 53 57 49 54 43 48    'v', AR_SWITCH
2ae80 5f 56 45 52 42 4f 53 45 2c 20 20 20 30 20 7d 2c  _VERBOSE,   0 },
2ae90 0a 20 20 20 20 7b 20 22 66 69 6c 65 22 2c 20 20  .    { "file",  
2aea0 20 20 20 20 27 66 27 2c 20 41 52 5f 53 57 49 54      'f', AR_SWIT
2aeb0 43 48 5f 46 49 4c 45 2c 20 20 20 20 20 20 31 20  CH_FILE,      1 
2aec0 7d 2c 0a 20 20 20 20 7b 20 22 61 70 70 65 6e 64  },.    { "append
2aed0 22 2c 20 20 20 20 27 61 27 2c 20 41 52 5f 53 57  ",    'a', AR_SW
2aee0 49 54 43 48 5f 41 50 50 45 4e 44 2c 20 20 20 20  ITCH_APPEND,    
2aef0 31 20 7d 2c 0a 20 20 20 20 7b 20 22 64 69 72 65  1 },.    { "dire
2af00 63 74 6f 72 79 22 2c 20 27 43 27 2c 20 41 52 5f  ctory", 'C', AR_
2af10 53 57 49 54 43 48 5f 44 49 52 45 43 54 4f 52 59  SWITCH_DIRECTORY
2af20 2c 20 31 20 7d 2c 0a 20 20 20 20 7b 20 22 64 72  , 1 },.    { "dr
2af30 79 72 75 6e 22 2c 20 20 20 20 27 6e 27 2c 20 41  yrun",    'n', A
2af40 52 5f 53 57 49 54 43 48 5f 44 52 59 52 55 4e 2c  R_SWITCH_DRYRUN,
2af50 20 20 20 20 30 20 7d 2c 0a 20 20 7d 3b 0a 20 20      0 },.  };.  
2af60 69 6e 74 20 6e 53 77 69 74 63 68 20 3d 20 73 69  int nSwitch = si
2af70 7a 65 6f 66 28 61 53 77 69 74 63 68 29 20 2f 20  zeof(aSwitch) / 
2af80 73 69 7a 65 6f 66 28 73 74 72 75 63 74 20 41 72  sizeof(struct Ar
2af90 53 77 69 74 63 68 29 3b 0a 20 20 73 74 72 75 63  Switch);.  struc
2afa0 74 20 41 72 53 77 69 74 63 68 20 2a 70 45 6e 64  t ArSwitch *pEnd
2afb0 20 3d 20 26 61 53 77 69 74 63 68 5b 6e 53 77 69   = &aSwitch[nSwi
2afc0 74 63 68 5d 3b 0a 0a 20 20 69 66 28 20 6e 41 72  tch];..  if( nAr
2afd0 67 3c 3d 31 20 29 7b 0a 20 20 20 20 75 74 66 38  g<=1 ){.    utf8
2afe0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2aff0 22 57 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66  "Wrong number of
2b000 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 55 73 61   arguments.  Usa
2b010 67 65 3a 5c 6e 22 29 3b 0a 20 20 20 20 72 65 74  ge:\n");.    ret
2b020 75 72 6e 20 61 72 55 73 61 67 65 28 73 74 64 65  urn arUsage(stde
2b030 72 72 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  rr);.  }else{.  
2b040 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72    char *z = azAr
2b050 67 5b 31 5d 3b 0a 20 20 20 20 69 66 28 20 7a 5b  g[1];.    if( z[
2b060 30 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  0]!='-' ){.     
2b070 20 2f 2a 20 54 72 61 64 69 74 69 6f 6e 61 6c 20   /* Traditional 
2b080 73 74 79 6c 65 20 5b 74 61 72 5d 20 69 6e 76 6f  style [tar] invo
2b090 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  cation */.      
2b0a0 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74  int i;.      int
2b0b0 20 69 41 72 67 20 3d 20 32 3b 0a 20 20 20 20 20   iArg = 2;.     
2b0c0 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20   for(i=0; z[i]; 
2b0d0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  i++){.        co
2b0e0 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 20 3d  nst char *zArg =
2b0f0 20 30 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75   0;.        stru
2b100 63 74 20 41 72 53 77 69 74 63 68 20 2a 70 4f 70  ct ArSwitch *pOp
2b110 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70  t;.        for(p
2b120 4f 70 74 3d 26 61 53 77 69 74 63 68 5b 30 5d 3b  Opt=&aSwitch[0];
2b130 20 70 4f 70 74 3c 70 45 6e 64 3b 20 70 4f 70 74   pOpt<pEnd; pOpt
2b140 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
2b150 66 28 20 7a 5b 69 5d 3d 3d 70 4f 70 74 2d 3e 63  f( z[i]==pOpt->c
2b160 53 68 6f 72 74 20 29 20 62 72 65 61 6b 3b 0a 20  Short ) break;. 
2b170 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b180 20 69 66 28 20 70 4f 70 74 3d 3d 70 45 6e 64 20   if( pOpt==pEnd 
2b190 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
2b1a0 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70  urn arErrorMsg(p
2b1b0 41 72 2c 20 22 75 6e 72 65 63 6f 67 6e 69 7a 65  Ar, "unrecognize
2b1c0 64 20 6f 70 74 69 6f 6e 3a 20 25 63 22 2c 20 7a  d option: %c", z
2b1d0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  [i]);.        }.
2b1e0 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 74          if( pOpt
2b1f0 2d 3e 62 41 72 67 20 29 7b 0a 20 20 20 20 20 20  ->bArg ){.      
2b200 20 20 20 20 69 66 28 20 69 41 72 67 3e 3d 6e 41      if( iArg>=nA
2b210 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rg ){.          
2b220 20 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72    return arError
2b230 4d 73 67 28 70 41 72 2c 20 22 6f 70 74 69 6f 6e  Msg(pAr, "option
2b240 20 72 65 71 75 69 72 65 73 20 61 6e 20 61 72 67   requires an arg
2b250 75 6d 65 6e 74 3a 20 25 63 22 2c 7a 5b 69 5d 29  ument: %c",z[i])
2b260 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2b270 20 20 20 20 20 20 20 20 7a 41 72 67 20 3d 20 61          zArg = a
2b280 7a 41 72 67 5b 69 41 72 67 2b 2b 5d 3b 0a 20 20  zArg[iArg++];.  
2b290 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b2a0 69 66 28 20 61 72 50 72 6f 63 65 73 73 53 77 69  if( arProcessSwi
2b2b0 74 63 68 28 70 41 72 2c 20 70 4f 70 74 2d 3e 65  tch(pAr, pOpt->e
2b2c0 53 77 69 74 63 68 2c 20 7a 41 72 67 29 20 29 20  Switch, zArg) ) 
2b2d0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
2b2e0 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
2b2f0 20 20 20 70 41 72 2d 3e 6e 41 72 67 20 3d 20 6e     pAr->nArg = n
2b300 41 72 67 2d 69 41 72 67 3b 0a 20 20 20 20 20 20  Arg-iArg;.      
2b310 69 66 28 20 70 41 72 2d 3e 6e 41 72 67 3e 30 20  if( pAr->nArg>0 
2b320 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72 2d 3e  ){.        pAr->
2b330 61 7a 41 72 67 20 3d 20 26 61 7a 41 72 67 5b 69  azArg = &azArg[i
2b340 41 72 67 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Arg];.      }.  
2b350 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 2f    }else{.      /
2b360 2a 20 4e 6f 6e 2d 74 72 61 64 69 74 69 6f 6e 61  * Non-traditiona
2b370 6c 20 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a  l invocation */.
2b380 20 20 20 20 20 20 69 6e 74 20 69 41 72 67 3b 0a        int iArg;.
2b390 20 20 20 20 20 20 66 6f 72 28 69 41 72 67 3d 31        for(iArg=1
2b3a0 3b 20 69 41 72 67 3c 6e 41 72 67 3b 20 69 41 72  ; iArg<nArg; iAr
2b3b0 67 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  g++){.        in
2b3c0 74 20 6e 3b 0a 20 20 20 20 20 20 20 20 7a 20 3d  t n;.        z =
2b3d0 20 61 7a 41 72 67 5b 69 41 72 67 5d 3b 0a 20 20   azArg[iArg];.  
2b3e0 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d        if( z[0]!=
2b3f0 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  '-' ){.         
2b400 20 2f 2a 20 41 6c 6c 20 72 65 6d 61 69 6e 69 6e   /* All remainin
2b410 67 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 77  g command line w
2b420 6f 72 64 73 20 61 72 65 20 63 6f 6d 6d 61 6e 64  ords are command
2b430 20 61 72 67 75 6d 65 6e 74 73 2e 20 2a 2f 0a 20   arguments. */. 
2b440 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e 61 7a           pAr->az
2b450 41 72 67 20 3d 20 26 61 7a 41 72 67 5b 69 41 72  Arg = &azArg[iAr
2b460 67 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 70 41  g];.          pA
2b470 72 2d 3e 6e 41 72 67 20 3d 20 6e 41 72 67 2d 69  r->nArg = nArg-i
2b480 41 72 67 3b 0a 20 20 20 20 20 20 20 20 20 20 62  Arg;.          b
2b490 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
2b4a0 20 20 20 20 20 20 20 20 6e 20 3d 20 73 74 72 6c          n = strl
2b4b0 65 6e 33 30 28 7a 29 3b 0a 0a 20 20 20 20 20 20  en30(z);..      
2b4c0 20 20 69 66 28 20 7a 5b 31 5d 21 3d 27 2d 27 20    if( z[1]!='-' 
2b4d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
2b4e0 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   i;.          /*
2b4f0 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 73 68 6f   One or more sho
2b500 72 74 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20  rt options */.  
2b510 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b          for(i=1;
2b520 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
2b530 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
2b540 61 72 20 2a 7a 41 72 67 20 3d 20 30 3b 0a 20 20  ar *zArg = 0;.  
2b550 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
2b560 20 41 72 53 77 69 74 63 68 20 2a 70 4f 70 74 3b   ArSwitch *pOpt;
2b570 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
2b580 28 70 4f 70 74 3d 26 61 53 77 69 74 63 68 5b 30  (pOpt=&aSwitch[0
2b590 5d 3b 20 70 4f 70 74 3c 70 45 6e 64 3b 20 70 4f  ]; pOpt<pEnd; pO
2b5a0 70 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  pt++){.         
2b5b0 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 70       if( z[i]==p
2b5c0 4f 70 74 2d 3e 63 53 68 6f 72 74 20 29 20 62 72  Opt->cShort ) br
2b5d0 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
2b5e0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
2b5f0 66 28 20 70 4f 70 74 3d 3d 70 45 6e 64 20 29 7b  f( pOpt==pEnd ){
2b600 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72  .              r
2b610 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67  eturn arErrorMsg
2b620 28 70 41 72 2c 20 22 75 6e 72 65 63 6f 67 6e 69  (pAr, "unrecogni
2b630 7a 65 64 20 6f 70 74 69 6f 6e 3a 20 25 63 22 2c  zed option: %c",
2b640 20 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20   z[i]);.        
2b650 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2b660 20 20 69 66 28 20 70 4f 70 74 2d 3e 62 41 72 67    if( pOpt->bArg
2b670 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2b680 20 20 69 66 28 20 69 3c 28 6e 2d 31 29 20 29 7b    if( i<(n-1) ){
2b690 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b6a0 20 7a 41 72 67 20 3d 20 26 7a 5b 69 2b 31 5d 3b   zArg = &z[i+1];
2b6b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b6c0 20 69 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20   i = n;.        
2b6d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2b6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28               if(
2b6f0 20 69 41 72 67 3e 3d 28 6e 41 72 67 2d 31 29 20   iArg>=(nArg-1) 
2b700 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2b710 20 20 20 20 20 72 65 74 75 72 6e 20 61 72 45 72       return arEr
2b720 72 6f 72 4d 73 67 28 70 41 72 2c 20 22 6f 70 74  rorMsg(pAr, "opt
2b730 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e 20  ion requires an 
2b740 61 72 67 75 6d 65 6e 74 3a 20 25 63 22 2c 7a 5b  argument: %c",z[
2b750 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  i]);.           
2b760 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2b770 20 20 20 20 20 20 20 7a 41 72 67 20 3d 20 61 7a         zArg = az
2b780 41 72 67 5b 2b 2b 69 41 72 67 5d 3b 0a 20 20 20  Arg[++iArg];.   
2b790 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2b7a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2b7b0 20 20 20 20 20 20 20 69 66 28 20 61 72 50 72 6f         if( arPro
2b7c0 63 65 73 73 53 77 69 74 63 68 28 70 41 72 2c 20  cessSwitch(pAr, 
2b7d0 70 4f 70 74 2d 3e 65 53 77 69 74 63 68 2c 20 7a  pOpt->eSwitch, z
2b7e0 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 53 51  Arg) ) return SQ
2b7f0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
2b800 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2b810 7d 65 6c 73 65 20 69 66 28 20 7a 5b 32 5d 3d 3d  }else if( z[2]==
2b820 27 5c 30 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\0' ){.        
2b830 20 20 2f 2a 20 41 20 2d 2d 20 6f 70 74 69 6f 6e    /* A -- option
2b840 2c 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61  , indicating tha
2b850 74 20 61 6c 6c 20 72 65 6d 61 69 6e 69 6e 67 20  t all remaining 
2b860 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 6f 72  command line wor
2b870 64 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ds.          ** 
2b880 61 72 65 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75  are command argu
2b890 6d 65 6e 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20  ments.  */.     
2b8a0 20 20 20 20 20 70 41 72 2d 3e 61 7a 41 72 67 20       pAr->azArg 
2b8b0 3d 20 26 61 7a 41 72 67 5b 69 41 72 67 2b 31 5d  = &azArg[iArg+1]
2b8c0 3b 0a 20 20 20 20 20 20 20 20 20 20 70 41 72 2d  ;.          pAr-
2b8d0 3e 6e 41 72 67 20 3d 20 6e 41 72 67 2d 69 41 72  >nArg = nArg-iAr
2b8e0 67 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62  g-1;.          b
2b8f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65  reak;.        }e
2b900 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  lse{.          /
2b910 2a 20 41 20 6c 6f 6e 67 20 6f 70 74 69 6f 6e 20  * A long option 
2b920 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  */.          con
2b930 73 74 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20  st char *zArg = 
2b940 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
2b950 2a 20 41 72 67 75 6d 65 6e 74 20 66 6f 72 20 6f  * Argument for o
2b960 70 74 69 6f 6e 2c 20 69 66 20 61 6e 79 20 2a 2f  ption, if any */
2b970 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
2b980 74 20 41 72 53 77 69 74 63 68 20 2a 70 4d 61 74  t ArSwitch *pMat
2b990 63 68 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  ch = 0;      /* 
2b9a0 4d 61 74 63 68 69 6e 67 20 6f 70 74 69 6f 6e 20  Matching option 
2b9b0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  */.          str
2b9c0 75 63 74 20 41 72 53 77 69 74 63 68 20 2a 70 4f  uct ArSwitch *pO
2b9d0 70 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  pt;            /
2b9e0 2a 20 49 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20  * Iterator */.  
2b9f0 20 20 20 20 20 20 20 20 66 6f 72 28 70 4f 70 74          for(pOpt
2ba00 3d 26 61 53 77 69 74 63 68 5b 30 5d 3b 20 70 4f  =&aSwitch[0]; pO
2ba10 70 74 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b 29  pt<pEnd; pOpt++)
2ba20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
2ba30 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 6e 67 20  nst char *zLong 
2ba40 3d 20 70 4f 70 74 2d 3e 7a 4c 6f 6e 67 3b 0a 20  = pOpt->zLong;. 
2ba50 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
2ba60 6e 2d 32 29 3c 3d 73 74 72 6c 65 6e 33 30 28 7a  n-2)<=strlen30(z
2ba70 4c 6f 6e 67 29 20 26 26 20 30 3d 3d 6d 65 6d 63  Long) && 0==memc
2ba80 6d 70 28 26 7a 5b 32 5d 2c 20 7a 4c 6f 6e 67 2c  mp(&z[2], zLong,
2ba90 20 6e 2d 32 29 20 29 7b 0a 20 20 20 20 20 20 20   n-2) ){.       
2baa0 20 20 20 20 20 20 20 69 66 28 20 70 4d 61 74 63         if( pMatc
2bab0 68 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  h ){.           
2bac0 20 20 20 20 20 72 65 74 75 72 6e 20 61 72 45 72       return arEr
2bad0 72 6f 72 4d 73 67 28 70 41 72 2c 20 22 61 6d 62  rorMsg(pAr, "amb
2bae0 69 67 75 6f 75 73 20 6f 70 74 69 6f 6e 3a 20 25  iguous option: %
2baf0 73 22 2c 7a 29 3b 0a 20 20 20 20 20 20 20 20 20  s",z);.         
2bb00 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2bb10 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 61 74              pMat
2bb20 63 68 20 3d 20 70 4f 70 74 3b 0a 20 20 20 20 20  ch = pOpt;.     
2bb30 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2bb40 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2bb50 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
2bb60 69 66 28 20 70 4d 61 74 63 68 3d 3d 30 20 29 7b  if( pMatch==0 ){
2bb70 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
2bb80 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70  urn arErrorMsg(p
2bb90 41 72 2c 20 22 75 6e 72 65 63 6f 67 6e 69 7a 65  Ar, "unrecognize
2bba0 64 20 6f 70 74 69 6f 6e 3a 20 25 73 22 2c 20 7a  d option: %s", z
2bbb0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
2bbc0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 61           if( pMa
2bbd0 74 63 68 2d 3e 62 41 72 67 20 29 7b 0a 20 20 20  tch->bArg ){.   
2bbe0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 41 72           if( iAr
2bbf0 67 3e 3d 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20  g>=(nArg-1) ){. 
2bc00 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
2bc10 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 70  urn arErrorMsg(p
2bc20 41 72 2c 20 22 6f 70 74 69 6f 6e 20 72 65 71 75  Ar, "option requ
2bc30 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  ires an argument
2bc40 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20  : %s", z);.     
2bc50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2bc60 20 20 20 20 20 7a 41 72 67 20 3d 20 61 7a 41 72       zArg = azAr
2bc70 67 5b 2b 2b 69 41 72 67 5d 3b 0a 20 20 20 20 20  g[++iArg];.     
2bc80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
2bc90 20 69 66 28 20 61 72 50 72 6f 63 65 73 73 53 77   if( arProcessSw
2bca0 69 74 63 68 28 70 41 72 2c 20 70 4d 61 74 63 68  itch(pAr, pMatch
2bcb0 2d 3e 65 53 77 69 74 63 68 2c 20 7a 41 72 67 29  ->eSwitch, zArg)
2bcc0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
2bcd0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
2bce0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
2bcf0 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
2bd00 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
2bd10 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
2bd20 61 73 73 75 6d 65 73 20 74 68 61 74 20 61 6c 6c  assumes that all
2bd30 20 61 72 67 75 6d 65 6e 74 73 20 77 69 74 68 69   arguments withi
2bd40 6e 20 74 68 65 20 41 72 43 6f 6d 6d 61 6e 64 2e  n the ArCommand.
2bd50 61 7a 41 72 67 5b 5d 0a 2a 2a 20 61 72 72 61 79  azArg[].** array
2bd60 20 72 65 66 65 72 20 74 6f 20 61 72 63 68 69 76   refer to archiv
2bd70 65 20 6d 65 6d 62 65 72 73 2c 20 61 73 20 66 6f  e members, as fo
2bd80 72 20 74 68 65 20 2d 2d 65 78 74 72 61 63 74 20  r the --extract 
2bd90 6f 72 20 2d 2d 6c 69 73 74 20 63 6f 6d 6d 61 6e  or --list comman
2bda0 64 73 2e 20 0a 2a 2a 20 49 74 20 63 68 65 63 6b  ds. .** It check
2bdb0 73 20 74 68 61 74 20 65 61 63 68 20 6f 66 20 74  s that each of t
2bdc0 68 65 6d 20 61 72 65 20 70 72 65 73 65 6e 74 2e  hem are present.
2bdd0 20 49 66 20 61 6e 79 20 73 70 65 63 69 66 69 65   If any specifie
2bde0 64 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a  d file is not.**
2bdf0 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
2be00 61 72 63 68 69 76 65 2c 20 61 6e 20 65 72 72 6f  archive, an erro
2be10 72 20 69 73 20 70 72 69 6e 74 65 64 20 74 6f 20  r is printed to 
2be20 73 74 64 65 72 72 20 61 6e 64 20 61 6e 20 65 72  stderr and an er
2be30 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 72 65 74 75  ror.** code retu
2be40 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
2be50 20 69 66 20 61 6c 6c 20 73 70 65 63 69 66 69 65   if all specifie
2be60 64 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  d arguments are 
2be70 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68  present in.** th
2be80 65 20 61 72 63 68 69 76 65 2c 20 53 51 4c 49 54  e archive, SQLIT
2be90 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
2bea0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
2beb0 63 74 69 6f 6e 20 73 74 72 69 70 73 20 61 6e 79  ction strips any
2bec0 20 74 72 61 69 6c 69 6e 67 20 27 2f 27 20 63 68   trailing '/' ch
2bed0 61 72 61 63 74 65 72 73 20 66 72 6f 6d 20 65 61  aracters from ea
2bee0 63 68 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20  ch argument..** 
2bef0 54 68 69 73 20 69 73 20 63 6f 6e 73 69 73 74 65  This is consiste
2bf00 6e 74 20 77 69 74 68 20 74 68 65 20 77 61 79 20  nt with the way 
2bf10 74 68 65 20 5b 74 61 72 5d 20 63 6f 6d 6d 61 6e  the [tar] comman
2bf20 64 20 73 65 65 6d 73 20 74 6f 20 77 6f 72 6b 20  d seems to work 
2bf30 6f 6e 0a 2a 2a 20 4c 69 6e 75 78 2e 0a 2a 2f 0a  on.** Linux..*/.
2bf40 73 74 61 74 69 63 20 69 6e 74 20 61 72 43 68 65  static int arChe
2bf50 63 6b 45 6e 74 72 69 65 73 28 41 72 43 6f 6d 6d  ckEntries(ArComm
2bf60 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20 69 6e 74  and *pAr){.  int
2bf70 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
2bf80 0a 20 20 69 66 28 20 70 41 72 2d 3e 6e 41 72 67  .  if( pAr->nArg
2bf90 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   ){.    int i, j
2bfa0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
2bfb0 6d 74 20 2a 70 54 65 73 74 20 3d 20 30 3b 0a 0a  mt *pTest = 0;..
2bfc0 20 20 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65      shellPrepare
2bfd0 50 72 69 6e 74 66 28 70 41 72 2d 3e 64 62 2c 20  Printf(pAr->db, 
2bfe0 26 72 63 2c 20 26 70 54 65 73 74 2c 0a 20 20 20  &rc, &pTest,.   
2bff0 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d       "SELECT nam
2c000 65 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20  e FROM %s WHERE 
2c010 6e 61 6d 65 3d 24 6e 61 6d 65 22 2c 20 0a 20 20  name=$name", .  
2c020 20 20 20 20 20 20 70 41 72 2d 3e 7a 53 72 63 54        pAr->zSrcT
2c030 61 62 6c 65 0a 20 20 20 20 29 3b 0a 20 20 20 20  able.    );.    
2c040 6a 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  j = sqlite3_bind
2c050 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78  _parameter_index
2c060 28 70 54 65 73 74 2c 20 22 24 6e 61 6d 65 22 29  (pTest, "$name")
2c070 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
2c080 3c 70 41 72 2d 3e 6e 41 72 67 20 26 26 20 72 63  <pAr->nArg && rc
2c090 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b  ==SQLITE_OK; i++
2c0a0 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
2c0b0 20 3d 20 70 41 72 2d 3e 61 7a 41 72 67 5b 69 5d   = pAr->azArg[i]
2c0c0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  ;.      int n = 
2c0d0 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20  strlen30(z);.   
2c0e0 20 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3b 0a     int bOk = 0;.
2c0f0 20 20 20 20 20 20 77 68 69 6c 65 28 20 6e 3e 30        while( n>0
2c100 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20   && z[n-1]=='/' 
2c110 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 5b 6e  ) n--;.      z[n
2c120 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  ] = '\0';.      
2c130 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
2c140 74 28 70 54 65 73 74 2c 20 6a 2c 20 7a 2c 20 2d  t(pTest, j, z, -
2c150 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
2c160 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  );.      if( SQL
2c170 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
2c180 5f 73 74 65 70 28 70 54 65 73 74 29 20 29 7b 0a  _step(pTest) ){.
2c190 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b          bOk = 1;
2c1a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
2c1b0 68 65 6c 6c 52 65 73 65 74 28 26 72 63 2c 20 70  hellReset(&rc, p
2c1c0 54 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Test);.      if(
2c1d0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2c1e0 26 20 62 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  & bOk==0 ){.    
2c1f0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2c200 73 74 64 65 72 72 2c 20 22 6e 6f 74 20 66 6f 75  stderr, "not fou
2c210 6e 64 20 69 6e 20 61 72 63 68 69 76 65 3a 20 25  nd in archive: %
2c220 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20  s\n", z);.      
2c230 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
2c240 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
2c250 20 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61   }.    shellFina
2c260 6c 69 7a 65 28 26 72 63 2c 20 70 54 65 73 74 29  lize(&rc, pTest)
2c270 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2c280 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 6d  c;.}../*.** Form
2c290 61 74 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  at a WHERE claus
2c2a0 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  e that can be us
2c2b0 65 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 22  ed against the "
2c2c0 73 71 6c 61 72 22 20 74 61 62 6c 65 20 74 6f 0a  sqlar" table to.
2c2d0 2a 2a 20 69 64 65 6e 74 69 66 79 20 61 6c 6c 20  ** identify all 
2c2e0 61 72 63 68 69 76 65 20 6d 65 6d 62 65 72 73 20  archive members 
2c2f0 74 68 61 74 20 6d 61 74 63 68 20 74 68 65 20 63  that match the c
2c300 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
2c310 20 68 65 6c 64 0a 2a 2a 20 69 6e 20 28 2a 70 41   held.** in (*pA
2c320 72 29 2e 20 4c 65 61 76 65 20 74 68 69 73 20 57  r). Leave this W
2c330 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 28  HERE clause in (
2c340 2a 70 7a 57 68 65 72 65 29 20 62 65 66 6f 72 65  *pzWhere) before
2c350 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 54   returning..** T
2c360 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73  he caller is res
2c370 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 76 65  ponsible for eve
2c380 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 69 6e 67 20  ntually calling 
2c390 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 6f  sqlite3_free() o
2c3a0 6e 0a 2a 2a 20 61 6e 79 20 6e 6f 6e 2d 4e 55 4c  n.** any non-NUL
2c3b0 4c 20 28 2a 70 7a 57 68 65 72 65 29 20 76 61 6c  L (*pzWhere) val
2c3c0 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ue..*/.static vo
2c3d0 69 64 20 61 72 57 68 65 72 65 43 6c 61 75 73 65  id arWhereClause
2c3e0 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20  (.  int *pRc, . 
2c3f0 20 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c   ArCommand *pAr,
2c400 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 57 68 65   .  char **pzWhe
2c410 72 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  re              
2c420 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20      /* OUT: New 
2c430 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
2c440 29 7b 0a 20 20 63 68 61 72 20 2a 7a 57 68 65 72  ){.  char *zWher
2c450 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52  e = 0;.  if( *pR
2c460 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
2c470 20 20 20 20 69 66 28 20 70 41 72 2d 3e 6e 41 72      if( pAr->nAr
2c480 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 57  g==0 ){.      zW
2c490 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  here = sqlite3_m
2c4a0 70 72 69 6e 74 66 28 22 31 22 29 3b 0a 20 20 20  printf("1");.   
2c4b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
2c4c0 74 20 69 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  t i;.      const
2c4d0 20 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 22   char *zSep = ""
2c4e0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
2c4f0 20 69 3c 70 41 72 2d 3e 6e 41 72 67 3b 20 69 2b   i<pAr->nArg; i+
2c500 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  +){.        cons
2c510 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 41 72 2d  t char *z = pAr-
2c520 3e 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20  >azArg[i];.     
2c530 20 20 20 7a 57 68 65 72 65 20 3d 20 73 71 6c 69     zWhere = sqli
2c540 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
2c550 20 20 20 20 20 20 20 22 25 7a 25 73 20 6e 61 6d         "%z%s nam
2c560 65 20 3d 20 27 25 71 27 20 4f 52 20 73 75 62 73  e = '%q' OR subs
2c570 74 72 28 6e 61 6d 65 2c 31 2c 25 64 29 20 3d 20  tr(name,1,%d) = 
2c580 27 25 71 2f 27 22 2c 20 0a 20 20 20 20 20 20 20  '%q/'", .       
2c590 20 20 20 7a 57 68 65 72 65 2c 20 7a 53 65 70 2c     zWhere, zSep,
2c5a0 20 7a 2c 20 73 74 72 6c 65 6e 33 30 28 7a 29 2b   z, strlen30(z)+
2c5b0 31 2c 20 7a 0a 20 20 20 20 20 20 20 20 29 3b 0a  1, z.        );.
2c5c0 20 20 20 20 20 20 20 20 69 66 28 20 7a 57 68 65          if( zWhe
2c5d0 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  re==0 ){.       
2c5e0 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
2c5f0 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
2c600 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2c610 20 7d 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20   }.        zSep 
2c620 3d 20 22 20 4f 52 20 22 3b 0a 20 20 20 20 20 20  = " OR ";.      
2c630 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  }.    }.  }.  *p
2c640 7a 57 68 65 72 65 20 3d 20 7a 57 68 65 72 65 3b  zWhere = zWhere;
2c650 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
2c660 65 6e 74 61 74 69 6f 6e 20 6f 66 20 2e 61 72 20  entation of .ar 
2c670 22 6c 69 73 54 22 20 63 6f 6d 6d 61 6e 64 2e 20  "lisT" command. 
2c680 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
2c690 72 4c 69 73 74 43 6f 6d 6d 61 6e 64 28 41 72 43  rListCommand(ArC
2c6a0 6f 6d 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20  ommand *pAr){.  
2c6b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
2c6c0 20 3d 20 22 53 45 4c 45 43 54 20 25 73 20 46 52   = "SELECT %s FR
2c6d0 4f 4d 20 25 73 20 57 48 45 52 45 20 25 73 22 3b  OM %s WHERE %s";
2c6e0 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
2c6f0 61 7a 43 6f 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20  azCols[] = {.   
2c700 20 22 6e 61 6d 65 22 2c 0a 20 20 20 20 22 6c 73   "name",.    "ls
2c710 6d 6f 64 65 28 6d 6f 64 65 29 2c 20 73 7a 2c 20  mode(mode), sz, 
2c720 64 61 74 65 74 69 6d 65 28 6d 74 69 6d 65 2c 20  datetime(mtime, 
2c730 27 75 6e 69 78 65 70 6f 63 68 27 29 2c 20 6e 61  'unixepoch'), na
2c740 6d 65 22 0a 20 20 7d 3b 0a 0a 20 20 63 68 61 72  me".  };..  char
2c750 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b 0a 20 20   *zWhere = 0;.  
2c760 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
2c770 71 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ql = 0;.  int rc
2c780 3b 0a 0a 20 20 72 63 20 3d 20 61 72 43 68 65 63  ;..  rc = arChec
2c790 6b 45 6e 74 72 69 65 73 28 70 41 72 29 3b 0a 20  kEntries(pAr);. 
2c7a0 20 61 72 57 68 65 72 65 43 6c 61 75 73 65 28 26   arWhereClause(&
2c7b0 72 63 2c 20 70 41 72 2c 20 26 7a 57 68 65 72 65  rc, pAr, &zWhere
2c7c0 29 3b 0a 0a 20 20 73 68 65 6c 6c 50 72 65 70 61  );..  shellPrepa
2c7d0 72 65 50 72 69 6e 74 66 28 70 41 72 2d 3e 64 62  rePrintf(pAr->db
2c7e0 2c 20 26 72 63 2c 20 26 70 53 71 6c 2c 20 7a 53  , &rc, &pSql, zS
2c7f0 71 6c 2c 20 61 7a 43 6f 6c 73 5b 70 41 72 2d 3e  ql, azCols[pAr->
2c800 62 56 65 72 62 6f 73 65 5d 2c 0a 20 20 20 20 20  bVerbose],.     
2c810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c820 70 41 72 2d 3e 7a 53 72 63 54 61 62 6c 65 2c 20  pAr->zSrcTable, 
2c830 7a 57 68 65 72 65 29 3b 0a 20 20 69 66 28 20 70  zWhere);.  if( p
2c840 41 72 2d 3e 62 44 72 79 52 75 6e 20 29 7b 0a 20  Ar->bDryRun ){. 
2c850 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
2c860 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c  Ar->p->out, "%s\
2c870 6e 22 2c 20 73 71 6c 69 74 65 33 5f 73 71 6c 28  n", sqlite3_sql(
2c880 70 53 71 6c 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  pSql));.  }else{
2c890 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  .    while( rc==
2c8a0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c  SQLITE_OK && SQL
2c8b0 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
2c8c0 5f 73 74 65 70 28 70 53 71 6c 29 20 29 7b 0a 20  _step(pSql) ){. 
2c8d0 20 20 20 20 20 69 66 28 20 70 41 72 2d 3e 62 56       if( pAr->bV
2c8e0 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20  erbose ){.      
2c8f0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41    utf8_printf(pA
2c900 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 20 25  r->p->out, "%s %
2c910 20 31 30 64 20 20 25 73 20 20 25 73 5c 6e 22 2c   10d  %s  %s\n",
2c920 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
2c930 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
2c940 28 70 53 71 6c 2c 20 30 29 2c 0a 20 20 20 20 20  (pSql, 0),.     
2c950 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
2c960 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20  olumn_int(pSql, 
2c970 31 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  1), .           
2c980 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
2c990 74 65 78 74 28 70 53 71 6c 2c 20 32 29 2c 0a 20  text(pSql, 2),. 
2c9a0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2c9b0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
2c9c0 53 71 6c 2c 20 33 29 0a 20 20 20 20 20 20 20 20  Sql, 3).        
2c9d0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2c9e0 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
2c9f0 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c  ntf(pAr->p->out,
2ca00 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33   "%s\n", sqlite3
2ca10 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71  _column_text(pSq
2ca20 6c 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 7d 0a  l, 0));.      }.
2ca30 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 68 65 6c      }.  }.  shel
2ca40 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70  lFinalize(&rc, p
2ca50 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  Sql);.  sqlite3_
2ca60 66 72 65 65 28 7a 57 68 65 72 65 29 3b 0a 20 20  free(zWhere);.  
2ca70 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
2ca80 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
2ca90 69 6f 6e 20 6f 66 20 2e 61 72 20 22 65 58 74 72  ion of .ar "eXtr
2caa0 61 63 74 22 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a  act" command. .*
2cab0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 45  /.static int arE
2cac0 78 74 72 61 63 74 43 6f 6d 6d 61 6e 64 28 41 72  xtractCommand(Ar
2cad0 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20  Command *pAr){. 
2cae0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
2caf0 6c 31 20 3d 20 0a 20 20 20 20 22 53 45 4c 45 43  l1 = .    "SELEC
2cb00 54 20 22 0a 20 20 20 20 22 20 28 24 64 69 72 20  T ".    " ($dir 
2cb10 7c 7c 20 6e 61 6d 65 29 2c 22 0a 20 20 20 20 22  || name),".    "
2cb20 20 77 72 69 74 65 66 69 6c 65 28 28 24 64 69 72   writefile(($dir
2cb30 20 7c 7c 20 6e 61 6d 65 29 2c 20 25 73 2c 20 6d   || name), %s, m
2cb40 6f 64 65 2c 20 6d 74 69 6d 65 29 20 22 0a 20 20  ode, mtime) ".  
2cb50 20 20 22 46 52 4f 4d 20 25 73 20 57 48 45 52 45    "FROM %s WHERE
2cb60 20 28 25 73 29 20 41 4e 44 20 28 64 61 74 61 20   (%s) AND (data 
2cb70 49 53 20 4e 55 4c 4c 20 4f 52 20 24 64 69 72 4f  IS NULL OR $dirO
2cb80 6e 6c 79 20 3d 20 30 29 22 0a 20 20 20 20 22 20  nly = 0)".    " 
2cb90 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 47 4c 4f  AND name NOT GLO
2cba0 42 20 27 2a 2e 2e 5b 2f 5c 5c 5d 2a 27 22 3b 0a  B '*..[/\\]*'";.
2cbb0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  .  const char *a
2cbc0 7a 45 78 74 72 61 41 72 67 5b 5d 20 3d 20 7b 20  zExtraArg[] = { 
2cbd0 0a 20 20 20 20 22 73 71 6c 61 72 5f 75 6e 63 6f  .    "sqlar_unco
2cbe0 6d 70 72 65 73 73 28 64 61 74 61 2c 20 73 7a 29  mpress(data, sz)
2cbf0 22 2c 0a 20 20 20 20 22 64 61 74 61 22 0a 20 20  ",.    "data".  
2cc00 7d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  };..  sqlite3_st
2cc10 6d 74 20 2a 70 53 71 6c 20 3d 20 30 3b 0a 20 20  mt *pSql = 0;.  
2cc20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
2cc30 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 44 69 72  OK;.  char *zDir
2cc40 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 57   = 0;.  char *zW
2cc50 68 65 72 65 20 3d 20 30 3b 0a 20 20 69 6e 74 20  here = 0;.  int 
2cc60 69 2c 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66 20 61  i, j;..  /* If a
2cc70 72 67 75 6d 65 6e 74 73 20 61 72 65 20 73 70 65  rguments are spe
2cc80 63 69 66 69 65 64 2c 20 63 68 65 63 6b 20 74 68  cified, check th
2cc90 61 74 20 74 68 65 79 20 61 63 74 75 61 6c 6c 79  at they actually
2cca0 20 65 78 69 73 74 20 77 69 74 68 69 6e 0a 20 20   exist within.  
2ccb0 2a 2a 20 74 68 65 20 61 72 63 68 69 76 65 20 62  ** the archive b
2ccc0 65 66 6f 72 65 20 70 72 6f 63 65 65 64 69 6e 67  efore proceeding
2ccd0 2e 20 41 6e 64 20 66 6f 72 6d 75 6c 61 74 65 20  . And formulate 
2cce0 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  a WHERE clause t
2ccf0 6f 0a 20 20 2a 2a 20 6d 61 74 63 68 20 74 68 65  o.  ** match the
2cd00 6d 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61 72  m.  */.  rc = ar
2cd10 43 68 65 63 6b 45 6e 74 72 69 65 73 28 70 41 72  CheckEntries(pAr
2cd20 29 3b 0a 20 20 61 72 57 68 65 72 65 43 6c 61 75  );.  arWhereClau
2cd30 73 65 28 26 72 63 2c 20 70 41 72 2c 20 26 7a 57  se(&rc, pAr, &zW
2cd40 68 65 72 65 29 3b 0a 0a 20 20 69 66 28 20 72 63  here);..  if( rc
2cd50 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2cd60 20 20 20 69 66 28 20 70 41 72 2d 3e 7a 44 69 72     if( pAr->zDir
2cd70 20 29 7b 0a 20 20 20 20 20 20 7a 44 69 72 20 3d   ){.      zDir =
2cd80 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2cd90 28 22 25 73 2f 22 2c 20 70 41 72 2d 3e 7a 44 69  ("%s/", pAr->zDi
2cda0 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r);.    }else{. 
2cdb0 20 20 20 20 20 7a 44 69 72 20 3d 20 73 71 6c 69       zDir = sqli
2cdc0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 22 29 3b  te3_mprintf("");
2cdd0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
2cde0 44 69 72 3d 3d 30 20 29 20 72 63 20 3d 20 53 51  Dir==0 ) rc = SQ
2cdf0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a  LITE_NOMEM;.  }.
2ce00 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50  .  shellPrepareP
2ce10 72 69 6e 74 66 28 70 41 72 2d 3e 64 62 2c 20 26  rintf(pAr->db, &
2ce20 72 63 2c 20 26 70 53 71 6c 2c 20 7a 53 71 6c 31  rc, &pSql, zSql1
2ce30 2c 20 0a 20 20 20 20 20 20 61 7a 45 78 74 72 61  , .      azExtra
2ce40 41 72 67 5b 70 41 72 2d 3e 62 5a 69 70 5d 2c 20  Arg[pAr->bZip], 
2ce50 70 41 72 2d 3e 7a 53 72 63 54 61 62 6c 65 2c 20  pAr->zSrcTable, 
2ce60 7a 57 68 65 72 65 0a 20 20 29 3b 0a 0a 20 20 69  zWhere.  );..  i
2ce70 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
2ce80 20 29 7b 0a 20 20 20 20 6a 20 3d 20 73 71 6c 69   ){.    j = sqli
2ce90 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
2cea0 65 72 5f 69 6e 64 65 78 28 70 53 71 6c 2c 20 22  er_index(pSql, "
2ceb0 24 64 69 72 22 29 3b 0a 20 20 20 20 73 71 6c 69  $dir");.    sqli
2cec0 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
2ced0 71 6c 2c 20 6a 2c 20 7a 44 69 72 2c 20 2d 31 2c  ql, j, zDir, -1,
2cee0 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
2cef0 0a 0a 20 20 20 20 2f 2a 20 52 75 6e 20 74 68 65  ..    /* Run the
2cf00 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
2cf10 74 20 74 77 69 63 65 2e 20 54 68 65 20 66 69 72  t twice. The fir
2cf20 73 74 20 74 69 6d 65 2c 20 77 72 69 74 65 66 69  st time, writefi
2cf30 6c 65 28 29 20 69 73 20 63 61 6c 6c 65 64 0a 20  le() is called. 
2cf40 20 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20 61 72     ** for all ar
2cf50 63 68 69 76 65 20 6d 65 6d 62 65 72 73 20 74 68  chive members th
2cf60 61 74 20 73 68 6f 75 6c 64 20 62 65 20 65 78 74  at should be ext
2cf70 72 61 63 74 65 64 2e 20 54 68 65 20 73 65 63 6f  racted. The seco
2cf80 6e 64 20 74 69 6d 65 2c 0a 20 20 20 20 2a 2a 20  nd time,.    ** 
2cf90 6f 6e 6c 79 20 66 6f 72 20 74 68 65 20 64 69 72  only for the dir
2cfa0 65 63 74 6f 72 69 65 73 2e 20 54 68 69 73 20 69  ectories. This i
2cfb0 73 20 62 65 63 61 75 73 65 20 74 68 65 20 74 69  s because the ti
2cfc0 6d 65 73 74 61 6d 70 73 20 66 6f 72 0a 20 20 20  mestamps for.   
2cfd0 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20 64 69   ** extracted di
2cfe0 72 65 63 74 6f 72 69 65 73 20 6d 75 73 74 20 62  rectories must b
2cff0 65 20 72 65 73 65 74 20 61 66 74 65 72 20 74 68  e reset after th
2d000 65 79 20 61 72 65 20 70 6f 70 75 6c 61 74 65 64  ey are populated
2d010 20 28 61 73 0a 20 20 20 20 2a 2a 20 70 6f 70 75   (as.    ** popu
2d020 6c 61 74 69 6e 67 20 74 68 65 6d 20 63 68 61 6e  lating them chan
2d030 67 65 73 20 74 68 65 20 74 69 6d 65 73 74 61 6d  ges the timestam
2d040 70 29 2e 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28  p).  */.    for(
2d050 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a  i=0; i<2; i++){.
2d060 20 20 20 20 20 20 6a 20 3d 20 73 71 6c 69 74 65        j = sqlite
2d070 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74 65 72  3_bind_parameter
2d080 5f 69 6e 64 65 78 28 70 53 71 6c 2c 20 22 24 64  _index(pSql, "$d
2d090 69 72 4f 6e 6c 79 22 29 3b 0a 20 20 20 20 20 20  irOnly");.      
2d0a0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
2d0b0 28 70 53 71 6c 2c 20 6a 2c 20 69 29 3b 0a 20 20  (pSql, j, i);.  
2d0c0 20 20 20 20 69 66 28 20 70 41 72 2d 3e 62 44 72      if( pAr->bDr
2d0d0 79 52 75 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  yRun ){.        
2d0e0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72 2d  utf8_printf(pAr-
2d0f0 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  >p->out, "%s\n",
2d100 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 71   sqlite3_sql(pSq
2d110 6c 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  l));.      }else
2d120 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
2d130 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
2d140 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  & SQLITE_ROW==sq
2d150 6c 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29  lite3_step(pSql)
2d160 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
2d170 28 20 69 3d 3d 30 20 26 26 20 70 41 72 2d 3e 62  ( i==0 && pAr->b
2d180 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20  Verbose ){.     
2d190 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2d1a0 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20  tf(pAr->p->out, 
2d1b0 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f  "%s\n", sqlite3_
2d1c0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
2d1d0 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 20 20 20  , 0));.         
2d1e0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
2d1f0 20 20 20 7d 0a 20 20 20 20 20 20 73 68 65 6c 6c     }.      shell
2d200 52 65 73 65 74 28 26 72 63 2c 20 70 53 71 6c 29  Reset(&rc, pSql)
2d210 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 68 65 6c  ;.    }.    shel
2d220 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70  lFinalize(&rc, p
2d230 53 71 6c 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c  Sql);.  }..  sql
2d240 69 74 65 33 5f 66 72 65 65 28 7a 44 69 72 29 3b  ite3_free(zDir);
2d250 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
2d260 7a 57 68 65 72 65 29 3b 0a 20 20 72 65 74 75 72  zWhere);.  retur
2d270 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
2d280 75 6e 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  un the SQL state
2d290 6d 65 6e 74 20 69 6e 20 7a 53 71 6c 2e 20 20 4f  ment in zSql.  O
2d2a0 72 20 69 66 20 64 6f 69 6e 67 20 61 20 2d 2d 64  r if doing a --d
2d2b0 72 79 72 75 6e 2c 20 6d 65 72 65 6c 79 20 70 72  ryrun, merely pr
2d2c0 69 6e 74 20 69 74 20 6f 75 74 2e 0a 2a 2f 0a 73  int it out..*/.s
2d2d0 74 61 74 69 63 20 69 6e 74 20 61 72 45 78 65 63  tatic int arExec
2d2e0 53 71 6c 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70  Sql(ArCommand *p
2d2f0 41 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  Ar, const char *
2d300 7a 53 71 6c 29 7b 0a 20 20 69 6e 74 20 72 63 3b  zSql){.  int rc;
2d310 0a 20 20 69 66 28 20 70 41 72 2d 3e 62 44 72 79  .  if( pAr->bDry
2d320 52 75 6e 20 29 7b 0a 20 20 20 20 75 74 66 38 5f  Run ){.    utf8_
2d330 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f  printf(pAr->p->o
2d340 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 53 71 6c  ut, "%s\n", zSql
2d350 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51 4c 49  );.    rc = SQLI
2d360 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65 7b 0a  TE_OK;.  }else{.
2d370 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d      char *zErr =
2d380 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c   0;.    rc = sql
2d390 69 74 65 33 5f 65 78 65 63 28 70 41 72 2d 3e 64  ite3_exec(pAr->d
2d3a0 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26  b, zSql, 0, 0, &
2d3b0 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 7a  zErr);.    if( z
2d3c0 45 72 72 20 29 7b 0a 20 20 20 20 20 20 75 74 66  Err ){.      utf
2d3d0 38 5f 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c  8_printf(stdout,
2d3e0 20 22 45 52 52 4f 52 3a 20 25 73 5c 6e 22 2c 20   "ERROR: %s\n", 
2d3f0 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  zErr);.      sql
2d400 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b  ite3_free(zErr);
2d410 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
2d420 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a  urn rc;.}.../*.*
2d430 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  * Implementation
2d440 20 6f 66 20 2e 61 72 20 22 63 72 65 61 74 65 22   of .ar "create"
2d450 20 61 6e 64 20 22 75 70 64 61 74 65 22 20 63 6f   and "update" co
2d460 6d 6d 61 6e 64 73 2e 0a 2a 2a 0a 2a 2a 20 43 72  mmands..**.** Cr
2d470 65 61 74 65 20 74 68 65 20 22 73 71 6c 61 72 22  eate the "sqlar"
2d480 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61   table in the da
2d490 74 61 62 61 73 65 20 69 66 20 69 74 20 64 6f 65  tabase if it doe
2d4a0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
2d4b0 69 73 74 2e 0a 2a 2a 20 54 68 65 6e 20 61 64 64  ist..** Then add
2d4c0 20 65 61 63 68 20 66 69 6c 65 20 69 6e 20 74 68   each file in th
2d4d0 65 20 61 7a 46 69 6c 65 5b 5d 20 61 72 72 61 79  e azFile[] array
2d4e0 20 74 6f 20 74 68 65 20 61 72 63 68 69 76 65 2e   to the archive.
2d4f0 20 44 69 72 65 63 74 6f 72 69 65 73 0a 2a 2a 20   Directories.** 
2d500 61 72 65 20 61 64 64 65 64 20 72 65 63 75 72 73  are added recurs
2d510 69 76 65 6c 79 2e 20 49 66 20 61 72 67 75 6d 65  ively. If argume
2d520 6e 74 20 62 56 65 72 62 6f 73 65 20 69 73 20 6e  nt bVerbose is n
2d530 6f 6e 2d 7a 65 72 6f 2c 20 61 20 6d 65 73 73 61  on-zero, a messa
2d540 67 65 20 69 73 0a 2a 2a 20 70 72 69 6e 74 65 64  ge is.** printed
2d550 20 6f 6e 20 73 74 64 6f 75 74 20 66 6f 72 20 65   on stdout for e
2d560 61 63 68 20 66 69 6c 65 20 61 72 63 68 69 76 65  ach file archive
2d570 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63 72 65  d..**.** The cre
2d580 61 74 65 20 63 6f 6d 6d 61 6e 64 20 69 73 20 74  ate command is t
2d590 68 65 20 73 61 6d 65 20 61 73 20 75 70 64 61 74  he same as updat
2d5a0 65 2c 20 65 78 63 65 70 74 20 74 68 61 74 20 69  e, except that i
2d5b0 74 20 64 72 6f 70 73 0a 2a 2a 20 61 6e 79 20 65  t drops.** any e
2d5c0 78 69 73 74 69 6e 67 20 22 73 71 6c 61 72 22 20  xisting "sqlar" 
2d5d0 74 61 62 6c 65 20 62 65 66 6f 72 65 20 62 65 67  table before beg
2d5e0 69 6e 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  inning..*/.stati
2d5f0 63 20 69 6e 74 20 61 72 43 72 65 61 74 65 4f 72  c int arCreateOr
2d600 55 70 64 61 74 65 43 6f 6d 6d 61 6e 64 28 0a 20  UpdateCommand(. 
2d610 20 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c   ArCommand *pAr,
2d620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d630 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75   /* Command argu
2d640 6d 65 6e 74 73 20 61 6e 64 20 6f 70 74 69 6f 6e  ments and option
2d650 73 20 2a 2f 0a 20 20 69 6e 74 20 62 55 70 64 61  s */.  int bUpda
2d660 74 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  te              
2d670 20 20 20 20 20 20 20 2f 2a 20 74 72 75 65 20 66         /* true f
2d680 6f 72 20 61 20 2d 2d 63 72 65 61 74 65 2e 20 20  or a --create.  
2d690 66 61 6c 73 65 20 66 6f 72 20 2d 2d 75 70 64 61  false for --upda
2d6a0 74 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e 73 74  te */.){.  const
2d6b0 20 63 68 61 72 20 2a 7a 43 72 65 61 74 65 20 3d   char *zCreate =
2d6c0 20 0a 20 20 20 20 20 20 22 43 52 45 41 54 45 20   .      "CREATE 
2d6d0 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49  TABLE IF NOT EXI
2d6e0 53 54 53 20 73 71 6c 61 72 28 5c 6e 22 0a 20 20  STS sqlar(\n".  
2d6f0 20 20 20 20 22 20 20 6e 61 6d 65 20 54 45 58 54      "  name TEXT
2d700 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 20 2d   PRIMARY KEY,  -
2d710 2d 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 69  - name of the fi
2d720 6c 65 5c 6e 22 0a 20 20 20 20 20 20 22 20 20 6d  le\n".      "  m
2d730 6f 64 65 20 49 4e 54 2c 20 20 20 20 20 20 20 20  ode INT,        
2d740 20 20 20 20 20 20 20 2d 2d 20 61 63 63 65 73 73         -- access
2d750 20 70 65 72 6d 69 73 73 69 6f 6e 73 5c 6e 22 0a   permissions\n".
2d760 20 20 20 20 20 20 22 20 20 6d 74 69 6d 65 20 49        "  mtime I
2d770 4e 54 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  NT,             
2d780 20 2d 2d 20 6c 61 73 74 20 6d 6f 64 69 66 69 63   -- last modific
2d790 61 74 69 6f 6e 20 74 69 6d 65 5c 6e 22 0a 20 20  ation time\n".  
2d7a0 20 20 20 20 22 20 20 73 7a 20 49 4e 54 2c 20 20      "  sz INT,  
2d7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
2d7c0 2d 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65 20  - original file 
2d7d0 73 69 7a 65 5c 6e 22 0a 20 20 20 20 20 20 22 20  size\n".      " 
2d7e0 20 64 61 74 61 20 42 4c 4f 42 20 20 20 20 20 20   data BLOB      
2d7f0 20 20 20 20 20 20 20 20 20 2d 2d 20 63 6f 6d 70           -- comp
2d800 72 65 73 73 65 64 20 63 6f 6e 74 65 6e 74 5c 6e  ressed content\n
2d810 22 0a 20 20 20 20 20 20 22 29 22 3b 0a 20 20 63  ".      ")";.  c
2d820 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 72 6f 70  onst char *zDrop
2d830 20 3d 20 22 44 52 4f 50 20 54 41 42 4c 45 20 49   = "DROP TABLE I
2d840 46 20 45 58 49 53 54 53 20 73 71 6c 61 72 22 3b  F EXISTS sqlar";
2d850 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
2d860 49 6e 73 65 72 74 46 6d 74 5b 32 5d 20 3d 20 7b  InsertFmt[2] = {
2d870 0a 20 20 20 20 20 22 52 45 50 4c 41 43 45 20 49  .     "REPLACE I
2d880 4e 54 4f 20 25 73 28 6e 61 6d 65 2c 6d 6f 64 65  NTO %s(name,mode
2d890 2c 6d 74 69 6d 65 2c 73 7a 2c 64 61 74 61 29 5c  ,mtime,sz,data)\
2d8a0 6e 22 0a 20 20 20 20 20 22 20 20 53 45 4c 45 43  n".     "  SELEC
2d8b0 54 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 25  T\n".     "    %
2d8c0 73 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20  s,\n".     "    
2d8d0 6d 6f 64 65 2c 5c 6e 22 0a 20 20 20 20 20 22 20  mode,\n".     " 
2d8e0 20 20 20 6d 74 69 6d 65 2c 5c 6e 22 0a 20 20 20     mtime,\n".   
2d8f0 20 20 22 20 20 20 20 43 41 53 45 20 73 75 62 73    "    CASE subs
2d900 74 72 28 6c 73 6d 6f 64 65 28 6d 6f 64 65 29 2c  tr(lsmode(mode),
2d910 31 2c 31 29 5c 6e 22 0a 20 20 20 20 20 22 20 20  1,1)\n".     "  
2d920 20 20 20 20 57 48 45 4e 20 27 2d 27 20 54 48 45      WHEN '-' THE
2d930 4e 20 6c 65 6e 67 74 68 28 64 61 74 61 29 5c 6e  N length(data)\n
2d940 22 0a 20 20 20 20 20 22 20 20 20 20 20 20 57 48  ".     "      WH
2d950 45 4e 20 27 64 27 20 54 48 45 4e 20 30 5c 6e 22  EN 'd' THEN 0\n"
2d960 0a 20 20 20 20 20 22 20 20 20 20 20 20 45 4c 53  .     "      ELS
2d970 45 20 2d 31 20 45 4e 44 2c 5c 6e 22 0a 20 20 20  E -1 END,\n".   
2d980 20 20 22 20 20 20 20 73 71 6c 61 72 5f 63 6f 6d    "    sqlar_com
2d990 70 72 65 73 73 28 64 61 74 61 29 5c 6e 22 0a 20  press(data)\n". 
2d9a0 20 20 20 20 22 20 20 46 52 4f 4d 20 66 73 64 69      "  FROM fsdi
2d9b0 72 28 25 51 2c 25 51 29 5c 6e 22 0a 20 20 20 20  r(%Q,%Q)\n".    
2d9c0 20 22 20 20 57 48 45 52 45 20 6c 73 6d 6f 64 65   "  WHERE lsmode
2d9d0 28 6d 6f 64 65 29 20 4e 4f 54 20 4c 49 4b 45 20  (mode) NOT LIKE 
2d9e0 27 3f 25 25 27 3b 22 2c 0a 20 20 20 20 20 22 52  '?%%';",.     "R
2d9f0 45 50 4c 41 43 45 20 49 4e 54 4f 20 25 73 28 6e  EPLACE INTO %s(n
2da00 61 6d 65 2c 6d 6f 64 65 2c 6d 74 69 6d 65 2c 64  ame,mode,mtime,d
2da10 61 74 61 29 5c 6e 22 0a 20 20 20 20 20 22 20 20  ata)\n".     "  
2da20 53 45 4c 45 43 54 5c 6e 22 0a 20 20 20 20 20 22  SELECT\n".     "
2da30 20 20 20 20 25 73 2c 5c 6e 22 0a 20 20 20 20 20      %s,\n".     
2da40 22 20 20 20 20 6d 6f 64 65 2c 5c 6e 22 0a 20 20  "    mode,\n".  
2da50 20 20 20 22 20 20 20 20 6d 74 69 6d 65 2c 5c 6e     "    mtime,\n
2da60 22 0a 20 20 20 20 20 22 20 20 20 20 64 61 74 61  ".     "    data
2da70 5c 6e 22 0a 20 20 20 20 20 22 20 20 46 52 4f 4d  \n".     "  FROM
2da80 20 66 73 64 69 72 28 25 51 2c 25 51 29 5c 6e 22   fsdir(%Q,%Q)\n"
2da90 0a 20 20 20 20 20 22 20 20 57 48 45 52 45 20 6c  .     "  WHERE l
2daa0 73 6d 6f 64 65 28 6d 6f 64 65 29 20 4e 4f 54 20  smode(mode) NOT 
2dab0 4c 49 4b 45 20 27 3f 25 25 27 3b 22 0a 20 20 7d  LIKE '?%%';".  }
2dac0 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  ;.  int i;      
2dad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dae0 20 20 20 20 2f 2a 20 46 6f 72 20 69 74 65 72 61      /* For itera
2daf0 74 69 6e 67 20 74 68 72 6f 75 67 68 20 61 7a 46  ting through azF
2db00 69 6c 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72  ile[] */.  int r
2db10 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c;              
2db20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2db30 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 63  turn code */.  c
2db40 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
2db50 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
2db60 2a 20 53 51 4c 20 74 61 62 6c 65 20 69 6e 74 6f  * SQL table into
2db70 20 77 68 69 63 68 20 74 6f 20 69 6e 73 65 72 74   which to insert
2db80 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c   */.  char *zSql
2db90 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70 5b 35  ;.  char zTemp[5
2dba0 30 5d 3b 0a 0a 20 20 61 72 45 78 65 63 53 71 6c  0];..  arExecSql
2dbb0 28 70 41 72 2c 20 22 50 52 41 47 4d 41 20 70 61  (pAr, "PRAGMA pa
2dbc0 67 65 5f 73 69 7a 65 3d 35 31 32 22 29 3b 0a 20  ge_size=512");. 
2dbd0 20 72 63 20 3d 20 61 72 45 78 65 63 53 71 6c 28   rc = arExecSql(
2dbe0 70 41 72 2c 20 22 53 41 56 45 50 4f 49 4e 54 20  pAr, "SAVEPOINT 
2dbf0 61 72 3b 22 29 3b 0a 20 20 69 66 28 20 72 63 21  ar;");.  if( rc!
2dc00 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
2dc10 75 72 6e 20 72 63 3b 0a 20 20 7a 54 65 6d 70 5b  urn rc;.  zTemp[
2dc20 30 5d 20 3d 20 30 3b 20 0a 20 20 69 66 28 20 70  0] = 0; .  if( p
2dc30 41 72 2d 3e 62 5a 69 70 20 29 7b 0a 20 20 20 20  Ar->bZip ){.    
2dc40 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  /* Initialize th
2dc50 65 20 7a 69 70 66 69 6c 65 20 76 69 72 74 75 61  e zipfile virtua
2dc60 6c 20 74 61 62 6c 65 2c 20 69 66 20 6e 65 63 65  l table, if nece
2dc70 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 69 66 28  ssary */.    if(
2dc80 20 70 41 72 2d 3e 7a 46 69 6c 65 20 29 7b 0a 20   pAr->zFile ){. 
2dc90 20 20 20 20 20 73 71 6c 69 74 65 33 5f 75 69 6e       sqlite3_uin
2dca0 74 36 34 20 72 3b 0a 20 20 20 20 20 20 73 71 6c  t64 r;.      sql
2dcb0 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
2dcc0 73 69 7a 65 6f 66 28 72 29 2c 26 72 29 3b 0a 20  sizeof(r),&r);. 
2dcd0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
2dce0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 54 65  rintf(sizeof(zTe
2dcf0 6d 70 29 2c 7a 54 65 6d 70 2c 22 7a 69 70 25 30  mp),zTemp,"zip%0
2dd00 31 36 6c 6c 78 22 2c 72 29 3b 0a 20 20 20 20 20  16llx",r);.     
2dd10 20 7a 54 61 62 20 3d 20 7a 54 65 6d 70 3b 0a 20   zTab = zTemp;. 
2dd20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69       zSql = sqli
2dd30 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
2dd40 20 20 20 20 20 20 22 43 52 45 41 54 45 20 56 49        "CREATE VI
2dd50 52 54 55 41 4c 20 54 41 42 4c 45 20 74 65 6d 70  RTUAL TABLE temp
2dd60 2e 25 73 20 55 53 49 4e 47 20 7a 69 70 66 69 6c  .%s USING zipfil
2dd70 65 28 25 51 29 22 2c 0a 20 20 20 20 20 20 20 20  e(%Q)",.        
2dd80 20 7a 54 61 62 2c 20 70 41 72 2d 3e 7a 46 69 6c   zTab, pAr->zFil
2dd90 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  e.      );.     
2dda0 20 72 63 20 3d 20 61 72 45 78 65 63 53 71 6c 28   rc = arExecSql(
2ddb0 70 41 72 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20  pAr, zSql);.    
2ddc0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2ddd0 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Sql);.    }else{
2dde0 0a 20 20 20 20 20 20 7a 54 61 62 20 3d 20 22 7a  .      zTab = "z
2ddf0 69 70 22 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ip";.    }.  }el
2de00 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69 74 69  se{.    /* Initi
2de10 61 6c 69 7a 65 20 74 68 65 20 74 61 62 6c 65 20  alize the table 
2de20 66 6f 72 20 61 6e 20 53 51 4c 41 52 20 2a 2f 0a  for an SQLAR */.
2de30 20 20 20 20 7a 54 61 62 20 3d 20 22 73 71 6c 61      zTab = "sqla
2de40 72 22 3b 0a 20 20 20 20 69 66 28 20 62 55 70 64  r";.    if( bUpd
2de50 61 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ate==0 ){.      
2de60 72 63 20 3d 20 61 72 45 78 65 63 53 71 6c 28 70  rc = arExecSql(p
2de70 41 72 2c 20 7a 44 72 6f 70 29 3b 0a 20 20 20 20  Ar, zDrop);.    
2de80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2de90 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64 5f 61  _OK ) goto end_a
2dea0 72 5f 74 72 61 6e 73 61 63 74 69 6f 6e 3b 0a 20  r_transaction;. 
2deb0 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 61 72     }.    rc = ar
2dec0 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a 43 72  ExecSql(pAr, zCr
2ded0 65 61 74 65 29 3b 0a 20 20 7d 0a 20 20 66 6f 72  eate);.  }.  for
2dee0 28 69 3d 30 3b 20 69 3c 70 41 72 2d 3e 6e 41 72  (i=0; i<pAr->nAr
2def0 67 20 26 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f  g && rc==SQLITE_
2df00 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68  OK; i++){.    ch
2df10 61 72 20 2a 7a 53 71 6c 32 20 3d 20 73 71 6c 69  ar *zSql2 = sqli
2df20 74 65 33 5f 6d 70 72 69 6e 74 66 28 7a 49 6e 73  te3_mprintf(zIns
2df30 65 72 74 46 6d 74 5b 70 41 72 2d 3e 62 5a 69 70  ertFmt[pAr->bZip
2df40 5d 2c 20 7a 54 61 62 2c 0a 20 20 20 20 20 20 20  ], zTab,.       
2df50 20 70 41 72 2d 3e 62 56 65 72 62 6f 73 65 20 3f   pAr->bVerbose ?
2df60 20 22 73 68 65 6c 6c 5f 70 75 74 73 6e 6c 28 6e   "shell_putsnl(n
2df70 61 6d 65 29 22 20 3a 20 22 6e 61 6d 65 22 2c 0a  ame)" : "name",.
2df80 20 20 20 20 20 20 20 20 70 41 72 2d 3e 61 7a 41          pAr->azA
2df90 72 67 5b 69 5d 2c 20 70 41 72 2d 3e 7a 44 69 72  rg[i], pAr->zDir
2dfa0 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 72 45 78  );.    rc = arEx
2dfb0 65 63 53 71 6c 28 70 41 72 2c 20 7a 53 71 6c 32  ecSql(pAr, zSql2
2dfc0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
2dfd0 72 65 65 28 7a 53 71 6c 32 29 3b 0a 20 20 7d 0a  ree(zSql2);.  }.
2dfe0 65 6e 64 5f 61 72 5f 74 72 61 6e 73 61 63 74 69  end_ar_transacti
2dff0 6f 6e 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51  on:.  if( rc!=SQ
2e000 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73  LITE_OK ){.    s
2e010 71 6c 69 74 65 33 5f 65 78 65 63 28 70 41 72 2d  qlite3_exec(pAr-
2e020 3e 64 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 20 54  >db, "ROLLBACK T
2e030 4f 20 61 72 3b 20 52 45 4c 45 41 53 45 20 61 72  O ar; RELEASE ar
2e040 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ;", 0, 0, 0);.  
2e050 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20  }else{.    rc = 
2e060 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 22  arExecSql(pAr, "
2e070 52 45 4c 45 41 53 45 20 61 72 3b 22 29 3b 0a 20  RELEASE ar;");. 
2e080 20 20 20 69 66 28 20 70 41 72 2d 3e 62 5a 69 70     if( pAr->bZip
2e090 20 26 26 20 70 41 72 2d 3e 7a 46 69 6c 65 20 29   && pAr->zFile )
2e0a0 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73  {.      zSql = s
2e0b0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
2e0c0 44 52 4f 50 20 54 41 42 4c 45 20 25 73 22 2c 20  DROP TABLE %s", 
2e0d0 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 61 72  zTemp);.      ar
2e0e0 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a 53 71  ExecSql(pAr, zSq
2e0f0 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
2e100 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
2e110 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2e120 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d   rc;.}../*.** Im
2e130 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
2e140 22 2e 61 72 22 20 64 6f 74 20 63 6f 6d 6d 61 6e  ".ar" dot comman
2e150 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
2e160 20 61 72 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20   arDotCommand(. 
2e170 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74   ShellState *pSt
2e180 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
2e190 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68 65 6c   /* Current shel
2e1a0 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a  l tool state */.
2e1b0 20 20 69 6e 74 20 66 72 6f 6d 43 6d 64 4c 69 6e    int fromCmdLin
2e1c0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e,              
2e1d0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 2d 41 20    /* True if -A 
2e1e0 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74  command-line opt
2e1f0 69 6f 6e 2c 20 6e 6f 74 20 2e 61 72 20 63 6d 64  ion, not .ar cmd
2e200 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41   */.  char **azA
2e210 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
2e220 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
2e230 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  f arguments pass
2e240 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e  ed to dot comman
2e250 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20  d */.  int nArg 
2e260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e270 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2e280 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
2e290 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 41  zArg[] */.){.  A
2e2a0 72 43 6f 6d 6d 61 6e 64 20 63 6d 64 3b 0a 20 20  rCommand cmd;.  
2e2b0 69 6e 74 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74  int rc;.  memset
2e2c0 28 26 63 6d 64 2c 20 30 2c 20 73 69 7a 65 6f 66  (&cmd, 0, sizeof
2e2d0 28 63 6d 64 29 29 3b 0a 20 20 63 6d 64 2e 66 72  (cmd));.  cmd.fr
2e2e0 6f 6d 43 6d 64 4c 69 6e 65 20 3d 20 66 72 6f 6d  omCmdLine = from
2e2f0 43 6d 64 4c 69 6e 65 3b 0a 20 20 72 63 20 3d 20  CmdLine;.  rc = 
2e300 61 72 50 61 72 73 65 43 6f 6d 6d 61 6e 64 28 61  arParseCommand(a
2e310 7a 41 72 67 2c 20 6e 41 72 67 2c 20 26 63 6d 64  zArg, nArg, &cmd
2e320 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
2e330 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
2e340 74 20 65 44 62 54 79 70 65 20 3d 20 53 48 45 4c  t eDbType = SHEL
2e350 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43 3b 0a 20  L_OPEN_UNSPEC;. 
2e360 20 20 20 63 6d 64 2e 70 20 3d 20 70 53 74 61 74     cmd.p = pStat
2e370 65 3b 0a 20 20 20 20 63 6d 64 2e 64 62 20 3d 20  e;.    cmd.db = 
2e380 70 53 74 61 74 65 2d 3e 64 62 3b 0a 20 20 20 20  pState->db;.    
2e390 69 66 28 20 63 6d 64 2e 7a 46 69 6c 65 20 29 7b  if( cmd.zFile ){
2e3a0 0a 20 20 20 20 20 20 65 44 62 54 79 70 65 20 3d  .      eDbType =
2e3b0 20 64 65 64 75 63 65 44 61 74 61 62 61 73 65 54   deduceDatabaseT
2e3c0 79 70 65 28 63 6d 64 2e 7a 46 69 6c 65 2c 20 31  ype(cmd.zFile, 1
2e3d0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2e3e0 20 20 20 20 65 44 62 54 79 70 65 20 3d 20 70 53      eDbType = pS
2e3f0 74 61 74 65 2d 3e 6f 70 65 6e 4d 6f 64 65 3b 0a  tate->openMode;.
2e400 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 65 44      }.    if( eD
2e410 62 54 79 70 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45  bType==SHELL_OPE
2e420 4e 5f 5a 49 50 46 49 4c 45 20 29 7b 0a 20 20 20  N_ZIPFILE ){.   
2e430 20 20 20 69 66 28 20 63 6d 64 2e 65 43 6d 64 3d     if( cmd.eCmd=
2e440 3d 41 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 20  =AR_CMD_EXTRACT 
2e450 7c 7c 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f  || cmd.eCmd==AR_
2e460 43 4d 44 5f 4c 49 53 54 20 29 7b 0a 20 20 20 20  CMD_LIST ){.    
2e470 20 20 20 20 69 66 28 20 63 6d 64 2e 7a 46 69 6c      if( cmd.zFil
2e480 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
2e490 20 20 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65 20    cmd.zSrcTable 
2e4a0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2e4b0 66 28 22 7a 69 70 22 29 3b 0a 20 20 20 20 20 20  f("zip");.      
2e4c0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2e4d0 20 20 20 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65     cmd.zSrcTable
2e4e0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2e4f0 74 66 28 22 7a 69 70 66 69 6c 65 28 25 51 29 22  tf("zipfile(%Q)"
2e500 2c 20 63 6d 64 2e 7a 46 69 6c 65 29 3b 0a 20 20  , cmd.zFile);.  
2e510 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2e520 20 20 20 20 20 20 63 6d 64 2e 62 5a 69 70 20 3d        cmd.bZip =
2e530 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   1;.    }else if
2e540 28 20 63 6d 64 2e 7a 46 69 6c 65 20 29 7b 0a 20  ( cmd.zFile ){. 
2e550 20 20 20 20 20 69 6e 74 20 66 6c 61 67 73 3b 0a       int flags;.
2e560 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e 62 41        if( cmd.bA
2e570 70 70 65 6e 64 20 29 20 65 44 62 54 79 70 65 20  ppend ) eDbType 
2e580 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50  = SHELL_OPEN_APP
2e590 45 4e 44 56 46 53 3b 0a 20 20 20 20 20 20 69 66  ENDVFS;.      if
2e5a0 28 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43  ( cmd.eCmd==AR_C
2e5b0 4d 44 5f 43 52 45 41 54 45 20 7c 7c 20 63 6d 64  MD_CREATE || cmd
2e5c0 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 55 50  .eCmd==AR_CMD_UP
2e5d0 44 41 54 45 20 29 7b 0a 20 20 20 20 20 20 20 20  DATE ){.        
2e5e0 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f  flags = SQLITE_O
2e5f0 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51  PEN_READWRITE|SQ
2e600 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45  LITE_OPEN_CREATE
2e610 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2e620 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d 20 53         flags = S
2e630 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f  QLITE_OPEN_READO
2e640 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  NLY;.      }.   
2e650 20 20 20 63 6d 64 2e 64 62 20 3d 20 30 3b 0a 20     cmd.db = 0;. 
2e660 20 20 20 20 20 69 66 28 20 63 6d 64 2e 62 44 72       if( cmd.bDr
2e670 79 52 75 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  yRun ){.        
2e680 75 74 66 38 5f 70 72 69 6e 74 66 28 70 53 74 61  utf8_printf(pSta
2e690 74 65 2d 3e 6f 75 74 2c 20 22 2d 2d 20 6f 70 65  te->out, "-- ope
2e6a0 6e 20 64 61 74 61 62 61 73 65 20 27 25 73 27 25  n database '%s'%
2e6b0 73 5c 6e 22 2c 20 63 6d 64 2e 7a 46 69 6c 65 2c  s\n", cmd.zFile,
2e6c0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 65 44  .             eD
2e6d0 62 54 79 70 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45  bType==SHELL_OPE
2e6e0 4e 5f 41 50 50 45 4e 44 56 46 53 20 3f 20 22 20  N_APPENDVFS ? " 
2e6f0 75 73 69 6e 67 20 27 61 70 6e 64 76 66 73 27 22  using 'apndvfs'"
2e700 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 7d 0a   : "");.      }.
2e710 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
2e720 65 33 5f 6f 70 65 6e 5f 76 32 28 63 6d 64 2e 7a  e3_open_v2(cmd.z
2e730 46 69 6c 65 2c 20 26 63 6d 64 2e 64 62 2c 20 66  File, &cmd.db, f
2e740 6c 61 67 73 2c 20 0a 20 20 20 20 20 20 20 20 20  lags, .         
2e750 20 20 20 20 65 44 62 54 79 70 65 3d 3d 53 48 45      eDbType==SHE
2e760 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46  LL_OPEN_APPENDVF
2e770 53 20 3f 20 22 61 70 6e 64 76 66 73 22 20 3a 20  S ? "apndvfs" : 
2e780 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
2e790 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
2e7a0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2e7b0 74 66 28 73 74 64 65 72 72 2c 20 22 63 61 6e 6e  tf(stderr, "cann
2e7c0 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20 25 73  ot open file: %s
2e7d0 20 28 25 73 29 5c 6e 22 2c 20 0a 20 20 20 20 20   (%s)\n", .     
2e7e0 20 20 20 20 20 20 20 63 6d 64 2e 7a 46 69 6c 65         cmd.zFile
2e7f0 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
2e800 28 63 6d 64 2e 64 62 29 0a 20 20 20 20 20 20 20  (cmd.db).       
2e810 20 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   );.        goto
2e820 20 65 6e 64 5f 61 72 5f 63 6f 6d 6d 61 6e 64 3b   end_ar_command;
2e830 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
2e840 71 6c 69 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e  qlite3_fileio_in
2e850 69 74 28 63 6d 64 2e 64 62 2c 20 30 2c 20 30 29  it(cmd.db, 0, 0)
2e860 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2e870 73 71 6c 61 72 5f 69 6e 69 74 28 63 6d 64 2e 64  sqlar_init(cmd.d
2e880 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  b, 0, 0);.      
2e890 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
2e8a0 75 6e 63 74 69 6f 6e 28 63 6d 64 2e 64 62 2c 20  unction(cmd.db, 
2e8b0 22 73 68 65 6c 6c 5f 70 75 74 73 6e 6c 22 2c 20  "shell_putsnl", 
2e8c0 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20  1, SQLITE_UTF8, 
2e8d0 63 6d 64 2e 70 2c 0a 20 20 20 20 20 20 20 20 20  cmd.p,.         
2e8e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e8f0 20 20 20 20 20 73 68 65 6c 6c 50 75 74 73 46 75       shellPutsFu
2e900 6e 63 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20  nc, 0, 0);..    
2e910 7d 0a 20 20 20 20 69 66 28 20 63 6d 64 2e 7a 53  }.    if( cmd.zS
2e920 72 63 54 61 62 6c 65 3d 3d 30 20 26 26 20 63 6d  rcTable==0 && cm
2e930 64 2e 62 5a 69 70 3d 3d 30 20 26 26 20 63 6d 64  d.bZip==0 && cmd
2e940 2e 65 43 6d 64 21 3d 41 52 5f 43 4d 44 5f 48 45  .eCmd!=AR_CMD_HE
2e950 4c 50 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  LP ){.      if( 
2e960 63 6d 64 2e 65 43 6d 64 21 3d 41 52 5f 43 4d 44  cmd.eCmd!=AR_CMD
2e970 5f 43 52 45 41 54 45 0a 20 20 20 20 20 20 20 26  _CREATE.       &
2e980 26 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f  & sqlite3_table_
2e990 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28  column_metadata(
2e9a0 63 6d 64 2e 64 62 2c 30 2c 22 73 71 6c 61 72 22  cmd.db,0,"sqlar"
2e9b0 2c 22 6e 61 6d 65 22 2c 30 2c 30 2c 30 2c 30 2c  ,"name",0,0,0,0,
2e9c0 30 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  0).      ){.    
2e9d0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2e9e0 73 74 64 65 72 72 2c 20 22 64 61 74 61 62 61 73  stderr, "databas
2e9f0 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  e does not conta
2ea00 69 6e 20 61 6e 20 27 73 71 6c 61 72 27 20 74 61  in an 'sqlar' ta
2ea10 62 6c 65 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  ble\n");.       
2ea20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
2ea30 4f 52 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  OR;.        goto
2ea40 20 65 6e 64 5f 61 72 5f 63 6f 6d 6d 61 6e 64 3b   end_ar_command;
2ea50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
2ea60 6d 64 2e 7a 53 72 63 54 61 62 6c 65 20 3d 20 73  md.zSrcTable = s
2ea70 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
2ea80 73 71 6c 61 72 22 29 3b 0a 20 20 20 20 7d 0a 0a  sqlar");.    }..
2ea90 20 20 20 20 73 77 69 74 63 68 28 20 63 6d 64 2e      switch( cmd.
2eaa0 65 43 6d 64 20 29 7b 0a 20 20 20 20 20 20 63 61  eCmd ){.      ca
2eab0 73 65 20 41 52 5f 43 4d 44 5f 43 52 45 41 54 45  se AR_CMD_CREATE
2eac0 3a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61  :.        rc = a
2ead0 72 43 72 65 61 74 65 4f 72 55 70 64 61 74 65 43  rCreateOrUpdateC
2eae0 6f 6d 6d 61 6e 64 28 26 63 6d 64 2c 20 30 29 3b  ommand(&cmd, 0);
2eaf0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2eb00 0a 20 20 20 20 20 20 63 61 73 65 20 41 52 5f 43  .      case AR_C
2eb10 4d 44 5f 45 58 54 52 41 43 54 3a 0a 20 20 20 20  MD_EXTRACT:.    
2eb20 20 20 20 20 72 63 20 3d 20 61 72 45 78 74 72 61      rc = arExtra
2eb30 63 74 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 29 3b  ctCommand(&cmd);
2eb40 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2eb50 0a 20 20 20 20 20 20 63 61 73 65 20 41 52 5f 43  .      case AR_C
2eb60 4d 44 5f 4c 49 53 54 3a 0a 20 20 20 20 20 20 20  MD_LIST:.       
2eb70 20 72 63 20 3d 20 61 72 4c 69 73 74 43 6f 6d 6d   rc = arListComm
2eb80 61 6e 64 28 26 63 6d 64 29 3b 0a 20 20 20 20 20  and(&cmd);.     
2eb90 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
2eba0 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 48 45 4c   case AR_CMD_HEL
2ebb0 50 3a 0a 20 20 20 20 20 20 20 20 61 72 55 73 61  P:.        arUsa
2ebc0 67 65 28 70 53 74 61 74 65 2d 3e 6f 75 74 29 3b  ge(pState->out);
2ebd0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2ebe0 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  .      default:.
2ebf0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2ec00 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44  cmd.eCmd==AR_CMD
2ec10 5f 55 50 44 41 54 45 20 29 3b 0a 20 20 20 20 20  _UPDATE );.     
2ec20 20 20 20 72 63 20 3d 20 61 72 43 72 65 61 74 65     rc = arCreate
2ec30 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e 64 28  OrUpdateCommand(
2ec40 26 63 6d 64 2c 20 31 29 3b 0a 20 20 20 20 20 20  &cmd, 1);.      
2ec50 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
2ec60 20 7d 0a 65 6e 64 5f 61 72 5f 63 6f 6d 6d 61 6e   }.end_ar_comman
2ec70 64 3a 0a 20 20 69 66 28 20 63 6d 64 2e 64 62 21  d:.  if( cmd.db!
2ec80 3d 70 53 74 61 74 65 2d 3e 64 62 20 29 7b 0a 20  =pState->db ){. 
2ec90 20 20 20 63 6c 6f 73 65 5f 64 62 28 63 6d 64 2e     close_db(cmd.
2eca0 64 62 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  db);.  }.  sqlit
2ecb0 65 33 5f 66 72 65 65 28 63 6d 64 2e 7a 53 72 63  e3_free(cmd.zSrc
2ecc0 54 61 62 6c 65 29 3b 0a 0a 20 20 72 65 74 75 72  Table);..  retur
2ecd0 6e 20 72 63 3b 0a 7d 0a 2f 2a 20 45 6e 64 20 6f  n rc;.}./* End o
2ece0 66 20 74 68 65 20 22 2e 61 72 63 68 69 76 65 22  f the ".archive"
2ecf0 20 6f 72 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e   or ".ar" comman
2ed00 64 20 6c 6f 67 69 63 0a 2a 2a 2a 2a 2a 2a 2a 2a  d logic.********
2ed10 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ed20 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ed30 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ed40 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
2ed50 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64  **********/.#end
2ed60 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53  if /* !defined(S
2ed70 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2ed80 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69  ALTABLE) && defi
2ed90 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f  ned(SQLITE_HAVE_
2eda0 5a 4c 49 42 29 20 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a  ZLIB) */.../*.**
2edb0 20 49 66 20 61 6e 20 69 6e 70 75 74 20 6c 69 6e   If an input lin
2edc0 65 20 62 65 67 69 6e 73 20 77 69 74 68 20 22 2e  e begins with ".
2edd0 22 20 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68  " then invoke th
2ede0 69 73 20 72 6f 75 74 69 6e 65 20 74 6f 0a 2a 2a  is routine to.**
2edf0 20 70 72 6f 63 65 73 73 20 74 68 61 74 20 6c 69   process that li
2ee00 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ne..**.** Return
2ee10 20 31 20 6f 6e 20 65 72 72 6f 72 2c 20 32 20 74   1 on error, 2 t
2ee20 6f 20 65 78 69 74 2c 20 61 6e 64 20 30 20 6f 74  o exit, and 0 ot
2ee30 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
2ee40 69 63 20 69 6e 74 20 64 6f 5f 6d 65 74 61 5f 63  ic int do_meta_c
2ee50 6f 6d 6d 61 6e 64 28 63 68 61 72 20 2a 7a 4c 69  ommand(char *zLi
2ee60 6e 65 2c 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  ne, ShellState *
2ee70 70 29 7b 0a 20 20 69 6e 74 20 68 20 3d 20 31 3b  p){.  int h = 1;
2ee80 0a 20 20 69 6e 74 20 6e 41 72 67 20 3d 20 30 3b  .  int nArg = 0;
2ee90 0a 20 20 69 6e 74 20 6e 2c 20 63 3b 0a 20 20 69  .  int n, c;.  i
2eea0 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 63 68 61  nt rc = 0;.  cha
2eeb0 72 20 2a 61 7a 41 72 67 5b 35 30 5d 3b 0a 0a 23  r *azArg[50];..#
2eec0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
2eed0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a  IT_VIRTUALTABLE.
2eee0 20 20 69 66 28 20 70 2d 3e 65 78 70 65 72 74 2e    if( p->expert.
2eef0 70 45 78 70 65 72 74 20 29 7b 0a 20 20 20 20 65  pExpert ){.    e
2ef00 78 70 65 72 74 46 69 6e 69 73 68 28 70 2c 20 31  xpertFinish(p, 1
2ef10 2c 20 30 29 3b 0a 20 20 7d 0a 23 65 6e 64 69 66  , 0);.  }.#endif
2ef20 0a 0a 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65  ..  /* Parse the
2ef30 20 69 6e 70 75 74 20 6c 69 6e 65 20 69 6e 74 6f   input line into
2ef40 20 74 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a 20 20   tokens..  */.  
2ef50 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20  while( zLine[h] 
2ef60 26 26 20 6e 41 72 67 3c 41 72 72 61 79 53 69 7a  && nArg<ArraySiz
2ef70 65 28 61 7a 41 72 67 29 20 29 7b 0a 20 20 20 20  e(azArg) ){.    
2ef80 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a  while( IsSpace(z
2ef90 4c 69 6e 65 5b 68 5d 29 20 29 7b 20 68 2b 2b 3b  Line[h]) ){ h++;
2efa0 20 7d 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65   }.    if( zLine
2efb0 5b 68 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  [h]==0 ) break;.
2efc0 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d      if( zLine[h]
2efd0 3d 3d 27 5c 27 27 20 7c 7c 20 7a 4c 69 6e 65 5b  =='\'' || zLine[
2efe0 68 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20  h]=='"' ){.     
2eff0 20 69 6e 74 20 64 65 6c 69 6d 20 3d 20 7a 4c 69   int delim = zLi
2f000 6e 65 5b 68 2b 2b 5d 3b 0a 20 20 20 20 20 20 61  ne[h++];.      a
2f010 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26  zArg[nArg++] = &
2f020 7a 4c 69 6e 65 5b 68 5d 3b 0a 20 20 20 20 20 20  zLine[h];.      
2f030 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20  while( zLine[h] 
2f040 26 26 20 7a 4c 69 6e 65 5b 68 5d 21 3d 64 65 6c  && zLine[h]!=del
2f050 69 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  im ){.        if
2f060 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 5c 5c 27  ( zLine[h]=='\\'
2f070 20 26 26 20 64 65 6c 69 6d 3d 3d 27 22 27 20 26   && delim=='"' &
2f080 26 20 7a 4c 69 6e 65 5b 68 2b 31 5d 21 3d 30 20  & zLine[h+1]!=0 
2f090 29 20 68 2b 2b 3b 0a 20 20 20 20 20 20 20 20 68  ) h++;.        h
2f0a0 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
2f0b0 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d    if( zLine[h]==
2f0c0 64 65 6c 69 6d 20 29 7b 0a 20 20 20 20 20 20 20  delim ){.       
2f0d0 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 20 3d 20 30 3b   zLine[h++] = 0;
2f0e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2f0f0 66 28 20 64 65 6c 69 6d 3d 3d 27 22 27 20 29 20  f( delim=='"' ) 
2f100 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73  resolve_backslas
2f110 68 65 73 28 61 7a 41 72 67 5b 6e 41 72 67 2d 31  hes(azArg[nArg-1
2f120 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
2f130 20 20 20 20 20 61 7a 41 72 67 5b 6e 41 72 67 2b       azArg[nArg+
2f140 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b 68 5d 3b 0a  +] = &zLine[h];.
2f150 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69        while( zLi
2f160 6e 65 5b 68 5d 20 26 26 20 21 49 73 53 70 61 63  ne[h] && !IsSpac
2f170 65 28 7a 4c 69 6e 65 5b 68 5d 29 20 29 7b 20 68  e(zLine[h]) ){ h
2f180 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20  ++; }.      if( 
2f190 7a 4c 69 6e 65 5b 68 5d 20 29 20 7a 4c 69 6e 65  zLine[h] ) zLine
2f1a0 5b 68 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20  [h++] = 0;.     
2f1b0 20 72 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61   resolve_backsla
2f1c0 73 68 65 73 28 61 7a 41 72 67 5b 6e 41 72 67 2d  shes(azArg[nArg-
2f1d0 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  1]);.    }.  }..
2f1e0 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65    /* Process the
2f1f0 20 69 6e 70 75 74 20 6c 69 6e 65 2e 0a 20 20 2a   input line..  *
2f200 2f 0a 20 20 69 66 28 20 6e 41 72 67 3d 3d 30 20  /.  if( nArg==0 
2f210 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 6e  ) return 0; /* n
2f220 6f 20 74 6f 6b 65 6e 73 2c 20 6e 6f 20 65 72 72  o tokens, no err
2f230 6f 72 20 2a 2f 0a 20 20 6e 20 3d 20 73 74 72 6c  or */.  n = strl
2f240 65 6e 33 30 28 61 7a 41 72 67 5b 30 5d 29 3b 0a  en30(azArg[0]);.
2f250 20 20 63 20 3d 20 61 7a 41 72 67 5b 30 5d 5b 30    c = azArg[0][0
2f260 5d 3b 0a 20 20 63 6c 65 61 72 54 65 6d 70 46 69  ];.  clearTempFi
2f270 6c 65 28 70 29 3b 0a 0a 23 69 66 6e 64 65 66 20  le(p);..#ifndef 
2f280 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
2f290 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28 20  ORIZATION.  if( 
2f2a0 63 3d 3d 27 61 27 20 26 26 20 73 74 72 6e 63 6d  c=='a' && strncm
2f2b0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 61 75 74  p(azArg[0], "aut
2f2c0 68 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  h", n)==0 ){.   
2f2d0 20 69 66 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a   if( nArg!=2 ){.
2f2e0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2f2f0 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
2f300 20 2e 61 75 74 68 20 4f 4e 7c 4f 46 46 5c 6e 22   .auth ON|OFF\n"
2f310 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
2f320 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61  .      goto meta
2f330 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
2f340 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62     }.    open_db
2f350 28 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  (p, 0);.    if( 
2f360 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41  booleanValue(azA
2f370 72 67 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20 20  rg[1]) ){.      
2f380 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68  sqlite3_set_auth
2f390 6f 72 69 7a 65 72 28 70 2d 3e 64 62 2c 20 73 68  orizer(p->db, sh
2f3a0 65 6c 6c 41 75 74 68 2c 20 70 29 3b 0a 20 20 20  ellAuth, p);.   
2f3b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
2f3c0 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f 72  lite3_set_author
2f3d0 69 7a 65 72 28 70 2d 3e 64 62 2c 20 30 2c 20 30  izer(p->db, 0, 0
2f3e0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
2f3f0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 21 64 65  .#endif..#if !de
2f400 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
2f410 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
2f420 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
2f430 45 5f 48 41 56 45 5f 5a 4c 49 42 29 0a 20 20 69  E_HAVE_ZLIB).  i
2f440 66 28 20 63 3d 3d 27 61 27 20 26 26 20 73 74 72  f( c=='a' && str
2f450 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2f460 61 72 63 68 69 76 65 22 2c 20 6e 29 3d 3d 30 20  archive", n)==0 
2f470 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  ){.    open_db(p
2f480 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 61  , 0);.    rc = a
2f490 72 44 6f 74 43 6f 6d 6d 61 6e 64 28 70 2c 20 30  rDotCommand(p, 0
2f4a0 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b 0a  , azArg, nArg);.
2f4b0 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
2f4c0 20 20 69 66 28 20 28 63 3d 3d 27 62 27 20 26 26    if( (c=='b' &&
2f4d0 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70   n>=3 && strncmp
2f4e0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 61 63 6b  (azArg[0], "back
2f4f0 75 70 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 20 7c  up", n)==0).   |
2f500 7c 20 28 63 3d 3d 27 73 27 20 26 26 20 6e 3e 3d  | (c=='s' && n>=
2f510 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  3 && strncmp(azA
2f520 72 67 5b 30 5d 2c 20 22 73 61 76 65 22 2c 20 6e  rg[0], "save", n
2f530 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 63  )==0).  ){.    c
2f540 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73 74  onst char *zDest
2f550 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 63 6f  File = 0;.    co
2f560 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d 20  nst char *zDb = 
2f570 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a  0;.    sqlite3 *
2f580 70 44 65 73 74 3b 0a 20 20 20 20 73 71 6c 69 74  pDest;.    sqlit
2f590 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63 6b  e3_backup *pBack
2f5a0 75 70 3b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20  up;.    int j;. 
2f5b0 20 20 20 69 6e 74 20 62 41 73 79 6e 63 20 3d 20     int bAsync = 
2f5c0 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
2f5d0 72 20 2a 7a 56 66 73 20 3d 20 30 3b 0a 20 20 20  r *zVfs = 0;.   
2f5e0 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e 41 72 67   for(j=1; j<nArg
2f5f0 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f  ; j++){.      co
2f600 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a  nst char *z = az
2f610 41 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20 69 66  Arg[j];.      if
2f620 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20  ( z[0]=='-' ){. 
2f630 20 20 20 20 20 20 20 69 66 28 20 7a 5b 31 5d 3d         if( z[1]=
2f640 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  ='-' ) z++;.    
2f650 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
2f660 2c 20 22 2d 61 70 70 65 6e 64 22 29 3d 3d 30 20  , "-append")==0 
2f670 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 56 66  ){.          zVf
2f680 73 20 3d 20 22 61 70 6e 64 76 66 73 22 3b 0a 20  s = "apndvfs";. 
2f690 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20         }else.   
2f6a0 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
2f6b0 7a 2c 20 22 2d 61 73 79 6e 63 22 29 3d 3d 30 20  z, "-async")==0 
2f6c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 41 73  ){.          bAs
2f6d0 79 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ync = 1;.       
2f6e0 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 7b   }else.        {
2f6f0 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
2f700 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2f710 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20  unknown option: 
2f720 25 73 5c 6e 22 2c 20 61 7a 41 72 67 5b 6a 5d 29  %s\n", azArg[j])
2f730 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
2f740 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  rn 1;.        }.
2f750 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2f760 7a 44 65 73 74 46 69 6c 65 3d 3d 30 20 29 7b 0a  zDestFile==0 ){.
2f770 20 20 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c          zDestFil
2f780 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20  e = azArg[j];.  
2f790 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 44      }else if( zD
2f7a0 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  b==0 ){.        
2f7b0 7a 44 62 20 3d 20 7a 44 65 73 74 46 69 6c 65 3b  zDb = zDestFile;
2f7c0 0a 20 20 20 20 20 20 20 20 7a 44 65 73 74 46 69  .        zDestFi
2f7d0 6c 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20  le = azArg[j];. 
2f7e0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2f7f0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2f800 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
2f810 62 61 63 6b 75 70 20 3f 44 42 3f 20 3f 4f 50 54  backup ?DB? ?OPT
2f820 49 4f 4e 53 3f 20 46 49 4c 45 4e 41 4d 45 5c 6e  IONS? FILENAME\n
2f830 22 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ");.        retu
2f840 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
2f850 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 44 65 73    }.    if( zDes
2f860 74 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  tFile==0 ){.    
2f870 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2f880 65 72 72 2c 20 22 6d 69 73 73 69 6e 67 20 46 49  err, "missing FI
2f890 4c 45 4e 41 4d 45 20 61 72 67 75 6d 65 6e 74 20  LENAME argument 
2f8a0 6f 6e 20 2e 62 61 63 6b 75 70 5c 6e 22 29 3b 0a  on .backup\n");.
2f8b0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2f8c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 44      }.    if( zD
2f8d0 62 3d 3d 30 20 29 20 7a 44 62 20 3d 20 22 6d 61  b==0 ) zDb = "ma
2f8e0 69 6e 22 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  in";.    rc = sq
2f8f0 6c 69 74 65 33 5f 6f 70 65 6e 5f 76 32 28 7a 44  lite3_open_v2(zD
2f900 65 73 74 46 69 6c 65 2c 20 26 70 44 65 73 74 2c  estFile, &pDest,
2f910 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
2f920 20 20 20 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f      SQLITE_OPEN_
2f930 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45  READWRITE|SQLITE
2f940 5f 4f 50 45 4e 5f 43 52 45 41 54 45 2c 20 7a 56  _OPEN_CREATE, zV
2f950 66 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  fs);.    if( rc!
2f960 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2f970 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2f980 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
2f990 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73  cannot open \"%s
2f9a0 5c 22 5c 6e 22 2c 20 7a 44 65 73 74 46 69 6c 65  \"\n", zDestFile
2f9b0 29 3b 0a 20 20 20 20 20 20 63 6c 6f 73 65 5f 64  );.      close_d
2f9c0 62 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20  b(pDest);.      
2f9d0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
2f9e0 20 20 20 20 69 66 28 20 62 41 73 79 6e 63 20 29      if( bAsync )
2f9f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2fa00 65 78 65 63 28 70 44 65 73 74 2c 20 22 50 52 41  exec(pDest, "PRA
2fa10 47 4d 41 20 73 79 6e 63 68 72 6f 6e 6f 75 73 3d  GMA synchronous=
2fa20 4f 46 46 3b 20 50 52 41 47 4d 41 20 6a 6f 75 72  OFF; PRAGMA jour
2fa30 6e 61 6c 5f 6d 6f 64 65 3d 4f 46 46 3b 22 2c 0a  nal_mode=OFF;",.
2fa40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa50 20 20 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20     0, 0, 0);.   
2fa60 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70   }.    open_db(p
2fa70 2c 20 30 29 3b 0a 20 20 20 20 70 42 61 63 6b 75  , 0);.    pBacku
2fa80 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  p = sqlite3_back
2fa90 75 70 5f 69 6e 69 74 28 70 44 65 73 74 2c 20 22  up_init(pDest, "
2faa0 6d 61 69 6e 22 2c 20 70 2d 3e 64 62 2c 20 7a 44  main", p->db, zD
2fab0 62 29 3b 0a 20 20 20 20 69 66 28 20 70 42 61 63  b);.    if( pBac
2fac0 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  kup==0 ){.      
2fad0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
2fae0 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e  rr, "Error: %s\n
2faf0 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
2fb00 67 28 70 44 65 73 74 29 29 3b 0a 20 20 20 20 20  g(pDest));.     
2fb10 20 63 6c 6f 73 65 5f 64 62 28 70 44 65 73 74 29   close_db(pDest)
2fb20 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
2fb30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
2fb40 65 28 20 20 28 72 63 20 3d 20 73 71 6c 69 74 65  e(  (rc = sqlite
2fb50 33 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 70 42  3_backup_step(pB
2fb60 61 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53 51 4c  ackup,100))==SQL
2fb70 49 54 45 5f 4f 4b 20 29 7b 7d 0a 20 20 20 20 73  ITE_OK ){}.    s
2fb80 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69  qlite3_backup_fi
2fb90 6e 69 73 68 28 70 42 61 63 6b 75 70 29 3b 0a 20  nish(pBackup);. 
2fba0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2fbb0 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
2fbc0 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  rc = 0;.    }els
2fbd0 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  e{.      utf8_pr
2fbe0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
2fbf0 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69  ror: %s\n", sqli
2fc00 74 65 33 5f 65 72 72 6d 73 67 28 70 44 65 73 74  te3_errmsg(pDest
2fc10 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ));.      rc = 1
2fc20 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 6c 6f 73  ;.    }.    clos
2fc30 65 5f 64 62 28 70 44 65 73 74 29 3b 0a 20 20 7d  e_db(pDest);.  }
2fc40 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
2fc50 62 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74  b' && n>=3 && st
2fc60 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2fc70 22 62 61 69 6c 22 2c 20 6e 29 3d 3d 30 20 29 7b  "bail", n)==0 ){
2fc80 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32  .    if( nArg==2
2fc90 20 29 7b 0a 20 20 20 20 20 20 62 61 69 6c 5f 6f   ){.      bail_o
2fca0 6e 5f 65 72 72 6f 72 20 3d 20 62 6f 6f 6c 65 61  n_error = boolea
2fcb0 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29  nValue(azArg[1])
2fcc0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2fcd0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2fce0 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 62  derr, "Usage: .b
2fcf0 61 69 6c 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a  ail on|off\n");.
2fd00 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
2fd10 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
2fd20 66 28 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d  f( c=='b' && n>=
2fd30 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  3 && strncmp(azA
2fd40 72 67 5b 30 5d 2c 20 22 62 69 6e 61 72 79 22 2c  rg[0], "binary",
2fd50 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   n)==0 ){.    if
2fd60 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20  ( nArg==2 ){.   
2fd70 20 20 20 69 66 28 20 62 6f 6f 6c 65 61 6e 56 61     if( booleanVa
2fd80 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 20 29 7b  lue(azArg[1]) ){
2fd90 0a 20 20 20 20 20 20 20 20 73 65 74 42 69 6e 61  .        setBina
2fda0 72 79 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31  ryMode(p->out, 1
2fdb0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2fdc0 20 20 20 20 20 20 20 20 73 65 74 54 65 78 74 4d          setTextM
2fdd0 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a  ode(p->out, 1);.
2fde0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2fdf0 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
2fe00 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
2fe10 67 65 3a 20 2e 62 69 6e 61 72 79 20 6f 6e 7c 6f  ge: .binary on|o
2fe20 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  ff\n");.      rc
2fe30 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
2fe40 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63  lse..  if( c=='c
2fe50 27 20 26 26 20 73 74 72 63 6d 70 28 61 7a 41 72  ' && strcmp(azAr
2fe60 67 5b 30 5d 2c 22 63 64 22 29 3d 3d 30 20 29 7b  g[0],"cd")==0 ){
2fe70 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32  .    if( nArg==2
2fe80 20 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28   ){.#if defined(
2fe90 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e  _WIN32) || defin
2fea0 65 64 28 57 49 4e 33 32 29 0a 20 20 20 20 20 20  ed(WIN32).      
2feb0 77 63 68 61 72 5f 74 20 2a 7a 20 3d 20 73 71 6c  wchar_t *z = sql
2fec0 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f  ite3_win32_utf8_
2fed0 74 6f 5f 75 6e 69 63 6f 64 65 28 61 7a 41 72 67  to_unicode(azArg
2fee0 5b 31 5d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  [1]);.      rc =
2fef0 20 21 53 65 74 43 75 72 72 65 6e 74 44 69 72 65   !SetCurrentDire
2ff00 63 74 6f 72 79 57 28 7a 29 3b 0a 20 20 20 20 20  ctoryW(z);.     
2ff10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
2ff20 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63  ;.#else.      rc
2ff30 20 3d 20 63 68 64 69 72 28 61 7a 41 72 67 5b 31   = chdir(azArg[1
2ff40 5d 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  ]);.#endif.     
2ff50 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2ff60 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2ff70 74 64 65 72 72 2c 20 22 43 61 6e 6e 6f 74 20 63  tderr, "Cannot c
2ff80 68 61 6e 67 65 20 74 6f 20 64 69 72 65 63 74 6f  hange to directo
2ff90 72 79 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a  ry \"%s\"\n", az
2ffa0 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[1]);.       
2ffb0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d   rc = 1;.      }
2ffc0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2ffd0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2ffe0 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 63 64  err, "Usage: .cd
2fff0 20 44 49 52 45 43 54 4f 52 59 5c 6e 22 29 3b 0a   DIRECTORY\n");.
30000 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
30010 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f    }.  }else..  /
30020 2a 20 54 68 65 20 75 6e 64 6f 63 75 6d 65 6e 74  * The undocument
30030 65 64 20 22 2e 62 72 65 61 6b 70 6f 69 6e 74 22  ed ".breakpoint"
30040 20 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20   command causes 
30050 61 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 6e 6f  a call to the no
30060 2d 6f 70 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65  -op.  ** routine
30070 20 6e 61 6d 65 64 20 74 65 73 74 5f 62 72 65 61   named test_brea
30080 6b 70 6f 69 6e 74 28 29 2e 0a 20 20 2a 2f 0a 20  kpoint()..  */. 
30090 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20 6e   if( c=='b' && n
300a0 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
300b0 7a 41 72 67 5b 30 5d 2c 20 22 62 72 65 61 6b 70  zArg[0], "breakp
300c0 6f 69 6e 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  oint", n)==0 ){.
300d0 20 20 20 20 74 65 73 74 5f 62 72 65 61 6b 70 6f      test_breakpo
300e0 69 6e 74 28 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  int();.  }else..
300f0 20 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20    if( c=='c' && 
30100 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=3 && strncmp(
30110 61 7a 41 72 67 5b 30 5d 2c 20 22 63 68 61 6e 67  azArg[0], "chang
30120 65 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  es", n)==0 ){.  
30130 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b    if( nArg==2 ){
30140 0a 20 20 20 20 20 20 73 65 74 4f 72 43 6c 65 61  .      setOrClea
30150 72 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 43  rFlag(p, SHFLG_C
30160 6f 75 6e 74 43 68 61 6e 67 65 73 2c 20 61 7a 41  ountChanges, azA
30170 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  rg[1]);.    }els
30180 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
30190 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
301a0 67 65 3a 20 2e 63 68 61 6e 67 65 73 20 6f 6e 7c  ge: .changes on|
301b0 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  off\n");.      r
301c0 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
301d0 65 6c 73 65 0a 0a 20 20 2f 2a 20 43 61 6e 63 65  else..  /* Cance
301e0 6c 20 6f 75 74 70 75 74 20 72 65 64 69 72 65 63  l output redirec
301f0 74 69 6f 6e 2c 20 69 66 20 69 74 20 69 73 20 63  tion, if it is c
30200 75 72 72 65 6e 74 6c 79 20 73 65 74 20 28 62 79  urrently set (by
30210 20 2e 74 65 73 74 63 61 73 65 29 0a 20 20 2a 2a   .testcase).  **
30220 20 54 68 65 6e 20 72 65 61 64 20 74 68 65 20 63   Then read the c
30230 6f 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 74 65  ontent of the te
30240 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 20 66  stcase-out.txt f
30250 69 6c 65 20 61 6e 64 20 63 6f 6d 70 61 72 65 20  ile and compare 
30260 61 67 61 69 6e 73 74 0a 20 20 2a 2a 20 61 7a 41  against.  ** azA
30270 72 67 5b 31 5d 2e 20 20 49 66 20 74 68 65 72 65  rg[1].  If there
30280 20 61 72 65 20 64 69 66 66 65 72 65 6e 63 65 73   are differences
30290 2c 20 72 65 70 6f 72 74 20 61 6e 20 65 72 72 6f  , report an erro
302a0 72 20 61 6e 64 20 65 78 69 74 2e 0a 20 20 2a 2f  r and exit..  */
302b0 0a 20 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26  .  if( c=='c' &&
302c0 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70   n>=3 && strncmp
302d0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 63 68 65 63  (azArg[0], "chec
302e0 6b 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  k", n)==0 ){.   
302f0 20 63 68 61 72 20 2a 7a 52 65 73 20 3d 20 30 3b   char *zRes = 0;
30300 0a 20 20 20 20 6f 75 74 70 75 74 5f 72 65 73 65  .    output_rese
30310 74 28 70 29 3b 0a 20 20 20 20 69 66 28 20 6e 41  t(p);.    if( nA
30320 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72  rg!=2 ){.      r
30330 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
30340 2c 20 22 55 73 61 67 65 3a 20 2e 63 68 65 63 6b  , "Usage: .check
30350 20 47 4c 4f 42 2d 50 41 54 54 45 52 4e 5c 6e 22   GLOB-PATTERN\n"
30360 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 32 3b  );.      rc = 2;
30370 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28  .    }else if( (
30380 7a 52 65 73 20 3d 20 72 65 61 64 46 69 6c 65 28  zRes = readFile(
30390 22 74 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78  "testcase-out.tx
303a0 74 22 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20  t", 0))==0 ){.  
303b0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
303c0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63  tderr, "Error: c
303d0 61 6e 6e 6f 74 20 72 65 61 64 20 27 74 65 73 74  annot read 'test
303e0 63 61 73 65 2d 6f 75 74 2e 74 78 74 27 5c 6e 22  case-out.txt'\n"
303f0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 32 3b  );.      rc = 2;
30400 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 74  .    }else if( t
30410 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 61 7a 41  estcase_glob(azA
30420 72 67 5b 31 5d 2c 7a 52 65 73 29 3d 3d 30 20 29  rg[1],zRes)==0 )
30430 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
30440 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20  ntf(stderr,.    
30450 20 20 20 20 20 20 20 20 20 20 20 20 20 22 74 65               "te
30460 73 74 63 61 73 65 2d 25 73 20 46 41 49 4c 45 44  stcase-%s FAILED
30470 5c 6e 20 45 78 70 65 63 74 65 64 3a 20 5b 25 73  \n Expected: [%s
30480 5d 5c 6e 20 20 20 20 20 20 47 6f 74 3a 20 5b 25  ]\n      Got: [%
30490 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  s]\n",.         
304a0 20 20 20 20 20 20 20 20 70 2d 3e 7a 54 65 73 74          p->zTest
304b0 63 61 73 65 2c 20 61 7a 41 72 67 5b 31 5d 2c 20  case, azArg[1], 
304c0 7a 52 65 73 29 3b 0a 20 20 20 20 20 20 72 63 20  zRes);.      rc 
304d0 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
304e0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
304f0 66 28 73 74 64 6f 75 74 2c 20 22 74 65 73 74 63  f(stdout, "testc
30500 61 73 65 2d 25 73 20 6f 6b 5c 6e 22 2c 20 70 2d  ase-%s ok\n", p-
30510 3e 7a 54 65 73 74 63 61 73 65 29 3b 0a 20 20 20  >zTestcase);.   
30520 20 20 20 70 2d 3e 6e 43 68 65 63 6b 2b 2b 3b 0a     p->nCheck++;.
30530 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
30540 33 5f 66 72 65 65 28 7a 52 65 73 29 3b 0a 20 20  3_free(zRes);.  
30550 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
30560 27 63 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'c' && strncmp(a
30570 7a 41 72 67 5b 30 5d 2c 20 22 63 6c 6f 6e 65 22  zArg[0], "clone"
30580 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
30590 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20  f( nArg==2 ){.  
305a0 20 20 20 20 74 72 79 54 6f 43 6c 6f 6e 65 28 70      tryToClone(p
305b0 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
305c0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
305d0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
305e0 20 22 55 73 61 67 65 3a 20 2e 63 6c 6f 6e 65 20   "Usage: .clone 
305f0 46 49 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20  FILENAME\n");.  
30600 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
30610 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
30620 20 63 3d 3d 27 64 27 20 26 26 20 6e 3e 31 20 26   c=='d' && n>1 &
30630 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
30640 30 5d 2c 20 22 64 61 74 61 62 61 73 65 73 22 2c  0], "databases",
30650 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68   n)==0 ){.    Sh
30660 65 6c 6c 53 74 61 74 65 20 64 61 74 61 3b 0a 20  ellState data;. 
30670 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67     char *zErrMsg
30680 20 3d 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64   = 0;.    open_d
30690 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6d 65 6d  b(p, 0);.    mem
306a0 63 70 79 28 26 64 61 74 61 2c 20 70 2c 20 73 69  cpy(&data, p, si
306b0 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a 20 20 20  zeof(data));.   
306c0 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65 72   data.showHeader
306d0 20 3d 20 30 3b 0a 20 20 20 20 64 61 74 61 2e 63   = 0;.    data.c
306e0 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65  Mode = data.mode
306f0 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20   = MODE_List;.  
30700 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
30710 74 66 28 73 69 7a 65 6f 66 28 64 61 74 61 2e 63  tf(sizeof(data.c
30720 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 64 61 74  olSeparator),dat
30730 61 2e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 22  a.colSeparator,"
30740 3a 20 22 29 3b 0a 20 20 20 20 64 61 74 61 2e 63  : ");.    data.c
30750 6e 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  nt = 0;.    sqli
30760 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
30770 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 66 69  "SELECT name, fi
30780 6c 65 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 64  le FROM pragma_d
30790 61 74 61 62 61 73 65 5f 6c 69 73 74 22 2c 0a 20  atabase_list",. 
307a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
307b0 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c  callback, &data,
307c0 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20   &zErrMsg);.    
307d0 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20  if( zErrMsg ){. 
307e0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
307f0 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20  (stderr,"Error: 
30800 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b  %s\n", zErrMsg);
30810 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
30820 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
30830 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
30840 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
30850 20 63 3d 3d 27 64 27 20 26 26 20 6e 3e 3d 33 20   c=='d' && n>=3 
30860 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
30870 5b 30 5d 2c 20 22 64 62 63 6f 6e 66 69 67 22 2c  [0], "dbconfig",
30880 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74   n)==0 ){.    st
30890 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
308a0 74 20 44 62 43 6f 6e 66 69 67 43 68 6f 69 63 65  t DbConfigChoice
308b0 73 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  s {.      const 
308c0 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
308d0 20 20 20 69 6e 74 20 6f 70 3b 0a 20 20 20 20 7d     int op;.    }
308e0 20 61 44 62 43 6f 6e 66 69 67 5b 5d 20 3d 20 7b   aDbConfig[] = {
308f0 0a 20 20 20 20 20 20 20 20 7b 20 22 65 6e 61 62  .        { "enab
30900 6c 65 5f 66 6b 65 79 22 2c 20 20 20 20 20 20 53  le_fkey",      S
30910 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45  QLITE_DBCONFIG_E
30920 4e 41 42 4c 45 5f 46 4b 45 59 20 20 20 20 20 20  NABLE_FKEY      
30930 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20        },.       
30940 20 7b 20 22 65 6e 61 62 6c 65 5f 74 72 69 67 67   { "enable_trigg
30950 65 72 22 2c 20 20 20 53 51 4c 49 54 45 5f 44 42  er",   SQLITE_DB
30960 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 54 52  CONFIG_ENABLE_TR
30970 49 47 47 45 52 20 20 20 20 20 20 20 20 20 7d 2c  IGGER         },
30980 0a 20 20 20 20 20 20 20 20 7b 20 22 66 74 73 33  .        { "fts3
30990 5f 74 6f 6b 65 6e 69 7a 65 72 22 2c 20 20 20 53  _tokenizer",   S
309a0 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 45  QLITE_DBCONFIG_E
309b0 4e 41 42 4c 45 5f 46 54 53 33 5f 54 4f 4b 45 4e  NABLE_FTS3_TOKEN
309c0 49 5a 45 52 20 20 7d 2c 0a 20 20 20 20 20 20 20  IZER  },.       
309d0 20 7b 20 22 6c 6f 61 64 5f 65 78 74 65 6e 73 69   { "load_extensi
309e0 6f 6e 22 2c 20 20 20 53 51 4c 49 54 45 5f 44 42  on",   SQLITE_DB
309f0 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 4c 4f  CONFIG_ENABLE_LO
30a00 41 44 5f 45 58 54 45 4e 53 49 4f 4e 20 20 7d 2c  AD_EXTENSION  },
30a10 0a 20 20 20 20 20 20 20 20 7b 20 22 6e 6f 5f 63  .        { "no_c
30a20 6b 70 74 5f 6f 6e 5f 63 6c 6f 73 65 22 2c 20 53  kpt_on_close", S
30a30 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 4e  QLITE_DBCONFIG_N
30a40 4f 5f 43 4b 50 54 5f 4f 4e 5f 43 4c 4f 53 45 20  O_CKPT_ON_CLOSE 
30a50 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20        },.       
30a60 20 7b 20 22 65 6e 61 62 6c 65 5f 71 70 73 67 22   { "enable_qpsg"
30a70 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f 44 42  ,      SQLITE_DB
30a80 43 4f 4e 46 49 47 5f 45 4e 41 42 4c 45 5f 51 50  CONFIG_ENABLE_QP
30a90 53 47 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  SG            },
30aa0 0a 20 20 20 20 20 20 20 20 7b 20 22 74 72 69 67  .        { "trig
30ab0 67 65 72 5f 65 71 70 22 2c 20 20 20 20 20 20 53  ger_eqp",      S
30ac0 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 54  QLITE_DBCONFIG_T
30ad0 52 49 47 47 45 52 5f 45 51 50 20 20 20 20 20 20  RIGGER_EQP      
30ae0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20        },.       
30af0 20 7b 20 22 72 65 73 65 74 5f 64 61 74 61 62 61   { "reset_databa
30b00 73 65 22 2c 20 20 20 53 51 4c 49 54 45 5f 44 42  se",   SQLITE_DB
30b10 43 4f 4e 46 49 47 5f 52 45 53 45 54 5f 44 41 54  CONFIG_RESET_DAT
30b20 41 42 41 53 45 20 20 20 20 20 20 20 20 20 7d 2c  ABASE         },
30b30 0a 20 20 20 20 20 20 20 20 7b 20 22 64 65 66 65  .        { "defe
30b40 6e 73 69 76 65 22 2c 20 20 20 20 20 20 20 20 53  nsive",        S
30b50 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 44  QLITE_DBCONFIG_D
30b60 45 46 45 4e 53 49 56 45 20 20 20 20 20 20 20 20  EFENSIVE        
30b70 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a        },.    };.
30b80 20 20 20 20 69 6e 74 20 69 69 2c 20 76 3b 0a 20      int ii, v;. 
30b90 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
30ba0 3b 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20  ;.    for(ii=0; 
30bb0 69 69 3c 41 72 72 61 79 53 69 7a 65 28 61 44 62  ii<ArraySize(aDb
30bc0 43 6f 6e 66 69 67 29 3b 20 69 69 2b 2b 29 7b 0a  Config); ii++){.
30bd0 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3e 31        if( nArg>1
30be0 20 26 26 20 73 74 72 63 6d 70 28 61 7a 41 72 67   && strcmp(azArg
30bf0 5b 31 5d 2c 20 61 44 62 43 6f 6e 66 69 67 5b 69  [1], aDbConfig[i
30c00 69 5d 2e 7a 4e 61 6d 65 29 21 3d 30 20 29 20 63  i].zName)!=0 ) c
30c10 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
30c20 66 28 20 6e 41 72 67 3e 3d 33 20 29 7b 0a 20 20  f( nArg>=3 ){.  
30c30 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62        sqlite3_db
30c40 5f 63 6f 6e 66 69 67 28 70 2d 3e 64 62 2c 20 61  _config(p->db, a
30c50 44 62 43 6f 6e 66 69 67 5b 69 69 5d 2e 6f 70 2c  DbConfig[ii].op,
30c60 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a   booleanValue(az
30c70 41 72 67 5b 32 5d 29 2c 20 30 29 3b 0a 20 20 20  Arg[2]), 0);.   
30c80 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
30c90 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 70 2d 3e  e3_db_config(p->
30ca0 64 62 2c 20 61 44 62 43 6f 6e 66 69 67 5b 69 69  db, aDbConfig[ii
30cb0 5d 2e 6f 70 2c 20 2d 31 2c 20 26 76 29 3b 0a 20  ].op, -1, &v);. 
30cc0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
30cd0 28 70 2d 3e 6f 75 74 2c 20 22 25 31 38 73 20 25  (p->out, "%18s %
30ce0 73 5c 6e 22 2c 20 61 44 62 43 6f 6e 66 69 67 5b  s\n", aDbConfig[
30cf0 69 69 5d 2e 7a 4e 61 6d 65 2c 20 76 20 3f 20 22  ii].zName, v ? "
30d00 6f 6e 22 20 3a 20 22 6f 66 66 22 29 3b 0a 20 20  on" : "off");.  
30d10 20 20 20 20 69 66 28 20 6e 41 72 67 3e 31 20 29      if( nArg>1 )
30d20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
30d30 20 20 69 66 28 20 6e 41 72 67 3e 31 20 26 26 20    if( nArg>1 && 
30d40 69 69 3d 3d 41 72 72 61 79 53 69 7a 65 28 61 44  ii==ArraySize(aD
30d50 62 43 6f 6e 66 69 67 29 20 29 7b 0a 20 20 20 20  bConfig) ){.    
30d60 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
30d70 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 75 6e  derr, "Error: un
30d80 6b 6e 6f 77 6e 20 64 62 63 6f 6e 66 69 67 20 5c  known dbconfig \
30d90 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b  "%s\"\n", azArg[
30da0 31 5d 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f  1]);.      utf8_
30db0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
30dc0 45 6e 74 65 72 20 5c 22 2e 64 62 63 6f 6e 66 69  Enter \".dbconfi
30dd0 67 5c 22 20 77 69 74 68 20 6e 6f 20 61 72 67 75  g\" with no argu
30de0 6d 65 6e 74 73 20 66 6f 72 20 61 20 6c 69 73 74  ments for a list
30df0 5c 6e 22 29 3b 0a 20 20 20 20 7d 20 20 20 0a 20  \n");.    }   . 
30e00 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
30e10 3d 27 64 27 20 26 26 20 6e 3e 3d 33 20 26 26 20  ='d' && n>=3 && 
30e20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
30e30 2c 20 22 64 62 69 6e 66 6f 22 2c 20 6e 29 3d 3d  , "dbinfo", n)==
30e40 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 68  0 ){.    rc = sh
30e50 65 6c 6c 5f 64 62 69 6e 66 6f 5f 63 6f 6d 6d 61  ell_dbinfo_comma
30e60 6e 64 28 70 2c 20 6e 41 72 67 2c 20 61 7a 41 72  nd(p, nArg, azAr
30e70 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69  g);.  }else..  i
30e80 66 28 20 63 3d 3d 27 64 27 20 26 26 20 73 74 72  f( c=='d' && str
30e90 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
30ea0 64 75 6d 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  dump", n)==0 ){.
30eb0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
30ec0 7a 4c 69 6b 65 20 3d 20 30 3b 0a 20 20 20 20 69  zLike = 0;.    i
30ed0 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 73 61  nt i;.    int sa
30ee0 76 65 64 53 68 6f 77 48 65 61 64 65 72 20 3d 20  vedShowHeader = 
30ef0 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 3b 0a 20  p->showHeader;. 
30f00 20 20 20 69 6e 74 20 73 61 76 65 64 53 68 65 6c     int savedShel
30f10 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73 68 65 6c  lFlags = p->shel
30f20 6c 46 6c 67 73 3b 0a 20 20 20 20 53 68 65 6c 6c  lFlgs;.    Shell
30f30 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 53 48 46  ClearFlag(p, SHF
30f40 4c 47 5f 50 72 65 73 65 72 76 65 52 6f 77 69 64  LG_PreserveRowid
30f50 7c 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 7c  |SHFLG_Newlines|
30f60 53 48 46 4c 47 5f 45 63 68 6f 29 3b 0a 20 20 20  SHFLG_Echo);.   
30f70 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67   for(i=1; i<nArg
30f80 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
30f90 28 20 61 7a 41 72 67 5b 69 5d 5b 30 5d 3d 3d 27  ( azArg[i][0]=='
30fa0 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  -' ){.        co
30fb0 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a  nst char *z = az
30fc0 41 72 67 5b 69 5d 2b 31 3b 0a 20 20 20 20 20 20  Arg[i]+1;.      
30fd0 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20    if( z[0]=='-' 
30fe0 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69  ) z++;.        i
30ff0 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 70 72 65  f( strcmp(z,"pre
31000 73 65 72 76 65 2d 72 6f 77 69 64 73 22 29 3d 3d  serve-rowids")==
31010 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c 49  0 ){.#ifdef SQLI
31020 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
31030 41 42 4c 45 0a 20 20 20 20 20 20 20 20 20 20 72  ABLE.          r
31040 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
31050 2c 20 22 54 68 65 20 2d 2d 70 72 65 73 65 72 76  , "The --preserv
31060 65 2d 72 6f 77 69 64 73 20 6f 70 74 69 6f 6e 20  e-rowids option 
31070 69 73 20 6e 6f 74 20 63 6f 6d 70 61 74 69 62 6c  is not compatibl
31080 65 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e".             
31090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
310a0 22 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f 4d  " with SQLITE_OM
310b0 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 5c  IT_VIRTUALTABLE\
310c0 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  n");.          r
310d0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
310e0 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
310f0 6e 64 5f 65 78 69 74 3b 0a 23 65 6c 73 65 0a 20  nd_exit;.#else. 
31100 20 20 20 20 20 20 20 20 20 53 68 65 6c 6c 53 65           ShellSe
31110 74 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 50  tFlag(p, SHFLG_P
31120 72 65 73 65 72 76 65 52 6f 77 69 64 29 3b 0a 23  reserveRowid);.#
31130 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 65  endif.        }e
31140 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28 20  lse.        if( 
31150 73 74 72 63 6d 70 28 7a 2c 22 6e 65 77 6c 69 6e  strcmp(z,"newlin
31160 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  es")==0 ){.     
31170 20 20 20 20 20 53 68 65 6c 6c 53 65 74 46 6c 61       ShellSetFla
31180 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65 77 6c 69  g(p, SHFLG_Newli
31190 6e 65 73 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  nes);.        }e
311a0 6c 73 65 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  lse.        {.  
311b0 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
311c0 74 66 28 73 74 64 65 72 72 2c 20 22 55 6e 6b 6e  tf(stderr, "Unkn
311d0 6f 77 6e 20 6f 70 74 69 6f 6e 20 5c 22 25 73 5c  own option \"%s\
311e0 22 20 6f 6e 20 5c 22 2e 64 75 6d 70 5c 22 5c 6e  " on \".dump\"\n
311f0 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  ", azArg[i]);.  
31200 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
31210 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
31220 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
31230 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31240 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 4c 69 6b    }else if( zLik
31250 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  e ){.        raw
31260 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
31270 22 55 73 61 67 65 3a 20 2e 64 75 6d 70 20 3f 2d  "Usage: .dump ?-
31280 2d 70 72 65 73 65 72 76 65 2d 72 6f 77 69 64 73  -preserve-rowids
31290 3f 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  ? ".            
312a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
312b0 3f 2d 2d 6e 65 77 6c 69 6e 65 73 3f 20 3f 4c 49  ?--newlines? ?LI
312c0 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e 22 29 3b  KE-PATTERN?\n");
312d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
312e0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  .        goto me
312f0 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
31300 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
31310 20 20 20 20 20 20 7a 4c 69 6b 65 20 3d 20 61 7a        zLike = az
31320 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 7d 0a  Arg[i];.      }.
31330 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64      }.    open_d
31340 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 2f 2a 20  b(p, 0);.    /* 
31350 57 68 65 6e 20 70 6c 61 79 69 6e 67 20 62 61 63  When playing bac
31360 6b 20 61 20 22 64 75 6d 70 22 2c 20 74 68 65 20  k a "dump", the 
31370 63 6f 6e 74 65 6e 74 20 6d 69 67 68 74 20 61 70  content might ap
31380 70 65 61 72 20 69 6e 20 61 6e 20 6f 72 64 65 72  pear in an order
31390 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 63 61  .    ** which ca
313a0 75 73 65 73 20 69 6d 6d 65 64 69 61 74 65 20 66  uses immediate f
313b0 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
313c0 72 61 69 6e 74 73 20 74 6f 20 62 65 20 76 69 6f  raints to be vio
313d0 6c 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 53 6f  lated..    ** So
313e0 20 64 69 73 61 62 6c 65 20 66 6f 72 65 69 67 6e   disable foreign
313f0 2d 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 20  -key constraint 
31400 65 6e 66 6f 72 63 65 6d 65 6e 74 20 74 6f 20 70  enforcement to p
31410 72 65 76 65 6e 74 20 70 72 6f 62 6c 65 6d 73 2e  revent problems.
31420 20 2a 2f 0a 20 20 20 20 72 61 77 5f 70 72 69 6e   */.    raw_prin
31430 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50 52 41 47  tf(p->out, "PRAG
31440 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73 3d  MA foreign_keys=
31450 4f 46 46 3b 5c 6e 22 29 3b 0a 20 20 20 20 72 61  OFF;\n");.    ra
31460 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
31470 20 22 42 45 47 49 4e 20 54 52 41 4e 53 41 43 54   "BEGIN TRANSACT
31480 49 4f 4e 3b 5c 6e 22 29 3b 0a 20 20 20 20 70 2d  ION;\n");.    p-
31490 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20  >writableSchema 
314a0 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 68 6f 77  = 0;.    p->show
314b0 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  Header = 0;.    
314c0 2f 2a 20 53 65 74 20 77 72 69 74 61 62 6c 65 5f  /* Set writable_
314d0 73 63 68 65 6d 61 3d 4f 4e 20 73 69 6e 63 65 20  schema=ON since 
314e0 64 6f 69 6e 67 20 73 6f 20 66 6f 72 63 65 73 20  doing so forces 
314f0 53 51 4c 69 74 65 20 74 6f 20 69 6e 69 74 69 61  SQLite to initia
31500 6c 69 7a 65 0a 20 20 20 20 2a 2a 20 61 73 20 6d  lize.    ** as m
31510 75 63 68 20 6f 66 20 74 68 65 20 73 63 68 65 6d  uch of the schem
31520 61 20 61 73 20 69 74 20 63 61 6e 20 65 76 65 6e  a as it can even
31530 20 69 66 20 74 68 65 20 73 71 6c 69 74 65 5f 6d   if the sqlite_m
31540 61 73 74 65 72 20 74 61 62 6c 65 20 69 73 0a 20  aster table is. 
31550 20 20 20 2a 2a 20 63 6f 72 72 75 70 74 2e 20 2a     ** corrupt. *
31560 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  /.    sqlite3_ex
31570 65 63 28 70 2d 3e 64 62 2c 20 22 53 41 56 45 50  ec(p->db, "SAVEP
31580 4f 49 4e 54 20 64 75 6d 70 3b 20 50 52 41 47 4d  OINT dump; PRAGM
31590 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
315a0 61 3d 4f 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b  a=ON", 0, 0, 0);
315b0 0a 20 20 20 20 70 2d 3e 6e 45 72 72 20 3d 20 30  .    p->nErr = 0
315c0 3b 0a 20 20 20 20 69 66 28 20 7a 4c 69 6b 65 3d  ;.    if( zLike=
315d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 75 6e 5f  =0 ){.      run_
315e0 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72  schema_dump_quer
315f0 79 28 70 2c 0a 20 20 20 20 20 20 20 20 22 53 45  y(p,.        "SE
31600 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79 70 65 2c  LECT name, type,
31610 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65   sql FROM sqlite
31620 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20  _master ".      
31630 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e 4f 54    "WHERE sql NOT
31640 20 4e 55 4c 4c 20 41 4e 44 20 74 79 70 65 3d 3d   NULL AND type==
31650 27 74 61 62 6c 65 27 20 41 4e 44 20 6e 61 6d 65  'table' AND name
31660 21 3d 27 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  !='sqlite_sequen
31670 63 65 27 22 0a 20 20 20 20 20 20 29 3b 0a 20 20  ce'".      );.  
31680 20 20 20 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64      run_schema_d
31690 75 6d 70 5f 71 75 65 72 79 28 70 2c 0a 20 20 20  ump_query(p,.   
316a0 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d       "SELECT nam
316b0 65 2c 20 74 79 70 65 2c 20 73 71 6c 20 46 52 4f  e, type, sql FRO
316c0 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
316d0 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45  ".        "WHERE
316e0 20 6e 61 6d 65 3d 3d 27 73 71 6c 69 74 65 5f 73   name=='sqlite_s
316f0 65 71 75 65 6e 63 65 27 22 0a 20 20 20 20 20 20  equence'".      
31700 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 74 61 62  );.      run_tab
31710 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c  le_dump_query(p,
31720 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  .        "SELECT
31730 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65   sql FROM sqlite
31740 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20  _master ".      
31750 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e 4f 54    "WHERE sql NOT
31760 20 4e 55 4c 4c 20 41 4e 44 20 74 79 70 65 20 49   NULL AND type I
31770 4e 20 28 27 69 6e 64 65 78 27 2c 27 74 72 69 67  N ('index','trig
31780 67 65 72 27 2c 27 76 69 65 77 27 29 22 2c 20 30  ger','view')", 0
31790 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 65  .      );.    }e
317a0 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72 20  lse{.      char 
317b0 2a 7a 53 71 6c 3b 0a 20 20 20 20 20 20 7a 53 71  *zSql;.      zSq
317c0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
317d0 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 53 45  ntf(.        "SE
317e0 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79 70 65 2c  LECT name, type,
317f0 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65   sql FROM sqlite
31800 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20  _master ".      
31810 20 20 22 57 48 45 52 45 20 74 62 6c 5f 6e 61 6d    "WHERE tbl_nam
31820 65 20 4c 49 4b 45 20 25 51 20 41 4e 44 20 74 79  e LIKE %Q AND ty
31830 70 65 3d 3d 27 74 61 62 6c 65 27 22 0a 20 20 20  pe=='table'".   
31840 20 20 20 20 20 22 20 20 41 4e 44 20 73 71 6c 20       "  AND sql 
31850 4e 4f 54 20 4e 55 4c 4c 22 2c 20 7a 4c 69 6b 65  NOT NULL", zLike
31860 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 73 63 68  );.      run_sch
31870 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 70  ema_dump_query(p
31880 2c 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 71  ,zSql);.      sq
31890 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
318a0 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73  ;.      zSql = s
318b0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
318c0 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
318d0 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  sql FROM sqlite_
318e0 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 20  master ".       
318f0 20 22 57 48 45 52 45 20 73 71 6c 20 4e 4f 54 20   "WHERE sql NOT 
31900 4e 55 4c 4c 22 0a 20 20 20 20 20 20 20 20 22 20  NULL".        " 
31910 20 41 4e 44 20 74 79 70 65 20 49 4e 20 28 27 69   AND type IN ('i
31920 6e 64 65 78 27 2c 27 74 72 69 67 67 65 72 27 2c  ndex','trigger',
31930 27 76 69 65 77 27 29 22 0a 20 20 20 20 20 20 20  'view')".       
31940 20 22 20 20 41 4e 44 20 74 62 6c 5f 6e 61 6d 65   "  AND tbl_name
31950 20 4c 49 4b 45 20 25 51 22 2c 20 7a 4c 69 6b 65   LIKE %Q", zLike
31960 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 74 61 62  );.      run_tab
31970 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c  le_dump_query(p,
31980 20 7a 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20 20   zSql, 0);.     
31990 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
319a0 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ql);.    }.    i
319b0 66 28 20 70 2d 3e 77 72 69 74 61 62 6c 65 53 63  f( p->writableSc
319c0 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 72 61  hema ){.      ra
319d0 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
319e0 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c   "PRAGMA writabl
319f0 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 5c 6e 22  e_schema=OFF;\n"
31a00 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77 72 69 74  );.      p->writ
31a10 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 30 3b 0a  ableSchema = 0;.
31a20 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
31a30 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 50  3_exec(p->db, "P
31a40 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73  RAGMA writable_s
31a50 63 68 65 6d 61 3d 4f 46 46 3b 22 2c 20 30 2c 20  chema=OFF;", 0, 
31a60 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
31a70 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22  e3_exec(p->db, "
31a80 52 45 4c 45 41 53 45 20 64 75 6d 70 3b 22 2c 20  RELEASE dump;", 
31a90 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 72 61  0, 0, 0);.    ra
31aa0 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
31ab0 20 70 2d 3e 6e 45 72 72 20 3f 20 22 52 4f 4c 4c   p->nErr ? "ROLL
31ac0 42 41 43 4b 3b 20 2d 2d 20 64 75 65 20 74 6f 20  BACK; -- due to 
31ad0 65 72 72 6f 72 73 5c 6e 22 20 3a 20 22 43 4f 4d  errors\n" : "COM
31ae0 4d 49 54 3b 5c 6e 22 29 3b 0a 20 20 20 20 70 2d  MIT;\n");.    p-
31af0 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 73 61  >showHeader = sa
31b00 76 65 64 53 68 6f 77 48 65 61 64 65 72 3b 0a 20  vedShowHeader;. 
31b10 20 20 20 70 2d 3e 73 68 65 6c 6c 46 6c 67 73 20     p->shellFlgs 
31b20 3d 20 73 61 76 65 64 53 68 65 6c 6c 46 6c 61 67  = savedShellFlag
31b30 73 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  s;.  }else..  if
31b40 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e  ( c=='e' && strn
31b50 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65  cmp(azArg[0], "e
31b60 63 68 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  cho", n)==0 ){. 
31b70 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
31b80 7b 0a 20 20 20 20 20 20 73 65 74 4f 72 43 6c 65  {.      setOrCle
31b90 61 72 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f  arFlag(p, SHFLG_
31ba0 45 63 68 6f 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  Echo, azArg[1]);
31bb0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
31bc0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
31bd0 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 65 63  err, "Usage: .ec
31be0 68 6f 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20  ho on|off\n");. 
31bf0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
31c00 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
31c10 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e  ( c=='e' && strn
31c20 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65  cmp(azArg[0], "e
31c30 71 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  qp", n)==0 ){.  
31c40 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b    if( nArg==2 ){
31c50 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51  .      p->autoEQ
31c60 50 74 65 73 74 20 3d 20 30 3b 0a 20 20 20 20 20  Ptest = 0;.     
31c70 20 69 66 28 20 70 2d 3e 61 75 74 6f 45 51 50 74   if( p->autoEQPt
31c80 72 61 63 65 20 29 7b 0a 20 20 20 20 20 20 20 20  race ){.        
31c90 69 66 28 20 70 2d 3e 64 62 20 29 20 73 71 6c 69  if( p->db ) sqli
31ca0 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
31cb0 22 50 52 41 47 4d 41 20 76 64 62 65 5f 74 72 61  "PRAGMA vdbe_tra
31cc0 63 65 3d 4f 46 46 3b 22 2c 20 30 2c 20 30 2c 20  ce=OFF;", 0, 0, 
31cd0 30 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61  0);.        p->a
31ce0 75 74 6f 45 51 50 74 72 61 63 65 20 3d 20 30 3b  utoEQPtrace = 0;
31cf0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
31d00 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b  f( strcmp(azArg[
31d10 31 5d 2c 22 66 75 6c 6c 22 29 3d 3d 30 20 29 7b  1],"full")==0 ){
31d20 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f  .        p->auto
31d30 45 51 50 20 3d 20 41 55 54 4f 45 51 50 5f 66 75  EQP = AUTOEQP_fu
31d40 6c 6c 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ll;.      }else 
31d50 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67  if( strcmp(azArg
31d60 5b 31 5d 2c 22 74 72 69 67 67 65 72 22 29 3d 3d  [1],"trigger")==
31d70 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  0 ){.        p->
31d80 61 75 74 6f 45 51 50 20 3d 20 41 55 54 4f 45 51  autoEQP = AUTOEQ
31d90 50 5f 74 72 69 67 67 65 72 3b 0a 23 69 66 64 65  P_trigger;.#ifde
31da0 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20  f SQLITE_DEBUG. 
31db0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
31dc0 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  trcmp(azArg[1],"
31dd0 74 65 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  test")==0 ){.   
31de0 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50 20       p->autoEQP 
31df0 3d 20 41 55 54 4f 45 51 50 5f 6f 6e 3b 0a 20 20  = AUTOEQP_on;.  
31e00 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50        p->autoEQP
31e10 74 65 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  test = 1;.      
31e20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
31e30 28 61 7a 41 72 67 5b 31 5d 2c 22 74 72 61 63 65  (azArg[1],"trace
31e40 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")==0 ){.       
31e50 20 70 2d 3e 61 75 74 6f 45 51 50 20 3d 20 41 55   p->autoEQP = AU
31e60 54 4f 45 51 50 5f 66 75 6c 6c 3b 0a 20 20 20 20  TOEQP_full;.    
31e70 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50 74 72      p->autoEQPtr
31e80 61 63 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  ace = 1;.       
31e90 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
31ea0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
31eb0 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 45 4c  exec(p->db, "SEL
31ec0 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71  ECT name FROM sq
31ed0 6c 69 74 65 5f 6d 61 73 74 65 72 20 4c 49 4d 49  lite_master LIMI
31ee0 54 20 31 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  T 1", 0, 0, 0);.
31ef0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
31f00 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 50 52 41  exec(p->db, "PRA
31f10 47 4d 41 20 76 64 62 65 5f 74 72 61 63 65 3d 4f  GMA vdbe_trace=O
31f20 4e 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 23  N;", 0, 0, 0);.#
31f30 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73  endif.      }els
31f40 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 75  e{.        p->au
31f50 74 6f 45 51 50 20 3d 20 28 75 38 29 62 6f 6f 6c  toEQP = (u8)bool
31f60 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31  eanValue(azArg[1
31f70 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
31f80 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
31f90 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
31fa0 22 55 73 61 67 65 3a 20 2e 65 71 70 20 6f 66 66  "Usage: .eqp off
31fb0 7c 6f 6e 7c 74 72 61 63 65 7c 74 72 69 67 67 65  |on|trace|trigge
31fc0 72 7c 66 75 6c 6c 5c 6e 22 29 3b 0a 20 20 20 20  r|full\n");.    
31fd0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
31fe0 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
31ff0 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70  =='e' && strncmp
32000 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78 69 74  (azArg[0], "exit
32010 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
32020 69 66 28 20 6e 41 72 67 3e 31 20 26 26 20 28 72  if( nArg>1 && (r
32030 63 20 3d 20 28 69 6e 74 29 69 6e 74 65 67 65 72  c = (int)integer
32040 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 29  Value(azArg[1]))
32050 21 3d 30 20 29 20 65 78 69 74 28 72 63 29 3b 0a  !=0 ) exit(rc);.
32060 20 20 20 20 72 63 20 3d 20 32 3b 0a 20 20 7d 65      rc = 2;.  }e
32070 6c 73 65 0a 0a 20 20 2f 2a 20 54 68 65 20 22 2e  lse..  /* The ".
32080 65 78 70 6c 61 69 6e 22 20 63 6f 6d 6d 61 6e 64  explain" command
32090 20 69 73 20 61 75 74 6f 6d 61 74 69 63 20 6e 6f   is automatic no
320a0 77 2e 20 20 49 74 20 69 73 20 6c 61 72 67 65 6c  w.  It is largel
320b0 79 20 70 6f 69 6e 74 6c 65 73 73 2e 20 20 49 74  y pointless.  It
320c0 0a 20 20 2a 2a 20 72 65 74 61 69 6e 65 64 20 70  .  ** retained p
320d0 75 72 65 6c 79 20 66 6f 72 20 62 61 63 6b 77 61  urely for backwa
320e0 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
320f0 79 20 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27 65  y */.  if( c=='e
32100 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
32110 72 67 5b 30 5d 2c 20 22 65 78 70 6c 61 69 6e 22  rg[0], "explain"
32120 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
32130 6e 74 20 76 61 6c 20 3d 20 31 3b 0a 20 20 20 20  nt val = 1;.    
32140 69 66 28 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20  if( nArg>=2 ){. 
32150 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
32160 61 7a 41 72 67 5b 31 5d 2c 22 61 75 74 6f 22 29  azArg[1],"auto")
32170 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 76  ==0 ){.        v
32180 61 6c 20 3d 20 39 39 3b 0a 20 20 20 20 20 20 7d  al = 99;.      }
32190 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 76 61  else{.        va
321a0 6c 20 3d 20 20 62 6f 6f 6c 65 61 6e 56 61 6c 75  l =  booleanValu
321b0 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  e(azArg[1]);.   
321c0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
321d0 66 28 20 76 61 6c 3d 3d 31 20 26 26 20 70 2d 3e  f( val==1 && p->
321e0 6d 6f 64 65 21 3d 4d 4f 44 45 5f 45 78 70 6c 61  mode!=MODE_Expla
321f0 69 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  in ){.      p->n
32200 6f 72 6d 61 6c 4d 6f 64 65 20 3d 20 70 2d 3e 6d  ormalMode = p->m
32210 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  ode;.      p->mo
32220 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c 61 69  de = MODE_Explai
32230 6e 3b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f  n;.      p->auto
32240 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20  Explain = 0;.   
32250 20 7d 65 6c 73 65 20 69 66 28 20 76 61 6c 3d 3d   }else if( val==
32260 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
32270 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70  ->mode==MODE_Exp
32280 6c 61 69 6e 20 29 20 70 2d 3e 6d 6f 64 65 20 3d  lain ) p->mode =
32290 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 0a   p->normalMode;.
322a0 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 78 70        p->autoExp
322b0 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 65  lain = 0;.    }e
322c0 6c 73 65 20 69 66 28 20 76 61 6c 3d 3d 39 39 20  lse if( val==99 
322d0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
322e0 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61  mode==MODE_Expla
322f0 69 6e 20 29 20 70 2d 3e 6d 6f 64 65 20 3d 20 70  in ) p->mode = p
32300 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 0a 20 20  ->normalMode;.  
32310 20 20 20 20 70 2d 3e 61 75 74 6f 45 78 70 6c 61      p->autoExpla
32320 69 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  in = 1;.    }.  
32330 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53  }else..#ifndef S
32340 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
32350 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 63 3d  ALTABLE.  if( c=
32360 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='e' && strncmp(
32370 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78 70 65 72  azArg[0], "exper
32380 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  t", n)==0 ){.   
32390 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
323a0 20 20 20 20 65 78 70 65 72 74 44 6f 74 43 6f 6d      expertDotCom
323b0 6d 61 6e 64 28 70 2c 20 61 7a 41 72 67 2c 20 6e  mand(p, azArg, n
323c0 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  Arg);.  }else.#e
323d0 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27  ndif..  if( c=='
323e0 66 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  f' && strncmp(az
323f0 41 72 67 5b 30 5d 2c 20 22 66 75 6c 6c 73 63 68  Arg[0], "fullsch
32400 65 6d 61 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ema", n)==0 ){. 
32410 20 20 20 53 68 65 6c 6c 53 74 61 74 65 20 64 61     ShellState da
32420 74 61 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45  ta;.    char *zE
32430 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69  rrMsg = 0;.    i
32440 6e 74 20 64 6f 53 74 61 74 73 20 3d 20 30 3b 0a  nt doStats = 0;.
32450 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61      memcpy(&data
32460 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64 61 74 61  , p, sizeof(data
32470 29 29 3b 0a 20 20 20 20 64 61 74 61 2e 73 68 6f  ));.    data.sho
32480 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20  wHeader = 0;.   
32490 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61   data.cMode = da
324a0 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 53  ta.mode = MODE_S
324b0 65 6d 69 3b 0a 20 20 20 20 69 66 28 20 6e 41 72  emi;.    if( nAr
324c0 67 3d 3d 32 20 26 26 20 6f 70 74 69 6f 6e 4d 61  g==2 && optionMa
324d0 74 63 68 28 61 7a 41 72 67 5b 31 5d 2c 20 22 69  tch(azArg[1], "i
324e0 6e 64 65 6e 74 22 29 20 29 7b 0a 20 20 20 20 20  ndent") ){.     
324f0 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61   data.cMode = da
32500 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 50  ta.mode = MODE_P
32510 72 65 74 74 79 3b 0a 20 20 20 20 20 20 6e 41 72  retty;.      nAr
32520 67 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  g = 1;.    }.   
32530 20 69 66 28 20 6e 41 72 67 21 3d 31 20 29 7b 0a   if( nArg!=1 ){.
32540 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
32550 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
32560 20 2e 66 75 6c 6c 73 63 68 65 6d 61 20 3f 2d 2d   .fullschema ?--
32570 69 6e 64 65 6e 74 3f 5c 6e 22 29 3b 0a 20 20 20  indent?\n");.   
32580 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
32590 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
325a0 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20  nd_exit;.    }. 
325b0 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
325c0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
325d0 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 0a 20  e3_exec(p->db,. 
325e0 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 73 71        "SELECT sq
325f0 6c 20 46 52 4f 4d 22 0a 20 20 20 20 20 20 20 22  l FROM".       "
32600 20 20 28 53 45 4c 45 43 54 20 73 71 6c 20 73 71    (SELECT sql sq
32610 6c 2c 20 74 79 70 65 20 74 79 70 65 2c 20 74 62  l, type type, tb
32620 6c 5f 6e 61 6d 65 20 74 62 6c 5f 6e 61 6d 65 2c  l_name tbl_name,
32630 20 6e 61 6d 65 20 6e 61 6d 65 2c 20 72 6f 77 69   name name, rowi
32640 64 20 78 22 0a 20 20 20 20 20 20 20 22 20 20 20  d x".       "   
32650 20 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61    FROM sqlite_ma
32660 73 74 65 72 20 55 4e 49 4f 4e 20 41 4c 4c 22 0a  ster UNION ALL".
32670 20 20 20 20 20 20 20 22 20 20 20 53 45 4c 45 43         "   SELEC
32680 54 20 73 71 6c 2c 20 74 79 70 65 2c 20 74 62 6c  T sql, type, tbl
32690 5f 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20 72 6f 77  _name, name, row
326a0 69 64 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74  id FROM sqlite_t
326b0 65 6d 70 5f 6d 61 73 74 65 72 29 20 22 0a 20 20  emp_master) ".  
326c0 20 20 20 20 20 22 57 48 45 52 45 20 74 79 70 65       "WHERE type
326d0 21 3d 27 6d 65 74 61 27 20 41 4e 44 20 73 71 6c  !='meta' AND sql
326e0 20 4e 4f 54 4e 55 4c 4c 20 41 4e 44 20 6e 61 6d   NOTNULL AND nam
326f0 65 20 4e 4f 54 20 4c 49 4b 45 20 27 73 71 6c 69  e NOT LIKE 'sqli
32700 74 65 5f 25 27 20 22 0a 20 20 20 20 20 20 20 22  te_%' ".       "
32710 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 22 2c  ORDER BY rowid",
32720 0a 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b  .       callback
32730 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73  , &data, &zErrMs
32740 67 0a 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28  g.    );.    if(
32750 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
32760 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
32770 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20  stmt *pStmt;.   
32780 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
32790 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
327a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
327b0 20 22 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46   "SELECT rowid F
327c0 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
327d0 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r".             
327e0 20 20 22 20 57 48 45 52 45 20 6e 61 6d 65 20 47    " WHERE name G
327f0 4c 4f 42 20 27 73 71 6c 69 74 65 5f 73 74 61 74  LOB 'sqlite_stat
32800 5b 31 33 34 5d 27 22 2c 0a 20 20 20 20 20 20 20  [134]'",.       
32810 20 20 20 20 20 20 20 20 2d 31 2c 20 26 70 53 74          -1, &pSt
32820 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 64 6f  mt, 0);.      do
32830 53 74 61 74 73 20 3d 20 73 71 6c 69 74 65 33 5f  Stats = sqlite3_
32840 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c  step(pStmt)==SQL
32850 49 54 45 5f 52 4f 57 3b 0a 20 20 20 20 20 20 73  ITE_ROW;.      s
32860 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
32870 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20  pStmt);.    }.  
32880 20 20 69 66 28 20 64 6f 53 74 61 74 73 3d 3d 30    if( doStats==0
32890 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
328a0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a  intf(p->out, "/*
328b0 20 4e 6f 20 53 54 41 54 20 74 61 62 6c 65 73 20   No STAT tables 
328c0 61 76 61 69 6c 61 62 6c 65 20 2a 2f 5c 6e 22 29  available */\n")
328d0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
328e0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
328f0 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20 73  >out, "ANALYZE s
32900 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e 22  qlite_master;\n"
32910 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
32920 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 45  _exec(p->db, "SE
32930 4c 45 43 54 20 27 41 4e 41 4c 59 5a 45 20 73 71  LECT 'ANALYZE sq
32940 6c 69 74 65 5f 6d 61 73 74 65 72 27 22 2c 0a 20  lite_master'",. 
32950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32960 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74    callback, &dat
32970 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  a, &zErrMsg);.  
32980 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d      data.cMode =
32990 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44   data.mode = MOD
329a0 45 5f 49 6e 73 65 72 74 3b 0a 20 20 20 20 20 20  E_Insert;.      
329b0 64 61 74 61 2e 7a 44 65 73 74 54 61 62 6c 65 20  data.zDestTable 
329c0 3d 20 22 73 71 6c 69 74 65 5f 73 74 61 74 31 22  = "sqlite_stat1"
329d0 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f 65 78  ;.      shell_ex
329e0 65 63 28 26 64 61 74 61 2c 20 22 53 45 4c 45 43  ec(&data, "SELEC
329f0 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  T * FROM sqlite_
32a00 73 74 61 74 31 22 2c 20 26 7a 45 72 72 4d 73 67  stat1", &zErrMsg
32a10 29 3b 0a 20 20 20 20 20 20 64 61 74 61 2e 7a 44  );.      data.zD
32a20 65 73 74 54 61 62 6c 65 20 3d 20 22 73 71 6c 69  estTable = "sqli
32a30 74 65 5f 73 74 61 74 33 22 3b 0a 20 20 20 20 20  te_stat3";.     
32a40 20 73 68 65 6c 6c 5f 65 78 65 63 28 26 64 61 74   shell_exec(&dat
32a50 61 2c 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  a, "SELECT * FRO
32a60 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 33 22 2c  M sqlite_stat3",
32a70 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20   &zErrMsg);.    
32a80 20 20 64 61 74 61 2e 7a 44 65 73 74 54 61 62 6c    data.zDestTabl
32a90 65 20 3d 20 22 73 71 6c 69 74 65 5f 73 74 61 74  e = "sqlite_stat
32aa0 34 22 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f  4";.      shell_
32ab0 65 78 65 63 28 26 64 61 74 61 2c 20 22 53 45 4c  exec(&data, "SEL
32ac0 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74  ECT * FROM sqlit
32ad0 65 5f 73 74 61 74 34 22 2c 20 26 7a 45 72 72 4d  e_stat4", &zErrM
32ae0 73 67 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70  sg);.      raw_p
32af0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 41  rintf(p->out, "A
32b00 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61  NALYZE sqlite_ma
32b10 73 74 65 72 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d  ster;\n");.    }
32b20 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
32b30 63 3d 3d 27 68 27 20 26 26 20 73 74 72 6e 63 6d  c=='h' && strncm
32b40 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 68 65 61  p(azArg[0], "hea
32b50 64 65 72 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  ders", n)==0 ){.
32b60 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
32b70 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73 68 6f 77  ){.      p->show
32b80 48 65 61 64 65 72 20 3d 20 62 6f 6f 6c 65 61 6e  Header = boolean
32b90 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b  Value(azArg[1]);
32ba0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
32bb0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
32bc0 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 68 65  err, "Usage: .he
32bd0 61 64 65 72 73 20 6f 6e 7c 6f 66 66 5c 6e 22 29  aders on|off\n")
32be0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
32bf0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
32c00 20 69 66 28 20 63 3d 3d 27 68 27 20 26 26 20 73   if( c=='h' && s
32c10 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
32c20 20 22 68 65 6c 70 22 2c 20 6e 29 3d 3d 30 20 29   "help", n)==0 )
32c30 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 3d  {.    if( nArg>=
32c40 32 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73  2 ){.      n = s
32c50 68 6f 77 48 65 6c 70 28 70 2d 3e 6f 75 74 2c 20  howHelp(p->out, 
32c60 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20  azArg[1]);.     
32c70 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20   if( n==0 ){.   
32c80 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
32c90 28 70 2d 3e 6f 75 74 2c 20 22 4e 6f 74 68 69 6e  (p->out, "Nothin
32ca0 67 20 6d 61 74 63 68 65 73 20 27 25 73 27 5c 6e  g matches '%s'\n
32cb0 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ", azArg[1]);.  
32cc0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
32cd0 0a 20 20 20 20 20 20 73 68 6f 77 48 65 6c 70 28  .      showHelp(
32ce0 70 2d 3e 6f 75 74 2c 20 30 29 3b 0a 20 20 20 20  p->out, 0);.    
32cf0 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
32d00 20 63 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63   c=='i' && strnc
32d10 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6d  mp(azArg[0], "im
32d20 70 6f 72 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  port", n)==0 ){.
32d30 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 6c 65      char *zTable
32d40 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
32d50 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20 69  /* Insert data i
32d60 6e 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a  nto this table *
32d70 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69 6c  /.    char *zFil
32d80 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
32d90 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c    /* Name of fil
32da0 65 20 74 6f 20 65 78 74 72 61 20 63 6f 6e 74 65  e to extra conte
32db0 6e 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 73  nt from */.    s
32dc0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
32dd0 6d 74 20 3d 20 4e 55 4c 4c 3b 20 2f 2a 20 41 20  mt = NULL; /* A 
32de0 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
32df0 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
32e00 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32e10 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
32e20 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s in the table *
32e30 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b  /.    int nByte;
32e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e50 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
32e60 79 74 65 73 20 69 6e 20 61 6e 20 53 51 4c 20 73  ytes in an SQL s
32e70 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  tring */.    int
32e80 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
32e90 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
32ea0 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 20   counters */.   
32eb0 20 69 6e 74 20 6e 65 65 64 43 6f 6d 6d 69 74 3b   int needCommit;
32ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
32ed0 54 72 75 65 20 74 6f 20 43 4f 4d 4d 49 54 20 6f  True to COMMIT o
32ee0 72 20 52 4f 4c 4c 42 41 43 4b 20 61 74 20 65 6e  r ROLLBACK at en
32ef0 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65  d */.    int nSe
32f00 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
32f10 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
32f20 66 20 62 79 74 65 73 20 69 6e 20 70 2d 3e 63 6f  f bytes in p->co
32f30 6c 53 65 70 61 72 61 74 6f 72 5b 5d 20 2a 2f 0a  lSeparator[] */.
32f40 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20      char *zSql; 
32f50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32f60 2f 2a 20 41 6e 20 53 51 4c 20 73 74 61 74 65 6d  /* An SQL statem
32f70 65 6e 74 20 2a 2f 0a 20 20 20 20 49 6d 70 6f 72  ent */.    Impor
32f80 74 43 74 78 20 73 43 74 78 3b 20 20 20 20 20 20  tCtx sCtx;      
32f90 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 65 72         /* Reader
32fa0 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20 20   context */.    
32fb0 63 68 61 72 20 2a 28 53 51 4c 49 54 45 5f 43 44  char *(SQLITE_CD
32fc0 45 43 4c 20 2a 78 52 65 61 64 29 28 49 6d 70 6f  ECL *xRead)(Impo
32fd0 72 74 43 74 78 2a 29 3b 20 2f 2a 20 46 75 6e 63  rtCtx*); /* Func
32fe0 20 74 6f 20 72 65 61 64 20 6f 6e 65 20 76 61 6c   to read one val
32ff0 75 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 28 53  ue */.    int (S
33000 51 4c 49 54 45 5f 43 44 45 43 4c 20 2a 78 43 6c  QLITE_CDECL *xCl
33010 6f 73 65 72 29 28 46 49 4c 45 2a 29 3b 20 20 20  oser)(FILE*);   
33020 20 20 20 2f 2a 20 46 75 6e 63 20 74 6f 20 63 6c     /* Func to cl
33030 6f 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  ose file */..   
33040 20 69 66 28 20 6e 41 72 67 21 3d 33 20 29 7b 0a   if( nArg!=3 ){.
33050 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
33060 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
33070 20 2e 69 6d 70 6f 72 74 20 46 49 4c 45 20 54 41   .import FILE TA
33080 42 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 67  BLE\n");.      g
33090 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
330a0 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
330b0 20 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31   zFile = azArg[1
330c0 5d 3b 0a 20 20 20 20 7a 54 61 62 6c 65 20 3d 20  ];.    zTable = 
330d0 61 7a 41 72 67 5b 32 5d 3b 0a 20 20 20 20 73 65  azArg[2];.    se
330e0 65 6e 49 6e 74 65 72 72 75 70 74 20 3d 20 30 3b  enInterrupt = 0;
330f0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 43 74  .    memset(&sCt
33100 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 43 74  x, 0, sizeof(sCt
33110 78 29 29 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62  x));.    open_db
33120 28 70 2c 20 30 29 3b 0a 20 20 20 20 6e 53 65 70  (p, 0);.    nSep
33130 20 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 63   = strlen30(p->c
33140 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  olSeparator);.  
33150 20 20 69 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b    if( nSep==0 ){
33160 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
33170 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20 20  f(stderr,.      
33180 20 20 20 20 20 20 20 20 20 20 20 22 45 72 72 6f             "Erro
33190 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 63 6f 6c 75  r: non-null colu
331a0 6d 6e 20 73 65 70 61 72 61 74 6f 72 20 72 65 71  mn separator req
331b0 75 69 72 65 64 20 66 6f 72 20 69 6d 70 6f 72 74  uired for import
331c0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  \n");.      retu
331d0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
331e0 69 66 28 20 6e 53 65 70 3e 31 20 29 7b 0a 20 20  if( nSep>1 ){.  
331f0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
33200 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6d  tderr, "Error: m
33210 75 6c 74 69 2d 63 68 61 72 61 63 74 65 72 20 63  ulti-character c
33220 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 73  olumn separators
33230 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 22 0a 20 20   not allowed".  
33240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33250 20 20 20 20 22 20 66 6f 72 20 69 6d 70 6f 72 74      " for import
33260 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  \n");.      retu
33270 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
33280 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28  nSep = strlen30(
33290 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
332a0 3b 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d  ;.    if( nSep==
332b0 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  0 ){.      raw_p
332c0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
332d0 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 72  rror: non-null r
332e0 6f 77 20 73 65 70 61 72 61 74 6f 72 20 72 65 71  ow separator req
332f0 75 69 72 65 64 20 66 6f 72 20 69 6d 70 6f 72 74  uired for import
33300 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  \n");.      retu
33310 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
33320 69 66 28 20 6e 53 65 70 3d 3d 32 20 26 26 20 70  if( nSep==2 && p
33330 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 43 73 76  ->mode==MODE_Csv
33340 20 26 26 20 73 74 72 63 6d 70 28 70 2d 3e 72 6f   && strcmp(p->ro
33350 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f  wSeparator, SEP_
33360 43 72 4c 66 29 3d 3d 30 20 29 7b 0a 20 20 20 20  CrLf)==0 ){.    
33370 20 20 2f 2a 20 57 68 65 6e 20 69 6d 70 6f 72 74    /* When import
33380 69 6e 67 20 43 53 56 20 28 6f 6e 6c 79 29 2c 20  ing CSV (only), 
33390 69 66 20 74 68 65 20 72 6f 77 20 73 65 70 61 72  if the row separ
333a0 61 74 6f 72 20 69 73 20 73 65 74 20 74 6f 20 74  ator is set to t
333b0 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 66 61  he.      ** defa
333c0 75 6c 74 20 6f 75 74 70 75 74 20 72 6f 77 20 73  ult output row s
333d0 65 70 61 72 61 74 6f 72 2c 20 63 68 61 6e 67 65  eparator, change
333e0 20 69 74 20 74 6f 20 74 68 65 20 64 65 66 61 75   it to the defau
333f0 6c 74 20 69 6e 70 75 74 0a 20 20 20 20 20 20 2a  lt input.      *
33400 2a 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 2e  * row separator.
33410 20 20 54 68 69 73 20 61 76 6f 69 64 73 20 68 61    This avoids ha
33420 76 69 6e 67 20 74 6f 20 6d 61 69 6e 74 61 69 6e  ving to maintain
33430 20 64 69 66 66 65 72 65 6e 74 20 69 6e 70 75 74   different input
33440 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6f 75  .      ** and ou
33450 74 70 75 74 20 72 6f 77 20 73 65 70 61 72 61 74  tput row separat
33460 6f 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  ors. */.      sq
33470 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
33480 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61  izeof(p->rowSepa
33490 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65  rator), p->rowSe
334a0 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77  parator, SEP_Row
334b0 29 3b 0a 20 20 20 20 20 20 6e 53 65 70 20 3d 20  );.      nSep = 
334c0 73 74 72 6c 65 6e 33 30 28 70 2d 3e 72 6f 77 53  strlen30(p->rowS
334d0 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 7d  eparator);.    }
334e0 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3e 31 20  .    if( nSep>1 
334f0 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
33500 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
33510 6f 72 3a 20 6d 75 6c 74 69 2d 63 68 61 72 61 63  or: multi-charac
33520 74 65 72 20 72 6f 77 20 73 65 70 61 72 61 74 6f  ter row separato
33530 72 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 22 0a  rs not allowed".
33540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33550 20 20 20 20 20 20 22 20 66 6f 72 20 69 6d 70 6f        " for impo
33560 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65  rt\n");.      re
33570 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
33580 20 20 73 43 74 78 2e 7a 46 69 6c 65 20 3d 20 7a    sCtx.zFile = z
33590 46 69 6c 65 3b 0a 20 20 20 20 73 43 74 78 2e 6e  File;.    sCtx.n
335a0 4c 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20 69 66  Line = 1;.    if
335b0 28 20 73 43 74 78 2e 7a 46 69 6c 65 5b 30 5d 3d  ( sCtx.zFile[0]=
335c0 3d 27 7c 27 20 29 7b 0a 23 69 66 64 65 66 20 53  ='|' ){.#ifdef S
335d0 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e  QLITE_OMIT_POPEN
335e0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
335f0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
33600 3a 20 70 69 70 65 73 20 61 72 65 20 6e 6f 74 20  : pipes are not 
33610 73 75 70 70 6f 72 74 65 64 20 69 6e 20 74 68 69  supported in thi
33620 73 20 4f 53 5c 6e 22 29 3b 0a 20 20 20 20 20 20  s OS\n");.      
33630 72 65 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a  return 1;.#else.
33640 20 20 20 20 20 20 73 43 74 78 2e 69 6e 20 3d 20        sCtx.in = 
33650 70 6f 70 65 6e 28 73 43 74 78 2e 7a 46 69 6c 65  popen(sCtx.zFile
33660 2b 31 2c 20 22 72 22 29 3b 0a 20 20 20 20 20 20  +1, "r");.      
33670 73 43 74 78 2e 7a 46 69 6c 65 20 3d 20 22 3c 70  sCtx.zFile = "<p
33680 69 70 65 3e 22 3b 0a 20 20 20 20 20 20 78 43 6c  ipe>";.      xCl
33690 6f 73 65 72 20 3d 20 70 63 6c 6f 73 65 3b 0a 23  oser = pclose;.#
336a0 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
336b0 0a 20 20 20 20 20 20 73 43 74 78 2e 69 6e 20 3d  .      sCtx.in =
336c0 20 66 6f 70 65 6e 28 73 43 74 78 2e 7a 46 69 6c   fopen(sCtx.zFil
336d0 65 2c 20 22 72 62 22 29 3b 0a 20 20 20 20 20 20  e, "rb");.      
336e0 78 43 6c 6f 73 65 72 20 3d 20 66 63 6c 6f 73 65  xCloser = fclose
336f0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
33700 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 41 73  p->mode==MODE_As
33710 63 69 69 20 29 7b 0a 20 20 20 20 20 20 78 52 65  cii ){.      xRe
33720 61 64 20 3d 20 61 73 63 69 69 5f 72 65 61 64 5f  ad = ascii_read_
33730 6f 6e 65 5f 66 69 65 6c 64 3b 0a 20 20 20 20 7d  one_field;.    }
33740 65 6c 73 65 7b 0a 20 20 20 20 20 20 78 52 65 61  else{.      xRea
33750 64 20 3d 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65  d = csv_read_one
33760 5f 66 69 65 6c 64 3b 0a 20 20 20 20 7d 0a 20 20  _field;.    }.  
33770 20 20 69 66 28 20 73 43 74 78 2e 69 6e 3d 3d 30    if( sCtx.in==0
33780 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
33790 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
337a0 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65  rror: cannot ope
337b0 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69  n \"%s\"\n", zFi
337c0 6c 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  le);.      retur
337d0 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  n 1;.    }.    s
337e0 43 74 78 2e 63 43 6f 6c 53 65 70 20 3d 20 70 2d  Ctx.cColSep = p-
337f0 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b 30 5d  >colSeparator[0]
33800 3b 0a 20 20 20 20 73 43 74 78 2e 63 52 6f 77 53  ;.    sCtx.cRowS
33810 65 70 20 3d 20 70 2d 3e 72 6f 77 53 65 70 61 72  ep = p->rowSepar
33820 61 74 6f 72 5b 30 5d 3b 0a 20 20 20 20 7a 53 71  ator[0];.    zSq
33830 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
33840 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52  ntf("SELECT * FR
33850 4f 4d 20 25 73 22 2c 20 7a 54 61 62 6c 65 29 3b  OM %s", zTable);
33860 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  .    if( zSql==0
33870 20 29 7b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65   ){.      xClose
33880 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20  r(sCtx.in);.    
33890 20 20 73 68 65 6c 6c 5f 6f 75 74 5f 6f 66 5f 6d    shell_out_of_m
338a0 65 6d 6f 72 79 28 29 3b 0a 20 20 20 20 7d 0a 20  emory();.    }. 
338b0 20 20 20 6e 42 79 74 65 20 3d 20 73 74 72 6c 65     nByte = strle
338c0 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20 72  n30(zSql);.    r
338d0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
338e0 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53  are_v2(p->db, zS
338f0 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
33900 30 29 3b 0a 20 20 20 20 69 6d 70 6f 72 74 5f 61  0);.    import_a
33910 70 70 65 6e 64 5f 63 68 61 72 28 26 73 43 74 78  ppend_char(&sCtx
33920 2c 20 30 29 3b 20 20 20 20 2f 2a 20 54 6f 20 65  , 0);    /* To e
33930 6e 73 75 72 65 20 73 43 74 78 2e 7a 20 69 73 20  nsure sCtx.z is 
33940 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 20  allocated */.   
33950 20 69 66 28 20 72 63 20 26 26 20 73 71 6c 69 74   if( rc && sqlit
33960 65 33 5f 73 74 72 67 6c 6f 62 28 22 6e 6f 20 73  e3_strglob("no s
33970 75 63 68 20 74 61 62 6c 65 3a 20 2a 22 2c 20 73  uch table: *", s
33980 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
33990 3e 64 62 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  >db))==0 ){.    
339a0 20 20 63 68 61 72 20 2a 7a 43 72 65 61 74 65 20    char *zCreate 
339b0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
339c0 66 28 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  f("CREATE TABLE 
339d0 25 73 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20  %s", zTable);.  
339e0 20 20 20 20 63 68 61 72 20 63 53 65 70 20 3d 20      char cSep = 
339f0 27 28 27 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  '(';.      while
33a00 28 20 78 52 65 61 64 28 26 73 43 74 78 29 20 29  ( xRead(&sCtx) )
33a10 7b 0a 20 20 20 20 20 20 20 20 7a 43 72 65 61 74  {.        zCreat
33a20 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
33a30 6e 74 66 28 22 25 7a 25 63 5c 6e 20 20 5c 22 25  ntf("%z%c\n  \"%
33a40 77 5c 22 20 54 45 58 54 22 2c 20 7a 43 72 65 61  w\" TEXT", zCrea
33a50 74 65 2c 20 63 53 65 70 2c 20 73 43 74 78 2e 7a  te, cSep, sCtx.z
33a60 29 3b 0a 20 20 20 20 20 20 20 20 63 53 65 70 20  );.        cSep 
33a70 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 69  = ',';.        i
33a80 66 28 20 73 43 74 78 2e 63 54 65 72 6d 21 3d 73  f( sCtx.cTerm!=s
33a90 43 74 78 2e 63 43 6f 6c 53 65 70 20 29 20 62 72  Ctx.cColSep ) br
33aa0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
33ab0 20 20 20 69 66 28 20 63 53 65 70 3d 3d 27 28 27     if( cSep=='('
33ac0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
33ad0 74 65 33 5f 66 72 65 65 28 7a 43 72 65 61 74 65  te3_free(zCreate
33ae0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
33af0 65 33 5f 66 72 65 65 28 73 43 74 78 2e 7a 29 3b  e3_free(sCtx.z);
33b00 0a 20 20 20 20 20 20 20 20 78 43 6c 6f 73 65 72  .        xCloser
33b10 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20  (sCtx.in);.     
33b20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
33b30 74 64 65 72 72 2c 22 25 73 3a 20 65 6d 70 74 79  tderr,"%s: empty
33b40 20 66 69 6c 65 5c 6e 22 2c 20 73 43 74 78 2e 7a   file\n", sCtx.z
33b50 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 72  File);.        r
33b60 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
33b70 0a 20 20 20 20 20 20 7a 43 72 65 61 74 65 20 3d  .      zCreate =
33b80 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
33b90 28 22 25 7a 5c 6e 29 22 2c 20 7a 43 72 65 61 74  ("%z\n)", zCreat
33ba0 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  e);.      rc = s
33bb0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
33bc0 62 2c 20 7a 43 72 65 61 74 65 2c 20 30 2c 20 30  b, zCreate, 0, 0
33bd0 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
33be0 74 65 33 5f 66 72 65 65 28 7a 43 72 65 61 74 65  te3_free(zCreate
33bf0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
33c00 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
33c10 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
33c20 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 73 28  CREATE TABLE %s(
33c30 2e 2e 2e 29 20 66 61 69 6c 65 64 3a 20 25 73 5c  ...) failed: %s\
33c40 6e 22 2c 20 7a 54 61 62 6c 65 2c 0a 20 20 20 20  n", zTable,.    
33c50 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
33c60 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
33c70 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ));.        sqli
33c80 74 65 33 5f 66 72 65 65 28 73 43 74 78 2e 7a 29  te3_free(sCtx.z)
33c90 3b 0a 20 20 20 20 20 20 20 20 78 43 6c 6f 73 65  ;.        xClose
33ca0 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20  r(sCtx.in);.    
33cb0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
33cc0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
33cd0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
33ce0 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  _v2(p->db, zSql,
33cf0 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
33d00 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
33d10 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
33d20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
33d30 20 20 20 69 66 20 28 70 53 74 6d 74 29 20 73 71     if (pStmt) sq
33d40 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
33d50 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 75 74 66  Stmt);.      utf
33d60 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
33d70 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73  "Error: %s\n", s
33d80 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
33d90 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 78 43 6c  >db));.      xCl
33da0 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20  oser(sCtx.in);. 
33db0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
33dc0 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20     }.    nCol = 
33dd0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
33de0 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  ount(pStmt);.   
33df0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
33e00 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 53  e(pStmt);.    pS
33e10 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  tmt = 0;.    if(
33e20 20 6e 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72   nCol==0 ) retur
33e30 6e 20 30 3b 20 2f 2a 20 6e 6f 20 63 6f 6c 75 6d  n 0; /* no colum
33e40 6e 73 2c 20 6e 6f 20 65 72 72 6f 72 20 2a 2f 0a  ns, no error */.
33e50 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
33e60 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e 42 79  e3_malloc64( nBy
33e70 74 65 2a 32 20 2b 20 32 30 20 2b 20 6e 43 6f 6c  te*2 + 20 + nCol
33e80 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53  *2 );.    if( zS
33e90 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 78  ql==0 ){.      x
33ea0 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b  Closer(sCtx.in);
33eb0 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f 6f 75 74  .      shell_out
33ec0 5f 6f 66 5f 6d 65 6d 6f 72 79 28 29 3b 0a 20 20  _of_memory();.  
33ed0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
33ee0 73 6e 70 72 69 6e 74 66 28 6e 42 79 74 65 2b 32  snprintf(nByte+2
33ef0 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53 45 52 54  0, zSql, "INSERT
33f00 20 49 4e 54 4f 20 5c 22 25 77 5c 22 20 56 41 4c   INTO \"%w\" VAL
33f10 55 45 53 28 3f 22 2c 20 7a 54 61 62 6c 65 29 3b  UES(?", zTable);
33f20 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e 33  .    j = strlen3
33f30 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20 66 6f 72  0(zSql);.    for
33f40 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=1; i<nCol; i+
33f50 2b 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a  +){.      zSql[j
33f60 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20  ++] = ',';.     
33f70 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f 27   zSql[j++] = '?'
33f80 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c  ;.    }.    zSql
33f90 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20  [j++] = ')';.   
33fa0 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20   zSql[j] = 0;.  
33fb0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
33fc0 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
33fd0 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
33fe0 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
33ff0 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
34000 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
34010 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
34020 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25  tderr, "Error: %
34030 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  s\n", sqlite3_er
34040 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20  rmsg(p->db));.  
34050 20 20 20 20 69 66 20 28 70 53 74 6d 74 29 20 73      if (pStmt) s
34060 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
34070 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 78 43  pStmt);.      xC
34080 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a  loser(sCtx.in);.
34090 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
340a0 20 20 20 20 7d 0a 20 20 20 20 6e 65 65 64 43 6f      }.    needCo
340b0 6d 6d 69 74 20 3d 20 73 71 6c 69 74 65 33 5f 67  mmit = sqlite3_g
340c0 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 70 2d  et_autocommit(p-
340d0 3e 64 62 29 3b 0a 20 20 20 20 69 66 28 20 6e 65  >db);.    if( ne
340e0 65 64 43 6f 6d 6d 69 74 20 29 20 73 71 6c 69 74  edCommit ) sqlit
340f0 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22  e3_exec(p->db, "
34100 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30 29  BEGIN", 0, 0, 0)
34110 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20  ;.    do{.      
34120 69 6e 74 20 73 74 61 72 74 4c 69 6e 65 20 3d 20  int startLine = 
34130 73 43 74 78 2e 6e 4c 69 6e 65 3b 0a 20 20 20 20  sCtx.nLine;.    
34140 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f    for(i=0; i<nCo
34150 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  l; i++){.       
34160 20 63 68 61 72 20 2a 7a 20 3d 20 78 52 65 61 64   char *z = xRead
34170 28 26 73 43 74 78 29 3b 0a 20 20 20 20 20 20 20  (&sCtx);.       
34180 20 2f 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 44   /*.        ** D
34190 69 64 20 77 65 20 72 65 61 63 68 20 65 6e 64 2d  id we reach end-
341a0 6f 66 2d 66 69 6c 65 20 62 65 66 6f 72 65 20 66  of-file before f
341b0 69 6e 64 69 6e 67 20 61 6e 79 20 63 6f 6c 75 6d  inding any colum
341c0 6e 73 3f 0a 20 20 20 20 20 20 20 20 2a 2a 20 49  ns?.        ** I
341d0 66 20 73 6f 2c 20 73 74 6f 70 20 69 6e 73 74 65  f so, stop inste
341e0 61 64 20 6f 66 20 4e 55 4c 4c 20 66 69 6c 6c 69  ad of NULL filli
341f0 6e 67 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67  ng the remaining
34200 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 20 20   columns..      
34210 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28    */.        if(
34220 20 7a 3d 3d 30 20 26 26 20 69 3d 3d 30 20 29 20   z==0 && i==0 ) 
34230 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 2f  break;.        /
34240 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 44 69 64  *.        ** Did
34250 20 77 65 20 72 65 61 63 68 20 65 6e 64 2d 6f 66   we reach end-of
34260 2d 66 69 6c 65 20 4f 52 20 65 6e 64 2d 6f 66 2d  -file OR end-of-
34270 6c 69 6e 65 20 62 65 66 6f 72 65 20 66 69 6e 64  line before find
34280 69 6e 67 20 61 6e 79 0a 20 20 20 20 20 20 20 20  ing any.        
34290 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 41 53  ** columns in AS
342a0 43 49 49 20 6d 6f 64 65 3f 20 20 49 66 20 73 6f  CII mode?  If so
342b0 2c 20 73 74 6f 70 20 69 6e 73 74 65 61 64 20 6f  , stop instead o
342c0 66 20 4e 55 4c 4c 20 66 69 6c 6c 69 6e 67 0a 20  f NULL filling. 
342d0 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65         ** the re
342e0 6d 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 73 2e  maining columns.
342f0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
34300 20 20 20 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d      if( p->mode=
34310 3d 4d 4f 44 45 5f 41 73 63 69 69 20 26 26 20 28  =MODE_Ascii && (
34320 7a 3d 3d 30 20 7c 7c 20 7a 5b 30 5d 3d 3d 30 29  z==0 || z[0]==0)
34330 20 26 26 20 69 3d 3d 30 20 29 20 62 72 65 61 6b   && i==0 ) break
34340 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
34350 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d  3_bind_text(pStm
34360 74 2c 20 69 2b 31 2c 20 7a 2c 20 2d 31 2c 20 53  t, i+1, z, -1, S
34370 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
34380 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c  ;.        if( i<
34390 6e 43 6f 6c 2d 31 20 26 26 20 73 43 74 78 2e 63  nCol-1 && sCtx.c
343a0 54 65 72 6d 21 3d 73 43 74 78 2e 63 43 6f 6c 53  Term!=sCtx.cColS
343b0 65 70 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ep ){.          
343c0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
343d0 72 72 2c 20 22 25 73 3a 25 64 3a 20 65 78 70 65  rr, "%s:%d: expe
343e0 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20  cted %d columns 
343f0 62 75 74 20 66 6f 75 6e 64 20 25 64 20 2d 20 22  but found %d - "
34400 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
34410 20 20 20 20 20 20 20 20 20 20 20 22 66 69 6c 6c             "fill
34420 69 6e 67 20 74 68 65 20 72 65 73 74 20 77 69 74  ing the rest wit
34430 68 20 4e 55 4c 4c 5c 6e 22 2c 0a 20 20 20 20 20  h NULL\n",.     
34440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34450 20 20 20 20 20 73 43 74 78 2e 7a 46 69 6c 65 2c       sCtx.zFile,
34460 20 73 74 61 72 74 4c 69 6e 65 2c 20 6e 43 6f 6c   startLine, nCol
34470 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  , i+1);.        
34480 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20    i += 2;.      
34490 20 20 20 20 77 68 69 6c 65 28 20 69 3c 3d 6e 43      while( i<=nC
344a0 6f 6c 20 29 7b 20 73 71 6c 69 74 65 33 5f 62 69  ol ){ sqlite3_bi
344b0 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69  nd_null(pStmt, i
344c0 29 3b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20  ); i++; }.      
344d0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
344e0 20 20 69 66 28 20 73 43 74 78 2e 63 54 65 72 6d    if( sCtx.cTerm
344f0 3d 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70 20 29  ==sCtx.cColSep )
34500 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20  {.        do{.  
34510 20 20 20 20 20 20 20 20 78 52 65 61 64 28 26 73          xRead(&s
34520 43 74 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Ctx);.          
34530 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 77 68  i++;.        }wh
34540 69 6c 65 28 20 73 43 74 78 2e 63 54 65 72 6d 3d  ile( sCtx.cTerm=
34550 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70 20 29 3b  =sCtx.cColSep );
34560 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
34570 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
34580 3a 25 64 3a 20 65 78 70 65 63 74 65 64 20 25 64  :%d: expected %d
34590 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 66 6f 75   columns but fou
345a0 6e 64 20 25 64 20 2d 20 22 0a 20 20 20 20 20 20  nd %d - ".      
345b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
345c0 20 20 22 65 78 74 72 61 73 20 69 67 6e 6f 72 65    "extras ignore
345d0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
345e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 43                sC
345f0 74 78 2e 7a 46 69 6c 65 2c 20 73 74 61 72 74 4c  tx.zFile, startL
34600 69 6e 65 2c 20 6e 43 6f 6c 2c 20 69 29 3b 0a 20  ine, nCol, i);. 
34610 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
34620 20 69 3e 3d 6e 43 6f 6c 20 29 7b 0a 20 20 20 20   i>=nCol ){.    
34630 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70      sqlite3_step
34640 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20  (pStmt);.       
34650 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
34660 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  set(pStmt);.    
34670 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
34680 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
34690 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
346a0 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 49  tderr, "%s:%d: I
346b0 4e 53 45 52 54 20 66 61 69 6c 65 64 3a 20 25 73  NSERT failed: %s
346c0 5c 6e 22 2c 20 73 43 74 78 2e 7a 46 69 6c 65 2c  \n", sCtx.zFile,
346d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
346e0 20 20 20 20 20 20 20 73 74 61 72 74 4c 69 6e 65         startLine
346f0 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
34700 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20  (p->db));.      
34710 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
34720 7d 77 68 69 6c 65 28 20 73 43 74 78 2e 63 54 65  }while( sCtx.cTe
34730 72 6d 21 3d 45 4f 46 20 29 3b 0a 0a 20 20 20 20  rm!=EOF );..    
34740 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29  xCloser(sCtx.in)
34750 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
34760 65 65 28 73 43 74 78 2e 7a 29 3b 0a 20 20 20 20  ee(sCtx.z);.    
34770 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
34780 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28  (pStmt);.    if(
34790 20 6e 65 65 64 43 6f 6d 6d 69 74 20 29 20 73 71   needCommit ) sq
347a0 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
347b0 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30  , "COMMIT", 0, 0
347c0 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23  , 0);.  }else..#
347d0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 55 4e  ifndef SQLITE_UN
347e0 54 45 53 54 41 42 4c 45 0a 20 20 69 66 28 20 63  TESTABLE.  if( c
347f0 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70  =='i' && strncmp
34800 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6d 70 6f  (azArg[0], "impo
34810 73 74 65 72 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  ster", n)==0 ){.
34820 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a      char *zSql;.
34830 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 69      char *zColli
34840 73 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  st = 0;.    sqli
34850 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
34860 0a 20 20 20 20 69 6e 74 20 74 6e 75 6d 20 3d 20  .    int tnum = 
34870 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  0;.    int i;.  
34880 20 20 69 66 28 20 21 28 6e 41 72 67 3d 3d 33 20    if( !(nArg==3 
34890 7c 7c 20 28 6e 41 72 67 3d 3d 32 20 26 26 20 73  || (nArg==2 && s
348a0 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 61  qlite3_stricmp(a
348b0 7a 41 72 67 5b 31 5d 2c 22 6f 66 66 22 29 3d 3d  zArg[1],"off")==
348c0 30 29 29 20 29 7b 0a 20 20 20 20 20 20 75 74 66  0)) ){.      utf
348d0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
348e0 20 22 55 73 61 67 65 3a 20 2e 69 6d 70 6f 73 74   "Usage: .impost
348f0 65 72 20 49 4e 44 45 58 20 49 4d 50 4f 53 54 45  er INDEX IMPOSTE
34900 52 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  R\n".           
34910 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
34920 20 20 20 20 20 20 20 2e 69 6d 70 6f 73 74 65 72         .imposter
34930 20 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20   off\n");.      
34940 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f  rc = 1;.      go
34950 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
34960 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  exit;.    }.    
34970 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
34980 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
34990 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
349a0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
349b0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50  ITE_TESTCTRL_IMP
349c0 4f 53 54 45 52 2c 20 70 2d 3e 64 62 2c 20 22 6d  OSTER, p->db, "m
349d0 61 69 6e 22 2c 20 30 2c 20 31 29 3b 0a 20 20 20  ain", 0, 1);.   
349e0 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
349f0 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d  mand_exit;.    }
34a00 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  .    zSql = sqli
34a10 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
34a20 45 43 54 20 72 6f 6f 74 70 61 67 65 20 46 52 4f  ECT rootpage FRO
34a30 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  M sqlite_master"
34a40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
34a50 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48              " WH
34a60 45 52 45 20 6e 61 6d 65 3d 27 25 71 27 20 41 4e  ERE name='%q' AN
34a70 44 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22 2c  D type='index'",
34a80 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
34a90 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
34aa0 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  v2(p->db, zSql, 
34ab0 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
34ac0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
34ad0 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20  (zSql);.    if( 
34ae0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
34af0 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
34b00 29 7b 0a 20 20 20 20 20 20 74 6e 75 6d 20 3d 20  ){.      tnum = 
34b10 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
34b20 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  nt(pStmt, 0);.  
34b30 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
34b40 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
34b50 0a 20 20 20 20 69 66 28 20 74 6e 75 6d 3d 3d 30  .    if( tnum==0
34b60 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
34b70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6e  rintf(stderr, "n
34b80 6f 20 73 75 63 68 20 69 6e 64 65 78 3a 20 5c 22  o such index: \"
34b90 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31  %s\"\n", azArg[1
34ba0 5d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ]);.      rc = 1
34bb0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74  ;.      goto met
34bc0 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
34bd0 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d      }.    zSql =
34be0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
34bf0 28 22 50 52 41 47 4d 41 20 69 6e 64 65 78 5f 78  ("PRAGMA index_x
34c00 69 6e 66 6f 3d 27 25 71 27 22 2c 20 61 7a 41 72  info='%q'", azAr
34c10 67 5b 31 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20  g[1]);.    rc = 
34c20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
34c30 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  v2(p->db, zSql, 
34c40 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
34c50 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
34c60 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 20 3d 20  (zSql);.    i = 
34c70 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 73 71  0;.    while( sq
34c80 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
34c90 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
34ca0 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4c 61 62  .      char zLab
34cb0 65 6c 5b 32 30 5d 3b 0a 20 20 20 20 20 20 63 6f  el[20];.      co
34cc0 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d  nst char *zCol =
34cd0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
34ce0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
34cf0 74 28 70 53 74 6d 74 2c 32 29 3b 0a 20 20 20 20  t(pStmt,2);.    
34d00 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28    i++;.      if(
34d10 20 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20   zCol==0 ){.    
34d20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
34d30 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
34d40 2c 31 29 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20  ,1)==-1 ){.     
34d50 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22 5f 52 4f       zCol = "_RO
34d60 57 49 44 5f 22 3b 0a 20 20 20 20 20 20 20 20 7d  WID_";.        }
34d70 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
34d80 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
34d90 28 73 69 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 2c  (sizeof(zLabel),
34da0 7a 4c 61 62 65 6c 2c 22 65 78 70 72 25 64 22 2c  zLabel,"expr%d",
34db0 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 43  i);.          zC
34dc0 6f 6c 20 3d 20 7a 4c 61 62 65 6c 3b 0a 20 20 20  ol = zLabel;.   
34dd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
34de0 20 20 20 20 20 69 66 28 20 7a 43 6f 6c 6c 69 73       if( zCollis
34df0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
34e00 7a 43 6f 6c 6c 69 73 74 20 3d 20 73 71 6c 69 74  zCollist = sqlit
34e10 65 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25 77  e3_mprintf("\"%w
34e20 5c 22 22 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20  \"", zCol);.    
34e30 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
34e40 20 7a 43 6f 6c 6c 69 73 74 20 3d 20 73 71 6c 69   zCollist = sqli
34e50 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 2c  te3_mprintf("%z,
34e60 5c 22 25 77 5c 22 22 2c 20 7a 43 6f 6c 6c 69 73  \"%w\"", zCollis
34e70 74 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20  t, zCol);.      
34e80 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
34e90 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
34ea0 6d 74 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20  mt);.    zSql = 
34eb0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
34ec0 0a 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41  .          "CREA
34ed0 54 45 20 54 41 42 4c 45 20 5c 22 25 77 5c 22 28  TE TABLE \"%w\"(
34ee0 25 73 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 25  %s,PRIMARY KEY(%
34ef0 73 29 29 57 49 54 48 4f 55 54 20 52 4f 57 49 44  s))WITHOUT ROWID
34f00 22 2c 0a 20 20 20 20 20 20 20 20 20 20 61 7a 41  ",.          azA
34f10 72 67 5b 32 5d 2c 20 7a 43 6f 6c 6c 69 73 74 2c  rg[2], zCollist,
34f20 20 7a 43 6f 6c 6c 69 73 74 29 3b 0a 20 20 20 20   zCollist);.    
34f30 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6f  sqlite3_free(zCo
34f40 6c 6c 69 73 74 29 3b 0a 20 20 20 20 72 63 20 3d  llist);.    rc =
34f50 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
34f60 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53  ntrol(SQLITE_TES
34f70 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20  TCTRL_IMPOSTER, 
34f80 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22 2c 20 31  p->db, "main", 1
34f90 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20 69 66 28  , tnum);.    if(
34fa0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
34fb0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  {.      rc = sql
34fc0 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
34fd0 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b   zSql, 0, 0, 0);
34fe0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74  .      sqlite3_t
34ff0 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49  est_control(SQLI
35000 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f  TE_TESTCTRL_IMPO
35010 53 54 45 52 2c 20 70 2d 3e 64 62 2c 20 22 6d 61  STER, p->db, "ma
35020 69 6e 22 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  in", 0, 0);.    
35030 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
35040 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
35050 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 20 69  stderr, "Error i
35060 6e 20 5b 25 73 5d 3a 20 25 73 5c 6e 22 2c 20 7a  n [%s]: %s\n", z
35070 53 71 6c 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  Sql, sqlite3_err
35080 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
35090 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
350a0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
350b0 64 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 7a  dout, "%s;\n", z
350c0 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 72 61  Sql);.        ra
350d0 77 5f 70 72 69 6e 74 66 28 73 74 64 6f 75 74 2c  w_printf(stdout,
350e0 0a 20 20 20 20 20 20 20 20 20 20 20 22 57 41 52  .           "WAR
350f0 4e 49 4e 47 3a 20 77 72 69 74 69 6e 67 20 74 6f  NING: writing to
35100 20 61 6e 20 69 6d 70 6f 73 74 65 72 20 74 61 62   an imposter tab
35110 6c 65 20 77 69 6c 6c 20 63 6f 72 72 75 70 74 20  le will corrupt 
35120 74 68 65 20 69 6e 64 65 78 21 5c 6e 22 0a 20 20  the index!\n".  
35130 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
35140 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
35150 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
35160 65 72 72 2c 20 22 53 51 4c 49 54 45 5f 54 45 53  err, "SQLITE_TES
35170 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 20 72  TCTRL_IMPOSTER r
35180 65 74 75 72 6e 73 20 25 64 5c 6e 22 2c 20 72 63  eturns %d\n", rc
35190 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
351a0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
351b0 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
351c0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
351d0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
351e0 5f 4f 4d 49 54 5f 54 45 53 54 5f 43 4f 4e 54 52  _OMIT_TEST_CONTR
351f0 4f 4c 29 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53  OL) */..#ifdef S
35200 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54  QLITE_ENABLE_IOT
35210 52 41 43 45 0a 20 20 69 66 28 20 63 3d 3d 27 69  RACE.  if( c=='i
35220 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
35230 72 67 5b 30 5d 2c 20 22 69 6f 74 72 61 63 65 22  rg[0], "iotrace"
35240 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53  , n)==0 ){.    S
35250 51 4c 49 54 45 5f 41 50 49 20 65 78 74 65 72 6e  QLITE_API extern
35260 20 76 6f 69 64 20 28 53 51 4c 49 54 45 5f 43 44   void (SQLITE_CD
35270 45 43 4c 20 2a 73 71 6c 69 74 65 33 49 6f 54 72  ECL *sqlite3IoTr
35280 61 63 65 29 28 63 6f 6e 73 74 20 63 68 61 72 2a  ace)(const char*
35290 2c 20 2e 2e 2e 29 3b 0a 20 20 20 20 69 66 28 20  , ...);.    if( 
352a0 69 6f 74 72 61 63 65 20 26 26 20 69 6f 74 72 61  iotrace && iotra
352b0 63 65 21 3d 73 74 64 6f 75 74 20 29 20 66 63 6c  ce!=stdout ) fcl
352c0 6f 73 65 28 69 6f 74 72 61 63 65 29 3b 0a 20 20  ose(iotrace);.  
352d0 20 20 69 6f 74 72 61 63 65 20 3d 20 30 3b 0a 20    iotrace = 0;. 
352e0 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20 29 7b     if( nArg<2 ){
352f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f  .      sqlite3Io
35300 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 7d  Trace = 0;.    }
35310 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
35320 61 7a 41 72 67 5b 31 5d 2c 20 22 2d 22 29 3d 3d  azArg[1], "-")==
35330 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
35340 65 33 49 6f 54 72 61 63 65 20 3d 20 69 6f 74 72  e3IoTrace = iotr
35350 61 63 65 50 72 69 6e 74 66 3b 0a 20 20 20 20 20  acePrintf;.     
35360 20 69 6f 74 72 61 63 65 20 3d 20 73 74 64 6f 75   iotrace = stdou
35370 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  t;.    }else{.  
35380 20 20 20 20 69 6f 74 72 61 63 65 20 3d 20 66 6f      iotrace = fo
35390 70 65 6e 28 61 7a 41 72 67 5b 31 5d 2c 20 22 77  pen(azArg[1], "w
353a0 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6f  ");.      if( io
353b0 74 72 61 63 65 3d 3d 30 20 29 7b 0a 20 20 20 20  trace==0 ){.    
353c0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
353d0 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
353e0 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73  cannot open \"%s
353f0 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29  \"\n", azArg[1])
35400 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
35410 33 49 6f 54 72 61 63 65 20 3d 20 30 3b 0a 20 20  3IoTrace = 0;.  
35420 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
35430 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
35440 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63     sqlite3IoTrac
35450 65 20 3d 20 69 6f 74 72 61 63 65 50 72 69 6e 74  e = iotracePrint
35460 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  f;.      }.    }
35470 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
35480 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 26 26  .  if( c=='l' &&
35490 20 6e 3e 3d 35 20 26 26 20 73 74 72 6e 63 6d 70   n>=5 && strncmp
354a0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 69 6d 69  (azArg[0], "limi
354b0 74 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ts", n)==0 ){.  
354c0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
354d0 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20 20 63  truct {.       c
354e0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69 6d 69  onst char *zLimi
354f0 74 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65  tName;   /* Name
35500 20 6f 66 20 61 20 6c 69 6d 69 74 20 2a 2f 0a 20   of a limit */. 
35510 20 20 20 20 20 20 69 6e 74 20 6c 69 6d 69 74 43        int limitC
35520 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
35530 2f 2a 20 49 6e 74 65 67 65 72 20 63 6f 64 65 20  /* Integer code 
35540 66 6f 72 20 74 68 61 74 20 6c 69 6d 69 74 20 2a  for that limit *
35550 2f 0a 20 20 20 20 7d 20 61 4c 69 6d 69 74 5b 5d  /.    } aLimit[]
35560 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 6c 65   = {.      { "le
35570 6e 67 74 68 22 2c 20 20 20 20 20 20 20 20 20 20  ngth",          
35580 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
35590 49 54 5f 4c 45 4e 47 54 48 20 20 20 20 20 20 20  IT_LENGTH       
355a0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
355b0 20 20 20 20 20 20 7b 20 22 73 71 6c 5f 6c 65 6e        { "sql_len
355c0 67 74 68 22 2c 20 20 20 20 20 20 20 20 20 20 20  gth",           
355d0 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51   SQLITE_LIMIT_SQ
355e0 4c 5f 4c 45 4e 47 54 48 20 20 20 20 20 20 20 20  L_LENGTH        
355f0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
35600 20 7b 20 22 63 6f 6c 75 6d 6e 22 2c 20 20 20 20   { "column",    
35610 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
35620 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 20  TE_LIMIT_COLUMN 
35630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35640 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 65     },.      { "e
35650 78 70 72 5f 64 65 70 74 68 22 2c 20 20 20 20 20  xpr_depth",     
35660 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
35670 4d 49 54 5f 45 58 50 52 5f 44 45 50 54 48 20 20  MIT_EXPR_DEPTH  
35680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c                },
35690 0a 20 20 20 20 20 20 7b 20 22 63 6f 6d 70 6f 75  .      { "compou
356a0 6e 64 5f 73 65 6c 65 63 74 22 2c 20 20 20 20 20  nd_select",     
356b0 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43    SQLITE_LIMIT_C
356c0 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43 54 20 20  OMPOUND_SELECT  
356d0 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
356e0 20 20 7b 20 22 76 64 62 65 5f 6f 70 22 2c 20 20    { "vdbe_op",  
356f0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
35700 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f  ITE_LIMIT_VDBE_O
35710 50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  P               
35720 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
35730 66 75 6e 63 74 69 6f 6e 5f 61 72 67 22 2c 20 20  function_arg",  
35740 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
35750 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52  IMIT_FUNCTION_AR
35760 47 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  G              }
35770 2c 0a 20 20 20 20 20 20 7b 20 22 61 74 74 61 63  ,.      { "attac
35780 68 65 64 22 2c 20 20 20 20 20 20 20 20 20 20 20  hed",           
35790 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
357a0 41 54 54 41 43 48 45 44 20 20 20 20 20 20 20 20  ATTACHED        
357b0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
357c0 20 20 20 7b 20 22 6c 69 6b 65 5f 70 61 74 74 65     { "like_patte
357d0 72 6e 5f 6c 65 6e 67 74 68 22 2c 20 20 20 53 51  rn_length",   SQ
357e0 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f  LITE_LIMIT_LIKE_
357f0 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 20  PATTERN_LENGTH  
35800 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
35810 22 76 61 72 69 61 62 6c 65 5f 6e 75 6d 62 65 72  "variable_number
35820 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ",       SQLITE_
35830 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e  LIMIT_VARIABLE_N
35840 55 4d 42 45 52 20 20 20 20 20 20 20 20 20 20 20  UMBER           
35850 7d 2c 0a 20 20 20 20 20 20 7b 20 22 74 72 69 67  },.      { "trig
35860 67 65 72 5f 64 65 70 74 68 22 2c 20 20 20 20 20  ger_depth",     
35870 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
35880 5f 54 52 49 47 47 45 52 5f 44 45 50 54 48 20 20  _TRIGGER_DEPTH  
35890 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
358a0 20 20 20 20 7b 20 22 77 6f 72 6b 65 72 5f 74 68      { "worker_th
358b0 72 65 61 64 73 22 2c 20 20 20 20 20 20 20 20 53  reads",        S
358c0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b  QLITE_LIMIT_WORK
358d0 45 52 5f 54 48 52 45 41 44 53 20 20 20 20 20 20  ER_THREADS      
358e0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a        },.    };.
358f0 20 20 20 20 69 6e 74 20 69 2c 20 6e 32 3b 0a 20      int i, n2;. 
35900 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
35910 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  ;.    if( nArg==
35920 31 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  1 ){.      for(i
35930 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
35940 61 4c 69 6d 69 74 29 3b 20 69 2b 2b 29 7b 0a 20  aLimit); i++){. 
35950 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25         printf("%
35960 32 30 73 20 25 64 5c 6e 22 2c 20 61 4c 69 6d 69  20s %d\n", aLimi
35970 74 5b 69 5d 2e 7a 4c 69 6d 69 74 4e 61 6d 65 2c  t[i].zLimitName,
35980 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
35990 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 70 2d  sqlite3_limit(p-
359a0 3e 64 62 2c 20 61 4c 69 6d 69 74 5b 69 5d 2e 6c  >db, aLimit[i].l
359b0 69 6d 69 74 43 6f 64 65 2c 20 2d 31 29 29 3b 0a  imitCode, -1));.
359c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
359d0 65 20 69 66 28 20 6e 41 72 67 3e 33 20 29 7b 0a  e if( nArg>3 ){.
359e0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
359f0 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
35a00 20 2e 6c 69 6d 69 74 20 4e 41 4d 45 20 3f 4e 45   .limit NAME ?NE
35a10 57 2d 56 41 4c 55 45 3f 5c 6e 22 29 3b 0a 20 20  W-VALUE?\n");.  
35a20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
35a30 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
35a40 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 65  and_exit;.    }e
35a50 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  lse{.      int i
35a60 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20  Limit = -1;.    
35a70 20 20 6e 32 20 3d 20 73 74 72 6c 65 6e 33 30 28    n2 = strlen30(
35a80 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20  azArg[1]);.     
35a90 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
35aa0 79 53 69 7a 65 28 61 4c 69 6d 69 74 29 3b 20 69  ySize(aLimit); i
35ab0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
35ac0 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
35ad0 70 28 61 4c 69 6d 69 74 5b 69 5d 2e 7a 4c 69 6d  p(aLimit[i].zLim
35ae0 69 74 4e 61 6d 65 2c 20 61 7a 41 72 67 5b 31 5d  itName, azArg[1]
35af0 2c 20 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , n2)==0 ){.    
35b00 20 20 20 20 20 20 69 66 28 20 69 4c 69 6d 69 74        if( iLimit
35b10 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
35b20 20 20 69 4c 69 6d 69 74 20 3d 20 69 3b 0a 20 20    iLimit = i;.  
35b30 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
35b40 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f             utf8_
35b50 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
35b60 61 6d 62 69 67 75 6f 75 73 20 6c 69 6d 69 74 3a  ambiguous limit:
35b70 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72   \"%s\"\n", azAr
35b80 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  g[1]);.         
35b90 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
35ba0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61         goto meta
35bb0 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
35bc0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
35bd0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
35be0 20 20 20 69 66 28 20 69 4c 69 6d 69 74 3c 30 20     if( iLimit<0 
35bf0 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
35c00 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
35c10 75 6e 6b 6e 6f 77 6e 20 6c 69 6d 69 74 3a 20 5c  unknown limit: \
35c20 22 25 73 5c 22 5c 6e 22 0a 20 20 20 20 20 20 20  "%s\"\n".       
35c30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c40 20 22 65 6e 74 65 72 20 5c 22 2e 6c 69 6d 69 74   "enter \".limit
35c50 73 5c 22 20 77 69 74 68 20 6e 6f 20 61 72 67 75  s\" with no argu
35c60 6d 65 6e 74 73 20 66 6f 72 20 61 20 6c 69 73 74  ments for a list
35c70 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  .\n",.          
35c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
35c90 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
35ca0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
35cb0 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
35cc0 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  and_exit;.      
35cd0 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67  }.      if( nArg
35ce0 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==3 ){.        s
35cf0 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 70 2d 3e  qlite3_limit(p->
35d00 64 62 2c 20 61 4c 69 6d 69 74 5b 69 4c 69 6d 69  db, aLimit[iLimi
35d10 74 5d 2e 6c 69 6d 69 74 43 6f 64 65 2c 0a 20 20  t].limitCode,.  
35d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35d30 20 20 20 20 28 69 6e 74 29 69 6e 74 65 67 65 72      (int)integer
35d40 56 61 6c 75 65 28 61 7a 41 72 67 5b 32 5d 29 29  Value(azArg[2]))
35d50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
35d60 70 72 69 6e 74 66 28 22 25 32 30 73 20 25 64 5c  printf("%20s %d\
35d70 6e 22 2c 20 61 4c 69 6d 69 74 5b 69 4c 69 6d 69  n", aLimit[iLimi
35d80 74 5d 2e 7a 4c 69 6d 69 74 4e 61 6d 65 2c 0a 20  t].zLimitName,. 
35d90 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
35da0 74 65 33 5f 6c 69 6d 69 74 28 70 2d 3e 64 62 2c  te3_limit(p->db,
35db0 20 61 4c 69 6d 69 74 5b 69 4c 69 6d 69 74 5d 2e   aLimit[iLimit].
35dc0 6c 69 6d 69 74 43 6f 64 65 2c 20 2d 31 29 29 3b  limitCode, -1));
35dd0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
35de0 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 26 26 20    if( c=='l' && 
35df0 6e 3e 32 20 26 26 20 73 74 72 6e 63 6d 70 28 61  n>2 && strncmp(a
35e00 7a 41 72 67 5b 30 5d 2c 20 22 6c 69 6e 74 22 2c  zArg[0], "lint",
35e10 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70   n)==0 ){.    op
35e20 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
35e30 20 6c 69 6e 74 44 6f 74 43 6f 6d 6d 61 6e 64 28   lintDotCommand(
35e40 70 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b  p, azArg, nArg);
35e50 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65  .  }else..#ifnde
35e60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
35e70 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 69  AD_EXTENSION.  i
35e80 66 28 20 63 3d 3d 27 6c 27 20 26 26 20 73 74 72  f( c=='l' && str
35e90 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
35ea0 6c 6f 61 64 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  load", n)==0 ){.
35eb0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
35ec0 7a 46 69 6c 65 2c 20 2a 7a 50 72 6f 63 3b 0a 20  zFile, *zProc;. 
35ed0 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67     char *zErrMsg
35ee0 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 41   = 0;.    if( nA
35ef0 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 61  rg<2 ){.      ra
35f00 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
35f10 20 22 55 73 61 67 65 3a 20 2e 6c 6f 61 64 20 46   "Usage: .load F
35f20 49 4c 45 20 3f 45 4e 54 52 59 50 4f 49 4e 54 3f  ILE ?ENTRYPOINT?
35f30 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
35f40 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d   1;.      goto m
35f50 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
35f60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46 69 6c  ;.    }.    zFil
35f70 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20  e = azArg[1];.  
35f80 20 20 7a 50 72 6f 63 20 3d 20 6e 41 72 67 3e 3d    zProc = nArg>=
35f90 33 20 3f 20 61 7a 41 72 67 5b 32 5d 20 3a 20 30  3 ? azArg[2] : 0
35fa0 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  ;.    open_db(p,
35fb0 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   0);.    rc = sq
35fc0 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e  lite3_load_exten
35fd0 73 69 6f 6e 28 70 2d 3e 64 62 2c 20 7a 46 69 6c  sion(p->db, zFil
35fe0 65 2c 20 7a 50 72 6f 63 2c 20 26 7a 45 72 72 4d  e, zProc, &zErrM
35ff0 73 67 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21  sg);.    if( rc!
36000 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
36010 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
36020 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
36030 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b  %s\n", zErrMsg);
36040 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
36050 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
36060 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
36070 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  }.  }else.#endif
36080 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 26  ..  if( c=='l' &
36090 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
360a0 30 5d 2c 20 22 6c 6f 67 22 2c 20 6e 29 3d 3d 30  0], "log", n)==0
360b0 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
360c0 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77  !=2 ){.      raw
360d0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
360e0 22 55 73 61 67 65 3a 20 2e 6c 6f 67 20 46 49 4c  "Usage: .log FIL
360f0 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20 20 20 20  ENAME\n");.     
36100 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c   rc = 1;.    }el
36110 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  se{.      const 
36120 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 61 7a  char *zFile = az
36130 41 72 67 5b 31 5d 3b 0a 20 20 20 20 20 20 6f 75  Arg[1];.      ou
36140 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65 28  tput_file_close(
36150 70 2d 3e 70 4c 6f 67 29 3b 0a 20 20 20 20 20 20  p->pLog);.      
36160 70 2d 3e 70 4c 6f 67 20 3d 20 6f 75 74 70 75 74  p->pLog = output
36170 5f 66 69 6c 65 5f 6f 70 65 6e 28 7a 46 69 6c 65  _file_open(zFile
36180 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  , 0);.    }.  }e
36190 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6d  lse..  if( c=='m
361a0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
361b0 72 67 5b 30 5d 2c 20 22 6d 6f 64 65 22 2c 20 6e  rg[0], "mode", n
361c0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73  )==0 ){.    cons
361d0 74 20 63 68 61 72 20 2a 7a 4d 6f 64 65 20 3d 20  t char *zMode = 
361e0 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72 67 5b  nArg>=2 ? azArg[
361f0 31 5d 20 3a 20 22 22 3b 0a 20 20 20 20 69 6e 74  1] : "";.    int
36200 20 6e 32 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a   n2 = strlen30(z
36210 4d 6f 64 65 29 3b 0a 20 20 20 20 69 6e 74 20 63  Mode);.    int c
36220 32 20 3d 20 7a 4d 6f 64 65 5b 30 5d 3b 0a 20 20  2 = zMode[0];.  
36230 20 20 69 66 28 20 63 32 3d 3d 27 6c 27 20 26 26    if( c2=='l' &&
36240 20 6e 32 3e 32 20 26 26 20 73 74 72 6e 63 6d 70   n2>2 && strncmp
36250 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 69 6e 65 73  (azArg[1],"lines
36260 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ",n2)==0 ){.    
36270 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45    p->mode = MODE
36280 5f 4c 69 6e 65 3b 0a 20 20 20 20 20 20 73 71 6c  _Line;.      sql
36290 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
362a0 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72  zeof(p->rowSepar
362b0 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70  ator), p->rowSep
362c0 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29  arator, SEP_Row)
362d0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
362e0 63 32 3d 3d 27 63 27 20 26 26 20 73 74 72 6e 63  c2=='c' && strnc
362f0 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 63 6f 6c  mp(azArg[1],"col
36300 75 6d 6e 73 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a  umns",n2)==0 ){.
36310 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20        p->mode = 
36320 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20  MODE_Column;.   
36330 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
36340 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f  ntf(sizeof(p->ro
36350 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e  wSeparator), p->
36360 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45  rowSeparator, SE
36370 50 5f 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73  P_Row);.    }els
36380 65 20 69 66 28 20 63 32 3d 3d 27 6c 27 20 26 26  e if( c2=='l' &&
36390 20 6e 32 3e 32 20 26 26 20 73 74 72 6e 63 6d 70   n2>2 && strncmp
363a0 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 69 73 74 22  (azArg[1],"list"
363b0 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,n2)==0 ){.     
363c0 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
363d0 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  List;.      sqli
363e0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
363f0 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61  eof(p->colSepara
36400 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61  tor), p->colSepa
36410 72 61 74 6f 72 2c 20 53 45 50 5f 43 6f 6c 75 6d  rator, SEP_Colum
36420 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
36430 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
36440 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  f(p->rowSeparato
36450 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  r), p->rowSepara
36460 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20  tor, SEP_Row);. 
36470 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d     }else if( c2=
36480 3d 27 68 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='h' && strncmp(
36490 61 7a 41 72 67 5b 31 5d 2c 22 68 74 6d 6c 22 2c  azArg[1],"html",
364a0 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n2)==0 ){.      
364b0 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 48  p->mode = MODE_H
364c0 74 6d 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  tml;.    }else i
364d0 66 28 20 63 32 3d 3d 27 74 27 20 26 26 20 73 74  f( c2=='t' && st
364e0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  rncmp(azArg[1],"
364f0 74 63 6c 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20  tcl",n2)==0 ){. 
36500 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d       p->mode = M
36510 4f 44 45 5f 54 63 6c 3b 0a 20 20 20 20 20 20 73  ODE_Tcl;.      s
36520 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
36530 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70  sizeof(p->colSep
36540 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53  arator), p->colS
36550 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 53 70  eparator, SEP_Sp
36560 61 63 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ace);.      sqli
36570 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
36580 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  eof(p->rowSepara
36590 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61  tor), p->rowSepa
365a0 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b  rator, SEP_Row);
365b0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
365c0 32 3d 3d 27 63 27 20 26 26 20 73 74 72 6e 63 6d  2=='c' && strncm
365d0 70 28 61 7a 41 72 67 5b 31 5d 2c 22 63 73 76 22  p(azArg[1],"csv"
365e0 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,n2)==0 ){.     
365f0 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
36600 43 73 76 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Csv;.      sqlit
36610 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
36620 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  of(p->colSeparat
36630 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  or), p->colSepar
36640 61 74 6f 72 2c 20 53 45 50 5f 43 6f 6d 6d 61 29  ator, SEP_Comma)
36650 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
36660 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
36670 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
36680 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
36690 72 2c 20 53 45 50 5f 43 72 4c 66 29 3b 0a 20 20  r, SEP_CrLf);.  
366a0 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d    }else if( c2==
366b0 27 74 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  't' && strncmp(a
366c0 7a 41 72 67 5b 31 5d 2c 22 74 61 62 73 22 2c 6e  zArg[1],"tabs",n
366d0 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  2)==0 ){.      p
366e0 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69  ->mode = MODE_Li
366f0 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  st;.      sqlite
36700 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
36710 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  f(p->colSeparato
36720 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61  r), p->colSepara
36730 74 6f 72 2c 20 53 45 50 5f 54 61 62 29 3b 0a 20  tor, SEP_Tab);. 
36740 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d     }else if( c2=
36750 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='i' && strncmp(
36760 61 7a 41 72 67 5b 31 5d 2c 22 69 6e 73 65 72 74  azArg[1],"insert
36770 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ",n2)==0 ){.    
36780 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45    p->mode = MODE
36790 5f 49 6e 73 65 72 74 3b 0a 20 20 20 20 20 20 73  _Insert;.      s
367a0 65 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 70 2c  et_table_name(p,
367b0 20 6e 41 72 67 3e 3d 33 20 3f 20 61 7a 41 72 67   nArg>=3 ? azArg
367c0 5b 32 5d 20 3a 20 22 74 61 62 6c 65 22 29 3b 0a  [2] : "table");.
367d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32      }else if( c2
367e0 3d 3d 27 71 27 20 26 26 20 73 74 72 6e 63 6d 70  =='q' && strncmp
367f0 28 61 7a 41 72 67 5b 31 5d 2c 22 71 75 6f 74 65  (azArg[1],"quote
36800 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ",n2)==0 ){.    
36810 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45    p->mode = MODE
36820 5f 51 75 6f 74 65 3b 0a 20 20 20 20 7d 65 6c 73  _Quote;.    }els
36830 65 20 69 66 28 20 63 32 3d 3d 27 61 27 20 26 26  e if( c2=='a' &&
36840 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31   strncmp(azArg[1
36850 5d 2c 22 61 73 63 69 69 22 2c 6e 32 29 3d 3d 30  ],"ascii",n2)==0
36860 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64   ){.      p->mod
36870 65 20 3d 20 4d 4f 44 45 5f 41 73 63 69 69 3b 0a  e = MODE_Ascii;.
36880 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
36890 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
368a0 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20  >colSeparator), 
368b0 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c  p->colSeparator,
368c0 20 53 45 50 5f 55 6e 69 74 29 3b 0a 20 20 20 20   SEP_Unit);.    
368d0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
368e0 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77  tf(sizeof(p->row
368f0 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72  Separator), p->r
36900 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50  owSeparator, SEP
36910 5f 52 65 63 6f 72 64 29 3b 0a 20 20 20 20 7d 65  _Record);.    }e
36920 6c 73 65 20 69 66 28 20 6e 41 72 67 3d 3d 31 20  lse if( nArg==1 
36930 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
36940 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 63 75 72  ntf(p->out, "cur
36950 72 65 6e 74 20 6f 75 74 70 75 74 20 6d 6f 64 65  rent output mode
36960 3a 20 25 73 5c 6e 22 2c 20 6d 6f 64 65 44 65 73  : %s\n", modeDes
36970 63 72 5b 70 2d 3e 6d 6f 64 65 5d 29 3b 0a 20 20  cr[p->mode]);.  
36980 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
36990 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
369a0 2c 20 22 45 72 72 6f 72 3a 20 6d 6f 64 65 20 73  , "Error: mode s
369b0 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a  hould be one of:
369c0 20 22 0a 20 20 20 20 20 20 20 20 20 22 61 73 63   ".         "asc
369d0 69 69 20 63 6f 6c 75 6d 6e 20 63 73 76 20 68 74  ii column csv ht
369e0 6d 6c 20 69 6e 73 65 72 74 20 6c 69 6e 65 20 6c  ml insert line l
369f0 69 73 74 20 71 75 6f 74 65 20 74 61 62 73 20 74  ist quote tabs t
36a00 63 6c 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  cl\n");.      rc
36a10 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
36a20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f  p->cMode = p->mo
36a30 64 65 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69  de;.  }else..  i
36a40 66 28 20 63 3d 3d 27 6e 27 20 26 26 20 73 74 72  f( c=='n' && str
36a50 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
36a60 6e 75 6c 6c 76 61 6c 75 65 22 2c 20 6e 29 3d 3d  nullvalue", n)==
36a70 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  0 ){.    if( nAr
36a80 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 71  g==2 ){.      sq
36a90 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
36aa0 69 7a 65 6f 66 28 70 2d 3e 6e 75 6c 6c 56 61 6c  izeof(p->nullVal
36ab0 75 65 29 2c 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75  ue), p->nullValu
36ac0 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
36ad0 20 20 20 20 20 20 20 20 20 20 22 25 2e 2a 73 22            "%.*s"
36ae0 2c 20 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65  , (int)ArraySize
36af0 28 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 2d 31  (p->nullValue)-1
36b00 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  , azArg[1]);.   
36b10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
36b20 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
36b30 20 22 55 73 61 67 65 3a 20 2e 6e 75 6c 6c 76 61   "Usage: .nullva
36b40 6c 75 65 20 53 54 52 49 4e 47 5c 6e 22 29 3b 0a  lue STRING\n");.
36b50 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
36b60 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
36b70 66 28 20 63 3d 3d 27 6f 27 20 26 26 20 73 74 72  f( c=='o' && str
36b80 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
36b90 6f 70 65 6e 22 2c 20 6e 29 3d 3d 30 20 26 26 20  open", n)==0 && 
36ba0 6e 3e 3d 32 20 29 7b 0a 20 20 20 20 63 68 61 72  n>=2 ){.    char
36bb0 20 2a 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 3b 20   *zNewFilename; 
36bc0 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
36bd0 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f  database file to
36be0 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74   open */.    int
36bf0 20 69 4e 61 6d 65 20 3d 20 31 3b 20 20 20 20 20   iName = 1;     
36c00 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e 20 61 7a    /* Index in az
36c10 41 72 67 5b 5d 20 6f 66 20 74 68 65 20 66 69 6c  Arg[] of the fil
36c20 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 69 6e 74  ename */.    int
36c30 20 6e 65 77 46 6c 61 67 20 3d 20 30 3b 20 20 20   newFlag = 0;   
36c40 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 65 6c    /* True to del
36c50 65 74 65 20 66 69 6c 65 20 62 65 66 6f 72 65 20  ete file before 
36c60 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20 20 20 2f  opening */.    /
36c70 2a 20 43 6c 6f 73 65 20 74 68 65 20 65 78 69 73  * Close the exis
36c80 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 2a 2f  ting database */
36c90 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 63 6c 6f  .    session_clo
36ca0 73 65 5f 61 6c 6c 28 70 29 3b 0a 20 20 20 20 63  se_all(p);.    c
36cb0 6c 6f 73 65 5f 64 62 28 70 2d 3e 64 62 29 3b 0a  lose_db(p->db);.
36cc0 20 20 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20      p->db = 0;. 
36cd0 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d     p->zDbFilenam
36ce0 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  e = 0;.    sqlit
36cf0 65 33 5f 66 72 65 65 28 70 2d 3e 7a 46 72 65 65  e3_free(p->zFree
36d00 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20 20 20 70 2d  OnClose);.    p-
36d10 3e 7a 46 72 65 65 4f 6e 43 6c 6f 73 65 20 3d 20  >zFreeOnClose = 
36d20 30 3b 0a 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f  0;.    p->openMo
36d30 64 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  de = SHELL_OPEN_
36d40 55 4e 53 50 45 43 3b 0a 20 20 20 20 70 2d 3e 73  UNSPEC;.    p->s
36d50 7a 4d 61 78 20 3d 20 30 3b 0a 20 20 20 20 2f 2a  zMax = 0;.    /*
36d60 20 43 68 65 63 6b 20 66 6f 72 20 63 6f 6d 6d 61   Check for comma
36d70 6e 64 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74  nd-line argument
36d80 73 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 4e 61  s */.    for(iNa
36d90 6d 65 3d 31 3b 20 69 4e 61 6d 65 3c 6e 41 72 67  me=1; iName<nArg
36da0 20 26 26 20 61 7a 41 72 67 5b 69 4e 61 6d 65 5d   && azArg[iName]
36db0 5b 30 5d 3d 3d 27 2d 27 3b 20 69 4e 61 6d 65 2b  [0]=='-'; iName+
36dc0 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  +){.      const 
36dd0 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b  char *z = azArg[
36de0 69 4e 61 6d 65 5d 3b 0a 20 20 20 20 20 20 69 66  iName];.      if
36df0 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 7a 2c  ( optionMatch(z,
36e00 22 6e 65 77 22 29 20 29 7b 0a 20 20 20 20 20 20  "new") ){.      
36e10 20 20 6e 65 77 46 6c 61 67 20 3d 20 31 3b 0a 23    newFlag = 1;.#
36e20 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 56  ifdef SQLITE_HAV
36e30 45 5f 5a 4c 49 42 0a 20 20 20 20 20 20 7d 65 6c  E_ZLIB.      }el
36e40 73 65 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74  se if( optionMat
36e50 63 68 28 7a 2c 20 22 7a 69 70 22 29 20 29 7b 0a  ch(z, "zip") ){.
36e60 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e 4d          p->openM
36e70 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e  ode = SHELL_OPEN
36e80 5f 5a 49 50 46 49 4c 45 3b 0a 23 65 6e 64 69 66  _ZIPFILE;.#endif
36e90 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
36ea0 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 7a 2c 20   optionMatch(z, 
36eb0 22 61 70 70 65 6e 64 22 29 20 29 7b 0a 20 20 20  "append") ){.   
36ec0 20 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65       p->openMode
36ed0 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50   = SHELL_OPEN_AP
36ee0 50 45 4e 44 56 46 53 3b 0a 20 20 20 20 20 20 7d  PENDVFS;.      }
36ef0 65 6c 73 65 20 69 66 28 20 6f 70 74 69 6f 6e 4d  else if( optionM
36f00 61 74 63 68 28 7a 2c 20 22 72 65 61 64 6f 6e 6c  atch(z, "readonl
36f10 79 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  y") ){.        p
36f20 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20 53 48 45  ->openMode = SHE
36f30 4c 4c 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  LL_OPEN_READONLY
36f40 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
36f50 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 7a 2c  ( optionMatch(z,
36f60 20 22 72 65 75 73 65 73 63 68 65 6d 61 22 29 20   "reuseschema") 
36f70 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 70  ){.        p->op
36f80 65 6e 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f  enMode = SHELL_O
36f90 50 45 4e 5f 52 45 55 53 45 53 43 48 45 4d 41 3b  PEN_REUSESCHEMA;
36fa0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
36fb0 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 23 69   z[0]=='-' ){.#i
36fc0 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  fdef SQLITE_ENAB
36fd0 4c 45 5f 44 45 53 45 52 49 41 4c 49 5a 45 0a 20  LE_DESERIALIZE. 
36fe0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f       }else if( o
36ff0 70 74 69 6f 6e 4d 61 74 63 68 28 7a 2c 20 22 64  ptionMatch(z, "d
37000 65 73 65 72 69 61 6c 69 7a 65 22 29 20 29 7b 0a  eserialize") ){.
37010 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e 4d          p->openM
37020 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e  ode = SHELL_OPEN
37030 5f 44 45 53 45 52 49 41 4c 49 5a 45 3b 0a 20 20  _DESERIALIZE;.  
37040 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70      }else if( op
37050 74 69 6f 6e 4d 61 74 63 68 28 7a 2c 20 22 68 65  tionMatch(z, "he
37060 78 64 62 22 29 20 29 7b 0a 20 20 20 20 20 20 20  xdb") ){.       
37070 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20 53   p->openMode = S
37080 48 45 4c 4c 5f 4f 50 45 4e 5f 48 45 58 44 42 3b  HELL_OPEN_HEXDB;
37090 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
370a0 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 7a 2c 20   optionMatch(z, 
370b0 22 6d 61 78 73 69 7a 65 22 29 20 26 26 20 69 4e  "maxsize") && iN
370c0 61 6d 65 2b 31 3c 6e 41 72 67 20 29 7b 0a 20 20  ame+1<nArg ){.  
370d0 20 20 20 20 20 20 70 2d 3e 73 7a 4d 61 78 20 3d        p->szMax =
370e0 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a   integerValue(az
370f0 41 72 67 5b 2b 2b 69 4e 61 6d 65 5d 29 3b 0a 23  Arg[++iName]);.#
37100 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
37110 45 4e 41 42 4c 45 5f 44 45 53 45 52 49 41 4c 49  ENABLE_DESERIALI
37120 5a 45 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73  ZE */.      }els
37130 65 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20  e if( z[0]=='-' 
37140 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
37150 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
37160 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20  unknown option: 
37170 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20  %s\n", z);.     
37180 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
37190 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
371a0 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20  mand_exit;.     
371b0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20   }.    }.    /* 
371c0 49 66 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 73  If a filename is
371d0 20 73 70 65 63 69 66 69 65 64 2c 20 74 72 79 20   specified, try 
371e0 74 6f 20 6f 70 65 6e 20 69 74 20 66 69 72 73 74  to open it first
371f0 20 2a 2f 0a 20 20 20 20 7a 4e 65 77 46 69 6c 65   */.    zNewFile
37200 6e 61 6d 65 20 3d 20 6e 41 72 67 3e 69 4e 61 6d  name = nArg>iNam
37210 65 20 3f 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e ? sqlite3_mpri
37220 6e 74 66 28 22 25 73 22 2c 20 61 7a 41 72 67 5b  ntf("%s", azArg[
37230 69 4e 61 6d 65 5d 29 20 3a 20 30 3b 0a 20 20 20  iName]) : 0;.   
37240 20 69 66 28 20 7a 4e 65 77 46 69 6c 65 6e 61 6d   if( zNewFilenam
37250 65 20 7c 7c 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65  e || p->openMode
37260 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 48 45 58  ==SHELL_OPEN_HEX
37270 44 42 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  DB ){.      if( 
37280 6e 65 77 46 6c 61 67 20 29 20 73 68 65 6c 6c 44  newFlag ) shellD
37290 65 6c 65 74 65 46 69 6c 65 28 7a 4e 65 77 46 69  eleteFile(zNewFi
372a0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70  lename);.      p
372b0 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d 20  ->zDbFilename = 
372c0 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 3b 0a 20 20  zNewFilename;.  
372d0 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 4f      open_db(p, O
372e0 50 45 4e 5f 44 42 5f 4b 45 45 50 41 4c 49 56 45  PEN_DB_KEEPALIVE
372f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
37300 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  db==0 ){.       
37310 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
37320 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  err, "Error: can
37330 6e 6f 74 20 6f 70 65 6e 20 27 25 73 27 5c 6e 22  not open '%s'\n"
37340 2c 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 29 3b  , zNewFilename);
37350 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
37360 5f 66 72 65 65 28 7a 4e 65 77 46 69 6c 65 6e 61  _free(zNewFilena
37370 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  me);.      }else
37380 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 46 72  {.        p->zFr
37390 65 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 4e 65 77  eeOnClose = zNew
373a0 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20  Filename;.      
373b0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
373c0 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20  p->db==0 ){.    
373d0 20 20 2f 2a 20 41 73 20 61 20 66 61 6c 6c 2d 62    /* As a fall-b
373e0 61 63 6b 20 6f 70 65 6e 20 61 20 54 45 4d 50 20  ack open a TEMP 
373f0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20  database */.    
37400 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65    p->zDbFilename
37410 20 3d 20 30 3b 0a 20 20 20 20 20 20 6f 70 65 6e   = 0;.      open
37420 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d  _db(p, 0);.    }
37430 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
37440 28 63 3d 3d 27 6f 27 0a 20 20 20 20 20 20 20 20  (c=='o'.        
37450 26 26 20 28 73 74 72 6e 63 6d 70 28 61 7a 41 72  && (strncmp(azAr
37460 67 5b 30 5d 2c 20 22 6f 75 74 70 75 74 22 2c 20  g[0], "output", 
37470 6e 29 3d 3d 30 7c 7c 73 74 72 6e 63 6d 70 28 61  n)==0||strncmp(a
37480 7a 41 72 67 5b 30 5d 2c 20 22 6f 6e 63 65 22 2c  zArg[0], "once",
37490 20 6e 29 3d 3d 30 29 29 0a 20 20 20 7c 7c 20 28   n)==0)).   || (
374a0 63 3d 3d 27 65 27 20 26 26 20 6e 3d 3d 35 20 26  c=='e' && n==5 &
374b0 26 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 30  & strcmp(azArg[0
374c0 5d 2c 22 65 78 63 65 6c 22 29 3d 3d 30 29 0a 20  ],"excel")==0). 
374d0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
374e0 61 72 20 2a 7a 46 69 6c 65 20 3d 20 6e 41 72 67  ar *zFile = nArg
374f0 3e 3d 32 20 3f 20 61 7a 41 72 67 5b 31 5d 20 3a  >=2 ? azArg[1] :
37500 20 22 73 74 64 6f 75 74 22 3b 0a 20 20 20 20 69   "stdout";.    i
37510 6e 74 20 62 54 78 74 4d 6f 64 65 20 3d 20 30 3b  nt bTxtMode = 0;
37520 0a 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b 30  .    if( azArg[0
37530 5d 5b 30 5d 3d 3d 27 65 27 20 29 7b 0a 20 20 20  ][0]=='e' ){.   
37540 20 20 20 2f 2a 20 54 72 61 6e 73 66 6f 72 6d 20     /* Transform 
37550 74 68 65 20 22 2e 65 78 63 65 6c 22 20 63 6f 6d  the ".excel" com
37560 6d 61 6e 64 20 69 6e 74 6f 20 22 2e 6f 6e 63 65  mand into ".once
37570 20 2d 78 22 20 2a 2f 0a 20 20 20 20 20 20 6e 41   -x" */.      nA
37580 72 67 20 3d 20 32 3b 0a 20 20 20 20 20 20 61 7a  rg = 2;.      az
37590 41 72 67 5b 30 5d 20 3d 20 22 6f 6e 63 65 22 3b  Arg[0] = "once";
375a0 0a 20 20 20 20 20 20 7a 46 69 6c 65 20 3d 20 61  .      zFile = a
375b0 7a 41 72 67 5b 31 5d 20 3d 20 22 2d 78 22 3b 0a  zArg[1] = "-x";.
375c0 20 20 20 20 20 20 6e 20 3d 20 34 3b 0a 20 20 20        n = 4;.   
375d0 20 7d 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e   }.    if( nArg>
375e0 32 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  2 ){.      utf8_
375f0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
37600 55 73 61 67 65 3a 20 2e 25 73 20 5b 2d 65 7c 2d  Usage: .%s [-e|-
37610 78 7c 46 49 4c 45 5d 5c 6e 22 2c 20 61 7a 41 72  x|FILE]\n", azAr
37620 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 72 63 20  g[0]);.      rc 
37630 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 1;.      goto 
37640 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
37650 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
37660 20 6e 3e 31 20 26 26 20 73 74 72 6e 63 6d 70 28   n>1 && strncmp(
37670 61 7a 41 72 67 5b 30 5d 2c 20 22 6f 6e 63 65 22  azArg[0], "once"
37680 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , n)==0 ){.     
37690 20 69 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20   if( nArg<2 ){. 
376a0 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
376b0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
376c0 3a 20 2e 6f 6e 63 65 20 28 2d 65 7c 2d 78 7c 46  : .once (-e|-x|F
376d0 49 4c 45 29 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ILE)\n");.      
376e0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
376f0 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
37700 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  and_exit;.      
37710 7d 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 43 6f  }.      p->outCo
37720 75 6e 74 20 3d 20 32 3b 0a 20 20 20 20 7d 65 6c  unt = 2;.    }el
37730 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74  se{.      p->out
37740 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d  Count = 0;.    }
37750 0a 20 20 20 20 6f 75 74 70 75 74 5f 72 65 73 65  .    output_rese
37760 74 28 70 29 3b 0a 20 20 20 20 69 66 28 20 7a 46  t(p);.    if( zF
37770 69 6c 65 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 7a  ile[0]=='-' && z
37780 46 69 6c 65 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a  File[1]=='-' ) z
37790 46 69 6c 65 2b 2b 3b 0a 23 69 66 6e 64 65 66 20  File++;.#ifndef 
377a0 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59  SQLITE_NOHAVE_SY
377b0 53 54 45 4d 0a 20 20 20 20 69 66 28 20 73 74 72  STEM.    if( str
377c0 63 6d 70 28 7a 46 69 6c 65 2c 20 22 2d 65 22 29  cmp(zFile, "-e")
377d0 3d 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28 7a 46  ==0 || strcmp(zF