/ Hex Artifact Content
Login

Artifact 911b9e3bce40413c78fdba28efa28363e98183819bd4b300780bf57bacfc4b84:


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: 69 66 20 64 65 66 69 6e 65 64 28 5f 5f 4d 49 4e  if defined(__MIN
08b0: 47 57 33 32 5f 5f 29 0a 23 20 20 64 65 66 69 6e  GW32__).#  defin
08c0: 65 20 44 49 52 45 4e 54 20 64 69 72 65 6e 74 0a  e DIRENT dirent.
08d0: 23 20 20 69 66 6e 64 65 66 20 53 5f 49 53 4c 4e  #  ifndef S_ISLN
08e0: 4b 0a 23 20 20 20 64 65 66 69 6e 65 20 53 5f 49  K.#   define S_I
08f0: 53 4c 4e 4b 28 6d 6f 64 65 29 20 28 30 29 0a 23  SLNK(mode) (0).#
0900: 20 20 65 6e 64 69 66 0a 23 20 65 6e 64 69 66 0a    endif.# endif.
0910: 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20  #endif.#include 
0920: 3c 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69  <sys/types.h>.#i
0930: 6e 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74  nclude <sys/stat
0940: 2e 68 3e 0a 0a 23 69 66 20 48 41 56 45 5f 52 45  .h>..#if HAVE_RE
0950: 41 44 4c 49 4e 45 0a 23 20 69 6e 63 6c 75 64 65  ADLINE.# include
0960: 20 3c 72 65 61 64 6c 69 6e 65 2f 72 65 61 64 6c   <readline/readl
0970: 69 6e 65 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65  ine.h>.# include
0980: 20 3c 72 65 61 64 6c 69 6e 65 2f 68 69 73 74 6f   <readline/histo
0990: 72 79 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69  ry.h>.#endif..#i
09a0: 66 20 48 41 56 45 5f 45 44 49 54 4c 49 4e 45 0a  f HAVE_EDITLINE.
09b0: 23 20 69 6e 63 6c 75 64 65 20 3c 65 64 69 74 6c  # include <editl
09c0: 69 6e 65 2f 72 65 61 64 6c 69 6e 65 2e 68 3e 0a  ine/readline.h>.
09d0: 23 65 6e 64 69 66 0a 0a 23 69 66 20 48 41 56 45  #endif..#if HAVE
09e0: 5f 45 44 49 54 4c 49 4e 45 20 7c 7c 20 48 41 56  _EDITLINE || HAV
09f0: 45 5f 52 45 41 44 4c 49 4e 45 0a 0a 23 20 64 65  E_READLINE..# de
0a00: 66 69 6e 65 20 73 68 65 6c 6c 5f 61 64 64 5f 68  fine shell_add_h
0a10: 69 73 74 6f 72 79 28 58 29 20 61 64 64 5f 68 69  istory(X) add_hi
0a20: 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e  story(X).# defin
0a30: 65 20 73 68 65 6c 6c 5f 72 65 61 64 5f 68 69 73  e shell_read_his
0a40: 74 6f 72 79 28 58 29 20 72 65 61 64 5f 68 69 73  tory(X) read_his
0a50: 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e 65  tory(X).# define
0a60: 20 73 68 65 6c 6c 5f 77 72 69 74 65 5f 68 69 73   shell_write_his
0a70: 74 6f 72 79 28 58 29 20 77 72 69 74 65 5f 68 69  tory(X) write_hi
0a80: 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e  story(X).# defin
0a90: 65 20 73 68 65 6c 6c 5f 73 74 69 66 6c 65 5f 68  e shell_stifle_h
0aa0: 69 73 74 6f 72 79 28 58 29 20 73 74 69 66 6c 65  istory(X) stifle
0ab0: 5f 68 69 73 74 6f 72 79 28 58 29 0a 23 20 64 65  _history(X).# de
0ac0: 66 69 6e 65 20 73 68 65 6c 6c 5f 72 65 61 64 6c  fine shell_readl
0ad0: 69 6e 65 28 58 29 20 72 65 61 64 6c 69 6e 65 28  ine(X) readline(
0ae0: 58 29 0a 0a 23 65 6c 69 66 20 48 41 56 45 5f 4c  X)..#elif HAVE_L
0af0: 49 4e 45 4e 4f 49 53 45 0a 0a 23 20 69 6e 63 6c  INENOISE..# incl
0b00: 75 64 65 20 22 6c 69 6e 65 6e 6f 69 73 65 2e 68  ude "linenoise.h
0b10: 22 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c  ".# define shell
0b20: 5f 61 64 64 5f 68 69 73 74 6f 72 79 28 58 29 20  _add_history(X) 
0b30: 6c 69 6e 65 6e 6f 69 73 65 48 69 73 74 6f 72 79  linenoiseHistory
0b40: 41 64 64 28 58 29 0a 23 20 64 65 66 69 6e 65 20  Add(X).# define 
0b50: 73 68 65 6c 6c 5f 72 65 61 64 5f 68 69 73 74 6f  shell_read_histo
0b60: 72 79 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65 48  ry(X) linenoiseH
0b70: 69 73 74 6f 72 79 4c 6f 61 64 28 58 29 0a 23 20  istoryLoad(X).# 
0b80: 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 77 72 69  define shell_wri
0b90: 74 65 5f 68 69 73 74 6f 72 79 28 58 29 20 6c 69  te_history(X) li
0ba0: 6e 65 6e 6f 69 73 65 48 69 73 74 6f 72 79 53 61  nenoiseHistorySa
0bb0: 76 65 28 58 29 0a 23 20 64 65 66 69 6e 65 20 73  ve(X).# define s
0bc0: 68 65 6c 6c 5f 73 74 69 66 6c 65 5f 68 69 73 74  hell_stifle_hist
0bd0: 6f 72 79 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65  ory(X) linenoise
0be0: 48 69 73 74 6f 72 79 53 65 74 4d 61 78 4c 65 6e  HistorySetMaxLen
0bf0: 28 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65  (X).# define she
0c00: 6c 6c 5f 72 65 61 64 6c 69 6e 65 28 58 29 20 6c  ll_readline(X) l
0c10: 69 6e 65 6e 6f 69 73 65 28 58 29 0a 0a 23 65 6c  inenoise(X)..#el
0c20: 73 65 0a 0a 23 20 64 65 66 69 6e 65 20 73 68 65  se..# define she
0c30: 6c 6c 5f 72 65 61 64 5f 68 69 73 74 6f 72 79 28  ll_read_history(
0c40: 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c  X).# define shel
0c50: 6c 5f 77 72 69 74 65 5f 68 69 73 74 6f 72 79 28  l_write_history(
0c60: 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c  X).# define shel
0c70: 6c 5f 73 74 69 66 6c 65 5f 68 69 73 74 6f 72 79  l_stifle_history
0c80: 28 58 29 0a 0a 23 20 64 65 66 69 6e 65 20 53 48  (X)..# define SH
0c90: 45 4c 4c 5f 55 53 45 5f 4c 4f 43 41 4c 5f 47 45  ELL_USE_LOCAL_GE
0ca0: 54 4c 49 4e 45 20 31 0a 23 65 6e 64 69 66 0a 0a  TLINE 1.#endif..
0cb0: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49  .#if defined(_WI
0cc0: 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  N32) || defined(
0cd0: 57 49 4e 33 32 29 0a 23 20 69 6e 63 6c 75 64 65  WIN32).# include
0ce0: 20 3c 69 6f 2e 68 3e 0a 23 20 69 6e 63 6c 75 64   <io.h>.# includ
0cf0: 65 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23 20 64 65  e <fcntl.h>.# de
0d00: 66 69 6e 65 20 69 73 61 74 74 79 28 68 29 20 5f  fine isatty(h) _
0d10: 69 73 61 74 74 79 28 68 29 0a 23 20 69 66 6e 64  isatty(h).# ifnd
0d20: 65 66 20 61 63 63 65 73 73 0a 23 20 20 64 65 66  ef access.#  def
0d30: 69 6e 65 20 61 63 63 65 73 73 28 66 2c 6d 29 20  ine access(f,m) 
0d40: 5f 61 63 63 65 73 73 28 28 66 29 2c 28 6d 29 29  _access((f),(m))
0d50: 0a 23 20 65 6e 64 69 66 0a 23 20 75 6e 64 65 66  .# endif.# undef
0d60: 20 70 6f 70 65 6e 0a 23 20 64 65 66 69 6e 65 20   popen.# define 
0d70: 70 6f 70 65 6e 20 5f 70 6f 70 65 6e 0a 23 20 75  popen _popen.# u
0d80: 6e 64 65 66 20 70 63 6c 6f 73 65 0a 23 20 64 65  ndef pclose.# de
0d90: 66 69 6e 65 20 70 63 6c 6f 73 65 20 5f 70 63 6c  fine pclose _pcl
0da0: 6f 73 65 0a 23 65 6c 73 65 0a 20 2f 2a 20 4d 61  ose.#else. /* Ma
0db0: 6b 65 20 73 75 72 65 20 69 73 61 74 74 79 28 29  ke sure isatty()
0dc0: 20 68 61 73 20 61 20 70 72 6f 74 6f 74 79 70 65   has a prototype
0dd0: 2e 20 2a 2f 0a 20 65 78 74 65 72 6e 20 69 6e 74  . */. extern int
0de0: 20 69 73 61 74 74 79 28 69 6e 74 29 3b 0a 0a 23   isatty(int);..#
0df0: 20 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 52   if !defined(__R
0e00: 54 50 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65  TP__) && !define
0e10: 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a 20  d(_WRS_KERNEL). 
0e20: 20 2f 2a 20 70 6f 70 65 6e 20 61 6e 64 20 70 63   /* popen and pc
0e30: 6c 6f 73 65 20 61 72 65 20 6e 6f 74 20 43 38 39  lose are not C89
0e40: 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 73   functions and s
0e50: 6f 20 61 72 65 0a 20 20 2a 2a 20 73 6f 6d 65 74  o are.  ** somet
0e60: 69 6d 65 73 20 6f 6d 69 74 74 65 64 20 66 72 6f  imes omitted fro
0e70: 6d 20 74 68 65 20 3c 73 74 64 69 6f 2e 68 3e 20  m the <stdio.h> 
0e80: 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 65 78 74  header */.   ext
0e90: 65 72 6e 20 46 49 4c 45 20 2a 70 6f 70 65 6e 28  ern FILE *popen(
0ea0: 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73  const char*,cons
0eb0: 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 65 78 74  t char*);.   ext
0ec0: 65 72 6e 20 69 6e 74 20 70 63 6c 6f 73 65 28 46  ern int pclose(F
0ed0: 49 4c 45 2a 29 3b 0a 23 20 65 6c 73 65 0a 23 20  ILE*);.# else.# 
0ee0: 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4f   define SQLITE_O
0ef0: 4d 49 54 5f 50 4f 50 45 4e 20 31 0a 23 20 65 6e  MIT_POPEN 1.# en
0f00: 64 69 66 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  dif.#endif..#if 
0f10: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57  defined(_WIN32_W
0f20: 43 45 29 0a 2f 2a 20 57 69 6e 64 6f 77 73 20 43  CE)./* Windows C
0f30: 45 20 28 61 72 6d 2d 77 69 6e 63 65 2d 6d 69 6e  E (arm-wince-min
0f40: 67 77 33 32 63 65 2d 67 63 63 29 20 64 6f 65 73  gw32ce-gcc) does
0f50: 20 6e 6f 74 20 70 72 6f 76 69 64 65 20 69 73 61   not provide isa
0f60: 74 74 79 28 29 0a 20 2a 20 74 68 75 73 20 77 65  tty(). * thus we
0f70: 20 61 6c 77 61 79 73 20 61 73 73 75 6d 65 20 74   always assume t
0f80: 68 61 74 20 77 65 20 68 61 76 65 20 61 20 63 6f  hat we have a co
0f90: 6e 73 6f 6c 65 2e 20 54 68 61 74 20 63 61 6e 20  nsole. That can 
0fa0: 62 65 0a 20 2a 20 6f 76 65 72 72 69 64 64 65 6e  be. * overridden
0fb0: 20 77 69 74 68 20 74 68 65 20 2d 62 61 74 63 68   with the -batch
0fc0: 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 6f 70   command line op
0fd0: 74 69 6f 6e 2e 0a 20 2a 2f 0a 23 64 65 66 69 6e  tion.. */.#defin
0fe0: 65 20 69 73 61 74 74 79 28 78 29 20 31 0a 23 65  e isatty(x) 1.#e
0ff0: 6e 64 69 66 0a 0a 2f 2a 20 63 74 79 70 65 20 6d  ndif../* ctype m
1000: 61 63 72 6f 73 20 74 68 61 74 20 77 6f 72 6b 20  acros that work 
1010: 77 69 74 68 20 73 69 67 6e 65 64 20 63 68 61 72  with signed char
1020: 61 63 74 65 72 73 20 2a 2f 0a 23 64 65 66 69 6e  acters */.#defin
1030: 65 20 49 73 53 70 61 63 65 28 58 29 20 20 69 73  e IsSpace(X)  is
1040: 73 70 61 63 65 28 28 75 6e 73 69 67 6e 65 64 20  space((unsigned 
1050: 63 68 61 72 29 58 29 0a 23 64 65 66 69 6e 65 20  char)X).#define 
1060: 49 73 44 69 67 69 74 28 58 29 20 20 69 73 64 69  IsDigit(X)  isdi
1070: 67 69 74 28 28 75 6e 73 69 67 6e 65 64 20 63 68  git((unsigned ch
1080: 61 72 29 58 29 0a 23 64 65 66 69 6e 65 20 54 6f  ar)X).#define To
1090: 4c 6f 77 65 72 28 58 29 20 20 28 63 68 61 72 29  Lower(X)  (char)
10a0: 74 6f 6c 6f 77 65 72 28 28 75 6e 73 69 67 6e 65  tolower((unsigne
10b0: 64 20 63 68 61 72 29 58 29 0a 0a 23 69 66 20 64  d char)X)..#if d
10c0: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c  efined(_WIN32) |
10d0: 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29  | defined(WIN32)
10e0: 0a 23 69 6e 63 6c 75 64 65 20 3c 77 69 6e 64 6f  .#include <windo
10f0: 77 73 2e 68 3e 0a 0a 2f 2a 20 73 74 72 69 6e 67  ws.h>../* string
1100: 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 6f 75 74   conversion rout
1110: 69 6e 65 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64  ines only needed
1120: 20 6f 6e 20 57 69 6e 33 32 20 2a 2f 0a 65 78 74   on Win32 */.ext
1130: 65 72 6e 20 63 68 61 72 20 2a 73 71 6c 69 74 65  ern char *sqlite
1140: 33 5f 77 69 6e 33 32 5f 75 6e 69 63 6f 64 65 5f  3_win32_unicode_
1150: 74 6f 5f 75 74 66 38 28 4c 50 43 57 53 54 52 29  to_utf8(LPCWSTR)
1160: 3b 0a 65 78 74 65 72 6e 20 63 68 61 72 20 2a 73  ;.extern char *s
1170: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63  qlite3_win32_mbc
1180: 73 5f 74 6f 5f 75 74 66 38 5f 76 32 28 63 6f 6e  s_to_utf8_v2(con
1190: 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 29 3b  st char *, int);
11a0: 0a 65 78 74 65 72 6e 20 63 68 61 72 20 2a 73 71  .extern char *sq
11b0: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38  lite3_win32_utf8
11c0: 5f 74 6f 5f 6d 62 63 73 5f 76 32 28 63 6f 6e 73  _to_mbcs_v2(cons
11d0: 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 29 3b 0a  t char *, int);.
11e0: 65 78 74 65 72 6e 20 4c 50 57 53 54 52 20 73 71  extern LPWSTR sq
11f0: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38  lite3_win32_utf8
1200: 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 63 6f 6e 73  _to_unicode(cons
1210: 74 20 63 68 61 72 20 2a 7a 54 65 78 74 29 3b 0a  t char *zText);.
1220: 23 65 6e 64 69 66 0a 0a 2f 2a 20 4f 6e 20 57 69  #endif../* On Wi
1230: 6e 64 6f 77 73 2c 20 77 65 20 6e 6f 72 6d 61 6c  ndows, we normal
1240: 6c 79 20 72 75 6e 20 77 69 74 68 20 6f 75 74 70  ly run with outp
1250: 75 74 20 6d 6f 64 65 20 6f 66 20 54 45 58 54 20  ut mode of TEXT 
1260: 73 6f 20 74 68 61 74 20 5c 6e 20 63 68 61 72 61  so that \n chara
1270: 63 74 65 72 73 0a 2a 2a 20 61 72 65 20 61 75 74  cters.** are aut
1280: 6f 6d 61 74 69 63 61 6c 6c 79 20 74 72 61 6e 73  omatically trans
1290: 6c 61 74 65 64 20 69 6e 74 6f 20 5c 72 5c 6e 2e  lated into \r\n.
12a0: 20 20 48 6f 77 65 76 65 72 2c 20 74 68 69 73 20    However, this 
12b0: 62 65 68 61 76 69 6f 72 20 6e 65 65 64 73 0a 2a  behavior needs.*
12c0: 2a 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64  * to be disabled
12d0: 20 69 6e 20 73 6f 6d 65 20 63 61 73 65 73 20 28   in some cases (
12e0: 65 78 3a 20 77 68 65 6e 20 67 65 6e 65 72 61 74  ex: when generat
12f0: 69 6e 67 20 43 53 56 20 6f 75 74 70 75 74 20 61  ing CSV output a
1300: 6e 64 20 77 68 65 6e 0a 2a 2a 20 72 65 6e 64 65  nd when.** rende
1310: 72 69 6e 67 20 71 75 6f 74 65 64 20 73 74 72 69  ring quoted stri
1320: 6e 67 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e  ngs that contain
1330: 20 5c 6e 20 63 68 61 72 61 63 74 65 72 73 29 2e   \n characters).
1340: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a    The following.
1350: 2a 2a 20 72 6f 75 74 69 6e 65 73 20 74 61 6b 65  ** routines take
1360: 20 63 61 72 65 20 6f 66 20 74 68 61 74 2e 0a 2a   care of that..*
1370: 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  /.#if defined(_W
1380: 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  IN32) || defined
1390: 28 57 49 4e 33 32 29 0a 73 74 61 74 69 63 20 76  (WIN32).static v
13a0: 6f 69 64 20 73 65 74 42 69 6e 61 72 79 4d 6f 64  oid setBinaryMod
13b0: 65 28 46 49 4c 45 20 2a 66 69 6c 65 2c 20 69 6e  e(FILE *file, in
13c0: 74 20 69 73 4f 75 74 70 75 74 29 7b 0a 20 20 69  t isOutput){.  i
13d0: 66 28 20 69 73 4f 75 74 70 75 74 20 29 20 66 66  f( isOutput ) ff
13e0: 6c 75 73 68 28 66 69 6c 65 29 3b 0a 20 20 5f 73  lush(file);.  _s
13f0: 65 74 6d 6f 64 65 28 5f 66 69 6c 65 6e 6f 28 66  etmode(_fileno(f
1400: 69 6c 65 29 2c 20 5f 4f 5f 42 49 4e 41 52 59 29  ile), _O_BINARY)
1410: 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ;.}.static void 
1420: 73 65 74 54 65 78 74 4d 6f 64 65 28 46 49 4c 45  setTextMode(FILE
1430: 20 2a 66 69 6c 65 2c 20 69 6e 74 20 69 73 4f 75   *file, int isOu
1440: 74 70 75 74 29 7b 0a 20 20 69 66 28 20 69 73 4f  tput){.  if( isO
1450: 75 74 70 75 74 20 29 20 66 66 6c 75 73 68 28 66  utput ) fflush(f
1460: 69 6c 65 29 3b 0a 20 20 5f 73 65 74 6d 6f 64 65  ile);.  _setmode
1470: 28 5f 66 69 6c 65 6e 6f 28 66 69 6c 65 29 2c 20  (_fileno(file), 
1480: 5f 4f 5f 54 45 58 54 29 3b 0a 7d 0a 23 65 6c 73  _O_TEXT);.}.#els
1490: 65 0a 23 20 64 65 66 69 6e 65 20 73 65 74 42 69  e.# define setBi
14a0: 6e 61 72 79 4d 6f 64 65 28 58 2c 59 29 0a 23 20  naryMode(X,Y).# 
14b0: 64 65 66 69 6e 65 20 73 65 74 54 65 78 74 4d 6f  define setTextMo
14c0: 64 65 28 58 2c 59 29 0a 23 65 6e 64 69 66 0a 0a  de(X,Y).#endif..
14d0: 0a 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20  ./* True if the 
14e0: 74 69 6d 65 72 20 69 73 20 65 6e 61 62 6c 65 64  timer is enabled
14f0: 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65   */.static int e
1500: 6e 61 62 6c 65 54 69 6d 65 72 20 3d 20 30 3b 0a  nableTimer = 0;.
1510: 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  ./* Return the c
1520: 75 72 72 65 6e 74 20 77 61 6c 6c 2d 63 6c 6f 63  urrent wall-cloc
1530: 6b 20 74 69 6d 65 20 2a 2f 0a 73 74 61 74 69 63  k time */.static
1540: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 74   sqlite3_int64 t
1550: 69 6d 65 4f 66 44 61 79 28 76 6f 69 64 29 7b 0a  imeOfDay(void){.
1560: 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33    static sqlite3
1570: 5f 76 66 73 20 2a 63 6c 6f 63 6b 56 66 73 20 3d  _vfs *clockVfs =
1580: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e   0;.  sqlite3_in
1590: 74 36 34 20 74 3b 0a 20 20 69 66 28 20 63 6c 6f  t64 t;.  if( clo
15a0: 63 6b 56 66 73 3d 3d 30 20 29 20 63 6c 6f 63 6b  ckVfs==0 ) clock
15b0: 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  Vfs = sqlite3_vf
15c0: 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66 28  s_find(0);.  if(
15d0: 20 63 6c 6f 63 6b 56 66 73 2d 3e 69 56 65 72 73   clockVfs->iVers
15e0: 69 6f 6e 3e 3d 32 20 26 26 20 63 6c 6f 63 6b 56  ion>=2 && clockV
15f0: 66 73 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65  fs->xCurrentTime
1600: 49 6e 74 36 34 21 3d 30 20 29 7b 0a 20 20 20 20  Int64!=0 ){.    
1610: 63 6c 6f 63 6b 56 66 73 2d 3e 78 43 75 72 72 65  clockVfs->xCurre
1620: 6e 74 54 69 6d 65 49 6e 74 36 34 28 63 6c 6f 63  ntTimeInt64(cloc
1630: 6b 56 66 73 2c 20 26 74 29 3b 0a 20 20 7d 65 6c  kVfs, &t);.  }el
1640: 73 65 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72  se{.    double r
1650: 3b 0a 20 20 20 20 63 6c 6f 63 6b 56 66 73 2d 3e  ;.    clockVfs->
1660: 78 43 75 72 72 65 6e 74 54 69 6d 65 28 63 6c 6f  xCurrentTime(clo
1670: 63 6b 56 66 73 2c 20 26 72 29 3b 0a 20 20 20 20  ckVfs, &r);.    
1680: 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  t = (sqlite3_int
1690: 36 34 29 28 72 2a 38 36 34 30 30 30 30 30 2e 30  64)(r*86400000.0
16a0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
16b0: 74 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  t;.}..#if !defin
16c0: 65 64 28 5f 57 49 4e 33 32 29 20 26 26 20 21 64  ed(_WIN32) && !d
16d0: 65 66 69 6e 65 64 28 57 49 4e 33 32 29 20 26 26  efined(WIN32) &&
16e0: 20 21 64 65 66 69 6e 65 64 28 5f 5f 6d 69 6e 75   !defined(__minu
16f0: 78 29 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  x).#include <sys
1700: 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64  /time.h>.#includ
1710: 65 20 3c 73 79 73 2f 72 65 73 6f 75 72 63 65 2e  e <sys/resource.
1720: 68 3e 0a 0a 2f 2a 20 56 78 57 6f 72 6b 73 20 64  h>../* VxWorks d
1730: 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20  oes not support 
1740: 67 65 74 72 75 73 61 67 65 28 29 20 61 73 20 66  getrusage() as f
1750: 61 72 20 61 73 20 77 65 20 63 61 6e 20 64 65 74  ar as we can det
1760: 65 72 6d 69 6e 65 20 2a 2f 0a 23 69 66 20 64 65  ermine */.#if de
1770: 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45  fined(_WRS_KERNE
1780: 4c 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f  L) || defined(__
1790: 52 54 50 5f 5f 29 0a 73 74 72 75 63 74 20 72 75  RTP__).struct ru
17a0: 73 61 67 65 20 7b 0a 20 20 73 74 72 75 63 74 20  sage {.  struct 
17b0: 74 69 6d 65 76 61 6c 20 72 75 5f 75 74 69 6d 65  timeval ru_utime
17c0: 3b 20 2f 2a 20 75 73 65 72 20 43 50 55 20 74 69  ; /* user CPU ti
17d0: 6d 65 20 75 73 65 64 20 2a 2f 0a 20 20 73 74 72  me used */.  str
17e0: 75 63 74 20 74 69 6d 65 76 61 6c 20 72 75 5f 73  uct timeval ru_s
17f0: 74 69 6d 65 3b 20 2f 2a 20 73 79 73 74 65 6d 20  time; /* system 
1800: 43 50 55 20 74 69 6d 65 20 75 73 65 64 20 2a 2f  CPU time used */
1810: 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 67 65 74 72  .};.#define getr
1820: 75 73 61 67 65 28 41 2c 42 29 20 6d 65 6d 73 65  usage(A,B) memse
1830: 74 28 42 2c 30 2c 73 69 7a 65 6f 66 28 2a 42 29  t(B,0,sizeof(*B)
1840: 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 53 61 76  ).#endif../* Sav
1850: 65 64 20 72 65 73 6f 75 72 63 65 20 69 6e 66 6f  ed resource info
1860: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
1870: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 6e 20  beginning of an 
1880: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61  operation */.sta
1890: 74 69 63 20 73 74 72 75 63 74 20 72 75 73 61 67  tic struct rusag
18a0: 65 20 73 42 65 67 69 6e 3b 20 20 2f 2a 20 43 50  e sBegin;  /* CP
18b0: 55 20 74 69 6d 65 20 61 74 20 73 74 61 72 74 20  U time at start 
18c0: 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  */.static sqlite
18d0: 33 5f 69 6e 74 36 34 20 69 42 65 67 69 6e 3b 20  3_int64 iBegin; 
18e0: 20 2f 2a 20 57 61 6c 6c 2d 63 6c 6f 63 6b 20 74   /* Wall-clock t
18f0: 69 6d 65 20 61 74 20 73 74 61 72 74 20 2a 2f 0a  ime at start */.
1900: 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 74 69 6d  ./*.** Begin tim
1910: 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  ing an operation
1920: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
1930: 62 65 67 69 6e 54 69 6d 65 72 28 76 6f 69 64 29  beginTimer(void)
1940: 7b 0a 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69  {.  if( enableTi
1950: 6d 65 72 20 29 7b 0a 20 20 20 20 67 65 74 72 75  mer ){.    getru
1960: 73 61 67 65 28 52 55 53 41 47 45 5f 53 45 4c 46  sage(RUSAGE_SELF
1970: 2c 20 26 73 42 65 67 69 6e 29 3b 0a 20 20 20 20  , &sBegin);.    
1980: 69 42 65 67 69 6e 20 3d 20 74 69 6d 65 4f 66 44  iBegin = timeOfD
1990: 61 79 28 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20  ay();.  }.}../* 
19a0: 52 65 74 75 72 6e 20 74 68 65 20 64 69 66 66 65  Return the diffe
19b0: 72 65 6e 63 65 20 6f 66 20 74 77 6f 20 74 69 6d  rence of two tim
19c0: 65 5f 73 74 72 75 63 74 73 20 69 6e 20 73 65 63  e_structs in sec
19d0: 6f 6e 64 73 20 2a 2f 0a 73 74 61 74 69 63 20 64  onds */.static d
19e0: 6f 75 62 6c 65 20 74 69 6d 65 44 69 66 66 28 73  ouble timeDiff(s
19f0: 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 2a 70  truct timeval *p
1a00: 53 74 61 72 74 2c 20 73 74 72 75 63 74 20 74 69  Start, struct ti
1a10: 6d 65 76 61 6c 20 2a 70 45 6e 64 29 7b 0a 20 20  meval *pEnd){.  
1a20: 72 65 74 75 72 6e 20 28 70 45 6e 64 2d 3e 74 76  return (pEnd->tv
1a30: 5f 75 73 65 63 20 2d 20 70 53 74 61 72 74 2d 3e  _usec - pStart->
1a40: 74 76 5f 75 73 65 63 29 2a 30 2e 30 30 30 30 30  tv_usec)*0.00000
1a50: 31 20 2b 0a 20 20 20 20 20 20 20 20 20 28 64 6f  1 +.         (do
1a60: 75 62 6c 65 29 28 70 45 6e 64 2d 3e 74 76 5f 73  uble)(pEnd->tv_s
1a70: 65 63 20 2d 20 70 53 74 61 72 74 2d 3e 74 76 5f  ec - pStart->tv_
1a80: 73 65 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  sec);.}../*.** P
1a90: 72 69 6e 74 20 74 68 65 20 74 69 6d 69 6e 67 20  rint the timing 
1aa0: 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a 73 74 61 74  results..*/.stat
1ab0: 69 63 20 76 6f 69 64 20 65 6e 64 54 69 6d 65 72  ic void endTimer
1ac0: 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65 6e  (void){.  if( en
1ad0: 61 62 6c 65 54 69 6d 65 72 20 29 7b 0a 20 20 20  ableTimer ){.   
1ae0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69   sqlite3_int64 i
1af0: 45 6e 64 20 3d 20 74 69 6d 65 4f 66 44 61 79 28  End = timeOfDay(
1b00: 29 3b 0a 20 20 20 20 73 74 72 75 63 74 20 72 75  );.    struct ru
1b10: 73 61 67 65 20 73 45 6e 64 3b 0a 20 20 20 20 67  sage sEnd;.    g
1b20: 65 74 72 75 73 61 67 65 28 52 55 53 41 47 45 5f  etrusage(RUSAGE_
1b30: 53 45 4c 46 2c 20 26 73 45 6e 64 29 3b 0a 20 20  SELF, &sEnd);.  
1b40: 20 20 70 72 69 6e 74 66 28 22 52 75 6e 20 54 69    printf("Run Ti
1b50: 6d 65 3a 20 72 65 61 6c 20 25 2e 33 66 20 75 73  me: real %.3f us
1b60: 65 72 20 25 66 20 73 79 73 20 25 66 5c 6e 22 2c  er %f sys %f\n",
1b70: 0a 20 20 20 20 20 20 20 28 69 45 6e 64 20 2d 20  .       (iEnd - 
1b80: 69 42 65 67 69 6e 29 2a 30 2e 30 30 31 2c 0a 20  iBegin)*0.001,. 
1b90: 20 20 20 20 20 20 74 69 6d 65 44 69 66 66 28 26        timeDiff(&
1ba0: 73 42 65 67 69 6e 2e 72 75 5f 75 74 69 6d 65 2c  sBegin.ru_utime,
1bb0: 20 26 73 45 6e 64 2e 72 75 5f 75 74 69 6d 65 29   &sEnd.ru_utime)
1bc0: 2c 0a 20 20 20 20 20 20 20 74 69 6d 65 44 69 66  ,.       timeDif
1bd0: 66 28 26 73 42 65 67 69 6e 2e 72 75 5f 73 74 69  f(&sBegin.ru_sti
1be0: 6d 65 2c 20 26 73 45 6e 64 2e 72 75 5f 73 74 69  me, &sEnd.ru_sti
1bf0: 6d 65 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 64 65  me));.  }.}..#de
1c00: 66 69 6e 65 20 42 45 47 49 4e 5f 54 49 4d 45 52  fine BEGIN_TIMER
1c10: 20 62 65 67 69 6e 54 69 6d 65 72 28 29 0a 23 64   beginTimer().#d
1c20: 65 66 69 6e 65 20 45 4e 44 5f 54 49 4d 45 52 20  efine END_TIMER 
1c30: 65 6e 64 54 69 6d 65 72 28 29 0a 23 64 65 66 69  endTimer().#defi
1c40: 6e 65 20 48 41 53 5f 54 49 4d 45 52 20 31 0a 0a  ne HAS_TIMER 1..
1c50: 23 65 6c 69 66 20 28 64 65 66 69 6e 65 64 28 5f  #elif (defined(_
1c60: 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65  WIN32) || define
1c70: 64 28 57 49 4e 33 32 29 29 0a 0a 2f 2a 20 53 61  d(WIN32))../* Sa
1c80: 76 65 64 20 72 65 73 6f 75 72 63 65 20 69 6e 66  ved resource inf
1c90: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
1ca0: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 6e   beginning of an
1cb0: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 73 74   operation */.st
1cc0: 61 74 69 63 20 48 41 4e 44 4c 45 20 68 50 72 6f  atic HANDLE hPro
1cd0: 63 65 73 73 3b 0a 73 74 61 74 69 63 20 46 49 4c  cess;.static FIL
1ce0: 45 54 49 4d 45 20 66 74 4b 65 72 6e 65 6c 42 65  ETIME ftKernelBe
1cf0: 67 69 6e 3b 0a 73 74 61 74 69 63 20 46 49 4c 45  gin;.static FILE
1d00: 54 49 4d 45 20 66 74 55 73 65 72 42 65 67 69 6e  TIME ftUserBegin
1d10: 3b 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  ;.static sqlite3
1d20: 5f 69 6e 74 36 34 20 66 74 57 61 6c 6c 42 65 67  _int64 ftWallBeg
1d30: 69 6e 3b 0a 74 79 70 65 64 65 66 20 42 4f 4f 4c  in;.typedef BOOL
1d40: 20 28 57 49 4e 41 50 49 20 2a 47 45 54 50 52 4f   (WINAPI *GETPRO
1d50: 43 54 49 4d 45 53 29 28 48 41 4e 44 4c 45 2c 20  CTIMES)(HANDLE, 
1d60: 4c 50 46 49 4c 45 54 49 4d 45 2c 20 4c 50 46 49  LPFILETIME, LPFI
1d70: 4c 45 54 49 4d 45 2c 0a 20 20 20 20 20 20 20 20  LETIME,.        
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d90: 20 20 20 20 20 20 20 20 20 20 20 20 4c 50 46 49              LPFI
1da0: 4c 45 54 49 4d 45 2c 20 4c 50 46 49 4c 45 54 49  LETIME, LPFILETI
1db0: 4d 45 29 3b 0a 73 74 61 74 69 63 20 47 45 54 50  ME);.static GETP
1dc0: 52 4f 43 54 49 4d 45 53 20 67 65 74 50 72 6f 63  ROCTIMES getProc
1dd0: 65 73 73 54 69 6d 65 73 41 64 64 72 20 3d 20 4e  essTimesAddr = N
1de0: 55 4c 4c 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63  ULL;../*.** Chec
1df0: 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 68  k to see if we h
1e00: 61 76 65 20 74 69 6d 65 72 20 73 75 70 70 6f 72  ave timer suppor
1e10: 74 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  t.  Return 1 if 
1e20: 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20 73 75 70  necessary.** sup
1e30: 70 6f 72 74 20 66 6f 75 6e 64 20 28 6f 72 20 66  port found (or f
1e40: 6f 75 6e 64 20 70 72 65 76 69 6f 75 73 6c 79 29  ound previously)
1e50: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e60: 68 61 73 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a  hasTimer(void){.
1e70: 20 20 69 66 28 20 67 65 74 50 72 6f 63 65 73 73    if( getProcess
1e80: 54 69 6d 65 73 41 64 64 72 20 29 7b 0a 20 20 20  TimesAddr ){.   
1e90: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 20 65   return 1;.  } e
1ea0: 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 47 65 74  lse {.    /* Get
1eb0: 50 72 6f 63 65 73 73 54 69 6d 65 73 28 29 20 69  ProcessTimes() i
1ec0: 73 6e 27 74 20 73 75 70 70 6f 72 74 65 64 20 69  sn't supported i
1ed0: 6e 20 57 49 4e 39 35 20 61 6e 64 20 73 6f 6d 65  n WIN95 and some
1ee0: 20 6f 74 68 65 72 20 57 69 6e 64 6f 77 73 0a 20   other Windows. 
1ef0: 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 73 2e 20     ** versions. 
1f00: 53 65 65 20 69 66 20 74 68 65 20 76 65 72 73 69  See if the versi
1f10: 6f 6e 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e  on we are runnin
1f20: 67 20 6f 6e 20 68 61 73 20 69 74 2c 20 61 6e 64  g on has it, and
1f30: 20 69 66 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f   if it.    ** do
1f40: 65 73 2c 20 73 61 76 65 20 6f 66 66 20 61 20 70  es, save off a p
1f50: 6f 69 6e 74 65 72 20 74 6f 20 69 74 20 61 6e 64  ointer to it and
1f60: 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f   the current pro
1f70: 63 65 73 73 20 68 61 6e 64 6c 65 2e 0a 20 20 20  cess handle..   
1f80: 20 2a 2f 0a 20 20 20 20 68 50 72 6f 63 65 73 73   */.    hProcess
1f90: 20 3d 20 47 65 74 43 75 72 72 65 6e 74 50 72 6f   = GetCurrentPro
1fa0: 63 65 73 73 28 29 3b 0a 20 20 20 20 69 66 28 20  cess();.    if( 
1fb0: 68 50 72 6f 63 65 73 73 20 29 7b 0a 20 20 20 20  hProcess ){.    
1fc0: 20 20 48 49 4e 53 54 41 4e 43 45 20 68 69 6e 73    HINSTANCE hins
1fd0: 74 4c 69 62 20 3d 20 4c 6f 61 64 4c 69 62 72 61  tLib = LoadLibra
1fe0: 72 79 28 54 45 58 54 28 22 4b 65 72 6e 65 6c 33  ry(TEXT("Kernel3
1ff0: 32 2e 64 6c 6c 22 29 29 3b 0a 20 20 20 20 20 20  2.dll"));.      
2000: 69 66 28 20 4e 55 4c 4c 20 21 3d 20 68 69 6e 73  if( NULL != hins
2010: 74 4c 69 62 20 29 7b 0a 20 20 20 20 20 20 20 20  tLib ){.        
2020: 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41  getProcessTimesA
2030: 64 64 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20  ddr =.          
2040: 20 20 28 47 45 54 50 52 4f 43 54 49 4d 45 53 29    (GETPROCTIMES)
2050: 20 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 28   GetProcAddress(
2060: 68 69 6e 73 74 4c 69 62 2c 20 22 47 65 74 50 72  hinstLib, "GetPr
2070: 6f 63 65 73 73 54 69 6d 65 73 22 29 3b 0a 20 20  ocessTimes");.  
2080: 20 20 20 20 20 20 69 66 28 20 4e 55 4c 4c 20 21        if( NULL !
2090: 3d 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65  = getProcessTime
20a0: 73 41 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20  sAddr ){.       
20b0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
20c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 46       }.        F
20d0: 72 65 65 4c 69 62 72 61 72 79 28 68 69 6e 73 74  reeLibrary(hinst
20e0: 4c 69 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Lib);.      }.  
20f0: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
2100: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67   0;.}../*.** Beg
2110: 69 6e 20 74 69 6d 69 6e 67 20 61 6e 20 6f 70 65  in timing an ope
2120: 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63  ration.*/.static
2130: 20 76 6f 69 64 20 62 65 67 69 6e 54 69 6d 65 72   void beginTimer
2140: 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65 6e  (void){.  if( en
2150: 61 62 6c 65 54 69 6d 65 72 20 26 26 20 67 65 74  ableTimer && get
2160: 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72  ProcessTimesAddr
2170: 20 29 7b 0a 20 20 20 20 46 49 4c 45 54 49 4d 45   ){.    FILETIME
2180: 20 66 74 43 72 65 61 74 69 6f 6e 2c 20 66 74 45   ftCreation, ftE
2190: 78 69 74 3b 0a 20 20 20 20 67 65 74 50 72 6f 63  xit;.    getProc
21a0: 65 73 73 54 69 6d 65 73 41 64 64 72 28 68 50 72  essTimesAddr(hPr
21b0: 6f 63 65 73 73 2c 26 66 74 43 72 65 61 74 69 6f  ocess,&ftCreatio
21c0: 6e 2c 26 66 74 45 78 69 74 2c 0a 20 20 20 20 20  n,&ftExit,.     
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21e0: 20 20 20 26 66 74 4b 65 72 6e 65 6c 42 65 67 69     &ftKernelBegi
21f0: 6e 2c 26 66 74 55 73 65 72 42 65 67 69 6e 29 3b  n,&ftUserBegin);
2200: 0a 20 20 20 20 66 74 57 61 6c 6c 42 65 67 69 6e  .    ftWallBegin
2210: 20 3d 20 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a   = timeOfDay();.
2220: 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e    }.}../* Return
2230: 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   the difference 
2240: 6f 66 20 74 77 6f 20 46 49 4c 45 54 49 4d 45 20  of two FILETIME 
2250: 73 74 72 75 63 74 73 20 69 6e 20 73 65 63 6f 6e  structs in secon
2260: 64 73 20 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75  ds */.static dou
2270: 62 6c 65 20 74 69 6d 65 44 69 66 66 28 46 49 4c  ble timeDiff(FIL
2280: 45 54 49 4d 45 20 2a 70 53 74 61 72 74 2c 20 46  ETIME *pStart, F
2290: 49 4c 45 54 49 4d 45 20 2a 70 45 6e 64 29 7b 0a  ILETIME *pEnd){.
22a0: 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69    sqlite_int64 i
22b0: 36 34 53 74 61 72 74 20 3d 20 2a 28 28 73 71 6c  64Start = *((sql
22c0: 69 74 65 5f 69 6e 74 36 34 20 2a 29 20 70 53 74  ite_int64 *) pSt
22d0: 61 72 74 29 3b 0a 20 20 73 71 6c 69 74 65 5f 69  art);.  sqlite_i
22e0: 6e 74 36 34 20 69 36 34 45 6e 64 20 3d 20 2a 28  nt64 i64End = *(
22f0: 28 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 29  (sqlite_int64 *)
2300: 20 70 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e   pEnd);.  return
2310: 20 28 64 6f 75 62 6c 65 29 20 28 28 69 36 34 45   (double) ((i64E
2320: 6e 64 20 2d 20 69 36 34 53 74 61 72 74 29 20 2f  nd - i64Start) /
2330: 20 31 30 30 30 30 30 30 30 2e 30 29 3b 0a 7d 0a   10000000.0);.}.
2340: 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65  ./*.** Print the
2350: 20 74 69 6d 69 6e 67 20 72 65 73 75 6c 74 73 2e   timing results.
2360: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2370: 65 6e 64 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a  endTimer(void){.
2380: 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d 65    if( enableTime
2390: 72 20 26 26 20 67 65 74 50 72 6f 63 65 73 73 54  r && getProcessT
23a0: 69 6d 65 73 41 64 64 72 29 7b 0a 20 20 20 20 46  imesAddr){.    F
23b0: 49 4c 45 54 49 4d 45 20 66 74 43 72 65 61 74 69  ILETIME ftCreati
23c0: 6f 6e 2c 20 66 74 45 78 69 74 2c 20 66 74 4b 65  on, ftExit, ftKe
23d0: 72 6e 65 6c 45 6e 64 2c 20 66 74 55 73 65 72 45  rnelEnd, ftUserE
23e0: 6e 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  nd;.    sqlite3_
23f0: 69 6e 74 36 34 20 66 74 57 61 6c 6c 45 6e 64 20  int64 ftWallEnd 
2400: 3d 20 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a 20  = timeOfDay();. 
2410: 20 20 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d     getProcessTim
2420: 65 73 41 64 64 72 28 68 50 72 6f 63 65 73 73 2c  esAddr(hProcess,
2430: 26 66 74 43 72 65 61 74 69 6f 6e 2c 26 66 74 45  &ftCreation,&ftE
2440: 78 69 74 2c 26 66 74 4b 65 72 6e 65 6c 45 6e 64  xit,&ftKernelEnd
2450: 2c 26 66 74 55 73 65 72 45 6e 64 29 3b 0a 20 20  ,&ftUserEnd);.  
2460: 20 20 70 72 69 6e 74 66 28 22 52 75 6e 20 54 69    printf("Run Ti
2470: 6d 65 3a 20 72 65 61 6c 20 25 2e 33 66 20 75 73  me: real %.3f us
2480: 65 72 20 25 66 20 73 79 73 20 25 66 5c 6e 22 2c  er %f sys %f\n",
2490: 0a 20 20 20 20 20 20 20 28 66 74 57 61 6c 6c 45  .       (ftWallE
24a0: 6e 64 20 2d 20 66 74 57 61 6c 6c 42 65 67 69 6e  nd - ftWallBegin
24b0: 29 2a 30 2e 30 30 31 2c 0a 20 20 20 20 20 20 20  )*0.001,.       
24c0: 74 69 6d 65 44 69 66 66 28 26 66 74 55 73 65 72  timeDiff(&ftUser
24d0: 42 65 67 69 6e 2c 20 26 66 74 55 73 65 72 45 6e  Begin, &ftUserEn
24e0: 64 29 2c 0a 20 20 20 20 20 20 20 74 69 6d 65 44  d),.       timeD
24f0: 69 66 66 28 26 66 74 4b 65 72 6e 65 6c 42 65 67  iff(&ftKernelBeg
2500: 69 6e 2c 20 26 66 74 4b 65 72 6e 65 6c 45 6e 64  in, &ftKernelEnd
2510: 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 64 65 66 69  ));.  }.}..#defi
2520: 6e 65 20 42 45 47 49 4e 5f 54 49 4d 45 52 20 62  ne BEGIN_TIMER b
2530: 65 67 69 6e 54 69 6d 65 72 28 29 0a 23 64 65 66  eginTimer().#def
2540: 69 6e 65 20 45 4e 44 5f 54 49 4d 45 52 20 65 6e  ine END_TIMER en
2550: 64 54 69 6d 65 72 28 29 0a 23 64 65 66 69 6e 65  dTimer().#define
2560: 20 48 41 53 5f 54 49 4d 45 52 20 68 61 73 54 69   HAS_TIMER hasTi
2570: 6d 65 72 28 29 0a 0a 23 65 6c 73 65 0a 23 64 65  mer()..#else.#de
2580: 66 69 6e 65 20 42 45 47 49 4e 5f 54 49 4d 45 52  fine BEGIN_TIMER
2590: 0a 23 64 65 66 69 6e 65 20 45 4e 44 5f 54 49 4d  .#define END_TIM
25a0: 45 52 0a 23 64 65 66 69 6e 65 20 48 41 53 5f 54  ER.#define HAS_T
25b0: 49 4d 45 52 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  IMER 0.#endif../
25c0: 2a 0a 2a 2a 20 55 73 65 64 20 74 6f 20 70 72 65  *.** Used to pre
25d0: 76 65 6e 74 20 77 61 72 6e 69 6e 67 73 20 61 62  vent warnings ab
25e0: 6f 75 74 20 75 6e 75 73 65 64 20 70 61 72 61 6d  out unused param
25f0: 65 74 65 72 73 0a 2a 2f 0a 23 64 65 66 69 6e 65  eters.*/.#define
2600: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
2610: 52 28 78 29 20 28 76 6f 69 64 29 28 78 29 0a 0a  R(x) (void)(x)..
2620: 2f 2a 0a 2a 2a 20 4e 75 6d 62 65 72 20 6f 66 20  /*.** Number of 
2630: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 6e 20 61  elements in an a
2640: 72 72 61 79 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  rray.*/.#define 
2650: 41 72 72 61 79 53 69 7a 65 28 58 29 20 20 28 69  ArraySize(X)  (i
2660: 6e 74 29 28 73 69 7a 65 6f 66 28 58 29 2f 73 69  nt)(sizeof(X)/si
2670: 7a 65 6f 66 28 58 5b 30 5d 29 29 0a 0a 2f 2a 0a  zeof(X[0]))../*.
2680: 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77  ** If the follow
2690: 69 6e 67 20 66 6c 61 67 20 69 73 20 73 65 74 2c  ing flag is set,
26a0: 20 74 68 65 6e 20 63 6f 6d 6d 61 6e 64 20 65 78   then command ex
26b0: 65 63 75 74 69 6f 6e 20 73 74 6f 70 73 0a 2a 2a  ecution stops.**
26c0: 20 61 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20   at an error if 
26d0: 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 74 65 72  we are not inter
26e0: 61 63 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69  active..*/.stati
26f0: 63 20 69 6e 74 20 62 61 69 6c 5f 6f 6e 5f 65 72  c int bail_on_er
2700: 72 6f 72 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20  ror = 0;../*.** 
2710: 54 68 72 65 61 74 20 73 74 64 69 6e 20 61 73 20  Threat stdin as 
2720: 61 6e 20 69 6e 74 65 72 61 63 74 69 76 65 20 69  an interactive i
2730: 6e 70 75 74 20 69 66 20 74 68 65 20 66 6f 6c 6c  nput if the foll
2740: 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 0a 2a  owing variable.*
2750: 2a 20 69 73 20 74 72 75 65 2e 20 20 4f 74 68 65  * is true.  Othe
2760: 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20 73 74  rwise, assume st
2770: 64 69 6e 20 69 73 20 63 6f 6e 6e 65 63 74 65 64  din is connected
2780: 20 74 6f 20 61 20 66 69 6c 65 20 6f 72 20 70 69   to a file or pi
2790: 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  pe..*/.static in
27a0: 74 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72  t stdin_is_inter
27b0: 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a 2f 2a 0a  active = 1;../*.
27c0: 2a 2a 20 4f 6e 20 57 69 6e 64 6f 77 73 20 73 79  ** On Windows sy
27d0: 73 74 65 6d 73 20 77 65 20 68 61 76 65 20 74 6f  stems we have to
27e0: 20 6b 6e 6f 77 20 69 66 20 73 74 61 6e 64 61 72   know if standar
27f0: 64 20 6f 75 74 70 75 74 20 69 73 20 61 20 63 6f  d output is a co
2800: 6e 73 6f 6c 65 0a 2a 2a 20 69 6e 20 6f 72 64 65  nsole.** in orde
2810: 72 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 55  r to translate U
2820: 54 46 2d 38 20 69 6e 74 6f 20 4d 42 43 53 2e 20  TF-8 into MBCS. 
2830: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76   The following v
2840: 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 74 72  ariable is.** tr
2850: 75 65 20 69 66 20 74 72 61 6e 73 6c 61 74 69 6f  ue if translatio
2860: 6e 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a  n is required..*
2870: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74 64  /.static int std
2880: 6f 75 74 5f 69 73 5f 63 6f 6e 73 6f 6c 65 20 3d  out_is_console =
2890: 20 31 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66   1;../*.** The f
28a0: 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 68 65 20  ollowing is the 
28b0: 6f 70 65 6e 20 53 51 4c 69 74 65 20 64 61 74 61  open SQLite data
28c0: 62 61 73 65 2e 20 20 57 65 20 6d 61 6b 65 20 61  base.  We make a
28d0: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
28e0: 68 69 73 20 64 61 74 61 62 61 73 65 20 61 20 73  his database a s
28f0: 74 61 74 69 63 20 76 61 72 69 61 62 6c 65 20 73  tatic variable s
2900: 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65  o that it can be
2910: 20 61 63 63 65 73 73 65 64 0a 2a 2a 20 62 79 20   accessed.** by 
2920: 74 68 65 20 53 49 47 49 4e 54 20 68 61 6e 64 6c  the SIGINT handl
2930: 65 72 20 74 6f 20 69 6e 74 65 72 72 75 70 74 20  er to interrupt 
2940: 64 61 74 61 62 61 73 65 20 70 72 6f 63 65 73 73  database process
2950: 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73  ing..*/.static s
2960: 71 6c 69 74 65 33 20 2a 67 6c 6f 62 61 6c 44 62  qlite3 *globalDb
2970: 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75   = 0;../*.** Tru
2980: 65 20 69 66 20 61 6e 20 69 6e 74 65 72 72 75 70  e if an interrup
2990: 74 20 28 43 6f 6e 74 72 6f 6c 2d 43 29 20 68 61  t (Control-C) ha
29a0: 73 20 62 65 65 6e 20 72 65 63 65 69 76 65 64 2e  s been received.
29b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 6c 61 74  .*/.static volat
29c0: 69 6c 65 20 69 6e 74 20 73 65 65 6e 49 6e 74 65  ile int seenInte
29d0: 72 72 75 70 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  rrupt = 0;../*.*
29e0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 6e 61  * This is the na
29f0: 6d 65 20 6f 66 20 6f 75 72 20 70 72 6f 67 72 61  me of our progra
2a00: 6d 2e 20 49 74 20 69 73 20 73 65 74 20 69 6e 20  m. It is set in 
2a10: 6d 61 69 6e 28 29 2c 20 75 73 65 64 0a 2a 2a 20  main(), used.** 
2a20: 69 6e 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 6f  in a number of o
2a30: 74 68 65 72 20 70 6c 61 63 65 73 2c 20 6d 6f 73  ther places, mos
2a40: 74 6c 79 20 66 6f 72 20 65 72 72 6f 72 20 6d 65  tly for error me
2a50: 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ssages..*/.stati
2a60: 63 20 63 68 61 72 20 2a 41 72 67 76 30 3b 0a 0a  c char *Argv0;..
2a70: 2f 2a 0a 2a 2a 20 50 72 6f 6d 70 74 20 73 74 72  /*.** Prompt str
2a80: 69 6e 67 73 2e 20 49 6e 69 74 69 61 6c 69 7a 65  ings. Initialize
2a90: 64 20 69 6e 20 6d 61 69 6e 2e 20 53 65 74 74 61  d in main. Setta
2aa0: 62 6c 65 20 77 69 74 68 0a 2a 2a 20 20 20 2e 70  ble with.**   .p
2ab0: 72 6f 6d 70 74 20 6d 61 69 6e 20 63 6f 6e 74 69  rompt main conti
2ac0: 6e 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  nue.*/.static ch
2ad0: 61 72 20 6d 61 69 6e 50 72 6f 6d 70 74 5b 32 30  ar mainPrompt[20
2ae0: 5d 3b 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20  ];     /* First 
2af0: 6c 69 6e 65 20 70 72 6f 6d 70 74 2e 20 64 65 66  line prompt. def
2b00: 61 75 6c 74 3a 20 22 73 71 6c 69 74 65 3e 20 22  ault: "sqlite> "
2b10: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 63  */.static char c
2b20: 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 5b 32 30  ontinuePrompt[20
2b30: 5d 3b 20 2f 2a 20 43 6f 6e 74 69 6e 75 61 74 69  ]; /* Continuati
2b40: 6f 6e 20 70 72 6f 6d 70 74 2e 20 64 65 66 61 75  on prompt. defau
2b50: 6c 74 3a 20 22 20 20 20 2e 2e 2e 3e 20 22 20 2a  lt: "   ...> " *
2b60: 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e 64 65 72 20  /../*.** Render 
2b70: 6f 75 74 70 75 74 20 6c 69 6b 65 20 66 70 72 69  output like fpri
2b80: 6e 74 66 28 29 2e 20 20 45 78 63 65 70 74 2c 20  ntf().  Except, 
2b90: 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73  if the output is
2ba0: 20 67 6f 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a   going to the.**
2bb0: 20 63 6f 6e 73 6f 6c 65 20 61 6e 64 20 69 66 20   console and if 
2bc0: 74 68 69 73 20 69 73 20 72 75 6e 6e 69 6e 67 20  this is running 
2bd0: 6f 6e 20 61 20 57 69 6e 64 6f 77 73 20 6d 61 63  on a Windows mac
2be0: 68 69 6e 65 2c 20 74 72 61 6e 73 6c 61 74 65 20  hine, translate 
2bf0: 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 66 72  the.** output fr
2c00: 6f 6d 20 55 54 46 2d 38 20 69 6e 74 6f 20 4d 42  om UTF-8 into MB
2c10: 43 53 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  CS..*/.#if defin
2c20: 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65  ed(_WIN32) || de
2c30: 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 76 6f 69  fined(WIN32).voi
2c40: 64 20 75 74 66 38 5f 70 72 69 6e 74 66 28 46 49  d utf8_printf(FI
2c50: 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63  LE *out, const c
2c60: 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e  har *zFormat, ..
2c70: 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70  .){.  va_list ap
2c80: 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c  ;.  va_start(ap,
2c90: 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 69 66 28   zFormat);.  if(
2ca0: 20 73 74 64 6f 75 74 5f 69 73 5f 63 6f 6e 73 6f   stdout_is_conso
2cb0: 6c 65 20 26 26 20 28 6f 75 74 3d 3d 73 74 64 6f  le && (out==stdo
2cc0: 75 74 20 7c 7c 20 6f 75 74 3d 3d 73 74 64 65 72  ut || out==stder
2cd0: 72 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  r) ){.    char *
2ce0: 7a 31 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70  z1 = sqlite3_vmp
2cf0: 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61  rintf(zFormat, a
2d00: 70 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 32  p);.    char *z2
2d10: 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   = sqlite3_win32
2d20: 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 5f 76 32  _utf8_to_mbcs_v2
2d30: 28 7a 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  (z1, 0);.    sql
2d40: 69 74 65 33 5f 66 72 65 65 28 7a 31 29 3b 0a 20  ite3_free(z1);. 
2d50: 20 20 20 66 70 75 74 73 28 7a 32 2c 20 6f 75 74     fputs(z2, out
2d60: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
2d70: 72 65 65 28 7a 32 29 3b 0a 20 20 7d 65 6c 73 65  ree(z2);.  }else
2d80: 7b 0a 20 20 20 20 76 66 70 72 69 6e 74 66 28 6f  {.    vfprintf(o
2d90: 75 74 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29  ut, zFormat, ap)
2da0: 3b 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61  ;.  }.  va_end(a
2db0: 70 29 3b 0a 7d 0a 23 65 6c 69 66 20 21 64 65 66  p);.}.#elif !def
2dc0: 69 6e 65 64 28 75 74 66 38 5f 70 72 69 6e 74 66  ined(utf8_printf
2dd0: 29 0a 23 20 64 65 66 69 6e 65 20 75 74 66 38 5f  ).# define utf8_
2de0: 70 72 69 6e 74 66 20 66 70 72 69 6e 74 66 0a 23  printf fprintf.#
2df0: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e  endif../*.** Ren
2e00: 64 65 72 20 6f 75 74 70 75 74 20 6c 69 6b 65 20  der output like 
2e10: 66 70 72 69 6e 74 66 28 29 2e 20 20 54 68 69 73  fprintf().  This
2e20: 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 75   should not be u
2e30: 73 65 64 20 6f 6e 20 61 6e 79 74 68 69 6e 67 20  sed on anything 
2e40: 74 68 61 74 0a 2a 2a 20 69 6e 63 6c 75 64 65 73  that.** includes
2e50: 20 73 74 72 69 6e 67 20 66 6f 72 6d 61 74 74 69   string formatti
2e60: 6e 67 20 28 65 2e 67 2e 20 22 25 73 22 29 2e 0a  ng (e.g. "%s")..
2e70: 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  */.#if !defined(
2e80: 72 61 77 5f 70 72 69 6e 74 66 29 0a 23 20 64 65  raw_printf).# de
2e90: 66 69 6e 65 20 72 61 77 5f 70 72 69 6e 74 66 20  fine raw_printf 
2ea0: 66 70 72 69 6e 74 66 0a 23 65 6e 64 69 66 0a 0a  fprintf.#endif..
2eb0: 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 49 2f 4f 20  /*.** Write I/O 
2ec0: 74 72 61 63 65 73 20 74 6f 20 74 68 65 20 66 6f  traces to the fo
2ed0: 6c 6c 6f 77 69 6e 67 20 73 74 72 65 61 6d 2e 0a  llowing stream..
2ee0: 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  */.#ifdef SQLITE
2ef0: 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 0a  _ENABLE_IOTRACE.
2f00: 73 74 61 74 69 63 20 46 49 4c 45 20 2a 69 6f 74  static FILE *iot
2f10: 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66  race = 0;.#endif
2f20: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
2f30: 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20  tine works like 
2f40: 70 72 69 6e 74 66 20 69 6e 20 74 68 61 74 20 69  printf in that i
2f50: 74 73 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e  ts first argumen
2f60: 74 20 69 73 20 61 0a 2a 2a 20 66 6f 72 6d 61 74  t is a.** format
2f70: 20 73 74 72 69 6e 67 20 61 6e 64 20 73 75 62 73   string and subs
2f80: 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73  equent arguments
2f90: 20 61 72 65 20 76 61 6c 75 65 73 20 74 6f 20 62   are values to b
2fa0: 65 20 73 75 62 73 74 69 74 75 74 65 64 0a 2a 2a  e substituted.**
2fb0: 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 25 20 66   in place of % f
2fc0: 69 65 6c 64 73 2e 20 20 54 68 65 20 72 65 73 75  ields.  The resu
2fd0: 6c 74 20 6f 66 20 66 6f 72 6d 61 74 74 69 6e 67  lt of formatting
2fe0: 20 74 68 69 73 20 73 74 72 69 6e 67 0a 2a 2a 20   this string.** 
2ff0: 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 69 6f  is written to io
3000: 74 72 61 63 65 2e 0a 2a 2f 0a 23 69 66 64 65 66  trace..*/.#ifdef
3010: 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49   SQLITE_ENABLE_I
3020: 4f 54 52 41 43 45 0a 73 74 61 74 69 63 20 76 6f  OTRACE.static vo
3030: 69 64 20 53 51 4c 49 54 45 5f 43 44 45 43 4c 20  id SQLITE_CDECL 
3040: 69 6f 74 72 61 63 65 50 72 69 6e 74 66 28 63 6f  iotracePrintf(co
3050: 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  nst char *zForma
3060: 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69  t, ...){.  va_li
3070: 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a  st ap;.  char *z
3080: 3b 0a 20 20 69 66 28 20 69 6f 74 72 61 63 65 3d  ;.  if( iotrace=
3090: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 76  =0 ) return;.  v
30a0: 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72  a_start(ap, zFor
30b0: 6d 61 74 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69  mat);.  z = sqli
30c0: 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f  te3_vmprintf(zFo
30d0: 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f  rmat, ap);.  va_
30e0: 65 6e 64 28 61 70 29 3b 0a 20 20 75 74 66 38 5f  end(ap);.  utf8_
30f0: 70 72 69 6e 74 66 28 69 6f 74 72 61 63 65 2c 20  printf(iotrace, 
3100: 22 25 73 22 2c 20 7a 29 3b 0a 20 20 73 71 6c 69  "%s", z);.  sqli
3110: 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 7d 0a 23  te3_free(z);.}.#
3120: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74  endif../*.** Out
3130: 70 75 74 20 73 74 72 69 6e 67 20 7a 55 74 66 20  put string zUtf 
3140: 74 6f 20 73 74 72 65 61 6d 20 70 4f 75 74 20 61  to stream pOut a
3150: 73 20 77 20 63 68 61 72 61 63 74 65 72 73 2e 20  s w characters. 
3160: 20 49 66 20 77 20 69 73 20 6e 65 67 61 74 69 76   If w is negativ
3170: 65 2c 0a 2a 2a 20 74 68 65 6e 20 72 69 67 68 74  e,.** then right
3180: 2d 6a 75 73 74 69 66 79 20 74 68 65 20 74 65 78  -justify the tex
3190: 74 2e 20 20 57 20 69 73 20 74 68 65 20 77 69 64  t.  W is the wid
31a0: 74 68 20 69 6e 20 55 54 46 2d 38 20 63 68 61 72  th in UTF-8 char
31b0: 61 63 74 65 72 73 2c 20 6e 6f 74 0a 2a 2a 20 69  acters, not.** i
31c0: 6e 20 62 79 74 65 73 2e 20 20 54 68 69 73 20 69  n bytes.  This i
31d0: 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  s different from
31e0: 20 74 68 65 20 25 2a 2e 2a 73 20 73 70 65 63 69   the %*.*s speci
31f0: 66 69 63 61 74 69 6f 6e 20 69 6e 20 70 72 69 6e  fication in prin
3200: 74 66 0a 2a 2a 20 73 69 6e 63 65 20 77 69 74 68  tf.** since with
3210: 20 25 2a 2e 2a 73 20 74 68 65 20 77 69 64 74 68   %*.*s the width
3220: 20 69 73 20 6d 65 61 73 75 72 65 64 20 69 6e 20   is measured in 
3230: 62 79 74 65 73 2c 20 6e 6f 74 20 63 68 61 72 61  bytes, not chara
3240: 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  cters..*/.static
3250: 20 76 6f 69 64 20 75 74 66 38 5f 77 69 64 74 68   void utf8_width
3260: 5f 70 72 69 6e 74 28 46 49 4c 45 20 2a 70 4f 75  _print(FILE *pOu
3270: 74 2c 20 69 6e 74 20 77 2c 20 63 6f 6e 73 74 20  t, int w, const 
3280: 63 68 61 72 20 2a 7a 55 74 66 29 7b 0a 20 20 69  char *zUtf){.  i
3290: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20  nt i;.  int n;. 
32a0: 20 69 6e 74 20 61 77 20 3d 20 77 3c 30 20 3f 20   int aw = w<0 ? 
32b0: 2d 77 20 3a 20 77 3b 0a 20 20 63 68 61 72 20 7a  -w : w;.  char z
32c0: 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20 69 66 28  Buf[1000];.  if(
32d0: 20 61 77 3e 28 69 6e 74 29 73 69 7a 65 6f 66 28   aw>(int)sizeof(
32e0: 7a 42 75 66 29 2f 33 20 29 20 61 77 20 3d 20 28  zBuf)/3 ) aw = (
32f0: 69 6e 74 29 73 69 7a 65 6f 66 28 7a 42 75 66 29  int)sizeof(zBuf)
3300: 2f 33 3b 0a 20 20 66 6f 72 28 69 3d 6e 3d 30 3b  /3;.  for(i=n=0;
3310: 20 7a 55 74 66 5b 69 5d 3b 20 69 2b 2b 29 7b 0a   zUtf[i]; i++){.
3320: 20 20 20 20 69 66 28 20 28 7a 55 74 66 5b 69 5d      if( (zUtf[i]
3330: 26 30 78 63 30 29 21 3d 30 78 38 30 20 29 7b 0a  &0xc0)!=0x80 ){.
3340: 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20        n++;.     
3350: 20 69 66 28 20 6e 3d 3d 61 77 20 29 7b 0a 20 20   if( n==aw ){.  
3360: 20 20 20 20 20 20 64 6f 7b 20 69 2b 2b 3b 20 7d        do{ i++; }
3370: 77 68 69 6c 65 28 20 28 7a 55 74 66 5b 69 5d 26  while( (zUtf[i]&
3380: 30 78 63 30 29 3d 3d 30 78 38 30 20 29 3b 0a 20  0xc0)==0x80 );. 
3390: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
33a0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
33b0: 20 20 69 66 28 20 6e 3e 3d 61 77 20 29 7b 0a 20    if( n>=aw ){. 
33c0: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
33d0: 4f 75 74 2c 20 22 25 2e 2a 73 22 2c 20 69 2c 20  Out, "%.*s", i, 
33e0: 7a 55 74 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69  zUtf);.  }else i
33f0: 66 28 20 77 3c 30 20 29 7b 0a 20 20 20 20 75 74  f( w<0 ){.    ut
3400: 66 38 5f 70 72 69 6e 74 66 28 70 4f 75 74 2c 20  f8_printf(pOut, 
3410: 22 25 2a 73 25 73 22 2c 20 61 77 2d 6e 2c 20 22  "%*s%s", aw-n, "
3420: 22 2c 20 7a 55 74 66 29 3b 0a 20 20 7d 65 6c 73  ", zUtf);.  }els
3430: 65 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  e{.    utf8_prin
3440: 74 66 28 70 4f 75 74 2c 20 22 25 73 25 2a 73 22  tf(pOut, "%s%*s"
3450: 2c 20 7a 55 74 66 2c 20 61 77 2d 6e 2c 20 22 22  , zUtf, aw-n, ""
3460: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
3470: 20 44 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61   Determines if a
3480: 20 73 74 72 69 6e 67 20 69 73 20 61 20 6e 75 6d   string is a num
3490: 62 65 72 20 6f 66 20 6e 6f 74 2e 0a 2a 2f 0a 73  ber of not..*/.s
34a0: 74 61 74 69 63 20 69 6e 74 20 69 73 4e 75 6d 62  tatic int isNumb
34b0: 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  er(const char *z
34c0: 2c 20 69 6e 74 20 2a 72 65 61 6c 6e 75 6d 29 7b  , int *realnum){
34d0: 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2d 27 20 7c  .  if( *z=='-' |
34e0: 7c 20 2a 7a 3d 3d 27 2b 27 20 29 20 7a 2b 2b 3b  | *z=='+' ) z++;
34f0: 0a 20 20 69 66 28 20 21 49 73 44 69 67 69 74 28  .  if( !IsDigit(
3500: 2a 7a 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72  *z) ){.    retur
3510: 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 2b 2b 3b 0a  n 0;.  }.  z++;.
3520: 20 20 69 66 28 20 72 65 61 6c 6e 75 6d 20 29 20    if( realnum ) 
3530: 2a 72 65 61 6c 6e 75 6d 20 3d 20 30 3b 0a 20 20  *realnum = 0;.  
3540: 77 68 69 6c 65 28 20 49 73 44 69 67 69 74 28 2a  while( IsDigit(*
3550: 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 69  z) ){ z++; }.  i
3560: 66 28 20 2a 7a 3d 3d 27 2e 27 20 29 7b 0a 20 20  f( *z=='.' ){.  
3570: 20 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 21    z++;.    if( !
3580: 49 73 44 69 67 69 74 28 2a 7a 29 20 29 20 72 65  IsDigit(*z) ) re
3590: 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c  turn 0;.    whil
35a0: 65 28 20 49 73 44 69 67 69 74 28 2a 7a 29 20 29  e( IsDigit(*z) )
35b0: 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28  { z++; }.    if(
35c0: 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c   realnum ) *real
35d0: 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69  num = 1;.  }.  i
35e0: 66 28 20 2a 7a 3d 3d 27 65 27 20 7c 7c 20 2a 7a  f( *z=='e' || *z
35f0: 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20 7a 2b 2b  =='E' ){.    z++
3600: 3b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2b  ;.    if( *z=='+
3610: 27 20 7c 7c 20 2a 7a 3d 3d 27 2d 27 20 29 20 7a  ' || *z=='-' ) z
3620: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 21 49 73 44  ++;.    if( !IsD
3630: 69 67 69 74 28 2a 7a 29 20 29 20 72 65 74 75 72  igit(*z) ) retur
3640: 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  n 0;.    while( 
3650: 49 73 44 69 67 69 74 28 2a 7a 29 20 29 7b 20 7a  IsDigit(*z) ){ z
3660: 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 72 65  ++; }.    if( re
3670: 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c 6e 75 6d  alnum ) *realnum
3680: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 1;.  }.  retu
3690: 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  rn *z==0;.}../*.
36a0: 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72  ** Compute a str
36b0: 69 6e 67 20 6c 65 6e 67 74 68 20 74 68 61 74 20  ing length that 
36c0: 69 73 20 6c 69 6d 69 74 65 64 20 74 6f 20 77 68  is limited to wh
36d0: 61 74 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64  at can be stored
36e0: 20 69 6e 0a 2a 2a 20 6c 6f 77 65 72 20 33 30 20   in.** lower 30 
36f0: 62 69 74 73 20 6f 66 20 61 20 33 32 2d 62 69 74  bits of a 32-bit
3700: 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e   signed integer.
3710: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
3720: 74 72 6c 65 6e 33 30 28 63 6f 6e 73 74 20 63 68  trlen30(const ch
3730: 61 72 20 2a 7a 29 7b 0a 20 20 63 6f 6e 73 74 20  ar *z){.  const 
3740: 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b 0a 20 20  char *z2 = z;.  
3750: 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b 20 7a 32  while( *z2 ){ z2
3760: 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ++; }.  return 0
3770: 78 33 66 66 66 66 66 66 66 20 26 20 28 69 6e 74  x3fffffff & (int
3780: 29 28 7a 32 20 2d 20 7a 29 3b 0a 7d 0a 0a 2f 2a  )(z2 - z);.}../*
3790: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c  .** Return the l
37a0: 65 6e 67 74 68 20 6f 66 20 61 20 73 74 72 69 6e  ength of a strin
37b0: 67 20 69 6e 20 63 68 61 72 61 63 74 65 72 73 2e  g in characters.
37c0: 20 20 4d 75 6c 74 69 62 79 74 65 20 55 54 46 38    Multibyte UTF8
37d0: 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a 20 63   characters.** c
37e0: 6f 75 6e 74 20 61 73 20 61 20 73 69 6e 67 6c 65  ount as a single
37f0: 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73   character..*/.s
3800: 74 61 74 69 63 20 69 6e 74 20 73 74 72 6c 65 6e  tatic int strlen
3810: 43 68 61 72 28 63 6f 6e 73 74 20 63 68 61 72 20  Char(const char 
3820: 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30  *z){.  int n = 0
3830: 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b  ;.  while( *z ){
3840: 0a 20 20 20 20 69 66 28 20 28 30 78 63 30 26 2a  .    if( (0xc0&*
3850: 28 7a 2b 2b 29 29 21 3d 30 78 38 30 20 29 20 6e  (z++))!=0x80 ) n
3860: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
3870: 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69   n;.}../*.** Thi
3880: 73 20 72 6f 75 74 69 6e 65 20 72 65 61 64 73 20  s routine reads 
3890: 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 20 66  a line of text f
38a0: 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73 74 6f  rom FILE in, sto
38b0: 72 65 73 0a 2a 2a 20 74 68 65 20 74 65 78 74 20  res.** the text 
38c0: 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
38d0: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29  ed from malloc()
38e0: 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 70   and returns a p
38f0: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65  ointer.** to the
3900: 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69 73 20   text.  NULL is 
3910: 72 65 74 75 72 6e 65 64 20 61 74 20 65 6e 64 20  returned at end 
3920: 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69 66 20 6d  of file, or if m
3930: 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69 6c 73  alloc().** fails
3940: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4c 69 6e 65  ..**.** If zLine
3950: 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65   is not NULL the
3960: 6e 20 69 74 20 69 73 20 61 20 6d 61 6c 6c 6f 63  n it is a malloc
3970: 65 64 20 62 75 66 66 65 72 20 72 65 74 75 72 6e  ed buffer return
3980: 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 65  ed from.** a pre
3990: 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20 74 68  vious call to th
39a0: 69 73 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20  is routine that 
39b0: 6d 61 79 20 62 65 20 72 65 75 73 65 64 2e 0a 2a  may be reused..*
39c0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6c  /.static char *l
39d0: 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63 68 61  ocal_getline(cha
39e0: 72 20 2a 7a 4c 69 6e 65 2c 20 46 49 4c 45 20 2a  r *zLine, FILE *
39f0: 69 6e 29 7b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65  in){.  int nLine
3a00: 20 3d 20 7a 4c 69 6e 65 3d 3d 30 20 3f 20 30 20   = zLine==0 ? 0 
3a10: 3a 20 31 30 30 3b 0a 20 20 69 6e 74 20 6e 20 3d  : 100;.  int n =
3a20: 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20   0;..  while( 1 
3a30: 29 7b 0a 20 20 20 20 69 66 28 20 6e 2b 31 30 30  ){.    if( n+100
3a40: 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20 20  >nLine ){.      
3a50: 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65 2a 32 20  nLine = nLine*2 
3a60: 2b 20 31 30 30 3b 0a 20 20 20 20 20 20 7a 4c 69  + 100;.      zLi
3a70: 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 7a 4c 69  ne = realloc(zLi
3a80: 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20  ne, nLine);.    
3a90: 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29    if( zLine==0 )
3aa0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
3ab0: 0a 20 20 20 20 69 66 28 20 66 67 65 74 73 28 26  .    if( fgets(&
3ac0: 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20  zLine[n], nLine 
3ad0: 2d 20 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20  - n, in)==0 ){. 
3ae0: 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b       if( n==0 ){
3af0: 0a 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 4c  .        free(zL
3b00: 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ine);.        re
3b10: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
3b20: 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d        zLine[n] =
3b30: 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   0;.      break;
3b40: 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
3b50: 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29 20 6e 2b 2b  ( zLine[n] ) n++
3b60: 3b 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26  ;.    if( n>0 &&
3b70: 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e   zLine[n-1]=='\n
3b80: 27 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a  ' ){.      n--;.
3b90: 20 20 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26        if( n>0 &&
3ba0: 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 72   zLine[n-1]=='\r
3bb0: 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a  ' ) n--;.      z
3bc0: 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20  Line[n] = 0;.   
3bd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3be0: 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28    }.#if defined(
3bf0: 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e  _WIN32) || defin
3c00: 65 64 28 57 49 4e 33 32 29 0a 20 20 2f 2a 20 46  ed(WIN32).  /* F
3c10: 6f 72 20 69 6e 74 65 72 61 63 74 69 76 65 20 69  or interactive i
3c20: 6e 70 75 74 20 6f 6e 20 57 69 6e 64 6f 77 73 20  nput on Windows 
3c30: 73 79 73 74 65 6d 73 2c 20 74 72 61 6e 73 6c 61  systems, transla
3c40: 74 65 20 74 68 65 0a 20 20 2a 2a 20 6d 75 6c 74  te the.  ** mult
3c50: 69 2d 62 79 74 65 20 63 68 61 72 61 63 74 65 72  i-byte character
3c60: 73 65 74 20 63 68 61 72 61 63 74 65 72 73 20 69  set characters i
3c70: 6e 74 6f 20 55 54 46 2d 38 2e 20 2a 2f 0a 20 20  nto UTF-8. */.  
3c80: 69 66 28 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74  if( stdin_is_int
3c90: 65 72 61 63 74 69 76 65 20 26 26 20 69 6e 3d 3d  eractive && in==
3ca0: 73 74 64 69 6e 20 29 7b 0a 20 20 20 20 63 68 61  stdin ){.    cha
3cb0: 72 20 2a 7a 54 72 61 6e 73 20 3d 20 73 71 6c 69  r *zTrans = sqli
3cc0: 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74  te3_win32_mbcs_t
3cd0: 6f 5f 75 74 66 38 5f 76 32 28 7a 4c 69 6e 65 2c  o_utf8_v2(zLine,
3ce0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 72   0);.    if( zTr
3cf0: 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ans ){.      int
3d00: 20 6e 54 72 61 6e 73 20 3d 20 73 74 72 6c 65 6e   nTrans = strlen
3d10: 33 30 28 7a 54 72 61 6e 73 29 2b 31 3b 0a 20 20  30(zTrans)+1;.  
3d20: 20 20 20 20 69 66 28 20 6e 54 72 61 6e 73 3e 6e      if( nTrans>n
3d30: 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Line ){.        
3d40: 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28  zLine = realloc(
3d50: 7a 4c 69 6e 65 2c 20 6e 54 72 61 6e 73 29 3b 0a  zLine, nTrans);.
3d60: 20 20 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e          if( zLin
3d70: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
3d80: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
3d90: 54 72 61 6e 73 29 3b 0a 20 20 20 20 20 20 20 20  Trans);.        
3da0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
3db0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
3dc0: 20 20 20 20 6d 65 6d 63 70 79 28 7a 4c 69 6e 65      memcpy(zLine
3dd0: 2c 20 7a 54 72 61 6e 73 2c 20 6e 54 72 61 6e 73  , zTrans, nTrans
3de0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
3df0: 5f 66 72 65 65 28 7a 54 72 61 6e 73 29 3b 0a 20  _free(zTrans);. 
3e00: 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20     }.  }.#endif 
3e10: 2f 2a 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  /* defined(_WIN3
3e20: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49  2) || defined(WI
3e30: 4e 33 32 29 20 2a 2f 0a 20 20 72 65 74 75 72 6e  N32) */.  return
3e40: 20 7a 4c 69 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   zLine;.}../*.**
3e50: 20 52 65 74 72 69 65 76 65 20 61 20 73 69 6e 67   Retrieve a sing
3e60: 6c 65 20 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74  le line of input
3e70: 20 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   text..**.** If 
3e80: 69 6e 3d 3d 30 20 74 68 65 6e 20 72 65 61 64 20  in==0 then read 
3e90: 66 72 6f 6d 20 73 74 61 6e 64 61 72 64 20 69 6e  from standard in
3ea0: 70 75 74 20 61 6e 64 20 70 72 6f 6d 70 74 20 62  put and prompt b
3eb0: 65 66 6f 72 65 20 65 61 63 68 20 6c 69 6e 65 2e  efore each line.
3ec0: 0a 2a 2a 20 49 66 20 69 73 43 6f 6e 74 69 6e 75  .** If isContinu
3ed0: 61 74 69 6f 6e 20 69 73 20 74 72 75 65 2c 20 74  ation is true, t
3ee0: 68 65 6e 20 61 20 63 6f 6e 74 69 6e 75 61 74 69  hen a continuati
3ef0: 6f 6e 20 70 72 6f 6d 70 74 20 69 73 20 61 70 70  on prompt is app
3f00: 72 6f 70 72 69 61 74 65 2e 0a 2a 2a 20 49 66 20  ropriate..** If 
3f10: 69 73 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 69  isContinuation i
3f20: 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65  s zero, then the
3f30: 20 6d 61 69 6e 20 70 72 6f 6d 70 74 20 73 68 6f   main prompt sho
3f40: 75 6c 64 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a  uld be used..**.
3f50: 2a 2a 20 49 66 20 7a 50 72 69 6f 72 20 69 73 20  ** If zPrior is 
3f60: 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74  not NULL then it
3f70: 20 69 73 20 61 20 62 75 66 66 65 72 20 66 72 6f   is a buffer fro
3f80: 6d 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74  m a prior call t
3f90: 6f 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  o this.** routin
3fa0: 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 72 65  e that can be re
3fb0: 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  used..**.** The 
3fc0: 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64  result is stored
3fd0: 20 69 6e 20 73 70 61 63 65 20 6f 62 74 61 69 6e   in space obtain
3fe0: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29  ed from malloc()
3ff0: 20 61 6e 64 20 6d 75 73 74 20 65 69 74 68 65 72   and must either
4000: 0a 2a 2a 20 62 65 20 66 72 65 65 64 20 62 79 20  .** be freed by 
4010: 74 68 65 20 63 61 6c 6c 65 72 20 6f 72 20 65 6c  the caller or el
4020: 73 65 20 70 61 73 73 65 64 20 62 61 63 6b 20 69  se passed back i
4030: 6e 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65  nto this routine
4040: 20 76 69 61 20 74 68 65 0a 2a 2a 20 7a 50 72 69   via the.** zPri
4050: 6f 72 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20  or argument for 
4060: 72 65 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  reuse..*/.static
4070: 20 63 68 61 72 20 2a 6f 6e 65 5f 69 6e 70 75 74   char *one_input
4080: 5f 6c 69 6e 65 28 46 49 4c 45 20 2a 69 6e 2c 20  _line(FILE *in, 
4090: 63 68 61 72 20 2a 7a 50 72 69 6f 72 2c 20 69 6e  char *zPrior, in
40a0: 74 20 69 73 43 6f 6e 74 69 6e 75 61 74 69 6f 6e  t isContinuation
40b0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f 6d  ){.  char *zProm
40c0: 70 74 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 73  pt;.  char *zRes
40d0: 75 6c 74 3b 0a 20 20 69 66 28 20 69 6e 21 3d 30  ult;.  if( in!=0
40e0: 20 29 7b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20   ){.    zResult 
40f0: 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28  = local_getline(
4100: 7a 50 72 69 6f 72 2c 20 69 6e 29 3b 0a 20 20 7d  zPrior, in);.  }
4110: 65 6c 73 65 7b 0a 20 20 20 20 7a 50 72 6f 6d 70  else{.    zPromp
4120: 74 20 3d 20 69 73 43 6f 6e 74 69 6e 75 61 74 69  t = isContinuati
4130: 6f 6e 20 3f 20 63 6f 6e 74 69 6e 75 65 50 72 6f  on ? continuePro
4140: 6d 70 74 20 3a 20 6d 61 69 6e 50 72 6f 6d 70 74  mpt : mainPrompt
4150: 3b 0a 23 69 66 20 53 48 45 4c 4c 5f 55 53 45 5f  ;.#if SHELL_USE_
4160: 4c 4f 43 41 4c 5f 47 45 54 4c 49 4e 45 0a 20 20  LOCAL_GETLINE.  
4170: 20 20 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a    printf("%s", z
4180: 50 72 6f 6d 70 74 29 3b 0a 20 20 20 20 66 66 6c  Prompt);.    ffl
4190: 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20  ush(stdout);.   
41a0: 20 7a 52 65 73 75 6c 74 20 3d 20 6c 6f 63 61 6c   zResult = local
41b0: 5f 67 65 74 6c 69 6e 65 28 7a 50 72 69 6f 72 2c  _getline(zPrior,
41c0: 20 73 74 64 69 6e 29 3b 0a 23 65 6c 73 65 0a 20   stdin);.#else. 
41d0: 20 20 20 66 72 65 65 28 7a 50 72 69 6f 72 29 3b     free(zPrior);
41e0: 0a 20 20 20 20 7a 52 65 73 75 6c 74 20 3d 20 73  .    zResult = s
41f0: 68 65 6c 6c 5f 72 65 61 64 6c 69 6e 65 28 7a 50  hell_readline(zP
4200: 72 6f 6d 70 74 29 3b 0a 20 20 20 20 69 66 28 20  rompt);.    if( 
4210: 7a 52 65 73 75 6c 74 20 26 26 20 2a 7a 52 65 73  zResult && *zRes
4220: 75 6c 74 20 29 20 73 68 65 6c 6c 5f 61 64 64 5f  ult ) shell_add_
4230: 68 69 73 74 6f 72 79 28 7a 52 65 73 75 6c 74 29  history(zResult)
4240: 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72  ;.#endif.  }.  r
4250: 65 74 75 72 6e 20 7a 52 65 73 75 6c 74 3b 0a 7d  eturn zResult;.}
4260: 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
4270: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20 68  the value of a h
4280: 65 78 61 64 65 63 69 6d 61 6c 20 64 69 67 69 74  exadecimal digit
4290: 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66 20  .  Return -1 if 
42a0: 74 68 65 20 69 6e 70 75 74 0a 2a 2a 20 69 73 20  the input.** is 
42b0: 6e 6f 74 20 61 20 68 65 78 20 64 69 67 69 74 2e  not a hex digit.
42c0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
42d0: 65 78 44 69 67 69 74 56 61 6c 75 65 28 63 68 61  exDigitValue(cha
42e0: 72 20 63 29 7b 0a 20 20 69 66 28 20 63 3e 3d 27  r c){.  if( c>='
42f0: 30 27 20 26 26 20 63 3c 3d 27 39 27 20 29 20 72  0' && c<='9' ) r
4300: 65 74 75 72 6e 20 63 20 2d 20 27 30 27 3b 0a 20  eturn c - '0';. 
4310: 20 69 66 28 20 63 3e 3d 27 61 27 20 26 26 20 63   if( c>='a' && c
4320: 3c 3d 27 66 27 20 29 20 72 65 74 75 72 6e 20 63  <='f' ) return c
4330: 20 2d 20 27 61 27 20 2b 20 31 30 3b 0a 20 20 69   - 'a' + 10;.  i
4340: 66 28 20 63 3e 3d 27 41 27 20 26 26 20 63 3c 3d  f( c>='A' && c<=
4350: 27 46 27 20 29 20 72 65 74 75 72 6e 20 63 20 2d  'F' ) return c -
4360: 20 27 41 27 20 2b 20 31 30 3b 0a 20 20 72 65 74   'A' + 10;.  ret
4370: 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn -1;.}../*.**
4380: 20 49 6e 74 65 72 70 72 65 74 20 7a 41 72 67 20   Interpret zArg 
4390: 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61  as an integer va
43a0: 6c 75 65 2c 20 70 6f 73 73 69 62 6c 79 20 77 69  lue, possibly wi
43b0: 74 68 20 73 75 66 66 69 78 65 73 2e 0a 2a 2f 0a  th suffixes..*/.
43c0: 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69  static sqlite3_i
43d0: 6e 74 36 34 20 69 6e 74 65 67 65 72 56 61 6c 75  nt64 integerValu
43e0: 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41  e(const char *zA
43f0: 72 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69  rg){.  sqlite3_i
4400: 6e 74 36 34 20 76 20 3d 20 30 3b 0a 20 20 73 74  nt64 v = 0;.  st
4410: 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
4420: 74 20 7b 20 63 68 61 72 20 2a 7a 53 75 66 66 69  t { char *zSuffi
4430: 78 3b 20 69 6e 74 20 69 4d 75 6c 74 3b 20 7d 20  x; int iMult; } 
4440: 61 4d 75 6c 74 5b 5d 20 3d 20 7b 0a 20 20 20 20  aMult[] = {.    
4450: 7b 20 22 4b 69 42 22 2c 20 31 30 32 34 20 7d 2c  { "KiB", 1024 },
4460: 0a 20 20 20 20 7b 20 22 4d 69 42 22 2c 20 31 30  .    { "MiB", 10
4470: 32 34 2a 31 30 32 34 20 7d 2c 0a 20 20 20 20 7b  24*1024 },.    {
4480: 20 22 47 69 42 22 2c 20 31 30 32 34 2a 31 30 32   "GiB", 1024*102
4490: 34 2a 31 30 32 34 20 7d 2c 0a 20 20 20 20 7b 20  4*1024 },.    { 
44a0: 22 4b 42 22 2c 20 20 31 30 30 30 20 7d 2c 0a 20  "KB",  1000 },. 
44b0: 20 20 20 7b 20 22 4d 42 22 2c 20 20 31 30 30 30     { "MB",  1000
44c0: 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 47 42  000 },.    { "GB
44d0: 22 2c 20 20 31 30 30 30 30 30 30 30 30 30 20 7d  ",  1000000000 }
44e0: 2c 0a 20 20 20 20 7b 20 22 4b 22 2c 20 20 20 31  ,.    { "K",   1
44f0: 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 4d 22  000 },.    { "M"
4500: 2c 20 20 20 31 30 30 30 30 30 30 20 7d 2c 0a 20  ,   1000000 },. 
4510: 20 20 20 7b 20 22 47 22 2c 20 20 20 31 30 30 30     { "G",   1000
4520: 30 30 30 30 30 30 20 7d 2c 0a 20 20 7d 3b 0a 20  000000 },.  };. 
4530: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 73   int i;.  int is
4540: 4e 65 67 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a  Neg = 0;.  if( z
4550: 41 72 67 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20  Arg[0]=='-' ){. 
4560: 20 20 20 69 73 4e 65 67 20 3d 20 31 3b 0a 20 20     isNeg = 1;.  
4570: 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 7d 65 6c 73    zArg++;.  }els
4580: 65 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27  e if( zArg[0]=='
4590: 2b 27 20 29 7b 0a 20 20 20 20 7a 41 72 67 2b 2b  +' ){.    zArg++
45a0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 41 72 67  ;.  }.  if( zArg
45b0: 5b 30 5d 3d 3d 27 30 27 20 26 26 20 7a 41 72 67  [0]=='0' && zArg
45c0: 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a 20 20 20 20  [1]=='x' ){.    
45d0: 69 6e 74 20 78 3b 0a 20 20 20 20 7a 41 72 67 20  int x;.    zArg 
45e0: 2b 3d 20 32 3b 0a 20 20 20 20 77 68 69 6c 65 28  += 2;.    while(
45f0: 20 28 78 20 3d 20 68 65 78 44 69 67 69 74 56 61   (x = hexDigitVa
4600: 6c 75 65 28 7a 41 72 67 5b 30 5d 29 29 3e 3d 30  lue(zArg[0]))>=0
4610: 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 28 76   ){.      v = (v
4620: 3c 3c 34 29 20 2b 20 78 3b 0a 20 20 20 20 20 20  <<4) + x;.      
4630: 7a 41 72 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  zArg++;.    }.  
4640: 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c 65  }else{.    while
4650: 28 20 49 73 44 69 67 69 74 28 7a 41 72 67 5b 30  ( IsDigit(zArg[0
4660: 5d 29 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20  ]) ){.      v = 
4670: 76 2a 31 30 20 2b 20 7a 41 72 67 5b 30 5d 20 2d  v*10 + zArg[0] -
4680: 20 27 30 27 3b 0a 20 20 20 20 20 20 7a 41 72 67   '0';.      zArg
4690: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ++;.    }.  }.  
46a0: 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
46b0: 53 69 7a 65 28 61 4d 75 6c 74 29 3b 20 69 2b 2b  Size(aMult); i++
46c0: 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
46d0: 65 33 5f 73 74 72 69 63 6d 70 28 61 4d 75 6c 74  e3_stricmp(aMult
46e0: 5b 69 5d 2e 7a 53 75 66 66 69 78 2c 20 7a 41 72  [i].zSuffix, zAr
46f0: 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 76  g)==0 ){.      v
4700: 20 2a 3d 20 61 4d 75 6c 74 5b 69 5d 2e 69 4d 75   *= aMult[i].iMu
4710: 6c 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  lt;.      break;
4720: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4730: 75 72 6e 20 69 73 4e 65 67 3f 20 2d 76 20 3a 20  urn isNeg? -v : 
4740: 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 76 61  v;.}../*.** A va
4750: 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 73 74  riable length st
4760: 72 69 6e 67 20 74 6f 20 77 68 69 63 68 20 6f 6e  ring to which on
4770: 65 20 63 61 6e 20 61 70 70 65 6e 64 20 74 65 78  e can append tex
4780: 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  t..*/.typedef st
4790: 72 75 63 74 20 53 68 65 6c 6c 54 65 78 74 20 53  ruct ShellText S
47a0: 68 65 6c 6c 54 65 78 74 3b 0a 73 74 72 75 63 74  hellText;.struct
47b0: 20 53 68 65 6c 6c 54 65 78 74 20 7b 0a 20 20 63   ShellText {.  c
47c0: 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b  har *z;.  int n;
47d0: 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 0a 7d  .  int nAlloc;.}
47e0: 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c  ;../*.** Initial
47f0: 69 7a 65 20 61 6e 64 20 64 65 73 74 72 6f 79 20  ize and destroy 
4800: 61 20 53 68 65 6c 6c 54 65 78 74 20 6f 62 6a 65  a ShellText obje
4810: 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ct.*/.static voi
4820: 64 20 69 6e 69 74 54 65 78 74 28 53 68 65 6c 6c  d initText(Shell
4830: 54 65 78 74 20 2a 70 29 7b 0a 20 20 6d 65 6d 73  Text *p){.  mems
4840: 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28  et(p, 0, sizeof(
4850: 2a 70 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  *p));.}.static v
4860: 6f 69 64 20 66 72 65 65 54 65 78 74 28 53 68 65  oid freeText(She
4870: 6c 6c 54 65 78 74 20 2a 70 29 7b 0a 20 20 66 72  llText *p){.  fr
4880: 65 65 28 70 2d 3e 7a 29 3b 0a 20 20 69 6e 69 74  ee(p->z);.  init
4890: 54 65 78 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 20 7a  Text(p);.}../* z
48a0: 49 6e 20 69 73 20 65 69 74 68 65 72 20 61 20 70  In is either a p
48b0: 6f 69 6e 74 65 72 20 74 6f 20 61 20 4e 55 4c 4c  ointer to a NULL
48c0: 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69  -terminated stri
48d0: 6e 67 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74  ng in memory obt
48e0: 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 6d 61  ained.** from ma
48f0: 6c 6c 6f 63 28 29 2c 20 6f 72 20 61 20 4e 55 4c  lloc(), or a NUL
4900: 4c 20 70 6f 69 6e 74 65 72 2e 20 54 68 65 20 73  L pointer. The s
4910: 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f  tring pointed to
4920: 20 62 79 20 7a 41 70 70 65 6e 64 20 69 73 0a 2a   by zAppend is.*
4930: 2a 20 61 64 64 65 64 20 74 6f 20 7a 49 6e 2c 20  * added to zIn, 
4940: 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20 72  and the result r
4950: 65 74 75 72 6e 65 64 20 69 6e 20 6d 65 6d 6f 72  eturned in memor
4960: 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  y obtained from 
4970: 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 7a 49 6e  malloc()..** zIn
4980: 2c 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74 20  , if it was not 
4990: 4e 55 4c 4c 2c 20 69 73 20 66 72 65 65 64 2e 0a  NULL, is freed..
49a0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 68 69  **.** If the thi
49b0: 72 64 20 61 72 67 75 6d 65 6e 74 2c 20 71 75 6f  rd argument, quo
49c0: 74 65 2c 20 69 73 20 6e 6f 74 20 27 5c 30 27 2c  te, is not '\0',
49d0: 20 74 68 65 6e 20 69 74 20 69 73 20 75 73 65 64   then it is used
49e0: 20 61 73 20 61 0a 2a 2a 20 71 75 6f 74 65 20 63   as a.** quote c
49f0: 68 61 72 61 63 74 65 72 20 66 6f 72 20 7a 41 70  haracter for zAp
4a00: 70 65 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pend..*/.static 
4a10: 76 6f 69 64 20 61 70 70 65 6e 64 54 65 78 74 28  void appendText(
4a20: 53 68 65 6c 6c 54 65 78 74 20 2a 70 2c 20 63 68  ShellText *p, ch
4a30: 61 72 20 63 6f 6e 73 74 20 2a 7a 41 70 70 65 6e  ar const *zAppen
4a40: 64 2c 20 63 68 61 72 20 71 75 6f 74 65 29 7b 0a  d, char quote){.
4a50: 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74    int len;.  int
4a60: 20 69 3b 0a 20 20 69 6e 74 20 6e 41 70 70 65 6e   i;.  int nAppen
4a70: 64 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 41 70  d = strlen30(zAp
4a80: 70 65 6e 64 29 3b 0a 0a 20 20 6c 65 6e 20 3d 20  pend);..  len = 
4a90: 6e 41 70 70 65 6e 64 2b 70 2d 3e 6e 2b 31 3b 0a  nAppend+p->n+1;.
4aa0: 20 20 69 66 28 20 71 75 6f 74 65 20 29 7b 0a 20    if( quote ){. 
4ab0: 20 20 20 6c 65 6e 20 2b 3d 20 32 3b 0a 20 20 20     len += 2;.   
4ac0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 70 70   for(i=0; i<nApp
4ad0: 65 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  end; i++){.     
4ae0: 20 69 66 28 20 7a 41 70 70 65 6e 64 5b 69 5d 3d   if( zAppend[i]=
4af0: 3d 71 75 6f 74 65 20 29 20 6c 65 6e 2b 2b 3b 0a  =quote ) len++;.
4b00: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
4b10: 20 70 2d 3e 6e 2b 6c 65 6e 3e 3d 70 2d 3e 6e 41   p->n+len>=p->nA
4b20: 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  lloc ){.    p->n
4b30: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 6c 6c 6f  Alloc = p->nAllo
4b40: 63 2a 32 20 2b 20 6c 65 6e 20 2b 20 32 30 3b 0a  c*2 + len + 20;.
4b50: 20 20 20 20 70 2d 3e 7a 20 3d 20 72 65 61 6c 6c      p->z = reall
4b60: 6f 63 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c  oc(p->z, p->nAll
4b70: 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  oc);.    if( p->
4b80: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d 65  z==0 ){.      me
4b90: 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f  mset(p, 0, sizeo
4ba0: 66 28 2a 70 29 29 3b 0a 20 20 20 20 20 20 72 65  f(*p));.      re
4bb0: 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  turn;.    }.  }.
4bc0: 0a 20 20 69 66 28 20 71 75 6f 74 65 20 29 7b 0a  .  if( quote ){.
4bd0: 20 20 20 20 63 68 61 72 20 2a 7a 43 73 72 20 3d      char *zCsr =
4be0: 20 70 2d 3e 7a 2b 70 2d 3e 6e 3b 0a 20 20 20 20   p->z+p->n;.    
4bf0: 2a 7a 43 73 72 2b 2b 20 3d 20 71 75 6f 74 65 3b  *zCsr++ = quote;
4c00: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
4c10: 6e 41 70 70 65 6e 64 3b 20 69 2b 2b 29 7b 0a 20  nAppend; i++){. 
4c20: 20 20 20 20 20 2a 7a 43 73 72 2b 2b 20 3d 20 7a       *zCsr++ = z
4c30: 41 70 70 65 6e 64 5b 69 5d 3b 0a 20 20 20 20 20  Append[i];.     
4c40: 20 69 66 28 20 7a 41 70 70 65 6e 64 5b 69 5d 3d   if( zAppend[i]=
4c50: 3d 71 75 6f 74 65 20 29 20 2a 7a 43 73 72 2b 2b  =quote ) *zCsr++
4c60: 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20 7d 0a   = quote;.    }.
4c70: 20 20 20 20 2a 7a 43 73 72 2b 2b 20 3d 20 71 75      *zCsr++ = qu
4c80: 6f 74 65 3b 0a 20 20 20 20 70 2d 3e 6e 20 3d 20  ote;.    p->n = 
4c90: 28 69 6e 74 29 28 7a 43 73 72 20 2d 20 70 2d 3e  (int)(zCsr - p->
4ca0: 7a 29 3b 0a 20 20 20 20 2a 7a 43 73 72 20 3d 20  z);.    *zCsr = 
4cb0: 27 5c 30 27 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  '\0';.  }else{. 
4cc0: 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 2b 70     memcpy(p->z+p
4cd0: 2d 3e 6e 2c 20 7a 41 70 70 65 6e 64 2c 20 6e 41  ->n, zAppend, nA
4ce0: 70 70 65 6e 64 29 3b 0a 20 20 20 20 70 2d 3e 6e  ppend);.    p->n
4cf0: 20 2b 3d 20 6e 41 70 70 65 6e 64 3b 0a 20 20 20   += nAppend;.   
4d00: 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 27 5c   p->z[p->n] = '\
4d10: 30 27 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  0';.  }.}../*.**
4d20: 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65 74 65   Attempt to dete
4d30: 72 6d 69 6e 65 20 69 66 20 69 64 65 6e 74 69 66  rmine if identif
4d40: 69 65 72 20 7a 4e 61 6d 65 20 6e 65 65 64 73 20  ier zName needs 
4d50: 74 6f 20 62 65 20 71 75 6f 74 65 64 2c 20 65 69  to be quoted, ei
4d60: 74 68 65 72 0a 2a 2a 20 62 65 63 61 75 73 65 20  ther.** because 
4d70: 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 6e 2d  it contains non-
4d80: 61 6c 70 68 61 6e 75 6d 65 72 69 63 20 63 68 61  alphanumeric cha
4d90: 72 61 63 74 65 72 73 2c 20 6f 72 20 62 65 63 61  racters, or beca
4da0: 75 73 65 20 69 74 20 69 73 20 61 6e 0a 2a 2a 20  use it is an.** 
4db0: 53 51 4c 69 74 65 20 6b 65 79 77 6f 72 64 2e 20  SQLite keyword. 
4dc0: 20 42 65 20 63 6f 6e 73 65 72 76 61 74 69 76 65   Be conservative
4dd0: 20 69 6e 20 74 68 69 73 20 65 73 74 69 6d 61 74   in this estimat
4de0: 65 3a 20 20 57 68 65 6e 20 69 6e 20 64 6f 75 62  e:  When in doub
4df0: 74 20 61 73 73 75 6d 65 0a 2a 2a 20 74 68 61 74  t assume.** that
4e00: 20 71 75 6f 74 69 6e 67 20 69 73 20 72 65 71 75   quoting is requ
4e10: 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  ired..**.** Retu
4e20: 72 6e 20 27 22 27 20 69 66 20 71 75 6f 74 69 6e  rn '"' if quotin
4e30: 67 20 69 73 20 72 65 71 75 69 72 65 64 2e 20 20  g is required.  
4e40: 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 20 71  Return 0 if no q
4e50: 75 6f 74 69 6e 67 20 69 73 20 72 65 71 75 69 72  uoting is requir
4e60: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  ed..*/.static ch
4e70: 61 72 20 71 75 6f 74 65 43 68 61 72 28 63 6f 6e  ar quoteChar(con
4e80: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
4e90: 0a 20 20 2f 2a 20 41 6c 6c 20 53 51 4c 69 74 65  .  /* All SQLite
4ea0: 20 6b 65 79 77 6f 72 64 73 2c 20 69 6e 20 61 6c   keywords, in al
4eb0: 70 68 61 62 65 74 69 63 61 6c 20 6f 72 64 65 72  phabetical order
4ec0: 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f 6e   */.  static con
4ed0: 73 74 20 63 68 61 72 20 2a 61 7a 4b 65 79 77 6f  st char *azKeywo
4ee0: 72 64 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 41  rds[] = {.    "A
4ef0: 42 4f 52 54 22 2c 20 22 41 43 54 49 4f 4e 22 2c  BORT", "ACTION",
4f00: 20 22 41 44 44 22 2c 20 22 41 46 54 45 52 22 2c   "ADD", "AFTER",
4f10: 20 22 41 4c 4c 22 2c 20 22 41 4c 54 45 52 22 2c   "ALL", "ALTER",
4f20: 20 22 41 4e 41 4c 59 5a 45 22 2c 20 22 41 4e 44   "ANALYZE", "AND
4f30: 22 2c 20 22 41 53 22 2c 0a 20 20 20 20 22 41 53  ", "AS",.    "AS
4f40: 43 22 2c 20 22 41 54 54 41 43 48 22 2c 20 22 41  C", "ATTACH", "A
4f50: 55 54 4f 49 4e 43 52 45 4d 45 4e 54 22 2c 20 22  UTOINCREMENT", "
4f60: 42 45 46 4f 52 45 22 2c 20 22 42 45 47 49 4e 22  BEFORE", "BEGIN"
4f70: 2c 20 22 42 45 54 57 45 45 4e 22 2c 20 22 42 59  , "BETWEEN", "BY
4f80: 22 2c 0a 20 20 20 20 22 43 41 53 43 41 44 45 22  ",.    "CASCADE"
4f90: 2c 20 22 43 41 53 45 22 2c 20 22 43 41 53 54 22  , "CASE", "CAST"
4fa0: 2c 20 22 43 48 45 43 4b 22 2c 20 22 43 4f 4c 4c  , "CHECK", "COLL
4fb0: 41 54 45 22 2c 20 22 43 4f 4c 55 4d 4e 22 2c 20  ATE", "COLUMN", 
4fc0: 22 43 4f 4d 4d 49 54 22 2c 0a 20 20 20 20 22 43  "COMMIT",.    "C
4fd0: 4f 4e 46 4c 49 43 54 22 2c 20 22 43 4f 4e 53 54  ONFLICT", "CONST
4fe0: 52 41 49 4e 54 22 2c 20 22 43 52 45 41 54 45 22  RAINT", "CREATE"
4ff0: 2c 20 22 43 52 4f 53 53 22 2c 20 22 43 55 52 52  , "CROSS", "CURR
5000: 45 4e 54 5f 44 41 54 45 22 2c 0a 20 20 20 20 22  ENT_DATE",.    "
5010: 43 55 52 52 45 4e 54 5f 54 49 4d 45 22 2c 20 22  CURRENT_TIME", "
5020: 43 55 52 52 45 4e 54 5f 54 49 4d 45 53 54 41 4d  CURRENT_TIMESTAM
5030: 50 22 2c 20 22 44 41 54 41 42 41 53 45 22 2c 20  P", "DATABASE", 
5040: 22 44 45 46 41 55 4c 54 22 2c 20 22 44 45 46 45  "DEFAULT", "DEFE
5050: 52 52 41 42 4c 45 22 2c 0a 20 20 20 20 22 44 45  RRABLE",.    "DE
5060: 46 45 52 52 45 44 22 2c 20 22 44 45 4c 45 54 45  FERRED", "DELETE
5070: 22 2c 20 22 44 45 53 43 22 2c 20 22 44 45 54 41  ", "DESC", "DETA
5080: 43 48 22 2c 20 22 44 49 53 54 49 4e 43 54 22 2c  CH", "DISTINCT",
5090: 20 22 44 52 4f 50 22 2c 20 22 45 41 43 48 22 2c   "DROP", "EACH",
50a0: 0a 20 20 20 20 22 45 4c 53 45 22 2c 20 22 45 4e  .    "ELSE", "EN
50b0: 44 22 2c 20 22 45 53 43 41 50 45 22 2c 20 22 45  D", "ESCAPE", "E
50c0: 58 43 45 50 54 22 2c 20 22 45 58 43 4c 55 53 49  XCEPT", "EXCLUSI
50d0: 56 45 22 2c 20 22 45 58 49 53 54 53 22 2c 20 22  VE", "EXISTS", "
50e0: 45 58 50 4c 41 49 4e 22 2c 0a 20 20 20 20 22 46  EXPLAIN",.    "F
50f0: 41 49 4c 22 2c 20 22 46 4f 52 22 2c 20 22 46 4f  AIL", "FOR", "FO
5100: 52 45 49 47 4e 22 2c 20 22 46 52 4f 4d 22 2c 20  REIGN", "FROM", 
5110: 22 46 55 4c 4c 22 2c 20 22 47 4c 4f 42 22 2c 20  "FULL", "GLOB", 
5120: 22 47 52 4f 55 50 22 2c 20 22 48 41 56 49 4e 47  "GROUP", "HAVING
5130: 22 2c 20 22 49 46 22 2c 0a 20 20 20 20 22 49 47  ", "IF",.    "IG
5140: 4e 4f 52 45 22 2c 20 22 49 4d 4d 45 44 49 41 54  NORE", "IMMEDIAT
5150: 45 22 2c 20 22 49 4e 22 2c 20 22 49 4e 44 45 58  E", "IN", "INDEX
5160: 22 2c 20 22 49 4e 44 45 58 45 44 22 2c 20 22 49  ", "INDEXED", "I
5170: 4e 49 54 49 41 4c 4c 59 22 2c 20 22 49 4e 4e 45  NITIALLY", "INNE
5180: 52 22 2c 0a 20 20 20 20 22 49 4e 53 45 52 54 22  R",.    "INSERT"
5190: 2c 20 22 49 4e 53 54 45 41 44 22 2c 20 22 49 4e  , "INSTEAD", "IN
51a0: 54 45 52 53 45 43 54 22 2c 20 22 49 4e 54 4f 22  TERSECT", "INTO"
51b0: 2c 20 22 49 53 22 2c 20 22 49 53 4e 55 4c 4c 22  , "IS", "ISNULL"
51c0: 2c 20 22 4a 4f 49 4e 22 2c 20 22 4b 45 59 22 2c  , "JOIN", "KEY",
51d0: 0a 20 20 20 20 22 4c 45 46 54 22 2c 20 22 4c 49  .    "LEFT", "LI
51e0: 4b 45 22 2c 20 22 4c 49 4d 49 54 22 2c 20 22 4d  KE", "LIMIT", "M
51f0: 41 54 43 48 22 2c 20 22 4e 41 54 55 52 41 4c 22  ATCH", "NATURAL"
5200: 2c 20 22 4e 4f 22 2c 20 22 4e 4f 54 22 2c 20 22  , "NO", "NOT", "
5210: 4e 4f 54 4e 55 4c 4c 22 2c 0a 20 20 20 20 22 4e  NOTNULL",.    "N
5220: 55 4c 4c 22 2c 20 22 4f 46 22 2c 20 22 4f 46 46  ULL", "OF", "OFF
5230: 53 45 54 22 2c 20 22 4f 4e 22 2c 20 22 4f 52 22  SET", "ON", "OR"
5240: 2c 20 22 4f 52 44 45 52 22 2c 20 22 4f 55 54 45  , "ORDER", "OUTE
5250: 52 22 2c 20 22 50 4c 41 4e 22 2c 20 22 50 52 41  R", "PLAN", "PRA
5260: 47 4d 41 22 2c 0a 20 20 20 20 22 50 52 49 4d 41  GMA",.    "PRIMA
5270: 52 59 22 2c 20 22 51 55 45 52 59 22 2c 20 22 52  RY", "QUERY", "R
5280: 41 49 53 45 22 2c 20 22 52 45 43 55 52 53 49 56  AISE", "RECURSIV
5290: 45 22 2c 20 22 52 45 46 45 52 45 4e 43 45 53 22  E", "REFERENCES"
52a0: 2c 20 22 52 45 47 45 58 50 22 2c 0a 20 20 20 20  , "REGEXP",.    
52b0: 22 52 45 49 4e 44 45 58 22 2c 20 22 52 45 4c 45  "REINDEX", "RELE
52c0: 41 53 45 22 2c 20 22 52 45 4e 41 4d 45 22 2c 20  ASE", "RENAME", 
52d0: 22 52 45 50 4c 41 43 45 22 2c 20 22 52 45 53 54  "REPLACE", "REST
52e0: 52 49 43 54 22 2c 20 22 52 49 47 48 54 22 2c 0a  RICT", "RIGHT",.
52f0: 20 20 20 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20      "ROLLBACK", 
5300: 22 52 4f 57 22 2c 20 22 53 41 56 45 50 4f 49 4e  "ROW", "SAVEPOIN
5310: 54 22 2c 20 22 53 45 4c 45 43 54 22 2c 20 22 53  T", "SELECT", "S
5320: 45 54 22 2c 20 22 54 41 42 4c 45 22 2c 20 22 54  ET", "TABLE", "T
5330: 45 4d 50 22 2c 0a 20 20 20 20 22 54 45 4d 50 4f  EMP",.    "TEMPO
5340: 52 41 52 59 22 2c 20 22 54 48 45 4e 22 2c 20 22  RARY", "THEN", "
5350: 54 4f 22 2c 20 22 54 52 41 4e 53 41 43 54 49 4f  TO", "TRANSACTIO
5360: 4e 22 2c 20 22 54 52 49 47 47 45 52 22 2c 20 22  N", "TRIGGER", "
5370: 55 4e 49 4f 4e 22 2c 20 22 55 4e 49 51 55 45 22  UNION", "UNIQUE"
5380: 2c 0a 20 20 20 20 22 55 50 44 41 54 45 22 2c 20  ,.    "UPDATE", 
5390: 22 55 53 49 4e 47 22 2c 20 22 56 41 43 55 55 4d  "USING", "VACUUM
53a0: 22 2c 20 22 56 41 4c 55 45 53 22 2c 20 22 56 49  ", "VALUES", "VI
53b0: 45 57 22 2c 20 22 56 49 52 54 55 41 4c 22 2c 20  EW", "VIRTUAL", 
53c0: 22 57 48 45 4e 22 2c 20 22 57 48 45 52 45 22 2c  "WHEN", "WHERE",
53d0: 0a 20 20 20 20 22 57 49 54 48 22 2c 20 22 57 49  .    "WITH", "WI
53e0: 54 48 4f 55 54 22 2c 0a 20 20 7d 3b 0a 20 20 69  THOUT",.  };.  i
53f0: 6e 74 20 69 2c 20 6c 77 72 2c 20 75 70 72 2c 20  nt i, lwr, upr, 
5400: 6d 69 64 2c 20 63 3b 0a 20 20 69 66 28 20 21 69  mid, c;.  if( !i
5410: 73 61 6c 70 68 61 28 28 75 6e 73 69 67 6e 65 64  salpha((unsigned
5420: 20 63 68 61 72 29 7a 4e 61 6d 65 5b 30 5d 29 20   char)zName[0]) 
5430: 26 26 20 7a 4e 61 6d 65 5b 30 5d 21 3d 27 5f 27  && zName[0]!='_'
5440: 20 29 20 72 65 74 75 72 6e 20 27 22 27 3b 0a 20   ) return '"';. 
5450: 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b   for(i=0; zName[
5460: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  i]; i++){.    if
5470: 28 20 21 69 73 61 6c 6e 75 6d 28 28 75 6e 73 69  ( !isalnum((unsi
5480: 67 6e 65 64 20 63 68 61 72 29 7a 4e 61 6d 65 5b  gned char)zName[
5490: 69 5d 29 20 26 26 20 7a 4e 61 6d 65 5b 69 5d 21  i]) && zName[i]!
54a0: 3d 27 5f 27 20 29 20 72 65 74 75 72 6e 20 27 22  ='_' ) return '"
54b0: 27 3b 0a 20 20 7d 0a 20 20 6c 77 72 20 3d 20 30  ';.  }.  lwr = 0
54c0: 3b 0a 20 20 75 70 72 20 3d 20 73 69 7a 65 6f 66  ;.  upr = sizeof
54d0: 28 61 7a 4b 65 79 77 6f 72 64 73 29 2f 73 69 7a  (azKeywords)/siz
54e0: 65 6f 66 28 61 7a 4b 65 79 77 6f 72 64 73 5b 30  eof(azKeywords[0
54f0: 5d 29 20 2d 20 31 3b 0a 20 20 77 68 69 6c 65 28  ]) - 1;.  while(
5500: 20 6c 77 72 3c 3d 75 70 72 20 29 7b 0a 20 20 20   lwr<=upr ){.   
5510: 20 6d 69 64 20 3d 20 28 6c 77 72 2b 75 70 72 29   mid = (lwr+upr)
5520: 2f 32 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c 69  /2;.    c = sqli
5530: 74 65 33 5f 73 74 72 69 63 6d 70 28 61 7a 4b 65  te3_stricmp(azKe
5540: 79 77 6f 72 64 73 5b 6d 69 64 5d 2c 20 7a 4e 61  ywords[mid], zNa
5550: 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d  me);.    if( c==
5560: 30 20 29 20 72 65 74 75 72 6e 20 27 22 27 3b 0a  0 ) return '"';.
5570: 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a 20      if( c<0 ){. 
5580: 20 20 20 20 20 6c 77 72 20 3d 20 6d 69 64 2b 31       lwr = mid+1
5590: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
55a0: 20 20 20 75 70 72 20 3d 20 6d 69 64 2d 31 3b 0a     upr = mid-1;.
55b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
55c0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 0;.}../*.** C
55d0: 6f 6e 73 74 72 75 63 74 20 61 20 66 61 6b 65 20  onstruct a fake 
55e0: 6f 62 6a 65 63 74 20 6e 61 6d 65 20 61 6e 64 20  object name and 
55f0: 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 74 6f 20 64  column list to d
5600: 65 73 63 72 69 62 65 20 74 68 65 20 73 74 72 75  escribe the stru
5610: 63 74 75 72 65 0a 2a 2a 20 6f 66 20 74 68 65 20  cture.** of the 
5620: 76 69 65 77 2c 20 76 69 72 74 75 61 6c 20 74 61  view, virtual ta
5630: 62 6c 65 2c 20 6f 72 20 74 61 62 6c 65 20 76 61  ble, or table va
5640: 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 7a 53  lued function zS
5650: 63 68 65 6d 61 2e 7a 4e 61 6d 65 2e 0a 2a 2f 0a  chema.zName..*/.
5660: 73 74 61 74 69 63 20 63 68 61 72 20 2a 73 68 65  static char *she
5670: 6c 6c 46 61 6b 65 53 63 68 65 6d 61 28 0a 20 20  llFakeSchema(.  
5680: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
5690: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
56a0: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
56b0: 6f 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  on containing th
56c0: 65 20 76 74 61 62 20 2a 2f 0a 20 20 63 6f 6e 73  e vtab */.  cons
56d0: 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 2c  t char *zSchema,
56e0: 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f 66      /* Schema of
56f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 6f   the database ho
5700: 6c 64 69 6e 67 20 74 68 65 20 76 74 61 62 20 2a  lding the vtab *
5710: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
5720: 7a 4e 61 6d 65 20 20 20 20 20 20 20 2f 2a 20 54  zName       /* T
5730: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 76  he name of the v
5740: 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a  irtual table */.
5750: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
5760: 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
5770: 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 53 68  char *zSql;.  Sh
5780: 65 6c 6c 54 65 78 74 20 73 3b 0a 20 20 63 68 61  ellText s;.  cha
5790: 72 20 63 51 75 6f 74 65 3b 0a 20 20 63 68 61 72  r cQuote;.  char
57a0: 20 2a 7a 44 69 76 20 3d 20 22 28 22 3b 0a 20 20   *zDiv = "(";.  
57b0: 69 6e 74 20 6e 52 6f 77 20 3d 20 30 3b 0a 0a 20  int nRow = 0;.. 
57c0: 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
57d0: 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20  mprintf("PRAGMA 
57e0: 5c 22 25 77 5c 22 2e 74 61 62 6c 65 5f 69 6e 66  \"%w\".table_inf
57f0: 6f 3d 25 51 3b 22 2c 0a 20 20 20 20 20 20 20 20  o=%Q;",.        
5800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5810: 20 7a 53 63 68 65 6d 61 20 3f 20 7a 53 63 68 65   zSchema ? zSche
5820: 6d 61 20 3a 20 22 6d 61 69 6e 22 2c 20 7a 4e 61  ma : "main", zNa
5830: 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70  me);.  sqlite3_p
5840: 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53  repare_v2(db, zS
5850: 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
5860: 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  0);.  sqlite3_fr
5870: 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 6e 69 74  ee(zSql);.  init
5880: 54 65 78 74 28 26 73 29 3b 0a 20 20 69 66 28 20  Text(&s);.  if( 
5890: 7a 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 63  zSchema ){.    c
58a0: 51 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61  Quote = quoteCha
58b0: 72 28 7a 53 63 68 65 6d 61 29 3b 0a 20 20 20 20  r(zSchema);.    
58c0: 69 66 28 20 63 51 75 6f 74 65 20 26 26 20 73 71  if( cQuote && sq
58d0: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 53  lite3_stricmp(zS
58e0: 63 68 65 6d 61 2c 22 74 65 6d 70 22 29 3d 3d 30  chema,"temp")==0
58f0: 20 29 20 63 51 75 6f 74 65 20 3d 20 30 3b 0a 20   ) cQuote = 0;. 
5900: 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
5910: 2c 20 7a 53 63 68 65 6d 61 2c 20 63 51 75 6f 74  , zSchema, cQuot
5920: 65 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65  e);.    appendTe
5930: 78 74 28 26 73 2c 20 22 2e 22 2c 20 30 29 3b 0a  xt(&s, ".", 0);.
5940: 20 20 7d 0a 20 20 63 51 75 6f 74 65 20 3d 20 71    }.  cQuote = q
5950: 75 6f 74 65 43 68 61 72 28 7a 4e 61 6d 65 29 3b  uoteChar(zName);
5960: 0a 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73  .  appendText(&s
5970: 2c 20 7a 4e 61 6d 65 2c 20 63 51 75 6f 74 65 29  , zName, cQuote)
5980: 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74  ;.  while( sqlit
5990: 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
59a0: 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
59b0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43    const char *zC
59c0: 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ol = (const char
59d0: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
59e0: 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29 3b  _text(pStmt, 1);
59f0: 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20 20  .    nRow++;.   
5a00: 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20   appendText(&s, 
5a10: 7a 44 69 76 2c 20 30 29 3b 0a 20 20 20 20 7a 44  zDiv, 0);.    zD
5a20: 69 76 20 3d 20 22 2c 22 3b 0a 20 20 20 20 63 51  iv = ",";.    cQ
5a30: 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61 72  uote = quoteChar
5a40: 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 61 70 70 65  (zCol);.    appe
5a50: 6e 64 54 65 78 74 28 26 73 2c 20 7a 43 6f 6c 2c  ndText(&s, zCol,
5a60: 20 63 51 75 6f 74 65 29 3b 0a 20 20 7d 0a 20 20   cQuote);.  }.  
5a70: 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20 22  appendText(&s, "
5a80: 29 22 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  )", 0);.  sqlite
5a90: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
5aa0: 29 3b 0a 20 20 69 66 28 20 6e 52 6f 77 3d 3d 30  );.  if( nRow==0
5ab0: 20 29 7b 0a 20 20 20 20 66 72 65 65 54 65 78 74   ){.    freeText
5ac0: 28 26 73 29 3b 0a 20 20 20 20 73 2e 7a 20 3d 20  (&s);.    s.z = 
5ad0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
5ae0: 73 2e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51  s.z;.}../*.** SQ
5af0: 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73 68 65  L function:  she
5b00: 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68 65 6d 61  ll_module_schema
5b10: 28 58 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  (X).**.** Return
5b20: 20 61 20 66 61 6b 65 20 73 63 68 65 6d 61 20 66   a fake schema f
5b30: 6f 72 20 74 68 65 20 74 61 62 6c 65 2d 76 61 6c  or the table-val
5b40: 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20  ued function or 
5b50: 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75 61  eponymous virtua
5b60: 6c 0a 2a 2a 20 74 61 62 6c 65 20 58 2e 0a 2a 2f  l.** table X..*/
5b70: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65  .static void she
5b80: 6c 6c 4d 6f 64 75 6c 65 53 63 68 65 6d 61 28 0a  llModuleSchema(.
5b90: 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
5ba0: 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e  t *pCtx,.  int n
5bb0: 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Val,.  sqlite3_v
5bc0: 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a  alue **apVal.){.
5bd0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
5be0: 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
5bf0: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
5c00: 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b  _text(apVal[0]);
5c10: 0a 20 20 63 68 61 72 20 2a 7a 46 61 6b 65 20 3d  .  char *zFake =
5c20: 20 73 68 65 6c 6c 46 61 6b 65 53 63 68 65 6d 61   shellFakeSchema
5c30: 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74  (sqlite3_context
5c40: 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78 29  _db_handle(pCtx)
5c50: 2c 20 30 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 55  , 0, zName);.  U
5c60: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
5c70: 6e 56 61 6c 29 3b 0a 20 20 69 66 28 20 7a 46 61  nVal);.  if( zFa
5c80: 6b 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ke ){.    sqlite
5c90: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43  3_result_text(pC
5ca0: 74 78 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  tx, sqlite3_mpri
5cb0: 6e 74 66 28 22 2f 2a 20 25 73 20 2a 2f 22 2c 20  ntf("/* %s */", 
5cc0: 7a 46 61 6b 65 29 2c 0a 20 20 20 20 20 20 20 20  zFake),.        
5cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5ce0: 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  -1, sqlite3_free
5cf0: 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 46 61 6b  );.    free(zFak
5d00: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
5d10: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20   SQL function:  
5d20: 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68 65 6d 61  shell_add_schema
5d30: 28 53 2c 58 29 0a 2a 2a 0a 2a 2a 20 41 64 64 20  (S,X).**.** Add 
5d40: 74 68 65 20 73 63 68 65 6d 61 20 6e 61 6d 65 20  the schema name 
5d50: 58 20 74 6f 20 74 68 65 20 43 52 45 41 54 45 20  X to the CREATE 
5d60: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 53 20 61  statement in S a
5d70: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 72 65  nd return the re
5d80: 73 75 6c 74 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65  sult..** Example
5d90: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41  s:.**.**    CREA
5da0: 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 20 20  TE TABLE t1(x)  
5db0: 20 2d 3e 20 20 20 43 52 45 41 54 45 20 54 41 42   ->   CREATE TAB
5dc0: 4c 45 20 78 79 7a 2e 74 31 28 78 29 3b 0a 2a 2a  LE xyz.t1(x);.**
5dd0: 0a 2a 2a 20 41 6c 73 6f 20 77 6f 72 6b 73 20 6f  .** Also works o
5de0: 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41 54  n.**.**    CREAT
5df0: 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 43 52  E INDEX.**    CR
5e00: 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45  EATE UNIQUE INDE
5e10: 58 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20 56  X.**    CREATE V
5e20: 49 45 57 0a 2a 2a 20 20 20 20 43 52 45 41 54 45  IEW.**    CREATE
5e30: 20 54 52 49 47 47 45 52 0a 2a 2a 20 20 20 20 43   TRIGGER.**    C
5e40: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
5e50: 42 4c 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 55  BLE.**.** This U
5e60: 44 46 20 69 73 20 75 73 65 64 20 62 79 20 74 68  DF is used by th
5e70: 65 20 2e 73 63 68 65 6d 61 20 63 6f 6d 6d 61 6e  e .schema comman
5e80: 64 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20  d to insert the 
5e90: 73 63 68 65 6d 61 20 6e 61 6d 65 20 6f 66 0a 2a  schema name of.*
5ea0: 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  * attached datab
5eb0: 61 73 65 73 20 69 6e 74 6f 20 74 68 65 20 6d 69  ases into the mi
5ec0: 64 64 6c 65 20 6f 66 20 74 68 65 20 73 71 6c 69  ddle of the sqli
5ed0: 74 65 5f 6d 61 73 74 65 72 2e 73 71 6c 20 66 69  te_master.sql fi
5ee0: 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  eld..*/.static v
5ef0: 6f 69 64 20 73 68 65 6c 6c 41 64 64 53 63 68 65  oid shellAddSche
5f00: 6d 61 4e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65  maName(.  sqlite
5f10: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
5f20: 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20 73  .  int nVal,.  s
5f30: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
5f40: 70 56 61 6c 0a 29 7b 0a 20 20 73 74 61 74 69 63  pVal.){.  static
5f50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 50 72   const char *aPr
5f60: 65 66 69 78 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  efix[] = {.     
5f70: 22 54 41 42 4c 45 22 2c 0a 20 20 20 20 20 22 49  "TABLE",.     "I
5f80: 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 55 4e 49  NDEX",.     "UNI
5f90: 51 55 45 20 49 4e 44 45 58 22 2c 0a 20 20 20 20  QUE INDEX",.    
5fa0: 20 22 56 49 45 57 22 2c 0a 20 20 20 20 20 22 54   "VIEW",.     "T
5fb0: 52 49 47 47 45 52 22 2c 0a 20 20 20 20 20 22 56  RIGGER",.     "V
5fc0: 49 52 54 55 41 4c 20 54 41 42 4c 45 22 0a 20 20  IRTUAL TABLE".  
5fd0: 7d 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  };.  int i = 0;.
5fe0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
5ff0: 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  n = (const char*
6000: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
6010: 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20  ext(apVal[0]);. 
6020: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63   const char *zSc
6030: 68 65 6d 61 20 3d 20 28 63 6f 6e 73 74 20 63 68  hema = (const ch
6040: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
6050: 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 31 5d 29  e_text(apVal[1])
6060: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
6070: 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63  zName = (const c
6080: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
6090: 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 32 5d  ue_text(apVal[2]
60a0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  );.  sqlite3 *db
60b0: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
60c0: 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74  xt_db_handle(pCt
60d0: 78 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52  x);.  UNUSED_PAR
60e0: 41 4d 45 54 45 52 28 6e 56 61 6c 29 3b 0a 20 20  AMETER(nVal);.  
60f0: 69 66 28 20 7a 49 6e 21 3d 30 20 26 26 20 73 74  if( zIn!=0 && st
6100: 72 6e 63 6d 70 28 7a 49 6e 2c 20 22 43 52 45 41  rncmp(zIn, "CREA
6110: 54 45 20 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20  TE ", 7)==0 ){. 
6120: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28 69     for(i=0; i<(i
6130: 6e 74 29 28 73 69 7a 65 6f 66 28 61 50 72 65 66  nt)(sizeof(aPref
6140: 69 78 29 2f 73 69 7a 65 6f 66 28 61 50 72 65 66  ix)/sizeof(aPref
6150: 69 78 5b 30 5d 29 29 3b 20 69 2b 2b 29 7b 0a 20  ix[0])); i++){. 
6160: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72       int n = str
6170: 6c 65 6e 33 30 28 61 50 72 65 66 69 78 5b 69 5d  len30(aPrefix[i]
6180: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  );.      if( str
6190: 6e 63 6d 70 28 7a 49 6e 2b 37 2c 20 61 50 72 65  ncmp(zIn+7, aPre
61a0: 66 69 78 5b 69 5d 2c 20 6e 29 3d 3d 30 20 26 26  fix[i], n)==0 &&
61b0: 20 7a 49 6e 5b 6e 2b 37 5d 3d 3d 27 20 27 20 29   zIn[n+7]==' ' )
61c0: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
61d0: 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 63  z = 0;.        c
61e0: 68 61 72 20 2a 7a 46 61 6b 65 20 3d 20 30 3b 0a  har *zFake = 0;.
61f0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 63 68          if( zSch
6200: 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ema ){.         
6210: 20 63 68 61 72 20 63 51 75 6f 74 65 20 3d 20 71   char cQuote = q
6220: 75 6f 74 65 43 68 61 72 28 7a 53 63 68 65 6d 61  uoteChar(zSchema
6230: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
6240: 20 63 51 75 6f 74 65 20 26 26 20 73 71 6c 69 74   cQuote && sqlit
6250: 65 33 5f 73 74 72 69 63 6d 70 28 7a 53 63 68 65  e3_stricmp(zSche
6260: 6d 61 2c 22 74 65 6d 70 22 29 21 3d 30 20 29 7b  ma,"temp")!=0 ){
6270: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  .            z =
6280: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
6290: 28 22 25 2e 2a 73 20 5c 22 25 77 5c 22 2e 25 73  ("%.*s \"%w\".%s
62a0: 22 2c 20 6e 2b 37 2c 20 7a 49 6e 2c 20 7a 53 63  ", n+7, zIn, zSc
62b0: 68 65 6d 61 2c 20 7a 49 6e 2b 6e 2b 38 29 3b 0a  hema, zIn+n+8);.
62c0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
62d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  .            z =
62e0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
62f0: 28 22 25 2e 2a 73 20 25 73 2e 25 73 22 2c 20 6e  ("%.*s %s.%s", n
6300: 2b 37 2c 20 7a 49 6e 2c 20 7a 53 63 68 65 6d 61  +7, zIn, zSchema
6310: 2c 20 7a 49 6e 2b 6e 2b 38 29 3b 0a 20 20 20 20  , zIn+n+8);.    
6320: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6330: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4e  }.        if( zN
6340: 61 6d 65 0a 20 20 20 20 20 20 20 20 20 26 26 20  ame.         && 
6350: 61 50 72 65 66 69 78 5b 69 5d 5b 30 5d 3d 3d 27  aPrefix[i][0]=='
6360: 56 27 0a 20 20 20 20 20 20 20 20 20 26 26 20 28  V'.         && (
6370: 7a 46 61 6b 65 20 3d 20 73 68 65 6c 6c 46 61 6b  zFake = shellFak
6380: 65 53 63 68 65 6d 61 28 64 62 2c 20 7a 53 63 68  eSchema(db, zSch
6390: 65 6d 61 2c 20 7a 4e 61 6d 65 29 29 21 3d 30 0a  ema, zName))!=0.
63a0: 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20          ){.     
63b0: 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b       if( z==0 ){
63c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d  .            z =
63d0: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
63e0: 28 22 25 73 5c 6e 2f 2a 20 25 73 20 2a 2f 22 2c  ("%s\n/* %s */",
63f0: 20 7a 49 6e 2c 20 7a 46 61 6b 65 29 3b 0a 20 20   zIn, zFake);.  
6400: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
6410: 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20 73             z = s
6420: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
6430: 25 7a 5c 6e 2f 2a 20 25 73 20 2a 2f 22 2c 20 7a  %z\n/* %s */", z
6440: 2c 20 7a 46 61 6b 65 29 3b 0a 20 20 20 20 20 20  , zFake);.      
6450: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
6460: 66 72 65 65 28 7a 46 61 6b 65 29 3b 0a 20 20 20  free(zFake);.   
6470: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
6480: 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 20 20  f( z ){.        
6490: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
64a0: 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 2c 20 2d  _text(pCtx, z, -
64b0: 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29  1, sqlite3_free)
64c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
64d0: 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rn;.        }.  
64e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
64f0: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
6500: 5f 76 61 6c 75 65 28 70 43 74 78 2c 20 61 70 56  _value(pCtx, apV
6510: 61 6c 5b 30 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  al[0]);.}../*.**
6520: 20 54 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65   The source code
6530: 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 75 6e   for several run
6540: 2d 74 69 6d 65 20 6c 6f 61 64 61 62 6c 65 20 65  -time loadable e
6550: 78 74 65 6e 73 69 6f 6e 73 20 69 73 20 69 6e 73  xtensions is ins
6560: 65 72 74 65 64 0a 2a 2a 20 62 65 6c 6f 77 20 62  erted.** below b
6570: 79 20 74 68 65 20 2e 2e 2f 74 6f 6f 6c 2f 6d 6b  y the ../tool/mk
6580: 73 68 65 6c 6c 63 2e 74 63 6c 20 73 63 72 69 70  shellc.tcl scrip
6590: 74 2e 20 20 42 65 66 6f 72 65 20 70 72 6f 63 65  t.  Before proce
65a0: 73 73 69 6e 67 20 74 68 61 74 20 69 6e 63 6c 75  ssing that inclu
65b0: 64 65 64 0a 2a 2a 20 63 6f 64 65 2c 20 77 65 20  ded.** code, we 
65c0: 6e 65 65 64 20 74 6f 20 6f 76 65 72 72 69 64 65  need to override
65d0: 20 73 6f 6d 65 20 6d 61 63 72 6f 73 20 74 6f 20   some macros to 
65e0: 6d 61 6b 65 20 74 68 65 20 69 6e 63 6c 75 64 65  make the include
65f0: 64 20 70 72 6f 67 72 61 6d 20 63 6f 64 65 0a 2a  d program code.*
6600: 2a 20 77 6f 72 6b 20 68 65 72 65 20 69 6e 20 74  * work here in t
6610: 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 69  he middle of thi
6620: 73 20 72 65 67 75 6c 61 72 20 70 72 6f 67 72 61  s regular progra
6630: 6d 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51  m..*/.#define SQ
6640: 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49  LITE_EXTENSION_I
6650: 4e 49 54 31 0a 23 64 65 66 69 6e 65 20 53 51 4c  NIT1.#define SQL
6660: 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e  ITE_EXTENSION_IN
6670: 49 54 32 28 58 29 20 28 76 6f 69 64 29 28 58 29  IT2(X) (void)(X)
6680: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  ..#if defined(_W
6690: 49 4e 33 32 29 20 26 26 20 64 65 66 69 6e 65 64  IN32) && defined
66a0: 28 5f 4d 53 43 5f 56 45 52 29 0a 49 4e 43 4c 55  (_MSC_VER).INCLU
66b0: 44 45 20 74 65 73 74 5f 77 69 6e 64 69 72 65 6e  DE test_windiren
66c0: 74 2e 68 0a 49 4e 43 4c 55 44 45 20 74 65 73 74  t.h.INCLUDE test
66d0: 5f 77 69 6e 64 69 72 65 6e 74 2e 63 0a 23 64 65  _windirent.c.#de
66e0: 66 69 6e 65 20 64 69 72 65 6e 74 20 44 49 52 45  fine dirent DIRE
66f0: 4e 54 0a 23 65 6e 64 69 66 0a 49 4e 43 4c 55 44  NT.#endif.INCLUD
6700: 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 73 68  E ../ext/misc/sh
6710: 61 74 68 72 65 65 2e 63 0a 49 4e 43 4c 55 44 45  athree.c.INCLUDE
6720: 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 66 69 6c   ../ext/misc/fil
6730: 65 69 6f 2e 63 0a 49 4e 43 4c 55 44 45 20 2e 2e  eio.c.INCLUDE ..
6740: 2f 65 78 74 2f 6d 69 73 63 2f 63 6f 6d 70 6c 65  /ext/misc/comple
6750: 74 69 6f 6e 2e 63 0a 49 4e 43 4c 55 44 45 20 2e  tion.c.INCLUDE .
6760: 2e 2f 65 78 74 2f 6d 69 73 63 2f 61 70 70 65 6e  ./ext/misc/appen
6770: 64 76 66 73 2e 63 0a 23 69 66 64 65 66 20 53 51  dvfs.c.#ifdef SQ
6780: 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a 49  LITE_HAVE_ZLIB.I
6790: 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69  NCLUDE ../ext/mi
67a0: 73 63 2f 7a 69 70 66 69 6c 65 2e 63 0a 49 4e 43  sc/zipfile.c.INC
67b0: 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63  LUDE ../ext/misc
67c0: 2f 73 71 6c 61 72 2e 63 0a 23 65 6e 64 69 66 0a  /sqlar.c.#endif.
67d0: 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 65  INCLUDE ../ext/e
67e0: 78 70 65 72 74 2f 73 71 6c 69 74 65 33 65 78 70  xpert/sqlite3exp
67f0: 65 72 74 2e 68 0a 49 4e 43 4c 55 44 45 20 2e 2e  ert.h.INCLUDE ..
6800: 2f 65 78 74 2f 65 78 70 65 72 74 2f 73 71 6c 69  /ext/expert/sqli
6810: 74 65 33 65 78 70 65 72 74 2e 63 0a 0a 23 69 66  te3expert.c..#if
6820: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
6830: 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a  ENABLE_SESSION).
6840: 2f 2a 0a 2a 2a 20 53 74 61 74 65 20 69 6e 66 6f  /*.** State info
6850: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 73 69  rmation for a si
6860: 6e 67 6c 65 20 6f 70 65 6e 20 73 65 73 73 69 6f  ngle open sessio
6870: 6e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  n.*/.typedef str
6880: 75 63 74 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20  uct OpenSession 
6890: 4f 70 65 6e 53 65 73 73 69 6f 6e 3b 0a 73 74 72  OpenSession;.str
68a0: 75 63 74 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20  uct OpenSession 
68b0: 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  {.  char *zName;
68c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
68d0: 53 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 66 6f  Symbolic name fo
68e0: 72 20 74 68 69 73 20 73 65 73 73 69 6f 6e 20 2a  r this session *
68f0: 2f 0a 20 20 69 6e 74 20 6e 46 69 6c 74 65 72 3b  /.  int nFilter;
6900: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6910: 4e 75 6d 62 65 72 20 6f 66 20 78 46 69 6c 74 65  Number of xFilte
6920: 72 20 72 65 6a 65 63 74 69 6f 6e 20 47 4c 4f 42  r rejection GLOB
6930: 20 70 61 74 74 65 72 6e 73 20 2a 2f 0a 20 20 63   patterns */.  c
6940: 68 61 72 20 2a 2a 61 7a 46 69 6c 74 65 72 3b 20  har **azFilter; 
6950: 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79          /* Array
6960: 20 6f 66 20 78 46 69 6c 74 65 72 20 72 65 6a 65   of xFilter reje
6970: 63 74 69 6f 6e 20 47 4c 4f 42 20 70 61 74 74 65  ction GLOB patte
6980: 72 6e 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  rns */.  sqlite3
6990: 5f 73 65 73 73 69 6f 6e 20 2a 70 3b 20 20 20 20  _session *p;    
69a0: 20 20 2f 2a 20 54 68 65 20 6f 70 65 6e 20 73 65    /* The open se
69b0: 73 73 69 6f 6e 20 2a 2f 0a 7d 3b 0a 23 65 6e 64  ssion */.};.#end
69c0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 68 65 6c 6c 20  if../*.** Shell 
69d0: 6f 75 74 70 75 74 20 6d 6f 64 65 20 69 6e 66 6f  output mode info
69e0: 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 62 65 66  rmation from bef
69f0: 6f 72 65 20 22 2e 65 78 70 6c 61 69 6e 20 6f 6e  ore ".explain on
6a00: 22 2c 0a 2a 2a 20 73 61 76 65 64 20 73 6f 20 74  ",.** saved so t
6a10: 68 61 74 20 69 74 20 63 61 6e 20 62 65 20 72 65  hat it can be re
6a20: 73 74 6f 72 65 64 20 62 79 20 22 2e 65 78 70 6c  stored by ".expl
6a30: 61 69 6e 20 6f 66 66 22 0a 2a 2f 0a 74 79 70 65  ain off".*/.type
6a40: 64 65 66 20 73 74 72 75 63 74 20 53 61 76 65 64  def struct Saved
6a50: 4d 6f 64 65 49 6e 66 6f 20 53 61 76 65 64 4d 6f  ModeInfo SavedMo
6a60: 64 65 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20 53  deInfo;.struct S
6a70: 61 76 65 64 4d 6f 64 65 49 6e 66 6f 20 7b 0a 20  avedModeInfo {. 
6a80: 20 69 6e 74 20 76 61 6c 69 64 3b 20 20 20 20 20   int valid;     
6a90: 20 20 20 20 20 2f 2a 20 49 73 20 74 68 65 72 65       /* Is there
6aa0: 20 6c 65 67 69 74 20 64 61 74 61 20 69 6e 20 68   legit data in h
6ab0: 65 72 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f  ere? */.  int mo
6ac0: 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  de;           /*
6ad0: 20 4d 6f 64 65 20 70 72 69 6f 72 20 74 6f 20 22   Mode prior to "
6ae0: 2e 65 78 70 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a  .explain on" */.
6af0: 20 20 69 6e 74 20 73 68 6f 77 48 65 61 64 65 72    int showHeader
6b00: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 22 2e 68  ;     /* The ".h
6b10: 65 61 64 65 72 22 20 73 65 74 74 69 6e 67 20 70  eader" setting p
6b20: 72 69 6f 72 20 74 6f 20 22 2e 65 78 70 6c 61 69  rior to ".explai
6b30: 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74 20 63  n on" */.  int c
6b40: 6f 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20 20 2f  olWidth[100];  /
6b50: 2a 20 43 6f 6c 75 6d 6e 20 77 69 64 74 68 73 20  * Column widths 
6b60: 70 72 69 6f 72 20 74 6f 20 22 2e 65 78 70 6c 61  prior to ".expla
6b70: 69 6e 20 6f 6e 22 20 2a 2f 0a 7d 3b 0a 0a 74 79  in on" */.};..ty
6b80: 70 65 64 65 66 20 73 74 72 75 63 74 20 45 78 70  pedef struct Exp
6b90: 65 72 74 49 6e 66 6f 20 45 78 70 65 72 74 49 6e  ertInfo ExpertIn
6ba0: 66 6f 3b 0a 73 74 72 75 63 74 20 45 78 70 65 72  fo;.struct Exper
6bb0: 74 49 6e 66 6f 20 7b 0a 20 20 73 71 6c 69 74 65  tInfo {.  sqlite
6bc0: 33 65 78 70 65 72 74 20 2a 70 45 78 70 65 72 74  3expert *pExpert
6bd0: 3b 0a 20 20 69 6e 74 20 62 56 65 72 62 6f 73 65  ;.  int bVerbose
6be0: 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 74  ;.};../*.** Stat
6bf0: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  e information ab
6c00: 6f 75 74 20 74 68 65 20 64 61 74 61 62 61 73 65  out the database
6c10: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63   connection is c
6c20: 6f 6e 74 61 69 6e 65 64 20 69 6e 20 61 6e 0a 2a  ontained in an.*
6c30: 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68  * instance of th
6c40: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75  e following stru
6c50: 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65  cture..*/.typede
6c60: 66 20 73 74 72 75 63 74 20 53 68 65 6c 6c 53 74  f struct ShellSt
6c70: 61 74 65 20 53 68 65 6c 6c 53 74 61 74 65 3b 0a  ate ShellState;.
6c80: 73 74 72 75 63 74 20 53 68 65 6c 6c 53 74 61 74  struct ShellStat
6c90: 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  e {.  sqlite3 *d
6ca0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  b;           /* 
6cb0: 54 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  The database */.
6cc0: 20 20 75 38 20 61 75 74 6f 45 78 70 6c 61 69 6e    u8 autoExplain
6cd0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 75 74 6f  ;        /* Auto
6ce0: 6d 61 74 69 63 61 6c 6c 79 20 74 75 72 6e 20 6f  matically turn o
6cf0: 6e 20 2e 65 78 70 6c 61 69 6e 20 6d 6f 64 65 20  n .explain mode 
6d00: 2a 2f 0a 20 20 75 38 20 61 75 74 6f 45 51 50 3b  */.  u8 autoEQP;
6d10: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52              /* R
6d20: 75 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  un EXPLAIN QUERY
6d30: 20 50 4c 41 4e 20 70 72 69 6f 72 20 74 6f 20 73   PLAN prior to s
6d40: 65 61 63 68 20 53 51 4c 20 73 74 6d 74 20 2a 2f  each SQL stmt */
6d50: 0a 20 20 75 38 20 73 74 61 74 73 4f 6e 3b 20 20  .  u8 statsOn;  
6d60: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
6d70: 65 20 74 6f 20 64 69 73 70 6c 61 79 20 6d 65 6d  e to display mem
6d80: 6f 72 79 20 73 74 61 74 73 20 62 65 66 6f 72 65  ory stats before
6d90: 20 65 61 63 68 20 66 69 6e 61 6c 69 7a 65 20 2a   each finalize *
6da0: 2f 0a 20 20 75 38 20 73 63 61 6e 73 74 61 74 73  /.  u8 scanstats
6db0: 4f 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 72  On;        /* Tr
6dc0: 75 65 20 74 6f 20 64 69 73 70 6c 61 79 20 73 63  ue to display sc
6dd0: 61 6e 20 73 74 61 74 73 20 62 65 66 6f 72 65 20  an stats before 
6de0: 65 61 63 68 20 66 69 6e 61 6c 69 7a 65 20 2a 2f  each finalize */
6df0: 0a 20 20 75 38 20 6f 70 65 6e 4d 6f 64 65 3b 20  .  u8 openMode; 
6e00: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 48 45            /* SHE
6e10: 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 2c 20  LL_OPEN_NORMAL, 
6e20: 5f 41 50 50 45 4e 44 56 46 53 2c 20 6f 72 20 5f  _APPENDVFS, or _
6e30: 5a 49 50 46 49 4c 45 20 2a 2f 0a 20 20 75 38 20  ZIPFILE */.  u8 
6e40: 64 6f 58 64 67 4f 70 65 6e 3b 20 20 20 20 20 20  doXdgOpen;      
6e50: 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 73 74      /* Invoke st
6e60: 61 72 74 2f 6f 70 65 6e 2f 78 64 67 2d 6f 70 65  art/open/xdg-ope
6e70: 6e 20 69 6e 20 6f 75 74 70 75 74 5f 72 65 73 65  n in output_rese
6e80: 74 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 75 74  t() */.  int out
6e90: 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20 20  Count;          
6ea0: 2f 2a 20 52 65 76 65 72 74 20 74 6f 20 73 74 64  /* Revert to std
6eb0: 6f 75 74 20 77 68 65 6e 20 72 65 61 63 68 69 6e  out when reachin
6ec0: 67 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74 20  g zero */.  int 
6ed0: 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  cnt;            
6ee0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6ef0: 72 65 63 6f 72 64 73 20 64 69 73 70 6c 61 79 65  records displaye
6f00: 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 46 49  d so far */.  FI
6f10: 4c 45 20 2a 6f 75 74 3b 20 20 20 20 20 20 20 20  LE *out;        
6f20: 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72 65       /* Write re
6f30: 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20 20  sults here */.  
6f40: 46 49 4c 45 20 2a 74 72 61 63 65 4f 75 74 3b 20  FILE *traceOut; 
6f50: 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75 74         /* Output
6f60: 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 74 72 61   for sqlite3_tra
6f70: 63 65 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e 45  ce() */.  int nE
6f80: 72 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  rr;             
6f90: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72   /* Number of er
6fa0: 72 6f 72 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69  rors seen */.  i
6fb0: 6e 74 20 6d 6f 64 65 3b 20 20 20 20 20 20 20 20  nt mode;        
6fc0: 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 75 74 70        /* An outp
6fd0: 75 74 20 6d 6f 64 65 20 73 65 74 74 69 6e 67 20  ut mode setting 
6fe0: 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64 65 50 72 69  */.  int modePri
6ff0: 6f 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  or;         /* S
7000: 61 76 65 64 20 6d 6f 64 65 20 2a 2f 0a 20 20 69  aved mode */.  i
7010: 6e 74 20 63 4d 6f 64 65 3b 20 20 20 20 20 20 20  nt cMode;       
7020: 20 20 20 20 20 20 2f 2a 20 74 65 6d 70 6f 72 61        /* tempora
7030: 72 79 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 66  ry output mode f
7040: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 71  or the current q
7050: 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  uery */.  int no
7060: 72 6d 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20  rmalMode;       
7070: 20 2f 2a 20 4f 75 74 70 75 74 20 6d 6f 64 65 20   /* Output mode 
7080: 62 65 66 6f 72 65 20 22 2e 65 78 70 6c 61 69 6e  before ".explain
7090: 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74 20 77 72   on" */.  int wr
70a0: 69 74 61 62 6c 65 53 63 68 65 6d 61 3b 20 20 20  itableSchema;   
70b0: 20 2f 2a 20 54 72 75 65 20 69 66 20 50 52 41 47   /* True if PRAG
70c0: 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65  MA writable_sche
70d0: 6d 61 3d 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 73  ma=ON */.  int s
70e0: 68 6f 77 48 65 61 64 65 72 3b 20 20 20 20 20 20  howHeader;      
70f0: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 68 6f    /* True to sho
7100: 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69  w column names i
7110: 6e 20 4c 69 73 74 20 6f 72 20 43 6f 6c 75 6d 6e  n List or Column
7120: 20 6d 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   mode */.  int n
7130: 43 68 65 63 6b 3b 20 20 20 20 20 20 20 20 20 20  Check;          
7140: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 22    /* Number of "
7150: 2e 63 68 65 63 6b 22 20 63 6f 6d 6d 61 6e 64 73  .check" commands
7160: 20 72 75 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e   run */.  unsign
7170: 65 64 20 73 68 65 6c 6c 46 6c 67 73 3b 20 20 20  ed shellFlgs;   
7180: 20 2f 2a 20 56 61 72 69 6f 75 73 20 66 6c 61 67   /* Various flag
7190: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 65  s */.  char *zDe
71a0: 73 74 54 61 62 6c 65 3b 20 20 20 20 20 20 2f 2a  stTable;      /*
71b0: 20 4e 61 6d 65 20 6f 66 20 64 65 73 74 69 6e 61   Name of destina
71c0: 74 69 6f 6e 20 74 61 62 6c 65 20 77 68 65 6e 20  tion table when 
71d0: 4d 4f 44 45 5f 49 6e 73 65 72 74 20 2a 2f 0a 20  MODE_Insert */. 
71e0: 20 63 68 61 72 20 2a 7a 54 65 6d 70 46 69 6c 65   char *zTempFile
71f0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70 6f  ;       /* Tempo
7200: 72 61 72 79 20 66 69 6c 65 20 74 68 61 74 20 6d  rary file that m
7210: 69 67 68 74 20 6e 65 65 64 20 64 65 6c 65 74 69  ight need deleti
7220: 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54 65  ng */.  char zTe
7230: 73 74 63 61 73 65 5b 33 30 5d 3b 20 20 20 20 2f  stcase[30];    /
7240: 2a 20 4e 61 6d 65 20 6f 66 20 63 75 72 72 65 6e  * Name of curren
7250: 74 20 74 65 73 74 20 63 61 73 65 20 2a 2f 0a 20  t test case */. 
7260: 20 63 68 61 72 20 63 6f 6c 53 65 70 61 72 61 74   char colSeparat
7270: 6f 72 5b 32 30 5d 3b 20 2f 2a 20 43 6f 6c 75 6d  or[20]; /* Colum
7280: 6e 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72  n separator char
7290: 61 63 74 65 72 20 66 6f 72 20 73 65 76 65 72 61  acter for severa
72a0: 6c 20 6d 6f 64 65 73 20 2a 2f 0a 20 20 63 68 61  l modes */.  cha
72b0: 72 20 72 6f 77 53 65 70 61 72 61 74 6f 72 5b 32  r rowSeparator[2
72c0: 30 5d 3b 20 2f 2a 20 52 6f 77 20 73 65 70 61 72  0]; /* Row separ
72d0: 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 20 66  ator character f
72e0: 6f 72 20 4d 4f 44 45 5f 41 73 63 69 69 20 2a 2f  or MODE_Ascii */
72f0: 0a 20 20 63 68 61 72 20 63 6f 6c 53 65 70 50 72  .  char colSepPr
7300: 69 6f 72 5b 32 30 5d 3b 20 20 2f 2a 20 53 61 76  ior[20];  /* Sav
7310: 65 64 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61  ed column separa
7320: 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 72 6f  tor */.  char ro
7330: 77 53 65 70 50 72 69 6f 72 5b 32 30 5d 3b 20 20  wSepPrior[20];  
7340: 2f 2a 20 53 61 76 65 64 20 72 6f 77 20 73 65 70  /* Saved row sep
7350: 61 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74 20  arator */.  int 
7360: 63 6f 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20 20  colWidth[100];  
7370: 20 20 20 2f 2a 20 52 65 71 75 65 73 74 65 64 20     /* Requested 
7380: 77 69 64 74 68 20 6f 66 20 65 61 63 68 20 63 6f  width of each co
7390: 6c 75 6d 6e 20 77 68 65 6e 20 69 6e 20 63 6f 6c  lumn when in col
73a0: 75 6d 6e 20 6d 6f 64 65 2a 2f 0a 20 20 69 6e 74  umn mode*/.  int
73b0: 20 61 63 74 75 61 6c 57 69 64 74 68 5b 31 30 30   actualWidth[100
73c0: 5d 3b 20 20 2f 2a 20 41 63 74 75 61 6c 20 77 69  ];  /* Actual wi
73d0: 64 74 68 20 6f 66 20 65 61 63 68 20 63 6f 6c 75  dth of each colu
73e0: 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 6e 75 6c  mn */.  char nul
73f0: 6c 56 61 6c 75 65 5b 32 30 5d 3b 20 20 20 20 2f  lValue[20];    /
7400: 2a 20 54 68 65 20 74 65 78 74 20 74 6f 20 70 72  * The text to pr
7410: 69 6e 74 20 77 68 65 6e 20 61 20 4e 55 4c 4c 20  int when a NULL 
7420: 63 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f 6d 0a  comes 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 20 2a 2a 20 74 68 65 20           ** the 
7450: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68  database */.  ch
7460: 61 72 20 6f 75 74 66 69 6c 65 5b 46 49 4c 45 4e  ar outfile[FILEN
7470: 41 4d 45 5f 4d 41 58 5d 3b 20 2f 2a 20 46 69 6c  AME_MAX]; /* Fil
7480: 65 6e 61 6d 65 20 66 6f 72 20 2a 6f 75 74 20 2a  ename for *out *
7490: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
74a0: 7a 44 62 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20  zDbFilename;    
74b0: 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* name of the d
74c0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
74d0: 20 20 63 68 61 72 20 2a 7a 46 72 65 65 4f 6e 43    char *zFreeOnC
74e0: 6c 6f 73 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  lose;         /*
74f0: 20 46 69 6c 65 6e 61 6d 65 20 74 6f 20 66 72 65   Filename to fre
7500: 65 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a  e when closing *
7510: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
7520: 7a 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 20  zVfs;           
7530: 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53 20 74  /* Name of VFS t
7540: 6f 20 75 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  o use */.  sqlit
7550: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20  e3_stmt *pStmt; 
7560: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 74 61    /* Current sta
7570: 74 65 6d 65 6e 74 20 69 66 20 61 6e 79 2e 20 2a  tement if any. *
7580: 2f 0a 20 20 46 49 4c 45 20 2a 70 4c 6f 67 3b 20  /.  FILE *pLog; 
7590: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
75a0: 69 74 65 20 6c 6f 67 20 6f 75 74 70 75 74 20 68  ite log output h
75b0: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69  ere */.  int *ai
75c0: 49 6e 64 65 6e 74 3b 20 20 20 20 20 20 20 20 20  Indent;         
75d0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 69 6e 64 65  /* Array of inde
75e0: 6e 74 73 20 75 73 65 64 20 69 6e 20 4d 4f 44 45  nts used in MODE
75f0: 5f 45 78 70 6c 61 69 6e 20 2a 2f 0a 20 20 69 6e  _Explain */.  in
7600: 74 20 6e 49 6e 64 65 6e 74 3b 20 20 20 20 20 20  t nIndent;      
7610: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
7620: 61 72 72 61 79 20 61 69 49 6e 64 65 6e 74 5b 5d  array aiIndent[]
7630: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65 6e   */.  int iInden
7640: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
7650: 49 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74  Index of current
7660: 20 6f 70 20 69 6e 20 61 69 49 6e 64 65 6e 74 5b   op in aiIndent[
7670: 5d 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ] */.#if defined
7680: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53  (SQLITE_ENABLE_S
7690: 45 53 53 49 4f 4e 29 0a 20 20 69 6e 74 20 6e 53  ESSION).  int nS
76a0: 65 73 73 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  ession;         
76b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
76c0: 20 61 63 74 69 76 65 20 73 65 73 73 69 6f 6e 73   active sessions
76d0: 20 2a 2f 0a 20 20 4f 70 65 6e 53 65 73 73 69 6f   */.  OpenSessio
76e0: 6e 20 61 53 65 73 73 69 6f 6e 5b 34 5d 3b 20 20  n aSession[4];  
76f0: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 65 73 73  /* Array of sess
7700: 69 6f 6e 73 2e 20 20 5b 30 5d 20 69 73 20 69 6e  ions.  [0] is in
7710: 20 66 6f 63 75 73 2e 20 2a 2f 0a 23 65 6e 64 69   focus. */.#endi
7720: 66 0a 20 20 45 78 70 65 72 74 49 6e 66 6f 20 65  f.  ExpertInfo e
7730: 78 70 65 72 74 3b 20 20 20 20 20 20 20 20 2f 2a  xpert;        /*
7740: 20 56 61 6c 69 64 20 69 66 20 70 72 65 76 69 6f   Valid if previo
7750: 75 73 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20 22  us command was "
7760: 2e 65 78 70 65 72 74 20 4f 50 54 2e 2e 2e 22 20  .expert OPT..." 
7770: 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 20 41 6c 6c 6f 77  */.};.../* Allow
7780: 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20 53 68  ed values for Sh
7790: 65 6c 6c 53 74 61 74 65 2e 61 75 74 6f 45 51 50  ellState.autoEQP
77a0: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 41 55 54 4f  .*/.#define AUTO
77b0: 45 51 50 5f 6f 66 66 20 20 20 20 20 20 30 0a 23  EQP_off      0.#
77c0: 64 65 66 69 6e 65 20 41 55 54 4f 45 51 50 5f 6f  define AUTOEQP_o
77d0: 6e 20 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e  n       1.#defin
77e0: 65 20 41 55 54 4f 45 51 50 5f 74 72 69 67 67 65  e AUTOEQP_trigge
77f0: 72 20 20 32 0a 23 64 65 66 69 6e 65 20 41 55 54  r  2.#define AUT
7800: 4f 45 51 50 5f 66 75 6c 6c 20 20 20 20 20 33 0a  OEQP_full     3.
7810: 0a 2f 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75  ./* Allowed valu
7820: 65 73 20 66 6f 72 20 53 68 65 6c 6c 53 74 61 74  es for ShellStat
7830: 65 2e 6f 70 65 6e 4d 6f 64 65 0a 2a 2f 0a 23 64  e.openMode.*/.#d
7840: 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e  efine SHELL_OPEN
7850: 5f 55 4e 53 50 45 43 20 20 20 20 20 30 20 20 20  _UNSPEC     0   
7860: 20 20 20 2f 2a 20 4e 6f 20 6f 70 65 6e 2d 6d 6f     /* No open-mo
7870: 64 65 20 73 70 65 63 69 66 69 65 64 20 2a 2f 0a  de specified */.
7880: 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50  #define SHELL_OP
7890: 45 4e 5f 4e 4f 52 4d 41 4c 20 20 20 20 20 31 20  EN_NORMAL     1 
78a0: 20 20 20 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 64       /* Normal d
78b0: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
78c0: 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50  #define SHELL_OP
78d0: 45 4e 5f 41 50 50 45 4e 44 56 46 53 20 20 32 20  EN_APPENDVFS  2 
78e0: 20 20 20 20 20 2f 2a 20 55 73 65 20 61 70 70 65       /* Use appe
78f0: 6e 64 76 66 73 20 2a 2f 0a 23 64 65 66 69 6e 65  ndvfs */.#define
7900: 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46   SHELL_OPEN_ZIPF
7910: 49 4c 45 20 20 20 20 33 20 20 20 20 20 20 2f 2a  ILE    3      /*
7920: 20 55 73 65 20 74 68 65 20 7a 69 70 66 69 6c 65   Use the zipfile
7930: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
7940: 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f  /.#define SHELL_
7950: 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20 20  OPEN_READONLY   
7960: 34 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20 61  4      /* Open a
7970: 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73 65   normal database
7980: 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 0a 2f   read-only */../
7990: 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74  *.** These are t
79a0: 68 65 20 61 6c 6c 6f 77 65 64 20 73 68 65 6c 6c  he allowed shell
79b0: 46 6c 67 73 20 76 61 6c 75 65 73 0a 2a 2f 0a 23  Flgs values.*/.#
79c0: 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 50 61 67  define SHFLG_Pag
79d0: 65 63 61 63 68 65 20 20 20 20 20 20 30 78 30 30  ecache      0x00
79e0: 30 30 30 30 30 31 20 2f 2a 20 54 68 65 20 2d 2d  000001 /* The --
79f0: 70 61 67 65 63 61 63 68 65 20 6f 70 74 69 6f 6e  pagecache option
7a00: 20 69 73 20 75 73 65 64 20 2a 2f 0a 23 64 65 66   is used */.#def
7a10: 69 6e 65 20 53 48 46 4c 47 5f 4c 6f 6f 6b 61 73  ine SHFLG_Lookas
7a20: 69 64 65 20 20 20 20 20 20 30 78 30 30 30 30 30  ide      0x00000
7a30: 30 30 32 20 2f 2a 20 4c 6f 6f 6b 61 73 69 64 65  002 /* Lookaside
7a40: 20 6d 65 6d 6f 72 79 20 69 73 20 75 73 65 64 20   memory is used 
7a50: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47  */.#define SHFLG
7a60: 5f 42 61 63 6b 73 6c 61 73 68 20 20 20 20 20 20  _Backslash      
7a70: 30 78 30 30 30 30 30 30 30 34 20 2f 2a 20 54 68  0x00000004 /* Th
7a80: 65 20 2d 2d 62 61 63 6b 73 6c 61 73 68 20 6f 70  e --backslash op
7a90: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 2a 2f 0a  tion is used */.
7aa0: 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 50 72  #define SHFLG_Pr
7ab0: 65 73 65 72 76 65 52 6f 77 69 64 20 20 30 78 30  eserveRowid  0x0
7ac0: 30 30 30 30 30 30 38 20 2f 2a 20 2e 64 75 6d 70  0000008 /* .dump
7ad0: 20 70 72 65 73 65 72 76 65 73 20 72 6f 77 69 64   preserves rowid
7ae0: 20 76 61 6c 75 65 73 20 2a 2f 0a 23 64 65 66 69   values */.#defi
7af0: 6e 65 20 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65  ne SHFLG_Newline
7b00: 73 20 20 20 20 20 20 20 30 78 30 30 30 30 30 30  s       0x000000
7b10: 31 30 20 2f 2a 20 2e 64 75 6d 70 20 2d 2d 6e 65  10 /* .dump --ne
7b20: 77 6c 69 6e 65 20 66 6c 61 67 20 2a 2f 0a 23 64  wline flag */.#d
7b30: 65 66 69 6e 65 20 53 48 46 4c 47 5f 43 6f 75 6e  efine SHFLG_Coun
7b40: 74 43 68 61 6e 67 65 73 20 20 20 30 78 30 30 30  tChanges   0x000
7b50: 30 30 30 32 30 20 2f 2a 20 2e 63 68 61 6e 67 65  00020 /* .change
7b60: 73 20 73 65 74 74 69 6e 67 20 2a 2f 0a 23 64 65  s setting */.#de
7b70: 66 69 6e 65 20 53 48 46 4c 47 5f 45 63 68 6f 20  fine SHFLG_Echo 
7b80: 20 20 20 20 20 20 20 20 20 20 30 78 30 30 30 30            0x0000
7b90: 30 30 34 30 20 2f 2a 20 2e 65 63 68 6f 20 6f 72  0040 /* .echo or
7ba0: 20 2d 2d 65 63 68 6f 20 73 65 74 74 69 6e 67 20   --echo setting 
7bb0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73  */../*.** Macros
7bc0: 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
7bd0: 20 73 65 74 74 69 6e 67 20 73 68 65 6c 6c 46 6c   setting shellFl
7be0: 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 68  gs.*/.#define Sh
7bf0: 65 6c 6c 48 61 73 46 6c 61 67 28 50 2c 58 29 20  ellHasFlag(P,X) 
7c00: 20 20 20 28 28 28 50 29 2d 3e 73 68 65 6c 6c 46     (((P)->shellF
7c10: 6c 67 73 20 26 20 28 58 29 29 21 3d 30 29 0a 23  lgs & (X))!=0).#
7c20: 64 65 66 69 6e 65 20 53 68 65 6c 6c 53 65 74 46  define ShellSetF
7c30: 6c 61 67 28 50 2c 58 29 20 20 20 20 28 28 50 29  lag(P,X)    ((P)
7c40: 2d 3e 73 68 65 6c 6c 46 6c 67 73 7c 3d 28 58 29  ->shellFlgs|=(X)
7c50: 29 0a 23 64 65 66 69 6e 65 20 53 68 65 6c 6c 43  ).#define ShellC
7c60: 6c 65 61 72 46 6c 61 67 28 50 2c 58 29 20 20 28  learFlag(P,X)  (
7c70: 28 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 26 3d  (P)->shellFlgs&=
7c80: 28 7e 28 58 29 29 29 0a 0a 2f 2a 0a 2a 2a 20 54  (~(X)))../*.** T
7c90: 68 65 73 65 20 61 72 65 20 74 68 65 20 61 6c 6c  hese are the all
7ca0: 6f 77 65 64 20 6d 6f 64 65 73 2e 0a 2a 2f 0a 23  owed modes..*/.#
7cb0: 64 65 66 69 6e 65 20 4d 4f 44 45 5f 4c 69 6e 65  define MODE_Line
7cc0: 20 20 20 20 20 30 20 20 2f 2a 20 4f 6e 65 20 63       0  /* One c
7cd0: 6f 6c 75 6d 6e 20 70 65 72 20 6c 69 6e 65 2e 20  olumn per line. 
7ce0: 20 42 6c 61 6e 6b 20 6c 69 6e 65 20 62 65 74 77   Blank line betw
7cf0: 65 65 6e 20 72 65 63 6f 72 64 73 20 2a 2f 0a 23  een records */.#
7d00: 64 65 66 69 6e 65 20 4d 4f 44 45 5f 43 6f 6c 75  define MODE_Colu
7d10: 6d 6e 20 20 20 31 20 20 2f 2a 20 4f 6e 65 20 72  mn   1  /* One r
7d20: 65 63 6f 72 64 20 70 65 72 20 6c 69 6e 65 20 69  ecord per line i
7d30: 6e 20 6e 65 61 74 20 63 6f 6c 75 6d 6e 73 20 2a  n neat columns *
7d40: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 4c  /.#define MODE_L
7d50: 69 73 74 20 20 20 20 20 32 20 20 2f 2a 20 4f 6e  ist     2  /* On
7d60: 65 20 72 65 63 6f 72 64 20 70 65 72 20 6c 69 6e  e record per lin
7d70: 65 20 77 69 74 68 20 61 20 73 65 70 61 72 61 74  e with a separat
7d80: 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  or */.#define MO
7d90: 44 45 5f 53 65 6d 69 20 20 20 20 20 33 20 20 2f  DE_Semi     3  /
7da0: 2a 20 53 61 6d 65 20 61 73 20 4d 4f 44 45 5f 4c  * Same as MODE_L
7db0: 69 73 74 20 62 75 74 20 61 70 70 65 6e 64 20 22  ist but append "
7dc0: 3b 22 20 74 6f 20 65 61 63 68 20 6c 69 6e 65 20  ;" to each line 
7dd0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
7de0: 48 74 6d 6c 20 20 20 20 20 34 20 20 2f 2a 20 47  Html     4  /* G
7df0: 65 6e 65 72 61 74 65 20 61 6e 20 58 48 54 4d 4c  enerate an XHTML
7e00: 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e   table */.#defin
7e10: 65 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20 20 20  e MODE_Insert   
7e20: 35 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 53  5  /* Generate S
7e30: 51 4c 20 22 69 6e 73 65 72 74 22 20 73 74 61 74  QL "insert" stat
7e40: 65 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e  ements */.#defin
7e50: 65 20 4d 4f 44 45 5f 51 75 6f 74 65 20 20 20 20  e MODE_Quote    
7e60: 36 20 20 2f 2a 20 51 75 6f 74 65 20 76 61 6c 75  6  /* Quote valu
7e70: 65 73 20 61 73 20 66 6f 72 20 53 51 4c 20 2a 2f  es as for SQL */
7e80: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 54 63  .#define MODE_Tc
7e90: 6c 20 20 20 20 20 20 37 20 20 2f 2a 20 47 65 6e  l      7  /* Gen
7ea0: 65 72 61 74 65 20 41 4e 53 49 2d 43 20 6f 72 20  erate ANSI-C or 
7eb0: 54 43 4c 20 71 75 6f 74 65 64 20 65 6c 65 6d 65  TCL quoted eleme
7ec0: 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  nts */.#define M
7ed0: 4f 44 45 5f 43 73 76 20 20 20 20 20 20 38 20 20  ODE_Csv      8  
7ee0: 2f 2a 20 51 75 6f 74 65 20 73 74 72 69 6e 67 73  /* Quote strings
7ef0: 2c 20 6e 75 6d 62 65 72 73 20 61 72 65 20 70 6c  , numbers are pl
7f00: 61 69 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  ain */.#define M
7f10: 4f 44 45 5f 45 78 70 6c 61 69 6e 20 20 39 20 20  ODE_Explain  9  
7f20: 2f 2a 20 4c 69 6b 65 20 4d 4f 44 45 5f 43 6f 6c  /* Like MODE_Col
7f30: 75 6d 6e 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20  umn, but do not 
7f40: 74 72 75 6e 63 61 74 65 20 64 61 74 61 20 2a 2f  truncate data */
7f50: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 41 73  .#define MODE_As
7f60: 63 69 69 20 20 20 31 30 20 20 2f 2a 20 55 73 65  cii   10  /* Use
7f70: 20 41 53 43 49 49 20 75 6e 69 74 20 61 6e 64 20   ASCII unit and 
7f80: 72 65 63 6f 72 64 20 73 65 70 61 72 61 74 6f 72  record separator
7f90: 73 20 28 30 78 31 46 2f 30 78 31 45 29 20 2a 2f  s (0x1F/0x1E) */
7fa0: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 50 72  .#define MODE_Pr
7fb0: 65 74 74 79 20 20 31 31 20 20 2f 2a 20 50 72 65  etty  11  /* Pre
7fc0: 74 74 79 2d 70 72 69 6e 74 20 73 63 68 65 6d 61  tty-print schema
7fd0: 73 20 2a 2f 0a 0a 73 74 61 74 69 63 20 63 6f 6e  s */..static con
7fe0: 73 74 20 63 68 61 72 20 2a 6d 6f 64 65 44 65 73  st char *modeDes
7ff0: 63 72 5b 5d 20 3d 20 7b 0a 20 20 22 6c 69 6e 65  cr[] = {.  "line
8000: 22 2c 0a 20 20 22 63 6f 6c 75 6d 6e 22 2c 0a 20  ",.  "column",. 
8010: 20 22 6c 69 73 74 22 2c 0a 20 20 22 73 65 6d 69   "list",.  "semi
8020: 22 2c 0a 20 20 22 68 74 6d 6c 22 2c 0a 20 20 22  ",.  "html",.  "
8030: 69 6e 73 65 72 74 22 2c 0a 20 20 22 71 75 6f 74  insert",.  "quot
8040: 65 22 2c 0a 20 20 22 74 63 6c 22 2c 0a 20 20 22  e",.  "tcl",.  "
8050: 63 73 76 22 2c 0a 20 20 22 65 78 70 6c 61 69 6e  csv",.  "explain
8060: 22 2c 0a 20 20 22 61 73 63 69 69 22 2c 0a 20 20  ",.  "ascii",.  
8070: 22 70 72 65 74 74 79 70 72 69 6e 74 22 2c 0a 7d  "prettyprint",.}
8080: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61  ;../*.** These a
8090: 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 2f 72 6f  re the column/ro
80a0: 77 2f 6c 69 6e 65 20 73 65 70 61 72 61 74 6f 72  w/line separator
80b0: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 76 61  s used by the va
80c0: 72 69 6f 75 73 0a 2a 2a 20 69 6d 70 6f 72 74 2f  rious.** import/
80d0: 65 78 70 6f 72 74 20 6d 6f 64 65 73 2e 0a 2a 2f  export modes..*/
80e0: 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 43 6f 6c  .#define SEP_Col
80f0: 75 6d 6e 20 20 20 20 22 7c 22 0a 23 64 65 66 69  umn    "|".#defi
8100: 6e 65 20 53 45 50 5f 52 6f 77 20 20 20 20 20 20  ne SEP_Row      
8110: 20 22 5c 6e 22 0a 23 64 65 66 69 6e 65 20 53 45   "\n".#define SE
8120: 50 5f 54 61 62 20 20 20 20 20 20 20 22 5c 74 22  P_Tab       "\t"
8130: 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 53 70 61  .#define SEP_Spa
8140: 63 65 20 20 20 20 20 22 20 22 0a 23 64 65 66 69  ce     " ".#defi
8150: 6e 65 20 53 45 50 5f 43 6f 6d 6d 61 20 20 20 20  ne SEP_Comma    
8160: 20 22 2c 22 0a 23 64 65 66 69 6e 65 20 53 45 50   ",".#define SEP
8170: 5f 43 72 4c 66 20 20 20 20 20 20 22 5c 72 5c 6e  _CrLf      "\r\n
8180: 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 55 6e  ".#define SEP_Un
8190: 69 74 20 20 20 20 20 20 22 5c 78 31 46 22 0a 23  it      "\x1F".#
81a0: 64 65 66 69 6e 65 20 53 45 50 5f 52 65 63 6f 72  define SEP_Recor
81b0: 64 20 20 20 20 22 5c 78 31 45 22 0a 0a 2f 2a 0a  d    "\x1E"../*.
81c0: 2a 2a 20 41 20 63 61 6c 6c 62 61 63 6b 20 66 6f  ** A callback fo
81d0: 72 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6c 6f  r the sqlite3_lo
81e0: 67 28 29 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  g() interface..*
81f0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68  /.static void sh
8200: 65 6c 6c 4c 6f 67 28 76 6f 69 64 20 2a 70 41 72  ellLog(void *pAr
8210: 67 2c 20 69 6e 74 20 69 45 72 72 43 6f 64 65 2c  g, int iErrCode,
8220: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73   const char *zMs
8230: 67 29 7b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  g){.  ShellState
8240: 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74   *p = (ShellStat
8250: 65 2a 29 70 41 72 67 3b 0a 20 20 69 66 28 20 70  e*)pArg;.  if( p
8260: 2d 3e 70 4c 6f 67 3d 3d 30 20 29 20 72 65 74 75  ->pLog==0 ) retu
8270: 72 6e 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74  rn;.  utf8_print
8280: 66 28 70 2d 3e 70 4c 6f 67 2c 20 22 28 25 64 29  f(p->pLog, "(%d)
8290: 20 25 73 5c 6e 22 2c 20 69 45 72 72 43 6f 64 65   %s\n", iErrCode
82a0: 2c 20 7a 4d 73 67 29 3b 0a 20 20 66 66 6c 75 73  , zMsg);.  fflus
82b0: 68 28 70 2d 3e 70 4c 6f 67 29 3b 0a 7d 0a 0a 2f  h(p->pLog);.}../
82c0: 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  *.** SQL functio
82d0: 6e 3a 20 20 73 68 65 6c 6c 5f 70 75 74 73 6e 6c  n:  shell_putsnl
82e0: 28 58 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65 20  (X).**.** Write 
82f0: 74 68 65 20 74 65 78 74 20 58 20 74 6f 20 74 68  the text X to th
8300: 65 20 73 63 72 65 65 6e 20 28 6f 72 20 77 68 61  e screen (or wha
8310: 74 65 76 65 72 20 6f 75 74 70 75 74 20 69 73 20  tever output is 
8320: 62 65 69 6e 67 20 64 69 72 65 63 74 65 64 29 0a  being directed).
8330: 2a 2a 20 61 64 64 69 6e 67 20 61 20 6e 65 77 6c  ** adding a newl
8340: 69 6e 65 20 61 74 20 74 68 65 20 65 6e 64 2c 20  ine at the end, 
8350: 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e 20  and then return 
8360: 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  X..*/.static voi
8370: 64 20 73 68 65 6c 6c 50 75 74 73 46 75 6e 63 28  d shellPutsFunc(
8380: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
8390: 78 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20  xt *pCtx,.  int 
83a0: 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nVal,.  sqlite3_
83b0: 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b  value **apVal.){
83c0: 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
83d0: 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 2a 29   = (ShellState*)
83e0: 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61 74  sqlite3_user_dat
83f0: 61 28 70 43 74 78 29 3b 0a 20 20 28 76 6f 69 64  a(pCtx);.  (void
8400: 29 6e 56 61 6c 3b 0a 20 20 75 74 66 38 5f 70 72  )nVal;.  utf8_pr
8410: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
8420: 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 76 61 6c  \n", sqlite3_val
8430: 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d  ue_text(apVal[0]
8440: 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65  ));.  sqlite3_re
8450: 73 75 6c 74 5f 76 61 6c 75 65 28 70 43 74 78 2c  sult_value(pCtx,
8460: 20 61 70 56 61 6c 5b 30 5d 29 3b 0a 7d 0a 0a 2f   apVal[0]);.}../
8470: 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f  *.** SQL functio
8480: 6e 3a 20 20 20 65 64 69 74 28 56 41 4c 55 45 29  n:   edit(VALUE)
8490: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
84a0: 20 20 20 20 65 64 69 74 28 56 41 4c 55 45 2c 45      edit(VALUE,E
84b0: 44 49 54 4f 52 29 0a 2a 2a 0a 2a 2a 20 54 68 65  DITOR).**.** The
84c0: 73 65 20 73 74 65 70 73 3a 0a 2a 2a 0a 2a 2a 20  se steps:.**.** 
84d0: 20 20 20 20 28 31 29 20 57 72 69 74 65 20 56 41      (1) Write VA
84e0: 4c 55 45 20 69 6e 74 6f 20 61 20 74 65 6d 70 6f  LUE into a tempo
84f0: 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 20 20 20  rary file..**   
8500: 20 20 28 32 29 20 52 75 6e 20 70 72 6f 67 72 61    (2) Run progra
8510: 6d 20 45 44 49 54 4f 52 20 6f 6e 20 74 68 61 74  m EDITOR on that
8520: 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65 2e   temporary file.
8530: 0a 2a 2a 20 20 20 20 20 28 33 29 20 52 65 61 64  .**     (3) Read
8540: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
8550: 69 6c 65 20 62 61 63 6b 20 61 6e 64 20 72 65 74  ile back and ret
8560: 75 72 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74 20  urn its content 
8570: 61 73 20 74 68 65 20 72 65 73 75 6c 74 2e 0a 2a  as the result..*
8580: 2a 20 20 20 20 20 28 34 29 20 44 65 6c 65 74 65  *     (4) Delete
8590: 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 66   the temporary f
85a0: 69 6c 65 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ile.**.** If the
85b0: 20 45 44 49 54 4f 52 20 61 72 67 75 6d 65 6e 74   EDITOR argument
85c0: 20 69 73 20 6f 6d 69 74 74 65 64 2c 20 75 73 65   is omitted, use
85d0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68   the value in th
85e0: 65 20 56 49 53 55 41 4c 0a 2a 2a 20 65 6e 76 69  e VISUAL.** envi
85f0: 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c 65  ronment variable
8600: 2e 20 20 49 66 20 73 74 69 6c 6c 20 74 68 65 72  .  If still ther
8610: 65 20 69 73 20 6e 6f 20 45 44 49 54 4f 52 2c 20  e is no EDITOR, 
8620: 74 68 72 6f 75 67 68 20 61 6e 20 65 72 72 6f 72  through an error
8630: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74 68 72  ..**.** Also thr
8640: 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66 20 74  ow an error if t
8650: 68 65 20 45 44 49 54 4f 52 20 70 72 6f 67 72 61  he EDITOR progra
8660: 6d 20 72 65 74 75 72 6e 73 20 61 20 6e 6f 6e 2d  m returns a non-
8670: 7a 65 72 6f 20 65 78 69 74 20 63 6f 64 65 2e 0a  zero exit code..
8680: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
8690: 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a  E_NOHAVE_SYSTEM.
86a0: 73 74 61 74 69 63 20 76 6f 69 64 20 65 64 69 74  static void edit
86b0: 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33 5f  Func(.  sqlite3_
86c0: 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78 74  context *context
86d0: 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20 20  ,.  int argc,.  
86e0: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
86f0: 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  argv.){.  const 
8700: 63 68 61 72 20 2a 7a 45 64 69 74 6f 72 3b 0a 20  char *zEditor;. 
8710: 20 63 68 61 72 20 2a 7a 54 65 6d 70 46 69 6c 65   char *zTempFile
8720: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 20   = 0;.  sqlite3 
8730: 2a 64 62 3b 0a 20 20 63 68 61 72 20 2a 7a 43 6d  *db;.  char *zCm
8740: 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 62 42 69  d = 0;.  int bBi
8750: 6e 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 46  n;.  int rc;.  F
8760: 49 4c 45 20 2a 66 20 3d 20 30 3b 0a 20 20 73 71  ILE *f = 0;.  sq
8770: 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b 0a  lite3_int64 sz;.
8780: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
8790: 78 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  x;.  unsigned ch
87a0: 61 72 20 2a 70 20 3d 20 30 3b 0a 0a 20 20 69 66  ar *p = 0;..  if
87b0: 28 20 61 72 67 63 3d 3d 32 20 29 7b 0a 20 20 20  ( argc==2 ){.   
87c0: 20 7a 45 64 69 74 6f 72 20 3d 20 28 63 6f 6e 73   zEditor = (cons
87d0: 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
87e0: 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76 5b  value_text(argv[
87f0: 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  1]);.  }else{.  
8800: 20 20 7a 45 64 69 74 6f 72 20 3d 20 67 65 74 65    zEditor = gete
8810: 6e 76 28 22 56 49 53 55 41 4c 22 29 3b 0a 20 20  nv("VISUAL");.  
8820: 7d 0a 20 20 69 66 28 20 7a 45 64 69 74 6f 72 3d  }.  if( zEditor=
8830: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
8840: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
8850: 6f 6e 74 65 78 74 2c 20 22 6e 6f 20 65 64 69 74  ontext, "no edit
8860: 6f 72 20 66 6f 72 20 65 64 69 74 28 29 22 2c 20  or for edit()", 
8870: 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  -1);.    return;
8880: 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
8890: 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61 72  e3_value_type(ar
88a0: 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f 4e  gv[0])==SQLITE_N
88b0: 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ULL ){.    sqlit
88c0: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
88d0: 63 6f 6e 74 65 78 74 2c 20 22 4e 55 4c 4c 20 69  context, "NULL i
88e0: 6e 70 75 74 20 74 6f 20 65 64 69 74 28 29 22 2c  nput to edit()",
88f0: 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   -1);.    return
8900: 3b 0a 20 20 7d 0a 20 20 64 62 20 3d 20 73 71 6c  ;.  }.  db = sql
8910: 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f  ite3_context_db_
8920: 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29 3b  handle(context);
8930: 0a 20 20 7a 54 65 6d 70 46 69 6c 65 20 3d 20 30  .  zTempFile = 0
8940: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65  ;.  sqlite3_file
8950: 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 30 2c 20  _control(db, 0, 
8960: 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45 4d  SQLITE_FCNTL_TEM
8970: 50 46 49 4c 45 4e 41 4d 45 2c 20 26 7a 54 65 6d  PFILENAME, &zTem
8980: 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 7a 54  pFile);.  if( zT
8990: 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  empFile==0 ){.  
89a0: 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34    sqlite3_uint64
89b0: 20 72 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69   r = 0;.    sqli
89c0: 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73  te3_randomness(s
89d0: 69 7a 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20  izeof(r), &r);. 
89e0: 20 20 20 7a 54 65 6d 70 46 69 6c 65 20 3d 20 73     zTempFile = s
89f0: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
8a00: 74 65 6d 70 25 6c 6c 78 22 2c 20 72 29 3b 0a 20  temp%llx", r);. 
8a10: 20 20 20 69 66 28 20 7a 54 65 6d 70 46 69 6c 65     if( zTempFile
8a20: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
8a30: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
8a40: 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74 29  r_nomem(context)
8a50: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
8a60: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 42 69 6e      }.  }.  bBin
8a70: 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65   = sqlite3_value
8a80: 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d 3d  _type(argv[0])==
8a90: 53 51 4c 49 54 45 5f 42 4c 4f 42 3b 0a 20 20 66  SQLITE_BLOB;.  f
8aa0: 20 3d 20 66 6f 70 65 6e 28 7a 54 65 6d 70 46 69   = fopen(zTempFi
8ab0: 6c 65 2c 20 62 42 69 6e 20 3f 20 22 77 62 22 20  le, bBin ? "wb" 
8ac0: 3a 20 22 77 22 29 3b 0a 20 20 69 66 28 20 66 3d  : "w");.  if( f=
8ad0: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
8ae0: 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28 63  3_result_error(c
8af0: 6f 6e 74 65 78 74 2c 20 22 65 64 69 74 28 29 20  ontext, "edit() 
8b00: 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 65 6d 70  cannot open temp
8b10: 20 66 69 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20   file", -1);.   
8b20: 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f   goto edit_func_
8b30: 65 6e 64 3b 0a 20 20 7d 0a 20 20 73 7a 20 3d 20  end;.  }.  sz = 
8b40: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62 79  sqlite3_value_by
8b50: 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20 20  tes(argv[0]);.  
8b60: 69 66 28 20 62 42 69 6e 20 29 7b 0a 20 20 20 20  if( bBin ){.    
8b70: 78 20 3d 20 66 77 72 69 74 65 28 73 71 6c 69 74  x = fwrite(sqlit
8b80: 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61 72  e3_value_blob(ar
8b90: 67 76 5b 30 5d 29 2c 20 31 2c 20 73 7a 2c 20 66  gv[0]), 1, sz, f
8ba0: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
8bb0: 78 20 3d 20 66 77 72 69 74 65 28 73 71 6c 69 74  x = fwrite(sqlit
8bc0: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72  e3_value_text(ar
8bd0: 67 76 5b 30 5d 29 2c 20 31 2c 20 73 7a 2c 20 66  gv[0]), 1, sz, f
8be0: 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28  );.  }.  fclose(
8bf0: 66 29 3b 0a 20 20 66 20 3d 20 30 3b 0a 20 20 69  f);.  f = 0;.  i
8c00: 66 28 20 78 21 3d 73 7a 20 29 7b 0a 20 20 20 20  f( x!=sz ){.    
8c10: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
8c20: 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22 65  rror(context, "e
8c30: 64 69 74 28 29 20 63 6f 75 6c 64 20 6e 6f 74 20  dit() could not 
8c40: 77 72 69 74 65 20 74 68 65 20 77 68 6f 6c 65 20  write the whole 
8c50: 66 69 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20 20  file", -1);.    
8c60: 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f 65  goto edit_func_e
8c70: 6e 64 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64 20 3d  nd;.  }.  zCmd =
8c80: 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
8c90: 28 22 25 73 20 5c 22 25 73 5c 22 22 2c 20 7a 45  ("%s \"%s\"", zE
8ca0: 64 69 74 6f 72 2c 20 7a 54 65 6d 70 46 69 6c 65  ditor, zTempFile
8cb0: 29 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d 30  );.  if( zCmd==0
8cc0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
8cd0: 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f 6d  result_error_nom
8ce0: 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20 20  em(context);.   
8cf0: 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f   goto edit_func_
8d00: 65 6e 64 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20  end;.  }.  rc = 
8d10: 73 79 73 74 65 6d 28 7a 43 6d 64 29 3b 0a 20 20  system(zCmd);.  
8d20: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6d  sqlite3_free(zCm
8d30: 64 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  d);.  if( rc ){.
8d40: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
8d50: 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78 74  lt_error(context
8d60: 2c 20 22 45 44 49 54 4f 52 20 72 65 74 75 72 6e  , "EDITOR return
8d70: 65 64 20 6e 6f 6e 2d 7a 65 72 6f 22 2c 20 2d 31  ed non-zero", -1
8d80: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64 69 74  );.    goto edit
8d90: 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20  _func_end;.  }. 
8da0: 20 66 20 3d 20 66 6f 70 65 6e 28 7a 54 65 6d 70   f = fopen(zTemp
8db0: 46 69 6c 65 2c 20 62 42 69 6e 20 3f 20 22 72 62  File, bBin ? "rb
8dc0: 22 20 3a 20 22 72 22 29 3b 0a 20 20 69 66 28 20  " : "r");.  if( 
8dd0: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  f==0 ){.    sqli
8de0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
8df0: 28 63 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20 20  (context,.      
8e00: 22 65 64 69 74 28 29 20 63 61 6e 6e 6f 74 20 72  "edit() cannot r
8e10: 65 6f 70 65 6e 20 74 65 6d 70 20 66 69 6c 65 20  eopen temp file 
8e20: 61 66 74 65 72 20 65 64 69 74 22 2c 20 2d 31 29  after edit", -1)
8e30: 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64 69 74 5f  ;.    goto edit_
8e40: 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20  func_end;.  }.  
8e50: 66 73 65 65 6b 28 66 2c 20 30 2c 20 53 45 45 4b  fseek(f, 0, SEEK
8e60: 5f 45 4e 44 29 3b 0a 20 20 73 7a 20 3d 20 66 74  _END);.  sz = ft
8e70: 65 6c 6c 28 66 29 3b 0a 20 20 72 65 77 69 6e 64  ell(f);.  rewind
8e80: 28 66 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74  (f);.  p = sqlit
8e90: 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 7a 2b  e3_malloc64( sz+
8ea0: 28 62 42 69 6e 3d 3d 30 29 20 29 3b 0a 20 20 69  (bBin==0) );.  i
8eb0: 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20 73  f( p==0 ){.    s
8ec0: 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72  qlite3_result_er
8ed0: 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78  ror_nomem(contex
8ee0: 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64 69  t);.    goto edi
8ef0: 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a  t_func_end;.  }.
8f00: 20 20 69 66 28 20 62 42 69 6e 20 29 7b 0a 20 20    if( bBin ){.  
8f10: 20 20 78 20 3d 20 66 72 65 61 64 28 70 2c 20 31    x = fread(p, 1
8f20: 2c 20 73 7a 2c 20 66 29 3b 0a 20 20 7d 65 6c 73  , sz, f);.  }els
8f30: 65 7b 0a 20 20 20 20 78 20 3d 20 66 72 65 61 64  e{.    x = fread
8f40: 28 70 2c 20 31 2c 20 73 7a 2c 20 66 29 3b 0a 20  (p, 1, sz, f);. 
8f50: 20 20 20 70 5b 73 7a 5d 20 3d 20 30 3b 0a 20 20     p[sz] = 0;.  
8f60: 7d 0a 20 20 66 63 6c 6f 73 65 28 66 29 3b 0a 20  }.  fclose(f);. 
8f70: 20 66 20 3d 20 30 3b 0a 20 20 69 66 28 20 78 21   f = 0;.  if( x!
8f80: 3d 73 7a 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  =sz ){.    sqlit
8f90: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
8fa0: 63 6f 6e 74 65 78 74 2c 20 22 63 6f 75 6c 64 20  context, "could 
8fb0: 6e 6f 74 20 72 65 61 64 20 62 61 63 6b 20 74 68  not read back th
8fc0: 65 20 77 68 6f 6c 65 20 66 69 6c 65 22 2c 20 2d  e whole file", -
8fd0: 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64 69  1);.    goto edi
8fe0: 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a  t_func_end;.  }.
8ff0: 20 20 69 66 28 20 62 42 69 6e 20 29 7b 0a 20 20    if( bBin ){.  
9000: 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
9010: 5f 62 6c 6f 62 36 34 28 63 6f 6e 74 65 78 74 2c  _blob64(context,
9020: 20 70 2c 20 73 7a 2c 20 73 71 6c 69 74 65 33 5f   p, sz, sqlite3_
9030: 66 72 65 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  free);.  }else{.
9040: 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75      sqlite3_resu
9050: 6c 74 5f 74 65 78 74 36 34 28 63 6f 6e 74 65 78  lt_text64(contex
9060: 74 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  t, (const char*)
9070: 70 2c 20 73 7a 2c 0a 20 20 20 20 20 20 20 20 20  p, sz,.         
9080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9090: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 2c 20 53   sqlite3_free, S
90a0: 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 7d  QLITE_UTF8);.  }
90b0: 0a 20 20 70 20 3d 20 30 3b 0a 0a 65 64 69 74 5f  .  p = 0;..edit_
90c0: 66 75 6e 63 5f 65 6e 64 3a 0a 20 20 69 66 28 20  func_end:.  if( 
90d0: 66 20 29 20 66 63 6c 6f 73 65 28 66 29 3b 0a 20  f ) fclose(f);. 
90e0: 20 75 6e 6c 69 6e 6b 28 7a 54 65 6d 70 46 69 6c   unlink(zTempFil
90f0: 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  e);.  sqlite3_fr
9100: 65 65 28 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20  ee(zTempFile);. 
9110: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 29   sqlite3_free(p)
9120: 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ;.}.#endif /* SQ
9130: 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54  LITE_NOHAVE_SYST
9140: 45 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 61 76  EM */../*.** Sav
9150: 65 20 6f 72 20 72 65 73 74 6f 72 65 20 74 68 65  e or restore the
9160: 20 63 75 72 72 65 6e 74 20 6f 75 74 70 75 74 20   current output 
9170: 6d 6f 64 65 0a 2a 2f 0a 73 74 61 74 69 63 20 76  mode.*/.static v
9180: 6f 69 64 20 6f 75 74 70 75 74 4d 6f 64 65 50 75  oid outputModePu
9190: 73 68 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  sh(ShellState *p
91a0: 29 7b 0a 20 20 70 2d 3e 6d 6f 64 65 50 72 69 6f  ){.  p->modePrio
91b0: 72 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 6d  r = p->mode;.  m
91c0: 65 6d 63 70 79 28 70 2d 3e 63 6f 6c 53 65 70 50  emcpy(p->colSepP
91d0: 72 69 6f 72 2c 20 70 2d 3e 63 6f 6c 53 65 70 61  rior, p->colSepa
91e0: 72 61 74 6f 72 2c 20 73 69 7a 65 6f 66 28 70 2d  rator, sizeof(p-
91f0: 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 29 3b  >colSeparator));
9200: 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 72 6f 77  .  memcpy(p->row
9210: 53 65 70 50 72 69 6f 72 2c 20 70 2d 3e 72 6f 77  SepPrior, p->row
9220: 53 65 70 61 72 61 74 6f 72 2c 20 73 69 7a 65 6f  Separator, sizeo
9230: 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  f(p->rowSeparato
9240: 72 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f  r));.}.static vo
9250: 69 64 20 6f 75 74 70 75 74 4d 6f 64 65 50 6f 70  id outputModePop
9260: 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b  (ShellState *p){
9270: 0a 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e  .  p->mode = p->
9280: 6d 6f 64 65 50 72 69 6f 72 3b 0a 20 20 6d 65 6d  modePrior;.  mem
9290: 63 70 79 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61  cpy(p->colSepara
92a0: 74 6f 72 2c 20 70 2d 3e 63 6f 6c 53 65 70 50 72  tor, p->colSepPr
92b0: 69 6f 72 2c 20 73 69 7a 65 6f 66 28 70 2d 3e 63  ior, sizeof(p->c
92c0: 6f 6c 53 65 70 61 72 61 74 6f 72 29 29 3b 0a 20  olSeparator));. 
92d0: 20 6d 65 6d 63 70 79 28 70 2d 3e 72 6f 77 53 65   memcpy(p->rowSe
92e0: 70 61 72 61 74 6f 72 2c 20 70 2d 3e 72 6f 77 53  parator, p->rowS
92f0: 65 70 50 72 69 6f 72 2c 20 73 69 7a 65 6f 66 28  epPrior, sizeof(
9300: 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
9310: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70  );.}../*.** Outp
9320: 75 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  ut the given str
9330: 69 6e 67 20 61 73 20 61 20 68 65 78 2d 65 6e 63  ing as a hex-enc
9340: 6f 64 65 64 20 62 6c 6f 62 20 28 65 67 2e 20 58  oded blob (eg. X
9350: 27 31 32 33 34 27 20 29 0a 2a 2f 0a 73 74 61 74  '1234' ).*/.stat
9360: 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 68  ic void output_h
9370: 65 78 5f 62 6c 6f 62 28 46 49 4c 45 20 2a 6f 75  ex_blob(FILE *ou
9380: 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70  t, const void *p
9390: 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62 29  Blob, int nBlob)
93a0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  {.  int i;.  cha
93b0: 72 20 2a 7a 42 6c 6f 62 20 3d 20 28 63 68 61 72  r *zBlob = (char
93c0: 20 2a 29 70 42 6c 6f 62 3b 0a 20 20 72 61 77 5f   *)pBlob;.  raw_
93d0: 70 72 69 6e 74 66 28 6f 75 74 2c 22 58 27 22 29  printf(out,"X'")
93e0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e  ;.  for(i=0; i<n
93f0: 42 6c 6f 62 3b 20 69 2b 2b 29 7b 20 72 61 77 5f  Blob; i++){ raw_
9400: 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 30 32 78  printf(out,"%02x
9410: 22 2c 7a 42 6c 6f 62 5b 69 5d 26 30 78 66 66 29  ",zBlob[i]&0xff)
9420: 3b 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74 66  ; }.  raw_printf
9430: 28 6f 75 74 2c 22 27 22 29 3b 0a 7d 0a 0a 2f 2a  (out,"'");.}../*
9440: 0a 2a 2a 20 46 69 6e 64 20 61 20 73 74 72 69 6e  .** Find a strin
9450: 67 20 74 68 61 74 20 69 73 20 6e 6f 74 20 66 6f  g that is not fo
9460: 75 6e 64 20 61 6e 79 77 68 65 72 65 20 69 6e 20  und anywhere in 
9470: 7a 5b 5d 2e 20 20 52 65 74 75 72 6e 20 61 20 70  z[].  Return a p
9480: 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 61  ointer.** to tha
9490: 74 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20  t string..**.** 
94a0: 54 72 79 20 74 6f 20 75 73 65 20 7a 41 20 61 6e  Try to use zA an
94b0: 64 20 7a 42 20 66 69 72 73 74 2e 20 20 49 66 20  d zB first.  If 
94c0: 62 6f 74 68 20 6f 66 20 74 68 6f 73 65 20 61 72  both of those ar
94d0: 65 20 61 6c 72 65 61 64 79 20 66 6f 75 6e 64 20  e already found 
94e0: 69 6e 20 7a 5b 5d 0a 2a 2a 20 74 68 65 6e 20 6d  in z[].** then m
94f0: 61 6b 65 20 75 70 20 73 6f 6d 65 20 73 74 72 69  ake up some stri
9500: 6e 67 20 61 6e 64 20 73 74 6f 72 65 20 69 74 20  ng and store it 
9510: 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 7a 42  in the buffer zB
9520: 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  uf..*/.static co
9530: 6e 73 74 20 63 68 61 72 20 2a 75 6e 75 73 65 64  nst char *unused
9540: 5f 73 74 72 69 6e 67 28 0a 20 20 63 6f 6e 73 74  _string(.  const
9550: 20 63 68 61 72 20 2a 7a 2c 20 20 20 20 20 20 20   char *z,       
9560: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9570: 52 65 73 75 6c 74 20 6d 75 73 74 20 6e 6f 74 20  Result must not 
9580: 61 70 70 65 61 72 20 61 6e 79 77 68 65 72 65 20  appear anywhere 
9590: 69 6e 20 7a 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  in z */.  const 
95a0: 63 68 61 72 20 2a 7a 41 2c 20 63 6f 6e 73 74 20  char *zA, const 
95b0: 63 68 61 72 20 2a 7a 42 2c 20 20 20 2f 2a 20 54  char *zB,   /* T
95c0: 72 79 20 74 68 65 73 65 20 66 69 72 73 74 20 2a  ry these first *
95d0: 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 20 20  /.  char *zBuf  
95e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
95f0: 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20 74        /* Space t
9600: 6f 20 73 74 6f 72 65 20 61 20 67 65 6e 65 72 61  o store a genera
9610: 74 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 29 7b  ted string */.){
9620: 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 20 3d 20  .  unsigned i = 
9630: 30 3b 0a 20 20 69 66 28 20 73 74 72 73 74 72 28  0;.  if( strstr(
9640: 7a 2c 20 7a 41 29 3d 3d 30 20 29 20 72 65 74 75  z, zA)==0 ) retu
9650: 72 6e 20 7a 41 3b 0a 20 20 69 66 28 20 73 74 72  rn zA;.  if( str
9660: 73 74 72 28 7a 2c 20 7a 42 29 3d 3d 30 20 29 20  str(z, zB)==0 ) 
9670: 72 65 74 75 72 6e 20 7a 42 3b 0a 20 20 64 6f 7b  return zB;.  do{
9680: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70  .    sqlite3_snp
9690: 72 69 6e 74 66 28 32 30 2c 7a 42 75 66 2c 22 28  rintf(20,zBuf,"(
96a0: 25 73 25 75 29 22 2c 20 7a 41 2c 20 69 2b 2b 29  %s%u)", zA, i++)
96b0: 3b 0a 20 20 7d 77 68 69 6c 65 28 20 73 74 72 73  ;.  }while( strs
96c0: 74 72 28 7a 2c 7a 42 75 66 29 21 3d 30 20 29 3b  tr(z,zBuf)!=0 );
96d0: 0a 20 20 72 65 74 75 72 6e 20 7a 42 75 66 3b 0a  .  return zBuf;.
96e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20  }../*.** Output 
96f0: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
9700: 20 61 73 20 61 20 71 75 6f 74 65 64 20 73 74 72   as a quoted str
9710: 69 6e 67 20 75 73 69 6e 67 20 53 51 4c 20 71 75  ing using SQL qu
9720: 6f 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e  oting convention
9730: 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c 73  s..**.** See als
9740: 6f 3a 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64  o: output_quoted
9750: 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28  _escaped_string(
9760: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ).*/.static void
9770: 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73   output_quoted_s
9780: 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c  tring(FILE *out,
9790: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b   const char *z){
97a0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72  .  int i;.  char
97b0: 20 63 3b 0a 20 20 73 65 74 42 69 6e 61 72 79 4d   c;.  setBinaryM
97c0: 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a 20 20 66  ode(out, 1);.  f
97d0: 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 5b 69  or(i=0; (c = z[i
97e0: 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 27 27  ])!=0 && c!='\''
97f0: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 63  ; i++){}.  if( c
9800: 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f  ==0 ){.    utf8_
9810: 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 25 73 27  printf(out,"'%s'
9820: 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ",z);.  }else{. 
9830: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
9840: 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 77 68 69  t, "'");.    whi
9850: 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20  le( *z ){.      
9860: 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 5b  for(i=0; (c = z[
9870: 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 27  i])!=0 && c!='\'
9880: 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20  '; i++){}.      
9890: 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 20 69 2b  if( c=='\'' ) i+
98a0: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 20 29  +;.      if( i )
98b0: 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
98c0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2e 2a 73  rintf(out, "%.*s
98d0: 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 20 20 20 20  ", i, z);.      
98e0: 20 20 7a 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20    z += i;.      
98f0: 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  }.      if( c=='
9900: 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20 72  \'' ){.        r
9910: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
9920: 27 22 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e  '");.        con
9930: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20  tinue;.      }. 
9940: 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b       if( c==0 ){
9950: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
9960: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 2b        }.      z+
9970: 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77  +;.    }.    raw
9980: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22  _printf(out, "'"
9990: 29 3b 0a 20 20 7d 0a 20 20 73 65 74 54 65 78 74  );.  }.  setText
99a0: 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a 7d 0a  Mode(out, 1);.}.
99b0: 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68  ./*.** Output th
99c0: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61  e given string a
99d0: 73 20 61 20 71 75 6f 74 65 64 20 73 74 72 69 6e  s a quoted strin
99e0: 67 20 75 73 69 6e 67 20 53 51 4c 20 71 75 6f 74  g using SQL quot
99f0: 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73 2e  ing conventions.
9a00: 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c 6c  .** Additionalll
9a10: 79 20 2c 20 65 73 63 61 70 65 20 74 68 65 20 22  y , escape the "
9a20: 5c 6e 22 20 61 6e 64 20 22 5c 72 22 20 63 68 61  \n" and "\r" cha
9a30: 72 61 63 74 65 72 73 20 73 6f 20 74 68 61 74 20  racters so that 
9a40: 74 68 65 79 20 64 6f 20 6e 6f 74 0a 2a 2a 20 67  they do not.** g
9a50: 65 74 20 63 6f 72 72 75 70 74 65 64 20 62 79 20  et corrupted by 
9a60: 65 6e 64 2d 6f 66 2d 6c 69 6e 65 20 74 72 61 6e  end-of-line tran
9a70: 73 6c 61 74 69 6f 6e 20 66 61 63 69 6c 69 74 69  slation faciliti
9a80: 65 73 20 69 6e 20 73 6f 6d 65 20 6f 70 65 72 61  es in some opera
9a90: 74 69 6e 67 0a 2a 2a 20 73 79 73 74 65 6d 73 2e  ting.** systems.
9aa0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 6c  .**.** This is l
9ab0: 69 6b 65 20 6f 75 74 70 75 74 5f 71 75 6f 74 65  ike output_quote
9ac0: 64 5f 73 74 72 69 6e 67 28 29 20 62 75 74 20 77  d_string() but w
9ad0: 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f 6e  ith the addition
9ae0: 20 6f 66 20 74 68 65 20 5c 72 5c 6e 0a 2a 2a 20   of the \r\n.** 
9af0: 65 73 63 61 70 65 20 6d 65 63 68 61 6e 69 73 6d  escape mechanism
9b00: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9b10: 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 65   output_quoted_e
9b20: 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28 46 49  scaped_string(FI
9b30: 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63  LE *out, const c
9b40: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69  har *z){.  int i
9b50: 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 73 65  ;.  char c;.  se
9b60: 74 42 69 6e 61 72 79 4d 6f 64 65 28 6f 75 74 2c  tBinaryMode(out,
9b70: 20 31 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   1);.  for(i=0; 
9b80: 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26  (c = z[i])!=0 &&
9b90: 20 63 21 3d 27 5c 27 27 20 26 26 20 63 21 3d 27   c!='\'' && c!='
9ba0: 5c 6e 27 20 26 26 20 63 21 3d 27 5c 72 27 3b 20  \n' && c!='\r'; 
9bb0: 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 63 3d 3d  i++){}.  if( c==
9bc0: 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  0 ){.    utf8_pr
9bd0: 69 6e 74 66 28 6f 75 74 2c 22 27 25 73 27 22 2c  intf(out,"'%s'",
9be0: 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  z);.  }else{.   
9bf0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 4c   const char *zNL
9c00: 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20   = 0;.    const 
9c10: 63 68 61 72 20 2a 7a 43 52 20 3d 20 30 3b 0a 20  char *zCR = 0;. 
9c20: 20 20 20 69 6e 74 20 6e 4e 4c 20 3d 20 30 3b 0a     int nNL = 0;.
9c30: 20 20 20 20 69 6e 74 20 6e 43 52 20 3d 20 30 3b      int nCR = 0;
9c40: 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 31 5b  .    char zBuf1[
9c50: 32 30 5d 2c 20 7a 42 75 66 32 5b 32 30 5d 3b 0a  20], zBuf2[20];.
9c60: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69      for(i=0; z[i
9c70: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; i++){.      i
9c80: 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20  f( z[i]=='\n' ) 
9c90: 6e 4e 4c 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  nNL++;.      if(
9ca0: 20 7a 5b 69 5d 3d 3d 27 5c 72 27 20 29 20 6e 43   z[i]=='\r' ) nC
9cb0: 52 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  R++;.    }.    i
9cc0: 66 28 20 6e 4e 4c 20 29 7b 0a 20 20 20 20 20 20  f( nNL ){.      
9cd0: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
9ce0: 22 72 65 70 6c 61 63 65 28 22 29 3b 0a 20 20 20  "replace(");.   
9cf0: 20 20 20 7a 4e 4c 20 3d 20 75 6e 75 73 65 64 5f     zNL = unused_
9d00: 73 74 72 69 6e 67 28 7a 2c 20 22 5c 5c 6e 22 2c  string(z, "\\n",
9d10: 20 22 5c 5c 30 31 32 22 2c 20 7a 42 75 66 31 29   "\\012", zBuf1)
9d20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
9d30: 6e 43 52 20 29 7b 0a 20 20 20 20 20 20 72 61 77  nCR ){.      raw
9d40: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 72 65  _printf(out, "re
9d50: 70 6c 61 63 65 28 22 29 3b 0a 20 20 20 20 20 20  place(");.      
9d60: 7a 43 52 20 3d 20 75 6e 75 73 65 64 5f 73 74 72  zCR = unused_str
9d70: 69 6e 67 28 7a 2c 20 22 5c 5c 72 22 2c 20 22 5c  ing(z, "\\r", "\
9d80: 5c 30 31 35 22 2c 20 7a 42 75 66 32 29 3b 0a 20  \015", zBuf2);. 
9d90: 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70 72 69     }.    raw_pri
9da0: 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20  ntf(out, "'");. 
9db0: 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a     while( *z ){.
9dc0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28        for(i=0; (
9dd0: 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20  c = z[i])!=0 && 
9de0: 63 21 3d 27 5c 6e 27 20 26 26 20 63 21 3d 27 5c  c!='\n' && c!='\
9df0: 72 27 20 26 26 20 63 21 3d 27 5c 27 27 3b 20 69  r' && c!='\''; i
9e00: 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20  ++){}.      if( 
9e10: 63 3d 3d 27 5c 27 27 20 29 20 69 2b 2b 3b 0a 20  c=='\'' ) i++;. 
9e20: 20 20 20 20 20 69 66 28 20 69 20 29 7b 0a 20 20       if( i ){.  
9e30: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
9e40: 66 28 6f 75 74 2c 20 22 25 2e 2a 73 22 2c 20 69  f(out, "%.*s", i
9e50: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 7a 20  , z);.        z 
9e60: 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20  += i;.      }.  
9e70: 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27 27 20      if( c=='\'' 
9e80: 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  ){.        raw_p
9e90: 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b  rintf(out, "'");
9ea0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
9eb0: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
9ec0: 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
9ed0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9ee0: 20 20 7d 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20    }.      z++;. 
9ef0: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27       if( c=='\n'
9f00: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
9f10: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22  printf(out, "%s"
9f20: 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20 20 20 20 20  , zNL);.        
9f30: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
9f40: 7d 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  }.      raw_prin
9f50: 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 43  tf(out, "%s", zC
9f60: 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 61  R);.    }.    ra
9f70: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27  w_printf(out, "'
9f80: 22 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 52 20  ");.    if( nCR 
9f90: 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
9fa0: 6e 74 66 28 6f 75 74 2c 20 22 2c 27 25 73 27 2c  ntf(out, ",'%s',
9fb0: 63 68 61 72 28 31 33 29 29 22 2c 20 7a 43 52 29  char(13))", zCR)
9fc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
9fd0: 6e 4e 4c 20 29 7b 0a 20 20 20 20 20 20 72 61 77  nNL ){.      raw
9fe0: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2c 27  _printf(out, ",'
9ff0: 25 73 27 2c 63 68 61 72 28 31 30 29 29 22 2c 20  %s',char(10))", 
a000: 7a 4e 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  zNL);.    }.  }.
a010: 20 20 73 65 74 54 65 78 74 4d 6f 64 65 28 6f 75    setTextMode(ou
a020: 74 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t, 1);.}../*.** 
a030: 4f 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e  Output the given
a040: 20 73 74 72 69 6e 67 20 61 73 20 61 20 71 75 6f   string as a quo
a050: 74 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  ted according to
a060: 20 43 20 6f 72 20 54 43 4c 20 71 75 6f 74 69 6e   C or TCL quotin
a070: 67 20 72 75 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74  g rules..*/.stat
a080: 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 63  ic void output_c
a090: 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75  _string(FILE *ou
a0a0: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
a0b0: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 6e  ){.  unsigned in
a0c0: 74 20 63 3b 0a 20 20 66 70 75 74 63 28 27 22 27  t c;.  fputc('"'
a0d0: 2c 20 6f 75 74 29 3b 0a 20 20 77 68 69 6c 65 28  , out);.  while(
a0e0: 20 28 63 20 3d 20 2a 28 7a 2b 2b 29 29 21 3d 30   (c = *(z++))!=0
a0f0: 20 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d 27   ){.    if( c=='
a100: 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75  \\' ){.      fpu
a110: 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20  tc(c, out);.    
a120: 20 20 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b    fputc(c, out);
a130: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
a140: 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20 66  =='"' ){.      f
a150: 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b  putc('\\', out);
a160: 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 22 27  .      fputc('"'
a170: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73  , out);.    }els
a180: 65 20 69 66 28 20 63 3d 3d 27 5c 74 27 20 29 7b  e if( c=='\t' ){
a190: 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 5c 5c  .      fputc('\\
a1a0: 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66  ', out);.      f
a1b0: 70 75 74 63 28 27 74 27 2c 20 6f 75 74 29 3b 0a  putc('t', out);.
a1c0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
a1d0: 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 66  ='\n' ){.      f
a1e0: 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b  putc('\\', out);
a1f0: 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 6e 27  .      fputc('n'
a200: 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73  , out);.    }els
a210: 65 20 69 66 28 20 63 3d 3d 27 5c 72 27 20 29 7b  e if( c=='\r' ){
a220: 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 5c 5c  .      fputc('\\
a230: 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66  ', out);.      f
a240: 70 75 74 63 28 27 72 27 2c 20 6f 75 74 29 3b 0a  putc('r', out);.
a250: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21 69      }else if( !i
a260: 73 70 72 69 6e 74 28 63 26 30 78 66 66 29 20 29  sprint(c&0xff) )
a270: 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
a280: 74 66 28 6f 75 74 2c 20 22 5c 5c 25 30 33 6f 22  tf(out, "\\%03o"
a290: 2c 20 63 26 30 78 66 66 29 3b 0a 20 20 20 20 7d  , c&0xff);.    }
a2a0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 75 74  else{.      fput
a2b0: 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d  c(c, out);.    }
a2c0: 0a 20 20 7d 0a 20 20 66 70 75 74 63 28 27 22 27  .  }.  fputc('"'
a2d0: 2c 20 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  , out);.}../*.**
a2e0: 20 4f 75 74 70 75 74 20 74 68 65 20 67 69 76 65   Output the give
a2f0: 6e 20 73 74 72 69 6e 67 20 77 69 74 68 20 63 68  n string with ch
a300: 61 72 61 63 74 65 72 73 20 74 68 61 74 20 61 72  aracters that ar
a310: 65 20 73 70 65 63 69 61 6c 20 74 6f 0a 2a 2a 20  e special to.** 
a320: 48 54 4d 4c 20 65 73 63 61 70 65 64 2e 0a 2a 2f  HTML escaped..*/
a330: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74  .static void out
a340: 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28  put_html_string(
a350: 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74  FILE *out, const
a360: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
a370: 20 69 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29   i;.  if( z==0 )
a380: 20 7a 20 3d 20 22 22 3b 0a 20 20 77 68 69 6c 65   z = "";.  while
a390: 28 20 2a 7a 20 29 7b 0a 20 20 20 20 66 6f 72 28  ( *z ){.    for(
a3a0: 69 3d 30 3b 20 20 20 7a 5b 69 5d 0a 20 20 20 20  i=0;   z[i].    
a3b0: 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21          && z[i]!
a3c0: 3d 27 3c 27 0a 20 20 20 20 20 20 20 20 20 20 20  ='<'.           
a3d0: 20 26 26 20 7a 5b 69 5d 21 3d 27 26 27 0a 20 20   && z[i]!='&'.  
a3e0: 20 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69            && z[i
a3f0: 5d 21 3d 27 3e 27 0a 20 20 20 20 20 20 20 20 20  ]!='>'.         
a400: 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 5c 22 27     && z[i]!='\"'
a410: 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
a420: 7a 5b 69 5d 21 3d 27 5c 27 27 3b 0a 20 20 20 20  z[i]!='\'';.    
a430: 20 20 20 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 69      i++){}.    i
a440: 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20  f( i>0 ){.      
a450: 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
a460: 22 25 2e 2a 73 22 2c 69 2c 7a 29 3b 0a 20 20 20  "%.*s",i,z);.   
a470: 20 7d 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d   }.    if( z[i]=
a480: 3d 27 3c 27 20 29 7b 0a 20 20 20 20 20 20 72 61  ='<' ){.      ra
a490: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 6c  w_printf(out,"&l
a4a0: 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  t;");.    }else 
a4b0: 69 66 28 20 7a 5b 69 5d 3d 3d 27 26 27 20 29 7b  if( z[i]=='&' ){
a4c0: 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
a4d0: 66 28 6f 75 74 2c 22 26 61 6d 70 3b 22 29 3b 0a  f(out,"&amp;");.
a4e0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b      }else if( z[
a4f0: 69 5d 3d 3d 27 3e 27 20 29 7b 0a 20 20 20 20 20  i]=='>' ){.     
a500: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
a510: 22 26 67 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c  "&gt;");.    }el
a520: 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 22  se if( z[i]=='\"
a530: 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  ' ){.      raw_p
a540: 72 69 6e 74 66 28 6f 75 74 2c 22 26 71 75 6f 74  rintf(out,"&quot
a550: 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ;");.    }else i
a560: 66 28 20 7a 5b 69 5d 3d 3d 27 5c 27 27 20 29 7b  f( z[i]=='\'' ){
a570: 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
a580: 66 28 6f 75 74 2c 22 26 23 33 39 3b 22 29 3b 0a  f(out,"&#39;");.
a590: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a5a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
a5b0: 20 20 7a 20 2b 3d 20 69 20 2b 20 31 3b 0a 20 20    z += i + 1;.  
a5c0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 20  }.}../*.** If a 
a5d0: 66 69 65 6c 64 20 63 6f 6e 74 61 69 6e 73 20 61  field contains a
a5e0: 6e 79 20 63 68 61 72 61 63 74 65 72 20 69 64 65  ny character ide
a5f0: 6e 74 69 66 69 65 64 20 62 79 20 61 20 31 20 69  ntified by a 1 i
a600: 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a  n the following.
a610: 2a 2a 20 61 72 72 61 79 2c 20 74 68 65 6e 20 74  ** array, then t
a620: 68 65 20 73 74 72 69 6e 67 20 6d 75 73 74 20 62  he string must b
a630: 65 20 71 75 6f 74 65 64 20 66 6f 72 20 43 53 56  e quoted for CSV
a640: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e 73  ..*/.static cons
a650: 74 20 63 68 61 72 20 6e 65 65 64 43 73 76 51 75  t char needCsvQu
a660: 6f 74 65 5b 5d 20 3d 20 7b 0a 20 20 31 2c 20 31  ote[] = {.  1, 1
a670: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
a680: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
a690: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
a6a0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a6b0: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
a6c0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a6d0: 2c 0a 20 20 31 2c 20 30 2c 20 31 2c 20 30 2c 20  ,.  1, 0, 1, 0, 
a6e0: 30 2c 20 30 2c 20 30 2c 20 31 2c 20 20 20 30 2c  0, 0, 0, 1,   0,
a6f0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a700: 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c  0, 0,.  0, 0, 0,
a710: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a720: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
a730: 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30   0, 0, 0,.  0, 0
a740: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a750: 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,   0, 0, 0, 0
a760: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20  , 0, 0, 0, 0,.  
a770: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a780: 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20  , 0, 0,   0, 0, 
a790: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
a7a0: 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,.  0, 0, 0, 0, 
a7b0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c  0, 0, 0, 0,   0,
a7c0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a7d0: 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c  0, 0,.  0, 0, 0,
a7e0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a7f0: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
a800: 20 30 2c 20 30 2c 20 31 2c 0a 20 20 31 2c 20 31   0, 0, 1,.  1, 1
a810: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
a820: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
a830: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
a840: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a850: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
a860: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a870: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
a880: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
a890: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a8a0: 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c  1, 1,.  1, 1, 1,
a8b0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a8c0: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
a8d0: 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31   1, 1, 1,.  1, 1
a8e0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
a8f0: 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,   1, 1, 1, 1
a900: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20  , 1, 1, 1, 1,.  
a910: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a920: 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20  , 1, 1,   1, 1, 
a930: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
a940: 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,.  1, 1, 1, 1, 
a950: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c  1, 1, 1, 1,   1,
a960: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a970: 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c  1, 1,.  1, 1, 1,
a980: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a990: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
a9a0: 20 31 2c 20 31 2c 20 31 2c 0a 7d 3b 0a 0a 2f 2a   1, 1, 1,.};../*
a9b0: 0a 2a 2a 20 4f 75 74 70 75 74 20 61 20 73 69 6e  .** Output a sin
a9c0: 67 6c 65 20 74 65 72 6d 20 6f 66 20 43 53 56 2e  gle term of CSV.
a9d0: 20 20 41 63 74 75 61 6c 6c 79 2c 20 70 2d 3e 63    Actually, p->c
a9e0: 6f 6c 53 65 70 61 72 61 74 6f 72 20 69 73 20 75  olSeparator is u
a9f0: 73 65 64 20 66 6f 72 0a 2a 2a 20 74 68 65 20 73  sed for.** the s
aa00: 65 70 61 72 61 74 6f 72 2c 20 77 68 69 63 68 20  eparator, which 
aa10: 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20 62  may or may not b
aa20: 65 20 61 20 63 6f 6d 6d 61 2e 20 20 70 2d 3e 6e  e a comma.  p->n
aa30: 75 6c 6c 56 61 6c 75 65 20 69 73 0a 2a 2a 20 74  ullValue is.** t
aa40: 68 65 20 6e 75 6c 6c 20 76 61 6c 75 65 2e 20 20  he null value.  
aa50: 53 74 72 69 6e 67 73 20 61 72 65 20 71 75 6f 74  Strings are quot
aa60: 65 64 20 69 66 20 6e 65 63 65 73 73 61 72 79 2e  ed if necessary.
aa70: 20 20 54 68 65 20 73 65 70 61 72 61 74 6f 72 0a    The separator.
aa80: 2a 2a 20 69 73 20 6f 6e 6c 79 20 69 73 73 75 65  ** is only issue
aa90: 64 20 69 66 20 62 53 65 70 20 69 73 20 74 72 75  d if bSep is tru
aaa0: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
aab0: 64 20 6f 75 74 70 75 74 5f 63 73 76 28 53 68 65  d output_csv(She
aac0: 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73  llState *p, cons
aad0: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 62  t char *z, int b
aae0: 53 65 70 29 7b 0a 20 20 46 49 4c 45 20 2a 6f 75  Sep){.  FILE *ou
aaf0: 74 20 3d 20 70 2d 3e 6f 75 74 3b 0a 20 20 69 66  t = p->out;.  if
ab00: 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74  ( z==0 ){.    ut
ab10: 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 25  f8_printf(out,"%
ab20: 73 22 2c 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29  s",p->nullValue)
ab30: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69  ;.  }else{.    i
ab40: 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e 53  nt i;.    int nS
ab50: 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d  ep = strlen30(p-
ab60: 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a  >colSeparator);.
ab70: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69      for(i=0; z[i
ab80: 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ]; i++){.      i
ab90: 66 28 20 6e 65 65 64 43 73 76 51 75 6f 74 65 5b  f( needCsvQuote[
aba0: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 2a  ((unsigned char*
abb0: 29 7a 29 5b 69 5d 5d 0a 20 20 20 20 20 20 20 20  )z)[i]].        
abc0: 20 7c 7c 20 28 7a 5b 69 5d 3d 3d 70 2d 3e 63 6f   || (z[i]==p->co
abd0: 6c 53 65 70 61 72 61 74 6f 72 5b 30 5d 20 26 26  lSeparator[0] &&
abe0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28 6e  .             (n
abf0: 53 65 70 3d 3d 31 20 7c 7c 20 6d 65 6d 63 6d 70  Sep==1 || memcmp
ac00: 28 7a 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61  (z, p->colSepara
ac10: 74 6f 72 2c 20 6e 53 65 70 29 3d 3d 30 29 29 20  tor, nSep)==0)) 
ac20: 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d 20 30  ){.        i = 0
ac30: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
ac40: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
ac50: 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a 20     if( i==0 ){. 
ac60: 20 20 20 20 20 63 68 61 72 20 2a 7a 51 75 6f 74       char *zQuot
ac70: 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ed = sqlite3_mpr
ac80: 69 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c 20 7a  intf("\"%w\"", z
ac90: 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  );.      utf8_pr
aca0: 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20  intf(out, "%s", 
acb0: 7a 51 75 6f 74 65 64 29 3b 0a 20 20 20 20 20 20  zQuoted);.      
acc0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75  sqlite3_free(zQu
acd0: 6f 74 65 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  oted);.    }else
ace0: 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
acf0: 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a  ntf(out, "%s", z
ad00: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69  );.    }.  }.  i
ad10: 66 28 20 62 53 65 70 20 29 7b 0a 20 20 20 20 75  f( bSep ){.    u
ad20: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
ad30: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53  t, "%s", p->colS
ad40: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 7d 0a 7d  eparator);.  }.}
ad50: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
ad60: 74 69 6e 65 20 72 75 6e 73 20 77 68 65 6e 20 74  tine runs when t
ad70: 68 65 20 75 73 65 72 20 70 72 65 73 73 65 73 20  he user presses 
ad80: 43 74 72 6c 2d 43 0a 2a 2f 0a 73 74 61 74 69 63  Ctrl-C.*/.static
ad90: 20 76 6f 69 64 20 69 6e 74 65 72 72 75 70 74 5f   void interrupt_
ada0: 68 61 6e 64 6c 65 72 28 69 6e 74 20 4e 6f 74 55  handler(int NotU
adb0: 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50  sed){.  UNUSED_P
adc0: 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64  ARAMETER(NotUsed
add0: 29 3b 0a 20 20 73 65 65 6e 49 6e 74 65 72 72 75  );.  seenInterru
ade0: 70 74 2b 2b 3b 0a 20 20 69 66 28 20 73 65 65 6e  pt++;.  if( seen
adf0: 49 6e 74 65 72 72 75 70 74 3e 32 20 29 20 65 78  Interrupt>2 ) ex
ae00: 69 74 28 31 29 3b 0a 20 20 69 66 28 20 67 6c 6f  it(1);.  if( glo
ae10: 62 61 6c 44 62 20 29 20 73 71 6c 69 74 65 33 5f  balDb ) sqlite3_
ae20: 69 6e 74 65 72 72 75 70 74 28 67 6c 6f 62 61 6c  interrupt(global
ae30: 44 62 29 3b 0a 7d 0a 0a 23 69 66 20 28 64 65 66  Db);.}..#if (def
ae40: 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20  ined(_WIN32) || 
ae50: 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 29 20  defined(WIN32)) 
ae60: 26 26 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e  && !defined(_WIN
ae70: 33 32 5f 57 43 45 29 0a 2f 2a 0a 2a 2a 20 54 68  32_WCE)./*.** Th
ae80: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20  is routine runs 
ae90: 66 6f 72 20 63 6f 6e 73 6f 6c 65 20 65 76 65 6e  for console even
aea0: 74 73 20 28 65 2e 67 2e 20 43 74 72 6c 2d 43 29  ts (e.g. Ctrl-C)
aeb0: 20 6f 6e 20 57 69 6e 33 32 0a 2a 2f 0a 73 74 61   on Win32.*/.sta
aec0: 74 69 63 20 42 4f 4f 4c 20 57 49 4e 41 50 49 20  tic BOOL WINAPI 
aed0: 43 6f 6e 73 6f 6c 65 43 74 72 6c 48 61 6e 64 6c  ConsoleCtrlHandl
aee0: 65 72 28 0a 20 20 44 57 4f 52 44 20 64 77 43 74  er(.  DWORD dwCt
aef0: 72 6c 54 79 70 65 20 2f 2a 20 4f 6e 65 20 6f 66  rlType /* One of
af00: 20 74 68 65 20 43 54 52 4c 5f 2a 5f 45 56 45 4e   the CTRL_*_EVEN
af10: 54 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a 29  T constants */.)
af20: 7b 0a 20 20 69 66 28 20 64 77 43 74 72 6c 54 79  {.  if( dwCtrlTy
af30: 70 65 3d 3d 43 54 52 4c 5f 43 5f 45 56 45 4e 54  pe==CTRL_C_EVENT
af40: 20 29 7b 0a 20 20 20 20 69 6e 74 65 72 72 75 70   ){.    interrup
af50: 74 5f 68 61 6e 64 6c 65 72 28 30 29 3b 0a 20 20  t_handler(0);.  
af60: 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a 20    return TRUE;. 
af70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 46 41 4c 53   }.  return FALS
af80: 45 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69 66  E;.}.#endif..#if
af90: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
afa0: 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 2f  _AUTHORIZATION./
afb0: 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 22 2e  *.** When the ".
afc0: 61 75 74 68 20 4f 4e 22 20 69 73 20 73 65 74 2c  auth ON" is set,
afd0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 61   the following a
afe0: 75 74 68 6f 72 69 7a 65 72 20 63 61 6c 6c 62 61  uthorizer callba
aff0: 63 6b 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65 64  ck is.** invoked
b000: 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72 65 74  .  It always ret
b010: 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e 0a  urns SQLITE_OK..
b020: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68  */.static int sh
b030: 65 6c 6c 41 75 74 68 28 0a 20 20 76 6f 69 64 20  ellAuth(.  void 
b040: 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c 0a 20 20  *pClientData,.  
b050: 69 6e 74 20 6f 70 2c 0a 20 20 63 6f 6e 73 74 20  int op,.  const 
b060: 63 68 61 72 20 2a 7a 41 31 2c 0a 20 20 63 6f 6e  char *zA1,.  con
b070: 73 74 20 63 68 61 72 20 2a 7a 41 32 2c 0a 20 20  st char *zA2,.  
b080: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 33 2c  const char *zA3,
b090: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
b0a0: 41 34 0a 29 7b 0a 20 20 53 68 65 6c 6c 53 74 61  A4.){.  ShellSta
b0b0: 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74  te *p = (ShellSt
b0c0: 61 74 65 2a 29 70 43 6c 69 65 6e 74 44 61 74 61  ate*)pClientData
b0d0: 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
b0e0: 20 63 68 61 72 20 2a 61 7a 41 63 74 69 6f 6e 5b   char *azAction[
b0f0: 5d 20 3d 20 7b 20 30 2c 0a 20 20 20 20 20 22 43  ] = { 0,.     "C
b100: 52 45 41 54 45 5f 49 4e 44 45 58 22 2c 20 20 20  REATE_INDEX",   
b110: 20 20 20 20 20 20 22 43 52 45 41 54 45 5f 54 41        "CREATE_TA
b120: 42 4c 45 22 2c 20 20 20 20 20 20 20 20 20 22 43  BLE",         "C
b130: 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45 58  REATE_TEMP_INDEX
b140: 22 2c 0a 20 20 20 20 20 22 43 52 45 41 54 45 5f  ",.     "CREATE_
b150: 54 45 4d 50 5f 54 41 42 4c 45 22 2c 20 20 20 20  TEMP_TABLE",    
b160: 22 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 52 49  "CREATE_TEMP_TRI
b170: 47 47 45 52 22 2c 20 20 22 43 52 45 41 54 45 5f  GGER",  "CREATE_
b180: 54 45 4d 50 5f 56 49 45 57 22 2c 0a 20 20 20 20  TEMP_VIEW",.    
b190: 20 22 43 52 45 41 54 45 5f 54 52 49 47 47 45 52   "CREATE_TRIGGER
b1a0: 22 2c 20 20 20 20 20 20 20 22 43 52 45 41 54 45  ",       "CREATE
b1b0: 5f 56 49 45 57 22 2c 20 20 20 20 20 20 20 20 20  _VIEW",         
b1c0: 20 22 44 45 4c 45 54 45 22 2c 0a 20 20 20 20 20   "DELETE",.     
b1d0: 22 44 52 4f 50 5f 49 4e 44 45 58 22 2c 20 20 20  "DROP_INDEX",   
b1e0: 20 20 20 20 20 20 20 20 22 44 52 4f 50 5f 54 41          "DROP_TA
b1f0: 42 4c 45 22 2c 20 20 20 20 20 20 20 20 20 20 20  BLE",           
b200: 22 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45 58  "DROP_TEMP_INDEX
b210: 22 2c 0a 20 20 20 20 20 22 44 52 4f 50 5f 54 45  ",.     "DROP_TE
b220: 4d 50 5f 54 41 42 4c 45 22 2c 20 20 20 20 20 20  MP_TABLE",      
b230: 22 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47 47  "DROP_TEMP_TRIGG
b240: 45 52 22 2c 20 20 20 20 22 44 52 4f 50 5f 54 45  ER",    "DROP_TE
b250: 4d 50 5f 56 49 45 57 22 2c 0a 20 20 20 20 20 22  MP_VIEW",.     "
b260: 44 52 4f 50 5f 54 52 49 47 47 45 52 22 2c 20 20  DROP_TRIGGER",  
b270: 20 20 20 20 20 20 20 22 44 52 4f 50 5f 56 49 45         "DROP_VIE
b280: 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 22  W",            "
b290: 49 4e 53 45 52 54 22 2c 0a 20 20 20 20 20 22 50  INSERT",.     "P
b2a0: 52 41 47 4d 41 22 2c 20 20 20 20 20 20 20 20 20  RAGMA",         
b2b0: 20 20 20 20 20 20 22 52 45 41 44 22 2c 20 20 20        "READ",   
b2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
b2d0: 45 4c 45 43 54 22 2c 0a 20 20 20 20 20 22 54 52  ELECT",.     "TR
b2e0: 41 4e 53 41 43 54 49 4f 4e 22 2c 20 20 20 20 20  ANSACTION",     
b2f0: 20 20 20 20 20 22 55 50 44 41 54 45 22 2c 20 20       "UPDATE",  
b300: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 41 54               "AT
b310: 54 41 43 48 22 2c 0a 20 20 20 20 20 22 44 45 54  TACH",.     "DET
b320: 41 43 48 22 2c 20 20 20 20 20 20 20 20 20 20 20  ACH",           
b330: 20 20 20 20 22 41 4c 54 45 52 5f 54 41 42 4c 45      "ALTER_TABLE
b340: 22 2c 20 20 20 20 20 20 20 20 20 20 22 52 45 49  ",          "REI
b350: 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 41 4e 41  NDEX",.     "ANA
b360: 4c 59 5a 45 22 2c 20 20 20 20 20 20 20 20 20 20  LYZE",          
b370: 20 20 20 20 22 43 52 45 41 54 45 5f 56 54 41 42      "CREATE_VTAB
b380: 4c 45 22 2c 20 20 20 20 20 20 20 20 22 44 52 4f  LE",        "DRO
b390: 50 5f 56 54 41 42 4c 45 22 2c 0a 20 20 20 20 20  P_VTABLE",.     
b3a0: 22 46 55 4e 43 54 49 4f 4e 22 2c 20 20 20 20 20  "FUNCTION",     
b3b0: 20 20 20 20 20 20 20 20 22 53 41 56 45 50 4f 49          "SAVEPOI
b3c0: 4e 54 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  NT",            
b3d0: 22 52 45 43 55 52 53 49 56 45 22 0a 20 20 7d 3b  "RECURSIVE".  };
b3e0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
b3f0: 74 20 63 68 61 72 20 2a 61 7a 5b 34 5d 3b 0a 20  t char *az[4];. 
b400: 20 61 7a 5b 30 5d 20 3d 20 7a 41 31 3b 0a 20 20   az[0] = zA1;.  
b410: 61 7a 5b 31 5d 20 3d 20 7a 41 32 3b 0a 20 20 61  az[1] = zA2;.  a
b420: 7a 5b 32 5d 20 3d 20 7a 41 33 3b 0a 20 20 61 7a  z[2] = zA3;.  az
b430: 5b 33 5d 20 3d 20 7a 41 34 3b 0a 20 20 75 74 66  [3] = zA4;.  utf
b440: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
b450: 20 22 61 75 74 68 6f 72 69 7a 65 72 3a 20 25 73   "authorizer: %s
b460: 22 2c 20 61 7a 41 63 74 69 6f 6e 5b 6f 70 5d 29  ", azAction[op])
b470: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 34  ;.  for(i=0; i<4
b480: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 61 77 5f  ; i++){.    raw_
b490: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
b4a0: 20 22 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 5b   ");.    if( az[
b4b0: 69 5d 20 29 7b 0a 20 20 20 20 20 20 6f 75 74 70  i] ){.      outp
b4c0: 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  ut_c_string(p->o
b4d0: 75 74 2c 20 61 7a 5b 69 5d 29 3b 0a 20 20 20 20  ut, az[i]);.    
b4e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
b4f0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
b500: 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a 20  "NULL");.    }. 
b510: 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28   }.  raw_printf(
b520: 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  p->out, "\n");. 
b530: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f   return SQLITE_O
b540: 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  K;.}.#endif../*.
b550: 2a 2a 20 50 72 69 6e 74 20 61 20 73 63 68 65 6d  ** Print a schem
b560: 61 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 50 61  a statement.  Pa
b570: 72 74 20 6f 66 20 4d 4f 44 45 5f 53 65 6d 69 20  rt of MODE_Semi 
b580: 61 6e 64 20 4d 4f 44 45 5f 50 72 65 74 74 79 20  and MODE_Pretty 
b590: 6f 75 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  output..**.** Th
b5a0: 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e 76 65  is routine conve
b5b0: 72 74 73 20 73 6f 6d 65 20 43 52 45 41 54 45 20  rts some CREATE 
b5c0: 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74 73  TABLE statements
b5d0: 20 66 6f 72 20 73 68 61 64 6f 77 20 74 61 62 6c   for shadow tabl
b5e0: 65 73 0a 2a 2a 20 69 6e 20 46 54 53 33 2f 34 2f  es.** in FTS3/4/
b5f0: 35 20 69 6e 74 6f 20 43 52 45 41 54 45 20 54 41  5 into CREATE TA
b600: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54  BLE IF NOT EXIST
b610: 53 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2f  S statements..*/
b620: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 69  .static void pri
b630: 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 46 49 4c  ntSchemaLine(FIL
b640: 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68  E *out, const ch
b650: 61 72 20 2a 7a 2c 20 63 6f 6e 73 74 20 63 68 61  ar *z, const cha
b660: 72 20 2a 7a 54 61 69 6c 29 7b 0a 20 20 69 66 28  r *zTail){.  if(
b670: 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62   sqlite3_strglob
b680: 28 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 5b  ("CREATE TABLE [
b690: 27 5c 22 5d 2a 22 2c 20 7a 29 3d 3d 30 20 29 7b  '\"]*", z)==0 ){
b6a0: 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
b6b0: 28 6f 75 74 2c 20 22 43 52 45 41 54 45 20 54 41  (out, "CREATE TA
b6c0: 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54  BLE IF NOT EXIST
b6d0: 53 20 25 73 25 73 22 2c 20 7a 2b 31 33 2c 20 7a  S %s%s", z+13, z
b6e0: 54 61 69 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Tail);.  }else{.
b6f0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
b700: 6f 75 74 2c 20 22 25 73 25 73 22 2c 20 7a 2c 20  out, "%s%s", z, 
b710: 7a 54 61 69 6c 29 3b 0a 20 20 7d 0a 7d 0a 73 74  zTail);.  }.}.st
b720: 61 74 69 63 20 76 6f 69 64 20 70 72 69 6e 74 53  atic void printS
b730: 63 68 65 6d 61 4c 69 6e 65 4e 28 46 49 4c 45 20  chemaLineN(FILE 
b740: 2a 6f 75 74 2c 20 63 68 61 72 20 2a 7a 2c 20 69  *out, char *z, i
b750: 6e 74 20 6e 2c 20 63 6f 6e 73 74 20 63 68 61 72  nt n, const char
b760: 20 2a 7a 54 61 69 6c 29 7b 0a 20 20 63 68 61 72   *zTail){.  char
b770: 20 63 20 3d 20 7a 5b 6e 5d 3b 0a 20 20 7a 5b 6e   c = z[n];.  z[n
b780: 5d 20 3d 20 30 3b 0a 20 20 70 72 69 6e 74 53 63  ] = 0;.  printSc
b790: 68 65 6d 61 4c 69 6e 65 28 6f 75 74 2c 20 7a 2c  hemaLine(out, z,
b7a0: 20 7a 54 61 69 6c 29 3b 0a 20 20 7a 5b 6e 5d 20   zTail);.  z[n] 
b7b0: 3d 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  = c;.}../*.** Re
b7c0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 73 74 72  turn true if str
b7d0: 69 6e 67 20 7a 5b 5d 20 68 61 73 20 6e 6f 74 68  ing z[] has noth
b7e0: 69 6e 67 20 62 75 74 20 77 68 69 74 65 73 70 61  ing but whitespa
b7f0: 63 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73 20  ce and comments 
b800: 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f 66  to the.** end of
b810: 20 74 68 65 20 66 69 72 73 74 20 6c 69 6e 65 2e   the first line.
b820: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
b830: 73 54 6f 45 6f 6c 28 63 6f 6e 73 74 20 63 68 61  sToEol(const cha
b840: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  r *z){.  int i;.
b850: 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b    for(i=0; z[i];
b860: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 7a   i++){.    if( z
b870: 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 72 65 74 75  [i]=='\n' ) retu
b880: 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 49 73  rn 1;.    if( Is
b890: 53 70 61 63 65 28 7a 5b 69 5d 29 20 29 20 63 6f  Space(z[i]) ) co
b8a0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20  ntinue;.    if( 
b8b0: 7a 5b 69 5d 3d 3d 27 2d 27 20 26 26 20 7a 5b 69  z[i]=='-' && z[i
b8c0: 2b 31 5d 3d 3d 27 2d 27 20 29 20 72 65 74 75 72  +1]=='-' ) retur
b8d0: 6e 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  n 1;.    return 
b8e0: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
b8f0: 31 3b 0a 7d 0a 20 20 20 20 0a 0a 2f 2a 0a 2a 2a  1;.}.    ../*.**
b900: 20 54 68 69 73 20 69 73 20 74 68 65 20 63 61 6c   This is the cal
b910: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 74 68  lback routine th
b920: 61 74 20 74 68 65 20 73 68 65 6c 6c 0a 2a 2a 20  at the shell.** 
b930: 69 6e 76 6f 6b 65 73 20 66 6f 72 20 65 61 63 68  invokes for each
b940: 20 72 6f 77 20 6f 66 20 61 20 71 75 65 72 79 20   row of a query 
b950: 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69  result..*/.stati
b960: 63 20 69 6e 74 20 73 68 65 6c 6c 5f 63 61 6c 6c  c int shell_call
b970: 62 61 63 6b 28 0a 20 20 76 6f 69 64 20 2a 70 41  back(.  void *pA
b980: 72 67 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20  rg,.  int nArg, 
b990: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
b9a0: 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d   of result colum
b9b0: 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61  ns */.  char **a
b9c0: 7a 41 72 67 2c 20 20 20 20 2f 2a 20 54 65 78 74  zArg,    /* Text
b9d0: 20 6f 66 20 65 61 63 68 20 72 65 73 75 6c 74 20   of each result 
b9e0: 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72  column */.  char
b9f0: 20 2a 2a 61 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20   **azCol,    /* 
ba00: 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  Column names */.
ba10: 20 20 69 6e 74 20 2a 61 69 54 79 70 65 20 20 20    int *aiType   
ba20: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 79 70     /* Column typ
ba30: 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  es */.){.  int i
ba40: 3b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  ;.  ShellState *
ba50: 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 2a  p = (ShellState*
ba60: 29 70 41 72 67 3b 0a 0a 20 20 69 66 28 20 61 7a  )pArg;..  if( az
ba70: 41 72 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Arg==0 ) return 
ba80: 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e  0;.  switch( p->
ba90: 63 4d 6f 64 65 20 29 7b 0a 20 20 20 20 63 61 73  cMode ){.    cas
baa0: 65 20 4d 4f 44 45 5f 4c 69 6e 65 3a 20 7b 0a 20  e MODE_Line: {. 
bab0: 20 20 20 20 20 69 6e 74 20 77 20 3d 20 35 3b 0a       int w = 5;.
bac0: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d        if( azArg=
bad0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
bae0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
baf0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
bb00: 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65   int len = strle
bb10: 6e 33 30 28 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61  n30(azCol[i] ? a
bb20: 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a 20  zCol[i] : "");. 
bb30: 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 77         if( len>w
bb40: 20 29 20 77 20 3d 20 6c 65 6e 3b 0a 20 20 20 20   ) w = len;.    
bb50: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d    }.      if( p-
bb60: 3e 63 6e 74 2b 2b 3e 30 20 29 20 75 74 66 38 5f  >cnt++>0 ) utf8_
bb70: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
bb80: 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  %s", p->rowSepar
bb90: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 66 6f 72  ator);.      for
bba0: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
bbb0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38  +){.        utf8
bbc0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
bbd0: 25 2a 73 20 3d 20 25 73 25 73 22 2c 20 77 2c 20  %*s = %s%s", w, 
bbe0: 61 7a 43 6f 6c 5b 69 5d 2c 0a 20 20 20 20 20 20  azCol[i],.      
bbf0: 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b            azArg[
bc00: 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20  i] ? azArg[i] : 
bc10: 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 2c 20 70 2d  p->nullValue, p-
bc20: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a  >rowSeparator);.
bc30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
bc40: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
bc50: 61 73 65 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e  ase MODE_Explain
bc60: 3a 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  :.    case MODE_
bc70: 43 6f 6c 75 6d 6e 3a 20 7b 0a 20 20 20 20 20 20  Column: {.      
bc80: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74  static const int
bc90: 20 61 45 78 70 6c 61 69 6e 57 69 64 74 68 73 5b   aExplainWidths[
bca0: 5d 20 3d 20 7b 34 2c 20 31 33 2c 20 34 2c 20 34  ] = {4, 13, 4, 4
bcb0: 2c 20 34 2c 20 31 33 2c 20 32 2c 20 31 33 7d 3b  , 4, 13, 2, 13};
bcc0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74  .      const int
bcd0: 20 2a 63 6f 6c 57 69 64 74 68 3b 0a 20 20 20 20   *colWidth;.    
bce0: 20 20 69 6e 74 20 73 68 6f 77 48 64 72 3b 0a 20    int showHdr;. 
bcf0: 20 20 20 20 20 63 68 61 72 20 2a 72 6f 77 53 65       char *rowSe
bd00: 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  p;.      if( p->
bd10: 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 43 6f 6c 75  cMode==MODE_Colu
bd20: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  mn ){.        co
bd30: 6c 57 69 64 74 68 20 3d 20 70 2d 3e 63 6f 6c 57  lWidth = p->colW
bd40: 69 64 74 68 3b 0a 20 20 20 20 20 20 20 20 73 68  idth;.        sh
bd50: 6f 77 48 64 72 20 3d 20 70 2d 3e 73 68 6f 77 48  owHdr = p->showH
bd60: 65 61 64 65 72 3b 0a 20 20 20 20 20 20 20 20 72  eader;.        r
bd70: 6f 77 53 65 70 20 3d 20 70 2d 3e 72 6f 77 53 65  owSep = p->rowSe
bd80: 70 61 72 61 74 6f 72 3b 0a 20 20 20 20 20 20 7d  parator;.      }
bd90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f  else{.        co
bda0: 6c 57 69 64 74 68 20 3d 20 61 45 78 70 6c 61 69  lWidth = aExplai
bdb0: 6e 57 69 64 74 68 73 3b 0a 20 20 20 20 20 20 20  nWidths;.       
bdc0: 20 73 68 6f 77 48 64 72 20 3d 20 31 3b 0a 20 20   showHdr = 1;.  
bdd0: 20 20 20 20 20 20 72 6f 77 53 65 70 20 3d 20 53        rowSep = S
bde0: 45 50 5f 52 6f 77 3b 0a 20 20 20 20 20 20 7d 0a  EP_Row;.      }.
bdf0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74        if( p->cnt
be00: 2b 2b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ++==0 ){.       
be10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
be20: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
be30: 20 20 69 6e 74 20 77 2c 20 6e 3b 0a 20 20 20 20    int w, n;.    
be40: 20 20 20 20 20 20 69 66 28 20 69 3c 41 72 72 61        if( i<Arra
be50: 79 53 69 7a 65 28 70 2d 3e 63 6f 6c 57 69 64 74  ySize(p->colWidt
be60: 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  h) ){.          
be70: 20 20 77 20 3d 20 63 6f 6c 57 69 64 74 68 5b 69    w = colWidth[i
be80: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  ];.          }el
be90: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
bea0: 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  w = 0;.         
beb0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
bec0: 20 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   w==0 ){.       
bed0: 20 20 20 20 20 77 20 3d 20 73 74 72 6c 65 6e 43       w = strlenC
bee0: 68 61 72 28 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61  har(azCol[i] ? a
bef0: 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a 20  zCol[i] : "");. 
bf00: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 77             if( w
bf10: 3c 31 30 20 29 20 77 20 3d 20 31 30 3b 0a 20 20  <10 ) w = 10;.  
bf20: 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 73 74            n = st
bf30: 72 6c 65 6e 43 68 61 72 28 61 7a 41 72 67 20 26  rlenChar(azArg &
bf40: 26 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41  & azArg[i] ? azA
bf50: 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56  rg[i] : p->nullV
bf60: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 20  alue);.         
bf70: 20 20 20 69 66 28 20 77 3c 6e 20 29 20 77 20 3d     if( w<n ) w =
bf80: 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   n;.          }.
bf90: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c            if( i<
bfa0: 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 63 74  ArraySize(p->act
bfb0: 75 61 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20  ualWidth) ){.   
bfc0: 20 20 20 20 20 20 20 20 20 70 2d 3e 61 63 74 75           p->actu
bfd0: 61 6c 57 69 64 74 68 5b 69 5d 20 3d 20 77 3b 0a  alWidth[i] = w;.
bfe0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
bff0: 20 20 20 20 20 20 69 66 28 20 73 68 6f 77 48 64        if( showHd
c000: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  r ){.           
c010: 20 75 74 66 38 5f 77 69 64 74 68 5f 70 72 69 6e   utf8_width_prin
c020: 74 28 70 2d 3e 6f 75 74 2c 20 77 2c 20 61 7a 43  t(p->out, w, azC
c030: 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ol[i]);.        
c040: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
c050: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 69 3d  p->out, "%s", i=
c060: 3d 6e 41 72 67 2d 31 20 3f 20 72 6f 77 53 65 70  =nArg-1 ? rowSep
c070: 20 3a 20 22 20 20 22 29 3b 0a 20 20 20 20 20 20   : "  ");.      
c080: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
c090: 20 20 20 20 20 20 20 20 69 66 28 20 73 68 6f 77          if( show
c0a0: 48 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Hdr ){.         
c0b0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
c0c0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
c0d0: 20 20 20 20 69 6e 74 20 77 3b 0a 20 20 20 20 20      int w;.     
c0e0: 20 20 20 20 20 20 20 69 66 28 20 69 3c 41 72 72         if( i<Arr
c0f0: 61 79 53 69 7a 65 28 70 2d 3e 61 63 74 75 61 6c  aySize(p->actual
c100: 57 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20 20  Width) ){.      
c110: 20 20 20 20 20 20 20 20 20 77 20 3d 20 70 2d 3e           w = p->
c120: 61 63 74 75 61 6c 57 69 64 74 68 5b 69 5d 3b 0a  actualWidth[i];.
c130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
c140: 66 28 20 77 3c 30 20 29 20 77 20 3d 20 2d 77 3b  f( w<0 ) w = -w;
c150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
c160: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
c170: 20 20 20 77 20 3d 20 31 30 3b 0a 20 20 20 20 20     w = 10;.     
c180: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c190: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
c1a0: 28 70 2d 3e 6f 75 74 2c 22 25 2d 2a 2e 2a 73 25  (p->out,"%-*.*s%
c1b0: 73 22 2c 77 2c 77 2c 0a 20 20 20 20 20 20 20 20  s",w,w,.        
c1c0: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
c1d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c1e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c1f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c200: 2d 2d 2d 2d 2d 2d 22 0a 20 20 20 20 20 20 20 20  ------".        
c210: 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d             "----
c220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c250: 2d 2d 2d 2d 2d 2d 22 2c 0a 20 20 20 20 20 20 20  ------",.       
c260: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 3d 3d               i==
c270: 6e 41 72 67 2d 31 20 3f 20 72 6f 77 53 65 70 20  nArg-1 ? rowSep 
c280: 3a 20 22 20 20 22 29 3b 0a 20 20 20 20 20 20 20  : "  ");.       
c290: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
c2a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
c2b0: 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61   azArg==0 ) brea
c2c0: 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  k;.      for(i=0
c2d0: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
c2e0: 20 20 20 20 20 20 20 20 69 6e 74 20 77 3b 0a 20          int w;. 
c2f0: 20 20 20 20 20 20 20 69 66 28 20 69 3c 41 72 72         if( i<Arr
c300: 61 79 53 69 7a 65 28 70 2d 3e 61 63 74 75 61 6c  aySize(p->actual
c310: 57 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20 20  Width) ){.      
c320: 20 20 20 20 20 77 20 3d 20 70 2d 3e 61 63 74 75       w = p->actu
c330: 61 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20  alWidth[i];.    
c340: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c350: 20 20 20 20 20 20 77 20 3d 20 31 30 3b 0a 20 20        w = 10;.  
c360: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c370: 69 66 28 20 70 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f  if( p->cMode==MO
c380: 44 45 5f 45 78 70 6c 61 69 6e 20 26 26 20 61 7a  DE_Explain && az
c390: 41 72 67 5b 69 5d 20 26 26 20 73 74 72 6c 65 6e  Arg[i] && strlen
c3a0: 43 68 61 72 28 61 7a 41 72 67 5b 69 5d 29 3e 77  Char(azArg[i])>w
c3b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 20   ){.          w 
c3c0: 3d 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a 41  = strlenChar(azA
c3d0: 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
c3e0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3d  }.        if( i=
c3f0: 3d 31 20 26 26 20 70 2d 3e 61 69 49 6e 64 65 6e  =1 && p->aiInden
c400: 74 20 26 26 20 70 2d 3e 70 53 74 6d 74 20 29 7b  t && p->pStmt ){
c410: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
c420: 2d 3e 69 49 6e 64 65 6e 74 3c 70 2d 3e 6e 49 6e  ->iIndent<p->nIn
c430: 64 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20  dent ){.        
c440: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
c450: 70 2d 3e 6f 75 74 2c 20 22 25 2a 2e 73 22 2c 20  p->out, "%*.s", 
c460: 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 70 2d 3e 69  p->aiIndent[p->i
c470: 49 6e 64 65 6e 74 5d 2c 20 22 22 29 3b 0a 20 20  Indent], "");.  
c480: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c490: 20 20 20 20 70 2d 3e 69 49 6e 64 65 6e 74 2b 2b      p->iIndent++
c4a0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c4b0: 20 20 20 20 75 74 66 38 5f 77 69 64 74 68 5f 70      utf8_width_p
c4c0: 72 69 6e 74 28 70 2d 3e 6f 75 74 2c 20 77 2c 20  rint(p->out, w, 
c4d0: 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67  azArg[i] ? azArg
c4e0: 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c  [i] : p->nullVal
c4f0: 75 65 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66  ue);.        utf
c500: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
c510: 20 22 25 73 22 2c 20 69 3d 3d 6e 41 72 67 2d 31   "%s", i==nArg-1
c520: 20 3f 20 72 6f 77 53 65 70 20 3a 20 22 20 20 22   ? rowSep : "  "
c530: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
c540: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
c550: 20 20 63 61 73 65 20 4d 4f 44 45 5f 53 65 6d 69    case MODE_Semi
c560: 3a 20 7b 20 20 20 2f 2a 20 2e 73 63 68 65 6d 61  : {   /* .schema
c570: 20 61 6e 64 20 2e 66 75 6c 6c 73 63 68 65 6d 61   and .fullschema
c580: 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 20   output */.     
c590: 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65   printSchemaLine
c5a0: 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 30  (p->out, azArg[0
c5b0: 5d 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 20  ], ";\n");.     
c5c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
c5d0: 20 20 63 61 73 65 20 4d 4f 44 45 5f 50 72 65 74    case MODE_Pret
c5e0: 74 79 3a 20 7b 20 20 2f 2a 20 2e 73 63 68 65 6d  ty: {  /* .schem
c5f0: 61 20 61 6e 64 20 2e 66 75 6c 6c 73 63 68 65 6d  a and .fullschem
c600: 61 20 77 69 74 68 20 2d 2d 69 6e 64 65 6e 74 20  a with --indent 
c610: 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  */.      char *z
c620: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20  ;.      int j;. 
c630: 20 20 20 20 20 69 6e 74 20 6e 50 61 72 65 6e 20       int nParen 
c640: 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20  = 0;.      char 
c650: 63 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  cEnd = 0;.      
c660: 63 68 61 72 20 63 3b 0a 20 20 20 20 20 20 69 6e  char c;.      in
c670: 74 20 6e 4c 69 6e 65 20 3d 20 30 3b 0a 20 20 20  t nLine = 0;.   
c680: 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d     assert( nArg=
c690: 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20  =1 );.      if( 
c6a0: 61 7a 41 72 67 5b 30 5d 3d 3d 30 20 29 20 62 72  azArg[0]==0 ) br
c6b0: 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 73  eak;.      if( s
c6c0: 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22  qlite3_strlike("
c6d0: 43 52 45 41 54 45 20 56 49 45 57 25 22 2c 20 61  CREATE VIEW%", a
c6e0: 7a 41 72 67 5b 30 5d 2c 20 30 29 3d 3d 30 0a 20  zArg[0], 0)==0. 
c6f0: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
c700: 5f 73 74 72 6c 69 6b 65 28 22 43 52 45 41 54 45  _strlike("CREATE
c710: 20 54 52 49 47 25 22 2c 20 61 7a 41 72 67 5b 30   TRIG%", azArg[0
c720: 5d 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 29  ], 0)==0.      )
c730: 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
c740: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
c750: 73 3b 5c 6e 22 2c 20 61 7a 41 72 67 5b 30 5d 29  s;\n", azArg[0])
c760: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
c770: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
c780: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
c790: 74 66 28 22 25 73 22 2c 20 61 7a 41 72 67 5b 30  tf("%s", azArg[0
c7a0: 5d 29 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b  ]);.      j = 0;
c7b0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
c7c0: 49 73 53 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69  IsSpace(z[i]); i
c7d0: 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 66 6f 72 28  ++){}.      for(
c7e0: 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b  ; (c = z[i])!=0;
c7f0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
c800: 66 28 20 49 73 53 70 61 63 65 28 63 29 20 29 7b  f( IsSpace(c) ){
c810: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
c820: 5b 6a 2d 31 5d 3d 3d 27 5c 72 27 20 29 20 7a 5b  [j-1]=='\r' ) z[
c830: 6a 2d 31 5d 20 3d 20 27 5c 6e 27 3b 0a 20 20 20  j-1] = '\n';.   
c840: 20 20 20 20 20 20 20 69 66 28 20 49 73 53 70 61         if( IsSpa
c850: 63 65 28 7a 5b 6a 2d 31 5d 29 20 7c 7c 20 7a 5b  ce(z[j-1]) || z[
c860: 6a 2d 31 5d 3d 3d 27 28 27 20 29 20 63 6f 6e 74  j-1]=='(' ) cont
c870: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 65  inue;.        }e
c880: 6c 73 65 20 69 66 28 20 28 63 3d 3d 27 28 27 20  lse if( (c=='(' 
c890: 7c 7c 20 63 3d 3d 27 29 27 29 20 26 26 20 6a 3e  || c==')') && j>
c8a0: 30 20 26 26 20 49 73 53 70 61 63 65 28 7a 5b 6a  0 && IsSpace(z[j
c8b0: 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20  -1]) ){.        
c8c0: 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d    j--;.        }
c8d0: 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20  .        z[j++] 
c8e0: 3d 20 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = c;.      }.   
c8f0: 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26     while( j>0 &&
c900: 20 49 73 53 70 61 63 65 28 7a 5b 6a 2d 31 5d 29   IsSpace(z[j-1])
c910: 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20   ){ j--; }.     
c920: 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20   z[j] = 0;.     
c930: 20 69 66 28 20 73 74 72 6c 65 6e 33 30 28 7a 29   if( strlen30(z)
c940: 3e 3d 37 39 20 29 7b 0a 20 20 20 20 20 20 20 20  >=79 ){.        
c950: 66 6f 72 28 69 3d 6a 3d 30 3b 20 28 63 20 3d 20  for(i=j=0; (c = 
c960: 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 20  z[i])!=0; i++){ 
c970: 20 2f 2a 20 43 6f 70 79 20 63 68 61 6e 67 65 73   /* Copy changes
c980: 20 66 72 6f 6d 20 7a 5b 69 5d 20 62 61 63 6b 20   from z[i] back 
c990: 74 6f 20 7a 5b 6a 5d 20 2a 2f 0a 20 20 20 20 20  to z[j] */.     
c9a0: 20 20 20 20 20 69 66 28 20 63 3d 3d 63 45 6e 64       if( c==cEnd
c9b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
c9c0: 63 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20 20  cEnd = 0;.      
c9d0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
c9e0: 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5c 27 27 20  ='"' || c=='\'' 
c9f0: 7c 7c 20 63 3d 3d 27 60 27 20 29 7b 0a 20 20 20  || c=='`' ){.   
ca00: 20 20 20 20 20 20 20 20 20 63 45 6e 64 20 3d 20           cEnd = 
ca10: 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  c;.          }el
ca20: 73 65 20 69 66 28 20 63 3d 3d 27 5b 27 20 29 7b  se if( c=='[' ){
ca30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 45 6e  .            cEn
ca40: 64 20 3d 20 27 5d 27 3b 0a 20 20 20 20 20 20 20  d = ']';.       
ca50: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
ca60: 27 2d 27 20 26 26 20 7a 5b 69 2b 31 5d 3d 3d 27  '-' && z[i+1]=='
ca70: 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  -' ){.          
ca80: 20 20 63 45 6e 64 20 3d 20 27 5c 6e 27 3b 0a 20    cEnd = '\n';. 
ca90: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
caa0: 66 28 20 63 3d 3d 27 28 27 20 29 7b 0a 20 20 20  f( c=='(' ){.   
cab0: 20 20 20 20 20 20 20 20 20 6e 50 61 72 65 6e 2b           nParen+
cac0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  +;.          }el
cad0: 73 65 20 69 66 28 20 63 3d 3d 27 29 27 20 29 7b  se if( c==')' ){
cae0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 50 61  .            nPa
caf0: 72 65 6e 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20  ren--;.         
cb00: 20 20 20 69 66 28 20 6e 4c 69 6e 65 3e 30 20 26     if( nLine>0 &
cb10: 26 20 6e 50 61 72 65 6e 3d 3d 30 20 26 26 20 6a  & nParen==0 && j
cb20: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
cb30: 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c      printSchemaL
cb40: 69 6e 65 4e 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20  ineN(p->out, z, 
cb50: 6a 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  j, "\n");.      
cb60: 20 20 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20          j = 0;. 
cb70: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
cb80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
cb90: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20     z[j++] = c;. 
cba0: 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 50 61           if( nPa
cbb0: 72 65 6e 3d 3d 31 20 26 26 20 63 45 6e 64 3d 3d  ren==1 && cEnd==
cbc0: 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26 20  0.           && 
cbd0: 28 63 3d 3d 27 28 27 20 7c 7c 20 63 3d 3d 27 5c  (c=='(' || c=='\
cbe0: 6e 27 20 7c 7c 20 28 63 3d 3d 27 2c 27 20 26 26  n' || (c==',' &&
cbf0: 20 21 77 73 54 6f 45 6f 6c 28 7a 2b 69 2b 31 29   !wsToEol(z+i+1)
cc00: 29 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b 0a  )).          ){.
cc10: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
cc20: 63 3d 3d 27 5c 6e 27 20 29 20 6a 2d 2d 3b 0a 20  c=='\n' ) j--;. 
cc30: 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74             print
cc40: 53 63 68 65 6d 61 4c 69 6e 65 4e 28 70 2d 3e 6f  SchemaLineN(p->o
cc50: 75 74 2c 20 7a 2c 20 6a 2c 20 22 5c 6e 20 20 22  ut, z, j, "\n  "
cc60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6a  );.            j
cc70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
cc80: 20 20 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20    nLine++;.     
cc90: 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 49 73         while( Is
cca0: 53 70 61 63 65 28 7a 5b 69 2b 31 5d 29 20 29 7b  Space(z[i+1]) ){
ccb0: 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20   i++; }.        
ccc0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
ccd0: 20 20 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a        z[j] = 0;.
cce0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 72        }.      pr
ccf0: 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 70 2d  intSchemaLine(p-
cd00: 3e 6f 75 74 2c 20 7a 2c 20 22 3b 5c 6e 22 29 3b  >out, z, ";\n");
cd10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
cd20: 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 62 72  ree(z);.      br
cd30: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
cd40: 61 73 65 20 4d 4f 44 45 5f 4c 69 73 74 3a 20 7b  ase MODE_List: {
cd50: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e  .      if( p->cn
cd60: 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f  t++==0 && p->sho
cd70: 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20  wHeader ){.     
cd80: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
cd90: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
cda0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
cdb0: 70 2d 3e 6f 75 74 2c 22 25 73 25 73 22 2c 61 7a  p->out,"%s%s",az
cdc0: 43 6f 6c 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20  Col[i],.        
cdd0: 20 20 20 20 20 20 20 20 20 20 69 3d 3d 6e 41 72            i==nAr
cde0: 67 2d 31 20 3f 20 70 2d 3e 72 6f 77 53 65 70 61  g-1 ? p->rowSepa
cdf0: 72 61 74 6f 72 20 3a 20 70 2d 3e 63 6f 6c 53 65  rator : p->colSe
ce00: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
ce10: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
ce20: 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29    if( azArg==0 )
ce30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f   break;.      fo
ce40: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
ce50: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
ce60: 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 3b  r *z = azArg[i];
ce70: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 3d 3d  .        if( z==
ce80: 30 20 29 20 7a 20 3d 20 70 2d 3e 6e 75 6c 6c 56  0 ) z = p->nullV
ce90: 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 75 74  alue;.        ut
cea0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
ceb0: 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20  , "%s", z);.    
cec0: 20 20 20 20 69 66 28 20 69 3c 6e 41 72 67 2d 31      if( i<nArg-1
ced0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74   ){.          ut
cee0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
cef0: 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65  , "%s", p->colSe
cf00: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
cf10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
cf20: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
cf30: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e  ->out, "%s", p->
cf40: 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  rowSeparator);. 
cf50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
cf60: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
cf70: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44    }.    case MOD
cf80: 45 5f 48 74 6d 6c 3a 20 7b 0a 20 20 20 20 20 20  E_Html: {.      
cf90: 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20  if( p->cnt++==0 
cfa0: 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72  && p->showHeader
cfb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
cfc0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c  printf(p->out,"<
cfd0: 54 52 3e 22 29 3b 0a 20 20 20 20 20 20 20 20 66  TR>");.        f
cfe0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
cff0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
d000: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
d010: 74 2c 22 3c 54 48 3e 22 29 3b 0a 20 20 20 20 20  t,"<TH>");.     
d020: 20 20 20 20 20 6f 75 74 70 75 74 5f 68 74 6d 6c       output_html
d030: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
d040: 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  azCol[i]);.     
d050: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
d060: 70 2d 3e 6f 75 74 2c 22 3c 2f 54 48 3e 5c 6e 22  p->out,"</TH>\n"
d070: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
d080: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
d090: 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52 3e 5c 6e 22  p->out,"</TR>\n"
d0a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
d0b0: 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20   if( azArg==0 ) 
d0c0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 72 61 77  break;.      raw
d0d0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
d0e0: 3c 54 52 3e 22 29 3b 0a 20 20 20 20 20 20 66 6f  <TR>");.      fo
d0f0: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
d100: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  ++){.        raw
d110: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
d120: 3c 54 44 3e 22 29 3b 0a 20 20 20 20 20 20 20 20  <TD>");.        
d130: 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69  output_html_stri
d140: 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67  ng(p->out, azArg
d150: 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a  [i] ? azArg[i] :
d160: 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a   p->nullValue);.
d170: 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
d180: 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 44 3e  tf(p->out,"</TD>
d190: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  \n");.      }.  
d1a0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
d1b0: 2d 3e 6f 75 74 2c 22 3c 2f 54 52 3e 5c 6e 22 29  ->out,"</TR>\n")
d1c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
d1d0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
d1e0: 44 45 5f 54 63 6c 3a 20 7b 0a 20 20 20 20 20 20  DE_Tcl: {.      
d1f0: 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20  if( p->cnt++==0 
d200: 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72  && p->showHeader
d210: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
d220: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
d230: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74  ){.          out
d240: 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e  put_c_string(p->
d250: 6f 75 74 2c 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61  out,azCol[i] ? a
d260: 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a 20  zCol[i] : "");. 
d270: 20 20 20 20 20 20 20 20 20 69 66 28 69 3c 6e 41           if(i<nA
d280: 72 67 2d 31 29 20 75 74 66 38 5f 70 72 69 6e 74  rg-1) utf8_print
d290: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
d2a0: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
d2b0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d2c0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
d2d0: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
d2e0: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a  >rowSeparator);.
d2f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
d300: 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65  ( azArg==0 ) bre
d310: 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ak;.      for(i=
d320: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
d330: 0a 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f  .        output_
d340: 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c  c_string(p->out,
d350: 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72   azArg[i] ? azAr
d360: 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61  g[i] : p->nullVa
d370: 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  lue);.        if
d380: 28 69 3c 6e 41 72 67 2d 31 29 20 75 74 66 38 5f  (i<nArg-1) utf8_
d390: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
d3a0: 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  %s", p->colSepar
d3b0: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ator);.      }. 
d3c0: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
d3d0: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70  (p->out, "%s", p
d3e0: 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b  ->rowSeparator);
d3f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
d400: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44    }.    case MOD
d410: 45 5f 43 73 76 3a 20 7b 0a 20 20 20 20 20 20 73  E_Csv: {.      s
d420: 65 74 42 69 6e 61 72 79 4d 6f 64 65 28 70 2d 3e  etBinaryMode(p->
d430: 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 69  out, 1);.      i
d440: 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26  f( p->cnt++==0 &
d450: 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20  & p->showHeader 
d460: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
d470: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
d480: 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70  {.          outp
d490: 75 74 5f 63 73 76 28 70 2c 20 61 7a 43 6f 6c 5b  ut_csv(p, azCol[
d4a0: 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20  i] ? azCol[i] : 
d4b0: 22 22 2c 20 69 3c 6e 41 72 67 2d 31 29 3b 0a 20  "", i<nArg-1);. 
d4c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
d4d0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
d4e0: 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f  out, "%s", p->ro
d4f0: 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  wSeparator);.   
d500: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
d510: 41 72 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  Arg>0 ){.       
d520: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
d530: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
d540: 20 20 6f 75 74 70 75 74 5f 63 73 76 28 70 2c 20    output_csv(p, 
d550: 61 7a 41 72 67 5b 69 5d 2c 20 69 3c 6e 41 72 67  azArg[i], i<nArg
d560: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  -1);.        }. 
d570: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
d580: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
d590: 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
d5a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
d5b0: 20 73 65 74 54 65 78 74 4d 6f 64 65 28 70 2d 3e   setTextMode(p->
d5c0: 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 62  out, 1);.      b
d5d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
d5e0: 63 61 73 65 20 4d 4f 44 45 5f 49 6e 73 65 72 74  case MODE_Insert
d5f0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 61 7a  : {.      if( az
d600: 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Arg==0 ) break;.
d610: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
d620: 66 28 70 2d 3e 6f 75 74 2c 22 49 4e 53 45 52 54  f(p->out,"INSERT
d630: 20 49 4e 54 4f 20 25 73 22 2c 70 2d 3e 7a 44 65   INTO %s",p->zDe
d640: 73 74 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20  stTable);.      
d650: 69 66 28 20 70 2d 3e 73 68 6f 77 48 65 61 64 65  if( p->showHeade
d660: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  r ){.        raw
d670: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
d680: 28 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  (");.        for
d690: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
d6a0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
d6b0: 28 20 69 3e 30 20 29 20 72 61 77 5f 70 72 69 6e  ( i>0 ) raw_prin
d6c0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b  tf(p->out, ",");
d6d0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 71  .          if( q
d6e0: 75 6f 74 65 43 68 61 72 28 61 7a 43 6f 6c 5b 69  uoteChar(azCol[i
d6f0: 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ]) ){.          
d700: 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69    char *z = sqli
d710: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25  te3_mprintf("\"%
d720: 77 5c 22 22 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b  w\"", azCol[i]);
d730: 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66  .            utf
d740: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
d750: 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20   "%s", z);.     
d760: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
d770: 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 20 20  ree(z);.        
d780: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
d790: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
d7a0: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 61 7a  p->out, "%s", az
d7b0: 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Col[i]);.       
d7c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
d7d0: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
d7e0: 66 28 70 2d 3e 6f 75 74 2c 22 29 22 29 3b 0a 20  f(p->out,")");. 
d7f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
d800: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72  cnt++;.      for
d810: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
d820: 2b 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f  +){.        raw_
d830: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 69  printf(p->out, i
d840: 3e 30 20 3f 20 22 2c 22 20 3a 20 22 20 56 41 4c  >0 ? "," : " VAL
d850: 55 45 53 28 22 29 3b 0a 20 20 20 20 20 20 20 20  UES(");.        
d860: 69 66 28 20 28 61 7a 41 72 67 5b 69 5d 3d 3d 30  if( (azArg[i]==0
d870: 29 20 7c 7c 20 28 61 69 54 79 70 65 20 26 26 20  ) || (aiType && 
d880: 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54  aiType[i]==SQLIT
d890: 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20  E_NULL) ){.     
d8a0: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
d8b0: 28 70 2d 3e 6f 75 74 2c 22 4e 55 4c 4c 22 29 3b  (p->out,"NULL");
d8c0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
d8d0: 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54  f( aiType && aiT
d8e0: 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 54  ype[i]==SQLITE_T
d8f0: 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  EXT ){.         
d900: 20 69 66 28 20 53 68 65 6c 6c 48 61 73 46 6c 61   if( ShellHasFla
d910: 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65 77 6c 69  g(p, SHFLG_Newli
d920: 6e 65 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nes) ){.        
d930: 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65      output_quote
d940: 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c  d_string(p->out,
d950: 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20   azArg[i]);.    
d960: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
d970: 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f           output_
d980: 71 75 6f 74 65 64 5f 65 73 63 61 70 65 64 5f 73  quoted_escaped_s
d990: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a  tring(p->out, az
d9a0: 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[i]);.       
d9b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
d9c0: 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26  se if( aiType &&
d9d0: 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49   aiType[i]==SQLI
d9e0: 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20  TE_INTEGER ){.  
d9f0: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
da00: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c  ntf(p->out,"%s",
da10: 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20   azArg[i]);.    
da20: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69      }else if( ai
da30: 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69  Type && aiType[i
da40: 5d 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20  ]==SQLITE_FLOAT 
da50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61  ){.          cha
da60: 72 20 7a 5b 35 30 5d 3b 0a 20 20 20 20 20 20 20  r z[50];.       
da70: 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73 71     double r = sq
da80: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75  lite3_column_dou
da90: 62 6c 65 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29  ble(p->pStmt, i)
daa0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
dab0: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 35 30 2c  te3_snprintf(50,
dac0: 7a 2c 22 25 21 2e 32 30 67 22 2c 20 72 29 3b 0a  z,"%!.20g", r);.
dad0: 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
dae0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
daf0: 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d  ", z);.        }
db00: 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20  else if( aiType 
db10: 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51  && aiType[i]==SQ
db20: 4c 49 54 45 5f 42 4c 4f 42 20 26 26 20 70 2d 3e  LITE_BLOB && p->
db30: 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20  pStmt ){.       
db40: 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70     const void *p
db50: 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63  Blob = sqlite3_c
db60: 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 2d 3e 70 53  olumn_blob(p->pS
db70: 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
db80: 20 20 20 69 6e 74 20 6e 42 6c 6f 62 20 3d 20 73     int nBlob = s
db90: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
dba0: 74 65 73 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29  tes(p->pStmt, i)
dbb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70  ;.          outp
dbc0: 75 74 5f 68 65 78 5f 62 6c 6f 62 28 70 2d 3e 6f  ut_hex_blob(p->o
dbd0: 75 74 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62  ut, pBlob, nBlob
dbe0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
dbf0: 20 69 66 28 20 69 73 4e 75 6d 62 65 72 28 61 7a   if( isNumber(az
dc00: 41 72 67 5b 69 5d 2c 20 30 29 20 29 7b 0a 20 20  Arg[i], 0) ){.  
dc10: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
dc20: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c  ntf(p->out,"%s",
dc30: 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20   azArg[i]);.    
dc40: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 53 68      }else if( Sh
dc50: 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20 53 48  ellHasFlag(p, SH
dc60: 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29 20 29 7b  FLG_Newlines) ){
dc70: 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75  .          outpu
dc80: 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28  t_quoted_string(
dc90: 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d  p->out, azArg[i]
dca0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
dcb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70  {.          outp
dcc0: 75 74 5f 71 75 6f 74 65 64 5f 65 73 63 61 70 65  ut_quoted_escape
dcd0: 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c  d_string(p->out,
dce0: 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20   azArg[i]);.    
dcf0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
dd00: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
dd10: 2d 3e 6f 75 74 2c 22 29 3b 5c 6e 22 29 3b 0a 20  ->out,");\n");. 
dd20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
dd30: 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  }.    case MODE_
dd40: 51 75 6f 74 65 3a 20 7b 0a 20 20 20 20 20 20 69  Quote: {.      i
dd50: 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72  f( azArg==0 ) br
dd60: 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  eak;.      if( p
dd70: 2d 3e 63 6e 74 3d 3d 30 20 26 26 20 70 2d 3e 73  ->cnt==0 && p->s
dd80: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
dd90: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
dda0: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
ddb0: 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 20        if( i>0 ) 
ddc0: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
ddd0: 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 20  t, ",");.       
dde0: 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64     output_quoted
ddf0: 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
de00: 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  azCol[i]);.     
de10: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61 77     }.        raw
de20: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
de30: 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  \n");.      }.  
de40: 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a 20 20      p->cnt++;.  
de50: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
de60: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
de70: 20 20 20 69 66 28 20 69 3e 30 20 29 20 72 61 77     if( i>0 ) raw
de80: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
de90: 22 2c 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ",");.        if
dea0: 28 20 28 61 7a 41 72 67 5b 69 5d 3d 3d 30 29 20  ( (azArg[i]==0) 
deb0: 7c 7c 20 28 61 69 54 79 70 65 20 26 26 20 61 69  || (aiType && ai
dec0: 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f  Type[i]==SQLITE_
ded0: 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20  NULL) ){.       
dee0: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
def0: 2d 3e 6f 75 74 2c 22 4e 55 4c 4c 22 29 3b 0a 20  ->out,"NULL");. 
df00: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
df10: 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70   aiType && aiTyp
df20: 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 54 45 58  e[i]==SQLITE_TEX
df30: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  T ){.          o
df40: 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72  utput_quoted_str
df50: 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72  ing(p->out, azAr
df60: 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  g[i]);.        }
df70: 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20  else if( aiType 
df80: 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51  && aiType[i]==SQ
df90: 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a  LITE_INTEGER ){.
dfa0: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
dfb0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73  rintf(p->out,"%s
dfc0: 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  ", azArg[i]);.  
dfd0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
dfe0: 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65  aiType && aiType
dff0: 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41  [i]==SQLITE_FLOA
e000: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  T ){.          c
e010: 68 61 72 20 7a 5b 35 30 5d 3b 0a 20 20 20 20 20  har z[50];.     
e020: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20       double r = 
e030: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
e040: 6f 75 62 6c 65 28 70 2d 3e 70 53 74 6d 74 2c 20  ouble(p->pStmt, 
e050: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  i);.          sq
e060: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 35  lite3_snprintf(5
e070: 30 2c 7a 2c 22 25 21 2e 32 30 67 22 2c 20 72 29  0,z,"%!.20g", r)
e080: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  ;.          raw_
e090: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
e0a0: 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20  %s", z);.       
e0b0: 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70   }else if( aiTyp
e0c0: 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d  e && aiType[i]==
e0d0: 53 51 4c 49 54 45 5f 42 4c 4f 42 20 26 26 20 70  SQLITE_BLOB && p
e0e0: 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  ->pStmt ){.     
e0f0: 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20       const void 
e100: 2a 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33  *pBlob = sqlite3
e110: 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 2d 3e  _column_blob(p->
e120: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
e130: 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62 20 3d       int nBlob =
e140: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
e150: 62 79 74 65 73 28 70 2d 3e 70 53 74 6d 74 2c 20  bytes(p->pStmt, 
e160: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75  i);.          ou
e170: 74 70 75 74 5f 68 65 78 5f 62 6c 6f 62 28 70 2d  tput_hex_blob(p-
e180: 3e 6f 75 74 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c  >out, pBlob, nBl
e190: 6f 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ob);.        }el
e1a0: 73 65 20 69 66 28 20 69 73 4e 75 6d 62 65 72 28  se if( isNumber(
e1b0: 61 7a 41 72 67 5b 69 5d 2c 20 30 29 20 29 7b 0a  azArg[i], 0) ){.
e1c0: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
e1d0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73  rintf(p->out,"%s
e1e0: 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  ", azArg[i]);.  
e1f0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
e200: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75         output_qu
e210: 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  oted_string(p->o
e220: 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  ut, azArg[i]);. 
e230: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
e240: 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
e250: 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a  f(p->out,"\n");.
e260: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
e270: 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45   }.    case MODE
e280: 5f 41 73 63 69 69 3a 20 7b 0a 20 20 20 20 20 20  _Ascii: {.      
e290: 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20  if( p->cnt++==0 
e2a0: 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72  && p->showHeader
e2b0: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
e2c0: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
e2d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
e2e0: 20 69 3e 30 20 29 20 75 74 66 38 5f 70 72 69 6e   i>0 ) utf8_prin
e2f0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
e300: 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
e310: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  );.          utf
e320: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
e330: 22 25 73 22 2c 61 7a 43 6f 6c 5b 69 5d 20 3f 20  "%s",azCol[i] ? 
e340: 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a  azCol[i] : "");.
e350: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e360: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
e370: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72  >out, "%s", p->r
e380: 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  owSeparator);.  
e390: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
e3a0: 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b  azArg==0 ) break
e3b0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
e3c0: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
e3d0: 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29         if( i>0 )
e3e0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
e3f0: 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f  out, "%s", p->co
e400: 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  lSeparator);.   
e410: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
e420: 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 61 7a 41  (p->out,"%s",azA
e430: 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d  rg[i] ? azArg[i]
e440: 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29   : p->nullValue)
e450: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e460: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
e470: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77  ut, "%s", p->row
e480: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
e490: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
e4a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
e4b0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ../*.** This is 
e4c0: 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75  the callback rou
e4d0: 74 69 6e 65 20 74 68 61 74 20 74 68 65 20 53 51  tine that the SQ
e4e0: 4c 69 74 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20  Lite library.** 
e4f0: 69 6e 76 6f 6b 65 73 20 66 6f 72 20 65 61 63 68  invokes for each
e500: 20 72 6f 77 20 6f 66 20 61 20 71 75 65 72 79 20   row of a query 
e510: 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69  result..*/.stati
e520: 63 20 69 6e 74 20 63 61 6c 6c 62 61 63 6b 28 76  c int callback(v
e530: 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e  oid *pArg, int n
e540: 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72  Arg, char **azAr
e550: 67 2c 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 29  g, char **azCol)
e560: 7b 0a 20 20 2f 2a 20 73 69 6e 63 65 20 77 65 20  {.  /* since we 
e570: 64 6f 6e 27 74 20 68 61 76 65 20 74 79 70 65 20  don't have type 
e580: 69 6e 66 6f 2c 20 63 61 6c 6c 20 74 68 65 20 73  info, call the s
e590: 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 20 77 69  hell_callback wi
e5a0: 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20  th a NULL value 
e5b0: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 68 65 6c  */.  return shel
e5c0: 6c 5f 63 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c  l_callback(pArg,
e5d0: 20 6e 41 72 67 2c 20 61 7a 41 72 67 2c 20 61 7a   nArg, azArg, az
e5e0: 43 6f 6c 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 2f  Col, NULL);.}../
e5f0: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
e600: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
e610: 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65  e from sqlite3_e
e620: 78 65 63 28 29 20 74 68 61 74 20 61 70 70 65 6e  xec() that appen
e630: 64 73 20 61 6c 6c 0a 2a 2a 20 6f 75 74 70 75 74  ds all.** output
e640: 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f 66   onto the end of
e650: 20 61 20 53 68 65 6c 6c 54 65 78 74 20 6f 62 6a   a ShellText obj
e660: 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ect..*/.static i
e670: 6e 74 20 63 61 70 74 75 72 65 4f 75 74 70 75 74  nt captureOutput
e680: 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70  Callback(void *p
e690: 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63  Arg, int nArg, c
e6a0: 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61  har **azArg, cha
e6b0: 72 20 2a 2a 61 7a 29 7b 0a 20 20 53 68 65 6c 6c  r **az){.  Shell
e6c0: 54 65 78 74 20 2a 70 20 3d 20 28 53 68 65 6c 6c  Text *p = (Shell
e6d0: 54 65 78 74 2a 29 70 41 72 67 3b 0a 20 20 69 6e  Text*)pArg;.  in
e6e0: 74 20 69 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  t i;.  UNUSED_PA
e6f0: 52 41 4d 45 54 45 52 28 61 7a 29 3b 0a 20 20 69  RAMETER(az);.  i
e700: 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 72 65  f( azArg==0 ) re
e710: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d  turn 0;.  if( p-
e720: 3e 6e 20 29 20 61 70 70 65 6e 64 54 65 78 74 28  >n ) appendText(
e730: 70 2c 20 22 7c 22 2c 20 30 29 3b 0a 20 20 66 6f  p, "|", 0);.  fo
e740: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
e750: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 20 29  ++){.    if( i )
e760: 20 61 70 70 65 6e 64 54 65 78 74 28 70 2c 20 22   appendText(p, "
e770: 2c 22 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ,", 0);.    if( 
e780: 61 7a 41 72 67 5b 69 5d 20 29 20 61 70 70 65 6e  azArg[i] ) appen
e790: 64 54 65 78 74 28 70 2c 20 61 7a 41 72 67 5b 69  dText(p, azArg[i
e7a0: 5d 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74  ], 0);.  }.  ret
e7b0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
e7c0: 47 65 6e 65 72 61 74 65 20 61 6e 20 61 70 70 72  Generate an appr
e7d0: 6f 70 72 69 61 74 65 20 53 45 4c 46 54 45 53 54  opriate SELFTEST
e7e0: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d 61   table in the ma
e7f0: 69 6e 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a  in database..*/.
e800: 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65 61  static void crea
e810: 74 65 53 65 6c 66 74 65 73 74 54 61 62 6c 65 28  teSelftestTable(
e820: 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a  ShellState *p){.
e830: 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
e840: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65  = 0;.  sqlite3_e
e850: 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 22  xec(p->db,.    "
e860: 53 41 56 45 50 4f 49 4e 54 20 73 65 6c 66 74 65  SAVEPOINT selfte
e870: 73 74 5f 69 6e 69 74 3b 5c 6e 22 0a 20 20 20 20  st_init;\n".    
e880: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46  "CREATE TABLE IF
e890: 20 4e 4f 54 20 45 58 49 53 54 53 20 73 65 6c 66   NOT EXISTS self
e8a0: 74 65 73 74 28 5c 6e 22 0a 20 20 20 20 22 20 20  test(\n".    "  
e8b0: 74 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49 4d  tno INTEGER PRIM
e8c0: 41 52 59 20 4b 45 59 2c 5c 6e 22 20 20 20 2f 2a  ARY KEY,\n"   /*
e8d0: 20 54 65 73 74 20 6e 75 6d 62 65 72 20 2a 2f 0a   Test number */.
e8e0: 20 20 20 20 22 20 20 6f 70 20 54 45 58 54 2c 5c      "  op TEXT,\
e8f0: 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n"              
e900: 20 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72       /* Operator
e910: 3a 20 20 6d 65 6d 6f 20 72 75 6e 20 2a 2f 0a 20  :  memo run */. 
e920: 20 20 20 22 20 20 63 6d 64 20 54 45 58 54 2c 5c     "  cmd TEXT,\
e930: 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n"              
e940: 20 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 74      /* Command t
e950: 65 78 74 20 2a 2f 0a 20 20 20 20 22 20 20 61 6e  ext */.    "  an
e960: 73 20 54 45 58 54 5c 6e 22 20 20 20 20 20 20 20  s TEXT\n"       
e970: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
e980: 65 73 69 72 65 64 20 61 6e 73 77 65 72 20 2a 2f  esired answer */
e990: 0a 20 20 20 20 22 29 3b 22 0a 20 20 20 20 22 43  .    ");".    "C
e9a0: 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c 45  REATE TEMP TABLE
e9b0: 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 28 6f   [_shell$self](o
e9c0: 70 2c 63 6d 64 2c 61 6e 73 29 3b 5c 6e 22 0a 20  p,cmd,ans);\n". 
e9d0: 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20     "INSERT INTO 
e9e0: 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 28 72 6f  [_shell$self](ro
e9f0: 77 69 64 2c 6f 70 2c 63 6d 64 29 5c 6e 22 0a 20  wid,op,cmd)\n". 
ea00: 20 20 20 22 20 20 56 41 4c 55 45 53 28 63 6f 61     "  VALUES(coa
ea10: 6c 65 73 63 65 28 28 53 45 4c 45 43 54 20 28 6d  lesce((SELECT (m
ea20: 61 78 28 74 6e 6f 29 2b 31 30 30 29 2f 31 30 20  ax(tno)+100)/10 
ea30: 46 52 4f 4d 20 73 65 6c 66 74 65 73 74 29 2c 31  FROM selftest),1
ea40: 30 29 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20  0),\n".    "    
ea50: 20 20 20 20 20 27 6d 65 6d 6f 27 2c 27 54 65 73       'memo','Tes
ea60: 74 73 20 67 65 6e 65 72 61 74 65 64 20 62 79 20  ts generated by 
ea70: 2d 2d 69 6e 69 74 27 29 3b 5c 6e 22 0a 20 20 20  --init');\n".   
ea80: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f   "INSERT INTO [_
ea90: 73 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20  shell$self]\n". 
eaa0: 20 20 20 22 20 20 53 45 4c 45 43 54 20 27 72 75     "  SELECT 'ru
eab0: 6e 27 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20  n',\n".    "    
eac0: 27 53 45 4c 45 43 54 20 68 65 78 28 73 68 61 33  'SELECT hex(sha3
ead0: 5f 71 75 65 72 79 28 27 27 53 45 4c 45 43 54 20  _query(''SELECT 
eae0: 74 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61  type,name,tbl_na
eaf0: 6d 65 2c 73 71 6c 20 22 0a 20 20 20 20 20 20 20  me,sql ".       
eb00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb10: 20 20 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20            "FROM 
eb20: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 4f 52  sqlite_master OR
eb30: 44 45 52 20 42 59 20 32 27 27 2c 32 32 34 29 29  DER BY 2'',224))
eb40: 27 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 68  ',\n".    "    h
eb50: 65 78 28 73 68 61 33 5f 71 75 65 72 79 28 27 53  ex(sha3_query('S
eb60: 45 4c 45 43 54 20 74 79 70 65 2c 6e 61 6d 65 2c  ELECT type,name,
eb70: 74 62 6c 5f 6e 61 6d 65 2c 73 71 6c 20 22 0a 20  tbl_name,sql ". 
eb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb90: 20 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20 73           "FROM s
eba0: 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 4f 52 44  qlite_master ORD
ebb0: 45 52 20 42 59 20 32 27 2c 32 32 34 29 29 3b 5c  ER BY 2',224));\
ebc0: 6e 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49  n".    "INSERT I
ebd0: 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66  NTO [_shell$self
ebe0: 5d 5c 6e 22 0a 20 20 20 20 22 20 20 53 45 4c 45  ]\n".    "  SELE
ebf0: 43 54 20 27 72 75 6e 27 2c 22 0a 20 20 20 20 22  CT 'run',".    "
ec00: 20 20 20 20 27 53 45 4c 45 43 54 20 68 65 78 28      'SELECT hex(
ec10: 73 68 61 33 5f 71 75 65 72 79 28 27 27 53 45 4c  sha3_query(''SEL
ec20: 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 27 20 7c  ECT * FROM \"' |
ec30: 7c 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20  |".    "        
ec40: 70 72 69 6e 74 66 28 27 25 77 27 2c 6e 61 6d 65  printf('%w',name
ec50: 29 20 7c 7c 20 27 5c 22 20 4e 4f 54 20 49 4e 44  ) || '\" NOT IND
ec60: 45 58 45 44 27 27 2c 32 32 34 29 29 27 2c 5c 6e  EXED'',224))',\n
ec70: 22 0a 20 20 20 20 22 20 20 20 20 68 65 78 28 73  ".    "    hex(s
ec80: 68 61 33 5f 71 75 65 72 79 28 70 72 69 6e 74 66  ha3_query(printf
ec90: 28 27 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  ('SELECT * FROM 
eca0: 5c 22 25 77 5c 22 20 4e 4f 54 20 49 4e 44 45 58  \"%w\" NOT INDEX
ecb0: 45 44 27 2c 6e 61 6d 65 29 2c 32 32 34 29 29 5c  ED',name),224))\
ecc0: 6e 22 0a 20 20 20 20 22 20 20 46 52 4f 4d 20 28  n".    "  FROM (
ecd0: 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 53 45 4c  \n".    "    SEL
ece0: 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71  ECT name FROM sq
ecf0: 6c 69 74 65 5f 6d 61 73 74 65 72 5c 6e 22 0a 20  lite_master\n". 
ed00: 20 20 20 22 20 20 20 20 20 57 48 45 52 45 20 74     "     WHERE t
ed10: 79 70 65 3d 27 74 61 62 6c 65 27 5c 6e 22 0a 20  ype='table'\n". 
ed20: 20 20 20 22 20 20 20 20 20 20 20 41 4e 44 20 6e     "       AND n
ed30: 61 6d 65 3c 3e 27 73 65 6c 66 74 65 73 74 27 5c  ame<>'selftest'\
ed40: 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 41  n".    "       A
ed50: 4e 44 20 63 6f 61 6c 65 73 63 65 28 72 6f 6f 74  ND coalesce(root
ed60: 70 61 67 65 2c 30 29 3e 30 5c 6e 22 0a 20 20 20  page,0)>0\n".   
ed70: 20 22 20 20 29 5c 6e 22 0a 20 20 20 20 22 20 4f   "  )\n".    " O
ed80: 52 44 45 52 20 42 59 20 6e 61 6d 65 3b 5c 6e 22  RDER BY name;\n"
ed90: 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54  .    "INSERT INT
eda0: 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 5c  O [_shell$self]\
edb0: 6e 22 0a 20 20 20 20 22 20 20 56 41 4c 55 45 53  n".    "  VALUES
edc0: 28 27 72 75 6e 27 2c 27 50 52 41 47 4d 41 20 69  ('run','PRAGMA i
edd0: 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 27 2c  ntegrity_check',
ede0: 27 6f 6b 27 29 3b 5c 6e 22 0a 20 20 20 20 22 49  'ok');\n".    "I
edf0: 4e 53 45 52 54 20 49 4e 54 4f 20 73 65 6c 66 74  NSERT INTO selft
ee00: 65 73 74 28 74 6e 6f 2c 6f 70 2c 63 6d 64 2c 61  est(tno,op,cmd,a
ee10: 6e 73 29 22 0a 20 20 20 20 22 20 20 53 45 4c 45  ns)".    "  SELE
ee20: 43 54 20 72 6f 77 69 64 2a 31 30 2c 6f 70 2c 63  CT rowid*10,op,c
ee30: 6d 64 2c 61 6e 73 20 46 52 4f 4d 20 5b 5f 73 68  md,ans FROM [_sh
ee40: 65 6c 6c 24 73 65 6c 66 5d 3b 5c 6e 22 0a 20 20  ell$self];\n".  
ee50: 20 20 22 44 52 4f 50 20 54 41 42 4c 45 20 5b 5f    "DROP TABLE [_
ee60: 73 68 65 6c 6c 24 73 65 6c 66 5d 3b 22 0a 20 20  shell$self];".  
ee70: 20 20 2c 30 2c 30 2c 26 7a 45 72 72 4d 73 67 29    ,0,0,&zErrMsg)
ee80: 3b 0a 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20  ;.  if( zErrMsg 
ee90: 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
eea0: 74 66 28 73 74 64 65 72 72 2c 20 22 53 45 4c 46  tf(stderr, "SELF
eeb0: 54 45 53 54 20 69 6e 69 74 69 61 6c 69 7a 61 74  TEST initializat
eec0: 69 6f 6e 20 66 61 69 6c 75 72 65 3a 20 25 73 5c  ion failure: %s\
eed0: 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  n", zErrMsg);.  
eee0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
eef0: 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 73  ErrMsg);.  }.  s
ef00: 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
ef10: 62 2c 20 22 52 45 4c 45 41 53 45 20 73 65 6c 66  b, "RELEASE self
ef20: 74 65 73 74 5f 69 6e 69 74 22 2c 30 2c 30 2c 30  test_init",0,0,0
ef30: 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  );.}.../*.** Set
ef40: 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e   the destination
ef50: 20 74 61 62 6c 65 20 66 69 65 6c 64 20 6f 66 20   table field of 
ef60: 74 68 65 20 53 68 65 6c 6c 53 74 61 74 65 20 73  the ShellState s
ef70: 74 72 75 63 74 75 72 65 20 74 6f 0a 2a 2a 20 74  tructure to.** t
ef80: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
ef90: 61 62 6c 65 20 67 69 76 65 6e 2e 20 20 45 73 63  able given.  Esc
efa0: 61 70 65 20 61 6e 79 20 71 75 6f 74 65 20 63 68  ape any quote ch
efb0: 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 0a  aracters in the.
efc0: 2a 2a 20 74 61 62 6c 65 20 6e 61 6d 65 2e 0a 2a  ** table name..*
efd0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
efe0: 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 53 68 65  t_table_name(She
eff0: 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73  llState *p, cons
f000: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a  t char *zName){.
f010: 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 63 68    int i, n;.  ch
f020: 61 72 20 63 51 75 6f 74 65 3b 0a 20 20 63 68 61  ar cQuote;.  cha
f030: 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 2d 3e  r *z;..  if( p->
f040: 7a 44 65 73 74 54 61 62 6c 65 20 29 7b 0a 20 20  zDestTable ){.  
f050: 20 20 66 72 65 65 28 70 2d 3e 7a 44 65 73 74 54    free(p->zDestT
f060: 61 62 6c 65 29 3b 0a 20 20 20 20 70 2d 3e 7a 44  able);.    p->zD
f070: 65 73 74 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20  estTable = 0;.  
f080: 7d 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30  }.  if( zName==0
f090: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 63 51 75   ) return;.  cQu
f0a0: 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61 72 28  ote = quoteChar(
f0b0: 7a 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 73 74  zName);.  n = st
f0c0: 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20  rlen30(zName);. 
f0d0: 20 69 66 28 20 63 51 75 6f 74 65 20 29 20 6e 20   if( cQuote ) n 
f0e0: 2b 3d 20 6e 2b 32 3b 0a 20 20 7a 20 3d 20 70 2d  += n+2;.  z = p-
f0f0: 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 6d 61  >zDestTable = ma
f100: 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20 69  lloc( n+1 );.  i
f110: 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 72  f( z==0 ){.    r
f120: 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
f130: 2c 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20  ,"Error: out of 
f140: 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20  memory\n");.    
f150: 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 6e  exit(1);.  }.  n
f160: 20 3d 20 30 3b 0a 20 20 69 66 28 20 63 51 75 6f   = 0;.  if( cQuo
f170: 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63 51  te ) z[n++] = cQ
f180: 75 6f 74 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  uote;.  for(i=0;
f190: 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b   zName[i]; i++){
f1a0: 0a 20 20 20 20 7a 5b 6e 2b 2b 5d 20 3d 20 7a 4e  .    z[n++] = zN
f1b0: 61 6d 65 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  ame[i];.    if( 
f1c0: 7a 4e 61 6d 65 5b 69 5d 3d 3d 63 51 75 6f 74 65  zName[i]==cQuote
f1d0: 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75 6f   ) z[n++] = cQuo
f1e0: 74 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63 51  te;.  }.  if( cQ
f1f0: 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20  uote ) z[n++] = 
f200: 63 51 75 6f 74 65 3b 0a 20 20 7a 5b 6e 5d 20 3d  cQuote;.  z[n] =
f210: 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78   0;.}.../*.** Ex
f220: 65 63 75 74 65 20 61 20 71 75 65 72 79 20 73 74  ecute a query st
f230: 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69 6c  atement that wil
f240: 6c 20 67 65 6e 65 72 61 74 65 20 53 51 4c 20 6f  l generate SQL o
f250: 75 74 70 75 74 2e 20 20 50 72 69 6e 74 0a 2a 2a  utput.  Print.**
f260: 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c 75   the result colu
f270: 6d 6e 73 2c 20 63 6f 6d 6d 61 2d 73 65 70 61 72  mns, comma-separ
f280: 61 74 65 64 2c 20 6f 6e 20 61 20 6c 69 6e 65 20  ated, on a line 
f290: 61 6e 64 20 74 68 65 6e 20 61 64 64 20 61 0a 2a  and then add a.*
f2a0: 2a 20 73 65 6d 69 63 6f 6c 6f 6e 20 74 65 72 6d  * semicolon term
f2b0: 69 6e 61 74 6f 72 20 74 6f 20 74 68 65 20 65 6e  inator to the en
f2c0: 64 20 6f 66 20 74 68 61 74 20 6c 69 6e 65 2e 0a  d of that line..
f2d0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d  **.** If the num
f2e0: 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69  ber of columns i
f2f0: 73 20 31 20 61 6e 64 20 74 68 61 74 20 63 6f 6c  s 1 and that col
f300: 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 74 65 78  umn contains tex
f310: 74 20 22 2d 2d 22 0a 2a 2a 20 74 68 65 6e 20 77  t "--".** then w
f320: 72 69 74 65 20 74 68 65 20 73 65 6d 69 63 6f 6c  rite the semicol
f330: 6f 6e 20 6f 6e 20 61 20 73 65 70 61 72 61 74 65  on on a separate
f340: 20 6c 69 6e 65 2e 20 20 54 68 61 74 20 77 61 79   line.  That way
f350: 2c 20 69 66 20 61 0a 2a 2a 20 22 2d 2d 22 20 63  , if a.** "--" c
f360: 6f 6d 6d 65 6e 74 20 6f 63 63 75 72 73 20 61 74  omment occurs at
f370: 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65 20   the end of the 
f380: 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20 63  statement, the c
f390: 6f 6d 6d 65 6e 74 0a 2a 2a 20 77 6f 6e 27 74 20  omment.** won't 
f3a0: 63 6f 6e 73 75 6d 65 20 74 68 65 20 73 65 6d 69  consume the semi
f3b0: 63 6f 6c 6f 6e 20 74 65 72 6d 69 6e 61 74 6f 72  colon terminator
f3c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
f3d0: 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71  run_table_dump_q
f3e0: 75 65 72 79 28 0a 20 20 53 68 65 6c 6c 53 74 61  uery(.  ShellSta
f3f0: 74 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  te *p,          
f400: 20 2f 2a 20 51 75 65 72 79 20 63 6f 6e 74 65 78   /* Query contex
f410: 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
f420: 72 20 2a 7a 53 65 6c 65 63 74 2c 20 20 20 20 20  r *zSelect,     
f430: 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  /* SELECT statem
f440: 65 6e 74 20 74 6f 20 65 78 74 72 61 63 74 20 63  ent to extract c
f450: 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73  ontent */.  cons
f460: 74 20 63 68 61 72 20 2a 7a 46 69 72 73 74 52 6f  t char *zFirstRo
f470: 77 20 20 20 20 2f 2a 20 50 72 69 6e 74 20 62 65  w    /* Print be
f480: 66 6f 72 65 20 66 69 72 73 74 20 72 6f 77 2c 20  fore first row, 
f490: 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29  if not NULL */.)
f4a0: 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
f4b0: 20 2a 70 53 65 6c 65 63 74 3b 0a 20 20 69 6e 74   *pSelect;.  int
f4c0: 20 72 63 3b 0a 20 20 69 6e 74 20 6e 52 65 73 75   rc;.  int nResu
f4d0: 6c 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  lt;.  int i;.  c
f4e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20  onst char *z;.  
f4f0: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
f500: 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a  pare_v2(p->db, z
f510: 53 65 6c 65 63 74 2c 20 2d 31 2c 20 26 70 53 65  Select, -1, &pSe
f520: 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  lect, 0);.  if( 
f530: 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c  rc!=SQLITE_OK ||
f540: 20 21 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20   !pSelect ){.   
f550: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
f560: 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45 52 52 4f  out, "/**** ERRO
f570: 52 3a 20 28 25 64 29 20 25 73 20 2a 2a 2a 2a 2a  R: (%d) %s *****
f580: 2f 5c 6e 22 2c 20 72 63 2c 0a 20 20 20 20 20 20  /\n", rc,.      
f590: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
f5a0: 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29  3_errmsg(p->db))
f5b0: 3b 0a 20 20 20 20 69 66 28 20 28 72 63 26 30 78  ;.    if( (rc&0x
f5c0: 66 66 29 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52  ff)!=SQLITE_CORR
f5d0: 55 50 54 20 29 20 70 2d 3e 6e 45 72 72 2b 2b 3b  UPT ) p->nErr++;
f5e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  .    return rc;.
f5f0: 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
f600: 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74 29  e3_step(pSelect)
f610: 3b 0a 20 20 6e 52 65 73 75 6c 74 20 3d 20 73 71  ;.  nResult = sq
f620: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
f630: 6e 74 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 77  nt(pSelect);.  w
f640: 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
f650: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 66 28 20  _ROW ){.    if( 
f660: 7a 46 69 72 73 74 52 6f 77 20 29 7b 0a 20 20 20  zFirstRow ){.   
f670: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
f680: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 46 69  ->out, "%s", zFi
f690: 72 73 74 52 6f 77 29 3b 0a 20 20 20 20 20 20 7a  rstRow);.      z
f6a0: 46 69 72 73 74 52 6f 77 20 3d 20 30 3b 0a 20 20  FirstRow = 0;.  
f6b0: 20 20 7d 0a 20 20 20 20 7a 20 3d 20 28 63 6f 6e    }.    z = (con
f6c0: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
f6d0: 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 65  _column_text(pSe
f6e0: 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 75 74  lect, 0);.    ut
f6f0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
f700: 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20  , "%s", z);.    
f710: 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 52 65 73 75  for(i=1; i<nResu
f720: 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  lt; i++){.      
f730: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
f740: 75 74 2c 20 22 2c 25 73 22 2c 20 73 71 6c 69 74  ut, ",%s", sqlit
f750: 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
f760: 53 65 6c 65 63 74 2c 20 69 29 29 3b 0a 20 20 20  Select, i));.   
f770: 20 7d 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30 20   }.    if( z==0 
f780: 29 20 7a 20 3d 20 22 22 3b 0a 20 20 20 20 77 68  ) z = "";.    wh
f790: 69 6c 65 28 20 7a 5b 30 5d 20 26 26 20 28 7a 5b  ile( z[0] && (z[
f7a0: 30 5d 21 3d 27 2d 27 20 7c 7c 20 7a 5b 31 5d 21  0]!='-' || z[1]!
f7b0: 3d 27 2d 27 29 20 29 20 7a 2b 2b 3b 0a 20 20 20  ='-') ) z++;.   
f7c0: 20 69 66 28 20 7a 5b 30 5d 20 29 7b 0a 20 20 20   if( z[0] ){.   
f7d0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
f7e0: 3e 6f 75 74 2c 20 22 5c 6e 3b 5c 6e 22 29 3b 0a  >out, "\n;\n");.
f7f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
f800: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
f810: 75 74 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20  ut, ";\n");.    
f820: 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
f830: 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74 29  e3_step(pSelect)
f840: 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
f850: 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
f860: 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 72 63  elect);.  if( rc
f870: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
f880: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
f890: 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45 52  ->out, "/**** ER
f8a0: 52 4f 52 3a 20 28 25 64 29 20 25 73 20 2a 2a 2a  ROR: (%d) %s ***
f8b0: 2a 2a 2f 5c 6e 22 2c 20 72 63 2c 0a 20 20 20 20  **/\n", rc,.    
f8c0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
f8d0: 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
f8e0: 29 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 26  ));.    if( (rc&
f8f0: 30 78 66 66 29 21 3d 53 51 4c 49 54 45 5f 43 4f  0xff)!=SQLITE_CO
f900: 52 52 55 50 54 20 29 20 70 2d 3e 6e 45 72 72 2b  RRUPT ) p->nErr+
f910: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
f920: 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c  rc;.}../*.** All
f930: 6f 63 61 74 65 20 73 70 61 63 65 20 61 6e 64 20  ocate space and 
f940: 73 61 76 65 20 6f 66 66 20 63 75 72 72 65 6e 74  save off current
f950: 20 65 72 72 6f 72 20 73 74 72 69 6e 67 2e 0a 2a   error string..*
f960: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 73  /.static char *s
f970: 61 76 65 5f 65 72 72 5f 6d 73 67 28 0a 20 20 73  ave_err_msg(.  s
f980: 71 6c 69 74 65 33 20 2a 64 62 20 20 20 20 20 20  qlite3 *db      
f990: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
f9a0: 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 29 7b  e to query */.){
f9b0: 0a 20 20 69 6e 74 20 6e 45 72 72 4d 73 67 20 3d  .  int nErrMsg =
f9c0: 20 31 2b 73 74 72 6c 65 6e 33 30 28 73 71 6c 69   1+strlen30(sqli
f9d0: 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b  te3_errmsg(db));
f9e0: 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  .  char *zErrMsg
f9f0: 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
fa00: 63 36 34 28 6e 45 72 72 4d 73 67 29 3b 0a 20 20  c64(nErrMsg);.  
fa10: 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20  if( zErrMsg ){. 
fa20: 20 20 20 6d 65 6d 63 70 79 28 7a 45 72 72 4d 73     memcpy(zErrMs
fa30: 67 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  g, sqlite3_errms
fa40: 67 28 64 62 29 2c 20 6e 45 72 72 4d 73 67 29 3b  g(db), nErrMsg);
fa50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a 45  .  }.  return zE
fa60: 72 72 4d 73 67 3b 0a 7d 0a 0a 23 69 66 64 65 66  rrMsg;.}..#ifdef
fa70: 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 2f 2a 0a 2a 2a   __linux__./*.**
fa80: 20 41 74 74 65 6d 70 74 20 74 6f 20 64 69 73 70   Attempt to disp
fa90: 6c 61 79 20 49 2f 4f 20 73 74 61 74 73 20 6f 6e  lay I/O stats on
faa0: 20 4c 69 6e 75 78 20 75 73 69 6e 67 20 2f 70 72   Linux using /pr
fab0: 6f 63 2f 50 49 44 2f 69 6f 0a 2a 2f 0a 73 74 61  oc/PID/io.*/.sta
fac0: 74 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79  tic void display
fad0: 4c 69 6e 75 78 49 6f 53 74 61 74 73 28 46 49 4c  LinuxIoStats(FIL
fae0: 45 20 2a 6f 75 74 29 7b 0a 20 20 46 49 4c 45 20  E *out){.  FILE 
faf0: 2a 69 6e 3b 0a 20 20 63 68 61 72 20 7a 5b 32 30  *in;.  char z[20
fb00: 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e  0];.  sqlite3_sn
fb10: 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29  printf(sizeof(z)
fb20: 2c 20 7a 2c 20 22 2f 70 72 6f 63 2f 25 64 2f 69  , z, "/proc/%d/i
fb30: 6f 22 2c 20 67 65 74 70 69 64 28 29 29 3b 0a 20  o", getpid());. 
fb40: 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 2c 20 22   in = fopen(z, "
fb50: 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d  rb");.  if( in==
fb60: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77 68  0 ) return;.  wh
fb70: 69 6c 65 28 20 66 67 65 74 73 28 7a 2c 20 73 69  ile( fgets(z, si
fb80: 7a 65 6f 66 28 7a 29 2c 20 69 6e 29 21 3d 30 20  zeof(z), in)!=0 
fb90: 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  ){.    static co
fba0: 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20  nst struct {.   
fbb0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
fbc0: 50 61 74 74 65 72 6e 3b 0a 20 20 20 20 20 20 63  Pattern;.      c
fbd0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73 63  onst char *zDesc
fbe0: 3b 0a 20 20 20 20 7d 20 61 54 72 61 6e 73 5b 5d  ;.    } aTrans[]
fbf0: 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 72 63   = {.      { "rc
fc00: 68 61 72 3a 20 22 2c 20 20 20 20 20 20 20 20 20  har: ",         
fc10: 20 20 20 20 20 20 20 20 20 22 42 79 74 65 73 20           "Bytes 
fc20: 72 65 63 65 69 76 65 64 20 62 79 20 72 65 61 64  received by read
fc30: 28 29 3a 22 20 7d 2c 0a 20 20 20 20 20 20 7b 20  ():" },.      { 
fc40: 22 77 63 68 61 72 3a 20 22 2c 20 20 20 20 20 20  "wchar: ",      
fc50: 20 20 20 20 20 20 20 20 20 20 20 20 22 42 79 74              "Byt
fc60: 65 73 20 73 65 6e 74 20 74 6f 20 77 72 69 74 65  es sent to write
fc70: 28 29 3a 22 20 20 20 20 7d 2c 0a 20 20 20 20 20  ():"    },.     
fc80: 20 7b 20 22 73 79 73 63 72 3a 20 22 2c 20 20 20   { "syscr: ",   
fc90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
fca0: 52 65 61 64 28 29 20 73 79 73 74 65 6d 20 63 61  Read() system ca
fcb0: 6c 6c 73 3a 22 20 20 20 20 20 20 7d 2c 0a 20 20  lls:"      },.  
fcc0: 20 20 20 20 7b 20 22 73 79 73 63 77 3a 20 22 2c      { "syscw: ",
fcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fce0: 20 20 22 57 72 69 74 65 28 29 20 73 79 73 74 65    "Write() syste
fcf0: 6d 20 63 61 6c 6c 73 3a 22 20 20 20 20 20 7d 2c  m calls:"     },
fd00: 0a 20 20 20 20 20 20 7b 20 22 72 65 61 64 5f 62  .      { "read_b
fd10: 79 74 65 73 3a 20 22 2c 20 20 20 20 20 20 20 20  ytes: ",        
fd20: 20 20 20 20 20 22 42 79 74 65 73 20 72 65 61 64       "Bytes read
fd30: 20 66 72 6f 6d 20 73 74 6f 72 61 67 65 3a 22 20   from storage:" 
fd40: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 77 72 69   },.      { "wri
fd50: 74 65 5f 62 79 74 65 73 3a 20 22 2c 20 20 20 20  te_bytes: ",    
fd60: 20 20 20 20 20 20 20 20 22 42 79 74 65 73 20 77          "Bytes w
fd70: 72 69 74 74 65 6e 20 74 6f 20 73 74 6f 72 61 67  ritten to storag
fd80: 65 3a 22 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22  e:" },.      { "
fd90: 63 61 6e 63 65 6c 6c 65 64 5f 77 72 69 74 65 5f  cancelled_write_
fda0: 62 79 74 65 73 3a 20 22 2c 20 20 22 43 61 6e 63  bytes: ",  "Canc
fdb0: 65 6c 6c 65 64 20 77 72 69 74 65 20 62 79 74 65  elled write byte
fdc0: 73 3a 22 20 20 20 20 7d 2c 0a 20 20 20 20 7d 3b  s:"    },.    };
fdd0: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
fde0: 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
fdf0: 53 69 7a 65 28 61 54 72 61 6e 73 29 3b 20 69 2b  Size(aTrans); i+
fe00: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  +){.      int n 
fe10: 3d 20 73 74 72 6c 65 6e 33 30 28 61 54 72 61 6e  = strlen30(aTran
fe20: 73 5b 69 5d 2e 7a 50 61 74 74 65 72 6e 29 3b 0a  s[i].zPattern);.
fe30: 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d        if( strncm
fe40: 70 28 61 54 72 61 6e 73 5b 69 5d 2e 7a 50 61 74  p(aTrans[i].zPat
fe50: 74 65 72 6e 2c 20 7a 2c 20 6e 29 3d 3d 30 20 29  tern, z, n)==0 )
fe60: 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
fe70: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36  rintf(out, "%-36
fe80: 73 20 25 73 22 2c 20 61 54 72 61 6e 73 5b 69 5d  s %s", aTrans[i]
fe90: 2e 7a 44 65 73 63 2c 20 26 7a 5b 6e 5d 29 3b 0a  .zDesc, &z[n]);.
fea0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
feb0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
fec0: 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 7d  .  fclose(in);.}
fed0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
fee0: 69 73 70 6c 61 79 20 61 20 73 69 6e 67 6c 65 20  isplay a single 
fef0: 6c 69 6e 65 20 6f 66 20 73 74 61 74 75 73 20 75  line of status u
ff00: 73 69 6e 67 20 36 34 2d 62 69 74 20 76 61 6c 75  sing 64-bit valu
ff10: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
ff20: 69 64 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69  id displayStatLi
ff30: 6e 65 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  ne(.  ShellState
ff40: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
ff50: 2f 2a 20 54 68 65 20 73 68 65 6c 6c 20 63 6f 6e  /* The shell con
ff60: 74 65 78 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  text */.  char *
ff70: 7a 4c 61 62 65 6c 2c 20 20 20 20 20 20 20 20 20  zLabel,         
ff80: 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
ff90: 20 74 68 69 73 20 6f 6e 65 20 6c 69 6e 65 20 2a   this one line *
ffa0: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  /.  char *zForma
ffb0: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
ffc0: 20 46 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20   Format for the 
ffd0: 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69 6e 74 20  result */.  int 
ffe0: 69 53 74 61 74 75 73 43 74 72 6c 2c 20 20 20 20  iStatusCtrl,    
fff0: 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 73        /* Which s
10000 74 61 74 75 73 20 74 6f 20 64 69 73 70 6c 61 79  tatus to display
10010 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 73 65 74   */.  int bReset
10020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10030 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65 74  /* True to reset
10040 20 74 68 65 20 73 74 61 74 73 20 2a 2f 0a 29 7b   the stats */.){
10050 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
10060 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 73 71   iCur = -1;.  sq
10070 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 48 69 77  lite3_int64 iHiw
10080 74 72 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69  tr = -1;.  int i
10090 2c 20 6e 50 65 72 63 65 6e 74 3b 0a 20 20 63 68  , nPercent;.  ch
100a0 61 72 20 7a 4c 69 6e 65 5b 32 30 30 5d 3b 0a 20  ar zLine[200];. 
100b0 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73 36   sqlite3_status6
100c0 34 28 69 53 74 61 74 75 73 43 74 72 6c 2c 20 26  4(iStatusCtrl, &
100d0 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62  iCur, &iHiwtr, b
100e0 52 65 73 65 74 29 3b 0a 20 20 66 6f 72 28 69 3d  Reset);.  for(i=
100f0 30 2c 20 6e 50 65 72 63 65 6e 74 3d 30 3b 20 7a  0, nPercent=0; z
10100 46 6f 72 6d 61 74 5b 69 5d 3b 20 69 2b 2b 29 7b  Format[i]; i++){
10110 0a 20 20 20 20 69 66 28 20 7a 46 6f 72 6d 61 74  .    if( zFormat
10120 5b 69 5d 3d 3d 27 25 27 20 29 20 6e 50 65 72 63  [i]=='%' ) nPerc
10130 65 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28  ent++;.  }.  if(
10140 20 6e 50 65 72 63 65 6e 74 3e 31 20 29 7b 0a 20   nPercent>1 ){. 
10150 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
10160 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65  ntf(sizeof(zLine
10170 29 2c 20 7a 4c 69 6e 65 2c 20 7a 46 6f 72 6d 61  ), zLine, zForma
10180 74 2c 20 69 43 75 72 2c 20 69 48 69 77 74 72 29  t, iCur, iHiwtr)
10190 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
101a0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
101b0 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 7a  sizeof(zLine), z
101c0 4c 69 6e 65 2c 20 7a 46 6f 72 6d 61 74 2c 20 69  Line, zFormat, i
101d0 48 69 77 74 72 29 3b 0a 20 20 7d 0a 20 20 72 61  Hiwtr);.  }.  ra
101e0 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
101f0 20 22 25 2d 33 36 73 20 25 73 5c 6e 22 2c 20 7a   "%-36s %s\n", z
10200 4c 61 62 65 6c 2c 20 7a 4c 69 6e 65 29 3b 0a 7d  Label, zLine);.}
10210 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20  ../*.** Display 
10220 6d 65 6d 6f 72 79 20 73 74 61 74 73 2e 0a 2a 2f  memory stats..*/
10230 0a 73 74 61 74 69 63 20 69 6e 74 20 64 69 73 70  .static int disp
10240 6c 61 79 5f 73 74 61 74 73 28 0a 20 20 73 71 6c  lay_stats(.  sql
10250 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
10260 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
10270 62 61 73 65 20 74 6f 20 71 75 65 72 79 20 2a 2f  base to query */
10280 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
10290 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Arg,           /
102a0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68 65  * Pointer to She
102b0 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74  llState */.  int
102c0 20 62 52 65 73 65 74 20 20 20 20 20 20 20 20 20   bReset         
102d0 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
102e0 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 73 74   to reset the st
102f0 61 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ats */.){.  int 
10300 69 43 75 72 3b 0a 20 20 69 6e 74 20 69 48 69 77  iCur;.  int iHiw
10310 74 72 3b 0a 20 20 46 49 4c 45 20 2a 6f 75 74 3b  tr;.  FILE *out;
10320 0a 20 20 69 66 28 20 70 41 72 67 3d 3d 30 20 7c  .  if( pArg==0 |
10330 7c 20 70 41 72 67 2d 3e 6f 75 74 3d 3d 30 20 29  | pArg->out==0 )
10340 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f 75 74   return 0;.  out
10350 20 3d 20 70 41 72 67 2d 3e 6f 75 74 3b 0a 0a 20   = pArg->out;.. 
10360 20 69 66 28 20 70 41 72 67 2d 3e 70 53 74 6d 74   if( pArg->pStmt
10370 20 26 26 20 28 70 41 72 67 2d 3e 73 74 61 74 73   && (pArg->stats
10380 4f 6e 20 26 20 32 29 20 29 7b 0a 20 20 20 20 69  On & 2) ){.    i
10390 6e 74 20 6e 43 6f 6c 2c 20 69 2c 20 78 3b 0a 20  nt nCol, i, x;. 
103a0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
103b0 2a 70 53 74 6d 74 20 3d 20 70 41 72 67 2d 3e 70  *pStmt = pArg->p
103c0 53 74 6d 74 3b 0a 20 20 20 20 63 68 61 72 20 7a  Stmt;.    char z
103d0 5b 31 30 30 5d 3b 0a 20 20 20 20 6e 43 6f 6c 20  [100];.    nCol 
103e0 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
103f0 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20  _count(pStmt);. 
10400 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
10410 74 2c 20 22 25 2d 33 36 73 20 25 64 5c 6e 22 2c  t, "%-36s %d\n",
10420 20 22 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74 70   "Number of outp
10430 75 74 20 63 6f 6c 75 6d 6e 73 3a 22 2c 20 6e 43  ut columns:", nC
10440 6f 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  ol);.    for(i=0
10450 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
10460 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
10470 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29  printf(sizeof(z)
10480 2c 7a 2c 22 43 6f 6c 75 6d 6e 20 25 64 20 25 6e  ,z,"Column %d %n
10490 6e 61 6d 65 3a 22 2c 20 69 2c 20 26 78 29 3b 0a  name:", i, &x);.
104a0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
104b0 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 73  f(out, "%-36s %s
104c0 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74 65 33 5f  \n", z, sqlite3_
104d0 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d  column_name(pStm
104e0 74 2c 69 29 29 3b 0a 23 69 66 6e 64 65 66 20 53  t,i));.#ifndef S
104f0 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c 54  QLITE_OMIT_DECLT
10500 59 50 45 0a 20 20 20 20 20 20 73 71 6c 69 74 65  YPE.      sqlite
10510 33 5f 73 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a  3_snprintf(30, z
10520 2b 78 2c 20 22 64 65 63 6c 61 72 65 64 20 74 79  +x, "declared ty
10530 70 65 3a 22 29 3b 0a 20 20 20 20 20 20 75 74 66  pe:");.      utf
10540 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  8_printf(out, "%
10550 2d 33 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20 73  -36s %s\n", z, s
10560 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 65  qlite3_column_de
10570 63 6c 74 79 70 65 28 70 53 74 6d 74 2c 20 69 29  cltype(pStmt, i)
10580 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65 66  );.#endif.#ifdef
10590 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 43   SQLITE_ENABLE_C
105a0 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a 20  OLUMN_METADATA. 
105b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
105c0 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78 2c 20 22  rintf(30, z+x, "
105d0 64 61 74 61 62 61 73 65 20 6e 61 6d 65 3a 22 29  database name:")
105e0 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  ;.      utf8_pri
105f0 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20  ntf(out, "%-36s 
10600 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74 65  %s\n", z, sqlite
10610 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61 73  3_column_databas
10620 65 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 29  e_name(pStmt,i))
10630 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
10640 73 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78  snprintf(30, z+x
10650 2c 20 22 74 61 62 6c 65 20 6e 61 6d 65 3a 22 29  , "table name:")
10660 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  ;.      utf8_pri
10670 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20  ntf(out, "%-36s 
10680 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74 65  %s\n", z, sqlite
10690 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f 6e  3_column_table_n
106a0 61 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 20  ame(pStmt,i));. 
106b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
106c0 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78 2c 20 22  rintf(30, z+x, "
106d0 6f 72 69 67 69 6e 20 6e 61 6d 65 3a 22 29 3b 0a  origin name:");.
106e0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
106f0 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 73  f(out, "%-36s %s
10700 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74 65 33 5f  \n", z, sqlite3_
10710 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e 61  column_origin_na
10720 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 23 65  me(pStmt,i));.#e
10730 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ndif.    }.  }..
10740 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e    displayStatLin
10750 65 28 70 41 72 67 2c 20 22 4d 65 6d 6f 72 79 20  e(pArg, "Memory 
10760 55 73 65 64 3a 22 2c 0a 20 20 20 20 20 22 25 6c  Used:",.     "%l
10770 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 20 62 79  ld (max %lld) by
10780 74 65 73 22 2c 20 53 51 4c 49 54 45 5f 53 54 41  tes", SQLITE_STA
10790 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44 2c  TUS_MEMORY_USED,
107a0 20 62 52 65 73 65 74 29 3b 0a 20 20 64 69 73 70   bReset);.  disp
107b0 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67  layStatLine(pArg
107c0 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 4f 75 74  , "Number of Out
107d0 73 74 61 6e 64 69 6e 67 20 41 6c 6c 6f 63 61 74  standing Allocat
107e0 69 6f 6e 73 3a 22 2c 0a 20 20 20 20 20 22 25 6c  ions:",.     "%l
107f0 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 22 2c 20  ld (max %lld)", 
10800 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 41  SQLITE_STATUS_MA
10810 4c 4c 4f 43 5f 43 4f 55 4e 54 2c 20 62 52 65 73  LLOC_COUNT, bRes
10820 65 74 29 3b 0a 20 20 69 66 28 20 70 41 72 67 2d  et);.  if( pArg-
10830 3e 73 68 65 6c 6c 46 6c 67 73 20 26 20 53 48 46  >shellFlgs & SHF
10840 4c 47 5f 50 61 67 65 63 61 63 68 65 20 29 7b 0a  LG_Pagecache ){.
10850 20 20 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c      displayStatL
10860 69 6e 65 28 70 41 72 67 2c 20 22 4e 75 6d 62 65  ine(pArg, "Numbe
10870 72 20 6f 66 20 50 63 61 63 68 65 20 50 61 67 65  r of Pcache Page
10880 73 20 55 73 65 64 3a 22 2c 0a 20 20 20 20 20 20  s Used:",.      
10890 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64   "%lld (max %lld
108a0 29 20 70 61 67 65 73 22 2c 20 53 51 4c 49 54 45  ) pages", SQLITE
108b0 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41 43 48  _STATUS_PAGECACH
108c0 45 5f 55 53 45 44 2c 20 62 52 65 73 65 74 29 3b  E_USED, bReset);
108d0 0a 20 20 7d 0a 20 20 64 69 73 70 6c 61 79 53 74  .  }.  displaySt
108e0 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4e 75  atLine(pArg, "Nu
108f0 6d 62 65 72 20 6f 66 20 50 63 61 63 68 65 20 4f  mber of Pcache O
10900 76 65 72 66 6c 6f 77 20 42 79 74 65 73 3a 22 2c  verflow Bytes:",
10910 0a 20 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78  .     "%lld (max
10920 20 25 6c 6c 64 29 20 62 79 74 65 73 22 2c 20 53   %lld) bytes", S
10930 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47  QLITE_STATUS_PAG
10940 45 43 41 43 48 45 5f 4f 56 45 52 46 4c 4f 57 2c  ECACHE_OVERFLOW,
10950 20 62 52 65 73 65 74 29 3b 0a 20 20 64 69 73 70   bReset);.  disp
10960 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67  layStatLine(pArg
10970 2c 20 22 4c 61 72 67 65 73 74 20 41 6c 6c 6f 63  , "Largest Alloc
10980 61 74 69 6f 6e 3a 22 2c 0a 20 20 20 20 20 22 25  ation:",.     "%
10990 6c 6c 64 20 62 79 74 65 73 22 2c 20 53 51 4c 49  lld bytes", SQLI
109a0 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f 43  TE_STATUS_MALLOC
109b0 5f 53 49 5a 45 2c 20 62 52 65 73 65 74 29 3b 0a  _SIZE, bReset);.
109c0 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e    displayStatLin
109d0 65 28 70 41 72 67 2c 20 22 4c 61 72 67 65 73 74  e(pArg, "Largest
109e0 20 50 63 61 63 68 65 20 41 6c 6c 6f 63 61 74 69   Pcache Allocati
109f0 6f 6e 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c 64  on:",.     "%lld
10a00 20 62 79 74 65 73 22 2c 20 53 51 4c 49 54 45 5f   bytes", SQLITE_
10a10 53 54 41 54 55 53 5f 50 41 47 45 43 41 43 48 45  STATUS_PAGECACHE
10a20 5f 53 49 5a 45 2c 20 62 52 65 73 65 74 29 3b 0a  _SIZE, bReset);.
10a30 23 69 66 64 65 66 20 59 59 54 52 41 43 4b 4d 41  #ifdef YYTRACKMA
10a40 58 53 54 41 43 4b 44 45 50 54 48 0a 20 20 64 69  XSTACKDEPTH.  di
10a50 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41  splayStatLine(pA
10a60 72 67 2c 20 22 44 65 65 70 65 73 74 20 50 61 72  rg, "Deepest Par
10a70 73 65 72 20 53 74 61 63 6b 3a 22 2c 0a 20 20 20  ser Stack:",.   
10a80 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c    "%lld (max %ll
10a90 64 29 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  d)", SQLITE_STAT
10aa0 55 53 5f 50 41 52 53 45 52 5f 53 54 41 43 4b 2c  US_PARSER_STACK,
10ab0 20 62 52 65 73 65 74 29 3b 0a 23 65 6e 64 69 66   bReset);.#endif
10ac0 0a 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20 20  ..  if( db ){.  
10ad0 20 20 69 66 28 20 70 41 72 67 2d 3e 73 68 65 6c    if( pArg->shel
10ae0 6c 46 6c 67 73 20 26 20 53 48 46 4c 47 5f 4c 6f  lFlgs & SHFLG_Lo
10af0 6f 6b 61 73 69 64 65 20 29 7b 0a 20 20 20 20 20  okaside ){.     
10b00 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
10b10 20 2d 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   -1;.      sqlit
10b20 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c  e3_db_status(db,
10b30 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
10b40 5f 4c 4f 4f 4b 41 53 49 44 45 5f 55 53 45 44 2c  _LOOKASIDE_USED,
10b50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
10b60 20 20 20 20 20 20 20 20 20 26 69 43 75 72 2c 20           &iCur, 
10b70 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29  &iHiwtr, bReset)
10b80 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  ;.      raw_prin
10b90 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 0a 20 20  tf(pArg->out,.  
10ba0 20 20 20 20 20 20 20 20 20 20 20 20 22 4c 6f 6f              "Loo
10bb0 6b 61 73 69 64 65 20 53 6c 6f 74 73 20 55 73 65  kaside Slots Use
10bc0 64 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d:              
10bd0 20 20 25 64 20 28 6d 61 78 20 25 64 29 5c 6e 22    %d (max %d)\n"
10be0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10bf0 69 43 75 72 2c 20 69 48 69 77 74 72 29 3b 0a 20  iCur, iHiwtr);. 
10c00 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f       sqlite3_db_
10c10 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54  status(db, SQLIT
10c20 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41  E_DBSTATUS_LOOKA
10c30 53 49 44 45 5f 48 49 54 2c 0a 20 20 20 20 20 20  SIDE_HIT,.      
10c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c50 20 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72    &iCur, &iHiwtr
10c60 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 20  , bReset);.     
10c70 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
10c80 2d 3e 6f 75 74 2c 20 22 53 75 63 63 65 73 73 66  ->out, "Successf
10c90 75 6c 20 6c 6f 6f 6b 61 73 69 64 65 20 61 74 74  ul lookaside att
10ca0 65 6d 70 74 73 3a 20 20 20 20 20 20 20 25 64 5c  empts:       %d\
10cb0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
10cc0 20 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20 20    iHiwtr);.     
10cd0 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74   sqlite3_db_stat
10ce0 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  us(db, SQLITE_DB
10cf0 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45  STATUS_LOOKASIDE
10d00 5f 4d 49 53 53 5f 53 49 5a 45 2c 0a 20 20 20 20  _MISS_SIZE,.    
10d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d20 20 20 20 20 26 69 43 75 72 2c 20 26 69 48 69 77      &iCur, &iHiw
10d30 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  tr, bReset);.   
10d40 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
10d50 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 6b 61 73  rg->out, "Lookas
10d60 69 64 65 20 66 61 69 6c 75 72 65 73 20 64 75 65  ide failures due
10d70 20 74 6f 20 73 69 7a 65 3a 20 20 20 20 20 20 25   to size:      %
10d80 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
10d90 20 20 20 20 69 48 69 77 74 72 29 3b 0a 20 20 20      iHiwtr);.   
10da0 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74     sqlite3_db_st
10db0 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f  atus(db, SQLITE_
10dc0 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49  DBSTATUS_LOOKASI
10dd0 44 45 5f 4d 49 53 53 5f 46 55 4c 4c 2c 0a 20 20  DE_MISS_FULL,.  
10de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10df0 20 20 20 20 20 20 26 69 43 75 72 2c 20 26 69 48        &iCur, &iH
10e00 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20  iwtr, bReset);. 
10e10 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
10e20 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 6b  pArg->out, "Look
10e30 61 73 69 64 65 20 66 61 69 6c 75 72 65 73 20 64  aside failures d
10e40 75 65 20 74 6f 20 4f 4f 4d 3a 20 20 20 20 20 20  ue to OOM:      
10e50 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %d\n",.        
10e60 20 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a 20        iHiwtr);. 
10e70 20 20 20 7d 0a 20 20 20 20 69 48 69 77 74 72 20     }.    iHiwtr 
10e80 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20  = iCur = -1;.   
10e90 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74   sqlite3_db_stat
10ea0 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  us(db, SQLITE_DB
10eb0 53 54 41 54 55 53 5f 43 41 43 48 45 5f 55 53 45  STATUS_CACHE_USE
10ec0 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74  D, &iCur, &iHiwt
10ed0 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20  r, bReset);.    
10ee0 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
10ef0 3e 6f 75 74 2c 20 22 50 61 67 65 72 20 48 65 61  >out, "Pager Hea
10f00 70 20 55 73 61 67 65 3a 20 20 20 20 20 20 20 20  p Usage:        
10f10 20 20 20 20 20 20 20 20 20 20 20 20 25 64 20 62              %d b
10f20 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ytes\n",.       
10f30 20 20 20 20 20 69 43 75 72 29 3b 0a 20 20 20 20       iCur);.    
10f40 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20  iHiwtr = iCur = 
10f50 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  -1;.    sqlite3_
10f60 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
10f70 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41  LITE_DBSTATUS_CA
10f80 43 48 45 5f 48 49 54 2c 20 26 69 43 75 72 2c 20  CHE_HIT, &iCur, 
10f90 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20 20  &iHiwtr, 1);.   
10fa0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
10fb0 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61 63  ->out, "Page cac
10fc0 68 65 20 68 69 74 73 3a 20 20 20 20 20 20 20 20  he hits:        
10fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c               %d\
10fe0 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69  n", iCur);.    i
10ff0 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d  Hiwtr = iCur = -
11000 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  1;.    sqlite3_d
11010 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c  b_status(db, SQL
11020 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43  ITE_DBSTATUS_CAC
11030 48 45 5f 4d 49 53 53 2c 20 26 69 43 75 72 2c 20  HE_MISS, &iCur, 
11040 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20 20  &iHiwtr, 1);.   
11050 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
11060 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61 63  ->out, "Page cac
11070 68 65 20 6d 69 73 73 65 73 3a 20 20 20 20 20 20  he misses:      
11080 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c               %d\
11090 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69  n", iCur);.    i
110a0 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d  Hiwtr = iCur = -
110b0 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64  1;.    sqlite3_d
110c0 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c  b_status(db, SQL
110d0 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43  ITE_DBSTATUS_CAC
110e0 48 45 5f 57 52 49 54 45 2c 20 26 69 43 75 72 2c  HE_WRITE, &iCur,
110f0 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20   &iHiwtr, 1);.  
11100 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
11110 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61  g->out, "Page ca
11120 63 68 65 20 77 72 69 74 65 73 3a 20 20 20 20 20  che writes:     
11130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
11140 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20  \n", iCur);.    
11150 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20  iHiwtr = iCur = 
11160 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  -1;.    sqlite3_
11170 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
11180 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41  LITE_DBSTATUS_CA
11190 43 48 45 5f 53 50 49 4c 4c 2c 20 26 69 43 75 72  CHE_SPILL, &iCur
111a0 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20  , &iHiwtr, 1);. 
111b0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
111c0 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63  rg->out, "Page c
111d0 61 63 68 65 20 73 70 69 6c 6c 73 3a 20 20 20 20  ache spills:    
111e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
111f0 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20  d\n", iCur);.   
11200 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
11210 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
11220 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53  _db_status(db, S
11230 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 53  QLITE_DBSTATUS_S
11240 43 48 45 4d 41 5f 55 53 45 44 2c 20 26 69 43 75  CHEMA_USED, &iCu
11250 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73  r, &iHiwtr, bRes
11260 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69  et);.    raw_pri
11270 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
11280 53 63 68 65 6d 61 20 48 65 61 70 20 55 73 61 67  Schema Heap Usag
11290 65 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e:              
112a0 20 20 20 20 20 25 64 20 62 79 74 65 73 5c 6e 22       %d bytes\n"
112b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 43  ,.            iC
112c0 75 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72 20  ur);.    iHiwtr 
112d0 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20  = iCur = -1;.   
112e0 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74   sqlite3_db_stat
112f0 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  us(db, SQLITE_DB
11300 53 54 41 54 55 53 5f 53 54 4d 54 5f 55 53 45 44  STATUS_STMT_USED
11310 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72  , &iCur, &iHiwtr
11320 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72  , bReset);.    r
11330 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
11340 6f 75 74 2c 20 22 53 74 61 74 65 6d 65 6e 74 20  out, "Statement 
11350 48 65 61 70 2f 4c 6f 6f 6b 61 73 69 64 65 20 55  Heap/Lookaside U
11360 73 61 67 65 3a 20 20 20 20 20 20 25 64 20 62 79  sage:      %d by
11370 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  tes\n",.        
11380 20 20 20 20 69 43 75 72 29 3b 0a 20 20 7d 0a 0a      iCur);.  }..
11390 20 20 69 66 28 20 70 41 72 67 2d 3e 70 53 74 6d    if( pArg->pStm
113a0 74 20 29 7b 0a 20 20 20 20 69 43 75 72 20 3d 20  t ){.    iCur = 
113b0 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
113c0 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c  tus(pArg->pStmt,
113d0 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
113e0 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50  US_FULLSCAN_STEP
113f0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
11400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11410 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61   bReset);.    ra
11420 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
11430 75 74 2c 20 22 46 75 6c 6c 73 63 61 6e 20 53 74  ut, "Fullscan St
11440 65 70 73 3a 20 20 20 20 20 20 20 20 20 20 20 20  eps:            
11450 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c            %d\n",
11460 20 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72   iCur);.    iCur
11470 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f   = sqlite3_stmt_
11480 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74  status(pArg->pSt
11490 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  mt, SQLITE_STMTS
114a0 54 41 54 55 53 5f 53 4f 52 54 2c 20 62 52 65 73  TATUS_SORT, bRes
114b0 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69  et);.    raw_pri
114c0 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
114d0 53 6f 72 74 20 4f 70 65 72 61 74 69 6f 6e 73 3a  Sort Operations:
114e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
114f0 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72       %d\n", iCur
11500 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71  );.    iCur = sq
11510 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
11520 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53  s(pArg->pStmt, S
11530 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
11540 5f 41 55 54 4f 49 4e 44 45 58 2c 62 52 65 73 65  _AUTOINDEX,bRese
11550 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  t);.    raw_prin
11560 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 41  tf(pArg->out, "A
11570 75 74 6f 69 6e 64 65 78 20 49 6e 73 65 72 74 73  utoindex Inserts
11580 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
11590 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29      %d\n", iCur)
115a0 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c  ;.    iCur = sql
115b0 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73  ite3_stmt_status
115c0 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51  (pArg->pStmt, SQ
115d0 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
115e0 56 4d 5f 53 54 45 50 2c 20 62 52 65 73 65 74 29  VM_STEP, bReset)
115f0 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
11600 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 56 69 72  (pArg->out, "Vir
11610 74 75 61 6c 20 4d 61 63 68 69 6e 65 20 53 74 65  tual Machine Ste
11620 70 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ps:             
11630 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a    %d\n", iCur);.
11640 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74      iCur = sqlit
11650 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70  e3_stmt_status(p
11660 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49  Arg->pStmt, SQLI
11670 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 52 45  TE_STMTSTATUS_RE
11680 50 52 45 50 41 52 45 2c 20 62 52 65 73 65 74 29  PREPARE, bReset)
11690 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
116a0 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 52 65 70  (pArg->out, "Rep
116b0 72 65 70 61 72 65 20 6f 70 65 72 61 74 69 6f 6e  repare operation
116c0 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s:              
116d0 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a    %d\n", iCur);.
116e0 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74      iCur = sqlit
116f0 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70  e3_stmt_status(p
11700 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49  Arg->pStmt, SQLI
11710 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 52 55  TE_STMTSTATUS_RU
11720 4e 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20  N, bReset);.    
11730 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
11740 3e 6f 75 74 2c 20 22 4e 75 6d 62 65 72 20 6f 66  >out, "Number of
11750 20 74 69 6d 65 73 20 72 75 6e 3a 20 20 20 20 20   times run:     
11760 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e              %d\n
11770 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 43  ", iCur);.    iC
11780 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d  ur = sqlite3_stm
11790 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70  t_status(pArg->p
117a0 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d  Stmt, SQLITE_STM
117b0 54 53 54 41 54 55 53 5f 4d 45 4d 55 53 45 44 2c  TSTATUS_MEMUSED,
117c0 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61   bReset);.    ra
117d0 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
117e0 75 74 2c 20 22 4d 65 6d 6f 72 79 20 75 73 65 64  ut, "Memory used
117f0 20 62 79 20 70 72 65 70 61 72 65 64 20 73 74 6d   by prepared stm
11800 74 3a 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c  t:        %d\n",
11810 20 69 43 75 72 29 3b 0a 20 20 7d 0a 0a 23 69 66   iCur);.  }..#if
11820 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 20 20  def __linux__.  
11830 64 69 73 70 6c 61 79 4c 69 6e 75 78 49 6f 53 74  displayLinuxIoSt
11840 61 74 73 28 70 41 72 67 2d 3e 6f 75 74 29 3b 0a  ats(pArg->out);.
11850 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f 20  #endif..  /* Do 
11860 6e 6f 74 20 72 65 6d 6f 76 65 20 74 68 69 73 20  not remove this 
11870 6d 61 63 68 69 6e 65 20 72 65 61 64 61 62 6c 65  machine readable
11880 20 63 6f 6d 6d 65 6e 74 3a 20 65 78 74 72 61 2d   comment: extra-
11890 73 74 61 74 73 2d 6f 75 74 70 75 74 2d 68 65 72  stats-output-her
118a0 65 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20 30  e */..  return 0
118b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c  ;.}../*.** Displ
118c0 61 79 20 73 63 61 6e 20 73 74 61 74 73 2e 0a 2a  ay scan stats..*
118d0 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69  /.static void di
118e0 73 70 6c 61 79 5f 73 63 61 6e 73 74 61 74 73 28  splay_scanstats(
118f0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
11900 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11910 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 74     /* Database t
11920 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 68 65  o query */.  She
11930 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 20 20 20  llState *pArg   
11940 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11950 50 6f 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c  Pointer to Shell
11960 53 74 61 74 65 20 2a 2f 0a 29 7b 0a 23 69 66 6e  State */.){.#ifn
11970 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
11980 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55  E_STMT_SCANSTATU
11990 53 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  S.  UNUSED_PARAM
119a0 45 54 45 52 28 64 62 29 3b 0a 20 20 55 4e 55 53  ETER(db);.  UNUS
119b0 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 41 72  ED_PARAMETER(pAr
119c0 67 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74 20  g);.#else.  int 
119d0 69 2c 20 6b 2c 20 6e 2c 20 6d 78 3b 0a 20 20 72  i, k, n, mx;.  r
119e0 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
119f0 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73  out, "-------- s
11a00 63 61 6e 73 74 61 74 73 20 2d 2d 2d 2d 2d 2d 2d  canstats -------
11a10 2d 5c 6e 22 29 3b 0a 20 20 6d 78 20 3d 20 30 3b  -\n");.  mx = 0;
11a20 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 3d 6d  .  for(k=0; k<=m
11a30 78 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 64 6f 75  x; k++){.    dou
11a40 62 6c 65 20 72 45 73 74 4c 6f 6f 70 20 3d 20 31  ble rEstLoop = 1
11a50 2e 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e 3d  .0;.    for(i=n=
11a60 30 3b 20 31 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  0; 1; i++){.    
11a70 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
11a80 70 20 3d 20 70 41 72 67 2d 3e 70 53 74 6d 74 3b  p = pArg->pStmt;
11a90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 69  .      sqlite3_i
11aa0 6e 74 36 34 20 6e 4c 6f 6f 70 2c 20 6e 56 69 73  nt64 nLoop, nVis
11ab0 69 74 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c 65  it;.      double
11ac0 20 72 45 73 74 3b 0a 20 20 20 20 20 20 69 6e 74   rEst;.      int
11ad0 20 69 53 69 64 3b 0a 20 20 20 20 20 20 63 6f 6e   iSid;.      con
11ae0 73 74 20 63 68 61 72 20 2a 7a 45 78 70 6c 61 69  st char *zExplai
11af0 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  n;.      if( sql
11b00 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74  ite3_stmt_scanst
11b10 61 74 75 73 28 70 2c 20 69 2c 20 53 51 4c 49 54  atus(p, i, SQLIT
11b20 45 5f 53 43 41 4e 53 54 41 54 5f 4e 4c 4f 4f 50  E_SCANSTAT_NLOOP
11b30 2c 20 28 76 6f 69 64 2a 29 26 6e 4c 6f 6f 70 29  , (void*)&nLoop)
11b40 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61   ){.        brea
11b50 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
11b60 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63   sqlite3_stmt_sc
11b70 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53  anstatus(p, i, S
11b80 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 53  QLITE_SCANSTAT_S
11b90 45 4c 45 43 54 49 44 2c 20 28 76 6f 69 64 2a 29  ELECTID, (void*)
11ba0 26 69 53 69 64 29 3b 0a 20 20 20 20 20 20 69 66  &iSid);.      if
11bb0 28 20 69 53 69 64 3e 6d 78 20 29 20 6d 78 20 3d  ( iSid>mx ) mx =
11bc0 20 69 53 69 64 3b 0a 20 20 20 20 20 20 69 66 28   iSid;.      if(
11bd0 20 69 53 69 64 21 3d 6b 20 29 20 63 6f 6e 74 69   iSid!=k ) conti
11be0 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  nue;.      if( n
11bf0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
11c00 45 73 74 4c 6f 6f 70 20 3d 20 28 64 6f 75 62 6c  EstLoop = (doubl
11c10 65 29 6e 4c 6f 6f 70 3b 0a 20 20 20 20 20 20 20  e)nLoop;.       
11c20 20 69 66 28 20 6b 3e 30 20 29 20 72 61 77 5f 70   if( k>0 ) raw_p
11c30 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
11c40 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73 75 62 71 75   "-------- subqu
11c50 65 72 79 20 25 64 20 2d 2d 2d 2d 2d 2d 2d 5c 6e  ery %d -------\n
11c60 22 2c 20 6b 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ", k);.      }. 
11c70 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20       n++;.      
11c80 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
11c90 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51  nstatus(p, i, SQ
11ca0 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e 56  LITE_SCANSTAT_NV
11cb0 49 53 49 54 2c 20 28 76 6f 69 64 2a 29 26 6e 56  ISIT, (void*)&nV
11cc0 69 73 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  isit);.      sql
11cd0 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74  ite3_stmt_scanst
11ce0 61 74 75 73 28 70 2c 20 69 2c 20 53 51 4c 49 54  atus(p, i, SQLIT
11cf0 45 5f 53 43 41 4e 53 54 41 54 5f 45 53 54 2c 20  E_SCANSTAT_EST, 
11d00 28 76 6f 69 64 2a 29 26 72 45 73 74 29 3b 0a 20  (void*)&rEst);. 
11d10 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
11d20 74 5f 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20  t_scanstatus(p, 
11d30 69 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54  i, SQLITE_SCANST
11d40 41 54 5f 45 58 50 4c 41 49 4e 2c 20 28 76 6f 69  AT_EXPLAIN, (voi
11d50 64 2a 29 26 7a 45 78 70 6c 61 69 6e 29 3b 0a 20  d*)&zExplain);. 
11d60 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
11d70 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f  (pArg->out, "Loo
11d80 70 20 25 32 64 3a 20 25 73 5c 6e 22 2c 20 6e 2c  p %2d: %s\n", n,
11d90 20 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20   zExplain);.    
11da0 20 20 72 45 73 74 4c 6f 6f 70 20 2a 3d 20 72 45    rEstLoop *= rE
11db0 73 74 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  st;.      raw_pr
11dc0 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 0a  intf(pArg->out,.
11dd0 20 20 20 20 20 20 20 20 20 20 22 20 20 20 20 20            "     
11de0 20 20 20 20 6e 4c 6f 6f 70 3d 25 2d 38 6c 6c 64      nLoop=%-8lld
11df0 20 6e 52 6f 77 3d 25 2d 38 6c 6c 64 20 65 73 74   nRow=%-8lld est
11e00 52 6f 77 3d 25 2d 38 6c 6c 64 20 65 73 74 52 6f  Row=%-8lld estRo
11e10 77 2f 4c 6f 6f 70 3d 25 2d 38 67 5c 6e 22 2c 0a  w/Loop=%-8g\n",.
11e20 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f 70 2c            nLoop,
11e30 20 6e 56 69 73 69 74 2c 20 28 73 71 6c 69 74 65   nVisit, (sqlite
11e40 33 5f 69 6e 74 36 34 29 28 72 45 73 74 4c 6f 6f  3_int64)(rEstLoo
11e50 70 2b 30 2e 35 29 2c 20 72 45 73 74 0a 20 20 20  p+0.5), rEst.   
11e60 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a     );.    }.  }.
11e70 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
11e80 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d  g->out, "-------
11e90 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11ea0 2d 2d 2d 2d 5c 6e 22 29 3b 0a 23 65 6e 64 69 66  ----\n");.#endif
11eb0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d 65  .}../*.** Parame
11ec0 74 65 72 20 61 7a 41 72 72 61 79 20 70 6f 69 6e  ter azArray poin
11ed0 74 73 20 74 6f 20 61 20 7a 65 72 6f 2d 74 65 72  ts to a zero-ter
11ee0 6d 69 6e 61 74 65 64 20 61 72 72 61 79 20 6f 66  minated array of
11ef0 20 73 74 72 69 6e 67 73 2e 20 7a 53 74 72 0a 2a   strings. zStr.*
11f00 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 69  * points to a si
11f10 6e 67 6c 65 20 6e 75 6c 2d 74 65 72 6d 69 6e 61  ngle nul-termina
11f20 74 65 64 20 73 74 72 69 6e 67 2e 20 52 65 74 75  ted string. Retu
11f30 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20 7a  rn non-zero if z
11f40 53 74 72 0a 2a 2a 20 69 73 20 65 71 75 61 6c 2c  Str.** is equal,
11f50 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 73 74   according to st
11f60 72 63 6d 70 28 29 2c 20 74 6f 20 61 6e 79 20 6f  rcmp(), to any o
11f70 66 20 74 68 65 20 73 74 72 69 6e 67 73 20 69 6e  f the strings in
11f80 20 74 68 65 20 61 72 72 61 79 2e 0a 2a 2a 20 4f   the array..** O
11f90 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72 6e  therwise, return
11fa0 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69 63   zero..*/.static
11fb0 20 69 6e 74 20 73 74 72 5f 69 6e 5f 61 72 72 61   int str_in_arra
11fc0 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53  y(const char *zS
11fd0 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tr, const char *
11fe0 2a 61 7a 41 72 72 61 79 29 7b 0a 20 20 69 6e 74  *azArray){.  int
11ff0 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 61   i;.  for(i=0; a
12000 7a 41 72 72 61 79 5b 69 5d 3b 20 69 2b 2b 29 7b  zArray[i]; i++){
12010 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72 63  .    if( 0==strc
12020 6d 70 28 7a 53 74 72 2c 20 61 7a 41 72 72 61 79  mp(zStr, azArray
12030 5b 69 5d 29 20 29 20 72 65 74 75 72 6e 20 31 3b  [i]) ) return 1;
12040 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
12050 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 6f 6d  .}../*.** If com
12060 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74 20  piled statement 
12070 70 53 71 6c 20 61 70 70 65 61 72 73 20 74 6f 20  pSql appears to 
12080 62 65 20 61 6e 20 45 58 50 4c 41 49 4e 20 73 74  be an EXPLAIN st
12090 61 74 65 6d 65 6e 74 2c 20 61 6c 6c 6f 63 61 74  atement, allocat
120a0 65 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61 74  e.** and populat
120b0 65 20 74 68 65 20 53 68 65 6c 6c 53 74 61 74 65  e the ShellState
120c0 2e 61 69 49 6e 64 65 6e 74 5b 5d 20 61 72 72 61  .aiIndent[] arra
120d0 79 20 77 69 74 68 20 74 68 65 20 6e 75 6d 62 65  y with the numbe
120e0 72 20 6f 66 0a 2a 2a 20 73 70 61 63 65 73 20 65  r of.** spaces e
120f0 61 63 68 20 6f 70 63 6f 64 65 20 73 68 6f 75 6c  ach opcode shoul
12100 64 20 62 65 20 69 6e 64 65 6e 74 65 64 20 62 65  d be indented be
12110 66 6f 72 65 20 69 74 20 69 73 20 6f 75 74 70 75  fore it is outpu
12120 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e 64  t..**.** The ind
12130 65 6e 74 69 6e 67 20 72 75 6c 65 73 20 61 72 65  enting rules are
12140 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 6f  :.**.**     * Fo
12150 72 20 65 61 63 68 20 22 4e 65 78 74 22 2c 20 22  r each "Next", "
12160 50 72 65 76 22 2c 20 22 56 4e 65 78 74 22 20 6f  Prev", "VNext" o
12170 72 20 22 56 50 72 65 76 22 20 69 6e 73 74 72 75  r "VPrev" instru
12180 63 74 69 6f 6e 2c 20 69 6e 64 65 6e 74 0a 2a 2a  ction, indent.**
12190 20 20 20 20 20 20 20 61 6c 6c 20 6f 70 63 6f 64         all opcod
121a0 65 73 20 74 68 61 74 20 6f 63 63 75 72 20 62 65  es that occur be
121b0 74 77 65 65 6e 20 74 68 65 20 70 32 20 6a 75 6d  tween the p2 jum
121c0 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 61 6e  p destination an
121d0 64 20 74 68 65 20 6f 70 63 6f 64 65 0a 2a 2a 20  d the opcode.** 
121e0 20 20 20 20 20 20 69 74 73 65 6c 66 20 62 79 20        itself by 
121f0 32 20 73 70 61 63 65 73 2e 0a 2a 2a 0a 2a 2a 20  2 spaces..**.** 
12200 20 20 20 20 2a 20 46 6f 72 20 65 61 63 68 20 22      * For each "
12210 47 6f 74 6f 22 2c 20 69 66 20 74 68 65 20 6a 75  Goto", if the ju
12220 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 69  mp destination i
12230 73 20 65 61 72 6c 69 65 72 20 69 6e 20 74 68 65  s earlier in the
12240 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 20 20 20 20   program.**     
12250 20 20 61 6e 64 20 65 6e 64 73 20 6f 6e 20 6f 6e    and ends on on
12260 65 20 6f 66 3a 0a 2a 2a 20 20 20 20 20 20 20 20  e of:.**        
12270 20 20 59 69 65 6c 64 20 20 53 65 65 6b 47 74 20    Yield  SeekGt 
12280 20 53 65 65 6b 4c 74 20 20 52 6f 77 53 65 74 52   SeekLt  RowSetR
12290 65 61 64 20 20 52 65 77 69 6e 64 0a 2a 2a 20 20  ead  Rewind.**  
122a0 20 20 20 20 20 6f 72 20 69 66 20 74 68 65 20 50       or if the P
122b0 31 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 6f  1 parameter is o
122c0 6e 65 20 69 6e 73 74 65 61 64 20 6f 66 20 7a 65  ne instead of ze
122d0 72 6f 2c 0a 2a 2a 20 20 20 20 20 20 20 74 68 65  ro,.**       the
122e0 6e 20 69 6e 64 65 6e 74 20 61 6c 6c 20 6f 70 63  n indent all opc
122f0 6f 64 65 73 20 62 65 74 77 65 65 6e 20 74 68 65  odes between the
12300 20 65 61 72 6c 69 65 72 20 69 6e 73 74 72 75 63   earlier instruc
12310 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 61 6e  tion.**       an
12320 64 20 22 47 6f 74 6f 22 20 62 79 20 32 20 73 70  d "Goto" by 2 sp
12330 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  aces..*/.static 
12340 76 6f 69 64 20 65 78 70 6c 61 69 6e 5f 64 61 74  void explain_dat
12350 61 5f 70 72 65 70 61 72 65 28 53 68 65 6c 6c 53  a_prepare(ShellS
12360 74 61 74 65 20 2a 70 2c 20 73 71 6c 69 74 65 33  tate *p, sqlite3
12370 5f 73 74 6d 74 20 2a 70 53 71 6c 29 7b 0a 20 20  _stmt *pSql){.  
12380 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
12390 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
123a0 2f 2a 20 54 68 65 20 74 65 78 74 20 6f 66 20 74  /* The text of t
123b0 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
123c0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
123d0 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20 20   *z;            
123e0 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74 6f        /* Used to
123f0 20 63 68 65 63 6b 20 69 66 20 74 68 69 73 20 69   check if this i
12400 73 20 61 6e 20 45 58 50 4c 41 49 4e 20 2a 2f 0a  s an EXPLAIN */.
12410 20 20 69 6e 74 20 2a 61 62 59 69 65 6c 64 20 3d    int *abYield =
12420 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
12430 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70 20    /* True if op 
12440 69 73 20 61 6e 20 4f 50 5f 59 69 65 6c 64 20 2a  is an OP_Yield *
12450 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d  /.  int nAlloc =
12460 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
12470 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65 64      /* Allocated
12480 20 73 69 7a 65 20 6f 66 20 70 2d 3e 61 69 49 6e   size of p->aiIn
12490 64 65 6e 74 5b 5d 2c 20 61 62 59 69 65 6c 64 20  dent[], abYield 
124a0 2a 2f 0a 20 20 69 6e 74 20 69 4f 70 3b 20 20 20  */.  int iOp;   
124b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124c0 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66       /* Index of
124d0 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e 20 70 2d   operation in p-
124e0 3e 61 69 49 6e 64 65 6e 74 5b 5d 20 2a 2f 0a 0a  >aiIndent[] */..
124f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a    const char *az
12500 4e 65 78 74 5b 5d 20 3d 20 7b 20 22 4e 65 78 74  Next[] = { "Next
12510 22 2c 20 22 50 72 65 76 22 2c 20 22 56 50 72 65  ", "Prev", "VPre
12520 76 22 2c 20 22 56 4e 65 78 74 22 2c 20 22 53 6f  v", "VNext", "So
12530 72 74 65 72 4e 65 78 74 22 2c 0a 20 20 20 20 20  rterNext",.     
12540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12550 20 20 20 20 20 20 22 4e 65 78 74 49 66 4f 70 65        "NextIfOpe
12560 6e 22 2c 20 22 50 72 65 76 49 66 4f 70 65 6e 22  n", "PrevIfOpen"
12570 2c 20 30 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63  , 0 };.  const c
12580 68 61 72 20 2a 61 7a 59 69 65 6c 64 5b 5d 20 3d  har *azYield[] =
12590 20 7b 20 22 59 69 65 6c 64 22 2c 20 22 53 65 65   { "Yield", "See
125a0 6b 4c 54 22 2c 20 22 53 65 65 6b 47 54 22 2c 20  kLT", "SeekGT", 
125b0 22 52 6f 77 53 65 74 52 65 61 64 22 2c 0a 20 20  "RowSetRead",.  
125c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
125d0 20 20 20 20 20 20 20 20 20 20 22 52 65 77 69 6e            "Rewin
125e0 64 22 2c 20 30 20 7d 3b 0a 20 20 63 6f 6e 73 74  d", 0 };.  const
125f0 20 63 68 61 72 20 2a 61 7a 47 6f 74 6f 5b 5d 20   char *azGoto[] 
12600 3d 20 7b 20 22 47 6f 74 6f 22 2c 20 30 20 7d 3b  = { "Goto", 0 };
12610 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66 69  ..  /* Try to fi
12620 67 75 72 65 20 6f 75 74 20 69 66 20 74 68 69 73  gure out if this
12630 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 45 58   is really an EX
12640 50 4c 41 49 4e 20 73 74 61 74 65 6d 65 6e 74 2e  PLAIN statement.
12650 20 49 66 20 74 68 69 73 0a 20 20 2a 2a 20 63 61   If this.  ** ca
12660 6e 6e 6f 74 20 62 65 20 76 65 72 69 66 69 65 64  nnot be verified
12670 2c 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e 20  , return early. 
12680 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74 65   */.  if( sqlite
12690 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
126a0 53 71 6c 29 21 3d 38 20 29 7b 0a 20 20 20 20 70  Sql)!=8 ){.    p
126b0 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64  ->cMode = p->mod
126c0 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  e;.    return;. 
126d0 20 7d 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69   }.  zSql = sqli
126e0 74 65 33 5f 73 71 6c 28 70 53 71 6c 29 3b 0a 20  te3_sql(pSql);. 
126f0 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20 72   if( zSql==0 ) r
12700 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 7a 3d 7a  eturn;.  for(z=z
12710 53 71 6c 3b 20 2a 7a 3d 3d 27 20 27 20 7c 7c 20  Sql; *z==' ' || 
12720 2a 7a 3d 3d 27 5c 74 27 20 7c 7c 20 2a 7a 3d 3d  *z=='\t' || *z==
12730 27 5c 6e 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 66 27  '\n' || *z=='\f'
12740 20 7c 7c 20 2a 7a 3d 3d 27 5c 72 27 3b 20 7a 2b   || *z=='\r'; z+
12750 2b 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  +);.  if( sqlite
12760 33 5f 73 74 72 6e 69 63 6d 70 28 7a 2c 20 22 65  3_strnicmp(z, "e
12770 78 70 6c 61 69 6e 22 2c 20 37 29 20 29 7b 0a 20  xplain", 7) ){. 
12780 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d     p->cMode = p-
12790 3e 6d 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72  >mode;.    retur
127a0 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 4f  n;.  }..  for(iO
127b0 70 3d 30 3b 20 53 51 4c 49 54 45 5f 52 4f 57 3d  p=0; SQLITE_ROW=
127c0 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
127d0 71 6c 29 3b 20 69 4f 70 2b 2b 29 7b 0a 20 20 20  ql); iOp++){.   
127e0 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
127f0 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 5f  iAddr = sqlite3_
12800 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c  column_int(pSql,
12810 20 30 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63   0);.    const c
12820 68 61 72 20 2a 7a 4f 70 20 3d 20 28 63 6f 6e 73  har *zOp = (cons
12830 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
12840 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
12850 2c 20 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 53 65  , 1);..    /* Se
12860 74 20 70 32 20 74 6f 20 74 68 65 20 50 32 20 66  t p2 to the P2 f
12870 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72 72  ield of the curr
12880 65 6e 74 20 6f 70 63 6f 64 65 2e 20 54 68 65 6e  ent opcode. Then
12890 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74 0a  , assuming that.
128a0 20 20 20 20 2a 2a 20 70 32 20 69 73 20 61 6e 20      ** p2 is an 
128b0 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64 72  instruction addr
128c0 65 73 73 2c 20 73 65 74 20 76 61 72 69 61 62 6c  ess, set variabl
128d0 65 20 70 32 6f 70 20 74 6f 20 74 68 65 20 69 6e  e p2op to the in
128e0 64 65 78 20 6f 66 20 74 68 61 74 0a 20 20 20 20  dex of that.    
128f0 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69  ** instruction i
12900 6e 20 74 68 65 20 61 69 49 6e 64 65 6e 74 5b 5d  n the aiIndent[]
12910 20 61 72 72 61 79 2e 20 70 32 20 61 6e 64 20 70   array. p2 and p
12920 32 6f 70 20 6d 61 79 20 62 65 20 64 69 66 66 65  2op may be diffe
12930 72 65 6e 74 20 69 66 0a 20 20 20 20 2a 2a 20 74  rent if.    ** t
12940 68 65 20 63 75 72 72 65 6e 74 20 69 6e 73 74 72  he current instr
12950 75 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20 6f  uction is part o
12960 66 20 61 20 73 75 62 2d 70 72 6f 67 72 61 6d 20  f a sub-program 
12970 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 6e 0a  generated by an.
12980 20 20 20 20 2a 2a 20 53 51 4c 20 74 72 69 67 67      ** SQL trigg
12990 65 72 20 6f 72 20 66 6f 72 65 69 67 6e 20 6b 65  er or foreign ke
129a0 79 2e 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 70  y.  */.    int p
129b0 32 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  2 = sqlite3_colu
129c0 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 33 29 3b  mn_int(pSql, 3);
129d0 0a 20 20 20 20 69 6e 74 20 70 32 6f 70 20 3d 20  .    int p2op = 
129e0 28 70 32 20 2b 20 28 69 4f 70 2d 69 41 64 64 72  (p2 + (iOp-iAddr
129f0 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 72 6f 77  ));..    /* Grow
12a00 20 74 68 65 20 70 2d 3e 61 69 49 6e 64 65 6e 74   the p->aiIndent
12a10 20 61 72 72 61 79 20 61 73 20 72 65 71 75 69 72   array as requir
12a20 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 4f  ed */.    if( iO
12a30 70 3e 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20 20  p>=nAlloc ){.   
12a40 20 20 20 69 66 28 20 69 4f 70 3d 3d 30 20 29 7b     if( iOp==0 ){
12a50 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20 66  .        /* Do f
12a60 75 72 74 68 65 72 20 76 65 72 66 69 63 61 74 69  urther verficati
12a70 6f 6e 20 74 68 61 74 20 74 68 69 73 20 69 73 20  on that this is 
12a80 65 78 70 6c 61 69 6e 20 6f 75 74 70 75 74 2e 20  explain output. 
12a90 20 41 62 6f 72 74 20 69 66 0a 20 20 20 20 20 20   Abort if.      
12aa0 20 20 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20 2a    ** it is not *
12ab0 2f 0a 20 20 20 20 20 20 20 20 73 74 61 74 69 63  /.        static
12ac0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 65 78 70   const char *exp
12ad0 6c 61 69 6e 43 6f 6c 73 5b 5d 20 3d 20 7b 0a 20  lainCols[] = {. 
12ae0 20 20 20 20 20 20 20 20 20 20 22 61 64 64 72 22            "addr"
12af0 2c 20 22 6f 70 63 6f 64 65 22 2c 20 22 70 31 22  , "opcode", "p1"
12b00 2c 20 22 70 32 22 2c 20 22 70 33 22 2c 20 22 70  , "p2", "p3", "p
12b10 34 22 2c 20 22 70 35 22 2c 20 22 63 6f 6d 6d 65  4", "p5", "comme
12b20 6e 74 22 20 7d 3b 0a 20 20 20 20 20 20 20 20 69  nt" };.        i
12b30 6e 74 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20 66  nt jj;.        f
12b40 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 41 72 72 61  or(jj=0; jj<Arra
12b50 79 53 69 7a 65 28 65 78 70 6c 61 69 6e 43 6f 6c  ySize(explainCol
12b60 73 29 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20 20  s); jj++){.     
12b70 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
12b80 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
12b90 61 6d 65 28 70 53 71 6c 2c 6a 6a 29 2c 65 78 70  ame(pSql,jj),exp
12ba0 6c 61 69 6e 43 6f 6c 73 5b 6a 6a 5d 29 21 3d 30  lainCols[jj])!=0
12bb0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
12bc0 70 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f  p->cMode = p->mo
12bd0 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  de;.            
12be0 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53  sqlite3_reset(pS
12bf0 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ql);.           
12c00 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 20   return;.       
12c10 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
12c20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 41 6c       }.      nAl
12c30 6c 6f 63 20 2b 3d 20 31 30 30 3b 0a 20 20 20 20  loc += 100;.    
12c40 20 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20 3d 20    p->aiIndent = 
12c50 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72 65  (int*)sqlite3_re
12c60 61 6c 6c 6f 63 36 34 28 70 2d 3e 61 69 49 6e 64  alloc64(p->aiInd
12c70 65 6e 74 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65  ent, nAlloc*size
12c80 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 20 20  of(int));.      
12c90 61 62 59 69 65 6c 64 20 3d 20 28 69 6e 74 2a 29  abYield = (int*)
12ca0 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36  sqlite3_realloc6
12cb0 34 28 61 62 59 69 65 6c 64 2c 20 6e 41 6c 6c 6f  4(abYield, nAllo
12cc0 63 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a  c*sizeof(int));.
12cd0 20 20 20 20 7d 0a 20 20 20 20 61 62 59 69 65 6c      }.    abYiel
12ce0 64 5b 69 4f 70 5d 20 3d 20 73 74 72 5f 69 6e 5f  d[iOp] = str_in_
12cf0 61 72 72 61 79 28 7a 4f 70 2c 20 61 7a 59 69 65  array(zOp, azYie
12d00 6c 64 29 3b 0a 20 20 20 20 70 2d 3e 61 69 49 6e  ld);.    p->aiIn
12d10 64 65 6e 74 5b 69 4f 70 5d 20 3d 20 30 3b 0a 20  dent[iOp] = 0;. 
12d20 20 20 20 70 2d 3e 6e 49 6e 64 65 6e 74 20 3d 20     p->nIndent = 
12d30 69 4f 70 2b 31 3b 0a 0a 20 20 20 20 69 66 28 20  iOp+1;..    if( 
12d40 73 74 72 5f 69 6e 5f 61 72 72 61 79 28 7a 4f 70  str_in_array(zOp
12d50 2c 20 61 7a 4e 65 78 74 29 20 29 7b 0a 20 20 20  , azNext) ){.   
12d60 20 20 20 66 6f 72 28 69 3d 70 32 6f 70 3b 20 69     for(i=p2op; i
12d70 3c 69 4f 70 3b 20 69 2b 2b 29 20 70 2d 3e 61 69  <iOp; i++) p->ai
12d80 49 6e 64 65 6e 74 5b 69 5d 20 2b 3d 20 32 3b 0a  Indent[i] += 2;.
12d90 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 74      }.    if( st
12da0 72 5f 69 6e 5f 61 72 72 61 79 28 7a 4f 70 2c 20  r_in_array(zOp, 
12db0 61 7a 47 6f 74 6f 29 20 26 26 20 70 32 6f 70 3c  azGoto) && p2op<
12dc0 70 2d 3e 6e 49 6e 64 65 6e 74 0a 20 20 20 20 20  p->nIndent.     
12dd0 26 26 20 28 61 62 59 69 65 6c 64 5b 70 32 6f 70  && (abYield[p2op
12de0 5d 20 7c 7c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ] || sqlite3_col
12df0 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 32 29  umn_int(pSql, 2)
12e00 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 66  ).    ){.      f
12e10 6f 72 28 69 3d 70 32 6f 70 3b 20 69 3c 69 4f 70  or(i=p2op; i<iOp
12e20 3b 20 69 2b 2b 29 20 70 2d 3e 61 69 49 6e 64 65  ; i++) p->aiInde
12e30 6e 74 5b 69 5d 20 2b 3d 20 32 3b 0a 20 20 20 20  nt[i] += 2;.    
12e40 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 49 6e 64  }.  }..  p->iInd
12e50 65 6e 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ent = 0;.  sqlit
12e60 65 33 5f 66 72 65 65 28 61 62 59 69 65 6c 64 29  e3_free(abYield)
12e70 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65  ;.  sqlite3_rese
12e80 74 28 70 53 71 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  t(pSql);.}../*.*
12e90 2a 20 46 72 65 65 20 74 68 65 20 61 72 72 61 79  * Free the array
12ea0 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 65 78   allocated by ex
12eb0 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72 65 70 61  plain_data_prepa
12ec0 72 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  re()..*/.static 
12ed0 76 6f 69 64 20 65 78 70 6c 61 69 6e 5f 64 61 74  void explain_dat
12ee0 61 5f 64 65 6c 65 74 65 28 53 68 65 6c 6c 53 74  a_delete(ShellSt
12ef0 61 74 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69 74  ate *p){.  sqlit
12f00 65 33 5f 66 72 65 65 28 70 2d 3e 61 69 49 6e 64  e3_free(p->aiInd
12f10 65 6e 74 29 3b 0a 20 20 70 2d 3e 61 69 49 6e 64  ent);.  p->aiInd
12f20 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e 49  ent = 0;.  p->nI
12f30 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e  ndent = 0;.  p->
12f40 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 7d 0a 0a  iIndent = 0;.}..
12f50 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61 6e  /*.** Disable an
12f60 64 20 72 65 73 74 6f 72 65 20 2e 77 68 65 72 65  d restore .where
12f70 74 72 61 63 65 20 61 6e 64 20 2e 73 65 6c 65 63  trace and .selec
12f80 74 74 72 61 63 65 20 73 65 74 74 69 6e 67 73 2e  ttrace settings.
12f90 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
12fa0 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26  SQLITE_DEBUG) &&
12fb0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
12fc0 45 4e 41 42 4c 45 5f 53 45 4c 45 43 54 54 52 41  ENABLE_SELECTTRA
12fd0 43 45 29 0a 65 78 74 65 72 6e 20 69 6e 74 20 73  CE).extern int s
12fe0 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
12ff0 65 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73 61  e;.static int sa
13000 76 65 64 53 65 6c 65 63 74 54 72 61 63 65 3b 0a  vedSelectTrace;.
13010 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
13020 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
13030 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
13040 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52 45 54  TE_ENABLE_WHERET
13050 52 41 43 45 29 0a 65 78 74 65 72 6e 20 69 6e 74  RACE).extern int
13060 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
13070 63 65 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73  ce;.static int s
13080 61 76 65 64 57 68 65 72 65 54 72 61 63 65 3b 0a  avedWhereTrace;.
13090 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 76 6f  #endif.static vo
130a0 69 64 20 64 69 73 61 62 6c 65 5f 64 65 62 75 67  id disable_debug
130b0 5f 74 72 61 63 65 5f 6d 6f 64 65 73 28 76 6f 69  _trace_modes(voi
130c0 64 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  d){.#if defined(
130d0 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26  SQLITE_DEBUG) &&
130e0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
130f0 45 4e 41 42 4c 45 5f 53 45 4c 45 43 54 54 52 41  ENABLE_SELECTTRA
13100 43 45 29 0a 20 20 73 61 76 65 64 53 65 6c 65 63  CE).  savedSelec
13110 74 54 72 61 63 65 20 3d 20 73 71 6c 69 74 65 33  tTrace = sqlite3
13120 53 65 6c 65 63 74 54 72 61 63 65 3b 0a 20 20 73  SelectTrace;.  s
13130 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
13140 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23 69  e = 0;.#endif.#i
13150 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
13160 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69 6e  _DEBUG) && defin
13170 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
13180 5f 57 48 45 52 45 54 52 41 43 45 29 0a 20 20 73  _WHERETRACE).  s
13190 61 76 65 64 57 68 65 72 65 54 72 61 63 65 20 3d  avedWhereTrace =
131a0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
131b0 63 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 68 65  ce;.  sqlite3Whe
131c0 72 65 54 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e  reTrace = 0;.#en
131d0 64 69 66 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69  dif.}.static voi
131e0 64 20 72 65 73 74 6f 72 65 5f 64 65 62 75 67 5f  d restore_debug_
131f0 74 72 61 63 65 5f 6d 6f 64 65 73 28 76 6f 69 64  trace_modes(void
13200 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  ){.#if defined(S
13210 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20  QLITE_DEBUG) && 
13220 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
13230 4e 41 42 4c 45 5f 53 45 4c 45 43 54 54 52 41 43  NABLE_SELECTTRAC
13240 45 29 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  E).  sqlite3Sele
13250 63 74 54 72 61 63 65 20 3d 20 73 61 76 65 64 53  ctTrace = savedS
13260 65 6c 65 63 74 54 72 61 63 65 3b 0a 23 65 6e 64  electTrace;.#end
13270 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
13280 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20  QLITE_DEBUG) && 
13290 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
132a0 4e 41 42 4c 45 5f 57 48 45 52 45 54 52 41 43 45  NABLE_WHERETRACE
132b0 29 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72 65  ).  sqlite3Where
132c0 54 72 61 63 65 20 3d 20 73 61 76 65 64 57 68 65  Trace = savedWhe
132d0 72 65 54 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a  reTrace;.#endif.
132e0 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20 70  }../*.** Run a p
132f0 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65 6e  repared statemen
13300 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  t.*/.static void
13310 20 65 78 65 63 5f 70 72 65 70 61 72 65 64 5f 73   exec_prepared_s
13320 74 6d 74 28 0a 20 20 53 68 65 6c 6c 53 74 61 74  tmt(.  ShellStat
13330 65 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20  e *pArg,        
13340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13350 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
13360 65 72 20 74 6f 20 53 68 65 6c 6c 53 74 61 74 65  er to ShellState
13370 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
13380 6d 74 20 2a 70 53 74 6d 74 20 20 20 20 20 20 20  mt *pStmt       
13390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133a0 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 6d 65         /* Statme
133b0 6e 74 20 74 6f 20 72 75 6e 20 2a 2f 0a 29 7b 0a  nt to run */.){.
133c0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
133d0 70 65 72 66 6f 72 6d 20 74 68 65 20 66 69 72 73  perform the firs
133e0 74 20 73 74 65 70 2e 20 20 74 68 69 73 20 77 69  t step.  this wi
133f0 6c 6c 20 74 65 6c 6c 20 75 73 20 69 66 20 77 65  ll tell us if we
13400 0a 20 20 2a 2a 20 68 61 76 65 20 61 20 72 65 73  .  ** have a res
13410 75 6c 74 20 73 65 74 20 6f 72 20 6e 6f 74 20 61  ult set or not a
13420 6e 64 20 68 6f 77 20 77 69 64 65 20 69 74 20 69  nd how wide it i
13430 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  s..  */.  rc = s
13440 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
13450 74 29 3b 0a 20 20 2f 2a 20 69 66 20 77 65 20 68  t);.  /* if we h
13460 61 76 65 20 61 20 72 65 73 75 6c 74 20 73 65 74  ave a result set
13470 2e 2e 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c  ... */.  if( SQL
13480 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b  ITE_ROW == rc ){
13490 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65  .    /* allocate
134a0 20 73 70 61 63 65 20 66 6f 72 20 63 6f 6c 20 6e   space for col n
134b0 61 6d 65 20 70 74 72 2c 20 76 61 6c 75 65 20 70  ame ptr, value p
134c0 74 72 2c 20 61 6e 64 20 74 79 70 65 20 2a 2f 0a  tr, and type */.
134d0 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 73      int nCol = s
134e0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
134f0 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  unt(pStmt);.    
13500 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 73 71  void *pData = sq
13510 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 33  lite3_malloc64(3
13520 2a 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 63 6f 6e  *nCol*sizeof(con
13530 73 74 20 63 68 61 72 2a 29 20 2b 20 31 29 3b 0a  st char*) + 1);.
13540 20 20 20 20 69 66 28 20 21 70 44 61 74 61 20 29      if( !pData )
13550 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
13560 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d  ITE_NOMEM;.    }
13570 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
13580 20 2a 2a 61 7a 43 6f 6c 73 20 3d 20 28 63 68 61   **azCols = (cha
13590 72 20 2a 2a 29 70 44 61 74 61 3b 20 20 20 20 20  r **)pData;     
135a0 20 2f 2a 20 4e 61 6d 65 73 20 6f 66 20 72 65 73   /* Names of res
135b0 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ult columns */. 
135c0 20 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 56 61       char **azVa
135d0 6c 73 20 3d 20 26 61 7a 43 6f 6c 73 5b 6e 43 6f  ls = &azCols[nCo
135e0 6c 5d 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73  l];       /* Res
135f0 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ults */.      in
13600 74 20 2a 61 69 54 79 70 65 73 20 3d 20 28 69 6e  t *aiTypes = (in
13610 74 20 2a 29 26 61 7a 56 61 6c 73 5b 6e 43 6f 6c  t *)&azVals[nCol
13620 5d 3b 20 2f 2a 20 52 65 73 75 6c 74 20 74 79 70  ]; /* Result typ
13630 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  es */.      int 
13640 69 2c 20 78 3b 0a 20 20 20 20 20 20 61 73 73 65  i, x;.      asse
13650 72 74 28 73 69 7a 65 6f 66 28 69 6e 74 29 20 3c  rt(sizeof(int) <
13660 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29  = sizeof(char *)
13670 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 61 76 65  );.      /* save
13680 20 6f 66 66 20 70 74 72 73 20 74 6f 20 63 6f 6c   off ptrs to col
13690 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20  umn names */.   
136a0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43     for(i=0; i<nC
136b0 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; i++){.      
136c0 20 20 61 7a 43 6f 6c 73 5b 69 5d 20 3d 20 28 63    azCols[i] = (c
136d0 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63 6f  har *)sqlite3_co
136e0 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74 2c  lumn_name(pStmt,
136f0 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   i);.      }.   
13700 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 2f     do{.        /
13710 2a 20 65 78 74 72 61 63 74 20 74 68 65 20 64 61  * extract the da
13720 74 61 20 61 6e 64 20 64 61 74 61 20 74 79 70 65  ta and data type
13730 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72  s */.        for
13740 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b  (i=0; i<nCol; i+
13750 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 69  +){.          ai
13760 54 79 70 65 73 5b 69 5d 20 3d 20 78 20 3d 20 73  Types[i] = x = s
13770 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79  qlite3_column_ty
13780 70 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  pe(pStmt, i);.  
13790 20 20 20 20 20 20 20 20 69 66 28 20 78 3d 3d 53          if( x==S
137a0 51 4c 49 54 45 5f 42 4c 4f 42 20 26 26 20 70 41  QLITE_BLOB && pA
137b0 72 67 20 26 26 20 70 41 72 67 2d 3e 63 4d 6f 64  rg && pArg->cMod
137c0 65 3d 3d 4d 4f 44 45 5f 49 6e 73 65 72 74 20 29  e==MODE_Insert )
137d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 7a  {.            az
137e0 56 61 6c 73 5b 69 5d 20 3d 20 22 22 3b 0a 20 20  Vals[i] = "";.  
137f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
13800 20 20 20 20 20 20 20 20 20 20 20 61 7a 56 61 6c             azVal
13810 73 5b 69 5d 20 3d 20 28 63 68 61 72 2a 29 73 71  s[i] = (char*)sq
13820 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
13830 74 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  t(pStmt, i);.   
13840 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13850 20 20 20 69 66 28 20 21 61 7a 56 61 6c 73 5b 69     if( !azVals[i
13860 5d 20 26 26 20 28 61 69 54 79 70 65 73 5b 69 5d  ] && (aiTypes[i]
13870 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29  !=SQLITE_NULL) )
13880 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  {.            rc
13890 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
138a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65  .            bre
138b0 61 6b 3b 20 2f 2a 20 66 72 6f 6d 20 66 6f 72 20  ak; /* from for 
138c0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  */.          }. 
138d0 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20         } /* end 
138e0 66 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 20 20  for */..        
138f0 2f 2a 20 69 66 20 64 61 74 61 20 61 6e 64 20 74  /* if data and t
13900 79 70 65 73 20 65 78 74 72 61 63 74 65 64 20 73  ypes extracted s
13910 75 63 63 65 73 73 66 75 6c 6c 79 2e 2e 2e 20 2a  uccessfully... *
13920 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 53 51  /.        if( SQ
13930 4c 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29  LITE_ROW == rc )
13940 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63  {.          /* c
13950 61 6c 6c 20 74 68 65 20 73 75 70 70 6c 69 65 64  all the supplied
13960 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74   callback with t
13970 68 65 20 72 65 73 75 6c 74 20 72 6f 77 20 64 61  he result row da
13980 74 61 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ta */.          
13990 69 66 28 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61  if( shell_callba
139a0 63 6b 28 70 41 72 67 2c 20 6e 43 6f 6c 2c 20 61  ck(pArg, nCol, a
139b0 7a 56 61 6c 73 2c 20 61 7a 43 6f 6c 73 2c 20 61  zVals, azCols, a
139c0 69 54 79 70 65 73 29 20 29 7b 0a 20 20 20 20 20  iTypes) ){.     
139d0 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
139e0 54 45 5f 41 42 4f 52 54 3b 0a 20 20 20 20 20 20  TE_ABORT;.      
139f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
13a00 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
13a10 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b  te3_step(pStmt);
13a20 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
13a30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 77       }.      } w
13a40 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57  hile( SQLITE_ROW
13a50 20 3d 3d 20 72 63 20 29 3b 0a 20 20 20 20 20 20   == rc );.      
13a60 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44 61  sqlite3_free(pDa
13a70 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  ta);.    }.  }.}
13a80 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
13a90 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
13aa0 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  LE./*.** This fu
13ab0 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
13ac0 20 74 6f 20 70 72 6f 63 65 73 73 20 53 51 4c 20   to process SQL 
13ad0 69 66 20 74 68 65 20 70 72 65 76 69 6f 75 73 20  if the previous 
13ae0 73 68 65 6c 6c 20 63 6f 6d 6d 61 6e 64 0a 2a 2a  shell command.**
13af0 20 77 61 73 20 22 2e 65 78 70 65 72 74 22 2e 20   was ".expert". 
13b00 49 74 20 70 61 73 73 65 73 20 74 68 65 20 53 51  It passes the SQ
13b10 4c 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64 20  L in the second 
13b20 61 72 67 75 6d 65 6e 74 20 64 69 72 65 63 74 6c  argument directl
13b30 79 20 74 6f 0a 2a 2a 20 74 68 65 20 73 71 6c 69  y to.** the sqli
13b40 74 65 33 65 78 70 65 72 74 20 6f 62 6a 65 63 74  te3expert object
13b50 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65  ..**.** If succe
13b60 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b  ssful, SQLITE_OK
13b70 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
13b80 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69  herwise, an SQLi
13b90 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  te error.** code
13ba0 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20  . In this case, 
13bb0 28 2a 70 7a 45 72 72 29 20 6d 61 79 20 62 65 20  (*pzErr) may be 
13bc0 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20  set to point to 
13bd0 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e  a buffer contain
13be0 69 6e 67 0a 2a 2a 20 61 6e 20 45 6e 67 6c 69 73  ing.** an Englis
13bf0 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72  h language error
13c00 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69 73 20   message. It is 
13c10 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69  the responsibili
13c20 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c  ty of the.** cal
13c30 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c  ler to eventuall
13c40 79 20 66 72 65 65 20 74 68 69 73 20 62 75 66 66  y free this buff
13c50 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  er using sqlite3
13c60 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  _free()..*/.stat
13c70 69 63 20 69 6e 74 20 65 78 70 65 72 74 48 61 6e  ic int expertHan
13c80 64 6c 65 53 51 4c 28 0a 20 20 53 68 65 6c 6c 53  dleSQL(.  ShellS
13c90 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20 0a 20  tate *pState, . 
13ca0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
13cb0 6c 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45  l, .  char **pzE
13cc0 72 72 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20  rr.){.  assert( 
13cd0 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70  pState->expert.p
13ce0 45 78 70 65 72 74 20 29 3b 0a 20 20 61 73 73 65  Expert );.  asse
13cf0 72 74 28 20 70 7a 45 72 72 3d 3d 30 20 7c 7c 20  rt( pzErr==0 || 
13d00 2a 70 7a 45 72 72 3d 3d 30 20 29 3b 0a 20 20 72  *pzErr==0 );.  r
13d10 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 65 78  eturn sqlite3_ex
13d20 70 65 72 74 5f 73 71 6c 28 70 53 74 61 74 65 2d  pert_sql(pState-
13d30 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 2c  >expert.pExpert,
13d40 20 7a 53 71 6c 2c 20 70 7a 45 72 72 29 3b 0a 7d   zSql, pzErr);.}
13d50 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ../*.** This fun
13d60 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64 20  ction is called 
13d70 65 69 74 68 65 72 20 74 6f 20 73 69 6c 65 6e 74  either to silent
13d80 6c 79 20 63 6c 65 61 6e 20 75 70 20 74 68 65 20  ly clean up the 
13d90 6f 62 6a 65 63 74 0a 2a 2a 20 63 72 65 61 74 65  object.** create
13da0 64 20 62 79 20 74 68 65 20 22 2e 65 78 70 65 72  d by the ".exper
13db0 74 22 20 63 6f 6d 6d 61 6e 64 20 28 69 66 20 62  t" command (if b
13dc0 43 61 6e 63 65 6c 3d 3d 31 29 2c 20 6f 72 20 74  Cancel==1), or t
13dd0 6f 20 67 65 6e 65 72 61 74 65 20 61 20 0a 2a 2a  o generate a .**
13de0 20 72 65 70 6f 72 74 20 66 72 6f 6d 20 69 74 20   report from it 
13df0 61 6e 64 20 74 68 65 6e 20 63 6c 65 61 6e 20 69  and then clean i
13e00 74 20 75 70 20 28 69 66 20 62 43 61 6e 63 65 6c  t up (if bCancel
13e10 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ==0)..**.** If s
13e20 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
13e30 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
13e40 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  . Otherwise, an 
13e50 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20  SQLite error.** 
13e60 63 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61  code. In this ca
13e70 73 65 2c 20 28 2a 70 7a 45 72 72 29 20 6d 61 79  se, (*pzErr) may
13e80 20 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   be set to point
13e90 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
13ea0 74 61 69 6e 69 6e 67 0a 2a 2a 20 61 6e 20 45 6e  taining.** an En
13eb0 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65  glish language e
13ec0 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 49 74  rror message. It
13ed0 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
13ee0 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a  bility of the.**
13ef0 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
13f00 75 61 6c 6c 79 20 66 72 65 65 20 74 68 69 73 20  ually free this 
13f10 62 75 66 66 65 72 20 75 73 69 6e 67 20 73 71 6c  buffer using sql
13f20 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a  ite3_free()..*/.
13f30 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 65 72  static int exper
13f40 74 46 69 6e 69 73 68 28 0a 20 20 53 68 65 6c 6c  tFinish(.  Shell
13f50 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c 0a 20  State *pState,. 
13f60 20 69 6e 74 20 62 43 61 6e 63 65 6c 2c 0a 20 20   int bCancel,.  
13f70 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a  char **pzErr.){.
13f80 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
13f90 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33 65  E_OK;.  sqlite3e
13fa0 78 70 65 72 74 20 2a 70 20 3d 20 70 53 74 61 74  xpert *p = pStat
13fb0 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72  e->expert.pExper
13fc0 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20 29  t;.  assert( p )
13fd0 3b 0a 20 20 61 73 73 65 72 74 28 20 62 43 61 6e  ;.  assert( bCan
13fe0 63 65 6c 20 7c 7c 20 70 7a 45 72 72 3d 3d 30 20  cel || pzErr==0 
13ff0 7c 7c 20 2a 70 7a 45 72 72 3d 3d 30 20 29 3b 0a  || *pzErr==0 );.
14000 20 20 69 66 28 20 62 43 61 6e 63 65 6c 3d 3d 30    if( bCancel==0
14010 20 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f 75   ){.    FILE *ou
14020 74 20 3d 20 70 53 74 61 74 65 2d 3e 6f 75 74 3b  t = pState->out;
14030 0a 20 20 20 20 69 6e 74 20 62 56 65 72 62 6f 73  .    int bVerbos
14040 65 20 3d 20 70 53 74 61 74 65 2d 3e 65 78 70 65  e = pState->expe
14050 72 74 2e 62 56 65 72 62 6f 73 65 3b 0a 0a 20 20  rt.bVerbose;..  
14060 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
14070 78 70 65 72 74 5f 61 6e 61 6c 79 7a 65 28 70 2c  xpert_analyze(p,
14080 20 70 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28   pzErr);.    if(
14090 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
140a0 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 51 75 65  {.      int nQue
140b0 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70  ry = sqlite3_exp
140c0 65 72 74 5f 63 6f 75 6e 74 28 70 29 3b 0a 20 20  ert_count(p);.  
140d0 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20      int i;..    
140e0 20 20 69 66 28 20 62 56 65 72 62 6f 73 65 20 29    if( bVerbose )
140f0 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
14100 63 68 61 72 20 2a 7a 43 61 6e 64 20 3d 20 73 71  char *zCand = sq
14110 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 72 65 70  lite3_expert_rep
14120 6f 72 74 28 70 2c 30 2c 45 58 50 45 52 54 5f 52  ort(p,0,EXPERT_R
14130 45 50 4f 52 54 5f 43 41 4e 44 49 44 41 54 45 53  EPORT_CANDIDATES
14140 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  );.        raw_p
14150 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 43  rintf(out, "-- C
14160 61 6e 64 69 64 61 74 65 73 20 2d 2d 2d 2d 2d 2d  andidates ------
14170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14180 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 20  -------\n");.   
14190 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
141a0 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 43 61  out, "%s\n", zCa
141b0 6e 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nd);.      }.   
141c0 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 51     for(i=0; i<nQ
141d0 75 65 72 79 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  uery; i++){.    
141e0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
141f0 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 65  zSql = sqlite3_e
14200 78 70 65 72 74 5f 72 65 70 6f 72 74 28 70 2c 20  xpert_report(p, 
14210 69 2c 20 45 58 50 45 52 54 5f 52 45 50 4f 52 54  i, EXPERT_REPORT
14220 5f 53 51 4c 29 3b 0a 20 20 20 20 20 20 20 20 63  _SQL);.        c
14230 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78 20  onst char *zIdx 
14240 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74  = sqlite3_expert
14250 5f 72 65 70 6f 72 74 28 70 2c 20 69 2c 20 45 58  _report(p, i, EX
14260 50 45 52 54 5f 52 45 50 4f 52 54 5f 49 4e 44 45  PERT_REPORT_INDE
14270 58 45 53 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  XES);.        co
14280 6e 73 74 20 63 68 61 72 20 2a 7a 45 51 50 20 3d  nst char *zEQP =
14290 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f   sqlite3_expert_
142a0 72 65 70 6f 72 74 28 70 2c 20 69 2c 20 45 58 50  report(p, i, EXP
142b0 45 52 54 5f 52 45 50 4f 52 54 5f 50 4c 41 4e 29  ERT_REPORT_PLAN)
142c0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 49  ;.        if( zI
142d0 64 78 3d 3d 30 20 29 20 7a 49 64 78 20 3d 20 22  dx==0 ) zIdx = "
142e0 28 6e 6f 20 6e 65 77 20 69 6e 64 65 78 65 73 29  (no new indexes)
142f0 5c 6e 22 3b 0a 20 20 20 20 20 20 20 20 69 66 28  \n";.        if(
14300 20 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20   bVerbose ){.   
14310 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
14320 66 28 6f 75 74 2c 20 22 2d 2d 20 51 75 65 72 79  f(out, "-- Query
14330 20 25 64 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   %d ------------
14340 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14350 2d 2d 2d 2d 5c 6e 22 2c 69 2b 31 29 3b 0a 20 20  ----\n",i+1);.  
14360 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
14370 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 5c 6e 22  tf(out, "%s\n\n"
14380 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20  , zSql);.       
14390 20 7d 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70   }.        raw_p
143a0 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e  rintf(out, "%s\n
143b0 22 2c 20 7a 49 64 78 29 3b 0a 20 20 20 20 20 20  ", zIdx);.      
143c0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
143d0 2c 20 22 25 73 5c 6e 22 2c 20 7a 45 51 50 29 3b  , "%s\n", zEQP);
143e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
143f0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 70   }.  sqlite3_exp
14400 65 72 74 5f 64 65 73 74 72 6f 79 28 70 29 3b 0a  ert_destroy(p);.
14410 20 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74    pState->expert
14420 2e 70 45 78 70 65 72 74 20 3d 20 30 3b 0a 20 20  .pExpert = 0;.  
14430 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
14440 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
14450 6f 6e 20 6f 66 20 22 2e 65 78 70 65 72 74 22 20  on of ".expert" 
14460 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  dot command..*/.
14470 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 65 72  static int exper
14480 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 53  tDotCommand(.  S
14490 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74  hellState *pStat
144a0 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  e,             /
144b0 2a 20 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20  * Current shell 
144c0 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20  tool state */.  
144d0 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20  char **azArg,   
144e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
144f0 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67 75  /* Array of argu
14500 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20  ments passed to 
14510 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20  dot command */. 
14520 20 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20   int nArg       
14530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14540 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e   /* Number of en
14550 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d  tries in azArg[]
14560 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20   */.){.  int rc 
14570 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63  = SQLITE_OK;.  c
14580 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20  har *zErr = 0;. 
14590 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69 53   int i;.  int iS
145a0 61 6d 70 6c 65 20 3d 20 30 3b 0a 0a 20 20 61 73  ample = 0;..  as
145b0 73 65 72 74 28 20 70 53 74 61 74 65 2d 3e 65 78  sert( pState->ex
145c0 70 65 72 74 2e 70 45 78 70 65 72 74 3d 3d 30 20  pert.pExpert==0 
145d0 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 53 74  );.  memset(&pSt
145e0 61 74 65 2d 3e 65 78 70 65 72 74 2c 20 30 2c 20  ate->expert, 0, 
145f0 73 69 7a 65 6f 66 28 45 78 70 65 72 74 49 6e 66  sizeof(ExpertInf
14600 6f 29 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 31 3b  o));..  for(i=1;
14610 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
14620 26 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  & i<nArg; i++){.
14630 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a      char *z = az
14640 41 72 67 5b 69 5d 3b 0a 20 20 20 20 69 6e 74 20  Arg[i];.    int 
14650 6e 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d  n;.    if( z[0]=
14660 3d 27 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d  ='-' && z[1]=='-
14670 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 6e 20 3d  ' ) z++;.    n =
14680 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20   strlen30(z);.  
14690 20 20 69 66 28 20 6e 3e 3d 32 20 26 26 20 30 3d    if( n>=2 && 0=
146a0 3d 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 76 65  =strncmp(z, "-ve
146b0 72 62 6f 73 65 22 2c 20 6e 29 20 29 7b 0a 20 20  rbose", n) ){.  
146c0 20 20 20 20 70 53 74 61 74 65 2d 3e 65 78 70 65      pState->expe
146d0 72 74 2e 62 56 65 72 62 6f 73 65 20 3d 20 31 3b  rt.bVerbose = 1;
146e0 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20  .    }.    else 
146f0 69 66 28 20 6e 3e 3d 32 20 26 26 20 30 3d 3d 73  if( n>=2 && 0==s
14700 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 73 61 6d 70  trncmp(z, "-samp
14710 6c 65 22 2c 20 6e 29 20 29 7b 0a 20 20 20 20 20  le", n) ){.     
14720 20 69 66 28 20 69 3d 3d 28 6e 41 72 67 2d 31 29   if( i==(nArg-1)
14730 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
14740 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
14750 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20  option requires 
14760 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25 73 5c  an argument: %s\
14770 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20  n", z);.        
14780 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
14790 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  R;.      }else{.
147a0 20 20 20 20 20 20 20 20 69 53 61 6d 70 6c 65 20          iSample 
147b0 3d 20 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61  = (int)integerVa
147c0 6c 75 65 28 61 7a 41 72 67 5b 2b 2b 69 5d 29 3b  lue(azArg[++i]);
147d0 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 53 61  .        if( iSa
147e0 6d 70 6c 65 3c 30 20 7c 7c 20 69 53 61 6d 70 6c  mple<0 || iSampl
147f0 65 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20  e>100 ){.       
14800 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
14810 64 65 72 72 2c 20 22 76 61 6c 75 65 20 6f 75 74  derr, "value out
14820 20 6f 66 20 72 61 6e 67 65 3a 20 25 73 5c 6e 22   of range: %s\n"
14830 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  , azArg[i]);.   
14840 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
14850 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
14860 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
14870 7d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  }.    else{.    
14880 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
14890 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70  err, "unknown op
148a0 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b  tion: %s\n", z);
148b0 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
148c0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a  TE_ERROR;.    }.
148d0 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53    }..  if( rc==S
148e0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
148f0 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70  pState->expert.p
14900 45 78 70 65 72 74 20 3d 20 73 71 6c 69 74 65 33  Expert = sqlite3
14910 5f 65 78 70 65 72 74 5f 6e 65 77 28 70 53 74 61  _expert_new(pSta
14920 74 65 2d 3e 64 62 2c 20 26 7a 45 72 72 29 3b 0a  te->db, &zErr);.
14930 20 20 20 20 69 66 28 20 70 53 74 61 74 65 2d 3e      if( pState->
14940 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 3d 3d  expert.pExpert==
14950 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  0 ){.      raw_p
14960 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 73  rintf(stderr, "s
14970 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 6e 65  qlite3_expert_ne
14980 77 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29 3b  w: %s\n", zErr);
14990 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
149a0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 65  TE_ERROR;.    }e
149b0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
149c0 65 33 5f 65 78 70 65 72 74 5f 63 6f 6e 66 69 67  e3_expert_config
149d0 28 0a 20 20 20 20 20 20 20 20 20 20 70 53 74 61  (.          pSta
149e0 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65  te->expert.pExpe
149f0 72 74 2c 20 45 58 50 45 52 54 5f 43 4f 4e 46 49  rt, EXPERT_CONFI
14a00 47 5f 53 41 4d 50 4c 45 2c 20 69 53 61 6d 70 6c  G_SAMPLE, iSampl
14a10 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  e.      );.    }
14a20 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
14a30 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 69  c;.}.#endif /* i
14a40 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
14a50 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20 2a  T_VIRTUALTABLE *
14a60 2f 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65  /../*.** Execute
14a70 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20   a statement or 
14a80 73 65 74 20 6f 66 20 73 74 61 74 65 6d 65 6e 74  set of statement
14a90 73 2e 20 20 50 72 69 6e 74 0a 2a 2a 20 61 6e 79  s.  Print.** any
14aa0 20 72 65 73 75 6c 74 20 72 6f 77 73 2f 63 6f 6c   result rows/col
14ab0 75 6d 6e 73 20 64 65 70 65 6e 64 69 6e 67 20 6f  umns depending o
14ac0 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 6f  n the current mo
14ad0 64 65 0a 2a 2a 20 73 65 74 20 76 69 61 20 74 68  de.** set via th
14ae0 65 20 73 75 70 70 6c 69 65 64 20 63 61 6c 6c 62  e supplied callb
14af0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
14b00 69 73 20 76 65 72 79 20 73 69 6d 69 6c 61 72 20  is very similar 
14b10 74 6f 20 53 51 4c 69 74 65 27 73 20 62 75 69 6c  to SQLite's buil
14b20 74 2d 69 6e 20 73 71 6c 69 74 65 33 5f 65 78 65  t-in sqlite3_exe
14b30 63 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  c().** function 
14b40 65 78 63 65 70 74 20 69 74 20 74 61 6b 65 73 20  except it takes 
14b50 61 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65  a slightly diffe
14b60 72 65 6e 74 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  rent callback.**
14b70 20 61 6e 64 20 63 61 6c 6c 62 61 63 6b 20 64 61   and callback da
14b80 74 61 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ta argument..*/.
14b90 73 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c  static int shell
14ba0 5f 65 78 65 63 28 0a 20 20 53 68 65 6c 6c 53 74  _exec(.  ShellSt
14bb0 61 74 65 20 2a 70 41 72 67 2c 20 20 20 20 20 20  ate *pArg,      
14bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14bd0 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
14be0 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20   ShellState */. 
14bf0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
14c00 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l,              
14c10 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51             /* SQ
14c20 4c 20 74 6f 20 62 65 20 65 76 61 6c 75 61 74 65  L to be evaluate
14c30 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a  d */.  char **pz
14c40 45 72 72 4d 73 67 20 20 20 20 20 20 20 20 20 20  ErrMsg          
14c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c60 20 2f 2a 20 45 72 72 6f 72 20 6d 73 67 20 77 72   /* Error msg wr
14c70 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b  itten here */.){
14c80 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
14c90 2a 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20 20  *pStmt = NULL;  
14ca0 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20     /* Statement 
14cb0 74 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20  to execute. */. 
14cc0 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
14cd0 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
14ce0 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
14cf0 2a 2f 0a 20 20 69 6e 74 20 72 63 32 3b 0a 20 20  */.  int rc2;.  
14d00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 65 66  const char *zLef
14d10 74 6f 76 65 72 3b 20 20 20 20 20 20 20 20 20 20  tover;          
14d20 2f 2a 20 54 61 69 6c 20 6f 66 20 75 6e 70 72 6f  /* Tail of unpro
14d30 63 65 73 73 65 64 20 53 51 4c 20 2a 2f 0a 20 20  cessed SQL */.  
14d40 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 41  sqlite3 *db = pA
14d50 72 67 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20 70  rg->db;..  if( p
14d60 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 2a  zErrMsg ){.    *
14d70 70 7a 45 72 72 4d 73 67 20 3d 20 4e 55 4c 4c 3b  pzErrMsg = NULL;
14d80 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51  .  }..#ifndef SQ
14d90 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
14da0 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70 41 72  LTABLE.  if( pAr
14db0 67 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72  g->expert.pExper
14dc0 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 65 78  t ){.    rc = ex
14dd0 70 65 72 74 48 61 6e 64 6c 65 53 51 4c 28 70 41  pertHandleSQL(pA
14de0 72 67 2c 20 7a 53 71 6c 2c 20 70 7a 45 72 72 4d  rg, zSql, pzErrM
14df0 73 67 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  sg);.    return 
14e00 65 78 70 65 72 74 46 69 6e 69 73 68 28 70 41 72  expertFinish(pAr
14e10 67 2c 20 28 72 63 21 3d 53 51 4c 49 54 45 5f 4f  g, (rc!=SQLITE_O
14e20 4b 29 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20  K), pzErrMsg);. 
14e30 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68 69   }.#endif..  whi
14e40 6c 65 28 20 7a 53 71 6c 5b 30 5d 20 26 26 20 28  le( zSql[0] && (
14e50 53 51 4c 49 54 45 5f 4f 4b 20 3d 3d 20 72 63 29  SQLITE_OK == rc)
14e60 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63   ){.    static c
14e70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 6d 74  onst char *zStmt
14e80 53 71 6c 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  Sql;.    rc = sq
14e90 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
14ea0 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  (db, zSql, -1, &
14eb0 70 53 74 6d 74 2c 20 26 7a 4c 65 66 74 6f 76 65  pStmt, &zLeftove
14ec0 72 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  r);.    if( SQLI
14ed0 54 45 5f 4f 4b 20 21 3d 20 72 63 20 29 7b 0a 20  TE_OK != rc ){. 
14ee0 20 20 20 20 20 69 66 28 20 70 7a 45 72 72 4d 73       if( pzErrMs
14ef0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a  g ){.        *pz
14f00 45 72 72 4d 73 67 20 3d 20 73 61 76 65 5f 65 72  ErrMsg = save_er
14f10 72 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20 20 20  r_msg(db);.     
14f20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
14f30 20 20 20 20 69 66 28 20 21 70 53 74 6d 74 20 29      if( !pStmt )
14f40 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 74 68 69  {.        /* thi
14f50 73 20 68 61 70 70 65 6e 73 20 66 6f 72 20 61 20  s happens for a 
14f60 63 6f 6d 6d 65 6e 74 20 6f 72 20 77 68 69 74 65  comment or white
14f70 2d 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 20  -space */.      
14f80 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 6f 76    zSql = zLeftov
14f90 65 72 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  er;.        whil
14fa0 65 28 20 49 73 53 70 61 63 65 28 7a 53 71 6c 5b  e( IsSpace(zSql[
14fb0 30 5d 29 20 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20  0]) ) zSql++;.  
14fc0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
14fd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 53        }.      zS
14fe0 74 6d 74 53 71 6c 20 3d 20 73 71 6c 69 74 65 33  tmtSql = sqlite3
14ff0 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20  _sql(pStmt);.   
15000 20 20 20 69 66 28 20 7a 53 74 6d 74 53 71 6c 3d     if( zStmtSql=
15010 3d 30 20 29 20 7a 53 74 6d 74 53 71 6c 20 3d 20  =0 ) zStmtSql = 
15020 22 22 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  "";.      while(
15030 20 49 73 53 70 61 63 65 28 7a 53 74 6d 74 53 71   IsSpace(zStmtSq
15040 6c 5b 30 5d 29 20 29 20 7a 53 74 6d 74 53 71 6c  l[0]) ) zStmtSql
15050 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 73 61  ++;..      /* sa
15060 76 65 20 6f 66 66 20 74 68 65 20 70 72 65 70 61  ve off the prepa
15070 72 65 64 20 73 74 61 74 6d 65 6e 74 20 68 61 6e  red statment han
15080 64 6c 65 20 61 6e 64 20 72 65 73 65 74 20 72 6f  dle and reset ro
15090 77 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20  w count */.     
150a0 20 69 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20   if( pArg ){.   
150b0 20 20 20 20 20 70 41 72 67 2d 3e 70 53 74 6d 74       pArg->pStmt
150c0 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20 20 20   = pStmt;.      
150d0 20 20 70 41 72 67 2d 3e 63 6e 74 20 3d 20 30 3b    pArg->cnt = 0;
150e0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
150f0 2f 2a 20 65 63 68 6f 20 74 68 65 20 73 71 6c 20  /* echo the sql 
15100 73 74 61 74 65 6d 65 6e 74 20 69 66 20 65 63 68  statement if ech
15110 6f 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66  o on */.      if
15120 28 20 70 41 72 67 20 26 26 20 53 68 65 6c 6c 48  ( pArg && ShellH
15130 61 73 46 6c 61 67 28 70 41 72 67 2c 20 53 48 46  asFlag(pArg, SHF
15140 4c 47 5f 45 63 68 6f 29 20 29 7b 0a 20 20 20 20  LG_Echo) ){.    
15150 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
15160 70 41 72 67 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  pArg->out, "%s\n
15170 22 2c 20 7a 53 74 6d 74 53 71 6c 20 3f 20 7a 53  ", zStmtSql ? zS
15180 74 6d 74 53 71 6c 20 3a 20 7a 53 71 6c 29 3b 0a  tmtSql : zSql);.
15190 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
151a0 2a 20 53 68 6f 77 20 74 68 65 20 45 58 50 4c 41  * Show the EXPLA
151b0 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 69 66  IN QUERY PLAN if
151c0 20 2e 65 71 70 20 69 73 20 6f 6e 20 2a 2f 0a 20   .eqp is on */. 
151d0 20 20 20 20 20 69 66 28 20 70 41 72 67 20 26 26       if( pArg &&
151e0 20 70 41 72 67 2d 3e 61 75 74 6f 45 51 50 20 26   pArg->autoEQP &
151f0 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b  & sqlite3_strlik
15200 65 28 22 45 58 50 4c 41 49 4e 25 22 2c 7a 53 74  e("EXPLAIN%",zSt
15210 6d 74 53 71 6c 2c 30 29 21 3d 30 20 29 7b 0a 20  mtSql,0)!=0 ){. 
15220 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
15230 74 6d 74 20 2a 70 45 78 70 6c 61 69 6e 3b 0a 20  tmt *pExplain;. 
15240 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45 51         char *zEQ
15250 50 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74  P;.        int t
15260 72 69 67 67 65 72 45 51 50 20 3d 20 30 3b 0a 20  riggerEQP = 0;. 
15270 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 5f 64         disable_d
15280 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73  ebug_trace_modes
15290 28 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ();.        sqli
152a0 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 64 62  te3_db_config(db
152b0 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  , SQLITE_DBCONFI
152c0 47 5f 54 52 49 47 47 45 52 5f 45 51 50 2c 20 2d  G_TRIGGER_EQP, -
152d0 31 2c 20 26 74 72 69 67 67 65 72 45 51 50 29 3b  1, &triggerEQP);
152e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41 72  .        if( pAr
152f0 67 2d 3e 61 75 74 6f 45 51 50 3e 3d 41 55 54 4f  g->autoEQP>=AUTO
15300 45 51 50 5f 74 72 69 67 67 65 72 20 29 7b 0a 20  EQP_trigger ){. 
15310 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15320 5f 64 62 5f 63 6f 6e 66 69 67 28 64 62 2c 20 53  _db_config(db, S
15330 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 54  QLITE_DBCONFIG_T
15340 52 49 47 47 45 52 5f 45 51 50 2c 20 31 2c 20 30  RIGGER_EQP, 1, 0
15350 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
15360 20 20 20 20 20 7a 45 51 50 20 3d 20 73 71 6c 69       zEQP = sqli
15370 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 45 58 50  te3_mprintf("EXP
15380 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
15390 25 73 22 2c 20 7a 53 74 6d 74 53 71 6c 29 3b 0a  %s", zStmtSql);.
153a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
153b0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
153c0 64 62 2c 20 7a 45 51 50 2c 20 2d 31 2c 20 26 70  db, zEQP, -1, &p
153d0 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20  Explain, 0);.   
153e0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
153f0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
15400 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74      while( sqlit
15410 65 33 5f 73 74 65 70 28 70 45 78 70 6c 61 69 6e  e3_step(pExplain
15420 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
15430 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 61 77  .            raw
15440 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
15450 74 2c 22 2d 2d 45 51 50 2d 2d 20 25 64 2c 22 2c  t,"--EQP-- %d,",
15460 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
15470 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 30 29 29  nt(pExplain, 0))
15480 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 61  ;.            ra
15490 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
154a0 75 74 2c 22 25 64 2c 22 2c 20 73 71 6c 69 74 65  ut,"%d,", sqlite
154b0 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78  3_column_int(pEx
154c0 70 6c 61 69 6e 2c 20 31 29 29 3b 0a 20 20 20 20  plain, 1));.    
154d0 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
154e0 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 22 25 64  tf(pArg->out,"%d
154f0 2c 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ,", sqlite3_colu
15500 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c  mn_int(pExplain,
15510 20 32 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20   2));.          
15520 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41    utf8_printf(pA
15530 72 67 2d 3e 6f 75 74 2c 22 25 73 5c 6e 22 2c 20  rg->out,"%s\n", 
15540 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
15550 65 78 74 28 70 45 78 70 6c 61 69 6e 2c 20 33 29  ext(pExplain, 3)
15560 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
15570 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15580 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
15590 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20  e(pExplain);.   
155a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
155b0 65 28 7a 45 51 50 29 3b 0a 20 20 20 20 20 20 20  e(zEQP);.       
155c0 20 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45   if( pArg->autoE
155d0 51 50 3e 3d 41 55 54 4f 45 51 50 5f 66 75 6c 6c  QP>=AUTOEQP_full
155e0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
155f0 20 41 6c 73 6f 20 64 6f 20 61 6e 20 45 58 50 4c   Also do an EXPL
15600 41 49 4e 20 66 6f 72 20 22 2e 65 71 70 20 66 75  AIN for ".eqp fu
15610 6c 6c 22 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20  ll" mode */.    
15620 20 20 20 20 20 20 7a 45 51 50 20 3d 20 73 71 6c        zEQP = sql
15630 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 45 58  ite3_mprintf("EX
15640 50 4c 41 49 4e 20 25 73 22 2c 20 7a 53 74 6d 74  PLAIN %s", zStmt
15650 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Sql);.          
15660 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
15670 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 45 51 50  pare_v2(db, zEQP
15680 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c  , -1, &pExplain,
15690 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
156a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
156b0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
156c0 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f  pArg->cMode = MO
156d0 44 45 5f 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20  DE_Explain;.    
156e0 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 5f          explain_
156f0 64 61 74 61 5f 70 72 65 70 61 72 65 28 70 41 72  data_prepare(pAr
15700 67 2c 20 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20  g, pExplain);.  
15710 20 20 20 20 20 20 20 20 20 20 65 78 65 63 5f 70            exec_p
15720 72 65 70 61 72 65 64 5f 73 74 6d 74 28 70 41 72  repared_stmt(pAr
15730 67 2c 20 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20  g, pExplain);.  
15740 20 20 20 20 20 20 20 20 20 20 65 78 70 6c 61 69            explai
15750 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 70 41  n_data_delete(pA
15760 72 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  rg);.          }
15770 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
15780 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78 70  e3_finalize(pExp
15790 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  lain);.         
157a0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
157b0 51 50 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  QP);.        }. 
157c0 20 20 20 20 20 20 20 69 66 28 20 70 41 72 67 2d         if( pArg-
157d0 3e 61 75 74 6f 45 51 50 3e 3d 41 55 54 4f 45 51  >autoEQP>=AUTOEQ
157e0 50 5f 74 72 69 67 67 65 72 20 26 26 20 74 72 69  P_trigger && tri
157f0 67 67 65 72 45 51 50 3d 3d 30 20 29 7b 0a 20 20  ggerEQP==0 ){.  
15800 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
15810 64 62 5f 63 6f 6e 66 69 67 28 64 62 2c 20 53 51  db_config(db, SQ
15820 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 54 52  LITE_DBCONFIG_TR
15830 49 47 47 45 52 5f 45 51 50 2c 20 30 2c 20 30 29  IGGER_EQP, 0, 0)
15840 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52  ;.          /* R
15850 65 70 72 65 70 61 72 65 20 70 53 74 6d 74 20 62  eprepare pStmt b
15860 65 66 6f 72 65 20 72 65 61 63 74 69 76 69 6e 67  efore reactiving
15870 20 74 72 61 63 65 20 6d 6f 64 65 73 20 2a 2f 0a   trace modes */.
15880 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15890 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
158a0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
158b0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
158c0 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
158d0 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Stmt, 0);.      
158e0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 73 74    }.        rest
158f0 6f 72 65 5f 64 65 62 75 67 5f 74 72 61 63 65 5f  ore_debug_trace_
15900 6d 6f 64 65 73 28 29 3b 0a 20 20 20 20 20 20 7d  modes();.      }
15910 0a 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67  ..      if( pArg
15920 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72 67   ){.        pArg
15930 2d 3e 63 4d 6f 64 65 20 3d 20 70 41 72 67 2d 3e  ->cMode = pArg->
15940 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 69 66  mode;.        if
15950 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 78 70 6c  ( pArg->autoExpl
15960 61 69 6e 0a 20 20 20 20 20 20 20 20 20 26 26 20  ain.         && 
15970 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
15980 6f 75 6e 74 28 70 53 74 6d 74 29 3d 3d 38 0a 20  ount(pStmt)==8. 
15990 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74          && sqlit
159a0 65 33 5f 73 74 72 6c 69 6b 65 28 22 45 58 50 4c  e3_strlike("EXPL
159b0 41 49 4e 25 22 2c 20 7a 53 74 6d 74 53 71 6c 2c  AIN%", zStmtSql,
159c0 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b  0)==0.        ){
159d0 0a 20 20 20 20 20 20 20 20 20 20 70 41 72 67 2d  .          pArg-
159e0 3e 63 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78  >cMode = MODE_Ex
159f0 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 7d  plain;.        }
15a00 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ..        /* If 
15a10 74 68 65 20 73 68 65 6c 6c 20 69 73 20 63 75 72  the shell is cur
15a20 72 65 6e 74 6c 79 20 69 6e 20 22 2e 65 78 70 6c  rently in ".expl
15a30 61 69 6e 22 20 6d 6f 64 65 2c 20 67 61 74 68 65  ain" mode, gathe
15a40 72 20 74 68 65 20 65 78 74 72 61 0a 20 20 20 20  r the extra.    
15a50 20 20 20 20 2a 2a 20 64 61 74 61 20 72 65 71 75      ** data requ
15a60 69 72 65 64 20 74 6f 20 61 64 64 20 69 6e 64 65  ired to add inde
15a70 6e 74 73 20 74 6f 20 74 68 65 20 6f 75 74 70 75  nts to the outpu
15a80 74 2e 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28  t.*/.        if(
15a90 20 70 41 72 67 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f   pArg->cMode==MO
15aa0 44 45 5f 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20  DE_Explain ){.  
15ab0 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 5f          explain_
15ac0 64 61 74 61 5f 70 72 65 70 61 72 65 28 70 41 72  data_prepare(pAr
15ad0 67 2c 20 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  g, pStmt);.     
15ae0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20     }.      }..  
15af0 20 20 20 20 65 78 65 63 5f 70 72 65 70 61 72 65      exec_prepare
15b00 64 5f 73 74 6d 74 28 70 41 72 67 2c 20 70 53 74  d_stmt(pArg, pSt
15b10 6d 74 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  mt);.      expla
15b20 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 70  in_data_delete(p
15b30 41 72 67 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  Arg);..      /* 
15b40 70 72 69 6e 74 20 75 73 61 67 65 20 73 74 61 74  print usage stat
15b50 73 20 69 66 20 73 74 61 74 73 20 6f 6e 20 2a 2f  s if stats on */
15b60 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20  .      if( pArg 
15b70 26 26 20 70 41 72 67 2d 3e 73 74 61 74 73 4f 6e  && pArg->statsOn
15b80 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 70   ){.        disp
15b90 6c 61 79 5f 73 74 61 74 73 28 64 62 2c 20 70 41  lay_stats(db, pA
15ba0 72 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  rg, 0);.      }.
15bb0 0a 20 20 20 20 20 20 2f 2a 20 70 72 69 6e 74 20  .      /* print 
15bc0 6c 6f 6f 70 2d 63 6f 75 6e 74 65 72 73 20 69 66  loop-counters if
15bd0 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20   required */.   
15be0 20 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70     if( pArg && p
15bf0 41 72 67 2d 3e 73 63 61 6e 73 74 61 74 73 4f 6e  Arg->scanstatsOn
15c00 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 70   ){.        disp
15c10 6c 61 79 5f 73 63 61 6e 73 74 61 74 73 28 64 62  lay_scanstats(db
15c20 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 20 20 7d  , pArg);.      }
15c30 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c  ..      /* Final
15c40 69 7a 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ize the statemen
15c50 74 20 6a 75 73 74 20 65 78 65 63 75 74 65 64 2e  t just executed.
15c60 20 49 66 20 74 68 69 73 20 66 61 69 6c 73 2c 20   If this fails, 
15c70 73 61 76 65 20 61 0a 20 20 20 20 20 20 2a 2a 20  save a.      ** 
15c80 63 6f 70 79 20 6f 66 20 74 68 65 20 65 72 72 6f  copy of the erro
15c90 72 20 6d 65 73 73 61 67 65 2e 20 4f 74 68 65 72  r message. Other
15ca0 77 69 73 65 2c 20 73 65 74 20 7a 53 71 6c 20 74  wise, set zSql t
15cb0 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20  o point to the. 
15cc0 20 20 20 20 20 2a 2a 20 6e 65 78 74 20 73 74 61       ** next sta
15cd0 74 65 6d 65 6e 74 20 74 6f 20 65 78 65 63 75 74  tement to execut
15ce0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 32 20  e. */.      rc2 
15cf0 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
15d00 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
15d10 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
15d20 4e 4f 4d 45 4d 20 29 20 72 63 20 3d 20 72 63 32  NOMEM ) rc = rc2
15d30 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
15d40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
15d50 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66       zSql = zLef
15d60 74 6f 76 65 72 3b 0a 20 20 20 20 20 20 20 20 77  tover;.        w
15d70 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 53  hile( IsSpace(zS
15d80 71 6c 5b 30 5d 29 20 29 20 7a 53 71 6c 2b 2b 3b  ql[0]) ) zSql++;
15d90 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
15da0 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20   pzErrMsg ){.   
15db0 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d       *pzErrMsg =
15dc0 20 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 64 62   save_err_msg(db
15dd0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
15de0 20 20 2f 2a 20 63 6c 65 61 72 20 73 61 76 65 64    /* clear saved
15df0 20 73 74 6d 74 20 68 61 6e 64 6c 65 20 2a 2f 0a   stmt handle */.
15e00 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20 29        if( pArg )
15e10 7b 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e  {.        pArg->
15e20 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20  pStmt = NULL;.  
15e30 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
15e40 2f 2a 20 65 6e 64 20 77 68 69 6c 65 20 2a 2f 0a  /* end while */.
15e50 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
15e60 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 6d  ./*.** Release m
15e70 65 6d 6f 72 79 20 70 72 65 76 69 6f 75 73 6c 79  emory previously
15e80 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 61   allocated by ta
15e90 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 29 2e  bleColumnList().
15ea0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
15eb0 66 72 65 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 63  freeColumnList(c
15ec0 68 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20 20  har **azCol){.  
15ed0 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 31  int i;.  for(i=1
15ee0 3b 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29  ; azCol[i]; i++)
15ef0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
15f00 65 65 28 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20  ee(azCol[i]);.  
15f10 7d 0a 20 20 2f 2a 20 61 7a 43 6f 6c 5b 30 5d 20  }.  /* azCol[0] 
15f20 69 73 20 61 20 73 74 61 74 69 63 20 73 74 72 69  is a static stri
15f30 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ng */.  sqlite3_
15f40 66 72 65 65 28 61 7a 43 6f 6c 29 3b 0a 7d 0a 0a  free(azCol);.}..
15f50 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6c  /*.** Return a l
15f60 69 73 74 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ist of pointers 
15f70 74 6f 20 73 74 72 69 6e 67 73 20 77 68 69 63 68  to strings which
15f80 20 61 72 65 20 74 68 65 20 6e 61 6d 65 73 20 6f   are the names o
15f90 66 20 61 6c 6c 0a 2a 2a 20 63 6f 6c 75 6d 6e 73  f all.** columns
15fa0 20 69 6e 20 74 61 62 6c 65 20 7a 54 61 62 2e 20   in table zTab. 
15fb0 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 74 6f 20    The memory to 
15fc0 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73 20 69  hold the names i
15fd0 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a  s dynamically.**
15fe0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6d   allocated and m
15ff0 75 73 74 20 62 65 20 72 65 6c 65 61 73 65 64 20  ust be released 
16000 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73  by the caller us
16010 69 6e 67 20 61 20 73 75 62 73 65 71 75 65 6e 74  ing a subsequent
16020 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 72 65 65   call.** to free
16030 43 6f 6c 75 6d 6e 4c 69 73 74 28 29 2e 0a 2a 2a  ColumnList()..**
16040 0a 2a 2a 20 54 68 65 20 61 7a 43 6f 6c 5b 30 5d  .** The azCol[0]
16050 20 65 6e 74 72 79 20 69 73 20 75 73 75 61 6c 6c   entry is usuall
16060 79 20 4e 55 4c 4c 2e 20 20 48 6f 77 65 76 65 72  y NULL.  However
16070 2c 20 69 66 20 7a 54 61 62 20 63 6f 6e 74 61 69  , if zTab contai
16080 6e 73 20 61 20 72 6f 77 69 64 0a 2a 2a 20 76 61  ns a rowid.** va
16090 6c 75 65 20 74 68 61 74 20 6e 65 65 64 73 20 74  lue that needs t
160a0 6f 20 62 65 20 70 72 65 73 65 72 76 65 64 2c 20  o be preserved, 
160b0 74 68 65 6e 20 61 7a 43 6f 6c 5b 30 5d 20 69 73  then azCol[0] is
160c0 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68 20   filled in with 
160d0 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74  the.** name of t
160e0 68 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 2e  he rowid column.
160f0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
16100 20 72 65 67 75 6c 61 72 20 63 6f 6c 75 6d 6e 20   regular column 
16110 69 6e 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  in the table is 
16120 61 7a 43 6f 6c 5b 31 5d 2e 20 20 54 68 65 20 6c  azCol[1].  The l
16130 69 73 74 20 69 73 20 74 65 72 6d 69 6e 61 74 65  ist is terminate
16140 64 0a 2a 2a 20 62 79 20 61 6e 20 65 6e 74 72 79  d.** by an entry
16150 20 77 69 74 68 20 61 7a 43 6f 6c 5b 69 5d 3d 3d   with azCol[i]==
16160 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  0..*/.static cha
16170 72 20 2a 2a 74 61 62 6c 65 43 6f 6c 75 6d 6e 4c  r **tableColumnL
16180 69 73 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  ist(ShellState *
16190 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
161a0 54 61 62 29 7b 0a 20 20 63 68 61 72 20 2a 2a 61  Tab){.  char **a
161b0 7a 43 6f 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69  zCol = 0;.  sqli
161c0 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
161d0 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
161e0 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20   int nCol = 0;. 
161f0 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b   int nAlloc = 0;
16200 0a 20 20 69 6e 74 20 6e 50 4b 20 3d 20 30 3b 20  .  int nPK = 0; 
16210 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
16220 6f 66 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  of PRIMARY KEY c
16230 6f 6c 75 6d 6e 73 20 73 65 65 6e 20 2a 2f 0a 20  olumns seen */. 
16240 20 69 6e 74 20 69 73 49 50 4b 20 3d 20 30 3b 20   int isIPK = 0; 
16250 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f      /* True if o
16260 6e 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  ne PRIMARY KEY c
16270 6f 6c 75 6d 6e 20 6f 66 20 74 79 70 65 20 49 4e  olumn of type IN
16280 54 45 47 45 52 20 2a 2f 0a 20 20 69 6e 74 20 70  TEGER */.  int p
16290 72 65 73 65 72 76 65 52 6f 77 69 64 20 3d 20 53  reserveRowid = S
162a0 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20 53  hellHasFlag(p, S
162b0 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52 6f 77  HFLG_PreserveRow
162c0 69 64 29 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  id);.  int rc;..
162d0 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
162e0 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41  _mprintf("PRAGMA
162f0 20 74 61 62 6c 65 5f 69 6e 66 6f 3d 25 51 22 2c   table_info=%Q",
16300 20 7a 54 61 62 29 3b 0a 20 20 72 63 20 3d 20 73   zTab);.  rc = s
16310 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
16320 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  2(p->db, zSql, -
16330 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
16340 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
16350 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ql);.  if( rc ) 
16360 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c  return 0;.  whil
16370 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  e( sqlite3_step(
16380 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
16390 4f 57 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 43  OW ){.    if( nC
163a0 6f 6c 3e 3d 6e 41 6c 6c 6f 63 2d 32 20 29 7b 0a  ol>=nAlloc-2 ){.
163b0 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20 3d 20 6e        nAlloc = n
163c0 41 6c 6c 6f 63 2a 32 20 2b 20 6e 43 6f 6c 20 2b  Alloc*2 + nCol +
163d0 20 31 30 3b 0a 20 20 20 20 20 20 61 7a 43 6f 6c   10;.      azCol
163e0 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
163f0 6f 63 28 61 7a 43 6f 6c 2c 20 6e 41 6c 6c 6f 63  oc(azCol, nAlloc
16400 2a 73 69 7a 65 6f 66 28 61 7a 43 6f 6c 5b 30 5d  *sizeof(azCol[0]
16410 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 7a  ));.      if( az
16420 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Col==0 ){.      
16430 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
16440 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6f 75 74  err, "Error: out
16450 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a   of memory\n");.
16460 20 20 20 20 20 20 20 20 65 78 69 74 28 31 29 3b          exit(1);
16470 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16480 20 20 20 61 7a 43 6f 6c 5b 2b 2b 6e 43 6f 6c 5d     azCol[++nCol]
16490 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
164a0 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33  tf("%s", sqlite3
164b0 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
164c0 6d 74 2c 20 31 29 29 3b 0a 20 20 20 20 69 66 28  mt, 1));.    if(
164d0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
164e0 69 6e 74 28 70 53 74 6d 74 2c 20 35 29 20 29 7b  int(pStmt, 5) ){
164f0 0a 20 20 20 20 20 20 6e 50 4b 2b 2b 3b 0a 20 20  .      nPK++;.  
16500 20 20 20 20 69 66 28 20 6e 50 4b 3d 3d 31 0a 20      if( nPK==1. 
16510 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
16520 5f 73 74 72 69 63 6d 70 28 28 63 6f 6e 73 74 20  _stricmp((const 
16530 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
16540 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
16550 32 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  2),.            
16560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 49                "I
16570 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 20  NTEGER")==0.    
16580 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 49    ){.        isI
16590 50 4b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  PK = 1;.      }e
165a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73 49  lse{.        isI
165b0 50 4b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  PK = 0;.      }.
165c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
165d0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
165e0 6d 74 29 3b 0a 20 20 69 66 28 20 61 7a 43 6f 6c  mt);.  if( azCol
165f0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
16600 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 30 3b 0a    azCol[0] = 0;.
16610 20 20 61 7a 43 6f 6c 5b 6e 43 6f 6c 2b 31 5d 20    azCol[nCol+1] 
16620 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64  = 0;..  /* The d
16630 65 63 69 73 69 6f 6e 20 6f 66 20 77 68 65 74 68  ecision of wheth
16640 65 72 20 6f 72 20 6e 6f 74 20 61 20 72 6f 77 69  er or not a rowi
16650 64 20 72 65 61 6c 6c 79 20 6e 65 65 64 73 20 74  d really needs t
16660 6f 20 62 65 20 70 72 65 73 65 72 76 65 64 0a 20  o be preserved. 
16670 20 2a 2a 20 69 73 20 74 72 69 63 6b 79 2e 20 20   ** is tricky.  
16680 57 65 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f  We never need to
16690 20 70 72 65 73 65 72 76 65 20 61 20 72 6f 77 69   preserve a rowi
166a0 64 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20  d for a WITHOUT 
166b0 52 4f 57 49 44 20 74 61 62 6c 65 0a 20 20 2a 2a  ROWID table.  **
166c0 20 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68   or a table with
166d0 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
166e0 41 52 59 20 4b 45 59 2e 20 20 57 65 20 61 72 65  ARY KEY.  We are
166f0 20 75 6e 61 62 6c 65 20 74 6f 20 70 72 65 73 65   unable to prese
16700 72 76 65 0a 20 20 2a 2a 20 72 6f 77 69 64 73 20  rve.  ** rowids 
16710 6f 6e 20 74 61 62 6c 65 73 20 77 68 65 72 65 20  on tables where 
16720 74 68 65 20 72 6f 77 69 64 20 69 73 20 69 6e 61  the rowid is ina
16730 63 63 65 73 73 69 62 6c 65 20 62 65 63 61 75 73  ccessible becaus
16740 65 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65  e there are othe
16750 72 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69  r.  ** columns i
16760 6e 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  n the table name
16770 64 20 22 72 6f 77 69 64 22 2c 20 22 5f 72 6f 77  d "rowid", "_row
16780 69 64 5f 22 2c 20 61 6e 64 20 22 6f 69 64 22 2e  id_", and "oid".
16790 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 65 73  .  */.  if( pres
167a0 65 72 76 65 52 6f 77 69 64 20 26 26 20 69 73 49  erveRowid && isI
167b0 50 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  PK ){.    /* If 
167c0 61 20 73 69 6e 67 6c 65 20 50 52 49 4d 41 52 59  a single PRIMARY
167d0 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 77 69 74 68   KEY column with
167e0 20 74 79 70 65 20 49 4e 54 45 47 45 52 20 77 61   type INTEGER wa
167f0 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 69 74 0a  s seen, then it.
16800 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20      ** might be 
16810 61 6e 20 61 6c 69 73 65 20 66 6f 72 20 74 68 65  an alise for the
16820 20 52 4f 57 49 44 2e 20 20 42 75 74 20 69 74 20   ROWID.  But it 
16830 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 61 20  might also be a 
16840 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20  WITHOUT ROWID.  
16850 20 20 2a 2a 20 74 61 62 6c 65 20 6f 72 20 61 20    ** table or a 
16860 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
16870 4b 45 59 20 44 45 53 43 20 63 6f 6c 75 6d 6e 2c  KEY DESC column,
16880 20 6e 65 69 74 68 65 72 20 6f 66 20 77 68 69 63   neither of whic
16890 68 20 61 72 65 0a 20 20 20 20 2a 2a 20 52 4f 57  h are.    ** ROW
168a0 49 44 20 61 6c 69 61 73 65 73 2e 20 20 54 6f 20  ID aliases.  To 
168b0 64 69 73 74 69 6e 67 75 69 73 68 20 74 68 65 73  distinguish thes
168c0 65 20 63 61 73 65 73 2c 20 63 68 65 63 6b 20 74  e cases, check t
168d0 6f 20 73 65 65 20 69 66 0a 20 20 20 20 2a 2a 20  o see if.    ** 
168e0 74 68 65 72 65 20 69 73 20 61 20 22 70 6b 22 20  there is a "pk" 
168f0 65 6e 74 72 79 20 69 6e 20 22 50 52 41 47 4d 41  entry in "PRAGMA
16900 20 69 6e 64 65 78 5f 6c 69 73 74 22 2e 20 20 54   index_list".  T
16910 68 65 72 65 20 77 69 6c 6c 20 62 65 0a 20 20 20  here will be.   
16920 20 2a 2a 20 6e 6f 20 22 70 6b 22 20 69 6e 64 65   ** no "pk" inde
16930 78 20 69 66 20 74 68 65 20 50 52 49 4d 41 52 59  x if the PRIMARY
16940 20 4b 45 59 20 72 65 61 6c 6c 79 20 69 73 20 61   KEY really is a
16950 6e 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20  n alias for the 
16960 52 4f 57 49 44 2e 0a 20 20 20 20 2a 2f 0a 20 20  ROWID..    */.  
16970 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
16980 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
16990 20 31 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 69   1 FROM pragma_i
169a0 6e 64 65 78 5f 6c 69 73 74 28 25 51 29 22 0a 20  ndex_list(%Q)". 
169b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169c0 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
169d0 45 20 6f 72 69 67 69 6e 3d 27 70 6b 27 22 2c 20  E origin='pk'", 
169e0 7a 54 61 62 29 3b 0a 20 20 20 20 72 63 20 3d 20  zTab);.    rc = 
169f0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
16a00 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  v2(p->db, zSql, 
16a10 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
16a20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
16a30 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20  (zSql);.    if( 
16a40 72 63 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65  rc ){.      free
16a50 43 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c  ColumnList(azCol
16a60 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
16a70 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  0;.    }.    rc 
16a80 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
16a90 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Stmt);.    sqlit
16aa0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
16ab0 74 29 3b 0a 20 20 20 20 70 72 65 73 65 72 76 65  t);.    preserve
16ac0 52 6f 77 69 64 20 3d 20 72 63 3d 3d 53 51 4c 49  Rowid = rc==SQLI
16ad0 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 69 66  TE_ROW;.  }.  if
16ae0 28 20 70 72 65 73 65 72 76 65 52 6f 77 69 64 20  ( preserveRowid 
16af0 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 70  ){.    /* Only p
16b00 72 65 73 65 72 76 65 20 74 68 65 20 72 6f 77 69  reserve the rowi
16b10 64 20 69 66 20 77 65 20 63 61 6e 20 66 69 6e 64  d if we can find
16b20 20 61 20 6e 61 6d 65 20 74 6f 20 75 73 65 20 66   a name to use f
16b30 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f  or the.    ** ro
16b40 77 69 64 20 2a 2f 0a 20 20 20 20 73 74 61 74 69  wid */.    stati
16b50 63 20 63 68 61 72 20 2a 61 7a 52 6f 77 69 64 5b  c char *azRowid[
16b60 5d 20 3d 20 7b 20 22 72 6f 77 69 64 22 2c 20 22  ] = { "rowid", "
16b70 5f 72 6f 77 69 64 5f 22 2c 20 22 6f 69 64 22 20  _rowid_", "oid" 
16b80 7d 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  };.    int i, j;
16b90 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
16ba0 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 66  3; j++){.      f
16bb0 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 43 6f 6c 3b  or(i=1; i<=nCol;
16bc0 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
16bd0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
16be0 6d 70 28 61 7a 52 6f 77 69 64 5b 6a 5d 2c 61 7a  mp(azRowid[j],az
16bf0 43 6f 6c 5b 69 5d 29 3d 3d 30 20 29 20 62 72 65  Col[i])==0 ) bre
16c00 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
16c10 20 20 69 66 28 20 69 3e 6e 43 6f 6c 20 29 7b 0a    if( i>nCol ){.
16c20 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68          /* At th
16c30 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f  is point, we kno
16c40 77 20 74 68 61 74 20 61 7a 52 6f 77 69 64 5b 6a  w that azRowid[j
16c50 5d 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d  ] is not the nam
16c60 65 20 6f 66 20 61 6e 79 0a 20 20 20 20 20 20 20  e of any.       
16c70 20 2a 2a 20 6f 72 64 69 6e 61 72 79 20 63 6f 6c   ** ordinary col
16c80 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65  umn in the table
16c90 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20 61  .  Verify that a
16ca0 7a 52 6f 77 69 64 5b 6a 5d 20 69 73 20 61 20 76  zRowid[j] is a v
16cb0 61 6c 69 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  alid.        ** 
16cc0 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 72 6f 77  name for the row
16cd0 69 64 20 62 65 66 6f 72 65 20 61 64 64 69 6e 67  id before adding
16ce0 20 69 74 20 74 6f 20 61 7a 43 6f 6c 5b 30 5d 2e   it to azCol[0].
16cf0 20 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a    WITHOUT ROWID.
16d00 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
16d10 73 20 77 69 6c 6c 20 66 61 69 6c 20 74 68 69 73  s will fail this
16d20 20 6c 61 73 74 20 63 68 65 63 6b 20 2a 2f 0a 20   last check */. 
16d30 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
16d40 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
16d50 5f 6d 65 74 61 64 61 74 61 28 70 2d 3e 64 62 2c  _metadata(p->db,
16d60 30 2c 7a 54 61 62 2c 61 7a 52 6f 77 69 64 5b 6a  0,zTab,azRowid[j
16d70 5d 2c 30 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20 20  ],0,0,0,0,0);.  
16d80 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
16d90 4c 49 54 45 5f 4f 4b 20 29 20 61 7a 43 6f 6c 5b  LITE_OK ) azCol[
16da0 30 5d 20 3d 20 61 7a 52 6f 77 69 64 5b 6a 5d 3b  0] = azRowid[j];
16db0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
16dc0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
16dd0 7d 0a 20 20 72 65 74 75 72 6e 20 61 7a 43 6f 6c  }.  return azCol
16de0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 67 67 6c  ;.}../*.** Toggl
16df0 65 20 74 68 65 20 72 65 76 65 72 73 65 5f 75 6e  e the reverse_un
16e00 6f 72 64 65 72 65 64 5f 73 65 6c 65 63 74 73 20  ordered_selects 
16e10 73 65 74 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  setting..*/.stat
16e20 69 63 20 76 6f 69 64 20 74 6f 67 67 6c 65 53 65  ic void toggleSe
16e30 6c 65 63 74 4f 72 64 65 72 28 73 71 6c 69 74 65  lectOrder(sqlite
16e40 33 20 2a 64 62 29 7b 0a 20 20 73 71 6c 69 74 65  3 *db){.  sqlite
16e50 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
16e60 30 3b 0a 20 20 69 6e 74 20 69 53 65 74 74 69 6e  0;.  int iSettin
16e70 67 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 53  g = 0;.  char zS
16e80 74 6d 74 5b 31 30 30 5d 3b 0a 20 20 73 71 6c 69  tmt[100];.  sqli
16e90 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
16ea0 62 2c 20 22 50 52 41 47 4d 41 20 72 65 76 65 72  b, "PRAGMA rever
16eb0 73 65 5f 75 6e 6f 72 64 65 72 65 64 5f 73 65 6c  se_unordered_sel
16ec0 65 63 74 73 22 2c 20 2d 31 2c 20 26 70 53 74 6d  ects", -1, &pStm
16ed0 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 73 71 6c  t, 0);.  if( sql
16ee0 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
16ef0 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
16f00 20 20 20 20 69 53 65 74 74 69 6e 67 20 3d 20 73      iSetting = s
16f10 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
16f20 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d  t(pStmt, 0);.  }
16f30 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
16f40 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 73 71  ize(pStmt);.  sq
16f50 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
16f60 69 7a 65 6f 66 28 7a 53 74 6d 74 29 2c 20 7a 53  izeof(zStmt), zS
16f70 74 6d 74 2c 0a 20 20 20 20 20 20 20 22 50 52 41  tmt,.       "PRA
16f80 47 4d 41 20 72 65 76 65 72 73 65 5f 75 6e 6f 72  GMA reverse_unor
16f90 64 65 72 65 64 5f 73 65 6c 65 63 74 73 28 25 64  dered_selects(%d
16fa0 29 22 2c 20 21 69 53 65 74 74 69 6e 67 29 3b 0a  )", !iSetting);.
16fb0 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64    sqlite3_exec(d
16fc0 62 2c 20 7a 53 74 6d 74 2c 20 30 2c 20 30 2c 20  b, zStmt, 0, 0, 
16fd0 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  0);.}../*.** Thi
16fe0 73 20 69 73 20 61 20 64 69 66 66 65 72 65 6e 74  s is a different
16ff0 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
17000 65 20 75 73 65 64 20 66 6f 72 20 64 75 6d 70 69  e used for dumpi
17010 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ng the database.
17020 0a 2a 2a 20 45 61 63 68 20 72 6f 77 20 72 65 63  .** Each row rec
17030 65 69 76 65 64 20 62 79 20 74 68 69 73 20 63 61  eived by this ca
17040 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20  llback consists 
17050 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 2c  of a table name,
17060 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74 79  .** the table ty
17070 70 65 20 28 22 69 6e 64 65 78 22 20 6f 72 20 22  pe ("index" or "
17080 74 61 62 6c 65 22 29 20 61 6e 64 20 53 51 4c 20  table") and SQL 
17090 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61  to create the ta
170a0 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ble..** This rou
170b0 74 69 6e 65 20 73 68 6f 75 6c 64 20 70 72 69 6e  tine should prin
170c0 74 20 74 65 78 74 20 73 75 66 66 69 63 69 65 6e  t text sufficien
170d0 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 74 68  t to recreate th
170e0 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  e table..*/.stat
170f0 69 63 20 69 6e 74 20 64 75 6d 70 5f 63 61 6c 6c  ic int dump_call
17100 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c  back(void *pArg,
17110 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20   int nArg, char 
17120 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a  **azArg, char **
17130 61 7a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 69 6e  azNotUsed){.  in
17140 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68  t rc;.  const ch
17150 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 63 6f  ar *zTable;.  co
17160 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
17170 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
17180 53 71 6c 3b 0a 20 20 53 68 65 6c 6c 53 74 61 74  Sql;.  ShellStat
17190 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61  e *p = (ShellSta
171a0 74 65 20 2a 29 70 41 72 67 3b 0a 0a 20 20 55 4e  te *)pArg;..  UN
171b0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
171c0 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28  zNotUsed);.  if(
171d0 20 6e 41 72 67 21 3d 33 20 7c 7c 20 61 7a 41 72   nArg!=3 || azAr
171e0 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  g==0 ) return 0;
171f0 0a 20 20 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72  .  zTable = azAr
17200 67 5b 30 5d 3b 0a 20 20 7a 54 79 70 65 20 3d 20  g[0];.  zType = 
17210 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 7a 53 71 6c  azArg[1];.  zSql
17220 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 0a 20 20   = azArg[2];..  
17230 69 66 28 20 73 74 72 63 6d 70 28 7a 54 61 62 6c  if( strcmp(zTabl
17240 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65  e, "sqlite_seque
17250 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nce")==0 ){.    
17260 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
17270 74 2c 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  t, "DELETE FROM 
17280 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 3b  sqlite_sequence;
17290 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  \n");.  }else if
172a0 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  ( sqlite3_strglo
172b0 62 28 22 73 71 6c 69 74 65 5f 73 74 61 74 3f 22  b("sqlite_stat?"
172c0 2c 20 7a 54 61 62 6c 65 29 3d 3d 30 20 29 7b 0a  , zTable)==0 ){.
172d0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
172e0 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20  ->out, "ANALYZE 
172f0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e  sqlite_master;\n
17300 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ");.  }else if( 
17310 73 74 72 6e 63 6d 70 28 7a 54 61 62 6c 65 2c 20  strncmp(zTable, 
17320 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30  "sqlite_", 7)==0
17330 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
17340 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
17350 72 6e 63 6d 70 28 7a 53 71 6c 2c 20 22 43 52 45  rncmp(zSql, "CRE
17360 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
17370 45 22 2c 20 32 30 29 3d 3d 30 20 29 7b 0a 20 20  E", 20)==0 ){.  
17380 20 20 63 68 61 72 20 2a 7a 49 6e 73 3b 0a 20 20    char *zIns;.  
17390 20 20 69 66 28 20 21 70 2d 3e 77 72 69 74 61 62    if( !p->writab
173a0 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  leSchema ){.    
173b0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
173c0 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 77 72 69  out, "PRAGMA wri
173d0 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 3b  table_schema=ON;
173e0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77  \n");.      p->w
173f0 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20  ritableSchema = 
17400 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 49 6e  1;.    }.    zIn
17410 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  s = sqlite3_mpri
17420 6e 74 66 28 0a 20 20 20 20 20 20 20 22 49 4e 53  ntf(.       "INS
17430 45 52 54 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f  ERT INTO sqlite_
17440 6d 61 73 74 65 72 28 74 79 70 65 2c 6e 61 6d 65  master(type,name
17450 2c 74 62 6c 5f 6e 61 6d 65 2c 72 6f 6f 74 70 61  ,tbl_name,rootpa
17460 67 65 2c 73 71 6c 29 22 0a 20 20 20 20 20 20 20  ge,sql)".       
17470 22 56 41 4c 55 45 53 28 27 74 61 62 6c 65 27 2c  "VALUES('table',
17480 27 25 71 27 2c 27 25 71 27 2c 30 2c 27 25 71 27  '%q','%q',0,'%q'
17490 29 3b 22 2c 0a 20 20 20 20 20 20 20 7a 54 61 62  );",.       zTab
174a0 6c 65 2c 20 7a 54 61 62 6c 65 2c 20 7a 53 71 6c  le, zTable, zSql
174b0 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  );.    utf8_prin
174c0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  tf(p->out, "%s\n
174d0 22 2c 20 7a 49 6e 73 29 3b 0a 20 20 20 20 73 71  ", zIns);.    sq
174e0 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6e 73 29  lite3_free(zIns)
174f0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
17500 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 72 69    }else{.    pri
17510 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e  ntSchemaLine(p->
17520 6f 75 74 2c 20 7a 53 71 6c 2c 20 22 3b 5c 6e 22  out, zSql, ";\n"
17530 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73 74  );.  }..  if( st
17540 72 63 6d 70 28 7a 54 79 70 65 2c 20 22 74 61 62  rcmp(zType, "tab
17550 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53  le")==0 ){.    S
17560 68 65 6c 6c 54 65 78 74 20 73 53 65 6c 65 63 74  hellText sSelect
17570 3b 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20  ;.    ShellText 
17580 73 54 61 62 6c 65 3b 0a 20 20 20 20 63 68 61 72  sTable;.    char
17590 20 2a 2a 61 7a 43 6f 6c 3b 0a 20 20 20 20 69 6e   **azCol;.    in
175a0 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20 2a 73  t i;.    char *s
175b0 61 76 65 64 44 65 73 74 54 61 62 6c 65 3b 0a 20  avedDestTable;. 
175c0 20 20 20 69 6e 74 20 73 61 76 65 64 4d 6f 64 65     int savedMode
175d0 3b 0a 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 74  ;..    azCol = t
175e0 61 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 70  ableColumnList(p
175f0 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69  , zTable);.    i
17600 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20  f( azCol==0 ){. 
17610 20 20 20 20 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a       p->nErr++;.
17620 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
17630 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c      }..    /* Al
17640 77 61 79 73 20 71 75 6f 74 65 20 74 68 65 20 74  ways quote the t
17650 61 62 6c 65 20 6e 61 6d 65 2c 20 65 76 65 6e 20  able name, even 
17660 69 66 20 69 74 20 61 70 70 65 61 72 73 20 74 6f  if it appears to
17670 20 62 65 20 70 75 72 65 20 61 73 63 69 69 2c 0a   be pure ascii,.
17680 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 69      ** in case i
17690 74 20 69 73 20 61 20 6b 65 79 77 6f 72 64 2e 20  t is a keyword. 
176a0 45 78 3a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  Ex:  INSERT INTO
176b0 20 22 74 61 62 6c 65 22 20 2e 2e 2e 20 2a 2f 0a   "table" ... */.
176c0 20 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 54      initText(&sT
176d0 61 62 6c 65 29 3b 0a 20 20 20 20 61 70 70 65 6e  able);.    appen
176e0 64 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20 7a  dText(&sTable, z
176f0 54 61 62 6c 65 2c 20 71 75 6f 74 65 43 68 61 72  Table, quoteChar
17700 28 7a 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 2f  (zTable));.    /
17710 2a 20 49 66 20 70 72 65 73 65 72 76 69 6e 67 20  * If preserving 
17720 74 68 65 20 72 6f 77 69 64 2c 20 61 64 64 20 61  the rowid, add a
17730 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 61 66 74   column list aft
17740 65 72 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  er the table nam
17750 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 74 68  e..    ** In oth
17760 65 72 20 77 6f 72 64 73 3a 20 20 22 49 4e 53 45  er words:  "INSE
17770 52 54 20 49 4e 54 4f 20 74 61 62 28 72 6f 77 69  RT INTO tab(rowi
17780 64 2c 61 2c 62 2c 63 2c 2e 2e 2e 29 20 56 41 4c  d,a,b,c,...) VAL
17790 55 45 53 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a  UES(...)".    **
177a0 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
177b0 75 73 75 61 6c 20 22 49 4e 53 45 52 54 20 49 4e  usual "INSERT IN
177c0 54 4f 20 74 61 62 20 56 41 4c 55 45 53 28 2e 2e  TO tab VALUES(..
177d0 2e 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  .)"..    */.    
177e0 69 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b 0a  if( azCol[0] ){.
177f0 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
17800 28 26 73 54 61 62 6c 65 2c 20 22 28 22 2c 20 30  (&sTable, "(", 0
17810 29 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54  );.      appendT
17820 65 78 74 28 26 73 54 61 62 6c 65 2c 20 61 7a 43  ext(&sTable, azC
17830 6f 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20  ol[0], 0);.     
17840 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b   for(i=1; azCol[
17850 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
17860 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 54    appendText(&sT
17870 61 62 6c 65 2c 20 22 2c 22 2c 20 30 29 3b 0a 20  able, ",", 0);. 
17880 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
17890 74 28 26 73 54 61 62 6c 65 2c 20 61 7a 43 6f 6c  t(&sTable, azCol
178a0 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28 61  [i], quoteChar(a
178b0 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20 20  zCol[i]));.     
178c0 20 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54   }.      appendT
178d0 65 78 74 28 26 73 54 61 62 6c 65 2c 20 22 29 22  ext(&sTable, ")"
178e0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  , 0);.    }..   
178f0 20 2f 2a 20 42 75 69 6c 64 20 61 6e 20 61 70 70   /* Build an app
17900 72 6f 70 72 69 61 74 65 20 53 45 4c 45 43 54 20  ropriate SELECT 
17910 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
17920 20 69 6e 69 74 54 65 78 74 28 26 73 53 65 6c 65   initText(&sSele
17930 63 74 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54  ct);.    appendT
17940 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 53  ext(&sSelect, "S
17950 45 4c 45 43 54 20 22 2c 20 30 29 3b 0a 20 20 20  ELECT ", 0);.   
17960 20 69 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b   if( azCol[0] ){
17970 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
17980 74 28 26 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f  t(&sSelect, azCo
17990 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  l[0], 0);.      
179a0 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
179b0 65 63 74 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20  ect, ",", 0);.  
179c0 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b    }.    for(i=1;
179d0 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29 7b   azCol[i]; i++){
179e0 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
179f0 74 28 26 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f  t(&sSelect, azCo
17a00 6c 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28  l[i], quoteChar(
17a10 61 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20  azCol[i]));.    
17a20 20 20 69 66 28 20 61 7a 43 6f 6c 5b 69 2b 31 5d    if( azCol[i+1]
17a30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65   ){.        appe
17a40 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
17a50 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20   ",", 0);.      
17a60 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  }.    }.    free
17a70 43 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c  ColumnList(azCol
17a80 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78  );.    appendTex
17a90 74 28 26 73 53 65 6c 65 63 74 2c 20 22 20 46 52  t(&sSelect, " FR
17aa0 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 61 70  OM ", 0);.    ap
17ab0 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63  pendText(&sSelec
17ac0 74 2c 20 7a 54 61 62 6c 65 2c 20 71 75 6f 74 65  t, zTable, quote
17ad0 43 68 61 72 28 7a 54 61 62 6c 65 29 29 3b 0a 0a  Char(zTable));..
17ae0 20 20 20 20 73 61 76 65 64 44 65 73 74 54 61 62      savedDestTab
17af0 6c 65 20 3d 20 70 2d 3e 7a 44 65 73 74 54 61 62  le = p->zDestTab
17b00 6c 65 3b 0a 20 20 20 20 73 61 76 65 64 4d 6f 64  le;.    savedMod
17b10 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20  e = p->mode;.   
17b20 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d   p->zDestTable =
17b30 20 73 54 61 62 6c 65 2e 7a 3b 0a 20 20 20 20 70   sTable.z;.    p
17b40 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 63 4d 6f 64  ->mode = p->cMod
17b50 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b  e = MODE_Insert;
17b60 0a 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f  .    rc = shell_
17b70 65 78 65 63 28 70 2c 20 73 53 65 6c 65 63 74 2e  exec(p, sSelect.
17b80 7a 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 28  z, 0);.    if( (
17b90 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  rc&0xff)==SQLITE
17ba0 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20 20 20 20  _CORRUPT ){.    
17bb0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
17bc0 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f  out, "/****** CO
17bd0 52 52 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a  RRUPTION ERROR *
17be0 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20  ******/\n");.   
17bf0 20 20 20 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f     toggleSelectO
17c00 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20 20  rder(p->db);.   
17c10 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2c     shell_exec(p,
17c20 20 73 53 65 6c 65 63 74 2e 7a 2c 20 30 29 3b 0a   sSelect.z, 0);.
17c30 20 20 20 20 20 20 74 6f 67 67 6c 65 53 65 6c 65        toggleSele
17c40 63 74 4f 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a  ctOrder(p->db);.
17c50 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 44 65      }.    p->zDe
17c60 73 74 54 61 62 6c 65 20 3d 20 73 61 76 65 64 44  stTable = savedD
17c70 65 73 74 54 61 62 6c 65 3b 0a 20 20 20 20 70 2d  estTable;.    p-
17c80 3e 6d 6f 64 65 20 3d 20 73 61 76 65 64 4d 6f 64  >mode = savedMod
17c90 65 3b 0a 20 20 20 20 66 72 65 65 54 65 78 74 28  e;.    freeText(
17ca0 26 73 54 61 62 6c 65 29 3b 0a 20 20 20 20 66 72  &sTable);.    fr
17cb0 65 65 54 65 78 74 28 26 73 53 65 6c 65 63 74 29  eeText(&sSelect)
17cc0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 70  ;.    if( rc ) p
17cd0 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20  ->nErr++;.  }.  
17ce0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
17cf0 2a 2a 20 52 75 6e 20 7a 51 75 65 72 79 2e 20 20  ** Run zQuery.  
17d00 55 73 65 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63  Use dump_callbac
17d10 6b 28 29 20 61 73 20 74 68 65 20 63 61 6c 6c 62  k() as the callb
17d20 61 63 6b 20 72 6f 75 74 69 6e 65 20 73 6f 20 74  ack routine so t
17d30 68 61 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65  hat.** the conte
17d40 6e 74 73 20 6f 66 20 74 68 65 20 71 75 65 72 79  nts of the query
17d50 20 61 72 65 20 6f 75 74 70 75 74 20 61 73 20 53   are output as S
17d60 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  QL statements..*
17d70 2a 0a 2a 2a 20 49 66 20 77 65 20 67 65 74 20 61  *.** If we get a
17d80 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20   SQLITE_CORRUPT 
17d90 65 72 72 6f 72 2c 20 72 65 72 75 6e 20 74 68 65  error, rerun the
17da0 20 71 75 65 72 79 20 61 66 74 65 72 20 61 70 70   query after app
17db0 65 6e 64 69 6e 67 0a 2a 2a 20 22 4f 52 44 45 52  ending.** "ORDER
17dc0 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 20   BY rowid DESC" 
17dd0 74 6f 20 74 68 65 20 65 6e 64 2e 0a 2a 2f 0a 73  to the end..*/.s
17de0 74 61 74 69 63 20 69 6e 74 20 72 75 6e 5f 73 63  tatic int run_sc
17df0 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28  hema_dump_query(
17e00 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
17e10 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
17e20 7a 51 75 65 72 79 0a 29 7b 0a 20 20 69 6e 74 20  zQuery.){.  int 
17e30 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  rc;.  char *zErr
17e40 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 0;.  rc = sql
17e50 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
17e60 20 7a 51 75 65 72 79 2c 20 64 75 6d 70 5f 63 61   zQuery, dump_ca
17e70 6c 6c 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72  llback, p, &zErr
17e80 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
17e90 49 54 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20  ITE_CORRUPT ){. 
17ea0 20 20 20 63 68 61 72 20 2a 7a 51 32 3b 0a 20 20     char *zQ2;.  
17eb0 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c    int len = strl
17ec0 65 6e 33 30 28 7a 51 75 65 72 79 29 3b 0a 20 20  en30(zQuery);.  
17ed0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
17ee0 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f  out, "/****** CO
17ef0 52 52 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a  RRUPTION ERROR *
17f00 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20  ******/\n");.   
17f10 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20   if( zErr ){.   
17f20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
17f30 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20  ->out, "/****** 
17f40 25 73 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 7a  %s ******/\n", z
17f50 45 72 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Err);.      sqli
17f60 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a  te3_free(zErr);.
17f70 20 20 20 20 20 20 7a 45 72 72 20 3d 20 30 3b 0a        zErr = 0;.
17f80 20 20 20 20 7d 0a 20 20 20 20 7a 51 32 20 3d 20      }.    zQ2 = 
17f90 6d 61 6c 6c 6f 63 28 20 6c 65 6e 2b 31 30 30 20  malloc( len+100 
17fa0 29 3b 0a 20 20 20 20 69 66 28 20 7a 51 32 3d 3d  );.    if( zQ2==
17fb0 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20  0 ) return rc;. 
17fc0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
17fd0 6e 74 66 28 6c 65 6e 2b 31 30 30 2c 20 7a 51 32  ntf(len+100, zQ2
17fe0 2c 20 22 25 73 20 4f 52 44 45 52 20 42 59 20 72  , "%s ORDER BY r
17ff0 6f 77 69 64 20 44 45 53 43 22 2c 20 7a 51 75 65  owid DESC", zQue
18000 72 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  ry);.    rc = sq
18010 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
18020 2c 20 7a 51 32 2c 20 64 75 6d 70 5f 63 61 6c 6c  , zQ2, dump_call
18030 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b  back, p, &zErr);
18040 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
18050 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
18060 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a  (p->out, "/*****
18070 2a 20 45 52 52 4f 52 3a 20 25 73 20 2a 2a 2a 2a  * ERROR: %s ****
18080 2a 2a 2f 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20  **/\n", zErr);. 
18090 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
180a0 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52  rc = SQLITE_CORR
180b0 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  UPT;.    }.    s
180c0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
180d0 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 51 32 29  );.    free(zQ2)
180e0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
180f0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 78 74  c;.}../*.** Text
18100 20 6f 66 20 61 20 68 65 6c 70 20 6d 65 73 73 61   of a help messa
18110 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  ge.*/.static cha
18120 72 20 7a 48 65 6c 70 5b 5d 20 3d 0a 23 69 66 20  r zHelp[] =.#if 
18130 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 48  defined(SQLITE_H
18140 41 56 45 5f 5a 4c 49 42 29 20 26 26 20 21 64 65  AVE_ZLIB) && !de
18150 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
18160 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 0a  T_VIRTUALTABLE).
18170 20 20 22 2e 61 72 63 68 69 76 65 20 2e 2e 2e 20    ".archive ... 
18180 20 20 20 20 20 20 20 20 20 20 4d 61 6e 61 67 65            Manage
18190 20 53 51 4c 20 61 72 63 68 69 76 65 73 3a 20 5c   SQL archives: \
181a0 22 2e 61 72 63 68 69 76 65 20 2d 2d 68 65 6c 70  ".archive --help
181b0 5c 22 20 66 6f 72 20 64 65 74 61 69 6c 73 5c 6e  \" for details\n
181c0 22 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65 66  ".#endif.#ifndef
181d0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
181e0 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 22 2e 61  HORIZATION.  ".a
181f0 75 74 68 20 4f 4e 7c 4f 46 46 20 20 20 20 20 20  uth ON|OFF      
18200 20 20 20 20 20 53 68 6f 77 20 61 75 74 68 6f 72       Show author
18210 69 7a 65 72 20 63 61 6c 6c 62 61 63 6b 73 5c 6e  izer callbacks\n
18220 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e 62 61 63  ".#endif.  ".bac
18230 6b 75 70 20 3f 44 42 3f 20 46 49 4c 45 20 20 20  kup ?DB? FILE   
18240 20 20 20 42 61 63 6b 75 70 20 44 42 20 28 64 65     Backup DB (de
18250 66 61 75 6c 74 20 5c 22 6d 61 69 6e 5c 22 29 20  fault \"main\") 
18260 74 6f 20 46 49 4c 45 5c 6e 22 0a 20 20 22 2e 62  to FILE\n".  ".b
18270 61 69 6c 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20  ail on|off      
18280 20 20 20 20 20 53 74 6f 70 20 61 66 74 65 72 20       Stop after 
18290 68 69 74 74 69 6e 67 20 61 6e 20 65 72 72 6f 72  hitting an error
182a0 2e 20 20 44 65 66 61 75 6c 74 20 4f 46 46 5c 6e  .  Default OFF\n
182b0 22 0a 20 20 22 2e 62 69 6e 61 72 79 20 6f 6e 7c  ".  ".binary on|
182c0 6f 66 66 20 20 20 20 20 20 20 20 20 54 75 72 6e  off         Turn
182d0 20 62 69 6e 61 72 79 20 6f 75 74 70 75 74 20 6f   binary output o
182e0 6e 20 6f 72 20 6f 66 66 2e 20 20 44 65 66 61 75  n or off.  Defau
182f0 6c 74 20 4f 46 46 5c 6e 22 0a 20 20 22 2e 63 64  lt OFF\n".  ".cd
18300 20 44 49 52 45 43 54 4f 52 59 20 20 20 20 20 20   DIRECTORY      
18310 20 20 20 20 43 68 61 6e 67 65 20 74 68 65 20 77      Change the w
18320 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79  orking directory
18330 20 74 6f 20 44 49 52 45 43 54 4f 52 59 5c 6e 22   to DIRECTORY\n"
18340 0a 20 20 22 2e 63 68 61 6e 67 65 73 20 6f 6e 7c  .  ".changes on|
18350 6f 66 66 20 20 20 20 20 20 20 20 53 68 6f 77 20  off        Show 
18360 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20 63  number of rows c
18370 68 61 6e 67 65 64 20 62 79 20 53 51 4c 5c 6e 22  hanged by SQL\n"
18380 0a 20 20 22 2e 63 68 65 63 6b 20 47 4c 4f 42 20  .  ".check GLOB 
18390 20 20 20 20 20 20 20 20 20 20 20 46 61 69 6c 20             Fail 
183a0 69 66 20 6f 75 74 70 75 74 20 73 69 6e 63 65 20  if output since 
183b0 2e 74 65 73 74 63 61 73 65 20 64 6f 65 73 20 6e  .testcase does n
183c0 6f 74 20 6d 61 74 63 68 5c 6e 22 0a 20 20 22 2e  ot match\n".  ".
183d0 63 6c 6f 6e 65 20 4e 45 57 44 42 20 20 20 20 20  clone NEWDB     
183e0 20 20 20 20 20 20 43 6c 6f 6e 65 20 64 61 74 61        Clone data
183f0 20 69 6e 74 6f 20 4e 45 57 44 42 20 66 72 6f 6d   into NEWDB from
18400 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 64 61   the existing da
18410 74 61 62 61 73 65 5c 6e 22 0a 20 20 22 2e 64 61  tabase\n".  ".da
18420 74 61 62 61 73 65 73 20 20 20 20 20 20 20 20 20  tabases         
18430 20 20 20 20 4c 69 73 74 20 6e 61 6d 65 73 20 61      List names a
18440 6e 64 20 66 69 6c 65 73 20 6f 66 20 61 74 74 61  nd files of atta
18450 63 68 65 64 20 64 61 74 61 62 61 73 65 73 5c 6e  ched databases\n
18460 22 0a 20 20 22 2e 64 62 69 6e 66 6f 20 3f 44 42  ".  ".dbinfo ?DB
18470 3f 20 20 20 20 20 20 20 20 20 20 20 53 68 6f 77  ?           Show
18480 20 73 74 61 74 75 73 20 69 6e 66 6f 72 6d 61 74   status informat
18490 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 64 61  ion about the da
184a0 74 61 62 61 73 65 5c 6e 22 0a 20 20 22 2e 64 75  tabase\n".  ".du
184b0 6d 70 20 3f 54 41 42 4c 45 3f 20 2e 2e 2e 20 20  mp ?TABLE? ...  
184c0 20 20 20 20 44 75 6d 70 20 74 68 65 20 64 61 74      Dump the dat
184d0 61 62 61 73 65 20 69 6e 20 61 6e 20 53 51 4c 20  abase in an SQL 
184e0 74 65 78 74 20 66 6f 72 6d 61 74 5c 6e 22 0a 20  text format\n". 
184f0 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
18500 20 20 20 20 20 20 20 20 20 20 20 49 66 20 54 41             If TA
18510 42 4c 45 20 73 70 65 63 69 66 69 65 64 2c 20 6f  BLE specified, o
18520 6e 6c 79 20 64 75 6d 70 20 74 61 62 6c 65 73 20  nly dump tables 
18530 6d 61 74 63 68 69 6e 67 5c 6e 22 0a 20 20 22 20  matching\n".  " 
18540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18550 20 20 20 20 20 20 20 20 4c 49 4b 45 20 70 61 74          LIKE pat
18560 74 65 72 6e 20 54 41 42 4c 45 2e 5c 6e 22 0a 20  tern TABLE.\n". 
18570 20 22 2e 65 63 68 6f 20 6f 6e 7c 6f 66 66 20 20   ".echo on|off  
18580 20 20 20 20 20 20 20 20 20 54 75 72 6e 20 63 6f           Turn co
18590 6d 6d 61 6e 64 20 65 63 68 6f 20 6f 6e 20 6f 72  mmand echo on or
185a0 20 6f 66 66 5c 6e 22 0a 20 20 22 2e 65 71 70 20   off\n".  ".eqp 
185b0 6f 6e 7c 6f 66 66 7c 66 75 6c 6c 20 20 20 20 20  on|off|full     
185c0 20 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73 61    Enable or disa
185d0 62 6c 65 20 61 75 74 6f 6d 61 74 69 63 20 45 58  ble automatic EX
185e0 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
185f0 5c 6e 22 0a 20 20 22 2e 65 78 63 65 6c 20 20 20  \n".  ".excel   
18600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 44 69                Di
18610 73 70 6c 61 79 20 74 68 65 20 6f 75 74 70 75 74  splay the output
18620 20 6f 66 20 6e 65 78 74 20 63 6f 6d 6d 61 6e 64   of next command
18630 20 69 6e 20 61 20 73 70 72 65 61 64 73 68 65 65   in a spreadshee
18640 74 5c 6e 22 0a 20 20 22 2e 65 78 69 74 20 20 20  t\n".  ".exit   
18650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
18660 78 69 74 20 74 68 69 73 20 70 72 6f 67 72 61 6d  xit this program
18670 5c 6e 22 0a 20 20 22 2e 65 78 70 65 72 74 20 20  \n".  ".expert  
18680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 58                EX
18690 50 45 52 49 4d 45 4e 54 41 4c 2e 20 53 75 67 67  PERIMENTAL. Sugg
186a0 65 73 74 20 69 6e 64 65 78 65 73 20 66 6f 72 20  est indexes for 
186b0 73 70 65 63 69 66 69 65 64 20 71 75 65 72 69 65  specified querie
186c0 73 5c 6e 22 0a 2f 2a 20 42 65 63 61 75 73 65 20  s\n"./* Because 
186d0 65 78 70 6c 61 69 6e 20 6d 6f 64 65 20 63 6f 6d  explain mode com
186e0 65 73 20 6f 6e 20 61 75 74 6f 6d 61 74 69 63 61  es on automatica
186f0 6c 6c 79 20 6e 6f 77 2c 20 74 68 65 20 22 2e 65  lly now, the ".e
18700 78 70 6c 61 69 6e 22 20 6d 6f 64 65 0a 2a 2a 20  xplain" mode.** 
18710 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  is removed from 
18720 74 68 65 20 68 65 6c 70 20 73 63 72 65 65 6e 2e  the help screen.
18730 20 20 49 74 20 69 73 20 73 74 69 6c 6c 20 73 75    It is still su
18740 70 70 6f 72 74 65 64 20 66 6f 72 20 6c 65 67 61  pported for lega
18750 63 79 2c 20 68 6f 77 65 76 65 72 20 2a 2f 0a 2f  cy, however */./
18760 2a 22 2e 65 78 70 6c 61 69 6e 20 3f 6f 6e 7c 6f  *".explain ?on|o
18770 66 66 7c 61 75 74 6f 3f 20 54 75 72 6e 20 45 58  ff|auto? Turn EX
18780 50 4c 41 49 4e 20 6f 75 74 70 75 74 20 6d 6f 64  PLAIN output mod
18790 65 20 6f 6e 20 6f 72 20 6f 66 66 20 6f 72 20 74  e on or off or t
187a0 6f 20 61 75 74 6f 6d 61 74 69 63 5c 6e 22 2a 2f  o automatic\n"*/
187b0 0a 20 20 22 2e 66 75 6c 6c 73 63 68 65 6d 61 20  .  ".fullschema 
187c0 3f 2d 2d 69 6e 64 65 6e 74 3f 20 53 68 6f 77 20  ?--indent? Show 
187d0 73 63 68 65 6d 61 20 61 6e 64 20 74 68 65 20 63  schema and the c
187e0 6f 6e 74 65 6e 74 20 6f 66 20 73 71 6c 69 74 65  ontent of sqlite
187f0 5f 73 74 61 74 20 74 61 62 6c 65 73 5c 6e 22 0a  _stat tables\n".
18800 20 20 22 2e 68 65 61 64 65 72 73 20 6f 6e 7c 6f    ".headers on|o
18810 66 66 20 20 20 20 20 20 20 20 54 75 72 6e 20 64  ff        Turn d
18820 69 73 70 6c 61 79 20 6f 66 20 68 65 61 64 65 72  isplay of header
18830 73 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20  s on or off\n". 
18840 20 22 2e 68 65 6c 70 20 20 20 20 20 20 20 20 20   ".help         
18850 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 74 68           Show th
18860 69 73 20 6d 65 73 73 61 67 65 5c 6e 22 0a 20 20  is message\n".  
18870 22 2e 69 6d 70 6f 72 74 20 46 49 4c 45 20 54 41  ".import FILE TA
18880 42 4c 45 20 20 20 20 20 49 6d 70 6f 72 74 20 64  BLE     Import d
18890 61 74 61 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e  ata from FILE in
188a0 74 6f 20 54 41 42 4c 45 5c 6e 22 0a 23 69 66 6e  to TABLE\n".#ifn
188b0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
188c0 54 45 53 54 5f 43 4f 4e 54 52 4f 4c 0a 20 20 22  TEST_CONTROL.  "
188d0 2e 69 6d 70 6f 73 74 65 72 20 49 4e 44 45 58 20  .imposter INDEX 
188e0 54 41 42 4c 45 20 20 43 72 65 61 74 65 20 69 6d  TABLE  Create im
188f0 70 6f 73 74 65 72 20 74 61 62 6c 65 20 54 41 42  poster table TAB
18900 4c 45 20 6f 6e 20 69 6e 64 65 78 20 49 4e 44 45  LE on index INDE
18910 58 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e  X\n".#endif.  ".
18920 69 6e 64 65 78 65 73 20 3f 54 41 42 4c 45 3f 20  indexes ?TABLE? 
18930 20 20 20 20 20 20 53 68 6f 77 20 6e 61 6d 65 73        Show names
18940 20 6f 66 20 61 6c 6c 20 69 6e 64 65 78 65 73 5c   of all indexes\
18950 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
18960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49                 I
18970 66 20 54 41 42 4c 45 20 73 70 65 63 69 66 69 65  f TABLE specifie
18980 64 2c 20 6f 6e 6c 79 20 73 68 6f 77 20 69 6e 64  d, only show ind
18990 65 78 65 73 20 66 6f 72 20 74 61 62 6c 65 73 5c  exes for tables\
189a0 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
189b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
189c0 61 74 63 68 69 6e 67 20 4c 49 4b 45 20 70 61 74  atching LIKE pat
189d0 74 65 72 6e 20 54 41 42 4c 45 2e 5c 6e 22 0a 23  tern TABLE.\n".#
189e0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
189f0 42 4c 45 5f 49 4f 54 52 41 43 45 0a 20 20 22 2e  BLE_IOTRACE.  ".
18a00 69 6f 74 72 61 63 65 20 46 49 4c 45 20 20 20 20  iotrace FILE    
18a10 20 20 20 20 20 20 45 6e 61 62 6c 65 20 49 2f 4f        Enable I/O
18a20 20 64 69 61 67 6e 6f 73 74 69 63 20 6c 6f 67 67   diagnostic logg
18a30 69 6e 67 20 74 6f 20 46 49 4c 45 5c 6e 22 0a 23  ing to FILE\n".#
18a40 65 6e 64 69 66 0a 20 20 22 2e 6c 69 6d 69 74 20  endif.  ".limit 
18a50 3f 4c 49 4d 49 54 3f 20 3f 56 41 4c 3f 20 20 20  ?LIMIT? ?VAL?   
18a60 44 69 73 70 6c 61 79 20 6f 72 20 63 68 61 6e 67  Display or chang
18a70 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61  e the value of a
18a80 6e 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5c 6e  n SQLITE_LIMIT\n
18a90 22 0a 20 20 22 2e 6c 69 6e 74 20 4f 50 54 49 4f  ".  ".lint OPTIO
18aa0 4e 53 20 20 20 20 20 20 20 20 20 20 52 65 70 6f  NS          Repo
18ab0 72 74 20 70 6f 74 65 6e 74 69 61 6c 20 73 63 68  rt potential sch
18ac0 65 6d 61 20 69 73 73 75 65 73 2e 20 4f 70 74 69  ema issues. Opti
18ad0 6f 6e 73 3a 5c 6e 22 0a 20 20 22 20 20 20 20 20  ons:\n".  "     
18ae0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18af0 20 20 20 20 66 6b 65 79 2d 69 6e 64 65 78 65 73      fkey-indexes
18b00 20 20 20 20 20 46 69 6e 64 20 6d 69 73 73 69 6e       Find missin
18b10 67 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 6e  g foreign key in
18b20 64 65 78 65 73 5c 6e 22 0a 23 69 66 6e 64 65 66  dexes\n".#ifndef
18b30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
18b40 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 22 2e  D_EXTENSION.  ".
18b50 6c 6f 61 64 20 46 49 4c 45 20 3f 45 4e 54 52 59  load FILE ?ENTRY
18b60 3f 20 20 20 20 20 4c 6f 61 64 20 61 6e 20 65 78  ?     Load an ex
18b70 74 65 6e 73 69 6f 6e 20 6c 69 62 72 61 72 79 5c  tension library\
18b80 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e 6c 6f  n".#endif.  ".lo
18b90 67 20 46 49 4c 45 7c 6f 66 66 20 20 20 20 20 20  g FILE|off      
18ba0 20 20 20 20 54 75 72 6e 20 6c 6f 67 67 69 6e 67      Turn logging
18bb0 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 46 49 4c   on or off.  FIL
18bc0 45 20 63 61 6e 20 62 65 20 73 74 64 65 72 72 2f  E can be stderr/
18bd0 73 74 64 6f 75 74 5c 6e 22 0a 20 20 22 2e 6d 6f  stdout\n".  ".mo
18be0 64 65 20 4d 4f 44 45 20 3f 54 41 42 4c 45 3f 20  de MODE ?TABLE? 
18bf0 20 20 20 20 53 65 74 20 6f 75 74 70 75 74 20 6d      Set output m
18c00 6f 64 65 20 77 68 65 72 65 20 4d 4f 44 45 20 69  ode where MODE i
18c10 73 20 6f 6e 65 20 6f 66 3a 5c 6e 22 0a 20 20 22  s one of:\n".  "
18c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c30 20 20 20 20 20 20 20 20 20 61 73 63 69 69 20 20           ascii  
18c40 20 20 43 6f 6c 75 6d 6e 73 2f 72 6f 77 73 20 64    Columns/rows d
18c50 65 6c 69 6d 69 74 65 64 20 62 79 20 30 78 31 46  elimited by 0x1F
18c60 20 61 6e 64 20 30 78 31 45 5c 6e 22 0a 20 20 22   and 0x1E\n".  "
18c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18c80 20 20 20 20 20 20 20 20 20 63 73 76 20 20 20 20           csv    
18c90 20 20 43 6f 6d 6d 61 2d 73 65 70 61 72 61 74 65    Comma-separate
18ca0 64 20 76 61 6c 75 65 73 5c 6e 22 0a 20 20 22 20  d values\n".  " 
18cb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cc0 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 20          column  
18cd0 20 4c 65 66 74 2d 61 6c 69 67 6e 65 64 20 63 6f   Left-aligned co
18ce0 6c 75 6d 6e 73 2e 20 20 28 53 65 65 20 2e 77 69  lumns.  (See .wi
18cf0 64 74 68 29 5c 6e 22 0a 20 20 22 20 20 20 20 20  dth)\n".  "     
18d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d10 20 20 20 20 68 74 6d 6c 20 20 20 20 20 48 54 4d      html     HTM
18d20 4c 20 3c 74 61 62 6c 65 3e 20 63 6f 64 65 5c 6e  L <table> code\n
18d30 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
18d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
18d50 73 65 72 74 20 20 20 53 51 4c 20 69 6e 73 65 72  sert   SQL inser
18d60 74 20 73 74 61 74 65 6d 65 6e 74 73 20 66 6f 72  t statements for
18d70 20 54 41 42 4c 45 5c 6e 22 0a 20 20 22 20 20 20   TABLE\n".  "   
18d80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d90 20 20 20 20 20 20 6c 69 6e 65 20 20 20 20 20 4f        line     O
18da0 6e 65 20 76 61 6c 75 65 20 70 65 72 20 6c 69 6e  ne value per lin
18db0 65 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  e\n".  "        
18dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18dd0 20 6c 69 73 74 20 20 20 20 20 56 61 6c 75 65 73   list     Values
18de0 20 64 65 6c 69 6d 69 74 65 64 20 62 79 20 5c 22   delimited by \"
18df0 7c 5c 22 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  |\"\n".  "      
18e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e10 20 20 20 71 75 6f 74 65 20 20 20 20 45 73 63 61     quote    Esca
18e20 70 65 20 61 6e 73 77 65 72 73 20 61 73 20 66 6f  pe answers as fo
18e30 72 20 53 51 4c 5c 6e 22 0a 20 20 22 20 20 20 20  r SQL\n".  "    
18e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e50 20 20 20 20 20 74 61 62 73 20 20 20 20 20 54 61       tabs     Ta
18e60 62 2d 73 65 70 61 72 61 74 65 64 20 76 61 6c 75  b-separated valu
18e70 65 73 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  es\n".  "       
18e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e90 20 20 74 63 6c 20 20 20 20 20 20 54 43 4c 20 6c    tcl      TCL l
18ea0 69 73 74 20 65 6c 65 6d 65 6e 74 73 5c 6e 22 0a  ist elements\n".
18eb0 20 20 22 2e 6e 75 6c 6c 76 61 6c 75 65 20 53 54    ".nullvalue ST
18ec0 52 49 4e 47 20 20 20 20 20 20 55 73 65 20 53 54  RING      Use ST
18ed0 52 49 4e 47 20 69 6e 20 70 6c 61 63 65 20 6f 66  RING in place of
18ee0 20 4e 55 4c 4c 20 76 61 6c 75 65 73 5c 6e 22 0a   NULL values\n".
18ef0 20 20 22 2e 6f 6e 63 65 20 28 2d 65 7c 2d 78 7c    ".once (-e|-x|
18f00 46 49 4c 45 29 20 20 20 20 20 4f 75 74 70 75 74  FILE)     Output
18f10 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 53 51   for the next SQ
18f20 4c 20 63 6f 6d 6d 61 6e 64 20 6f 6e 6c 79 20 74  L command only t
18f30 6f 20 46 49 4c 45 5c 6e 22 0a 20 20 22 20 20 20  o FILE\n".  "   
18f40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f50 20 20 20 20 20 20 6f 72 20 69 6e 76 6f 6b 65 20        or invoke 
18f60 73 79 73 74 65 6d 20 74 65 78 74 20 65 64 69 74  system text edit
18f70 6f 72 20 28 2d 65 29 20 6f 72 20 73 70 72 65 61  or (-e) or sprea
18f80 64 73 68 65 65 74 20 28 2d 78 29 5c 6e 22 0a 20  dsheet (-x)\n". 
18f90 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
18fa0 20 20 20 20 20 20 20 20 20 20 20 6f 6e 20 74 68             on th
18fb0 65 20 6f 75 74 70 75 74 2e 5c 6e 22 0a 20 20 22  e output.\n".  "
18fc0 2e 6f 70 65 6e 20 3f 4f 50 54 49 4f 4e 53 3f 20  .open ?OPTIONS? 
18fd0 3f 46 49 4c 45 3f 20 43 6c 6f 73 65 20 65 78 69  ?FILE? Close exi
18fe0 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20 61  sting database a
18ff0 6e 64 20 72 65 6f 70 65 6e 20 46 49 4c 45 5c 6e  nd reopen FILE\n
19000 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
19010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54 68                Th
19020 65 20 2d 2d 6e 65 77 20 6f 70 74 69 6f 6e 20 73  e --new option s
19030 74 61 72 74 73 20 77 69 74 68 20 61 6e 20 65 6d  tarts with an em
19040 70 74 79 20 66 69 6c 65 5c 6e 22 0a 20 20 22 20  pty file\n".  " 
19050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19060 20 20 20 20 20 20 20 20 4f 74 68 65 72 20 6f 70          Other op
19070 74 69 6f 6e 73 3a 20 2d 2d 72 65 61 64 6f 6e 6c  tions: --readonl
19080 79 20 2d 2d 61 70 70 65 6e 64 20 2d 2d 7a 69 70  y --append --zip
19090 5c 6e 22 0a 20 20 22 2e 6f 75 74 70 75 74 20 3f  \n".  ".output ?
190a0 46 49 4c 45 3f 20 20 20 20 20 20 20 20 20 53 65  FILE?         Se
190b0 6e 64 20 6f 75 74 70 75 74 20 74 6f 20 46 49 4c  nd output to FIL
190c0 45 20 6f 72 20 73 74 64 6f 75 74 5c 6e 22 0a 20  E or stdout\n". 
190d0 20 22 2e 70 72 69 6e 74 20 53 54 52 49 4e 47 2e   ".print STRING.
190e0 2e 2e 20 20 20 20 20 20 20 50 72 69 6e 74 20 6c  ..       Print l
190f0 69 74 65 72 61 6c 20 53 54 52 49 4e 47 5c 6e 22  iteral STRING\n"
19100 0a 20 20 22 2e 70 72 6f 6d 70 74 20 4d 41 49 4e  .  ".prompt MAIN
19110 20 43 4f 4e 54 49 4e 55 45 20 20 52 65 70 6c 61   CONTINUE  Repla
19120 63 65 20 74 68 65 20 73 74 61 6e 64 61 72 64 20  ce the standard 
19130 70 72 6f 6d 70 74 73 5c 6e 22 0a 20 20 22 2e 71  prompts\n".  ".q
19140 75 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  uit             
19150 20 20 20 20 20 45 78 69 74 20 74 68 69 73 20 70       Exit this p
19160 72 6f 67 72 61 6d 5c 6e 22 0a 20 20 22 2e 72 65  rogram\n".  ".re
19170 61 64 20 46 49 4c 45 4e 41 4d 45 20 20 20 20 20  ad FILENAME     
19180 20 20 20 20 45 78 65 63 75 74 65 20 53 51 4c 20      Execute SQL 
19190 69 6e 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 0a 20  in FILENAME\n". 
191a0 20 22 2e 72 65 73 74 6f 72 65 20 3f 44 42 3f 20   ".restore ?DB? 
191b0 46 49 4c 45 20 20 20 20 20 52 65 73 74 6f 72 65  FILE     Restore
191c0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 44 42 20 28   content of DB (
191d0 64 65 66 61 75 6c 74 20 5c 22 6d 61 69 6e 5c 22  default \"main\"
191e0 29 20 66 72 6f 6d 20 46 49 4c 45 5c 6e 22 0a 20  ) from FILE\n". 
191f0 20 22 2e 73 61 76 65 20 46 49 4c 45 20 20 20 20   ".save FILE    
19200 20 20 20 20 20 20 20 20 20 57 72 69 74 65 20 69           Write i
19210 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  n-memory databas
19220 65 20 69 6e 74 6f 20 46 49 4c 45 5c 6e 22 0a 20  e into FILE\n". 
19230 20 22 2e 73 63 61 6e 73 74 61 74 73 20 6f 6e 7c   ".scanstats on|
19240 6f 66 66 20 20 20 20 20 20 54 75 72 6e 20 73 71  off      Turn sq
19250 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73  lite3_stmt_scans
19260 74 61 74 75 73 28 29 20 6d 65 74 72 69 63 73 20  tatus() metrics 
19270 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20 22  on or off\n".  "
19280 2e 73 63 68 65 6d 61 20 3f 50 41 54 54 45 52 4e  .schema ?PATTERN
19290 3f 20 20 20 20 20 20 53 68 6f 77 20 74 68 65 20  ?      Show the 
192a0 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e 74  CREATE statement
192b0 73 20 6d 61 74 63 68 69 6e 67 20 50 41 54 54 45  s matching PATTE
192c0 52 4e 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  RN\n".  "       
192d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
192e0 20 20 20 41 64 64 20 2d 2d 69 6e 64 65 6e 74 20     Add --indent 
192f0 66 6f 72 20 70 72 65 74 74 79 2d 70 72 69 6e 74  for pretty-print
19300 69 6e 67 5c 6e 22 0a 20 20 22 2e 73 65 6c 66 74  ing\n".  ".selft
19310 65 73 74 20 3f 2d 2d 69 6e 69 74 3f 20 20 20 20  est ?--init?    
19320 20 52 75 6e 20 74 65 73 74 73 20 64 65 66 69 6e   Run tests defin
19330 65 64 20 69 6e 20 74 68 65 20 53 45 4c 46 54 45  ed in the SELFTE
19340 53 54 20 74 61 62 6c 65 5c 6e 22 0a 20 20 22 2e  ST table\n".  ".
19350 73 65 70 61 72 61 74 6f 72 20 43 4f 4c 20 3f 52  separator COL ?R
19360 4f 57 3f 20 20 20 43 68 61 6e 67 65 20 74 68 65  OW?   Change the
19370 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f   column separato
19380 72 20 61 6e 64 20 6f 70 74 69 6f 6e 61 6c 6c 79  r and optionally
19390 20 74 68 65 20 72 6f 77 5c 6e 22 0a 20 20 22 20   the row\n".  " 
193a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193b0 20 20 20 20 20 20 20 20 73 65 70 61 72 61 74 6f          separato
193c0 72 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20 6f  r for both the o
193d0 75 74 70 75 74 20 6d 6f 64 65 20 61 6e 64 20 2e  utput mode and .
193e0 69 6d 70 6f 72 74 5c 6e 22 0a 23 69 66 20 64 65  import\n".#if de
193f0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
19400 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 20 20 22  BLE_SESSION).  "
19410 2e 73 65 73 73 69 6f 6e 20 43 4d 44 20 2e 2e 2e  .session CMD ...
19420 20 20 20 20 20 20 20 43 72 65 61 74 65 20 6f 72         Create or
19430 20 63 6f 6e 74 72 6f 6c 20 73 65 73 73 69 6f 6e   control session
19440 73 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e  s\n".#endif.  ".
19450 73 68 61 33 73 75 6d 20 3f 4f 50 54 49 4f 4e 53  sha3sum ?OPTIONS
19460 2e 2e 2e 3f 20 20 43 6f 6d 70 75 74 65 20 61 20  ...?  Compute a 
19470 53 48 41 33 20 68 61 73 68 20 6f 66 20 64 61 74  SHA3 hash of dat
19480 61 62 61 73 65 20 63 6f 6e 74 65 6e 74 5c 6e 22  abase content\n"
19490 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
194a0 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a 20 20  NOHAVE_SYSTEM.  
194b0 22 2e 73 68 65 6c 6c 20 43 4d 44 20 41 52 47 53  ".shell CMD ARGS
194c0 2e 2e 2e 20 20 20 20 20 52 75 6e 20 43 4d 44 20  ...     Run CMD 
194d0 41 52 47 53 2e 2e 2e 20 69 6e 20 61 20 73 79 73  ARGS... in a sys
194e0 74 65 6d 20 73 68 65 6c 6c 5c 6e 22 0a 23 65 6e  tem shell\n".#en
194f0 64 69 66 0a 20 20 22 2e 73 68 6f 77 20 20 20 20  dif.  ".show    
19500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 68                Sh
19510 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  ow the current v
19520 61 6c 75 65 73 20 66 6f 72 20 76 61 72 69 6f 75  alues for variou
19530 73 20 73 65 74 74 69 6e 67 73 5c 6e 22 0a 20 20  s settings\n".  
19540 22 2e 73 74 61 74 73 20 3f 6f 6e 7c 6f 66 66 3f  ".stats ?on|off?
19550 20 20 20 20 20 20 20 20 53 68 6f 77 20 73 74 61          Show sta
19560 74 73 20 6f 72 20 74 75 72 6e 20 73 74 61 74 73  ts or turn stats
19570 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 23 69   on or off\n".#i
19580 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48  fndef SQLITE_NOH
19590 41 56 45 5f 53 59 53 54 45 4d 0a 20 20 22 2e 73  AVE_SYSTEM.  ".s
195a0 79 73 74 65 6d 20 43 4d 44 20 41 52 47 53 2e 2e  ystem CMD ARGS..
195b0 2e 20 20 20 20 52 75 6e 20 43 4d 44 20 41 52 47  .    Run CMD ARG
195c0 53 2e 2e 2e 20 69 6e 20 61 20 73 79 73 74 65 6d  S... in a system
195d0 20 73 68 65 6c 6c 5c 6e 22 0a 23 65 6e 64 69 66   shell\n".#endif
195e0 0a 20 20 22 2e 74 61 62 6c 65 73 20 3f 54 41 42  .  ".tables ?TAB
195f0 4c 45 3f 20 20 20 20 20 20 20 20 4c 69 73 74 20  LE?        List 
19600 6e 61 6d 65 73 20 6f 66 20 74 61 62 6c 65 73 5c  names of tables\
19610 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
19620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49                 I
19630 66 20 54 41 42 4c 45 20 73 70 65 63 69 66 69 65  f TABLE specifie
19640 64 2c 20 6f 6e 6c 79 20 6c 69 73 74 20 74 61 62  d, only list tab
19650 6c 65 73 20 6d 61 74 63 68 69 6e 67 5c 6e 22 0a  les matching\n".
19660 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
19670 20 20 20 20 20 20 20 20 20 20 20 20 4c 49 4b 45              LIKE
19680 20 70 61 74 74 65 72 6e 20 54 41 42 4c 45 2e 5c   pattern TABLE.\
19690 6e 22 0a 20 20 22 2e 74 65 73 74 63 61 73 65 20  n".  ".testcase 
196a0 4e 41 4d 45 20 20 20 20 20 20 20 20 20 42 65 67  NAME         Beg
196b0 69 6e 20 72 65 64 69 72 65 63 74 69 6e 67 20 6f  in redirecting o
196c0 75 74 70 75 74 20 74 6f 20 27 74 65 73 74 63 61  utput to 'testca
196d0 73 65 2d 6f 75 74 2e 74 78 74 27 5c 6e 22 0a 20  se-out.txt'\n". 
196e0 20 22 2e 74 69 6d 65 6f 75 74 20 4d 53 20 20 20   ".timeout MS   
196f0 20 20 20 20 20 20 20 20 20 54 72 79 20 6f 70 65           Try ope
19700 6e 69 6e 67 20 6c 6f 63 6b 65 64 20 74 61 62 6c  ning locked tabl
19710 65 73 20 66 6f 72 20 4d 53 20 6d 69 6c 6c 69 73  es for MS millis
19720 65 63 6f 6e 64 73 5c 6e 22 0a 20 20 22 2e 74 69  econds\n".  ".ti
19730 6d 65 72 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20  mer on|off      
19740 20 20 20 20 54 75 72 6e 20 53 51 4c 20 74 69 6d      Turn SQL tim
19750 65 72 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a  er on or off\n".
19760 20 20 22 2e 74 72 61 63 65 20 46 49 4c 45 7c 6f    ".trace FILE|o
19770 66 66 20 20 20 20 20 20 20 20 4f 75 74 70 75 74  ff        Output
19780 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65 6d   each SQL statem
19790 65 6e 74 20 61 73 20 69 74 20 69 73 20 72 75 6e  ent as it is run
197a0 5c 6e 22 0a 20 20 22 2e 76 66 73 69 6e 66 6f 20  \n".  ".vfsinfo 
197b0 3f 41 55 58 3f 20 20 20 20 20 20 20 20 20 49 6e  ?AUX?         In
197c0 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
197d0 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 56 46  the top-level VF
197e0 53 5c 6e 22 0a 20 20 22 2e 76 66 73 6c 69 73 74  S\n".  ".vfslist
197f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c                 L
19800 69 73 74 20 61 6c 6c 20 61 76 61 69 6c 61 62 6c  ist all availabl
19810 65 20 56 46 53 65 73 5c 6e 22 0a 20 20 22 2e 76  e VFSes\n".  ".v
19820 66 73 6e 61 6d 65 20 3f 41 55 58 3f 20 20 20 20  fsname ?AUX?    
19830 20 20 20 20 20 50 72 69 6e 74 20 74 68 65 20 6e       Print the n
19840 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20 73  ame of the VFS s
19850 74 61 63 6b 5c 6e 22 0a 20 20 22 2e 77 69 64 74  tack\n".  ".widt
19860 68 20 4e 55 4d 31 20 4e 55 4d 32 20 2e 2e 2e 20  h NUM1 NUM2 ... 
19870 20 20 53 65 74 20 63 6f 6c 75 6d 6e 20 77 69 64    Set column wid
19880 74 68 73 20 66 6f 72 20 5c 22 63 6f 6c 75 6d 6e  ths for \"column
19890 5c 22 20 6d 6f 64 65 5c 6e 22 0a 20 20 22 20 20  \" mode\n".  "  
198a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198b0 20 20 20 20 20 20 20 4e 65 67 61 74 69 76 65 20         Negative 
198c0 76 61 6c 75 65 73 20 72 69 67 68 74 2d 6a 75 73  values right-jus
198d0 74 69 66 79 5c 6e 22 0a 3b 0a 0a 23 69 66 20 64  tify\n".;..#if d
198e0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
198f0 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 2f 2a  ABLE_SESSION)./*
19900 0a 2a 2a 20 50 72 69 6e 74 20 68 65 6c 70 20 69  .** Print help i
19910 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74  nformation for t
19920 68 65 20 22 2e 73 65 73 73 69 6f 6e 73 22 20 63  he ".sessions" c
19930 6f 6d 6d 61 6e 64 0a 2a 2f 0a 76 6f 69 64 20 73  ommand.*/.void s
19940 65 73 73 69 6f 6e 5f 68 65 6c 70 28 53 68 65 6c  ession_help(Shel
19950 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 72 61  lState *p){.  ra
19960 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
19970 0a 20 20 20 20 22 2e 73 65 73 73 69 6f 6e 20 3f  .    ".session ?
19980 4e 41 4d 45 3f 20 53 55 42 43 4f 4d 4d 41 4e 44  NAME? SUBCOMMAND
19990 20 3f 41 52 47 53 2e 2e 2e 3f 5c 6e 22 0a 20 20   ?ARGS...?\n".  
199a0 20 20 22 49 66 20 3f 4e 41 4d 45 3f 20 69 73 20    "If ?NAME? is 
199b0 6f 6d 69 74 74 65 64 2c 20 74 68 65 20 66 69 72  omitted, the fir
199c0 73 74 20 64 65 66 69 6e 65 64 20 73 65 73 73 69  st defined sessi
199d0 6f 6e 20 69 73 20 75 73 65 64 2e 5c 6e 22 0a 20  on is used.\n". 
199e0 20 20 20 22 53 75 62 63 6f 6d 6d 61 6e 64 73 3a     "Subcommands:
199f0 5c 6e 22 0a 20 20 20 20 22 20 20 20 61 74 74 61  \n".    "   atta
19a00 63 68 20 54 41 42 4c 45 20 20 20 20 20 20 20 20  ch TABLE        
19a10 20 20 20 20 20 41 74 74 61 63 68 20 54 41 42 4c       Attach TABL
19a20 45 5c 6e 22 0a 20 20 20 20 22 20 20 20 63 68 61  E\n".    "   cha
19a30 6e 67 65 73 65 74 20 46 49 4c 45 20 20 20 20 20  ngeset FILE     
19a40 20 20 20 20 20 20 57 72 69 74 65 20 61 20 63 68        Write a ch
19a50 61 6e 67 65 73 65 74 20 69 6e 74 6f 20 46 49 4c  angeset into FIL
19a60 45 5c 6e 22 0a 20 20 20 20 22 20 20 20 63 6c 6f  E\n".    "   clo
19a70 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  se              
19a80 20 20 20 20 20 20 43 6c 6f 73 65 20 6f 6e 65 20        Close one 
19a90 73 65 73 73 69 6f 6e 5c 6e 22 0a 20 20 20 20 22  session\n".    "
19aa0 20 20 20 65 6e 61 62 6c 65 20 3f 42 4f 4f 4c 45     enable ?BOOLE
19ab0 41 4e 3f 20 20 20 20 20 20 20 20 20 53 65 74 20  AN?         Set 
19ac0 6f 72 20 71 75 65 72 79 20 74 68 65 20 65 6e 61  or query the ena
19ad0 62 6c 65 20 62 69 74 5c 6e 22 0a 20 20 20 20 22  ble bit\n".    "
19ae0 20 20 20 66 69 6c 74 65 72 20 47 4c 4f 42 2e 2e     filter GLOB..
19af0 2e 20 20 20 20 20 20 20 20 20 20 20 52 65 6a 65  .           Reje
19b00 63 74 20 74 61 62 6c 65 73 20 6d 61 74 63 68 69  ct tables matchi
19b10 6e 67 20 47 4c 4f 42 73 5c 6e 22 0a 20 20 20 20  ng GLOBs\n".    
19b20 22 20 20 20 69 6e 64 69 72 65 63 74 20 3f 42 4f  "   indirect ?BO
19b30 4f 4c 45 41 4e 3f 20 20 20 20 20 20 20 4d 61 72  OLEAN?       Mar
19b40 6b 20 6f 72 20 71 75 65 72 79 20 74 68 65 20 69  k or query the i
19b50 6e 64 69 72 65 63 74 20 73 74 61 74 75 73 5c 6e  ndirect status\n
19b60 22 0a 20 20 20 20 22 20 20 20 69 73 65 6d 70 74  ".    "   isempt
19b70 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  y               
19b80 20 20 20 51 75 65 72 79 20 77 68 65 74 68 65 72     Query whether
19b90 20 74 68 65 20 73 65 73 73 69 6f 6e 20 69 73 20   the session is 
19ba0 65 6d 70 74 79 5c 6e 22 0a 20 20 20 20 22 20 20  empty\n".    "  
19bb0 20 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20   list           
19bc0 20 20 20 20 20 20 20 20 20 20 4c 69 73 74 20 63            List c
19bd0 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 73 65  urrently open se
19be0 73 73 69 6f 6e 20 6e 61 6d 65 73 5c 6e 22 0a 20  ssion names\n". 
19bf0 20 20 20 22 20 20 20 6f 70 65 6e 20 44 42 20 4e     "   open DB N
19c00 41 4d 45 20 20 20 20 20 20 20 20 20 20 20 20 20  AME             
19c10 4f 70 65 6e 20 61 20 6e 65 77 20 73 65 73 73 69  Open a new sessi
19c20 6f 6e 20 6f 6e 20 44 42 5c 6e 22 0a 20 20 20 20  on on DB\n".    
19c30 22 20 20 20 70 61 74 63 68 73 65 74 20 46 49 4c  "   patchset FIL
19c40 45 20 20 20 20 20 20 20 20 20 20 20 20 57 72 69  E            Wri
19c50 74 65 20 61 20 70 61 74 63 68 73 65 74 20 69 6e  te a patchset in
19c60 74 6f 20 46 49 4c 45 5c 6e 22 0a 20 20 29 3b 0a  to FILE\n".  );.
19c70 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 20 46 6f  }.#endif.../* Fo
19c80 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65 20  rward reference 
19c90 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70 72  */.static int pr
19ca0 6f 63 65 73 73 5f 69 6e 70 75 74 28 53 68 65 6c  ocess_input(Shel
19cb0 6c 53 74 61 74 65 20 2a 70 2c 20 46 49 4c 45 20  lState *p, FILE 
19cc0 2a 69 6e 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61  *in);../*.** Rea
19cd0 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  d the content of
19ce0 20 66 69 6c 65 20 7a 4e 61 6d 65 20 69 6e 74 6f   file zName into
19cf0 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64   memory obtained
19d00 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
19d10 6c 6c 6f 63 36 34 28 29 0a 2a 2a 20 61 6e 64 20  lloc64().** and 
19d20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
19d30 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 2e 20   to the buffer. 
19d40 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65  The caller is re
19d50 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66 72  sponsible for fr
19d60 65 65 69 6e 67 0a 2a 2a 20 74 68 65 20 6d 65 6d  eeing.** the mem
19d70 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61  ory..**.** If pa
19d80 72 61 6d 65 74 65 72 20 70 6e 42 79 74 65 20 69  rameter pnByte i
19d90 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 28 2a 70 6e  s not NULL, (*pn
19da0 42 79 74 65 29 20 69 73 20 73 65 74 20 74 6f 20  Byte) is set to 
19db0 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
19dc0 74 65 73 0a 2a 2a 20 72 65 61 64 2e 0a 2a 2a 0a  tes.** read..**.
19dd0 2a 2a 20 46 6f 72 20 63 6f 6e 76 65 6e 69 65 6e  ** For convenien
19de0 63 65 2c 20 61 20 6e 75 6c 2d 74 65 72 6d 69 6e  ce, a nul-termin
19df0 61 74 6f 72 20 62 79 74 65 20 69 73 20 61 6c 77  ator byte is alw
19e00 61 79 73 20 61 70 70 65 6e 64 65 64 20 74 6f 20  ays appended to 
19e10 74 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a 2a  the data read.**
19e20 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20 62   from the file b
19e30 65 66 6f 72 65 20 74 68 65 20 62 75 66 66 65 72  efore the buffer
19e40 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54 68   is returned. Th
19e50 69 73 20 62 79 74 65 20 69 73 20 6e 6f 74 20 69  is byte is not i
19e60 6e 63 6c 75 64 65 64 20 69 6e 0a 2a 2a 20 74 68  ncluded in.** th
19e70 65 20 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66  e final value of
19e80 20 28 2a 70 6e 42 79 74 65 29 2c 20 69 66 20 61   (*pnByte), if a
19e90 70 70 6c 69 63 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  pplicable..**.**
19ea0 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
19eb0 64 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20 69  d if any error i
19ec0 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 20 54  s encountered. T
19ed0 68 65 20 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f  he final value o
19ee0 66 20 2a 70 6e 42 79 74 65 0a 2a 2a 20 69 73 20  f *pnByte.** is 
19ef0 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68 69  undefined in thi
19f00 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69  s case..*/.stati
19f10 63 20 63 68 61 72 20 2a 72 65 61 64 46 69 6c 65  c char *readFile
19f20 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61  (const char *zNa
19f30 6d 65 2c 20 69 6e 74 20 2a 70 6e 42 79 74 65 29  me, int *pnByte)
19f40 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 20 3d 20 66  {.  FILE *in = f
19f50 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 22 72 62 22  open(zName, "rb"
19f60 29 3b 0a 20 20 6c 6f 6e 67 20 6e 49 6e 3b 0a 20  );.  long nIn;. 
19f70 20 73 69 7a 65 5f 74 20 6e 52 65 61 64 3b 0a 20   size_t nRead;. 
19f80 20 63 68 61 72 20 2a 70 42 75 66 3b 0a 20 20 69   char *pBuf;.  i
19f90 66 28 20 69 6e 3d 3d 30 20 29 20 72 65 74 75 72  f( in==0 ) retur
19fa0 6e 20 30 3b 0a 20 20 66 73 65 65 6b 28 69 6e 2c  n 0;.  fseek(in,
19fb0 20 30 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20   0, SEEK_END);. 
19fc0 20 6e 49 6e 20 3d 20 66 74 65 6c 6c 28 69 6e 29   nIn = ftell(in)
19fd0 3b 0a 20 20 72 65 77 69 6e 64 28 69 6e 29 3b 0a  ;.  rewind(in);.
19fe0 20 20 70 42 75 66 20 3d 20 73 71 6c 69 74 65 33    pBuf = sqlite3
19ff0 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e 49 6e 2b 31  _malloc64( nIn+1
1a000 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66 3d 3d   );.  if( pBuf==
1a010 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1a020 6e 52 65 61 64 20 3d 20 66 72 65 61 64 28 70 42  nRead = fread(pB
1a030 75 66 2c 20 6e 49 6e 2c 20 31 2c 20 69 6e 29 3b  uf, nIn, 1, in);
1a040 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20  .  fclose(in);. 
1a050 20 69 66 28 20 6e 52 65 61 64 21 3d 31 20 29 7b   if( nRead!=1 ){
1a060 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
1a070 65 28 70 42 75 66 29 3b 0a 20 20 20 20 72 65 74  e(pBuf);.    ret
1a080 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 42 75  urn 0;.  }.  pBu
1a090 66 5b 6e 49 6e 5d 20 3d 20 30 3b 0a 20 20 69 66  f[nIn] = 0;.  if
1a0a0 28 20 70 6e 42 79 74 65 20 29 20 2a 70 6e 42 79  ( pnByte ) *pnBy
1a0b0 74 65 20 3d 20 6e 49 6e 3b 0a 20 20 72 65 74 75  te = nIn;.  retu
1a0c0 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 23 69 66 20  rn pBuf;.}..#if 
1a0d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
1a0e0 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 2f  NABLE_SESSION)./
1a0f0 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 73 69 6e  *.** Close a sin
1a100 67 6c 65 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20  gle OpenSession 
1a110 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 6c 65 61  object and relea
1a120 73 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 61 73  se all of its as
1a130 73 6f 63 69 61 74 65 64 0a 2a 2a 20 72 65 73 6f  sociated.** reso
1a140 75 72 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  urces..*/.static
1a150 20 76 6f 69 64 20 73 65 73 73 69 6f 6e 5f 63 6c   void session_cl
1a160 6f 73 65 28 4f 70 65 6e 53 65 73 73 69 6f 6e 20  ose(OpenSession 
1a170 2a 70 53 65 73 73 69 6f 6e 29 7b 0a 20 20 69 6e  *pSession){.  in
1a180 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 73 65  t i;.  sqlite3se
1a190 73 73 69 6f 6e 5f 64 65 6c 65 74 65 28 70 53 65  ssion_delete(pSe
1a1a0 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20 20 73 71 6c  ssion->p);.  sql
1a1b0 69 74 65 33 5f 66 72 65 65 28 70 53 65 73 73 69  ite3_free(pSessi
1a1c0 6f 6e 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f  on->zName);.  fo
1a1d0 72 28 69 3d 30 3b 20 69 3c 70 53 65 73 73 69 6f  r(i=0; i<pSessio
1a1e0 6e 2d 3e 6e 46 69 6c 74 65 72 3b 20 69 2b 2b 29  n->nFilter; i++)
1a1f0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
1a200 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46  ee(pSession->azF
1a210 69 6c 74 65 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20  ilter[i]);.  }. 
1a220 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53   sqlite3_free(pS
1a230 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72  ession->azFilter
1a240 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 53 65 73  );.  memset(pSes
1a250 73 69 6f 6e 2c 20 30 2c 20 73 69 7a 65 6f 66 28  sion, 0, sizeof(
1a260 4f 70 65 6e 53 65 73 73 69 6f 6e 29 29 3b 0a 7d  OpenSession));.}
1a270 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43  .#endif../*.** C
1a280 6c 6f 73 65 20 61 6c 6c 20 4f 70 65 6e 53 65 73  lose all OpenSes
1a290 73 69 6f 6e 20 6f 62 6a 65 63 74 73 20 61 6e 64  sion objects and
1a2a0 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 61 73 73   release all ass
1a2b0 6f 63 69 61 74 65 64 20 72 65 73 6f 75 72 63 65  ociated resource
1a2c0 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  s..*/.#if define
1a2d0 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
1a2e0 53 45 53 53 49 4f 4e 29 0a 73 74 61 74 69 63 20  SESSION).static 
1a2f0 76 6f 69 64 20 73 65 73 73 69 6f 6e 5f 63 6c 6f  void session_clo
1a300 73 65 5f 61 6c 6c 28 53 68 65 6c 6c 53 74 61 74  se_all(ShellStat
1a310 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  e *p){.  int i;.
1a320 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
1a330 6e 53 65 73 73 69 6f 6e 3b 20 69 2b 2b 29 7b 0a  nSession; i++){.
1a340 20 20 20 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73      session_clos
1a350 65 28 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 69  e(&p->aSession[i
1a360 5d 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 53 65  ]);.  }.  p->nSe
1a370 73 73 69 6f 6e 20 3d 20 30 3b 0a 7d 0a 23 65 6c  ssion = 0;.}.#el
1a380 73 65 0a 23 20 64 65 66 69 6e 65 20 73 65 73 73  se.# define sess
1a390 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c 6c 28 58 29  ion_close_all(X)
1a3a0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49  .#endif../*.** I
1a3b0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
1a3c0 20 74 68 65 20 78 46 69 6c 74 65 72 20 66 75 6e   the xFilter fun
1a3d0 63 74 69 6f 6e 20 66 6f 72 20 61 6e 20 6f 70 65  ction for an ope
1a3e0 6e 20 73 65 73 73 69 6f 6e 2e 20 20 4f 6d 69 74  n session.  Omit
1a3f0 0a 2a 2a 20 61 6e 79 20 74 61 62 6c 65 73 20 6e  .** any tables n
1a400 61 6d 65 64 20 62 79 20 22 2e 73 65 73 73 69 6f  amed by ".sessio
1a410 6e 20 66 69 6c 74 65 72 22 20 62 75 74 20 6c 65  n filter" but le
1a420 74 20 61 6c 6c 20 6f 74 68 65 72 20 74 61 62 6c  t all other tabl
1a430 65 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 23 69  e through..*/.#i
1a440 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
1a450 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29  _ENABLE_SESSION)
1a460 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 73 73  .static int sess
1a470 69 6f 6e 5f 66 69 6c 74 65 72 28 76 6f 69 64 20  ion_filter(void 
1a480 2a 70 43 74 78 2c 20 63 6f 6e 73 74 20 63 68 61  *pCtx, const cha
1a490 72 20 2a 7a 54 61 62 29 7b 0a 20 20 4f 70 65 6e  r *zTab){.  Open
1a4a0 53 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f  Session *pSessio
1a4b0 6e 20 3d 20 28 4f 70 65 6e 53 65 73 73 69 6f 6e  n = (OpenSession
1a4c0 2a 29 70 43 74 78 3b 0a 20 20 69 6e 74 20 69 3b  *)pCtx;.  int i;
1a4d0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53  .  for(i=0; i<pS
1a4e0 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72 3b  ession->nFilter;
1a4f0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
1a500 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 70  qlite3_strglob(p
1a510 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65  Session->azFilte
1a520 72 5b 69 5d 2c 20 7a 54 61 62 29 3d 3d 30 20 29  r[i], zTab)==0 )
1a530 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1a540 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e   return 1;.}.#en
1a550 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  dif../*.** Try t
1a560 6f 20 64 65 64 75 63 65 20 74 68 65 20 74 79 70  o deduce the typ
1a570 65 20 6f 66 20 66 69 6c 65 20 66 6f 72 20 7a 4e  e of file for zN
1a580 61 6d 65 20 62 61 73 65 64 20 6f 6e 20 69 74 73  ame based on its
1a590 20 63 6f 6e 74 65 6e 74 2e 20 20 52 65 74 75 72   content.  Retur
1a5a0 6e 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65 20  n.** one of the 
1a5b0 53 48 45 4c 4c 5f 4f 50 45 4e 5f 2a 20 63 6f 6e  SHELL_OPEN_* con
1a5c0 73 74 61 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66  stants..**.** If
1a5d0 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20 6e   the file does n
1a5e0 6f 74 20 65 78 69 73 74 20 6f 72 20 69 73 20 65  ot exist or is e
1a5f0 6d 70 74 79 20 62 75 74 20 69 74 73 20 6e 61 6d  mpty but its nam
1a600 65 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20 5a  e looks like a Z
1a610 49 50 0a 2a 2a 20 61 72 63 68 69 76 65 20 61 6e  IP.** archive an
1a620 64 20 74 68 65 20 64 66 6c 74 5a 69 70 20 66 6c  d the dfltZip fl
1a630 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ag is true, then
1a640 20 61 73 73 75 6d 65 20 69 74 20 69 73 20 61 20   assume it is a 
1a650 5a 49 50 20 61 72 63 68 69 76 65 2e 0a 2a 2a 20  ZIP archive..** 
1a660 4f 74 68 65 72 77 69 73 65 2c 20 61 73 73 75 6d  Otherwise, assum
1a670 65 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 64 61  e an ordinary da
1a680 74 61 62 61 73 65 20 72 65 67 61 72 64 6c 65 73  tabase regardles
1a690 73 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d  s of the filenam
1a6a0 65 20 69 66 0a 2a 2a 20 74 68 65 20 74 79 70 65  e if.** the type
1a6b0 20 63 61 6e 6e 6f 74 20 62 65 20 64 65 74 65 72   cannot be deter
1a6c0 6d 69 6e 65 64 20 66 72 6f 6d 20 63 6f 6e 74 65  mined from conte
1a6d0 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nt..*/.static in
1a6e0 74 20 64 65 64 75 63 65 44 61 74 61 62 61 73 65  t deduceDatabase
1a6f0 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20  Type(const char 
1a700 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 64 66 6c 74  *zName, int dflt
1a710 5a 69 70 29 7b 0a 20 20 46 49 4c 45 20 2a 66 20  Zip){.  FILE *f 
1a720 3d 20 66 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 22  = fopen(zName, "
1a730 72 62 22 29 3b 0a 20 20 73 69 7a 65 5f 74 20 6e  rb");.  size_t n
1a740 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 48 45  ;.  int rc = SHE
1a750 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43 3b 0a  LL_OPEN_UNSPEC;.
1a760 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 5d    char zBuf[100]
1a770 3b 0a 20 20 69 66 28 20 66 3d 3d 30 20 29 7b 0a  ;.  if( f==0 ){.
1a780 20 20 20 20 69 66 28 20 64 66 6c 74 5a 69 70 20      if( dfltZip 
1a790 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69  && sqlite3_strli
1a7a0 6b 65 28 22 25 2e 7a 69 70 22 2c 7a 4e 61 6d 65  ke("%.zip",zName
1a7b0 2c 30 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ,0)==0 ) return 
1a7c0 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49  SHELL_OPEN_ZIPFI
1a7d0 4c 45 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 53  LE;.    return S
1a7e0 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c  HELL_OPEN_NORMAL
1a7f0 3b 0a 20 20 7d 0a 20 20 66 73 65 65 6b 28 66 2c  ;.  }.  fseek(f,
1a800 20 2d 32 35 2c 20 53 45 45 4b 5f 45 4e 44 29 3b   -25, SEEK_END);
1a810 0a 20 20 6e 20 3d 20 66 72 65 61 64 28 7a 42 75  .  n = fread(zBu
1a820 66 2c 20 32 35 2c 20 31 2c 20 66 29 3b 0a 20 20  f, 25, 1, f);.  
1a830 69 66 28 20 6e 3d 3d 31 20 26 26 20 6d 65 6d 63  if( n==1 && memc
1a840 6d 70 28 7a 42 75 66 2c 20 22 53 74 61 72 74 2d  mp(zBuf, "Start-
1a850 4f 66 2d 53 51 4c 69 74 65 33 2d 22 2c 20 31 37  Of-SQLite3-", 17
1a860 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
1a870 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45   SHELL_OPEN_APPE
1a880 4e 44 56 46 53 3b 0a 20 20 7d 65 6c 73 65 7b 0a  NDVFS;.  }else{.
1a890 20 20 20 20 66 73 65 65 6b 28 66 2c 20 2d 32 32      fseek(f, -22
1a8a0 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 20  , SEEK_END);.   
1a8b0 20 6e 20 3d 20 66 72 65 61 64 28 7a 42 75 66 2c   n = fread(zBuf,
1a8c0 20 32 32 2c 20 31 2c 20 66 29 3b 0a 20 20 20 20   22, 1, f);.    
1a8d0 69 66 28 20 6e 3d 3d 31 20 26 26 20 7a 42 75 66  if( n==1 && zBuf
1a8e0 5b 30 5d 3d 3d 30 78 35 30 20 26 26 20 7a 42 75  [0]==0x50 && zBu
1a8f0 66 5b 31 5d 3d 3d 30 78 34 62 20 26 26 20 7a 42  f[1]==0x4b && zB
1a900 75 66 5b 32 5d 3d 3d 30 78 30 35 0a 20 20 20 20  uf[2]==0x05.    
1a910 20 20 20 26 26 20 7a 42 75 66 5b 33 5d 3d 3d 30     && zBuf[3]==0
1a920 78 30 36 20 29 7b 0a 20 20 20 20 20 20 72 63 20  x06 ){.      rc 
1a930 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50  = SHELL_OPEN_ZIP
1a940 46 49 4c 45 3b 0a 20 20 20 20 7d 65 6c 73 65 20  FILE;.    }else 
1a950 69 66 28 20 6e 3d 3d 30 20 26 26 20 64 66 6c 74  if( n==0 && dflt
1a960 5a 69 70 20 26 26 20 73 71 6c 69 74 65 33 5f 73  Zip && sqlite3_s
1a970 74 72 6c 69 6b 65 28 22 25 2e 7a 69 70 22 2c 7a  trlike("%.zip",z
1a980 4e 61 6d 65 2c 30 29 3d 3d 30 20 29 7b 0a 20 20  Name,0)==0 ){.  
1a990 20 20 20 20 72 65 74 75 72 6e 20 53 48 45 4c 4c      return SHELL
1a9a0 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3b 0a 20  _OPEN_ZIPFILE;. 
1a9b0 20 20 20 7d 0a 20 20 7d 0a 20 20 66 63 6c 6f 73     }.  }.  fclos
1a9c0 65 28 66 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  e(f);.  return r
1a9d0 63 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61  c;  .}../*.** Ma
1a9e0 6b 65 20 73 75 72 65 20 74 68 65 20 64 61 74 61  ke sure the data
1a9f0 62 61 73 65 20 69 73 20 6f 70 65 6e 2e 20 20 49  base is open.  I
1aa00 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65  f it is not, the
1aa10 6e 20 6f 70 65 6e 20 69 74 2e 20 20 49 66 0a 2a  n open it.  If.*
1aa20 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20 66  * the database f
1aa30 61 69 6c 73 20 74 6f 20 6f 70 65 6e 2c 20 70 72  ails to open, pr
1aa40 69 6e 74 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  int an error mes
1aa50 73 61 67 65 20 61 6e 64 20 65 78 69 74 2e 0a 2a  sage and exit..*
1aa60 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 70  /.static void op
1aa70 65 6e 5f 64 62 28 53 68 65 6c 6c 53 74 61 74 65  en_db(ShellState
1aa80 20 2a 70 2c 20 69 6e 74 20 6b 65 65 70 41 6c 69   *p, int keepAli
1aa90 76 65 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 62  ve){.  if( p->db
1aaa0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
1aab0 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b  e3_initialize();
1aac0 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e  .    if( p->open
1aad0 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e  Mode==SHELL_OPEN
1aae0 5f 55 4e 53 50 45 43 20 26 26 20 61 63 63 65 73  _UNSPEC && acces
1aaf0 73 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65  s(p->zDbFilename
1ab00 2c 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,0)==0 ){.      
1ab10 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20 28 75  p->openMode = (u
1ab20 38 29 64 65 64 75 63 65 44 61 74 61 62 61 73 65  8)deduceDatabase
1ab30 54 79 70 65 28 70 2d 3e 7a 44 62 46 69 6c 65 6e  Type(p->zDbFilen
1ab40 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ame, 0);.    }. 
1ab50 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70     switch( p->op
1ab60 65 6e 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20 20  enMode ){.      
1ab70 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  case SHELL_OPEN_
1ab80 41 50 50 45 4e 44 56 46 53 3a 20 7b 0a 20 20 20  APPENDVFS: {.   
1ab90 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65       sqlite3_ope
1aba0 6e 5f 76 32 28 70 2d 3e 7a 44 62 46 69 6c 65 6e  n_v2(p->zDbFilen
1abb0 61 6d 65 2c 20 26 70 2d 3e 64 62 2c 20 0a 20 20  ame, &p->db, .  
1abc0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
1abd0 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c 53  OPEN_READWRITE|S
1abe0 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54  QLITE_OPEN_CREAT
1abf0 45 2c 20 22 61 70 6e 64 76 66 73 22 29 3b 0a 20  E, "apndvfs");. 
1ac00 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1ac10 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73 65      }.      case
1ac20 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46   SHELL_OPEN_ZIPF
1ac30 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 20 20 73  ILE: {.        s
1ac40 71 6c 69 74 65 33 5f 6f 70 65 6e 28 22 3a 6d 65  qlite3_open(":me
1ac50 6d 6f 72 79 3a 22 2c 20 26 70 2d 3e 64 62 29 3b  mory:", &p->db);
1ac60 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
1ac70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61        }.      ca
1ac80 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 52 45  se SHELL_OPEN_RE
1ac90 41 44 4f 4e 4c 59 3a 20 7b 0a 20 20 20 20 20 20  ADONLY: {.      
1aca0 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f 76    sqlite3_open_v
1acb0 32 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65  2(p->zDbFilename
1acc0 2c 20 26 70 2d 3e 64 62 2c 20 53 51 4c 49 54 45  , &p->db, SQLITE
1acd0 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c 20  _OPEN_READONLY, 
1ace0 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  0);.        brea
1acf0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
1ad00 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e   case SHELL_OPEN
1ad10 5f 55 4e 53 50 45 43 3a 0a 20 20 20 20 20 20 63  _UNSPEC:.      c
1ad20 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e  ase SHELL_OPEN_N
1ad30 4f 52 4d 41 4c 3a 20 7b 0a 20 20 20 20 20 20 20  ORMAL: {.       
1ad40 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 70 2d   sqlite3_open(p-
1ad50 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 26 70  >zDbFilename, &p
1ad60 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 62  ->db);.        b
1ad70 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1ad80 20 20 7d 0a 20 20 20 20 67 6c 6f 62 61 6c 44 62    }.    globalDb
1ad90 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 69 66   = p->db;.    if
1ada0 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 53 51  ( p->db==0 || SQ
1adb0 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65 33  LITE_OK!=sqlite3
1adc0 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 20  _errcode(p->db) 
1add0 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
1ade0 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72  intf(stderr,"Err
1adf0 6f 72 3a 20 75 6e 61 62 6c 65 20 74 6f 20 6f 70  or: unable to op
1ae00 65 6e 20 64 61 74 61 62 61 73 65 20 5c 22 25 73  en database \"%s
1ae10 5c 22 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20  \": %s\n",.     
1ae20 20 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e       p->zDbFilen
1ae30 61 6d 65 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  ame, sqlite3_err
1ae40 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
1ae50 20 20 20 69 66 28 20 6b 65 65 70 41 6c 69 76 65     if( keepAlive
1ae60 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20   ) return;.     
1ae70 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a   exit(1);.    }.
1ae80 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1ae90 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
1aea0 4f 4e 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65  ON.    sqlite3_e
1aeb0 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65 6e  nable_load_exten
1aec0 73 69 6f 6e 28 70 2d 3e 64 62 2c 20 31 29 3b 0a  sion(p->db, 1);.
1aed0 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74  #endif.    sqlit
1aee0 65 33 5f 66 69 6c 65 69 6f 5f 69 6e 69 74 28 70  e3_fileio_init(p
1aef0 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->db, 0, 0);.   
1af00 20 73 71 6c 69 74 65 33 5f 73 68 61 74 68 72 65   sqlite3_shathre
1af10 65 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c  e_init(p->db, 0,
1af20 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
1af30 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 69 6e 69 74  _completion_init
1af40 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 23  (p->db, 0, 0);.#
1af50 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41 56  ifdef SQLITE_HAV
1af60 45 5f 5a 4c 49 42 0a 20 20 20 20 73 71 6c 69 74  E_ZLIB.    sqlit
1af70 65 33 5f 7a 69 70 66 69 6c 65 5f 69 6e 69 74 28  e3_zipfile_init(
1af80 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  p->db, 0, 0);.  
1af90 20 20 73 71 6c 69 74 65 33 5f 73 71 6c 61 72 5f    sqlite3_sqlar_
1afa0 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30  init(p->db, 0, 0
1afb0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
1afc0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
1afd0 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 73 68  ction(p->db, "sh
1afe0 65 6c 6c 5f 61 64 64 5f 73 63 68 65 6d 61 22 2c  ell_add_schema",
1aff0 20 33 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   3, SQLITE_UTF8,
1b000 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   0,.            
1b010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b020 73 68 65 6c 6c 41 64 64 53 63 68 65 6d 61 4e 61  shellAddSchemaNa
1b030 6d 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73  me, 0, 0);.    s
1b040 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
1b050 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 73  nction(p->db, "s
1b060 68 65 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68 65  hell_module_sche
1b070 6d 61 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55  ma", 1, SQLITE_U
1b080 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20  TF8, 0,.        
1b090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0a0 20 20 20 20 73 68 65 6c 6c 4d 6f 64 75 6c 65 53      shellModuleS
1b0b0 63 68 65 6d 61 2c 20 30 2c 20 30 29 3b 0a 20 20  chema, 0, 0);.  
1b0c0 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
1b0d0 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c  _function(p->db,
1b0e0 20 22 73 68 65 6c 6c 5f 70 75 74 73 6e 6c 22 2c   "shell_putsnl",
1b0f0 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   1, SQLITE_UTF8,
1b100 20 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20   p,.            
1b110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b120 73 68 65 6c 6c 50 75 74 73 46 75 6e 63 2c 20 30  shellPutsFunc, 0
1b130 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53 51  , 0);.#ifndef SQ
1b140 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54  LITE_NOHAVE_SYST
1b150 45 4d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  EM.    sqlite3_c
1b160 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70  reate_function(p
1b170 2d 3e 64 62 2c 20 22 65 64 69 74 22 2c 20 31 2c  ->db, "edit", 1,
1b180 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
1b190 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 65 64 69               edi
1b1b0 74 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20 20  tFunc, 0, 0);.  
1b1c0 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
1b1d0 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c  _function(p->db,
1b1e0 20 22 65 64 69 74 22 2c 20 32 2c 20 53 51 4c 49   "edit", 2, SQLI
1b1f0 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20  TE_UTF8, 0,.    
1b200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b210 20 20 20 20 20 20 20 20 65 64 69 74 46 75 6e 63          editFunc
1b220 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a  , 0, 0);.#endif.
1b230 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 4d      if( p->openM
1b240 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f  ode==SHELL_OPEN_
1b250 5a 49 50 46 49 4c 45 20 29 7b 0a 20 20 20 20 20  ZIPFILE ){.     
1b260 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71   char *zSql = sq
1b270 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
1b280 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
1b290 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 7a 69  VIRTUAL TABLE zi
1b2a0 70 20 55 53 49 4e 47 20 7a 69 70 66 69 6c 65 28  p USING zipfile(
1b2b0 25 51 29 3b 22 2c 20 70 2d 3e 7a 44 62 46 69 6c  %Q);", p->zDbFil
1b2c0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  ename);.      sq
1b2d0 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
1b2e0 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29  , zSql, 0, 0, 0)
1b2f0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
1b300 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
1b310 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 48 41 56  }.  }.}..#if HAV
1b320 45 5f 52 45 41 44 4c 49 4e 45 20 7c 7c 20 48 41  E_READLINE || HA
1b330 56 45 5f 45 44 49 54 4c 49 4e 45 0a 2f 2a 0a 2a  VE_EDITLINE./*.*
1b340 2a 20 52 65 61 64 6c 69 6e 65 20 63 6f 6d 70 6c  * Readline compl
1b350 65 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 73 0a  etion callbacks.
1b360 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
1b370 72 65 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74  readline_complet
1b380 69 6f 6e 5f 67 65 6e 65 72 61 74 6f 72 28 63 6f  ion_generator(co
1b390 6e 73 74 20 63 68 61 72 20 2a 74 65 78 74 2c 20  nst char *text, 
1b3a0 69 6e 74 20 73 74 61 74 65 29 7b 0a 20 20 73 74  int state){.  st
1b3b0 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 74 6d  atic sqlite3_stm
1b3c0 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
1b3d0 63 68 61 72 20 2a 7a 52 65 74 3b 0a 20 20 69 66  char *zRet;.  if
1b3e0 28 20 73 74 61 74 65 3d 3d 30 20 29 7b 0a 20 20  ( state==0 ){.  
1b3f0 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
1b400 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
1b410 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7a  ze(pStmt);.    z
1b420 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
1b430 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 44 49  rintf("SELECT DI
1b440 53 54 49 4e 43 54 20 63 61 6e 64 69 64 61 74 65  STINCT candidate
1b450 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 22   COLLATE nocase"
1b460 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1b470 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 46              "  F
1b480 52 4f 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e 28 25  ROM completion(%
1b490 51 29 20 4f 52 44 45 52 20 42 59 20 31 22 2c 20  Q) ORDER BY 1", 
1b4a0 74 65 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  text);.    sqlit
1b4b0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 67 6c  e3_prepare_v2(gl
1b4c0 6f 62 61 6c 44 62 2c 20 7a 53 71 6c 2c 20 2d 31  obalDb, zSql, -1
1b4d0 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
1b4e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
1b4f0 53 71 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Sql);.  }.  if( 
1b500 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
1b510 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
1b520 29 7b 0a 20 20 20 20 7a 52 65 74 20 3d 20 73 74  ){.    zRet = st
1b530 72 64 75 70 28 28 63 6f 6e 73 74 20 63 68 61 72  rdup((const char
1b540 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
1b550 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 29  _text(pStmt, 0))
1b560 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
1b570 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
1b580 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 53 74 6d  pStmt);.    pStm
1b590 74 20 3d 20 30 3b 0a 20 20 20 20 7a 52 65 74 20  t = 0;.    zRet 
1b5a0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
1b5b0 6e 20 7a 52 65 74 3b 0a 7d 0a 73 74 61 74 69 63  n zRet;.}.static
1b5c0 20 63 68 61 72 20 2a 2a 72 65 61 64 6c 69 6e 65   char **readline
1b5d0 5f 63 6f 6d 70 6c 65 74 69 6f 6e 28 63 6f 6e 73  _completion(cons
1b5e0 74 20 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 69  t char *zText, i
1b5f0 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69  nt iStart, int i
1b600 45 6e 64 29 7b 0a 20 20 72 6c 5f 61 74 74 65 6d  End){.  rl_attem
1b610 70 74 65 64 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f  pted_completion_
1b620 6f 76 65 72 20 3d 20 31 3b 0a 20 20 72 65 74 75  over = 1;.  retu
1b630 72 6e 20 72 6c 5f 63 6f 6d 70 6c 65 74 69 6f 6e  rn rl_completion
1b640 5f 6d 61 74 63 68 65 73 28 7a 54 65 78 74 2c 20  _matches(zText, 
1b650 72 65 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74  readline_complet
1b660 69 6f 6e 5f 67 65 6e 65 72 61 74 6f 72 29 3b 0a  ion_generator);.
1b670 7d 0a 0a 23 65 6c 69 66 20 48 41 56 45 5f 4c 49  }..#elif HAVE_LI
1b680 4e 45 4e 4f 49 53 45 0a 2f 2a 0a 2a 2a 20 4c 69  NENOISE./*.** Li
1b690 6e 65 6e 6f 69 73 65 20 63 6f 6d 70 6c 65 74 69  nenoise completi
1b6a0 6f 6e 20 63 61 6c 6c 62 61 63 6b 0a 2a 2f 0a 73  on callback.*/.s
1b6b0 74 61 74 69 63 20 76 6f 69 64 20 6c 69 6e 65 6e  tatic void linen
1b6c0 6f 69 73 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 28  oise_completion(
1b6d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69 6e  const char *zLin
1b6e0 65 2c 20 6c 69 6e 65 6e 6f 69 73 65 43 6f 6d 70  e, linenoiseComp
1b6f0 6c 65 74 69 6f 6e 73 20 2a 6c 63 29 7b 0a 20 20  letions *lc){.  
1b700 69 6e 74 20 6e 4c 69 6e 65 20 3d 20 73 74 72 6c  int nLine = strl
1b710 65 6e 33 30 28 7a 4c 69 6e 65 29 3b 0a 20 20 69  en30(zLine);.  i
1b720 6e 74 20 69 2c 20 69 53 74 61 72 74 3b 0a 20 20  nt i, iStart;.  
1b730 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1b740 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  tmt = 0;.  char 
1b750 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20 7a 42  *zSql;.  char zB
1b760 75 66 5b 31 30 30 30 5d 3b 0a 0a 20 20 69 66 28  uf[1000];..  if(
1b770 20 6e 4c 69 6e 65 3e 73 69 7a 65 6f 66 28 7a 42   nLine>sizeof(zB
1b780 75 66 29 2d 33 30 20 29 20 72 65 74 75 72 6e 3b  uf)-30 ) return;
1b790 0a 20 20 69 66 28 20 7a 4c 69 6e 65 5b 30 5d 3d  .  if( zLine[0]=
1b7a0 3d 27 2e 27 20 29 20 72 65 74 75 72 6e 3b 0a 20  ='.' ) return;. 
1b7b0 20 66 6f 72 28 69 3d 6e 4c 69 6e 65 2d 31 3b 20   for(i=nLine-1; 
1b7c0 69 3e 3d 30 20 26 26 20 28 69 73 61 6c 6e 75 6d  i>=0 && (isalnum
1b7d0 28 7a 4c 69 6e 65 5b 69 5d 29 20 7c 7c 20 7a 4c  (zLine[i]) || zL
1b7e0 69 6e 65 5b 69 5d 3d 3d 27 5f 27 29 3b 20 69 2d  ine[i]=='_'); i-
1b7f0 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3d 3d 6e 4c  -){}.  if( i==nL
1b800 69 6e 65 2d 31 20 29 20 72 65 74 75 72 6e 3b 0a  ine-1 ) return;.
1b810 20 20 69 53 74 61 72 74 20 3d 20 69 2b 31 3b 0a    iStart = i+1;.
1b820 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 7a    memcpy(zBuf, z
1b830 4c 69 6e 65 2c 20 69 53 74 61 72 74 29 3b 0a 20  Line, iStart);. 
1b840 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
1b850 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
1b860 44 49 53 54 49 4e 43 54 20 63 61 6e 64 69 64 61  DISTINCT candida
1b870 74 65 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  te COLLATE nocas
1b880 65 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e".             
1b890 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 46              "  F
1b8a0 52 4f 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e 28 25  ROM completion(%
1b8b0 51 2c 25 51 29 20 4f 52 44 45 52 20 42 59 20 31  Q,%Q) ORDER BY 1
1b8c0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1b8d0 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 4c 69              &zLi
1b8e0 6e 65 5b 69 53 74 61 72 74 5d 2c 20 7a 4c 69 6e  ne[iStart], zLin
1b8f0 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70 72  e);.  sqlite3_pr
1b900 65 70 61 72 65 5f 76 32 28 67 6c 6f 62 61 6c 44  epare_v2(globalD
1b910 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
1b920 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  tmt, 0);.  sqlit
1b930 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
1b940 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 67 6c   sqlite3_exec(gl
1b950 6f 62 61 6c 44 62 2c 20 22 50 52 41 47 4d 41 20  obalDb, "PRAGMA 
1b960 70 61 67 65 5f 63 6f 75 6e 74 22 2c 20 30 2c 20  page_count", 0, 
1b970 30 2c 20 30 29 3b 20 2f 2a 20 4c 6f 61 64 20 74  0, 0); /* Load t
1b980 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 77  he schema */.  w
1b990 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74  hile( sqlite3_st
1b9a0 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
1b9b0 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e  E_ROW ){.    con
1b9c0 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 70 6c 65  st char *zComple
1b9d0 74 69 6f 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68  tion = (const ch
1b9e0 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
1b9f0 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30  mn_text(pStmt, 0
1ba00 29 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6d 70  );.    int nComp
1ba10 6c 65 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33  letion = sqlite3
1ba20 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53  _column_bytes(pS
1ba30 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  tmt, 0);.    if(
1ba40 20 69 53 74 61 72 74 2b 6e 43 6f 6d 70 6c 65 74   iStart+nComplet
1ba50 69 6f 6e 20 3c 20 73 69 7a 65 6f 66 28 7a 42 75  ion < sizeof(zBu
1ba60 66 29 2d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65  f)-1 ){.      me
1ba70 6d 63 70 79 28 7a 42 75 66 2b 69 53 74 61 72 74  mcpy(zBuf+iStart
1ba80 2c 20 7a 43 6f 6d 70 6c 65 74 69 6f 6e 2c 20 6e  , zCompletion, n
1ba90 43 6f 6d 70 6c 65 74 69 6f 6e 2b 31 29 3b 0a 20  Completion+1);. 
1baa0 20 20 20 20 20 6c 69 6e 65 6e 6f 69 73 65 41 64       linenoiseAd
1bab0 64 43 6f 6d 70 6c 65 74 69 6f 6e 28 6c 63 2c 20  dCompletion(lc, 
1bac0 7a 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  zBuf);.    }.  }
1bad0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
1bae0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 7d 0a 23 65  ize(pStmt);.}.#e
1baf0 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 43  ndif../*.** Do C
1bb00 2d 6c 61 6e 67 75 61 67 65 20 73 74 79 6c 65 20  -language style 
1bb10 64 65 71 75 6f 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a  dequoting..**.**
1bb20 20 20 20 20 5c 61 20 20 20 20 2d 3e 20 61 6c 61      \a    -> ala
1bb30 72 6d 0a 2a 2a 20 20 20 20 5c 62 20 20 20 20 2d  rm.**    \b    -
1bb40 3e 20 62 61 63 6b 73 70 61 63 65 0a 2a 2a 20 20  > backspace.**  
1bb50 20 20 5c 74 20 20 20 20 2d 3e 20 74 61 62 0a 2a    \t    -> tab.*
1bb60 2a 20 20 20 20 5c 6e 20 20 20 20 2d 3e 20 6e 65  *    \n    -> ne
1bb70 77 6c 69 6e 65 0a 2a 2a 20 20 20 20 5c 76 20 20  wline.**    \v  
1bb80 20 20 2d 3e 20 76 65 72 74 69 63 61 6c 20 74 61    -> vertical ta
1bb90 62 0a 2a 2a 20 20 20 20 5c 66 20 20 20 20 2d 3e  b.**    \f    ->
1bba0 20 66 6f 72 6d 20 66 65 65 64 0a 2a 2a 20 20 20   form feed.**   
1bbb0 20 5c 72 20 20 20 20 2d 3e 20 63 61 72 72 69 61   \r    -> carria
1bbc0 67 65 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20 20  ge return.**    
1bbd0 5c 73 20 20 20 20 2d 3e 20 73 70 61 63 65 0a 2a  \s    -> space.*
1bbe0 2a 20 20 20 20 5c 22 20 20 20 20 2d 3e 20 22 0a  *    \"    -> ".
1bbf0 2a 2a 20 20 20 20 5c 27 20 20 20 20 2d 3e 20 27  **    \'    -> '
1bc00 0a 2a 2a 20 20 20 20 5c 5c 20 20 20 20 2d 3e 20  .**    \\    -> 
1bc10 62 61 63 6b 73 6c 61 73 68 0a 2a 2a 20 20 20 20  backslash.**    
1bc20 5c 4e 4e 4e 20 20 2d 3e 20 61 73 63 69 69 20 63  \NNN  -> ascii c
1bc30 68 61 72 61 63 74 65 72 20 4e 4e 4e 20 69 6e 20  haracter NNN in 
1bc40 6f 63 74 61 6c 0a 2a 2f 0a 73 74 61 74 69 63 20  octal.*/.static 
1bc50 76 6f 69 64 20 72 65 73 6f 6c 76 65 5f 62 61 63  void resolve_bac
1bc60 6b 73 6c 61 73 68 65 73 28 63 68 61 72 20 2a 7a  kslashes(char *z
1bc70 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
1bc80 20 63 68 61 72 20 63 3b 0a 20 20 77 68 69 6c 65   char c;.  while
1bc90 28 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 5c 5c 27  ( *z && *z!='\\'
1bca0 20 29 20 7a 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d   ) z++;.  for(i=
1bcb0 6a 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21  j=0; (c = z[i])!
1bcc0 3d 30 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20  =0; i++, j++){. 
1bcd0 20 20 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20 26     if( c=='\\' &
1bce0 26 20 7a 5b 69 2b 31 5d 21 3d 30 20 29 7b 0a 20  & z[i+1]!=0 ){. 
1bcf0 20 20 20 20 20 63 20 3d 20 7a 5b 2b 2b 69 5d 3b       c = z[++i];
1bd00 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 61  .      if( c=='a
1bd10 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
1bd20 20 27 5c 61 27 3b 0a 20 20 20 20 20 20 7d 65 6c   '\a';.      }el
1bd30 73 65 20 69 66 28 20 63 3d 3d 27 62 27 20 29 7b  se if( c=='b' ){
1bd40 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 62  .        c = '\b
1bd50 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
1bd60 66 28 20 63 3d 3d 27 74 27 20 29 7b 0a 20 20 20  f( c=='t' ){.   
1bd70 20 20 20 20 20 63 20 3d 20 27 5c 74 27 3b 0a 20       c = '\t';. 
1bd80 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
1bd90 3d 3d 27 6e 27 20 29 7b 0a 20 20 20 20 20 20 20  =='n' ){.       
1bda0 20 63 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20   c = '\n';.     
1bdb0 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 76   }else if( c=='v
1bdc0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
1bdd0 20 27 5c 76 27 3b 0a 20 20 20 20 20 20 7d 65 6c   '\v';.      }el
1bde0 73 65 20 69 66 28 20 63 3d 3d 27 66 27 20 29 7b  se if( c=='f' ){
1bdf0 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 66  .        c = '\f
1be00 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
1be10 66 28 20 63 3d 3d 27 72 27 20 29 7b 0a 20 20 20  f( c=='r' ){.   
1be20 20 20 20 20 20 63 20 3d 20 27 5c 72 27 3b 0a 20       c = '\r';. 
1be30 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
1be40 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20 20  =='"' ){.       
1be50 20 63 20 3d 20 27 22 27 3b 0a 20 20 20 20 20 20   c = '"';.      
1be60 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 27  }else if( c=='\'
1be70 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
1be80 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 7d 65 6c   '\'';.      }el
1be90 73 65 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20 29  se if( c=='\\' )
1bea0 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c  {.        c = '\
1beb0 5c 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  \';.      }else 
1bec0 69 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c  if( c>='0' && c<
1bed0 3d 27 37 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='7' ){.        
1bee0 63 20 2d 3d 20 27 30 27 3b 0a 20 20 20 20 20 20  c -= '0';.      
1bef0 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30    if( z[i+1]>='0
1bf00 27 20 26 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27  ' && z[i+1]<='7'
1bf10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 2b   ){.          i+
1bf20 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  +;.          c =
1bf30 20 28 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d   (c<<3) + z[i] -
1bf40 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20   '0';.          
1bf50 69 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20  if( z[i+1]>='0' 
1bf60 26 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20 29  && z[i+1]<='7' )
1bf70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 2b  {.            i+
1bf80 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  +;.            c
1bf90 20 3d 20 28 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d   = (c<<3) + z[i]
1bfa0 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20   - '0';.        
1bfb0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
1bfc0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1bfd0 7a 5b 6a 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20  z[j] = c;.  }.  
1bfe0 69 66 28 20 6a 3c 69 20 29 20 7a 5b 6a 5d 20 3d  if( j<i ) z[j] =
1bff0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74   0;.}../*.** Int
1c000 65 72 70 72 65 74 20 7a 41 72 67 20 61 73 20 65  erpret zArg as e
1c010 69 74 68 65 72 20 61 6e 20 69 6e 74 65 67 65 72  ither an integer
1c020 20 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61   or a boolean va
1c030 6c 75 65 2e 20 20 52 65 74 75 72 6e 20 31 20 6f  lue.  Return 1 o
1c040 72 20 30 0a 2a 2a 20 66 6f 72 20 54 52 55 45 20  r 0.** for TRUE 
1c050 61 6e 64 20 46 41 4c 53 45 2e 20 20 52 65 74 75  and FALSE.  Retu
1c060 72 6e 20 74 68 65 20 69 6e 74 65 67 65 72 20 76  rn the integer v
1c070 61 6c 75 65 20 69 66 20 61 70 70 72 6f 70 72 69  alue if appropri
1c080 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ate..*/.static i
1c090 6e 74 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28  nt booleanValue(
1c0a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
1c0b0 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
1c0c0 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 30 27 20 26  ( zArg[0]=='0' &
1c0d0 26 20 7a 41 72 67 5b 31 5d 3d 3d 27 78 27 20 29  & zArg[1]=='x' )
1c0e0 7b 0a 20 20 20 20 66 6f 72 28 69 3d 32 3b 20 68  {.    for(i=2; h
1c0f0 65 78 44 69 67 69 74 56 61 6c 75 65 28 7a 41 72  exDigitValue(zAr
1c100 67 5b 69 5d 29 3e 3d 30 3b 20 69 2b 2b 29 7b 7d  g[i])>=0; i++){}
1c110 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 6f  .  }else{.    fo
1c120 72 28 69 3d 30 3b 20 7a 41 72 67 5b 69 5d 3e 3d  r(i=0; zArg[i]>=
1c130 27 30 27 20 26 26 20 7a 41 72 67 5b 69 5d 3c 3d  '0' && zArg[i]<=
1c140 27 39 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7d 0a  '9'; i++){}.  }.
1c150 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a 41 72    if( i>0 && zAr
1c160 67 5b 69 5d 3d 3d 30 20 29 20 72 65 74 75 72 6e  g[i]==0 ) return
1c170 20 28 69 6e 74 29 28 69 6e 74 65 67 65 72 56 61   (int)(integerVa
1c180 6c 75 65 28 7a 41 72 67 29 20 26 20 30 78 66 66  lue(zArg) & 0xff
1c190 66 66 66 66 66 66 29 3b 0a 20 20 69 66 28 20 73  ffffff);.  if( s
1c1a0 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
1c1b0 41 72 67 2c 20 22 6f 6e 22 29 3d 3d 30 20 7c 7c  Arg, "on")==0 ||
1c1c0 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
1c1d0 28 7a 41 72 67 2c 22 79 65 73 22 29 3d 3d 30 20  (zArg,"yes")==0 
1c1e0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
1c1f0 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74  .  }.  if( sqlit
1c200 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c  e3_stricmp(zArg,
1c210 20 22 6f 66 66 22 29 3d 3d 30 20 7c 7c 20 73 71   "off")==0 || sq
1c220 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41  lite3_stricmp(zA
1c230 72 67 2c 22 6e 6f 22 29 3d 3d 30 20 29 7b 0a 20  rg,"no")==0 ){. 
1c240 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1c250 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73  .  utf8_printf(s
1c260 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a 20 4e  tderr, "ERROR: N
1c270 6f 74 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c  ot a boolean val
1c280 75 65 3a 20 5c 22 25 73 5c 22 2e 20 41 73 73 75  ue: \"%s\". Assu
1c290 6d 69 6e 67 20 5c 22 6e 6f 5c 22 2e 5c 6e 22 2c  ming \"no\".\n",
1c2a0 0a 20 20 20 20 20 20 20 20 20 20 7a 41 72 67 29  .          zArg)
1c2b0 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
1c2c0 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 63 6c  ./*.** Set or cl
1c2d0 65 61 72 20 61 20 73 68 65 6c 6c 20 66 6c 61 67  ear a shell flag
1c2e0 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 61 20   according to a 
1c2f0 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 0a 2a  boolean value..*
1c300 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  /.static void se
1c310 74 4f 72 43 6c 65 61 72 46 6c 61 67 28 53 68 65  tOrClearFlag(She
1c320 6c 6c 53 74 61 74 65 20 2a 70 2c 20 75 6e 73 69  llState *p, unsi
1c330 67 6e 65 64 20 6d 46 6c 61 67 2c 20 63 6f 6e 73  gned mFlag, cons
1c340 74 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20  t char *zArg){. 
1c350 20 69 66 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75   if( booleanValu
1c360 65 28 7a 41 72 67 29 20 29 7b 0a 20 20 20 20 53  e(zArg) ){.    S
1c370 68 65 6c 6c 53 65 74 46 6c 61 67 28 70 2c 20 6d  hellSetFlag(p, m
1c380 46 6c 61 67 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Flag);.  }else{.
1c390 20 20 20 20 53 68 65 6c 6c 43 6c 65 61 72 46 6c      ShellClearFl
1c3a0 61 67 28 70 2c 20 6d 46 6c 61 67 29 3b 0a 20 20  ag(p, mFlag);.  
1c3b0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  }.}../*.** Close
1c3c0 20 61 6e 20 6f 75 74 70 75 74 20 66 69 6c 65 2c   an output file,
1c3d0 20 61 73 73 75 6d 69 6e 67 20 69 74 20 69 73 20   assuming it is 
1c3e0 6e 6f 74 20 73 74 64 65 72 72 20 6f 72 20 73 74  not stderr or st
1c3f0 64 6f 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dout.*/.static v
1c400 6f 69 64 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f  oid output_file_
1c410 63 6c 6f 73 65 28 46 49 4c 45 20 2a 66 29 7b 0a  close(FILE *f){.
1c420 20 20 69 66 28 20 66 20 26 26 20 66 21 3d 73 74    if( f && f!=st
1c430 64 6f 75 74 20 26 26 20 66 21 3d 73 74 64 65 72  dout && f!=stder
1c440 72 20 29 20 66 63 6c 6f 73 65 28 66 29 3b 0a 7d  r ) fclose(f);.}
1c450 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 6f  ../*.** Try to o
1c460 70 65 6e 20 61 6e 20 6f 75 74 70 75 74 20 66 69  pen an output fi
1c470 6c 65 2e 20 20 20 54 68 65 20 6e 61 6d 65 73 20  le.   The names 
1c480 22 73 74 64 6f 75 74 22 20 61 6e 64 20 22 73 74  "stdout" and "st
1c490 64 65 72 72 22 20 61 72 65 0a 2a 2a 20 72 65 63  derr" are.** rec
1c4a0 6f 67 6e 69 7a 65 64 20 61 6e 64 20 64 6f 20 74  ognized and do t
1c4b0 68 65 20 72 69 67 68 74 20 74 68 69 6e 67 2e 20  he right thing. 
1c4c0 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65   NULL is returne
1c4d0 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 0a  d if the output.
1c4e0 2a 2a 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 22  ** filename is "
1c4f0 6f 66 66 22 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  off"..*/.static 
1c500 46 49 4c 45 20 2a 6f 75 74 70 75 74 5f 66 69 6c  FILE *output_fil
1c510 65 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68 61  e_open(const cha
1c520 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 62 54  r *zFile, int bT
1c530 65 78 74 4d 6f 64 65 29 7b 0a 20 20 46 49 4c 45  extMode){.  FILE
1c540 20 2a 66 3b 0a 20 20 69 66 28 20 73 74 72 63 6d   *f;.  if( strcm
1c550 70 28 7a 46 69 6c 65 2c 22 73 74 64 6f 75 74 22  p(zFile,"stdout"
1c560 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d 20  )==0 ){.    f = 
1c570 73 74 64 6f 75 74 3b 0a 20 20 7d 65 6c 73 65 20  stdout;.  }else 
1c580 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65  if( strcmp(zFile
1c590 2c 20 22 73 74 64 65 72 72 22 29 3d 3d 30 20 29  , "stderr")==0 )
1c5a0 7b 0a 20 20 20 20 66 20 3d 20 73 74 64 65 72 72  {.    f = stderr
1c5b0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
1c5c0 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22 6f 66 66  rcmp(zFile, "off
1c5d0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d  ")==0 ){.    f =
1c5e0 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   0;.  }else{.   
1c5f0 20 66 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65   f = fopen(zFile
1c600 2c 20 62 54 65 78 74 4d 6f 64 65 20 3f 20 22 77  , bTextMode ? "w
1c610 22 20 3a 20 22 77 62 22 29 3b 0a 20 20 20 20 69  " : "wb");.    i
1c620 66 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( f==0 ){.     
1c630 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
1c640 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  err, "Error: can
1c650 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c  not open \"%s\"\
1c660 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20  n", zFile);.    
1c670 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 66  }.  }.  return f
1c680 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
1c690 64 28 53 51 4c 49 54 45 5f 55 4e 54 45 53 54 41  d(SQLITE_UNTESTA
1c6a0 42 4c 45 29 0a 23 69 66 20 21 64 65 66 69 6e 65  BLE).#if !define
1c6b0 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  d(SQLITE_OMIT_TR
1c6c0 41 43 45 29 20 26 26 20 21 64 65 66 69 6e 65 64  ACE) && !defined
1c6d0 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f  (SQLITE_OMIT_FLO
1c6e0 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 2f 2a 0a  ATING_POINT)./*.
1c6f0 2a 2a 20 41 20 72 6f 75 74 69 6e 65 20 66 6f 72  ** A routine for
1c700 20 68 61 6e 64 6c 69 6e 67 20 6f 75 74 70 75 74   handling output
1c710 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 74 72   from sqlite3_tr
1c720 61 63 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ace()..*/.static
1c730 20 69 6e 74 20 73 71 6c 5f 74 72 61 63 65 5f 63   int sql_trace_c
1c740 61 6c 6c 62 61 63 6b 28 0a 20 20 75 6e 73 69 67  allback(.  unsig
1c750 6e 65 64 20 6d 54 79 70 65 2c 0a 20 20 76 6f 69  ned mType,.  voi
1c760 64 20 2a 70 41 72 67 2c 0a 20 20 76 6f 69 64 20  d *pArg,.  void 
1c770 2a 70 50 2c 0a 20 20 76 6f 69 64 20 2a 70 58 0a  *pP,.  void *pX.
1c780 29 7b 0a 20 20 46 49 4c 45 20 2a 66 20 3d 20 28  ){.  FILE *f = (
1c790 46 49 4c 45 2a 29 70 41 72 67 3b 0a 20 20 55 4e  FILE*)pArg;.  UN
1c7a0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 6d  USED_PARAMETER(m
1c7b0 54 79 70 65 29 3b 0a 20 20 55 4e 55 53 45 44 5f  Type);.  UNUSED_
1c7c0 50 41 52 41 4d 45 54 45 52 28 70 50 29 3b 0a 20  PARAMETER(pP);. 
1c7d0 20 69 66 28 20 66 20 29 7b 0a 20 20 20 20 63 6f   if( f ){.    co
1c7e0 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28 63  nst char *z = (c
1c7f0 6f 6e 73 74 20 63 68 61 72 2a 29 70 58 3b 0a 20  onst char*)pX;. 
1c800 20 20 20 69 6e 74 20 69 20 3d 20 73 74 72 6c 65     int i = strle
1c810 6e 33 30 28 7a 29 3b 0a 20 20 20 20 77 68 69 6c  n30(z);.    whil
1c820 65 28 20 69 3e 30 20 26 26 20 7a 5b 69 2d 31 5d  e( i>0 && z[i-1]
1c830 3d 3d 27 3b 27 20 29 7b 20 69 2d 2d 3b 20 7d 0a  ==';' ){ i--; }.
1c840 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
1c850 66 2c 20 22 25 2e 2a 73 3b 5c 6e 22 2c 20 69 2c  f, "%.*s;\n", i,
1c860 20 7a 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72   z);.  }.  retur
1c870 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 23 65  n 0;.}.#endif.#e
1c880 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 6f  ndif../*.** A no
1c890 2d 6f 70 20 72 6f 75 74 69 6e 65 20 74 68 61 74  -op routine that
1c8a0 20 72 75 6e 73 20 77 69 74 68 20 74 68 65 20 22   runs with the "
1c8b0 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20 64 6f 63  .breakpoint" doc
1c8c0 2d 63 6f 6d 6d 61 6e 64 2e 20 20 54 68 69 73 20  -command.  This 
1c8d0 69 73 0a 2a 2a 20 61 20 75 73 65 66 75 6c 20 73  is.** a useful s
1c8e0 70 6f 74 20 74 6f 20 73 65 74 20 61 20 64 65 62  pot to set a deb
1c8f0 75 67 67 65 72 20 62 72 65 61 6b 70 6f 69 6e 74  ugger breakpoint
1c900 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1c910 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74   test_breakpoint
1c920 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63  (void){.  static
1c930 20 69 6e 74 20 6e 43 61 6c 6c 20 3d 20 30 3b 0a   int nCall = 0;.
1c940 20 20 6e 43 61 6c 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a    nCall++;.}../*
1c950 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 75 73  .** An object us
1c960 65 64 20 74 6f 20 72 65 61 64 20 61 20 43 53 56  ed to read a CSV
1c970 20 61 6e 64 20 6f 74 68 65 72 20 66 69 6c 65 73   and other files
1c980 20 66 6f 72 20 69 6d 70 6f 72 74 2e 0a 2a 2f 0a   for import..*/.
1c990 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 49  typedef struct I
1c9a0 6d 70 6f 72 74 43 74 78 20 49 6d 70 6f 72 74 43  mportCtx ImportC
1c9b0 74 78 3b 0a 73 74 72 75 63 74 20 49 6d 70 6f 72  tx;.struct Impor
1c9c0 74 43 74 78 20 7b 0a 20 20 63 6f 6e 73 74 20 63  tCtx {.  const c
1c9d0 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 2f 2a 20  har *zFile;  /* 
1c9e0 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 70 75  Name of the inpu
1c9f0 74 20 66 69 6c 65 20 2a 2f 0a 20 20 46 49 4c 45  t file */.  FILE
1ca00 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20   *in;           
1ca10 2f 2a 20 52 65 61 64 20 74 68 65 20 43 53 56 20  /* Read the CSV 
1ca20 74 65 78 74 20 66 72 6f 6d 20 74 68 69 73 20 69  text from this i
1ca30 6e 70 75 74 20 73 74 72 65 61 6d 20 2a 2f 0a 20  nput stream */. 
1ca40 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20   char *z;       
1ca50 20 20 20 20 20 2f 2a 20 41 63 63 75 6d 75 6c 61       /* Accumula
1ca60 74 65 64 20 74 65 78 74 20 66 6f 72 20 61 20 66  ted text for a f
1ca70 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b  ield */.  int n;
1ca80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ca90 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
1caa0 20 69 6e 20 7a 20 2a 2f 0a 20 20 69 6e 74 20 6e   in z */.  int n
1cab0 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 2f  Alloc;         /
1cac0 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65  * Space allocate
1cad0 64 20 66 6f 72 20 7a 5b 5d 20 2a 2f 0a 20 20 69  d for z[] */.  i
1cae0 6e 74 20 6e 4c 69 6e 65 3b 20 20 20 20 20 20 20  nt nLine;       
1caf0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 69     /* Current li
1cb00 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69  ne number */.  i
1cb10 6e 74 20 62 4e 6f 74 46 69 72 73 74 3b 20 20 20  nt bNotFirst;   
1cb20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 6e     /* True if on
1cb30 65 20 6f 72 20 6d 6f 72 65 20 62 79 74 65 73 20  e or more bytes 
1cb40 61 6c 72 65 61 64 79 20 72 65 61 64 20 2a 2f 0a  already read */.
1cb50 20 20 69 6e 74 20 63 54 65 72 6d 3b 20 20 20 20    int cTerm;    
1cb60 20 20 20 20 20 20 2f 2a 20 43 68 61 72 61 63 74        /* Charact
1cb70 65 72 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74  er that terminat
1cb80 65 64 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65  ed the most rece
1cb90 6e 74 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e  nt field */.  in
1cba0 74 20 63 43 6f 6c 53 65 70 3b 20 20 20 20 20 20  t cColSep;      
1cbb0 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20    /* The column 
1cbc0 73 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63  separator charac
1cbd0 74 65 72 2e 20 20 28 55 73 75 61 6c 6c 79 20 22  ter.  (Usually "
1cbe0 2c 22 29 20 2a 2f 0a 20 20 69 6e 74 20 63 52 6f  ,") */.  int cRo
1cbf0 77 53 65 70 3b 20 20 20 20 20 20 20 20 2f 2a 20  wSep;        /* 
1cc00 54 68 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f  The row separato
1cc10 72 20 63 68 61 72 61 63 74 65 72 2e 20 20 28 55  r character.  (U
1cc20 73 75 61 6c 6c 79 20 22 5c 6e 22 29 20 2a 2f 0a  sually "\n") */.
1cc30 7d 3b 0a 0a 2f 2a 20 41 70 70 65 6e 64 20 61 20  };../* Append a 
1cc40 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 20 7a  single byte to z
1cc50 5b 5d 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  [] */.static voi
1cc60 64 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f  d import_append_
1cc70 63 68 61 72 28 49 6d 70 6f 72 74 43 74 78 20 2a  char(ImportCtx *
1cc80 70 2c 20 69 6e 74 20 63 29 7b 0a 20 20 69 66 28  p, int c){.  if(
1cc90 20 70 2d 3e 6e 2b 31 3e 3d 70 2d 3e 6e 41 6c 6c   p->n+1>=p->nAll
1cca0 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 41 6c  oc ){.    p->nAl
1ccb0 6c 6f 63 20 2b 3d 20 70 2d 3e 6e 41 6c 6c 6f 63  loc += p->nAlloc
1ccc0 20 2b 20 31 30 30 3b 0a 20 20 20 20 70 2d 3e 7a   + 100;.    p->z
1ccd0 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
1cce0 6f 63 36 34 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41  oc64(p->z, p->nA
1ccf0 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 70  lloc);.    if( p
1cd00 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->z==0 ){.      
1cd10 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
1cd20 72 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  r, "out of memor
1cd30 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65 78 69  y\n");.      exi
1cd40 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  t(1);.    }.  }.
1cd50 20 20 70 2d 3e 7a 5b 70 2d 3e 6e 2b 2b 5d 20 3d    p->z[p->n++] =
1cd60 20 28 63 68 61 72 29 63 3b 0a 7d 0a 0a 2f 2a 20   (char)c;.}../* 
1cd70 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 66 69  Read a single fi
1cd80 65 6c 64 20 6f 66 20 43 53 56 20 74 65 78 74 2e  eld of CSV text.
1cd90 20 20 43 6f 6d 70 61 74 69 62 6c 65 20 77 69 74    Compatible wit
1cda0 68 20 72 66 63 34 31 38 30 20 61 6e 64 20 65 78  h rfc4180 and ex
1cdb0 74 65 6e 64 65 64 0a 2a 2a 20 77 69 74 68 20 74  tended.** with t
1cdc0 68 65 20 6f 70 74 69 6f 6e 20 6f 66 20 68 61 76  he option of hav
1cdd0 69 6e 67 20 61 20 73 65 70 61 72 61 74 6f 72 20  ing a separator 
1cde0 6f 74 68 65 72 20 74 68 61 6e 20 22 2c 22 2e 0a  other than ","..
1cdf0 2a 2a 0a 2a 2a 20 20 20 2b 20 20 49 6e 70 75 74  **.**   +  Input
1ce00 20 63 6f 6d 65 73 20 66 72 6f 6d 20 70 2d 3e 69   comes from p->i
1ce10 6e 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65  n..**   +  Store
1ce20 20 72 65 73 75 6c 74 73 20 69 6e 20 70 2d 3e 7a   results in p->z
1ce30 20 6f 66 20 6c 65 6e 67 74 68 20 70 2d 3e 6e 2e   of length p->n.
1ce40 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20    Space to hold 
1ce50 70 2d 3e 7a 20 63 6f 6d 65 73 0a 2a 2a 20 20 20  p->z comes.**   
1ce60 20 20 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f     from sqlite3_
1ce70 6d 61 6c 6c 6f 63 36 34 28 29 2e 0a 2a 2a 20 20  malloc64()..**  
1ce80 20 2b 20 20 55 73 65 20 70 2d 3e 63 53 65 70 20   +  Use p->cSep 
1ce90 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 73 65  as the column se
1cea0 70 61 72 61 74 6f 72 2e 20 20 54 68 65 20 64 65  parator.  The de
1ceb0 66 61 75 6c 74 20 69 73 20 22 2c 22 2e 0a 2a 2a  fault is ","..**
1cec0 20 20 20 2b 20 20 55 73 65 20 70 2d 3e 72 53 65     +  Use p->rSe
1ced0 70 20 61 73 20 74 68 65 20 72 6f 77 20 73 65 70  p as the row sep
1cee0 61 72 61 74 6f 72 2e 20 20 54 68 65 20 64 65 66  arator.  The def
1cef0 61 75 6c 74 20 69 73 20 22 5c 6e 22 2e 0a 2a 2a  ault is "\n"..**
1cf00 20 20 20 2b 20 20 4b 65 65 70 20 74 72 61 63 6b     +  Keep track
1cf10 20 6f 66 20 74 68 65 20 6c 69 6e 65 20 6e 75 6d   of the line num
1cf20 62 65 72 20 69 6e 20 70 2d 3e 6e 4c 69 6e 65 2e  ber in p->nLine.
1cf30 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65 20 74  .**   +  Store t
1cf40 68 65 20 63 68 61 72 61 63 74 65 72 20 74 68 61  he character tha
1cf50 74 20 74 65 72 6d 69 6e 61 74 65 73 20 74 68 65  t terminates the
1cf60 20 66 69 65 6c 64 20 69 6e 20 70 2d 3e 63 54 65   field in p->cTe
1cf70 72 6d 2e 20 20 53 74 6f 72 65 0a 2a 2a 20 20 20  rm.  Store.**   
1cf80 20 20 20 45 4f 46 20 6f 6e 20 65 6e 64 2d 6f 66     EOF on end-of
1cf90 2d 66 69 6c 65 2e 0a 2a 2a 20 20 20 2b 20 20 52  -file..**   +  R
1cfa0 65 70 6f 72 74 20 73 79 6e 74 61 78 20 65 72 72  eport syntax err
1cfb0 6f 72 73 20 6f 6e 20 73 74 64 65 72 72 0a 2a 2f  ors on stderr.*/
1cfc0 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 53 51  .static char *SQ
1cfd0 4c 49 54 45 5f 43 44 45 43 4c 20 63 73 76 5f 72  LITE_CDECL csv_r
1cfe0 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 28 49 6d  ead_one_field(Im
1cff0 70 6f 72 74 43 74 78 20 2a 70 29 7b 0a 20 20 69  portCtx *p){.  i
1d000 6e 74 20 63 3b 0a 20 20 69 6e 74 20 63 53 65 70  nt c;.  int cSep
1d010 20 3d 20 70 2d 3e 63 43 6f 6c 53 65 70 3b 0a 20   = p->cColSep;. 
1d020 20 69 6e 74 20 72 53 65 70 20 3d 20 70 2d 3e 63   int rSep = p->c
1d030 52 6f 77 53 65 70 3b 0a 20 20 70 2d 3e 6e 20 3d  RowSep;.  p->n =
1d040 20 30 3b 0a 20 20 63 20 3d 20 66 67 65 74 63 28   0;.  c = fgetc(
1d050 70 2d 3e 69 6e 29 3b 0a 20 20 69 66 28 20 63 3d  p->in);.  if( c=
1d060 3d 45 4f 46 20 7c 7c 20 73 65 65 6e 49 6e 74 65  =EOF || seenInte
1d070 72 72 75 70 74 20 29 7b 0a 20 20 20 20 70 2d 3e  rrupt ){.    p->
1d080 63 54 65 72 6d 20 3d 20 45 4f 46 3b 0a 20 20 20  cTerm = EOF;.   
1d090 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1d0a0 20 69 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20   if( c=='"' ){. 
1d0b0 20 20 20 69 6e 74 20 70 63 2c 20 70 70 63 3b 0a     int pc, ppc;.
1d0c0 20 20 20 20 69 6e 74 20 73 74 61 72 74 4c 69 6e      int startLin
1d0d0 65 20 3d 20 70 2d 3e 6e 4c 69 6e 65 3b 0a 20 20  e = p->nLine;.  
1d0e0 20 20 69 6e 74 20 63 51 75 6f 74 65 20 3d 20 63    int cQuote = c
1d0f0 3b 0a 20 20 20 20 70 63 20 3d 20 70 70 63 20 3d  ;.    pc = ppc =
1d100 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 31   0;.    while( 1
1d110 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20 66 67   ){.      c = fg
1d120 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20  etc(p->in);.    
1d130 20 20 69 66 28 20 63 3d 3d 72 53 65 70 20 29 20    if( c==rSep ) 
1d140 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20  p->nLine++;.    
1d150 20 20 69 66 28 20 63 3d 3d 63 51 75 6f 74 65 20    if( c==cQuote 
1d160 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  ){.        if( p
1d170 63 3d 3d 63 51 75 6f 74 65 20 29 7b 0a 20 20 20  c==cQuote ){.   
1d180 20 20 20 20 20 20 20 70 63 20 3d 20 30 3b 0a 20         pc = 0;. 
1d190 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
1d1a0 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
1d1b0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28     }.      if( (
1d1c0 63 3d 3d 63 53 65 70 20 26 26 20 70 63 3d 3d 63  c==cSep && pc==c
1d1d0 51 75 6f 74 65 29 0a 20 20 20 20 20 20 20 7c 7c  Quote).       ||
1d1e0 20 28 63 3d 3d 72 53 65 70 20 26 26 20 70 63 3d   (c==rSep && pc=
1d1f0 3d 63 51 75 6f 74 65 29 0a 20 20 20 20 20 20 20  =cQuote).       
1d200 7c 7c 20 28 63 3d 3d 72 53 65 70 20 26 26 20 70  || (c==rSep && p
1d210 63 3d 3d 27 5c 72 27 20 26 26 20 70 70 63 3d 3d  c=='\r' && ppc==
1d220 63 51 75 6f 74 65 29 0a 20 20 20 20 20 20 20 7c  cQuote).       |
1d230 7c 20 28 63 3d 3d 45 4f 46 20 26 26 20 70 63 3d  | (c==EOF && pc=
1d240 3d 63 51 75 6f 74 65 29 0a 20 20 20 20 20 20 29  =cQuote).      )
1d250 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 20 70 2d  {.        do{ p-
1d260 3e 6e 2d 2d 3b 20 7d 77 68 69 6c 65 28 20 70 2d  >n--; }while( p-
1d270 3e 7a 5b 70 2d 3e 6e 5d 21 3d 63 51 75 6f 74 65  >z[p->n]!=cQuote
1d280 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63   );.        p->c
1d290 54 65 72 6d 20 3d 20 63 3b 0a 20 20 20 20 20 20  Term = c;.      
1d2a0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1d2b0 0a 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d 63  .      if( pc==c
1d2c0 51 75 6f 74 65 20 26 26 20 63 21 3d 27 5c 72 27  Quote && c!='\r'
1d2d0 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
1d2e0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
1d2f0 22 25 73 3a 25 64 3a 20 75 6e 65 73 63 61 70 65  "%s:%d: unescape
1d300 64 20 25 63 20 63 68 61 72 61 63 74 65 72 5c 6e  d %c character\n
1d310 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1d320 20 20 20 70 2d 3e 7a 46 69 6c 65 2c 20 70 2d 3e     p->zFile, p->
1d330 6e 4c 69 6e 65 2c 20 63 51 75 6f 74 65 29 3b 0a  nLine, cQuote);.
1d340 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1d350 28 20 63 3d 3d 45 4f 46 20 29 7b 0a 20 20 20 20  ( c==EOF ){.    
1d360 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
1d370 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20  stderr, "%s:%d: 
1d380 75 6e 74 65 72 6d 69 6e 61 74 65 64 20 25 63 2d  unterminated %c-
1d390 71 75 6f 74 65 64 20 66 69 65 6c 64 5c 6e 22 2c  quoted field\n",
1d3a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1d3b0 20 70 2d 3e 7a 46 69 6c 65 2c 20 73 74 61 72 74   p->zFile, start
1d3c0 4c 69 6e 65 2c 20 63 51 75 6f 74 65 29 3b 0a 20  Line, cQuote);. 
1d3d0 20 20 20 20 20 20 20 70 2d 3e 63 54 65 72 6d 20         p->cTerm 
1d3e0 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65  = c;.        bre
1d3f0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1d400 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f    import_append_
1d410 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20  char(p, c);.    
1d420 20 20 70 70 63 20 3d 20 70 63 3b 0a 20 20 20 20    ppc = pc;.    
1d430 20 20 70 63 20 3d 20 63 3b 0a 20 20 20 20 7d 0a    pc = c;.    }.
1d440 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
1d450 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  If this is the f
1d460 69 72 73 74 20 66 69 65 6c 64 20 62 65 69 6e 67  irst field being
1d470 20 70 61 72 73 65 64 20 61 6e 64 20 69 74 20 62   parsed and it b
1d480 65 67 69 6e 73 20 77 69 74 68 20 74 68 65 0a 20  egins with the. 
1d490 20 20 20 2a 2a 20 55 54 46 2d 38 20 42 4f 4d 20     ** UTF-8 BOM 
1d4a0 20 28 30 78 45 46 20 42 42 20 42 46 29 20 74 68   (0xEF BB BF) th
1d4b0 65 6e 20 73 6b 69 70 20 74 68 65 20 42 4f 4d 20  en skip the BOM 
1d4c0 2a 2f 0a 20 20 20 20 69 66 28 20 28 63 26 30 78  */.    if( (c&0x
1d4d0 66 66 29 3d 3d 30 78 65 66 20 26 26 20 70 2d 3e  ff)==0xef && p->
1d4e0 62 4e 6f 74 46 69 72 73 74 3d 3d 30 20 29 7b 0a  bNotFirst==0 ){.
1d4f0 20 20 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70        import_app
1d500 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a  end_char(p, c);.
1d510 20 20 20 20 20 20 63 20 3d 20 66 67 65 74 63 28        c = fgetc(
1d520 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 69 66  p->in);.      if
1d530 28 20 28 63 26 30 78 66 66 29 3d 3d 30 78 62 62  ( (c&0xff)==0xbb
1d540 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6d 70 6f   ){.        impo
1d550 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70  rt_append_char(p
1d560 2c 20 63 29 3b 0a 20 20 20 20 20 20 20 20 63 20  , c);.        c 
1d570 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a  = fgetc(p->in);.
1d580 20 20 20 20 20 20 20 20 69 66 28 20 28 63 26 30          if( (c&0
1d590 78 66 66 29 3d 3d 30 78 62 66 20 29 7b 0a 20 20  xff)==0xbf ){.  
1d5a0 20 20 20 20 20 20 20 20 70 2d 3e 62 4e 6f 74 46          p->bNotF
1d5b0 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  irst = 1;.      
1d5c0 20 20 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20      p->n = 0;.  
1d5d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 63          return c
1d5e0 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c  sv_read_one_fiel
1d5f0 64 28 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  d(p);.        }.
1d600 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1d610 20 20 77 68 69 6c 65 28 20 63 21 3d 45 4f 46 20    while( c!=EOF 
1d620 26 26 20 63 21 3d 63 53 65 70 20 26 26 20 63 21  && c!=cSep && c!
1d630 3d 72 53 65 70 20 29 7b 0a 20 20 20 20 20 20 69  =rSep ){.      i
1d640 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61  mport_append_cha
1d650 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20 20 63  r(p, c);.      c
1d660 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b   = fgetc(p->in);
1d670 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63  .    }.    if( c
1d680 3d 3d 72 53 65 70 20 29 7b 0a 20 20 20 20 20 20  ==rSep ){.      
1d690 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20  p->nLine++;.    
1d6a0 20 20 69 66 28 20 70 2d 3e 6e 3e 30 20 26 26 20    if( p->n>0 && 
1d6b0 70 2d 3e 7a 5b 70 2d 3e 6e 2d 31 5d 3d 3d 27 5c  p->z[p->n-1]=='\
1d6c0 72 27 20 29 20 70 2d 3e 6e 2d 2d 3b 0a 20 20 20  r' ) p->n--;.   
1d6d0 20 7d 0a 20 20 20 20 70 2d 3e 63 54 65 72 6d 20   }.    p->cTerm 
1d6e0 3d 20 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  = c;.  }.  if( p
1d6f0 2d 3e 7a 20 29 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d  ->z ) p->z[p->n]
1d700 20 3d 20 30 3b 0a 20 20 70 2d 3e 62 4e 6f 74 46   = 0;.  p->bNotF
1d710 69 72 73 74 20 3d 20 31 3b 0a 20 20 72 65 74 75  irst = 1;.  retu
1d720 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a 2f 2a 20 52  rn p->z;.}../* R
1d730 65 61 64 20 61 20 73 69 6e 67 6c 65 20 66 69 65  ead a single fie
1d740 6c 64 20 6f 66 20 41 53 43 49 49 20 64 65 6c 69  ld of ASCII deli
1d750 6d 69 74 65 64 20 74 65 78 74 2e 0a 2a 2a 0a 2a  mited text..**.*
1d760 2a 20 20 20 2b 20 20 49 6e 70 75 74 20 63 6f 6d  *   +  Input com
1d770 65 73 20 66 72 6f 6d 20 70 2d 3e 69 6e 2e 0a 2a  es from p->in..*
1d780 2a 20 20 20 2b 20 20 53 74 6f 72 65 20 72 65 73  *   +  Store res
1d790 75 6c 74 73 20 69 6e 20 70 2d 3e 7a 20 6f 66 20  ults in p->z of 
1d7a0 6c 65 6e 67 74 68 20 70 2d 3e 6e 2e 20 20 53 70  length p->n.  Sp
1d7b0 61 63 65 20 74 6f 20 68 6f 6c 64 20 70 2d 3e 7a  ace to hold p->z
1d7c0 20 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 66   comes.**      f
1d7d0 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  rom sqlite3_mall
1d7e0 6f 63 36 34 28 29 2e 0a 2a 2a 20 20 20 2b 20 20  oc64()..**   +  
1d7f0 55 73 65 20 70 2d 3e 63 53 65 70 20 61 73 20 74  Use p->cSep as t
1d800 68 65 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61  he column separa
1d810 74 6f 72 2e 20 20 54 68 65 20 64 65 66 61 75 6c  tor.  The defaul
1d820 74 20 69 73 20 22 5c 78 31 46 22 2e 0a 2a 2a 20  t is "\x1F"..** 
1d830 20 20 2b 20 20 55 73 65 20 70 2d 3e 72 53 65 70    +  Use p->rSep
1d840 20 61 73 20 74 68 65 20 72 6f 77 20 73 65 70 61   as the row sepa
1d850 72 61 74 6f 72 2e 20 20 54 68 65 20 64 65 66 61  rator.  The defa
1d860 75 6c 74 20 69 73 20 22 5c 78 31 45 22 2e 0a 2a  ult is "\x1E"..*
1d870 2a 20 20 20 2b 20 20 4b 65 65 70 20 74 72 61 63  *   +  Keep trac
1d880 6b 20 6f 66 20 74 68 65 20 72 6f 77 20 6e 75 6d  k of the row num
1d890 62 65 72 20 69 6e 20 70 2d 3e 6e 4c 69 6e 65 2e  ber in p->nLine.
1d8a0 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65 20 74  .**   +  Store t
1d8b0 68 65 20 63 68 61 72 61 63 74 65 72 20 74 68 61  he character tha
1d8c0 74 20 74 65 72 6d 69 6e 61 74 65 73 20 74 68 65  t terminates the
1d8d0 20 66 69 65 6c 64 20 69 6e 20 70 2d 3e 63 54 65   field in p->cTe
1d8e0 72 6d 2e 20 20 53 74 6f 72 65 0a 2a 2a 20 20 20  rm.  Store.**   
1d8f0 20 20 20 45 4f 46 20 6f 6e 20 65 6e 64 2d 6f 66     EOF on end-of
1d900 2d 66 69 6c 65 2e 0a 2a 2a 20 20 20 2b 20 20 52  -file..**   +  R
1d910 65 70 6f 72 74 20 73 79 6e 74 61 78 20 65 72 72  eport syntax err
1d920 6f 72 73 20 6f 6e 20 73 74 64 65 72 72 0a 2a 2f  ors on stderr.*/
1d930 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 53 51  .static char *SQ
1d940 4c 49 54 45 5f 43 44 45 43 4c 20 61 73 63 69 69  LITE_CDECL ascii
1d950 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 28  _read_one_field(
1d960 49 6d 70 6f 72 74 43 74 78 20 2a 70 29 7b 0a 20  ImportCtx *p){. 
1d970 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 63 53   int c;.  int cS
1d980 65 70 20 3d 20 70 2d 3e 63 43 6f 6c 53 65 70 3b  ep = p->cColSep;
1d990 0a 20 20 69 6e 74 20 72 53 65 70 20 3d 20 70 2d  .  int rSep = p-
1d9a0 3e 63 52 6f 77 53 65 70 3b 0a 20 20 70 2d 3e 6e  >cRowSep;.  p->n
1d9b0 20 3d 20 30 3b 0a 20 20 63 20 3d 20 66 67 65 74   = 0;.  c = fget
1d9c0 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 69 66 28 20  c(p->in);.  if( 
1d9d0 63 3d 3d 45 4f 46 20 7c 7c 20 73 65 65 6e 49 6e  c==EOF || seenIn
1d9e0 74 65 72 72 75 70 74 20 29 7b 0a 20 20 20 20 70  terrupt ){.    p
1d9f0 2d 3e 63 54 65 72 6d 20 3d 20 45 4f 46 3b 0a 20  ->cTerm = EOF;. 
1da00 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1da10 0a 20 20 77 68 69 6c 65 28 20 63 21 3d 45 4f 46  .  while( c!=EOF
1da20 20 26 26 20 63 21 3d 63 53 65 70 20 26 26 20 63   && c!=cSep && c
1da30 21 3d 72 53 65 70 20 29 7b 0a 20 20 20 20 69 6d  !=rSep ){.    im
1da40 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72  port_append_char
1da50 28 70 2c 20 63 29 3b 0a 20 20 20 20 63 20 3d 20  (p, c);.    c = 
1da60 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20  fgetc(p->in);.  
1da70 7d 0a 20 20 69 66 28 20 63 3d 3d 72 53 65 70 20  }.  if( c==rSep 
1da80 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 69 6e 65 2b  ){.    p->nLine+
1da90 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 54 65 72  +;.  }.  p->cTer
1daa0 6d 20 3d 20 63 3b 0a 20 20 69 66 28 20 70 2d 3e  m = c;.  if( p->
1dab0 7a 20 29 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d  z ) p->z[p->n] =
1dac0 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e   0;.  return p->
1dad0 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20  z;.}../*.** Try 
1dae0 74 6f 20 74 72 61 6e 73 66 65 72 20 64 61 74 61  to transfer data
1daf0 20 66 6f 72 20 74 61 62 6c 65 20 7a 54 61 62 6c   for table zTabl
1db00 65 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20  e.  If an error 
1db10 69 73 20 73 65 65 6e 20 77 68 69 6c 65 0a 2a 2a  is seen while.**
1db20 20 6d 6f 76 69 6e 67 20 66 6f 72 77 61 72 64 2c   moving forward,
1db30 20 74 72 79 20 74 6f 20 67 6f 20 62 61 63 6b 77   try to go backw
1db40 61 72 64 73 2e 20 20 54 68 65 20 62 61 63 6b 77  ards.  The backw
1db50 61 72 64 73 20 6d 6f 76 65 6d 65 6e 74 20 77 6f  ards movement wo
1db60 6e 27 74 0a 2a 2a 20 77 6f 72 6b 20 66 6f 72 20  n't.** work for 
1db70 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61  WITHOUT ROWID ta
1db80 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  bles..*/.static 
1db90 76 6f 69 64 20 74 72 79 54 6f 43 6c 6f 6e 65 44  void tryToCloneD
1dba0 61 74 61 28 0a 20 20 53 68 65 6c 6c 53 74 61 74  ata(.  ShellStat
1dbb0 65 20 2a 70 2c 0a 20 20 73 71 6c 69 74 65 33 20  e *p,.  sqlite3 
1dbc0 2a 6e 65 77 44 62 2c 0a 20 20 63 6f 6e 73 74 20  *newDb,.  const 
1dbd0 63 68 61 72 20 2a 7a 54 61 62 6c 65 0a 29 7b 0a  char *zTable.){.
1dbe0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1dbf0 70 51 75 65 72 79 20 3d 20 30 3b 0a 20 20 73 71  pQuery = 0;.  sq
1dc00 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 6e 73  lite3_stmt *pIns
1dc10 65 72 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  ert = 0;.  char 
1dc20 2a 7a 51 75 65 72 79 20 3d 20 30 3b 0a 20 20 63  *zQuery = 0;.  c
1dc30 68 61 72 20 2a 7a 49 6e 73 65 72 74 20 3d 20 30  har *zInsert = 0
1dc40 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e  ;.  int rc;.  in
1dc50 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 69 6e 74  t i, j, n;.  int
1dc60 20 6e 54 61 62 6c 65 20 3d 20 73 74 72 6c 65 6e   nTable = strlen
1dc70 33 30 28 7a 54 61 62 6c 65 29 3b 0a 20 20 69 6e  30(zTable);.  in
1dc80 74 20 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63  t k = 0;.  int c
1dc90 6e 74 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20  nt = 0;.  const 
1dca0 69 6e 74 20 73 70 69 6e 52 61 74 65 20 3d 20 31  int spinRate = 1
1dcb0 30 30 30 30 3b 0a 0a 20 20 7a 51 75 65 72 79 20  0000;..  zQuery 
1dcc0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1dcd0 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  f("SELECT * FROM
1dce0 20 5c 22 25 77 5c 22 22 2c 20 7a 54 61 62 6c 65   \"%w\"", zTable
1dcf0 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1dd00 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
1dd10 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20  db, zQuery, -1, 
1dd20 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 69  &pQuery, 0);.  i
1dd30 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66  f( rc ){.    utf
1dd40 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
1dd50 20 22 45 72 72 6f 72 20 25 64 3a 20 25 73 20 6f   "Error %d: %s o
1dd60 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20  n [%s]\n",.     
1dd70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
1dd80 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28  xtended_errcode(
1dd90 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65 33 5f  p->db), sqlite3_
1dda0 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c 0a 20  errmsg(p->db),. 
1ddb0 20 20 20 20 20 20 20 20 20 20 20 7a 51 75 65 72             zQuer
1ddc0 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  y);.    goto end
1ddd0 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20 20 7d 0a  _data_xfer;.  }.
1dde0 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f    n = sqlite3_co
1ddf0 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 51 75 65 72  lumn_count(pQuer
1de00 79 29 3b 0a 20 20 7a 49 6e 73 65 72 74 20 3d 20  y);.  zInsert = 
1de10 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
1de20 28 32 30 30 20 2b 20 6e 54 61 62 6c 65 20 2b 20  (200 + nTable + 
1de30 6e 2a 33 29 3b 0a 20 20 69 66 28 20 7a 49 6e 73  n*3);.  if( zIns
1de40 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61  ert==0 ){.    ra
1de50 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
1de60 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c   "out of memory\
1de70 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  n");.    goto en
1de80 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20 20 7d  d_data_xfer;.  }
1de90 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
1dea0 6e 74 66 28 32 30 30 2b 6e 54 61 62 6c 65 2c 7a  ntf(200+nTable,z
1deb0 49 6e 73 65 72 74 2c 0a 20 20 20 20 20 20 20 20  Insert,.        
1dec0 20 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45             "INSE
1ded0 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54  RT OR IGNORE INT
1dee0 4f 20 5c 22 25 73 5c 22 20 56 41 4c 55 45 53 28  O \"%s\" VALUES(
1def0 3f 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 69  ?", zTable);.  i
1df00 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 49 6e 73   = strlen30(zIns
1df10 65 72 74 29 3b 0a 20 20 66 6f 72 28 6a 3d 31 3b  ert);.  for(j=1;
1df20 20 6a 3c 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20   j<n; j++){.    
1df30 6d 65 6d 63 70 79 28 7a 49 6e 73 65 72 74 2b 69  memcpy(zInsert+i
1df40 2c 20 22 2c 3f 22 2c 20 32 29 3b 0a 20 20 20 20  , ",?", 2);.    
1df50 69 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 6d 65  i += 2;.  }.  me
1df60 6d 63 70 79 28 7a 49 6e 73 65 72 74 2b 69 2c 20  mcpy(zInsert+i, 
1df70 22 29 3b 22 2c 20 33 29 3b 0a 20 20 72 63 20 3d  ");", 3);.  rc =
1df80 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
1df90 5f 76 32 28 6e 65 77 44 62 2c 20 7a 49 6e 73 65  _v2(newDb, zInse
1dfa0 72 74 2c 20 2d 31 2c 20 26 70 49 6e 73 65 72 74  rt, -1, &pInsert
1dfb0 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
1dfc0 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
1dfd0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
1dfe0 20 25 64 3a 20 25 73 20 6f 6e 20 5b 25 73 5d 5c   %d: %s on [%s]\
1dff0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1e000 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
1e010 5f 65 72 72 63 6f 64 65 28 6e 65 77 44 62 29 2c  _errcode(newDb),
1e020 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
1e030 6e 65 77 44 62 29 2c 0a 20 20 20 20 20 20 20 20  newDb),.        
1e040 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20 20      zQuery);.   
1e050 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74 61 5f 78   goto end_data_x
1e060 66 65 72 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 6b  fer;.  }.  for(k
1e070 3d 30 3b 20 6b 3c 32 3b 20 6b 2b 2b 29 7b 0a 20  =0; k<2; k++){. 
1e080 20 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d 20     while( (rc = 
1e090 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 51 75  sqlite3_step(pQu
1e0a0 65 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  ery))==SQLITE_RO
1e0b0 57 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  W ){.      for(i
1e0c0 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20  =0; i<n; i++){. 
1e0d0 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20 73         switch( s
1e0e0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79  qlite3_column_ty
1e0f0 70 65 28 70 51 75 65 72 79 2c 20 69 29 20 29 7b  pe(pQuery, i) ){
1e100 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20  .          case 
1e110 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a 20  SQLITE_NULL: {. 
1e120 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1e130 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 49 6e  e3_bind_null(pIn
1e140 73 65 72 74 2c 20 69 2b 31 29 3b 0a 20 20 20 20  sert, i+1);.    
1e150 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1e160 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e170 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
1e180 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
1e190 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1e1a0 62 69 6e 64 5f 69 6e 74 36 34 28 70 49 6e 73 65  bind_int64(pInse
1e1b0 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33  rt, i+1, sqlite3
1e1c0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70 51  _column_int64(pQ
1e1d0 75 65 72 79 2c 69 29 29 3b 0a 20 20 20 20 20 20  uery,i));.      
1e1e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1e1f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1e200 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 46     case SQLITE_F
1e210 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 20 20  LOAT: {.        
1e220 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
1e230 5f 64 6f 75 62 6c 65 28 70 49 6e 73 65 72 74 2c  _double(pInsert,
1e240 20 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63 6f   i+1, sqlite3_co
1e250 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 51 75 65  lumn_double(pQue
1e260 72 79 2c 69 29 29 3b 0a 20 20 20 20 20 20 20 20  ry,i));.        
1e270 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1e280 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1e290 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 58   case SQLITE_TEX
1e2a0 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  T: {.           
1e2b0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
1e2c0 78 74 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 2c  xt(pInsert, i+1,
1e2d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1e2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 63                (c
1e2f0 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
1e300 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
1e310 51 75 65 72 79 2c 69 29 2c 0a 20 20 20 20 20 20  Query,i),.      
1e320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e330 20 20 20 20 20 20 20 2d 31 2c 20 53 51 4c 49 54         -1, SQLIT
1e340 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
1e350 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1e360 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e370 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1e380 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 20 20  BLOB: {.        
1e390 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
1e3a0 5f 62 6c 6f 62 28 70 49 6e 73 65 72 74 2c 20 69  _blob(pInsert, i
1e3b0 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  +1, sqlite3_colu
1e3c0 6d 6e 5f 62 6c 6f 62 28 70 51 75 65 72 79 2c 69  mn_blob(pQuery,i
1e3d0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
1e3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1e400 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
1e410 74 65 73 28 70 51 75 65 72 79 2c 69 29 2c 0a 20  tes(pQuery,i),. 
1e420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e440 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54             SQLIT
1e450 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
1e460 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1e470 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e480 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20 45    }.      } /* E
1e490 6e 64 20 66 6f 72 20 2a 2f 0a 20 20 20 20 20 20  nd for */.      
1e4a0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
1e4b0 70 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20  p(pInsert);.    
1e4c0 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1e4d0 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49 54  _OK && rc!=SQLIT
1e4e0 45 5f 52 4f 57 20 26 26 20 72 63 21 3d 53 51 4c  E_ROW && rc!=SQL
1e4f0 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
1e500 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
1e510 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 20 25  stderr, "Error %
1e520 64 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  d: %s\n", sqlite
1e530 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f  3_extended_errco
1e540 64 65 28 6e 65 77 44 62 29 2c 0a 20 20 20 20 20  de(newDb),.     
1e550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e560 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73     sqlite3_errms
1e570 67 28 6e 65 77 44 62 29 29 3b 0a 20 20 20 20 20  g(newDb));.     
1e580 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1e590 5f 72 65 73 65 74 28 70 49 6e 73 65 72 74 29 3b  _reset(pInsert);
1e5a0 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20  .      cnt++;.  
1e5b0 20 20 20 20 69 66 28 20 28 63 6e 74 25 73 70 69      if( (cnt%spi
1e5c0 6e 52 61 74 65 29 3d 3d 30 20 29 7b 0a 20 20 20  nRate)==0 ){.   
1e5d0 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 63 5c       printf("%c\
1e5e0 62 22 2c 20 22 7c 2f 2d 5c 5c 22 5b 28 63 6e 74  b", "|/-\\"[(cnt
1e5f0 2f 73 70 69 6e 52 61 74 65 29 25 34 5d 29 3b 0a  /spinRate)%4]);.
1e600 20 20 20 20 20 20 20 20 66 66 6c 75 73 68 28 73          fflush(s
1e610 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a  tdout);.      }.
1e620 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 77 68 69      } /* End whi
1e630 6c 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63  le */.    if( rc
1e640 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 20  ==SQLITE_DONE ) 
1e650 62 72 65 61 6b 3b 0a 20 20 20 20 73 71 6c 69 74  break;.    sqlit
1e660 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75 65  e3_finalize(pQue
1e670 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ry);.    sqlite3
1e680 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b 0a 20  _free(zQuery);. 
1e690 20 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69     zQuery = sqli
1e6a0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
1e6b0 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c  ECT * FROM \"%w\
1e6c0 22 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64  " ORDER BY rowid
1e6d0 20 44 45 53 43 3b 22 2c 0a 20 20 20 20 20 20 20   DESC;",.       
1e6e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e6f0 20 20 20 20 20 20 7a 54 61 62 6c 65 29 3b 0a 20        zTable);. 
1e700 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
1e710 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
1e720 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26 70  , zQuery, -1, &p
1e730 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20 69  Query, 0);.    i
1e740 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 75  f( rc ){.      u
1e750 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
1e760 72 2c 20 22 57 61 72 6e 69 6e 67 3a 20 63 61 6e  r, "Warning: can
1e770 6e 6f 74 20 73 74 65 70 20 5c 22 25 73 5c 22 20  not step \"%s\" 
1e780 62 61 63 6b 77 61 72 64 73 22 2c 20 7a 54 61 62  backwards", zTab
1e790 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  le);.      break
1e7a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 45  ;.    }.  } /* E
1e7b0 6e 64 20 66 6f 72 28 6b 3d 30 2e 2e 2e 29 20 2a  nd for(k=0...) *
1e7c0 2f 0a 0a 65 6e 64 5f 64 61 74 61 5f 78 66 65 72  /..end_data_xfer
1e7d0 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  :.  sqlite3_fina
1e7e0 6c 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20  lize(pQuery);.  
1e7f0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
1e800 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 73 71 6c  (pInsert);.  sql
1e810 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79  ite3_free(zQuery
1e820 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
1e830 65 28 7a 49 6e 73 65 72 74 29 3b 0a 7d 0a 0a 0a  e(zInsert);.}...
1e840 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 74 72 61  /*.** Try to tra
1e850 6e 73 66 65 72 20 61 6c 6c 20 72 6f 77 73 20 6f  nsfer all rows o
1e860 66 20 74 68 65 20 73 63 68 65 6d 61 20 74 68 61  f the schema tha
1e870 74 20 6d 61 74 63 68 20 7a 57 68 65 72 65 2e 20  t match zWhere. 
1e880 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 72 6f 77   For.** each row
1e890 2c 20 69 6e 76 6f 6b 65 20 78 46 6f 72 45 61 63  , invoke xForEac
1e8a0 68 28 29 20 6f 6e 20 74 68 65 20 6f 62 6a 65 63  h() on the objec
1e8b0 74 20 64 65 66 69 6e 65 64 20 62 79 20 74 68 61  t defined by tha
1e8c0 74 20 72 6f 77 2e 0a 2a 2a 20 49 66 20 61 6e 20  t row..** If an 
1e8d0 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74  error is encount
1e8e0 65 72 65 64 20 77 68 69 6c 65 20 6d 6f 76 69 6e  ered while movin
1e8f0 67 20 66 6f 72 77 61 72 64 20 74 68 72 6f 75 67  g forward throug
1e900 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65 5f  h the.** sqlite_
1e910 6d 61 73 74 65 72 20 74 61 62 6c 65 2c 20 74 72  master table, tr
1e920 79 20 61 67 61 69 6e 20 6d 6f 76 69 6e 67 20 62  y again moving b
1e930 61 63 6b 77 61 72 64 73 2e 0a 2a 2f 0a 73 74 61  ackwards..*/.sta
1e940 74 69 63 20 76 6f 69 64 20 74 72 79 54 6f 43 6c  tic void tryToCl
1e950 6f 6e 65 53 63 68 65 6d 61 28 0a 20 20 53 68 65  oneSchema(.  She
1e960 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20 20 73 71  llState *p,.  sq
1e970 6c 69 74 65 33 20 2a 6e 65 77 44 62 2c 0a 20 20  lite3 *newDb,.  
1e980 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 68 65  const char *zWhe
1e990 72 65 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46 6f  re,.  void (*xFo
1e9a0 72 45 61 63 68 29 28 53 68 65 6c 6c 53 74 61 74  rEach)(ShellStat
1e9b0 65 2a 2c 73 71 6c 69 74 65 33 2a 2c 63 6f 6e 73  e*,sqlite3*,cons
1e9c0 74 20 63 68 61 72 2a 29 0a 29 7b 0a 20 20 73 71  t char*).){.  sq
1e9d0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 51 75 65  lite3_stmt *pQue
1e9e0 72 79 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  ry = 0;.  char *
1e9f0 7a 51 75 65 72 79 20 3d 20 30 3b 0a 20 20 69 6e  zQuery = 0;.  in
1ea00 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  t rc;.  const un
1ea10 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 4e 61  signed char *zNa
1ea20 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73 69  me;.  const unsi
1ea30 67 6e 65 64 20 63 68 61 72 20 2a 7a 53 71 6c 3b  gned char *zSql;
1ea40 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  .  char *zErrMsg
1ea50 20 3d 20 30 3b 0a 0a 20 20 7a 51 75 65 72 79 20   = 0;..  zQuery 
1ea60 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1ea70 66 28 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20  f("SELECT name, 
1ea80 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  sql FROM sqlite_
1ea90 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20 20 20  master".        
1eaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eab0 20 20 20 22 20 57 48 45 52 45 20 25 73 22 2c 20     " WHERE %s", 
1eac0 7a 57 68 65 72 65 29 3b 0a 20 20 72 63 20 3d 20  zWhere);.  rc = 
1ead0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
1eae0 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79  v2(p->db, zQuery
1eaf0 2c 20 2d 31 2c 20 26 70 51 75 65 72 79 2c 20 30  , -1, &pQuery, 0
1eb00 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a 20  );.  if( rc ){. 
1eb10 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
1eb20 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 28  tderr, "Error: (
1eb30 25 64 29 20 25 73 20 6f 6e 20 5b 25 73 5d 5c 6e  %d) %s on [%s]\n
1eb40 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1eb50 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
1eb60 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28  xtended_errcode(
1eb70 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65 33 5f  p->db), sqlite3_
1eb80 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c 0a 20  errmsg(p->db),. 
1eb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eba0 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20 20 20     zQuery);.    
1ebb0 67 6f 74 6f 20 65 6e 64 5f 73 63 68 65 6d 61 5f  goto end_schema_
1ebc0 78 66 65 72 3b 0a 20 20 7d 0a 20 20 77 68 69 6c  xfer;.  }.  whil
1ebd0 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  e( (rc = sqlite3
1ebe0 5f 73 74 65 70 28 70 51 75 65 72 79 29 29 3d 3d  _step(pQuery))==
1ebf0 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
1ec00 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65    zName = sqlite
1ec10 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51  3_column_text(pQ
1ec20 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20 7a 53  uery, 0);.    zS
1ec30 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  ql = sqlite3_col
1ec40 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79 2c  umn_text(pQuery,
1ec50 20 31 29 3b 0a 20 20 20 20 70 72 69 6e 74 66 28   1);.    printf(
1ec60 22 25 73 2e 2e 2e 20 22 2c 20 7a 4e 61 6d 65 29  "%s... ", zName)
1ec70 3b 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74 29  ; fflush(stdout)
1ec80 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  ;.    sqlite3_ex
1ec90 65 63 28 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74  ec(newDb, (const
1eca0 20 63 68 61 72 2a 29 7a 53 71 6c 2c 20 30 2c 20   char*)zSql, 0, 
1ecb0 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  0, &zErrMsg);.  
1ecc0 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b    if( zErrMsg ){
1ecd0 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
1ece0 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
1ecf0 72 3a 20 25 73 5c 6e 53 51 4c 3a 20 5b 25 73 5d  r: %s\nSQL: [%s]
1ed00 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 2c 20 7a 53  \n", zErrMsg, zS
1ed10 71 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ql);.      sqlit
1ed20 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
1ed30 3b 0a 20 20 20 20 20 20 7a 45 72 72 4d 73 67 20  ;.      zErrMsg 
1ed40 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 0;.    }.    i
1ed50 66 28 20 78 46 6f 72 45 61 63 68 20 29 7b 0a 20  f( xForEach ){. 
1ed60 20 20 20 20 20 78 46 6f 72 45 61 63 68 28 70 2c       xForEach(p,
1ed70 20 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74 20 63   newDb, (const c
1ed80 68 61 72 2a 29 7a 4e 61 6d 65 29 3b 0a 20 20 20  har*)zName);.   
1ed90 20 7d 0a 20 20 20 20 70 72 69 6e 74 66 28 22 64   }.    printf("d
1eda0 6f 6e 65 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20 69  one\n");.  }.  i
1edb0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44 4f  f( rc!=SQLITE_DO
1edc0 4e 45 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  NE ){.    sqlite
1edd0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75 65 72  3_finalize(pQuer
1ede0 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  y);.    sqlite3_
1edf0 66 72 65 65 28 7a 51 75 65 72 79 29 3b 0a 20 20  free(zQuery);.  
1ee00 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69 74    zQuery = sqlit
1ee10 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
1ee20 43 54 20 6e 61 6d 65 2c 20 73 71 6c 20 46 52 4f  CT name, sql FRO
1ee30 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  M sqlite_master"
1ee40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1ee50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
1ee60 57 48 45 52 45 20 25 73 20 4f 52 44 45 52 20 42  WHERE %s ORDER B
1ee70 59 20 72 6f 77 69 64 20 44 45 53 43 22 2c 20 7a  Y rowid DESC", z
1ee80 57 68 65 72 65 29 3b 0a 20 20 20 20 72 63 20 3d  Where);.    rc =
1ee90 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
1eea0 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72  _v2(p->db, zQuer
1eeb0 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79 2c 20  y, -1, &pQuery, 
1eec0 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  0);.    if( rc )
1eed0 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
1eee0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
1eef0 6f 72 3a 20 28 25 64 29 20 25 73 20 6f 6e 20 5b  or: (%d) %s on [
1ef00 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  %s]\n",.        
1ef10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
1ef20 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65  lite3_extended_e
1ef30 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c 20 73  rrcode(p->db), s
1ef40 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
1ef50 3e 64 62 29 2c 0a 20 20 20 20 20 20 20 20 20 20  >db),.          
1ef60 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75 65              zQue
1ef70 72 79 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  ry);.      goto 
1ef80 65 6e 64 5f 73 63 68 65 6d 61 5f 78 66 65 72 3b  end_schema_xfer;
1ef90 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
1efa0 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  ( (rc = sqlite3_
1efb0 73 74 65 70 28 70 51 75 65 72 79 29 29 3d 3d 53  step(pQuery))==S
1efc0 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
1efd0 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
1efe0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
1eff0 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20 20  Query, 0);.     
1f000 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
1f010 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65  column_text(pQue
1f020 72 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 70 72  ry, 1);.      pr
1f030 69 6e 74 66 28 22 25 73 2e 2e 2e 20 22 2c 20 7a  intf("%s... ", z
1f040 4e 61 6d 65 29 3b 20 66 66 6c 75 73 68 28 73 74  Name); fflush(st
1f050 64 6f 75 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  dout);.      sql
1f060 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44 62 2c  ite3_exec(newDb,
1f070 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 53   (const char*)zS
1f080 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72 4d  ql, 0, 0, &zErrM
1f090 73 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  sg);.      if( z
1f0a0 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
1f0b0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
1f0c0 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73  derr, "Error: %s
1f0d0 5c 6e 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c 20  \nSQL: [%s]\n", 
1f0e0 7a 45 72 72 4d 73 67 2c 20 7a 53 71 6c 29 3b 0a  zErrMsg, zSql);.
1f0f0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1f100 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20  free(zErrMsg);. 
1f110 20 20 20 20 20 20 20 7a 45 72 72 4d 73 67 20 3d         zErrMsg =
1f120 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1f130 20 20 69 66 28 20 78 46 6f 72 45 61 63 68 20 29    if( xForEach )
1f140 7b 0a 20 20 20 20 20 20 20 20 78 46 6f 72 45 61  {.        xForEa
1f150 63 68 28 70 2c 20 6e 65 77 44 62 2c 20 28 63 6f  ch(p, newDb, (co
1f160 6e 73 74 20 63 68 61 72 2a 29 7a 4e 61 6d 65 29  nst char*)zName)
1f170 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1f180 70 72 69 6e 74 66 28 22 64 6f 6e 65 5c 6e 22 29  printf("done\n")
1f190 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 65 6e 64 5f  ;.    }.  }.end_
1f1a0 73 63 68 65 6d 61 5f 78 66 65 72 3a 0a 20 20 73  schema_xfer:.  s
1f1b0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
1f1c0 70 51 75 65 72 79 29 3b 0a 20 20 73 71 6c 69 74  pQuery);.  sqlit
1f1d0 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b  e3_free(zQuery);
1f1e0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20 61  .}../*.** Open a
1f1f0 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 66 69   new database fi
1f200 6c 65 20 6e 61 6d 65 64 20 22 7a 4e 65 77 44 62  le named "zNewDb
1f210 22 2e 20 20 54 72 79 20 74 6f 20 72 65 63 6f 76  ".  Try to recov
1f220 65 72 20 61 73 20 6d 75 63 68 20 69 6e 66 6f 72  er as much infor
1f230 6d 61 74 69 6f 6e 0a 2a 2a 20 61 73 20 70 6f 73  mation.** as pos
1f240 73 69 62 6c 65 20 6f 75 74 20 6f 66 20 74 68 65  sible out of the
1f250 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20 28   main database (
1f260 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20 63  which might be c
1f270 6f 72 72 75 70 74 29 20 61 6e 64 20 77 72 69 74  orrupt) and writ
1f280 65 20 69 74 0a 2a 2a 20 69 6e 74 6f 20 7a 4e 65  e it.** into zNe
1f290 77 44 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  wDb..*/.static v
1f2a0 6f 69 64 20 74 72 79 54 6f 43 6c 6f 6e 65 28 53  oid tryToClone(S
1f2b0 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f  hellState *p, co
1f2c0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 77 44 62  nst char *zNewDb
1f2d0 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 73  ){.  int rc;.  s
1f2e0 71 6c 69 74 65 33 20 2a 6e 65 77 44 62 20 3d 20  qlite3 *newDb = 
1f2f0 30 3b 0a 20 20 69 66 28 20 61 63 63 65 73 73 28  0;.  if( access(
1f300 7a 4e 65 77 44 62 2c 30 29 3d 3d 30 20 29 7b 0a  zNewDb,0)==0 ){.
1f310 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
1f320 73 74 64 65 72 72 2c 20 22 46 69 6c 65 20 5c 22  stderr, "File \"
1f330 25 73 5c 22 20 61 6c 72 65 61 64 79 20 65 78 69  %s\" already exi
1f340 73 74 73 2e 5c 6e 22 2c 20 7a 4e 65 77 44 62 29  sts.\n", zNewDb)
1f350 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
1f360 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  }.  rc = sqlite3
1f370 5f 6f 70 65 6e 28 7a 4e 65 77 44 62 2c 20 26 6e  _open(zNewDb, &n
1f380 65 77 44 62 29 3b 0a 20 20 69 66 28 20 72 63 20  ewDb);.  if( rc 
1f390 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
1f3a0 74 66 28 73 74 64 65 72 72 2c 20 22 43 61 6e 6e  tf(stderr, "Cann
1f3b0 6f 74 20 63 72 65 61 74 65 20 6f 75 74 70 75 74  ot create output
1f3c0 20 64 61 74 61 62 61 73 65 3a 20 25 73 5c 6e 22   database: %s\n"
1f3d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  ,.            sq
1f3e0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 6e 65 77  lite3_errmsg(new
1f3f0 44 62 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Db));.  }else{. 
1f400 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
1f410 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 77  p->db, "PRAGMA w
1f420 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f  ritable_schema=O
1f430 4e 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  N;", 0, 0, 0);. 
1f440 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
1f450 6e 65 77 44 62 2c 20 22 42 45 47 49 4e 20 45 58  newDb, "BEGIN EX
1f460 43 4c 55 53 49 56 45 3b 22 2c 20 30 2c 20 30 2c  CLUSIVE;", 0, 0,
1f470 20 30 29 3b 0a 20 20 20 20 74 72 79 54 6f 43 6c   0);.    tryToCl
1f480 6f 6e 65 53 63 68 65 6d 61 28 70 2c 20 6e 65 77  oneSchema(p, new
1f490 44 62 2c 20 22 74 79 70 65 3d 27 74 61 62 6c 65  Db, "type='table
1f4a0 27 22 2c 20 74 72 79 54 6f 43 6c 6f 6e 65 44 61  '", tryToCloneDa
1f4b0 74 61 29 3b 0a 20 20 20 20 74 72 79 54 6f 43 6c  ta);.    tryToCl
1f4c0 6f 6e 65 53 63 68 65 6d 61 28 70 2c 20 6e 65 77  oneSchema(p, new
1f4d0 44 62 2c 20 22 74 79 70 65 21 3d 27 74 61 62 6c  Db, "type!='tabl
1f4e0 65 27 22 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  e'", 0);.    sql
1f4f0 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44 62 2c  ite3_exec(newDb,
1f500 20 22 43 4f 4d 4d 49 54 3b 22 2c 20 30 2c 20 30   "COMMIT;", 0, 0
1f510 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1f520 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 50  3_exec(p->db, "P
1f530 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73  RAGMA writable_s
1f540 63 68 65 6d 61 3d 4f 46 46 3b 22 2c 20 30 2c 20  chema=OFF;", 0, 
1f550 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  0, 0);.  }.  sql
1f560 69 74 65 33 5f 63 6c 6f 73 65 28 6e 65 77 44 62  ite3_close(newDb
1f570 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61 6e  );.}../*.** Chan
1f580 67 65 20 74 68 65 20 6f 75 74 70 75 74 20 66 69  ge the output fi
1f590 6c 65 20 62 61 63 6b 20 74 6f 20 73 74 64 6f 75  le back to stdou
1f5a0 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
1f5b0 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 66 6c 61  p->doXdgOpen fla
1f5c0 67 20 69 73 20 73 65 74 2c 20 74 68 61 74 20 6d  g is set, that m
1f5d0 65 61 6e 73 20 74 68 65 20 6f 75 74 70 75 74 20  eans the output 
1f5e0 77 61 73 20 62 65 69 6e 67 0a 2a 2a 20 72 65 64  was being.** red
1f5f0 69 72 65 63 74 65 64 20 74 6f 20 61 20 74 65 6d  irected to a tem
1f600 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d 65  porary file name
1f610 64 20 62 79 20 70 2d 3e 7a 54 65 6d 70 46 69 6c  d by p->zTempFil
1f620 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73 65  e.  In that case
1f630 2c 0a 2a 2a 20 6c 61 75 6e 63 68 20 73 74 61 72  ,.** launch star
1f640 74 2f 6f 70 65 6e 2f 78 64 67 2d 6f 70 65 6e 20  t/open/xdg-open 
1f650 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61 72  on that temporar
1f660 79 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  y file..*/.stati
1f670 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 72 65  c void output_re
1f680 73 65 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  set(ShellState *
1f690 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6f 75 74  p){.  if( p->out
1f6a0 66 69 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a  file[0]=='|' ){.
1f6b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
1f6c0 4d 49 54 5f 50 4f 50 45 4e 0a 20 20 20 20 70 63  MIT_POPEN.    pc
1f6d0 6c 6f 73 65 28 70 2d 3e 6f 75 74 29 3b 0a 23 65  lose(p->out);.#e
1f6e0 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ndif.  }else{.  
1f6f0 20 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c    output_file_cl
1f700 6f 73 65 28 70 2d 3e 6f 75 74 29 3b 0a 23 69 66  ose(p->out);.#if
1f710 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41  ndef SQLITE_NOHA
1f720 56 45 5f 53 59 53 54 45 4d 0a 20 20 20 20 69 66  VE_SYSTEM.    if
1f730 28 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 29  ( p->doXdgOpen )
1f740 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
1f750 61 72 20 2a 7a 58 64 67 4f 70 65 6e 43 6d 64 20  ar *zXdgOpenCmd 
1f760 3d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  =.#if defined(_W
1f770 49 4e 33 32 29 0a 20 20 20 20 20 20 22 73 74 61  IN32).      "sta
1f780 72 74 22 3b 0a 23 65 6c 69 66 20 64 65 66 69 6e  rt";.#elif defin
1f790 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20 20  ed(__APPLE__).  
1f7a0 20 20 20 20 22 6f 70 65 6e 22 3b 0a 23 65 6c 73      "open";.#els
1f7b0 65 0a 20 20 20 20 20 20 22 78 64 67 2d 6f 70 65  e.      "xdg-ope
1f7c0 6e 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  n";.#endif.     
1f7d0 20 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20 20   char *zCmd;.   
1f7e0 20 20 20 7a 43 6d 64 20 3d 20 73 71 6c 69 74 65     zCmd = sqlite
1f7f0 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 20 25 73  3_mprintf("%s %s
1f800 22 2c 20 7a 58 64 67 4f 70 65 6e 43 6d 64 2c 20  ", zXdgOpenCmd, 
1f810 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20  p->zTempFile);. 
1f820 20 20 20 20 20 69 66 28 20 73 79 73 74 65 6d 28       if( system(
1f830 7a 43 6d 64 29 20 29 7b 0a 20 20 20 20 20 20 20  zCmd) ){.       
1f840 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
1f850 65 72 72 2c 20 22 46 61 69 6c 65 64 3a 20 5b 25  err, "Failed: [%
1f860 73 5d 5c 6e 22 2c 20 7a 43 6d 64 29 3b 0a 20 20  s]\n", zCmd);.  
1f870 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1f880 74 65 33 5f 66 72 65 65 28 7a 43 6d 64 29 3b 0a  te3_free(zCmd);.
1f890 20 20 20 20 20 20 6f 75 74 70 75 74 4d 6f 64 65        outputMode
1f8a0 50 6f 70 28 70 29 3b 0a 20 20 20 20 20 20 70 2d  Pop(p);.      p-
1f8b0 3e 64 6f 58 64 67 4f 70 65 6e 20 3d 20 30 3b 0a  >doXdgOpen = 0;.
1f8c0 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
1f8d0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
1f8e0 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 29 20 2a  NOHAVE_SYSTEM) *
1f8f0 2f 0a 20 20 7d 0a 20 20 70 2d 3e 6f 75 74 66 69  /.  }.  p->outfi
1f900 6c 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 2d 3e  le[0] = 0;.  p->
1f910 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 7d 0a  out = stdout;.}.
1f920 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 6e 20 53 51  ./*.** Run an SQ
1f930 4c 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 72 65  L command and re
1f940 74 75 72 6e 20 74 68 65 20 73 69 6e 67 6c 65 20  turn the single 
1f950 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74 2e 0a  integer result..
1f960 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 62  */.static int db
1f970 5f 69 6e 74 28 53 68 65 6c 6c 53 74 61 74 65 20  _int(ShellState 
1f980 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
1f990 7a 53 71 6c 29 7b 0a 20 20 73 71 6c 69 74 65 33  zSql){.  sqlite3
1f9a0 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20  _stmt *pStmt;.  
1f9b0 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20 73  int res = 0;.  s
1f9c0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
1f9d0 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  2(p->db, zSql, -
1f9e0 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
1f9f0 20 69 66 28 20 70 53 74 6d 74 20 26 26 20 73 71   if( pStmt && sq
1fa00 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
1fa10 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
1fa20 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69 74  .    res = sqlit
1fa30 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
1fa40 74 6d 74 2c 30 29 3b 0a 20 20 7d 0a 20 20 73 71  tmt,0);.  }.  sq
1fa50 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
1fa60 53 74 6d 74 29 3b 0a 20 20 72 65 74 75 72 6e 20  Stmt);.  return 
1fa70 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  res;.}../*.** Co
1fa80 6e 76 65 72 74 20 61 20 32 2d 62 79 74 65 20 6f  nvert a 2-byte o
1fa90 72 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e 64  r 4-byte big-end
1faa0 69 61 6e 20 69 6e 74 65 67 65 72 20 69 6e 74 6f  ian integer into
1fab0 20 61 20 6e 61 74 69 76 65 20 69 6e 74 65 67 65   a native intege
1fac0 72 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73 69  r.*/.static unsi
1fad0 67 6e 65 64 20 69 6e 74 20 67 65 74 32 62 79 74  gned int get2byt
1fae0 65 49 6e 74 28 75 6e 73 69 67 6e 65 64 20 63 68  eInt(unsigned ch
1faf0 61 72 20 2a 61 29 7b 0a 20 20 72 65 74 75 72 6e  ar *a){.  return
1fb00 20 28 61 5b 30 5d 3c 3c 38 29 20 2b 20 61 5b 31   (a[0]<<8) + a[1
1fb10 5d 3b 0a 7d 0a 73 74 61 74 69 63 20 75 6e 73 69  ];.}.static unsi
1fb20 67 6e 65 64 20 69 6e 74 20 67 65 74 34 62 79 74  gned int get4byt
1fb30 65 49 6e 74 28 75 6e 73 69 67 6e 65 64 20 63 68  eInt(unsigned ch
1fb40 61 72 20 2a 61 29 7b 0a 20 20 72 65 74 75 72 6e  ar *a){.  return
1fb50 20 28 61 5b 30 5d 3c 3c 32 34 29 20 2b 20 28 61   (a[0]<<24) + (a
1fb60 5b 31 5d 3c 3c 31 36 29 20 2b 20 28 61 5b 32 5d  [1]<<16) + (a[2]
1fb70 3c 3c 38 29 20 2b 20 61 5b 33 5d 3b 0a 7d 0a 0a  <<8) + a[3];.}..
1fb80 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
1fb90 74 69 6f 6e 20 6f 66 20 74 68 65 20 22 2e 69 6e  tion of the ".in
1fba0 66 6f 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a 0a  fo" command..**.
1fbb0 2a 2a 20 52 65 74 75 72 6e 20 31 20 6f 6e 20 65  ** Return 1 on e
1fbc0 72 72 6f 72 2c 20 32 20 74 6f 20 65 78 69 74 2c  rror, 2 to exit,
1fbd0 20 61 6e 64 20 30 20 6f 74 68 65 72 77 69 73 65   and 0 otherwise
1fbe0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1fbf0 73 68 65 6c 6c 5f 64 62 69 6e 66 6f 5f 63 6f 6d  shell_dbinfo_com
1fc00 6d 61 6e 64 28 53 68 65 6c 6c 53 74 61 74 65 20  mand(ShellState 
1fc10 2a 70 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68  *p, int nArg, ch
1fc20 61 72 20 2a 2a 61 7a 41 72 67 29 7b 0a 20 20 73  ar **azArg){.  s
1fc30 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
1fc40 63 74 20 7b 20 63 6f 6e 73 74 20 63 68 61 72 20  ct { const char 
1fc50 2a 7a 4e 61 6d 65 3b 20 69 6e 74 20 6f 66 73 74  *zName; int ofst
1fc60 3b 20 7d 20 61 46 69 65 6c 64 5b 5d 20 3d 20 7b  ; } aField[] = {
1fc70 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 20 63 68  .     { "file ch
1fc80 61 6e 67 65 20 63 6f 75 6e 74 65 72 3a 22 2c 20  ange counter:", 
1fc90 20 32 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   24  },.     { "
1fca0 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63 6f  database page co
1fcb0 75 6e 74 3a 22 2c 20 20 32 38 20 20 7d 2c 0a 20  unt:",  28  },. 
1fcc0 20 20 20 20 7b 20 22 66 72 65 65 6c 69 73 74 20      { "freelist 
1fcd0 70 61 67 65 20 63 6f 75 6e 74 3a 22 2c 20 20 33  page count:",  3
1fce0 36 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63  6  },.     { "sc
1fcf0 68 65 6d 61 20 63 6f 6f 6b 69 65 3a 22 2c 20 20  hema cookie:",  
1fd00 20 20 20 20 20 20 34 30 20 20 7d 2c 0a 20 20 20        40  },.   
1fd10 20 20 7b 20 22 73 63 68 65 6d 61 20 66 6f 72 6d    { "schema form
1fd20 61 74 3a 22 2c 20 20 20 20 20 20 20 20 34 34 20  at:",        44 
1fd30 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 65 66 61   },.     { "defa
1fd40 75 6c 74 20 63 61 63 68 65 20 73 69 7a 65 3a 22  ult cache size:"
1fd50 2c 20 20 20 34 38 20 20 7d 2c 0a 20 20 20 20 20  ,   48  },.     
1fd60 7b 20 22 61 75 74 6f 76 61 63 75 75 6d 20 74 6f  { "autovacuum to
1fd70 70 20 72 6f 6f 74 3a 22 2c 20 20 35 32 20 20 7d  p root:",  52  }
1fd80 2c 0a 20 20 20 20 20 7b 20 22 69 6e 63 72 65 6d  ,.     { "increm
1fd90 65 6e 74 61 6c 20 76 61 63 75 75 6d 3a 22 2c 20  ental vacuum:", 
1fda0 20 20 36 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20    64  },.     { 
1fdb0 22 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 3a 22  "text encoding:"
1fdc0 2c 20 20 20 20 20 20 20 20 35 36 20 20 7d 2c 0a  ,        56  },.
1fdd0 20 20 20 20 20 7b 20 22 75 73 65 72 20 76 65 72       { "user ver
1fde0 73 69 6f 6e 3a 22 2c 20 20 20 20 20 20 20 20 20  sion:",         
1fdf0 36 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61  60  },.     { "a
1fe00 70 70 6c 69 63 61 74 69 6f 6e 20 69 64 3a 22 2c  pplication id:",
1fe10 20 20 20 20 20 20 20 36 38 20 20 7d 2c 0a 20 20         68  },.  
1fe20 20 20 20 7b 20 22 73 6f 66 74 77 61 72 65 20 76     { "software v
1fe30 65 72 73 69 6f 6e 3a 22 2c 20 20 20 20 20 39 36  ersion:",     96
1fe40 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74 61 74    },.  };.  stat
1fe50 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
1fe60 7b 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  { const char *zN
1fe70 61 6d 65 3b 20 63 6f 6e 73 74 20 63 68 61 72 20  ame; const char 
1fe80 2a 7a 53 71 6c 3b 20 7d 20 61 51 75 65 72 79 5b  *zSql; } aQuery[
1fe90 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 6e 75  ] = {.     { "nu
1fea0 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 3a 22  mber of tables:"
1feb0 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  ,.       "SELECT
1fec0 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25   count(*) FROM %
1fed0 73 20 57 48 45 52 45 20 74 79 70 65 3d 27 74 61  s WHERE type='ta
1fee0 62 6c 65 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20  ble'" },.     { 
1fef0 22 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65 78  "number of index
1ff00 65 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45  es:",.       "SE
1ff10 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
1ff20 4f 4d 20 25 73 20 57 48 45 52 45 20 74 79 70 65  OM %s WHERE type
1ff30 3d 27 69 6e 64 65 78 27 22 20 7d 2c 0a 20 20 20  ='index'" },.   
1ff40 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20 74    { "number of t
1ff50 72 69 67 67 65 72 73 3a 22 2c 0a 20 20 20 20 20  riggers:",.     
1ff60 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28    "SELECT count(
1ff70 2a 29 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45  *) FROM %s WHERE
1ff80 20 74 79 70 65 3d 27 74 72 69 67 67 65 72 27 22   type='trigger'"
1ff90 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62   },.     { "numb
1ffa0 65 72 20 6f 66 20 76 69 65 77 73 3a 22 2c 0a 20  er of views:",. 
1ffb0 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f        "SELECT co
1ffc0 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20 57  unt(*) FROM %s W
1ffd0 48 45 52 45 20 74 79 70 65 3d 27 76 69 65 77 27  HERE type='view'
1ffe0 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63 68  " },.     { "sch
1fff0 65 6d 61 20 73 69 7a 65 3a 22 2c 0a 20 20 20 20  ema size:",.    
20000 20 20 20 22 53 45 4c 45 43 54 20 74 6f 74 61 6c     "SELECT total
20010 28 6c 65 6e 67 74 68 28 73 71 6c 29 29 20 46 52  (length(sql)) FR
20020 4f 4d 20 25 73 22 20 7d 2c 0a 20 20 7d 3b 0a 20  OM %s" },.  };. 
20030 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 2a   int i;.  char *
20040 7a 53 63 68 65 6d 61 54 61 62 3b 0a 20 20 63 68  zSchemaTab;.  ch
20050 61 72 20 2a 7a 44 62 20 3d 20 6e 41 72 67 3e 3d  ar *zDb = nArg>=
20060 32 20 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20 22  2 ? azArg[1] : "
20070 6d 61 69 6e 22 3b 0a 20 20 73 71 6c 69 74 65 33  main";.  sqlite3
20080 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
20090 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68 61  ;.  unsigned cha
200a0 72 20 61 48 64 72 5b 31 30 30 5d 3b 0a 20 20 6f  r aHdr[100];.  o
200b0 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
200c0 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 20 72  if( p->db==0 ) r
200d0 65 74 75 72 6e 20 31 3b 0a 20 20 73 71 6c 69 74  eturn 1;.  sqlit
200e0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
200f0 3e 64 62 2c 22 53 45 4c 45 43 54 20 64 61 74 61  >db,"SELECT data
20100 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62 70   FROM sqlite_dbp
20110 61 67 65 28 3f 31 29 20 57 48 45 52 45 20 70 67  age(?1) WHERE pg
20120 6e 6f 3d 31 22 2c 0a 20 20 20 20 20 20 20 20 20  no=1",.         
20130 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20              -1, 
20140 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71  &pStmt, 0);.  sq
20150 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
20160 70 53 74 6d 74 2c 20 31 2c 20 7a 44 62 2c 20 2d  pStmt, 1, zDb, -
20170 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
20180 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
20190 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51  _step(pStmt)==SQ
201a0 4c 49 54 45 5f 52 4f 57 0a 20 20 20 26 26 20 73  LITE_ROW.   && s
201b0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79  qlite3_column_by
201c0 74 65 73 28 70 53 74 6d 74 2c 30 29 3e 31 30 30  tes(pStmt,0)>100
201d0 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70 79  .  ){.    memcpy
201e0 28 61 48 64 72 2c 20 73 71 6c 69 74 65 33 5f 63  (aHdr, sqlite3_c
201f0 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d 74  olumn_blob(pStmt
20200 2c 30 29 2c 20 31 30 30 29 3b 0a 20 20 20 20 73  ,0), 100);.    s
20210 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
20220 70 53 74 6d 74 29 3b 0a 20 20 7d 65 6c 73 65 7b  pStmt);.  }else{
20230 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
20240 73 74 64 65 72 72 2c 20 22 75 6e 61 62 6c 65 20  stderr, "unable 
20250 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73 65  to read database
20260 20 68 65 61 64 65 72 5c 6e 22 29 3b 0a 20 20 20   header\n");.   
20270 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
20280 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 72 65  e(pStmt);.    re
20290 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 20  turn 1;.  }.  i 
202a0 3d 20 67 65 74 32 62 79 74 65 49 6e 74 28 61 48  = get2byteInt(aH
202b0 64 72 2b 31 36 29 3b 0a 20 20 69 66 28 20 69 3d  dr+16);.  if( i=
202c0 3d 31 20 29 20 69 20 3d 20 36 35 35 33 36 3b 0a  =1 ) i = 65536;.
202d0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
202e0 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64 5c  >out, "%-20s %d\
202f0 6e 22 2c 20 22 64 61 74 61 62 61 73 65 20 70 61  n", "database pa
20300 67 65 20 73 69 7a 65 3a 22 2c 20 69 29 3b 0a 20  ge size:", i);. 
20310 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
20320 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e  out, "%-20s %d\n
20330 22 2c 20 22 77 72 69 74 65 20 66 6f 72 6d 61 74  ", "write format
20340 3a 22 2c 20 61 48 64 72 5b 31 38 5d 29 3b 0a 20  :", aHdr[18]);. 
20350 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
20360 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e  out, "%-20s %d\n
20370 22 2c 20 22 72 65 61 64 20 66 6f 72 6d 61 74 3a  ", "read format:
20380 22 2c 20 61 48 64 72 5b 31 39 5d 29 3b 0a 20 20  ", aHdr[19]);.  
20390 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
203a0 75 74 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e 22  ut, "%-20s %d\n"
203b0 2c 20 22 72 65 73 65 72 76 65 64 20 62 79 74 65  , "reserved byte
203c0 73 3a 22 2c 20 61 48 64 72 5b 32 30 5d 29 3b 0a  s:", aHdr[20]);.
203d0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
203e0 61 79 53 69 7a 65 28 61 46 69 65 6c 64 29 3b 20  aySize(aField); 
203f0 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f 66  i++){.    int of
20400 73 74 20 3d 20 61 46 69 65 6c 64 5b 69 5d 2e 6f  st = aField[i].o
20410 66 73 74 3b 0a 20 20 20 20 75 6e 73 69 67 6e 65  fst;.    unsigne
20420 64 20 69 6e 74 20 76 61 6c 20 3d 20 67 65 74 34  d int val = get4
20430 62 79 74 65 49 6e 74 28 61 48 64 72 20 2b 20 6f  byteInt(aHdr + o
20440 66 73 74 29 3b 0a 20 20 20 20 75 74 66 38 5f 70  fst);.    utf8_p
20450 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
20460 2d 32 30 73 20 25 75 22 2c 20 61 46 69 65 6c 64  -20s %u", aField
20470 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 76 61 6c 29 3b  [i].zName, val);
20480 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 66 73  .    switch( ofs
20490 74 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65 20  t ){.      case 
204a0 35 36 3a 20 7b 0a 20 20 20 20 20 20 20 20 69 66  56: {.        if
204b0 28 20 76 61 6c 3d 3d 31 20 29 20 72 61 77 5f 70  ( val==1 ) raw_p
204c0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20  rintf(p->out, " 
204d0 28 75 74 66 38 29 22 29 3b 0a 20 20 20 20 20 20  (utf8)");.      
204e0 20 20 69 66 28 20 76 61 6c 3d 3d 32 20 29 20 72    if( val==2 ) r
204f0 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
20500 2c 20 22 20 28 75 74 66 31 36 6c 65 29 22 29 3b  , " (utf16le)");
20510 0a 20 20 20 20 20 20 20 20 69 66 28 20 76 61 6c  .        if( val
20520 3d 3d 33 20 29 20 72 61 77 5f 70 72 69 6e 74 66  ==3 ) raw_printf
20530 28 70 2d 3e 6f 75 74 2c 20 22 20 28 75 74 66 31  (p->out, " (utf1
20540 36 62 65 29 22 29 3b 0a 20 20 20 20 20 20 7d 0a  6be)");.      }.
20550 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70 72      }.    raw_pr
20560 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e  intf(p->out, "\n
20570 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 44  ");.  }.  if( zD
20580 62 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53 63 68  b==0 ){.    zSch
20590 65 6d 61 54 61 62 20 3d 20 73 71 6c 69 74 65 33  emaTab = sqlite3
205a0 5f 6d 70 72 69 6e 74 66 28 22 6d 61 69 6e 2e 73  _mprintf("main.s
205b0 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 29 3b 0a  qlite_master");.
205c0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
205d0 6d 70 28 7a 44 62 2c 22 74 65 6d 70 22 29 3d 3d  mp(zDb,"temp")==
205e0 30 20 29 7b 0a 20 20 20 20 7a 53 63 68 65 6d 61  0 ){.    zSchema
205f0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Tab = sqlite3_mp
20600 72 69 6e 74 66 28 22 25 73 22 2c 20 22 73 71 6c  rintf("%s", "sql
20610 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22  ite_temp_master"
20620 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
20630 7a 53 63 68 65 6d 61 54 61 62 20 3d 20 73 71 6c  zSchemaTab = sql
20640 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22  ite3_mprintf("\"
20650 25 77 5c 22 2e 73 71 6c 69 74 65 5f 6d 61 73 74  %w\".sqlite_mast
20660 65 72 22 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a 20  er", zDb);.  }. 
20670 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
20680 79 53 69 7a 65 28 61 51 75 65 72 79 29 3b 20 69  ySize(aQuery); i
20690 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ++){.    char *z
206a0 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
206b0 72 69 6e 74 66 28 61 51 75 65 72 79 5b 69 5d 2e  rintf(aQuery[i].
206c0 7a 53 71 6c 2c 20 7a 53 63 68 65 6d 61 54 61 62  zSql, zSchemaTab
206d0 29 3b 0a 20 20 20 20 69 6e 74 20 76 61 6c 20 3d  );.    int val =
206e0 20 64 62 5f 69 6e 74 28 70 2c 20 7a 53 71 6c 29   db_int(p, zSql)
206f0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
20700 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 75 74  ee(zSql);.    ut
20710 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
20720 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20  , "%-20s %d\n", 
20730 61 51 75 65 72 79 5b 69 5d 2e 7a 4e 61 6d 65 2c  aQuery[i].zName,
20740 20 76 61 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c   val);.  }.  sql
20750 69 74 65 33 5f 66 72 65 65 28 7a 53 63 68 65 6d  ite3_free(zSchem
20760 61 54 61 62 29 3b 0a 20 20 72 65 74 75 72 6e 20  aTab);.  return 
20770 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  0;.}../*.** Prin
20780 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 71  t the current sq
20790 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29 20 76  lite3_errmsg() v
207a0 61 6c 75 65 20 74 6f 20 73 74 64 65 72 72 20 61  alue to stderr a
207b0 6e 64 20 72 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a  nd return 1..*/.
207c0 73 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c  static int shell
207d0 44 61 74 61 62 61 73 65 45 72 72 6f 72 28 73 71  DatabaseError(sq
207e0 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 63 6f  lite3 *db){.  co
207f0 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  nst char *zErr =
20800 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
20810 64 62 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e  db);.  utf8_prin
20820 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
20830 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29 3b  r: %s\n", zErr);
20840 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
20850 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20 6f  /*.** Print an o
20860 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 6d 65 73  ut-of-memory mes
20870 73 61 67 65 20 74 6f 20 73 74 64 65 72 72 20 61  sage to stderr a
20880 6e 64 20 72 65 74 75 72 6e 20 31 2e 0a 2a 2f 0a  nd return 1..*/.
20890 73 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c  static int shell
208a0 4e 6f 6d 65 6d 45 72 72 6f 72 28 76 6f 69 64 29  NomemError(void)
208b0 7b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73  {.  raw_printf(s
208c0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6f  tderr, "Error: o
208d0 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29  ut of memory\n")
208e0 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
208f0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
20900 68 65 20 70 61 74 74 65 72 6e 20 69 6e 20 7a 47  he pattern in zG
20910 6c 6f 62 5b 5d 20 61 67 61 69 6e 73 74 20 74 68  lob[] against th
20920 65 20 74 65 78 74 20 69 6e 20 7a 5b 5d 2e 20 20  e text in z[].  
20930 52 65 74 75 72 6e 20 54 52 55 45 0a 2a 2a 20 69  Return TRUE.** i
20940 66 20 74 68 65 79 20 6d 61 74 63 68 20 61 6e 64  f they match and
20950 20 46 41 4c 53 45 20 28 30 29 20 69 66 20 74 68   FALSE (0) if th
20960 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68 2e  ey do not match.
20970 0a 2a 2a 0a 2a 2a 20 47 6c 6f 62 62 69 6e 67 20  .**.** Globbing 
20980 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  rules:.**.**    
20990 20 20 27 2a 27 20 20 20 20 20 20 20 4d 61 74 63    '*'       Matc
209a0 68 65 73 20 61 6e 79 20 73 65 71 75 65 6e 63 65  hes any sequence
209b0 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65   of zero or more
209c0 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a   characters..**.
209d0 2a 2a 20 20 20 20 20 20 27 3f 27 20 20 20 20 20  **      '?'     
209e0 20 20 4d 61 74 63 68 65 73 20 65 78 61 63 74 6c    Matches exactl
209f0 79 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 2e  y one character.
20a00 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 2e 2e 2e 5d  .**.**     [...]
20a10 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 6f 6e        Matches on
20a20 65 20 63 68 61 72 61 63 74 65 72 20 66 72 6f 6d  e character from
20a30 20 74 68 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69   the enclosed li
20a40 73 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20 20  st of.**        
20a50 20 20 20 20 20 20 20 20 63 68 61 72 61 63 74 65          characte
20a60 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 5e  rs..**.**     [^
20a70 2e 2e 2e 5d 20 20 20 20 20 4d 61 74 63 68 65 73  ...]     Matches
20a80 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 20 6e   one character n
20a90 6f 74 20 69 6e 20 74 68 65 20 65 6e 63 6c 6f 73  ot in the enclos
20aa0 65 64 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 20  ed list..**.**  
20ab0 20 20 20 20 27 23 27 20 20 20 20 20 20 20 4d 61      '#'       Ma
20ac0 74 63 68 65 73 20 61 6e 79 20 73 65 71 75 65 6e  tches any sequen
20ad0 63 65 20 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f 72  ce of one or mor
20ae0 65 20 64 69 67 69 74 73 20 77 69 74 68 20 61 6e  e digits with an
20af0 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
20b00 20 20 20 6f 70 74 69 6f 6e 61 6c 20 2b 20 6f 72     optional + or
20b10 20 2d 20 73 69 67 6e 20 69 6e 20 66 72 6f 6e 74   - sign in front
20b20 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 20 27 20  .**.**      ' ' 
20b30 20 20 20 20 20 20 41 6e 79 20 73 70 61 6e 20 6f        Any span o
20b40 66 20 77 68 69 74 65 73 70 61 63 65 20 6d 61 74  f whitespace mat
20b50 63 68 65 73 20 61 6e 79 20 6f 74 68 65 72 20 73  ches any other s
20b60 70 61 6e 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20  pan of.**       
20b70 20 20 20 20 20 20 20 20 20 77 68 69 74 65 73 70           whitesp
20b80 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 74 72 61  ace..**.** Extra
20b90 20 77 68 69 74 65 73 70 61 63 65 20 61 74 20 74   whitespace at t
20ba0 68 65 20 65 6e 64 20 6f 66 20 7a 5b 5d 20 69 73  he end of z[] is
20bb0 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 73 74 61   ignored..*/.sta
20bc0 74 69 63 20 69 6e 74 20 74 65 73 74 63 61 73 65  tic int testcase
20bd0 5f 67 6c 6f 62 28 63 6f 6e 73 74 20 63 68 61 72  _glob(const char
20be0 20 2a 7a 47 6c 6f 62 2c 20 63 6f 6e 73 74 20 63   *zGlob, const c
20bf0 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 63  har *z){.  int c
20c00 2c 20 63 32 3b 0a 20 20 69 6e 74 20 69 6e 76 65  , c2;.  int inve
20c10 72 74 3b 0a 20 20 69 6e 74 20 73 65 65 6e 3b 0a  rt;.  int seen;.
20c20 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 28  .  while( (c = (
20c30 2a 28 7a 47 6c 6f 62 2b 2b 29 29 29 21 3d 30 20  *(zGlob++)))!=0 
20c40 29 7b 0a 20 20 20 20 69 66 28 20 49 73 53 70 61  ){.    if( IsSpa
20c50 63 65 28 63 29 20 29 7b 0a 20 20 20 20 20 20 69  ce(c) ){.      i
20c60 66 28 20 21 49 73 53 70 61 63 65 28 2a 7a 29 20  f( !IsSpace(*z) 
20c70 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
20c80 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65    while( IsSpace
20c90 28 2a 7a 47 6c 6f 62 29 20 29 20 7a 47 6c 6f 62  (*zGlob) ) zGlob
20ca0 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ++;.      while(
20cb0 20 49 73 53 70 61 63 65 28 2a 7a 29 20 29 20 7a   IsSpace(*z) ) z
20cc0 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ++;.    }else if
20cd0 28 20 63 3d 3d 27 2a 27 20 29 7b 0a 20 20 20 20  ( c=='*' ){.    
20ce0 20 20 77 68 69 6c 65 28 20 28 63 3d 28 2a 28 7a    while( (c=(*(z
20cf0 47 6c 6f 62 2b 2b 29 29 29 20 3d 3d 20 27 2a 27  Glob++))) == '*'
20d00 20 7c 7c 20 63 3d 3d 27 3f 27 20 29 7b 0a 20 20   || c=='?' ){.  
20d10 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 3f 27        if( c=='?'
20d20 20 26 26 20 28 2a 28 7a 2b 2b 29 29 3d 3d 30 20   && (*(z++))==0 
20d30 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
20d40 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
20d50 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
20d60 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65  turn 1;.      }e
20d70 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b 27 20 29  lse if( c=='[' )
20d80 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
20d90 20 2a 7a 20 26 26 20 74 65 73 74 63 61 73 65 5f   *z && testcase_
20da0 67 6c 6f 62 28 7a 47 6c 6f 62 2d 31 2c 7a 29 3d  glob(zGlob-1,z)=
20db0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
20dc0 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  z++;.        }. 
20dd0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 2a         return (*
20de0 7a 29 21 3d 30 3b 0a 20 20 20 20 20 20 7d 0a 20  z)!=0;.      }. 
20df0 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 32 20       while( (c2 
20e00 3d 20 28 2a 28 7a 2b 2b 29 29 29 21 3d 30 20 29  = (*(z++)))!=0 )
20e10 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
20e20 20 63 32 21 3d 63 20 29 7b 0a 20 20 20 20 20 20   c2!=c ){.      
20e30 20 20 20 20 63 32 20 3d 20 2a 28 7a 2b 2b 29 3b      c2 = *(z++);
20e40 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
20e50 32 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  2==0 ) return 0;
20e60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20e70 20 20 20 69 66 28 20 74 65 73 74 63 61 73 65 5f     if( testcase_
20e80 67 6c 6f 62 28 7a 47 6c 6f 62 2c 7a 29 20 29 20  glob(zGlob,z) ) 
20e90 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
20ea0 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  }.      return 0
20eb0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
20ec0 63 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20 20  c=='?' ){.      
20ed0 69 66 28 20 28 2a 28 7a 2b 2b 29 29 3d 3d 30 20  if( (*(z++))==0 
20ee0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
20ef0 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b 27  }else if( c=='['
20f00 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 72   ){.      int pr
20f10 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20  ior_c = 0;.     
20f20 20 73 65 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20   seen = 0;.     
20f30 20 69 6e 76 65 72 74 20 3d 20 30 3b 0a 20 20 20   invert = 0;.   
20f40 20 20 20 63 20 3d 20 2a 28 7a 2b 2b 29 3b 0a 20     c = *(z++);. 
20f50 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20       if( c==0 ) 
20f60 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
20f70 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b  c2 = *(zGlob++);
20f80 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27  .      if( c2=='
20f90 5e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  ^' ){.        in
20fa0 76 65 72 74 20 3d 20 31 3b 0a 20 20 20 20 20 20  vert = 1;.      
20fb0 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b    c2 = *(zGlob++
20fc0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
20fd0 20 69 66 28 20 63 32 3d 3d 27 5d 27 20 29 7b 0a   if( c2==']' ){.
20fe0 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27          if( c=='
20ff0 5d 27 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20  ]' ) seen = 1;. 
21000 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47         c2 = *(zG
21010 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a  lob++);.      }.
21020 20 20 20 20 20 20 77 68 69 6c 65 28 20 63 32 20        while( c2 
21030 26 26 20 63 32 21 3d 27 5d 27 20 29 7b 0a 20 20  && c2!=']' ){.  
21040 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27 2d        if( c2=='-
21050 27 20 26 26 20 7a 47 6c 6f 62 5b 30 5d 21 3d 27  ' && zGlob[0]!='
21060 5d 27 20 26 26 20 7a 47 6c 6f 62 5b 30 5d 21 3d  ]' && zGlob[0]!=
21070 30 20 26 26 20 70 72 69 6f 72 5f 63 3e 30 20 29  0 && prior_c>0 )
21080 7b 0a 20 20 20 20 20 20 20 20 20 20 63 32 20 3d  {.          c2 =
21090 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20   *(zGlob++);.   
210a0 20 20 20 20 20 20 20 69 66 28 20 63 3e 3d 70 72         if( c>=pr
210b0 69 6f 72 5f 63 20 26 26 20 63 3c 3d 63 32 20 29  ior_c && c<=c2 )
210c0 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20   seen = 1;.     
210d0 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d 20 30       prior_c = 0
210e0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
210f0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 63  .          if( c
21100 3d 3d 63 32 20 29 7b 0a 20 20 20 20 20 20 20 20  ==c2 ){.        
21110 20 20 20 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20      seen = 1;.  
21120 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
21130 20 20 20 20 70 72 69 6f 72 5f 63 20 3d 20 63 32      prior_c = c2
21140 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21150 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62      c2 = *(zGlob
21160 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ++);.      }.   
21170 20 20 20 69 66 28 20 63 32 3d 3d 30 20 7c 7c 20     if( c2==0 || 
21180 28 73 65 65 6e 20 5e 20 69 6e 76 65 72 74 29 3d  (seen ^ invert)=
21190 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
211a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
211b0 27 23 27 20 29 7b 0a 20 20 20 20 20 20 69 66 28  '#' ){.      if(
211c0 20 28 7a 5b 30 5d 3d 3d 27 2d 27 20 7c 7c 20 7a   (z[0]=='-' || z
211d0 5b 30 5d 3d 3d 27 2b 27 29 20 26 26 20 49 73 44  [0]=='+') && IsD
211e0 69 67 69 74 28 7a 5b 31 5d 29 20 29 20 7a 2b 2b  igit(z[1]) ) z++
211f0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 49 73 44  ;.      if( !IsD
21200 69 67 69 74 28 7a 5b 30 5d 29 20 29 20 72 65 74  igit(z[0]) ) ret
21210 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7a 2b 2b  urn 0;.      z++
21220 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 49  ;.      while( I
21230 73 44 69 67 69 74 28 7a 5b 30 5d 29 20 29 7b 20  sDigit(z[0]) ){ 
21240 7a 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65 6c 73 65  z++; }.    }else
21250 7b 0a 20 20 20 20 20 20 69 66 28 20 63 21 3d 28  {.      if( c!=(
21260 2a 28 7a 2b 2b 29 29 20 29 20 72 65 74 75 72 6e  *(z++)) ) return
21270 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   0;.    }.  }.  
21280 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 2a  while( IsSpace(*
21290 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 72  z) ){ z++; }.  r
212a0 65 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a  eturn *z==0;.}..
212b0 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20 74  ./*.** Compare t
212c0 68 65 20 73 74 72 69 6e 67 20 61 73 20 61 20 63  he string as a c
212d0 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74 69  ommand-line opti
212e0 6f 6e 20 77 69 74 68 20 65 69 74 68 65 72 20 6f  on with either o
212f0 6e 65 20 6f 72 20 74 77 6f 0a 2a 2a 20 69 6e 69  ne or two.** ini
21300 74 69 61 6c 20 22 2d 22 20 63 68 61 72 61 63 74  tial "-" charact
21310 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ers..*/.static i
21320 6e 74 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 63  nt optionMatch(c
21330 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 72 2c  onst char *zStr,
21340 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
21350 74 29 7b 0a 20 20 69 66 28 20 7a 53 74 72 5b 30  t){.  if( zStr[0
21360 5d 21 3d 27 2d 27 20 29 20 72 65 74 75 72 6e 20  ]!='-' ) return 
21370 30 3b 0a 20 20 7a 53 74 72 2b 2b 3b 0a 20 20 69  0;.  zStr++;.  i
21380 66 28 20 7a 53 74 72 5b 30 5d 3d 3d 27 2d 27 20  f( zStr[0]=='-' 
21390 29 20 7a 53 74 72 2b 2b 3b 0a 20 20 72 65 74 75  ) zStr++;.  retu
213a0 72 6e 20 73 74 72 63 6d 70 28 7a 53 74 72 2c 20  rn strcmp(zStr, 
213b0 7a 4f 70 74 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a  zOpt)==0;.}../*.
213c0 2a 2a 20 44 65 6c 65 74 65 20 61 20 66 69 6c 65  ** Delete a file
213d0 2e 0a 2a 2f 0a 69 6e 74 20 73 68 65 6c 6c 44 65  ..*/.int shellDe
213e0 6c 65 74 65 46 69 6c 65 28 63 6f 6e 73 74 20 63  leteFile(const c
213f0 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29 7b  har *zFilename){
21400 0a 20 20 69 6e 74 20 72 63 3b 0a 23 69 66 64 65  .  int rc;.#ifde
21410 66 20 5f 57 49 4e 33 32 0a 20 20 77 63 68 61 72  f _WIN32.  wchar
21420 5f 74 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f  _t *z = sqlite3_
21430 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 75 6e  win32_utf8_to_un
21440 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65 29  icode(zFilename)
21450 3b 0a 20 20 72 63 20 3d 20 5f 77 75 6e 6c 69 6e  ;.  rc = _wunlin
21460 6b 28 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  k(z);.  sqlite3_
21470 66 72 65 65 28 7a 29 3b 0a 23 65 6c 73 65 0a 20  free(z);.#else. 
21480 20 72 63 20 3d 20 75 6e 6c 69 6e 6b 28 7a 46 69   rc = unlink(zFi
21490 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66 0a  lename);.#endif.
214a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
214b0 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 64 65 6c  /*.** Try to del
214c0 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72  ete the temporar
214d0 79 20 66 69 6c 65 20 28 69 66 20 74 68 65 72 65  y file (if there
214e0 20 69 73 20 6f 6e 65 29 20 61 6e 64 20 66 72 65   is one) and fre
214f0 65 20 74 68 65 0a 2a 2a 20 6d 65 6d 6f 72 79 20  e the.** memory 
21500 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 74 68 65  used to hold the
21510 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 65 6d   name of the tem
21520 70 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69  p file..*/.stati
21530 63 20 76 6f 69 64 20 63 6c 65 61 72 54 65 6d 70  c void clearTemp
21540 46 69 6c 65 28 53 68 65 6c 6c 53 74 61 74 65 20  File(ShellState 
21550 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 7a 54  *p){.  if( p->zT
21560 65 6d 70 46 69 6c 65 3d 3d 30 20 29 20 72 65 74  empFile==0 ) ret
21570 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 64 6f  urn;.  if( p->do
21580 58 64 67 4f 70 65 6e 20 29 20 72 65 74 75 72 6e  XdgOpen ) return
21590 3b 0a 20 20 69 66 28 20 73 68 65 6c 6c 44 65 6c  ;.  if( shellDel
215a0 65 74 65 46 69 6c 65 28 70 2d 3e 7a 54 65 6d 70  eteFile(p->zTemp
215b0 46 69 6c 65 29 20 29 20 72 65 74 75 72 6e 3b 0a  File) ) return;.
215c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
215d0 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20 20  ->zTempFile);.  
215e0 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 20 3d 20 30  p->zTempFile = 0
215f0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61 74  ;.}../*.** Creat
21600 65 20 61 20 6e 65 77 20 74 65 6d 70 20 66 69 6c  e a new temp fil
21610 65 20 6e 61 6d 65 20 77 69 74 68 20 74 68 65 20  e name with the 
21620 67 69 76 65 6e 20 73 75 66 66 69 78 2e 0a 2a 2f  given suffix..*/
21630 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e 65 77  .static void new
21640 54 65 6d 70 46 69 6c 65 28 53 68 65 6c 6c 53 74  TempFile(ShellSt
21650 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68  ate *p, const ch
21660 61 72 20 2a 7a 53 75 66 66 69 78 29 7b 0a 20 20  ar *zSuffix){.  
21670 63 6c 65 61 72 54 65 6d 70 46 69 6c 65 28 70 29  clearTempFile(p)
21680 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
21690 28 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 3b 0a  (p->zTempFile);.
216a0 20 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 20 3d    p->zTempFile =
216b0 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62 20   0;.  if( p->db 
216c0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
216d0 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64  ile_control(p->d
216e0 62 2c 20 30 2c 20 53 51 4c 49 54 45 5f 46 43 4e  b, 0, SQLITE_FCN
216f0 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45 2c  TL_TEMPFILENAME,
21700 20 26 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 3b   &p->zTempFile);
21710 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 7a 54  .  }.  if( p->zT
21720 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  empFile==0 ){.  
21730 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36 34    sqlite3_uint64
21740 20 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   r;.    sqlite3_
21750 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65 6f  randomness(sizeo
21760 66 28 72 29 2c 20 26 72 29 3b 0a 20 20 20 20 70  f(r), &r);.    p
21770 2d 3e 7a 54 65 6d 70 46 69 6c 65 20 3d 20 73 71  ->zTempFile = sq
21780 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 74  lite3_mprintf("t
21790 65 6d 70 25 6c 6c 78 2e 25 73 22 2c 20 72 2c 20  emp%llx.%s", r, 
217a0 7a 53 75 66 66 69 78 29 3b 0a 20 20 7d 65 6c 73  zSuffix);.  }els
217b0 65 7b 0a 20 20 20 20 70 2d 3e 7a 54 65 6d 70 46  e{.    p->zTempF
217c0 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ile = sqlite3_mp
217d0 72 69 6e 74 66 28 22 25 7a 2e 25 73 22 2c 20 70  rintf("%z.%s", p
217e0 2d 3e 7a 54 65 6d 70 46 69 6c 65 2c 20 7a 53 75  ->zTempFile, zSu
217f0 66 66 69 78 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ffix);.  }.  if(
21800 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 3d 3d 30   p->zTempFile==0
21810 20 29 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e   ){.    raw_prin
21820 74 66 28 73 74 64 65 72 72 2c 20 22 6f 75 74 20  tf(stderr, "out 
21830 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20  of memory\n");. 
21840 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a     exit(1);.  }.
21850 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d  }.../*.** The im
21860 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
21870 53 51 4c 20 73 63 61 6c 61 72 20 66 75 6e 63 74  SQL scalar funct
21880 69 6f 6e 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65  ion fkey_collate
21890 5f 63 6c 61 75 73 65 28 29 2c 20 75 73 65 64 0a  _clause(), used.
218a0 2a 2a 20 62 79 20 74 68 65 20 22 2e 6c 69 6e 74  ** by the ".lint
218b0 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 22 20 63   fkey-indexes" c
218c0 6f 6d 6d 61 6e 64 2e 20 54 68 69 73 20 73 63 61  ommand. This sca
218d0 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  lar function is 
218e0 61 6c 77 61 79 73 0a 2a 2a 20 63 61 6c 6c 65 64  always.** called
218f0 20 77 69 74 68 20 66 6f 75 72 20 61 72 67 75 6d   with four argum
21900 65 6e 74 73 20 2d 20 74 68 65 20 70 61 72 65 6e  ents - the paren
21910 74 20 74 61 62 6c 65 20 6e 61 6d 65 2c 20 74 68  t table name, th
21920 65 20 70 61 72 65 6e 74 20 63 6f 6c 75 6d 6e 20  e parent column 
21930 6e 61 6d 65 2c 0a 2a 2a 20 74 68 65 20 63 68 69  name,.** the chi
21940 6c 64 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e  ld table name an
21950 64 20 74 68 65 20 63 68 69 6c 64 20 63 6f 6c 75  d the child colu
21960 6d 6e 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20 20  mn name..**.**  
21970 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c   fkey_collate_cl
21980 61 75 73 65 28 27 70 61 72 65 6e 74 2d 74 61 62  ause('parent-tab
21990 27 2c 20 27 70 61 72 65 6e 74 2d 63 6f 6c 27 2c  ', 'parent-col',
219a0 20 27 63 68 69 6c 64 2d 74 61 62 27 2c 20 27 63   'child-tab', 'c
219b0 68 69 6c 64 2d 63 6f 6c 27 29 0a 2a 2a 0a 2a 2a  hild-col').**.**
219c0 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74 68   If either of th
219d0 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 73 20 6f  e named tables o
219e0 72 20 63 6f 6c 75 6d 6e 73 20 64 6f 20 6e 6f 74  r columns do not
219f0 20 65 78 69 73 74 2c 20 74 68 69 73 20 66 75 6e   exist, this fun
21a00 63 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e 73  ction.** returns
21a10 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e 67   an empty string
21a20 2e 20 41 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  . An empty strin
21a30 67 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72 6e  g is also return
21a40 65 64 20 69 66 20 62 6f 74 68 20 74 61 62 6c 65  ed if both table
21a50 73 0a 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e 73  s.** and columns
21a60 20 65 78 69 73 74 20 62 75 74 20 68 61 76 65 20   exist but have 
21a70 74 68 65 20 73 61 6d 65 20 64 65 66 61 75 6c 74  the same default
21a80 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
21a90 6e 63 65 2e 20 4f 72 2c 0a 2a 2a 20 69 66 20 62  nce. Or,.** if b
21aa0 6f 74 68 20 65 78 69 73 74 20 62 75 74 20 74 68  oth exist but th
21ab0 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74  e default collat
21ac0 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 61 72  ion sequences ar
21ad0 65 20 64 69 66 66 65 72 65 6e 74 2c 20 74 68 69  e different, thi
21ae0 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72 65  s.** function re
21af0 74 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e 67  turns the string
21b00 20 22 20 43 4f 4c 4c 41 54 45 20 3c 70 61 72 65   " COLLATE <pare
21b10 6e 74 2d 63 6f 6c 6c 61 74 69 6f 6e 3e 22 2c 20  nt-collation>", 
21b20 77 68 65 72 65 0a 2a 2a 20 3c 70 61 72 65 6e 74  where.** <parent
21b30 2d 63 6f 6c 6c 61 74 69 6f 6e 3e 20 69 73 20 74  -collation> is t
21b40 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  he default colla
21b50 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f 66  tion sequence of
21b60 20 74 68 65 20 70 61 72 65 6e 74 20 63 6f 6c 75   the parent colu
21b70 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  mn..*/.static vo
21b80 69 64 20 73 68 65 6c 6c 46 6b 65 79 43 6f 6c 6c  id shellFkeyColl
21b90 61 74 65 43 6c 61 75 73 65 28 0a 20 20 73 71 6c  ateClause(.  sql
21ba0 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43  ite3_context *pC
21bb0 74 78 2c 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a  tx,.  int nVal,.
21bc0 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20    sqlite3_value 
21bd0 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 73 71 6c  **apVal.){.  sql
21be0 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74  ite3 *db = sqlit
21bf0 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
21c00 6e 64 6c 65 28 70 43 74 78 29 3b 0a 20 20 63 6f  ndle(pCtx);.  co
21c10 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e  nst char *zParen
21c20 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  t;.  const char 
21c30 2a 7a 50 61 72 65 6e 74 43 6f 6c 3b 0a 20 20 63  *zParentCol;.  c
21c40 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 65  onst char *zPare
21c50 6e 74 53 65 71 3b 0a 20 20 63 6f 6e 73 74 20 63  ntSeq;.  const c
21c60 68 61 72 20 2a 7a 43 68 69 6c 64 3b 0a 20 20 63  har *zChild;.  c
21c70 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 69 6c  onst char *zChil
21c80 64 43 6f 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68  dCol;.  const ch
21c90 61 72 20 2a 7a 43 68 69 6c 64 53 65 71 20 3d 20  ar *zChildSeq = 
21ca0 30 3b 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a  0;  /* Initializ
21cb0 65 20 74 6f 20 61 76 6f 69 64 20 66 61 6c 73 65  e to avoid false
21cc0 2d 70 6f 73 69 74 69 76 65 20 77 61 72 6e 69 6e  -positive warnin
21cd0 67 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  g */.  int rc;..
21ce0 20 20 61 73 73 65 72 74 28 20 6e 56 61 6c 3d 3d    assert( nVal==
21cf0 34 20 29 3b 0a 20 20 7a 50 61 72 65 6e 74 20 3d  4 );.  zParent =
21d00 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
21d10 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
21d20 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 7a 50  (apVal[0]);.  zP
21d30 61 72 65 6e 74 43 6f 6c 20 3d 20 28 63 6f 6e 73  arentCol = (cons
21d40 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
21d50 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c  value_text(apVal
21d60 5b 31 5d 29 3b 0a 20 20 7a 43 68 69 6c 64 20 3d  [1]);.  zChild =
21d70 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
21d80 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
21d90 28 61 70 56 61 6c 5b 32 5d 29 3b 0a 20 20 7a 43  (apVal[2]);.  zC
21da0 68 69 6c 64 43 6f 6c 20 3d 20 28 63 6f 6e 73 74  hildCol = (const
21db0 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
21dc0 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b  alue_text(apVal[
21dd0 33 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f  3]);..  sqlite3_
21de0 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78  result_text(pCtx
21df0 2c 20 22 22 2c 20 2d 31 2c 20 53 51 4c 49 54 45  , "", -1, SQLITE
21e00 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 63 20 3d  _STATIC);.  rc =
21e10 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63   sqlite3_table_c
21e20 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 0a  olumn_metadata(.
21e30 20 20 20 20 20 20 64 62 2c 20 22 6d 61 69 6e 22        db, "main"
21e40 2c 20 7a 50 61 72 65 6e 74 2c 20 7a 50 61 72 65  , zParent, zPare
21e50 6e 74 43 6f 6c 2c 20 30 2c 20 26 7a 50 61 72 65  ntCol, 0, &zPare
21e60 6e 74 53 65 71 2c 20 30 2c 20 30 2c 20 30 0a 20  ntSeq, 0, 0, 0. 
21e70 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51   );.  if( rc==SQ
21e80 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72  LITE_OK ){.    r
21e90 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61 62 6c  c = sqlite3_tabl
21ea0 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74  e_column_metadat
21eb0 61 28 0a 20 20 20 20 20 20 20 20 64 62 2c 20 22  a(.        db, "
21ec0 6d 61 69 6e 22 2c 20 7a 43 68 69 6c 64 2c 20 7a  main", zChild, z
21ed0 43 68 69 6c 64 43 6f 6c 2c 20 30 2c 20 26 7a 43  ChildCol, 0, &zC
21ee0 68 69 6c 64 53 65 71 2c 20 30 2c 20 30 2c 20 30  hildSeq, 0, 0, 0
21ef0 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20 69  .    );.  }..  i
21f00 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
21f10 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 69   && sqlite3_stri
21f20 63 6d 70 28 7a 50 61 72 65 6e 74 53 65 71 2c 20  cmp(zParentSeq, 
21f30 7a 43 68 69 6c 64 53 65 71 29 20 29 7b 0a 20 20  zChildSeq) ){.  
21f40 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69    char *z = sqli
21f50 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 20 43 4f  te3_mprintf(" CO
21f60 4c 4c 41 54 45 20 25 73 22 2c 20 7a 50 61 72 65  LLATE %s", zPare
21f70 6e 74 53 65 71 29 3b 0a 20 20 20 20 73 71 6c 69  ntSeq);.    sqli
21f80 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
21f90 70 43 74 78 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c  pCtx, z, -1, SQL
21fa0 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
21fb0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
21fc0 28 7a 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  (z);.  }.}.../*.
21fd0 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74  ** The implement
21fe0 61 74 69 6f 6e 20 6f 66 20 64 6f 74 2d 63 6f 6d  ation of dot-com
21ff0 6d 61 6e 64 20 22 2e 6c 69 6e 74 20 66 6b 65 79  mand ".lint fkey
22000 2d 69 6e 64 65 78 65 73 22 2e 0a 2a 2f 0a 73 74  -indexes"..*/.st
22010 61 74 69 63 20 69 6e 74 20 6c 69 6e 74 46 6b 65  atic int lintFke
22020 79 49 6e 64 65 78 65 73 28 0a 20 20 53 68 65 6c  yIndexes(.  Shel
22030 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20  lState *pState, 
22040 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
22050 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f  urrent shell too
22060 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 63 68 61  l state */.  cha
22070 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20 20  r **azArg,      
22080 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22090 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e  Array of argumen
220a0 74 73 20 70 61 73 73 65 64 20 74 6f 20 64 6f 74  ts passed to dot
220b0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
220c0 74 20 6e 41 72 67 20 20 20 20 20 20 20 20 20 20  t nArg          
220d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
220e0 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
220f0 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f  es in azArg[] */
22100 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  .){.  sqlite3 *d
22110 62 20 3d 20 70 53 74 61 74 65 2d 3e 64 62 3b 20  b = pState->db; 
22120 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
22130 65 20 68 61 6e 64 6c 65 20 74 6f 20 71 75 65 72  e handle to quer
22140 79 20 22 6d 61 69 6e 22 20 64 62 20 6f 66 20 2a  y "main" db of *
22150 2f 0a 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20  /.  FILE *out = 
22160 70 53 74 61 74 65 2d 3e 6f 75 74 3b 20 20 20 20  pState->out;    
22170 20 20 20 20 2f 2a 20 53 74 72 65 61 6d 20 74 6f      /* Stream to
22180 20 77 72 69 74 65 20 6e 6f 6e 2d 65 72 72 6f 72   write non-error
22190 20 6f 75 74 70 75 74 20 74 6f 20 2a 2f 0a 20 20   output to */.  
221a0 69 6e 74 20 62 56 65 72 62 6f 73 65 20 3d 20 30  int bVerbose = 0
221b0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
221c0 2f 2a 20 49 66 20 2d 76 65 72 62 6f 73 65 20 69  /* If -verbose i
221d0 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20 69  s present */.  i
221e0 6e 74 20 62 47 72 6f 75 70 42 79 50 61 72 65 6e  nt bGroupByParen
221f0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  t = 0;         /
22200 2a 20 49 66 20 2d 67 72 6f 75 70 62 79 70 61 72  * If -groupbypar
22210 65 6e 74 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ent is present *
22220 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
22230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22240 20 20 20 20 2f 2a 20 54 6f 20 69 74 65 72 61 74      /* To iterat
22250 65 20 74 68 72 6f 75 67 68 20 61 7a 41 72 67 5b  e through azArg[
22260 5d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  ] */.  const cha
22270 72 20 2a 7a 49 6e 64 65 6e 74 20 3d 20 22 22 3b  r *zIndent = "";
22280 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d 75         /* How mu
22290 63 68 20 74 6f 20 69 6e 64 65 6e 74 20 43 52 45  ch to indent CRE
222a0 41 54 45 20 49 4e 44 45 58 20 62 79 20 2a 2f 0a  ATE INDEX by */.
222b0 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
222c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
222d0 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
222e0 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
222f0 6d 74 20 2a 70 53 71 6c 20 3d 20 30 3b 20 20 20  mt *pSql = 0;   
22300 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 69 6c 65        /* Compile
22310 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 51 4c  d version of SQL
22320 20 73 74 61 74 65 6d 65 6e 74 20 62 65 6c 6f 77   statement below
22330 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 54   */..  /*.  ** T
22340 68 69 73 20 53 45 4c 45 43 54 20 73 74 61 74 65  his SELECT state
22350 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 6f 6e 65  ment returns one
22360 20 72 6f 77 20 66 6f 72 20 65 61 63 68 20 66 6f   row for each fo
22370 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
22380 61 69 6e 74 0a 20 20 2a 2a 20 69 6e 20 74 68 65  aint.  ** in the
22390 20 73 63 68 65 6d 61 20 6f 66 20 74 68 65 20 6d   schema of the m
223a0 61 69 6e 20 64 61 74 61 62 61 73 65 2e 20 54 68  ain database. Th
223b0 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20  e column values 
223c0 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 30  are:.  **.  ** 0
223d0 2e 20 54 68 65 20 74 65 78 74 20 6f 66 20 61 6e  . The text of an
223e0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 73   SQL statement s
223f0 69 6d 69 6c 61 72 20 74 6f 3a 0a 20 20 2a 2a 0a  imilar to:.  **.
22400 20 20 2a 2a 20 20 20 20 20 20 22 45 58 50 4c 41    **      "EXPLA
22410 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 53 45  IN QUERY PLAN SE
22420 4c 45 43 54 20 31 20 46 52 4f 4d 20 63 68 69 6c  LECT 1 FROM chil
22430 64 5f 74 61 62 6c 65 20 57 48 45 52 45 20 63 68  d_table WHERE ch
22440 69 6c 64 5f 6b 65 79 3d 3f 22 0a 20 20 2a 2a 0a  ild_key=?".  **.
22450 20 20 2a 2a 20 20 20 20 54 68 69 73 20 53 45 4c    **    This SEL
22460 45 43 54 20 69 73 20 73 69 6d 69 6c 61 72 20 74  ECT is similar t
22470 6f 20 74 68 65 20 6f 6e 65 20 74 68 61 74 20 74  o the one that t
22480 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20  he foreign keys 
22490 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 20  implementation. 
224a0 20 2a 2a 20 20 20 20 6e 65 65 64 73 20 74 6f 20   **    needs to 
224b0 72 75 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 20 6f  run internally o
224c0 6e 20 63 68 69 6c 64 20 74 61 62 6c 65 73 2e 20  n child tables. 
224d0 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20 69  If there is an i
224e0 6e 64 65 78 20 74 68 61 74 20 63 61 6e 0a 20 20  ndex that can.  
224f0 2a 2a 20 20 20 20 62 65 20 75 73 65 64 20 74 6f  **    be used to
22500 20 6f 70 74 69 6d 69 7a 65 20 74 68 69 73 20 71   optimize this q
22510 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20 63 61  uery, then it ca
22520 6e 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20 62  n also be used b
22530 79 20 74 68 65 20 46 4b 0a 20 20 2a 2a 20 20 20  y the FK.  **   
22540 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   implementation 
22550 74 6f 20 6f 70 74 69 6d 69 7a 65 20 44 45 4c 45  to optimize DELE
22560 54 45 20 6f 72 20 55 50 44 41 54 45 20 73 74 61  TE or UPDATE sta
22570 74 65 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70  tements on the p
22580 61 72 65 6e 74 0a 20 20 2a 2a 20 20 20 20 74 61  arent.  **    ta
22590 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 31  ble..  **.  ** 1
225a0 2e 20 41 20 47 4c 4f 42 20 70 61 74 74 65 72 6e  . A GLOB pattern
225b0 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 73 71   suitable for sq
225c0 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 29 2e  lite3_strglob().
225d0 20 49 66 20 74 68 65 20 70 6c 61 6e 20 6f 75 74   If the plan out
225e0 70 75 74 20 62 79 0a 20 20 2a 2a 20 20 20 20 74  put by.  **    t
225f0 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59  he EXPLAIN QUERY
22600 20 50 4c 41 4e 20 63 6f 6d 6d 61 6e 64 20 6d 61   PLAN command ma
22610 74 63 68 65 73 20 74 68 69 73 20 70 61 74 74 65  tches this patte
22620 72 6e 2c 20 74 68 65 6e 20 74 68 65 20 73 63 68  rn, then the sch
22630 65 6d 61 0a 20 20 2a 2a 20 20 20 20 63 6f 6e 74  ema.  **    cont
22640 61 69 6e 73 20 61 6e 20 69 6e 64 65 78 20 74 68  ains an index th
22650 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  at can be used t
22660 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 65 20 71  o optimize the q
22670 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  uery..  **.  ** 
22680 32 2e 20 48 75 6d 61 6e 20 72 65 61 64 61 62 6c  2. Human readabl
22690 65 20 74 65 78 74 20 74 68 61 74 20 64 65 73 63  e text that desc
226a0 72 69 62 65 73 20 74 68 65 20 63 68 69 6c 64 20  ribes the child 
226b0 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e  table and column
226c0 73 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a  s. e.g..  **.  *
226d0 2a 20 20 20 20 20 20 20 22 63 68 69 6c 64 5f 74  *       "child_t
226e0 61 62 6c 65 28 63 68 69 6c 64 5f 6b 65 79 31 2c  able(child_key1,
226f0 20 63 68 69 6c 64 5f 6b 65 79 32 29 22 0a 20 20   child_key2)".  
22700 2a 2a 0a 20 20 2a 2a 20 33 2e 20 48 75 6d 61 6e  **.  ** 3. Human
22710 20 72 65 61 64 61 62 6c 65 20 74 65 78 74 20 74   readable text t
22720 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74 68  hat describes th
22730 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 61  e parent table a
22740 6e 64 20 63 6f 6c 75 6d 6e 73 2e 20 65 2e 67 2e  nd columns. e.g.
22750 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
22760 20 22 70 61 72 65 6e 74 5f 74 61 62 6c 65 28 70   "parent_table(p
22770 61 72 65 6e 74 5f 6b 65 79 31 2c 20 70 61 72 65  arent_key1, pare
22780 6e 74 5f 6b 65 79 32 29 22 0a 20 20 2a 2a 0a 20  nt_key2)".  **. 
22790 20 2a 2a 20 34 2e 20 41 20 66 75 6c 6c 20 43 52   ** 4. A full CR
227a0 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74 65  EATE INDEX state
227b0 6d 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e 64 65  ment for an inde
227c0 78 20 74 68 61 74 20 63 6f 75 6c 64 20 62 65 20  x that could be 
227d0 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 20 20 20  used to.  **    
227e0 6f 70 74 69 6d 69 7a 65 20 44 45 4c 45 54 45 20  optimize DELETE 
227f0 6f 72 20 55 50 44 41 54 45 20 73 74 61 74 65 6d  or UPDATE statem
22800 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 72 65  ents on the pare
22810 6e 74 20 74 61 62 6c 65 2e 20 65 2e 67 2e 0a 20  nt table. e.g.. 
22820 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 22   **.  **       "
22830 43 52 45 41 54 45 20 49 4e 44 45 58 20 63 68 69  CREATE INDEX chi
22840 6c 64 5f 74 61 62 6c 65 5f 63 68 69 6c 64 5f 6b  ld_table_child_k
22850 65 79 20 4f 4e 20 63 68 69 6c 64 5f 74 61 62 6c  ey ON child_tabl
22860 65 28 63 68 69 6c 64 5f 6b 65 79 29 22 0a 20 20  e(child_key)".  
22870 2a 2a 0a 20 20 2a 2a 20 35 2e 20 54 68 65 20 6e  **.  ** 5. The n
22880 61 6d 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e  ame of the paren
22890 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20  t table..  **.  
228a0 2a 2a 20 54 68 65 73 65 20 73 69 78 20 76 61 6c  ** These six val
228b0 75 65 73 20 61 72 65 20 75 73 65 64 20 62 79 20  ues are used by 
228c0 74 68 65 20 43 20 6c 6f 67 69 63 20 62 65 6c 6f  the C logic belo
228d0 77 20 74 6f 20 67 65 6e 65 72 61 74 65 20 74 68  w to generate th
228e0 65 20 72 65 70 6f 72 74 2e 0a 20 20 2a 2f 0a 20  e report..  */. 
228f0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
22900 6c 20 3d 0a 20 20 22 53 45 4c 45 43 54 20 22 0a  l =.  "SELECT ".
22910 20 20 20 20 22 20 20 20 20 20 27 45 58 50 4c 41      "     'EXPLA
22920 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 53 45  IN QUERY PLAN SE
22930 4c 45 43 54 20 31 20 46 52 4f 4d 20 27 20 7c 7c  LECT 1 FROM ' ||
22940 20 71 75 6f 74 65 28 73 2e 6e 61 6d 65 29 20 7c   quote(s.name) |
22950 7c 20 27 20 57 48 45 52 45 20 27 22 0a 20 20 20  | ' WHERE '".   
22960 20 22 20 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e   "  || group_con
22970 63 61 74 28 71 75 6f 74 65 28 73 2e 6e 61 6d 65  cat(quote(s.name
22980 29 20 7c 7c 20 27 2e 27 20 7c 7c 20 71 75 6f 74  ) || '.' || quot
22990 65 28 66 2e 5b 66 72 6f 6d 5d 29 20 7c 7c 20 27  e(f.[from]) || '
229a0 3d 3f 27 20 22 0a 20 20 20 20 22 20 20 7c 7c 20  =?' ".    "  || 
229b0 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61  fkey_collate_cla
229c0 75 73 65 28 22 0a 20 20 20 20 22 20 20 20 20 20  use(".    "     
229d0 20 20 66 2e 5b 74 61 62 6c 65 5d 2c 20 43 4f 41    f.[table], COA
229e0 4c 45 53 43 45 28 66 2e 5b 74 6f 5d 2c 20 70 2e  LESCE(f.[to], p.
229f0 5b 6e 61 6d 65 5d 29 2c 20 73 2e 6e 61 6d 65 2c  [name]), s.name,
22a00 20 66 2e 5b 66 72 6f 6d 5d 29 2c 27 20 41 4e 44   f.[from]),' AND
22a10 20 27 29 22 0a 20 20 20 20 22 2c 20 22 0a 20 20   ')".    ", ".  
22a20 20 20 22 20 20 20 20 20 27 53 45 41 52 43 48 20    "     'SEARCH 
22a30 54 41 42 4c 45 20 27 20 7c 7c 20 73 2e 6e 61 6d  TABLE ' || s.nam
22a40 65 20 7c 7c 20 27 20 55 53 49 4e 47 20 43 4f 56  e || ' USING COV
22a50 45 52 49 4e 47 20 49 4e 44 45 58 2a 28 27 22 0a  ERING INDEX*('".
22a60 20 20 20 20 22 20 20 7c 7c 20 67 72 6f 75 70 5f      "  || group_
22a70 63 6f 6e 63 61 74 28 27 2a 3d 3f 27 2c 20 27 20  concat('*=?', ' 
22a80 41 4e 44 20 27 29 20 7c 7c 20 27 29 27 22 0a 20  AND ') || ')'". 
22a90 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20 20 20     ", ".    "   
22aa0 20 20 73 2e 6e 61 6d 65 20 20 7c 7c 20 27 28 27    s.name  || '('
22ab0 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74   || group_concat
22ac0 28 66 2e 5b 66 72 6f 6d 5d 2c 20 20 27 2c 20 27  (f.[from],  ', '
22ad0 29 20 7c 7c 20 27 29 27 22 0a 20 20 20 20 22 2c  ) || ')'".    ",
22ae0 20 22 0a 20 20 20 20 22 20 20 20 20 20 66 2e 5b   ".    "     f.[
22af0 74 61 62 6c 65 5d 20 7c 7c 20 27 28 27 20 7c 7c  table] || '(' ||
22b00 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 43 4f   group_concat(CO
22b10 41 4c 45 53 43 45 28 66 2e 5b 74 6f 5d 2c 20 70  ALESCE(f.[to], p
22b20 2e 5b 6e 61 6d 65 5d 29 29 20 7c 7c 20 27 29 27  .[name])) || ')'
22b30 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22  ".    ", ".    "
22b40 20 20 20 20 20 27 43 52 45 41 54 45 20 49 4e 44       'CREATE IND
22b50 45 58 20 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e  EX ' || quote(s.
22b60 6e 61 6d 65 20 7c 7c 27 5f 27 7c 7c 20 67 72 6f  name ||'_'|| gro
22b70 75 70 5f 63 6f 6e 63 61 74 28 66 2e 5b 66 72 6f  up_concat(f.[fro
22b80 6d 5d 2c 20 27 5f 27 29 29 22 0a 20 20 20 20 22  m], '_'))".    "
22b90 20 20 7c 7c 20 27 20 4f 4e 20 27 20 7c 7c 20 71    || ' ON ' || q
22ba0 75 6f 74 65 28 73 2e 6e 61 6d 65 29 20 7c 7c 20  uote(s.name) || 
22bb0 27 28 27 22 0a 20 20 20 20 22 20 20 7c 7c 20 67  '('".    "  || g
22bc0 72 6f 75 70 5f 63 6f 6e 63 61 74 28 71 75 6f 74  roup_concat(quot
22bd0 65 28 66 2e 5b 66 72 6f 6d 5d 29 20 7c 7c 22 0a  e(f.[from]) ||".
22be0 20 20 20 20 22 20 20 20 20 20 20 20 20 66 6b 65      "        fke
22bf0 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65  y_collate_clause
22c00 28 22 0a 20 20 20 20 22 20 20 20 20 20 20 20 20  (".    "        
22c10 20 20 66 2e 5b 74 61 62 6c 65 5d 2c 20 43 4f 41    f.[table], COA
22c20 4c 45 53 43 45 28 66 2e 5b 74 6f 5d 2c 20 70 2e  LESCE(f.[to], p.
22c30 5b 6e 61 6d 65 5d 29 2c 20 73 2e 6e 61 6d 65 2c  [name]), s.name,
22c40 20 66 2e 5b 66 72 6f 6d 5d 29 2c 20 27 2c 20 27   f.[from]), ', '
22c50 29 22 0a 20 20 20 20 22 20 20 7c 7c 20 27 29 3b  )".    "  || ');
22c60 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20  '".    ", ".    
22c70 22 20 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d 20  "     f.[table] 
22c80 22 0a 20 20 20 20 22 46 52 4f 4d 20 73 71 6c 69  ".    "FROM sqli
22c90 74 65 5f 6d 61 73 74 65 72 20 41 53 20 73 2c 20  te_master AS s, 
22ca0 70 72 61 67 6d 61 5f 66 6f 72 65 69 67 6e 5f 6b  pragma_foreign_k
22cb0 65 79 5f 6c 69 73 74 28 73 2e 6e 61 6d 65 29 20  ey_list(s.name) 
22cc0 41 53 20 66 20 22 0a 20 20 20 20 22 4c 45 46 54  AS f ".    "LEFT
22cd0 20 4a 4f 49 4e 20 70 72 61 67 6d 61 5f 74 61 62   JOIN pragma_tab
22ce0 6c 65 5f 69 6e 66 6f 20 41 53 20 70 20 4f 4e 20  le_info AS p ON 
22cf0 28 70 6b 2d 31 3d 73 65 71 20 41 4e 44 20 70 2e  (pk-1=seq AND p.
22d00 61 72 67 3d 66 2e 5b 74 61 62 6c 65 5d 29 20 22  arg=f.[table]) "
22d10 0a 20 20 20 20 22 47 52 4f 55 50 20 42 59 20 73  .    "GROUP BY s
22d20 2e 6e 61 6d 65 2c 20 66 2e 69 64 20 22 0a 20 20  .name, f.id ".  
22d30 20 20 22 4f 52 44 45 52 20 42 59 20 28 43 41 53    "ORDER BY (CAS
22d40 45 20 57 48 45 4e 20 3f 20 54 48 45 4e 20 66 2e  E WHEN ? THEN f.
22d50 5b 74 61 62 6c 65 5d 20 45 4c 53 45 20 73 2e 6e  [table] ELSE s.n
22d60 61 6d 65 20 45 4e 44 29 22 0a 20 20 3b 0a 20 20  ame END)".  ;.  
22d70 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f  const char *zGlo
22d80 62 49 50 4b 20 3d 20 22 53 45 41 52 43 48 20 54  bIPK = "SEARCH T
22d90 41 42 4c 45 20 2a 20 55 53 49 4e 47 20 49 4e 54  ABLE * USING INT
22da0 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
22db0 20 28 72 6f 77 69 64 3d 3f 29 22 3b 0a 0a 20 20   (rowid=?)";..  
22dc0 66 6f 72 28 69 3d 32 3b 20 69 3c 6e 41 72 67 3b  for(i=2; i<nArg;
22dd0 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6e   i++){.    int n
22de0 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 41 72   = strlen30(azAr
22df0 67 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20 6e  g[i]);.    if( n
22e00 3e 31 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  >1 && sqlite3_st
22e10 72 6e 69 63 6d 70 28 22 2d 76 65 72 62 6f 73 65  rnicmp("-verbose
22e20 22 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 6e 29 3d  ", azArg[i], n)=
22e30 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 56 65 72  =0 ){.      bVer
22e40 62 6f 73 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  bose = 1;.    }.
22e50 20 20 20 20 65 6c 73 65 20 69 66 28 20 6e 3e 31      else if( n>1
22e60 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6e   && sqlite3_strn
22e70 69 63 6d 70 28 22 2d 67 72 6f 75 70 62 79 70 61  icmp("-groupbypa
22e80 72 65 6e 74 22 2c 20 61 7a 41 72 67 5b 69 5d 2c  rent", azArg[i],
22e90 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   n)==0 ){.      
22ea0 62 47 72 6f 75 70 42 79 50 61 72 65 6e 74 20 3d  bGroupByParent =
22eb0 20 31 3b 0a 20 20 20 20 20 20 7a 49 6e 64 65 6e   1;.      zInden
22ec0 74 20 3d 20 22 20 20 20 20 22 3b 0a 20 20 20 20  t = "    ";.    
22ed0 7d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20 20  }.    else{.    
22ee0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
22ef0 65 72 72 2c 20 22 55 73 61 67 65 3a 20 25 73 20  err, "Usage: %s 
22f00 25 73 20 3f 2d 76 65 72 62 6f 73 65 3f 20 3f 2d  %s ?-verbose? ?-
22f10 67 72 6f 75 70 62 79 70 61 72 65 6e 74 3f 5c 6e  groupbyparent?\n
22f20 22 2c 0a 20 20 20 20 20 20 20 20 20 20 61 7a 41  ",.          azA
22f30 72 67 5b 30 5d 2c 20 61 7a 41 72 67 5b 31 5d 0a  rg[0], azArg[1].
22f40 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72        );.      r
22f50 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
22f60 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OR;.    }.  }.. 
22f70 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68 65   /* Register the
22f80 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c   fkey_collate_cl
22f90 61 75 73 65 28 29 20 53 51 4c 20 66 75 6e 63 74  ause() SQL funct
22fa0 69 6f 6e 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ion */.  rc = sq
22fb0 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
22fc0 63 74 69 6f 6e 28 64 62 2c 20 22 66 6b 65 79 5f  ction(db, "fkey_
22fd0 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 22 2c  collate_clause",
22fe0 20 34 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c   4, SQLITE_UTF8,
22ff0 0a 20 20 20 20 20 20 30 2c 20 73 68 65 6c 6c 46  .      0, shellF
23000 6b 65 79 43 6f 6c 6c 61 74 65 43 6c 61 75 73 65  keyCollateClause
23010 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 0a 0a 20 20  , 0, 0.  );...  
23020 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23030 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  K ){.    rc = sq
23040 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
23050 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  (db, zSql, -1, &
23060 70 53 71 6c 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  pSql, 0);.  }.  
23070 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
23080 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  K ){.    sqlite3
23090 5f 62 69 6e 64 5f 69 6e 74 28 70 53 71 6c 2c 20  _bind_int(pSql, 
230a0 31 2c 20 62 47 72 6f 75 70 42 79 50 61 72 65 6e  1, bGroupByParen
230b0 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72  t);.  }..  if( r
230c0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
230d0 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 20      int rc2;.   
230e0 20 63 68 61 72 20 2a 7a 50 72 65 76 20 3d 20 30   char *zPrev = 0
230f0 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c  ;.    while( SQL
23100 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
23110 5f 73 74 65 70 28 70 53 71 6c 29 20 29 7b 0a 20  _step(pSql) ){. 
23120 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20 2d       int res = -
23130 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
23140 5f 73 74 6d 74 20 2a 70 45 78 70 6c 61 69 6e 20  _stmt *pExplain 
23150 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  = 0;.      const
23160 20 63 68 61 72 20 2a 7a 45 51 50 20 3d 20 28 63   char *zEQP = (c
23170 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
23180 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
23190 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 63  Sql, 0);.      c
231a0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62  onst char *zGlob
231b0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
231c0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
231d0 65 78 74 28 70 53 71 6c 2c 20 31 29 3b 0a 20 20  ext(pSql, 1);.  
231e0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
231f0 7a 46 72 6f 6d 20 3d 20 28 63 6f 6e 73 74 20 63  zFrom = (const c
23200 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
23210 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 32  umn_text(pSql, 2
23220 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  );.      const c
23230 68 61 72 20 2a 7a 54 61 72 67 65 74 20 3d 20 28  har *zTarget = (
23240 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
23250 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
23260 70 53 71 6c 2c 20 33 29 3b 0a 20 20 20 20 20 20  pSql, 3);.      
23270 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 49 20  const char *zCI 
23280 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
23290 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
232a0 78 74 28 70 53 71 6c 2c 20 34 29 3b 0a 20 20 20  xt(pSql, 4);.   
232b0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
232c0 50 61 72 65 6e 74 20 3d 20 28 63 6f 6e 73 74 20  Parent = (const 
232d0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
232e0 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20  lumn_text(pSql, 
232f0 35 29 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d 20  5);..      rc = 
23300 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
23310 76 32 28 64 62 2c 20 7a 45 51 50 2c 20 2d 31 2c  v2(db, zEQP, -1,
23320 20 26 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a   &pExplain, 0);.
23330 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
23340 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b  LITE_OK ) break;
23350 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
23360 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
23370 74 65 70 28 70 45 78 70 6c 61 69 6e 29 20 29 7b  tep(pExplain) ){
23380 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
23390 68 61 72 20 2a 7a 50 6c 61 6e 20 3d 20 28 63 6f  har *zPlan = (co
233a0 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
233b0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 45  3_column_text(pE
233c0 78 70 6c 61 69 6e 2c 20 33 29 3b 0a 20 20 20 20  xplain, 3);.    
233d0 20 20 20 20 72 65 73 20 3d 20 28 0a 20 20 20 20      res = (.    
233e0 20 20 20 20 20 20 20 20 20 20 30 3d 3d 73 71 6c            0==sql
233f0 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 7a 47 6c  ite3_strglob(zGl
23400 6f 62 2c 20 7a 50 6c 61 6e 29 0a 20 20 20 20 20  ob, zPlan).     
23410 20 20 20 20 20 20 7c 7c 20 30 3d 3d 73 71 6c 69        || 0==sqli
23420 74 65 33 5f 73 74 72 67 6c 6f 62 28 7a 47 6c 6f  te3_strglob(zGlo
23430 62 49 50 4b 2c 20 7a 50 6c 61 6e 29 0a 20 20 20  bIPK, zPlan).   
23440 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a       );.      }.
23450 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
23460 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78 70  e3_finalize(pExp
23470 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28  lain);.      if(
23480 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
23490 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 69   break;..      i
234a0 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20 20  f( res<0 ){.    
234b0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
234c0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 69  tderr, "Error: i
234d0 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 22 29 3b  nternal error");
234e0 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
234f0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
23500 20 20 20 20 20 69 66 28 20 62 47 72 6f 75 70 42       if( bGroupB
23510 79 50 61 72 65 6e 74 0a 20 20 20 20 20 20 20 20  yParent.        
23520 26 26 20 28 62 56 65 72 62 6f 73 65 20 7c 7c 20  && (bVerbose || 
23530 72 65 73 3d 3d 30 29 0a 20 20 20 20 20 20 20 20  res==0).        
23540 26 26 20 28 7a 50 72 65 76 3d 3d 30 20 7c 7c 20  && (zPrev==0 || 
23550 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
23560 7a 50 61 72 65 6e 74 2c 20 7a 50 72 65 76 29 29  zParent, zPrev))
23570 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
23580 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
23590 28 6f 75 74 2c 20 22 2d 2d 20 50 61 72 65 6e 74  (out, "-- Parent
235a0 20 74 61 62 6c 65 20 25 73 5c 6e 22 2c 20 7a 50   table %s\n", zP
235b0 61 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 20 20  arent);.        
235c0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
235d0 50 72 65 76 29 3b 0a 20 20 20 20 20 20 20 20 20  Prev);.         
235e0 20 7a 50 72 65 76 20 3d 20 73 71 6c 69 74 65 33   zPrev = sqlite3
235f0 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a  _mprintf("%s", z
23600 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 20  Parent);.       
23610 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20   }..        if( 
23620 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  res==0 ){.      
23630 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
23640 75 74 2c 20 22 25 73 25 73 20 2d 2d 3e 20 25 73  ut, "%s%s --> %s
23650 5c 6e 22 2c 20 7a 49 6e 64 65 6e 74 2c 20 7a 43  \n", zIndent, zC
23660 49 2c 20 7a 54 61 72 67 65 74 29 3b 0a 20 20 20  I, zTarget);.   
23670 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 62       }else if( b
23680 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20  Verbose ){.     
23690 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
236a0 6f 75 74 2c 20 22 25 73 2f 2a 20 6e 6f 20 65 78  out, "%s/* no ex
236b0 74 72 61 20 69 6e 64 65 78 65 73 20 72 65 71 75  tra indexes requ
236c0 69 72 65 64 20 66 6f 72 20 25 73 20 2d 3e 20 25  ired for %s -> %
236d0 73 20 2a 2f 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s */\n",.       
236e0 20 20 20 20 20 20 20 7a 49 6e 64 65 6e 74 2c 20         zIndent, 
236f0 7a 46 72 6f 6d 2c 20 7a 54 61 72 67 65 74 0a 20  zFrom, zTarget. 
23700 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
23710 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
23720 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
23730 66 72 65 65 28 7a 50 72 65 76 29 3b 0a 0a 20 20  free(zPrev);..  
23740 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
23750 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 61 77  _OK ){.      raw
23760 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
23770 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f  "%s\n", sqlite3_
23780 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20  errmsg(db));.   
23790 20 7d 0a 0a 20 20 20 20 72 63 32 20 3d 20 73 71   }..    rc2 = sq
237a0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
237b0 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Sql);.    if( rc
237c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 72  ==SQLITE_OK && r
237d0 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  c2!=SQLITE_OK ){
237e0 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32 3b  .      rc = rc2;
237f0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
23800 66 28 73 74 64 65 72 72 2c 20 22 25 73 5c 6e 22  f(stderr, "%s\n"
23810 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
23820 28 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  (db));.    }.  }
23830 65 6c 73 65 7b 0a 20 20 20 20 72 61 77 5f 70 72  else{.    raw_pr
23840 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
23850 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
23860 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d 0a 0a 20  msg(db));.  }.. 
23870 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
23880 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
23890 69 6f 6e 20 6f 66 20 22 2e 6c 69 6e 74 22 20 64  ion of ".lint" d
238a0 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73  ot command..*/.s
238b0 74 61 74 69 63 20 69 6e 74 20 6c 69 6e 74 44 6f  tatic int lintDo
238c0 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 53 68 65 6c  tCommand(.  Shel
238d0 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20  lState *pState, 
238e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
238f0 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f  urrent shell too
23900 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 63 68 61  l state */.  cha
23910 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20 20  r **azArg,      
23920 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23930 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e  Array of argumen
23940 74 73 20 70 61 73 73 65 64 20 74 6f 20 64 6f 74  ts passed to dot
23950 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
23960 74 20 6e 41 72 67 20 20 20 20 20 20 20 20 20 20  t nArg          
23970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23980 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
23990 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f  es in azArg[] */
239a0 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 6e  .){.  int n;.  n
239b0 20 3d 20 28 6e 41 72 67 3e 3d 32 20 3f 20 73 74   = (nArg>=2 ? st
239c0 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 31 5d 29  rlen30(azArg[1])
239d0 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 6e 3c 31   : 0);.  if( n<1
239e0 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 6e   || sqlite3_strn
239f0 69 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 20 22  icmp(azArg[1], "
23a00 66 6b 65 79 2d 69 6e 64 65 78 65 73 22 2c 20 6e  fkey-indexes", n
23a10 29 20 29 20 67 6f 74 6f 20 75 73 61 67 65 3b 0a  ) ) goto usage;.
23a20 20 20 72 65 74 75 72 6e 20 6c 69 6e 74 46 6b 65    return lintFke
23a30 79 49 6e 64 65 78 65 73 28 70 53 74 61 74 65 2c  yIndexes(pState,
23a40 20 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b 0a 0a   azArg, nArg);..
23a50 20 75 73 61 67 65 3a 0a 20 20 72 61 77 5f 70 72   usage:.  raw_pr
23a60 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
23a70 61 67 65 20 25 73 20 73 75 62 2d 63 6f 6d 6d 61  age %s sub-comma
23a80 6e 64 20 3f 73 77 69 74 63 68 65 73 2e 2e 2e 3f  nd ?switches...?
23a90 5c 6e 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a  \n", azArg[0]);.
23aa0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
23ab0 65 72 72 2c 20 22 57 68 65 72 65 20 73 75 62 2d  err, "Where sub-
23ac0 63 6f 6d 6d 61 6e 64 73 20 61 72 65 3a 5c 6e 22  commands are:\n"
23ad0 29 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28  );.  raw_printf(
23ae0 73 74 64 65 72 72 2c 20 22 20 20 20 20 66 6b 65  stderr, "    fke
23af0 79 2d 69 6e 64 65 78 65 73 5c 6e 22 29 3b 0a 20  y-indexes\n");. 
23b00 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
23b10 52 52 4f 52 3b 0a 7d 0a 0a 23 69 66 20 21 64 65  RROR;.}..#if !de
23b20 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
23b30 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20  T_VIRTUALTABLE) 
23b40 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  && defined(SQLIT
23b50 45 5f 48 41 56 45 5f 5a 4c 49 42 29 0a 2f 2a 2a  E_HAVE_ZLIB)./**
23b60 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23b70 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23b80 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23b90 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23ba0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a  ***************.
23bb0 2a 2a 20 54 68 65 20 22 2e 61 72 63 68 69 76 65  ** The ".archive
23bc0 22 20 6f 72 20 22 2e 61 72 22 20 63 6f 6d 6d 61  " or ".ar" comma
23bd0 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nd..*/.static vo
23be0 69 64 20 73 68 65 6c 6c 50 72 65 70 61 72 65 28  id shellPrepare(
23bf0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
23c00 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20  .  int *pRc, .  
23c10 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
23c20 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  , .  sqlite3_stm
23c30 74 20 2a 2a 70 70 53 74 6d 74 0a 29 7b 0a 20 20  t **ppStmt.){.  
23c40 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69  *ppStmt = 0;.  i
23c50 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f  f( *pRc==SQLITE_
23c60 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63  OK ){.    int rc
23c70 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
23c80 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20  re_v2(db, zSql, 
23c90 2d 31 2c 20 70 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, ppStmt, 0);.
23ca0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
23cb0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
23cc0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
23cd0 2c 20 22 73 71 6c 20 65 72 72 6f 72 3a 20 25 73  , "sql error: %s
23ce0 20 28 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20   (%d)\n", .     
23cf0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72       sqlite3_err
23d00 6d 73 67 28 64 62 29 2c 20 73 71 6c 69 74 65 33  msg(db), sqlite3
23d10 5f 65 72 72 63 6f 64 65 28 64 62 29 0a 20 20 20  _errcode(db).   
23d20 20 20 20 29 3b 0a 20 20 20 20 20 20 2a 70 52 63     );.      *pRc
23d30 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d   = rc;.    }.  }
23d40 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
23d50 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e  shellPreparePrin
23d60 74 66 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  tf(.  sqlite3 *d
23d70 62 2c 20 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20  b, .  int *pRc, 
23d80 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
23d90 2a 2a 70 70 53 74 6d 74 2c 0a 20 20 63 6f 6e 73  **ppStmt,.  cons
23da0 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 0a 20  t char *zFmt, . 
23db0 20 2e 2e 2e 0a 29 7b 0a 20 20 2a 70 70 53 74 6d   ....){.  *ppStm
23dc0 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52  t = 0;.  if( *pR
23dd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
23de0 20 20 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a      va_list ap;.
23df0 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20      char *z;.   
23e00 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
23e10 6d 74 29 3b 0a 20 20 20 20 7a 20 3d 20 73 71 6c  mt);.    z = sql
23e20 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46  ite3_vmprintf(zF
23e30 6d 74 2c 20 61 70 29 3b 0a 20 20 20 20 69 66 28  mt, ap);.    if(
23e40 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a   z==0 ){.      *
23e50 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d  pRc = SQLITE_NOM
23e60 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  EM;.    }else{. 
23e70 20 20 20 20 20 73 68 65 6c 6c 50 72 65 70 61 72       shellPrepar
23e80 65 28 64 62 2c 20 70 52 63 2c 20 7a 2c 20 70 70  e(db, pRc, z, pp
23e90 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Stmt);.      sql
23ea0 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
23eb0 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69    }.  }.}..stati
23ec0 63 20 76 6f 69 64 20 73 68 65 6c 6c 46 69 6e 61  c void shellFina
23ed0 6c 69 7a 65 28 0a 20 20 69 6e 74 20 2a 70 52 63  lize(.  int *pRc
23ee0 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  , .  sqlite3_stm
23ef0 74 20 2a 70 53 74 6d 74 0a 29 7b 0a 20 20 69 66  t *pStmt.){.  if
23f00 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 73  ( pStmt ){.    s
23f10 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c  qlite3 *db = sql
23f20 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65 28 70  ite3_db_handle(p
23f30 53 74 6d 74 29 3b 0a 20 20 20 20 69 6e 74 20 72  Stmt);.    int r
23f40 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  c = sqlite3_fina
23f50 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
23f60 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54   if( *pRc==SQLIT
23f70 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 66  E_OK ){.      if
23f80 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
23f90 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  ){.        raw_p
23fa0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53  rintf(stderr, "S
23fb0 51 4c 20 65 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  QL error: %s\n",
23fc0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
23fd0 64 62 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  db));.      }.  
23fe0 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20      *pRc = rc;. 
23ff0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74     }.  }.}..stat
24000 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 52 65 73  ic void shellRes
24010 65 74 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20  et(.  int *pRc, 
24020 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
24030 2a 70 53 74 6d 74 0a 29 7b 0a 20 20 69 6e 74 20  *pStmt.){.  int 
24040 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73  rc = sqlite3_res
24050 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28  et(pStmt);.  if(
24060 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
24070 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 21 3d   ){.    if( rc!=
24080 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
24090 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
240a0 20 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64   sqlite3_db_hand
240b0 6c 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  le(pStmt);.     
240c0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
240d0 72 72 2c 20 22 53 51 4c 20 65 72 72 6f 72 3a 20  rr, "SQL error: 
240e0 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  %s\n", sqlite3_e
240f0 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20  rrmsg(db));.    
24100 7d 0a 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b  }.    *pRc = rc;
24110 0a 20 20 7d 0a 7d 0a 2f 2a 0a 2a 2a 20 53 74 72  .  }.}./*.** Str
24120 75 63 74 75 72 65 20 72 65 70 72 65 73 65 6e 74  ucture represent
24130 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 22 2e 61  ing a single ".a
24140 72 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 74  r" command..*/.t
24150 79 70 65 64 65 66 20 73 74 72 75 63 74 20 41 72  ypedef struct Ar
24160 43 6f 6d 6d 61 6e 64 20 41 72 43 6f 6d 6d 61 6e  Command ArComman
24170 64 3b 0a 73 74 72 75 63 74 20 41 72 43 6f 6d 6d  d;.struct ArComm
24180 61 6e 64 20 7b 0a 20 20 75 38 20 65 43 6d 64 3b  and {.  u8 eCmd;
24190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241a0 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 41 52          /* An AR
241b0 5f 43 4d 44 5f 2a 20 76 61 6c 75 65 20 2a 2f 0a  _CMD_* value */.
241c0 20 20 75 38 20 62 56 65 72 62 6f 73 65 3b 20 20    u8 bVerbose;  
241d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
241e0 20 20 2f 2a 20 54 72 75 65 20 69 66 20 2d 2d 76    /* True if --v
241f0 65 72 62 6f 73 65 20 2a 2f 0a 20 20 75 38 20 62  erbose */.  u8 b
24200 5a 69 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Zip;            
24210 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
24220 72 75 65 20 69 66 20 74 68 65 20 61 72 63 68 69  rue if the archi
24230 76 65 20 69 73 20 61 20 5a 49 50 20 2a 2f 0a 20  ve is a ZIP */. 
24240 20 75 38 20 62 44 72 79 52 75 6e 3b 20 20 20 20   u8 bDryRun;    
24250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24260 20 2f 2a 20 54 72 75 65 20 69 66 20 2d 2d 64 72   /* True if --dr
24270 79 2d 72 75 6e 20 2a 2f 0a 20 20 75 38 20 62 41  y-run */.  u8 bA
24280 70 70 65 6e 64 3b 20 20 20 20 20 20 20 20 20 20  ppend;          
24290 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
242a0 75 65 20 69 66 20 2d 2d 61 70 70 65 6e 64 20 2a  ue if --append *
242b0 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 20 20  /.  int nArg;   
242c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
242d0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
242e0 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   command argumen
242f0 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53  ts */.  char *zS
24300 72 63 54 61 62 6c 65 3b 20 20 20 20 20 20 20 20  rcTable;        
24310 20 20 20 20 20 20 20 20 2f 2a 20 22 73 71 6c 61          /* "sqla
24320 72 22 2c 20 22 7a 69 70 66 69 6c 65 28 24 66 69  r", "zipfile($fi
24330 6c 65 29 22 20 6f 72 20 22 7a 69 70 22 20 2a 2f  le)" or "zip" */
24340 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
24350 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  File;           
24360 20 20 20 2f 2a 20 2d 2d 66 69 6c 65 20 61 72 67     /* --file arg
24370 75 6d 65 6e 74 2c 20 6f 72 20 4e 55 4c 4c 20 2a  ument, or NULL *
24380 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
24390 7a 44 69 72 3b 20 20 20 20 20 20 20 20 20 20 20  zDir;           
243a0 20 20 20 20 2f 2a 20 2d 2d 64 69 72 65 63 74 6f      /* --directo
243b0 72 79 20 61 72 67 75 6d 65 6e 74 2c 20 6f 72 20  ry argument, or 
243c0 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20 2a  NULL */.  char *
243d0 2a 61 7a 41 72 67 3b 20 20 20 20 20 20 20 20 20  *azArg;         
243e0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
243f0 61 79 20 6f 66 20 63 6f 6d 6d 61 6e 64 20 61 72  ay of command ar
24400 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 53 68 65  guments */.  She
24410 6c 6c 53 74 61 74 65 20 2a 70 3b 20 20 20 20 20  llState *p;     
24420 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24430 53 68 65 6c 6c 20 73 74 61 74 65 20 2a 2f 0a 20  Shell state */. 
24440 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
24450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24460 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e   /* Database con
24470 74 61 69 6e 69 6e 67 20 74 68 65 20 61 72 63 68  taining the arch
24480 69 76 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  ive */.};../*.**
24490 20 50 72 69 6e 74 20 61 20 75 73 61 67 65 20 6d   Print a usage m
244a0 65 73 73 61 67 65 20 66 6f 72 20 74 68 65 20 2e  essage for the .
244b0 61 72 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 73 74  ar command to st
244c0 64 65 72 72 20 61 6e 64 20 72 65 74 75 72 6e 20  derr and return 
244d0 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f  SQLITE_ERROR..*/
244e0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 55 73  .static int arUs
244f0 61 67 65 28 46 49 4c 45 20 2a 66 29 7b 0a 20 20  age(FILE *f){.  
24500 72 61 77 5f 70 72 69 6e 74 66 28 66 2c 0a 22 5c  raw_printf(f,."\
24510 6e 22 0a 22 55 73 61 67 65 3a 20 2e 61 72 20 5b  n"."Usage: .ar [
24520 4f 50 54 49 4f 4e 2e 2e 2e 5d 20 5b 46 49 4c 45  OPTION...] [FILE
24530 2e 2e 2e 5d 5c 6e 22 0a 22 54 68 65 20 2e 61 72  ...]\n"."The .ar
24540 20 63 6f 6d 6d 61 6e 64 20 6d 61 6e 61 67 65 73   command manages
24550 20 73 71 6c 61 72 20 61 72 63 68 69 76 65 73 2e   sqlar archives.
24560 5c 6e 22 0a 22 5c 6e 22 0a 22 45 78 61 6d 70 6c  \n"."\n"."Exampl
24570 65 73 3a 5c 6e 22 0a 22 20 20 2e 61 72 20 2d 63  es:\n"."  .ar -c
24580 66 20 61 72 63 68 69 76 65 2e 73 61 72 20 66 6f  f archive.sar fo
24590 6f 20 62 61 72 20 20 20 20 23 20 43 72 65 61 74  o bar    # Creat
245a0 65 20 61 72 63 68 69 76 65 2e 73 61 72 20 66 72  e archive.sar fr
245b0 6f 6d 20 66 69 6c 65 73 20 66 6f 6f 20 61 6e 64  om files foo and
245c0 20 62 61 72 5c 6e 22 0a 22 20 20 2e 61 72 20 2d   bar\n"."  .ar -
245d0 74 66 20 61 72 63 68 69 76 65 2e 73 61 72 20 20  tf archive.sar  
245e0 20 20 20 20 20 20 20 20 20 20 23 20 4c 69 73 74            # List
245f0 20 6d 65 6d 62 65 72 73 20 6f 66 20 61 72 63 68   members of arch
24600 69 76 65 2e 73 61 72 5c 6e 22 0a 22 20 20 2e 61  ive.sar\n"."  .a
24610 72 20 2d 78 76 66 20 61 72 63 68 69 76 65 2e 73  r -xvf archive.s
24620 61 72 20 20 20 20 20 20 20 20 20 20 20 23 20 56  ar           # V
24630 65 72 62 6f 73 65 6c 79 20 65 78 74 72 61 63 74  erbosely extract
24640 20 66 69 6c 65 73 20 66 72 6f 6d 20 61 72 63 68   files from arch
24650 69 76 65 2e 73 61 72 5c 6e 22 0a 22 5c 6e 22 0a  ive.sar\n"."\n".
24660 22 45 61 63 68 20 63 6f 6d 6d 61 6e 64 20 6c 69  "Each command li
24670 6e 65 20 6d 75 73 74 20 66 65 61 74 75 72 65 20  ne must feature 
24680 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 6f 6d 6d  exactly one comm
24690 61 6e 64 20 6f 70 74 69 6f 6e 3a 5c 6e 22 0a 22  and option:\n"."
246a0 20 20 2d 63 2c 20 2d 2d 63 72 65 61 74 65 20 20    -c, --create  
246b0 20 20 20 20 20 20 20 20 20 20 20 20 20 43 72 65               Cre
246c0 61 74 65 20 61 20 6e 65 77 20 61 72 63 68 69 76  ate a new archiv
246d0 65 5c 6e 22 0a 22 20 20 2d 75 2c 20 2d 2d 75 70  e\n"."  -u, --up
246e0 64 61 74 65 20 20 20 20 20 20 20 20 20 20 20 20  date            
246f0 20 20 20 55 70 64 61 74 65 20 6f 72 20 61 64 64     Update or add
24700 20 66 69 6c 65 73 20 74 6f 20 61 6e 20 65 78 69   files to an exi
24710 73 74 69 6e 67 20 61 72 63 68 69 76 65 5c 6e 22  sting archive\n"
24720 0a 22 20 20 2d 74 2c 20 2d 2d 6c 69 73 74 20 20  ."  -t, --list  
24730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c                 L
24740 69 73 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  ist contents of 
24750 61 72 63 68 69 76 65 5c 6e 22 0a 22 20 20 2d 78  archive\n"."  -x
24760 2c 20 2d 2d 65 78 74 72 61 63 74 20 20 20 20 20  , --extract     
24770 20 20 20 20 20 20 20 20 20 45 78 74 72 61 63 74           Extract
24780 20 66 69 6c 65 73 20 66 72 6f 6d 20 61 72 63 68   files from arch
24790 69 76 65 5c 6e 22 0a 22 5c 6e 22 0a 22 41 6e 64  ive\n"."\n"."And
247a0 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 6f 70   zero or more op
247b0 74 69 6f 6e 61 6c 20 6f 70 74 69 6f 6e 73 3a 5c  tional options:\
247c0 6e 22 0a 22 20 20 2d 76 2c 20 2d 2d 76 65 72 62  n"."  -v, --verb
247d0 6f 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ose             
247e0 20 50 72 69 6e 74 20 65 61 63 68 20 66 69 6c 65   Print each file
247f0 6e 61 6d 65 20 61 73 20 69 74 20 69 73 20 70 72  name as it is pr
24800 6f 63 65 73 73 65 64 5c 6e 22 0a 22 20 20 2d 66  ocessed\n"."  -f
24810 20 46 49 4c 45 2c 20 2d 2d 66 69 6c 65 20 46 49   FILE, --file FI
24820 4c 45 20 20 20 20 20 20 20 4f 70 65 72 61 74 65  LE       Operate
24830 20 6f 6e 20 61 72 63 68 69 76 65 20 46 49 4c 45   on archive FILE
24840 20 28 64 65 66 61 75 6c 74 20 69 73 20 63 75 72   (default is cur
24850 72 65 6e 74 20 64 62 29 5c 6e 22 0a 22 20 20 2d  rent db)\n"."  -
24860 61 20 46 49 4c 45 2c 20 2d 2d 61 70 70 65 6e 64  a FILE, --append
24870 20 46 49 4c 45 20 20 20 20 20 4f 70 65 72 61 74   FILE     Operat
24880 65 20 6f 6e 20 46 49 4c 45 20 6f 70 65 6e 65 64  e on FILE opened
24890 20 75 73 69 6e 67 20 74 68 65 20 61 70 6e 64 76   using the apndv
248a0 66 73 20 56 46 53 5c 6e 22 0a 22 20 20 2d 43 20  fs VFS\n"."  -C 
248b0 44 49 52 2c 20 2d 2d 64 69 72 65 63 74 6f 72 79  DIR, --directory
248c0 20 44 49 52 20 20 20 20 43 68 61 6e 67 65 20 74   DIR    Change t
248d0 6f 20 64 69 72 65 63 74 6f 72 79 20 44 49 52 20  o directory DIR 
248e0 74 6f 20 72 65 61 64 2f 65 78 74 72 61 63 74 20  to read/extract 
248f0 66 69 6c 65 73 5c 6e 22 0a 22 20 20 2d 6e 2c 20  files\n"."  -n, 
24900 2d 2d 64 72 79 72 75 6e 20 20 20 20 20 20 20 20  --dryrun        
24910 20 20 20 20 20 20 20 53 68 6f 77 20 74 68 65 20         Show the 
24920 53 51 4c 20 74 68 61 74 20 77 6f 75 6c 64 20 68  SQL that would h
24930 61 76 65 20 6f 63 63 75 72 72 65 64 5c 6e 22 0a  ave occurred\n".
24940 22 5c 6e 22 0a 22 53 65 65 20 61 6c 73 6f 3a 20  "\n"."See also: 
24950 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72  http://sqlite.or
24960 67 2f 63 6c 69 2e 68 74 6d 6c 23 73 71 6c 61 72  g/cli.html#sqlar
24970 5f 61 72 63 68 69 76 65 5f 73 75 70 70 6f 72 74  _archive_support
24980 5c 6e 22 0a 22 5c 6e 22 0a 29 3b 0a 20 20 72 65  \n"."\n".);.  re
24990 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f  turn SQLITE_ERRO
249a0 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  R;.}../*.** Prin
249b0 74 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  t an error messa
249c0 67 65 20 66 6f 72 20 74 68 65 20 2e 61 72 20 63  ge for the .ar c
249d0 6f 6d 6d 61 6e 64 20 74 6f 20 73 74 64 65 72 72  ommand to stderr
249e0 20 61 6e 64 20 72 65 74 75 72 6e 20 0a 2a 2a 20   and return .** 
249f0 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f  SQLITE_ERROR..*/
24a00 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 45 72  .static int arEr
24a10 72 6f 72 4d 73 67 28 63 6f 6e 73 74 20 63 68 61  rorMsg(const cha
24a20 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a 20  r *zFmt, ...){. 
24a30 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 63   va_list ap;.  c
24a40 68 61 72 20 2a 7a 3b 0a 20 20 76 61 5f 73 74 61  har *z;.  va_sta
24a50 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20 20  rt(ap, zFmt);.  
24a60 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72  z = sqlite3_vmpr
24a70 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a  intf(zFmt, ap);.
24a80 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20    va_end(ap);.  
24a90 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
24aa0 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 20 28 74  r, "Error: %s (t
24ab0 72 79 20 5c 22 2e 61 72 20 2d 2d 68 65 6c 70 5c  ry \".ar --help\
24ac0 22 29 5c 6e 22 2c 20 7a 29 3b 0a 20 20 73 71 6c  ")\n", z);.  sql
24ad0 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20  ite3_free(z);.  
24ae0 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
24af0 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56 61  ROR;.}../*.** Va
24b00 6c 75 65 73 20 66 6f 72 20 41 72 43 6f 6d 6d 61  lues for ArComma
24b10 6e 64 2e 65 43 6d 64 2e 0a 2a 2f 0a 23 64 65 66  nd.eCmd..*/.#def
24b20 69 6e 65 20 41 52 5f 43 4d 44 5f 43 52 45 41 54  ine AR_CMD_CREAT
24b30 45 20 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e  E       1.#defin
24b40 65 20 41 52 5f 43 4d 44 5f 45 58 54 52 41 43 54  e AR_CMD_EXTRACT
24b50 20 20 20 20 20 20 32 0a 23 64 65 66 69 6e 65 20        2.#define 
24b60 41 52 5f 43 4d 44 5f 4c 49 53 54 20 20 20 20 20  AR_CMD_LIST     
24b70 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 41 52      3.#define AR
24b80 5f 43 4d 44 5f 55 50 44 41 54 45 20 20 20 20 20  _CMD_UPDATE     
24b90 20 20 34 0a 23 64 65 66 69 6e 65 20 41 52 5f 43    4.#define AR_C
24ba0 4d 44 5f 48 45 4c 50 20 20 20 20 20 20 20 20 20  MD_HELP         
24bb0 35 0a 0a 2f 2a 0a 2a 2a 20 4f 74 68 65 72 20 28  5../*.** Other (
24bc0 6e 6f 6e 2d 63 6f 6d 6d 61 6e 64 29 20 73 77 69  non-command) swi
24bd0 74 63 68 65 73 2e 0a 2a 2f 0a 23 64 65 66 69 6e  tches..*/.#defin
24be0 65 20 41 52 5f 53 57 49 54 43 48 5f 56 45 52 42  e AR_SWITCH_VERB
24bf0 4f 53 45 20 20 20 20 20 36 0a 23 64 65 66 69 6e  OSE     6.#defin
24c00 65 20 41 52 5f 53 57 49 54 43 48 5f 46 49 4c 45  e AR_SWITCH_FILE
24c10 20 20 20 20 20 20 20 20 37 0a 23 64 65 66 69 6e          7.#defin
24c20 65 20 41 52 5f 53 57 49 54 43 48 5f 44 49 52 45  e AR_SWITCH_DIRE
24c30 43 54 4f 52 59 20 20 20 38 0a 23 64 65 66 69 6e  CTORY   8.#defin
24c40 65 20 41 52 5f 53 57 49 54 43 48 5f 41 50 50 45  e AR_SWITCH_APPE
24c50 4e 44 20 20 20 20 20 20 39 0a 23 64 65 66 69 6e  ND      9.#defin
24c60 65 20 41 52 5f 53 57 49 54 43 48 5f 44 52 59 52  e AR_SWITCH_DRYR
24c70 55 4e 20 20 20 20 20 31 30 0a 0a 73 74 61 74 69  UN     10..stati
24c80 63 20 69 6e 74 20 61 72 50 72 6f 63 65 73 73 53  c int arProcessS
24c90 77 69 74 63 68 28 41 72 43 6f 6d 6d 61 6e 64 20  witch(ArCommand 
24ca0 2a 70 41 72 2c 20 69 6e 74 20 65 53 77 69 74 63  *pAr, int eSwitc
24cb0 68 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  h, const char *z
24cc0 41 72 67 29 7b 0a 20 20 73 77 69 74 63 68 28 20  Arg){.  switch( 
24cd0 65 53 77 69 74 63 68 20 29 7b 0a 20 20 20 20 63  eSwitch ){.    c
24ce0 61 73 65 20 41 52 5f 43 4d 44 5f 43 52 45 41 54  ase AR_CMD_CREAT
24cf0 45 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43  E:.    case AR_C
24d00 4d 44 5f 45 58 54 52 41 43 54 3a 0a 20 20 20 20  MD_EXTRACT:.    
24d10 63 61 73 65 20 41 52 5f 43 4d 44 5f 4c 49 53 54  case AR_CMD_LIST
24d20 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d  :.    case AR_CM
24d30 44 5f 55 50 44 41 54 45 3a 0a 20 20 20 20 63 61  D_UPDATE:.    ca
24d40 73 65 20 41 52 5f 43 4d 44 5f 48 45 4c 50 3a 0a  se AR_CMD_HELP:.
24d50 20 20 20 20 20 20 69 66 28 20 70 41 72 2d 3e 65        if( pAr->e
24d60 43 6d 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72  Cmd ){.        r
24d70 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67  eturn arErrorMsg
24d80 28 22 6d 75 6c 74 69 70 6c 65 20 63 6f 6d 6d 61  ("multiple comma
24d90 6e 64 20 6f 70 74 69 6f 6e 73 22 29 3b 0a 20 20  nd options");.  
24da0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41 72 2d      }.      pAr-
24db0 3e 65 43 6d 64 20 3d 20 65 53 77 69 74 63 68 3b  >eCmd = eSwitch;
24dc0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20  .      break;.. 
24dd0 20 20 20 63 61 73 65 20 41 52 5f 53 57 49 54 43     case AR_SWITC
24de0 48 5f 44 52 59 52 55 4e 3a 0a 20 20 20 20 20 20  H_DRYRUN:.      
24df0 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 3d 20 31  pAr->bDryRun = 1
24e00 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
24e10 20 20 20 63 61 73 65 20 41 52 5f 53 57 49 54 43     case AR_SWITC
24e20 48 5f 56 45 52 42 4f 53 45 3a 0a 20 20 20 20 20  H_VERBOSE:.     
24e30 20 70 41 72 2d 3e 62 56 65 72 62 6f 73 65 20 3d   pAr->bVerbose =
24e40 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   1;.      break;
24e50 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53 57 49  .    case AR_SWI
24e60 54 43 48 5f 41 50 50 45 4e 44 3a 0a 20 20 20 20  TCH_APPEND:.    
24e70 20 20 70 41 72 2d 3e 62 41 70 70 65 6e 64 20 3d    pAr->bAppend =
24e80 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c   1;.      /* Fal
24e90 6c 20 74 68 72 75 20 69 6e 74 6f 20 2d 2d 66 69  l thru into --fi
24ea0 6c 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 41  le */.    case A
24eb0 52 5f 53 57 49 54 43 48 5f 46 49 4c 45 3a 0a 20  R_SWITCH_FILE:. 
24ec0 20 20 20 20 20 70 41 72 2d 3e 7a 46 69 6c 65 20       pAr->zFile 
24ed0 3d 20 7a 41 72 67 3b 0a 20 20 20 20 20 20 62 72  = zArg;.      br
24ee0 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 52  eak;.    case AR
24ef0 5f 53 57 49 54 43 48 5f 44 49 52 45 43 54 4f 52  _SWITCH_DIRECTOR
24f00 59 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 7a 44  Y:.      pAr->zD
24f10 69 72 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 20  ir = zArg;.     
24f20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72   break;.  }..  r
24f30 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
24f40 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20  .}../*.** Parse 
24f50 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  the command line
24f60 20 66 6f 72 20 61 6e 20 22 2e 61 72 22 20 63 6f   for an ".ar" co
24f70 6d 6d 61 6e 64 2e 20 54 68 65 20 72 65 73 75 6c  mmand. The resul
24f80 74 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 69  ts are written i
24f90 6e 74 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65  nto.** structure
24fa0 20 28 2a 70 41 72 29 2e 20 53 51 4c 49 54 45 5f   (*pAr). SQLITE_
24fb0 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69  OK is returned i
24fc0 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69  f the command li
24fd0 6e 65 20 69 73 20 70 61 72 73 65 64 0a 2a 2a 20  ne is parsed.** 
24fe0 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f 74  successfully, ot
24ff0 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72  herwise an error
25000 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74   message is writ
25010 74 65 6e 20 74 6f 20 73 74 64 65 72 72 20 61 6e  ten to stderr an
25020 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52  d .** SQLITE_ERR
25030 4f 52 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a  OR returned..*/.
25040 73 74 61 74 69 63 20 69 6e 74 20 61 72 50 61 72  static int arPar
25050 73 65 43 6f 6d 6d 61 6e 64 28 0a 20 20 63 68 61  seCommand(.  cha
25060 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20 20  r **azArg,      
25070 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25080 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e  Array of argumen
25090 74 73 20 70 61 73 73 65 64 20 74 6f 20 64 6f 74  ts passed to dot
250a0 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
250b0 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20  t nArg,         
250c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
250d0 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
250e0 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f  es in azArg[] */
250f0 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41  .  ArCommand *pA
25100 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r               
25110 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74     /* Populate t
25120 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b  his object */.){
25130 0a 20 20 73 74 72 75 63 74 20 41 72 53 77 69 74  .  struct ArSwit
25140 63 68 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ch {.    const c
25150 68 61 72 20 2a 7a 4c 6f 6e 67 3b 0a 20 20 20 20  har *zLong;.    
25160 63 68 61 72 20 63 53 68 6f 72 74 3b 0a 20 20 20  char cShort;.   
25170 20 75 38 20 65 53 77 69 74 63 68 3b 0a 20 20 20   u8 eSwitch;.   
25180 20 75 38 20 62 41 72 67 3b 0a 20 20 7d 20 61 53   u8 bArg;.  } aS
25190 77 69 74 63 68 5b 5d 20 3d 20 7b 0a 20 20 20 20  witch[] = {.    
251a0 7b 20 22 63 72 65 61 74 65 22 2c 20 20 20 20 27  { "create",    '
251b0 63 27 2c 20 41 52 5f 43 4d 44 5f 43 52 45 41 54  c', AR_CMD_CREAT
251c0 45 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 20 20  E,       0 },.  
251d0 20 20 7b 20 22 65 78 74 72 61 63 74 22 2c 20 20    { "extract",  
251e0 20 27 78 27 2c 20 41 52 5f 43 4d 44 5f 45 58 54   'x', AR_CMD_EXT
251f0 52 41 43 54 2c 20 20 20 20 20 20 30 20 7d 2c 0a  RACT,      0 },.
25200 20 20 20 20 7b 20 22 6c 69 73 74 22 2c 20 20 20      { "list",   
25210 20 20 20 27 74 27 2c 20 41 52 5f 43 4d 44 5f 4c     't', AR_CMD_L
25220 49 53 54 2c 20 20 20 20 20 20 20 20 20 30 20 7d  IST,         0 }
25230 2c 0a 20 20 20 20 7b 20 22 75 70 64 61 74 65 22  ,.    { "update"
25240 2c 20 20 20 20 27 75 27 2c 20 41 52 5f 43 4d 44  ,    'u', AR_CMD
25250 5f 55 50 44 41 54 45 2c 20 20 20 20 20 20 20 30  _UPDATE,       0
25260 20 7d 2c 0a 20 20 20 20 7b 20 22 68 65 6c 70 22   },.    { "help"
25270 2c 20 20 20 20 20 20 27 68 27 2c 20 41 52 5f 43  ,      'h', AR_C
25280 4d 44 5f 48 45 4c 50 2c 20 20 20 20 20 20 20 20  MD_HELP,        
25290 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 76 65 72   0 },.    { "ver
252a0 62 6f 73 65 22 2c 20 20 20 27 76 27 2c 20 41 52  bose",   'v', AR
252b0 5f 53 57 49 54 43 48 5f 56 45 52 42 4f 53 45 2c  _SWITCH_VERBOSE,
252c0 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 66     0 },.    { "f
252d0 69 6c 65 22 2c 20 20 20 20 20 20 27 66 27 2c 20  ile",      'f', 
252e0 41 52 5f 53 57 49 54 43 48 5f 46 49 4c 45 2c 20  AR_SWITCH_FILE, 
252f0 20 20 20 20 20 31 20 7d 2c 0a 20 20 20 20 7b 20       1 },.    { 
25300 22 61 70 70 65 6e 64 22 2c 20 20 20 20 27 61 27  "append",    'a'
25310 2c 20 41 52 5f 53 57 49 54 43 48 5f 41 50 50 45  , AR_SWITCH_APPE
25320 4e 44 2c 20 20 20 20 31 20 7d 2c 0a 20 20 20 20  ND,    1 },.    
25330 7b 20 22 64 69 72 65 63 74 6f 72 79 22 2c 20 27  { "directory", '
25340 43 27 2c 20 41 52 5f 53 57 49 54 43 48 5f 44 49  C', AR_SWITCH_DI
25350 52 45 43 54 4f 52 59 2c 20 31 20 7d 2c 0a 20 20  RECTORY, 1 },.  
25360 20 20 7b 20 22 64 72 79 72 75 6e 22 2c 20 20 20    { "dryrun",   
25370 20 27 6e 27 2c 20 41 52 5f 53 57 49 54 43 48 5f   'n', AR_SWITCH_
25380 44 52 59 52 55 4e 2c 20 20 20 20 30 20 7d 2c 0a  DRYRUN,    0 },.
25390 20 20 7d 3b 0a 20 20 69 6e 74 20 6e 53 77 69 74    };.  int nSwit
253a0 63 68 20 3d 20 73 69 7a 65 6f 66 28 61 53 77 69  ch = sizeof(aSwi
253b0 74 63 68 29 20 2f 20 73 69 7a 65 6f 66 28 73 74  tch) / sizeof(st
253c0 72 75 63 74 20 41 72 53 77 69 74 63 68 29 3b 0a  ruct ArSwitch);.
253d0 20 20 73 74 72 75 63 74 20 41 72 53 77 69 74 63    struct ArSwitc
253e0 68 20 2a 70 45 6e 64 20 3d 20 26 61 53 77 69 74  h *pEnd = &aSwit
253f0 63 68 5b 6e 53 77 69 74 63 68 5d 3b 0a 0a 20 20  ch[nSwitch];..  
25400 69 66 28 20 6e 41 72 67 3c 3d 31 20 29 7b 0a 20  if( nArg<=1 ){. 
25410 20 20 20 72 65 74 75 72 6e 20 61 72 55 73 61 67     return arUsag
25420 65 28 73 74 64 65 72 72 29 3b 0a 20 20 7d 65 6c  e(stderr);.  }el
25430 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20  se{.    char *z 
25440 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20  = azArg[1];.    
25450 6d 65 6d 73 65 74 28 70 41 72 2c 20 30 2c 20 73  memset(pAr, 0, s
25460 69 7a 65 6f 66 28 41 72 43 6f 6d 6d 61 6e 64 29  izeof(ArCommand)
25470 29 3b 0a 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d  );..    if( z[0]
25480 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 2f  !='-' ){.      /
25490 2a 20 54 72 61 64 69 74 69 6f 6e 61 6c 20 73 74  * Traditional st
254a0 79 6c 65 20 5b 74 61 72 5d 20 69 6e 76 6f 63 61  yle [tar] invoca
254b0 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tion */.      in
254c0 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  t i;.      int i
254d0 41 72 67 20 3d 20 32 3b 0a 20 20 20 20 20 20 66  Arg = 2;.      f
254e0 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b  or(i=0; z[i]; i+
254f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  +){.        cons
25500 74 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 30  t char *zArg = 0
25510 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  ;.        struct
25520 20 41 72 53 77 69 74 63 68 20 2a 70 4f 70 74 3b   ArSwitch *pOpt;
25530 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 4f 70  .        for(pOp
25540 74 3d 26 61 53 77 69 74 63 68 5b 30 5d 3b 20 70  t=&aSwitch[0]; p
25550 4f 70 74 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b  Opt<pEnd; pOpt++
25560 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
25570 20 7a 5b 69 5d 3d 3d 70 4f 70 74 2d 3e 63 53 68   z[i]==pOpt->cSh
25580 6f 72 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ort ) break;.   
25590 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
255a0 66 28 20 70 4f 70 74 3d 3d 70 45 6e 64 20 29 7b  f( pOpt==pEnd ){
255b0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
255c0 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 22 75 6e  n arErrorMsg("un
255d0 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74 69 6f  recognized optio
255e0 6e 3a 20 25 63 22 2c 20 7a 5b 69 5d 29 3b 0a 20  n: %c", z[i]);. 
255f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25600 20 69 66 28 20 70 4f 70 74 2d 3e 62 41 72 67 20   if( pOpt->bArg 
25610 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
25620 20 69 41 72 67 3e 3d 6e 41 72 67 20 29 7b 0a 20   iArg>=nArg ){. 
25630 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
25640 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 22 6f 70  n arErrorMsg("op
25650 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e  tion requires an
25660 20 61 72 67 75 6d 65 6e 74 3a 20 25 63 22 2c 7a   argument: %c",z
25670 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
25680 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 41 72 67  }.          zArg
25690 20 3d 20 61 7a 41 72 67 5b 69 41 72 67 2b 2b 5d   = azArg[iArg++]
256a0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
256b0 20 20 20 20 69 66 28 20 61 72 50 72 6f 63 65 73      if( arProces
256c0 73 53 77 69 74 63 68 28 70 41 72 2c 20 70 4f 70  sSwitch(pAr, pOp
256d0 74 2d 3e 65 53 77 69 74 63 68 2c 20 7a 41 72 67  t->eSwitch, zArg
256e0 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
256f0 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
25700 0a 20 20 20 20 20 20 70 41 72 2d 3e 6e 41 72 67  .      pAr->nArg
25710 20 3d 20 6e 41 72 67 2d 69 41 72 67 3b 0a 20 20   = nArg-iArg;.  
25720 20 20 20 20 69 66 28 20 70 41 72 2d 3e 6e 41 72      if( pAr->nAr
25730 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  g>0 ){.        p
25740 41 72 2d 3e 61 7a 41 72 67 20 3d 20 26 61 7a 41  Ar->azArg = &azA
25750 72 67 5b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20  rg[iArg];.      
25760 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
25770 20 20 20 2f 2a 20 4e 6f 6e 2d 74 72 61 64 69 74     /* Non-tradit
25780 69 6f 6e 61 6c 20 69 6e 76 6f 63 61 74 69 6f 6e  ional invocation
25790 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 41   */.      int iA
257a0 72 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 41  rg;.      for(iA
257b0 72 67 3d 31 3b 20 69 41 72 67 3c 6e 41 72 67 3b  rg=1; iArg<nArg;
257c0 20 69 41 72 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iArg++){.      
257d0 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20    int n;.       
257e0 20 7a 20 3d 20 61 7a 41 72 67 5b 69 41 72 67 5d   z = azArg[iArg]
257f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  ;.        if( z[
25800 30 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  0]!='-' ){.     
25810 20 20 20 20 20 2f 2a 20 41 6c 6c 20 72 65 6d 61       /* All rema
25820 69 6e 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 6c 69  ining command li
25830 6e 65 20 77 6f 72 64 73 20 61 72 65 20 63 6f 6d  ne words are com
25840 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 2e 20  mand arguments. 
25850 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 41 72  */.          pAr
25860 2d 3e 61 7a 41 72 67 20 3d 20 26 61 7a 41 72 67  ->azArg = &azArg
25870 5b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20 20  [iArg];.        
25880 20 20 70 41 72 2d 3e 6e 41 72 67 20 3d 20 6e 41    pAr->nArg = nA
25890 72 67 2d 69 41 72 67 3b 0a 20 20 20 20 20 20 20  rg-iArg;.       
258a0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
258b0 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 20 3d 20    }.        n = 
258c0 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 0a 20 20  strlen30(z);..  
258d0 20 20 20 20 20 20 69 66 28 20 7a 5b 31 5d 21 3d        if( z[1]!=
258e0 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  '-' ){.         
258f0 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
25900 20 20 2f 2a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65    /* One or more
25910 20 73 68 6f 72 74 20 6f 70 74 69 6f 6e 73 20 2a   short options *
25920 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  /.          for(
25930 69 3d 31 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=1; i<n; i++){.
25940 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
25950 74 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 30  t char *zArg = 0
25960 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  ;.            st
25970 72 75 63 74 20 41 72 53 77 69 74 63 68 20 2a 70  ruct ArSwitch *p
25980 4f 70 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Opt;.           
25990 20 66 6f 72 28 70 4f 70 74 3d 26 61 53 77 69 74   for(pOpt=&aSwit
259a0 63 68 5b 30 5d 3b 20 70 4f 70 74 3c 70 45 6e 64  ch[0]; pOpt<pEnd
259b0 3b 20 70 4f 70 74 2b 2b 29 7b 0a 20 20 20 20 20  ; pOpt++){.     
259c0 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69           if( z[i
259d0 5d 3d 3d 70 4f 70 74 2d 3e 63 53 68 6f 72 74 20  ]==pOpt->cShort 
259e0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
259f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
25a00 20 20 20 69 66 28 20 70 4f 70 74 3d 3d 70 45 6e     if( pOpt==pEn
25a10 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d ){.           
25a20 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f     return arErro
25a30 72 4d 73 67 28 22 75 6e 72 65 63 6f 67 6e 69 7a  rMsg("unrecogniz
25a40 65 64 20 6f 70 74 69 6f 6e 3a 20 25 63 5c 6e 22  ed option: %c\n"
25a50 2c 20 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  , z[i]);.       
25a60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
25a70 20 20 20 69 66 28 20 70 4f 70 74 2d 3e 62 41 72     if( pOpt->bAr
25a80 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  g ){.           
25a90 20 20 20 69 66 28 20 69 3c 28 6e 2d 31 29 20 29     if( i<(n-1) )
25aa0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
25ab0 20 20 7a 41 72 67 20 3d 20 26 7a 5b 69 2b 31 5d    zArg = &z[i+1]
25ac0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
25ad0 20 20 69 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20    i = n;.       
25ae0 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
25af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
25b00 28 20 69 41 72 67 3e 3d 28 6e 41 72 67 2d 31 29  ( iArg>=(nArg-1)
25b10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
25b20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72 45        return arE
25b30 72 72 6f 72 4d 73 67 28 22 6f 70 74 69 6f 6e 20  rrorMsg("option 
25b40 72 65 71 75 69 72 65 73 20 61 6e 20 61 72 67 75  requires an argu
25b50 6d 65 6e 74 3a 20 25 63 5c 6e 22 2c 7a 5b 69 5d  ment: %c\n",z[i]
25b60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
25b70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
25b80 20 20 20 20 20 7a 41 72 67 20 3d 20 61 7a 41 72       zArg = azAr
25b90 67 5b 2b 2b 69 41 72 67 5d 3b 0a 20 20 20 20 20  g[++iArg];.     
25ba0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
25bb0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
25bc0 20 20 20 20 20 69 66 28 20 61 72 50 72 6f 63 65       if( arProce
25bd0 73 73 53 77 69 74 63 68 28 70 41 72 2c 20 70 4f  ssSwitch(pAr, pO
25be0 70 74 2d 3e 65 53 77 69 74 63 68 2c 20 7a 41 72  pt->eSwitch, zAr
25bf0 67 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  g) ) return SQLI
25c00 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
25c10 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
25c20 6c 73 65 20 69 66 28 20 7a 5b 32 5d 3d 3d 27 5c  lse if( z[2]=='\
25c30 30 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0' ){.          
25c40 2f 2a 20 41 20 2d 2d 20 6f 70 74 69 6f 6e 2c 20  /* A -- option, 
25c50 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74 20  indicating that 
25c60 61 6c 6c 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f  all remaining co
25c70 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 6f 72 64 73  mmand line words
25c80 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 72  .          ** ar
25c90 65 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  e command argume
25ca0 6e 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  nts.  */.       
25cb0 20 20 20 70 41 72 2d 3e 61 7a 41 72 67 20 3d 20     pAr->azArg = 
25cc0 26 61 7a 41 72 67 5b 69 41 72 67 2b 31 5d 3b 0a  &azArg[iArg+1];.
25cd0 20 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e 6e            pAr->n
25ce0 41 72 67 20 3d 20 6e 41 72 67 2d 69 41 72 67 2d  Arg = nArg-iArg-
25cf0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
25d00 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ak;.        }els
25d10 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e{.          /* 
25d20 41 20 6c 6f 6e 67 20 6f 70 74 69 6f 6e 20 2a 2f  A long option */
25d30 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74  .          const
25d40 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 30 3b   char *zArg = 0;
25d50 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25d60 41 72 67 75 6d 65 6e 74 20 66 6f 72 20 6f 70 74  Argument for opt
25d70 69 6f 6e 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20  ion, if any */. 
25d80 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
25d90 41 72 53 77 69 74 63 68 20 2a 70 4d 61 74 63 68  ArSwitch *pMatch
25da0 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4d 61   = 0;      /* Ma
25db0 74 63 68 69 6e 67 20 6f 70 74 69 6f 6e 20 2a 2f  tching option */
25dc0 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63  .          struc
25dd0 74 20 41 72 53 77 69 74 63 68 20 2a 70 4f 70 74  t ArSwitch *pOpt
25de0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
25df0 49 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20  Iterator */.    
25e00 20 20 20 20 20 20 66 6f 72 28 70 4f 70 74 3d 26        for(pOpt=&
25e10 61 53 77 69 74 63 68 5b 30 5d 3b 20 70 4f 70 74  aSwitch[0]; pOpt
25e20 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b 0a  <pEnd; pOpt++){.
25e30 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
25e40 74 20 63 68 61 72 20 2a 7a 4c 6f 6e 67 20 3d 20  t char *zLong = 
25e50 70 4f 70 74 2d 3e 7a 4c 6f 6e 67 3b 0a 20 20 20  pOpt->zLong;.   
25e60 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6e 2d           if( (n-
25e70 32 29 3c 3d 73 74 72 6c 65 6e 33 30 28 7a 4c 6f  2)<=strlen30(zLo
25e80 6e 67 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d 70  ng) && 0==memcmp
25e90 28 26 7a 5b 32 5d 2c 20 7a 4c 6f 6e 67 2c 20 6e  (&z[2], zLong, n
25ea0 2d 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -2) ){.         
25eb0 20 20 20 20 20 69 66 28 20 70 4d 61 74 63 68 20       if( pMatch 
25ec0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
25ed0 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f     return arErro
25ee0 72 4d 73 67 28 22 61 6d 62 69 67 75 6f 75 73 20  rMsg("ambiguous 
25ef0 6f 70 74 69 6f 6e 3a 20 25 73 22 2c 7a 29 3b 0a  option: %s",z);.
25f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65                }e
25f10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
25f20 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70 4f       pMatch = pO
25f30 70 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  pt;.            
25f40 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
25f50 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  }.          }.. 
25f60 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4d 61           if( pMa
25f70 74 63 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  tch==0 ){.      
25f80 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72 45        return arE
25f90 72 72 6f 72 4d 73 67 28 22 75 6e 72 65 63 6f 67  rrorMsg("unrecog
25fa0 6e 69 7a 65 64 20 6f 70 74 69 6f 6e 3a 20 25 73  nized option: %s
25fb0 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20  ", z);.         
25fc0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
25fd0 20 70 4d 61 74 63 68 2d 3e 62 41 72 67 20 29 7b   pMatch->bArg ){
25fe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
25ff0 20 69 41 72 67 3e 3d 28 6e 41 72 67 2d 31 29 20   iArg>=(nArg-1) 
26000 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
26010 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d   return arErrorM
26020 73 67 28 22 6f 70 74 69 6f 6e 20 72 65 71 75 69  sg("option requi
26030 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a  res an argument:
26040 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20   %s", z);.      
26050 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
26060 20 20 20 20 7a 41 72 67 20 3d 20 61 7a 41 72 67      zArg = azArg
26070 5b 2b 2b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20  [++iArg];.      
26080 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
26090 69 66 28 20 61 72 50 72 6f 63 65 73 73 53 77 69  if( arProcessSwi
260a0 74 63 68 28 70 41 72 2c 20 70 4d 61 74 63 68 2d  tch(pAr, pMatch-
260b0 3e 65 53 77 69 74 63 68 2c 20 7a 41 72 67 29 20  >eSwitch, zArg) 
260c0 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f  ) return SQLITE_
260d0 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d  ERROR;.        }
260e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
260f0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c   }..  return SQL
26100 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ITE_OK;.}../*.**
26110 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 61   This function a
26120 73 73 75 6d 65 73 20 74 68 61 74 20 61 6c 6c 20  ssumes that all 
26130 61 72 67 75 6d 65 6e 74 73 20 77 69 74 68 69 6e  arguments within
26140 20 74 68 65 20 41 72 43 6f 6d 6d 61 6e 64 2e 61   the ArCommand.a
26150 7a 41 72 67 5b 5d 0a 2a 2a 20 61 72 72 61 79 20  zArg[].** array 
26160 72 65 66 65 72 20 74 6f 20 61 72 63 68 69 76 65  refer to archive
26170 20 6d 65 6d 62 65 72 73 2c 20 61 73 20 66 6f 72   members, as for
26180 20 74 68 65 20 2d 2d 65 78 74 72 61 63 74 20 6f   the --extract o
26190 72 20 2d 2d 6c 69 73 74 20 63 6f 6d 6d 61 6e 64  r --list command
261a0 73 2e 20 0a 2a 2a 20 49 74 20 63 68 65 63 6b 73  s. .** It checks
261b0 20 74 68 61 74 20 65 61 63 68 20 6f 66 20 74 68   that each of th
261c0 65 6d 20 61 72 65 20 70 72 65 73 65 6e 74 2e 20  em are present. 
261d0 49 66 20 61 6e 79 20 73 70 65 63 69 66 69 65 64  If any specified
261e0 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a 20   file is not.** 
261f0 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20 61  present in the a
26200 72 63 68 69 76 65 2c 20 61 6e 20 65 72 72 6f 72  rchive, an error
26210 20 69 73 20 70 72 69 6e 74 65 64 20 74 6f 20 73   is printed to s
26220 74 64 65 72 72 20 61 6e 64 20 61 6e 20 65 72 72  tderr and an err
26230 6f 72 0a 2a 2a 20 63 6f 64 65 20 72 65 74 75 72  or.** code retur
26240 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
26250 69 66 20 61 6c 6c 20 73 70 65 63 69 66 69 65 64  if all specified
26260 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 70   arguments are p
26270 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68 65  resent in.** the
26280 20 61 72 63 68 69 76 65 2c 20 53 51 4c 49 54 45   archive, SQLITE
26290 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
262a0 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  .**.** This func
262b0 74 69 6f 6e 20 73 74 72 69 70 73 20 61 6e 79 20  tion strips any 
262c0 74 72 61 69 6c 69 6e 67 20 27 2f 27 20 63 68 61  trailing '/' cha
262d0 72 61 63 74 65 72 73 20 66 72 6f 6d 20 65 61 63  racters from eac
262e0 68 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20 54  h argument..** T
262f0 68 69 73 20 69 73 20 63 6f 6e 73 69 73 74 65 6e  his is consisten
26300 74 20 77 69 74 68 20 74 68 65 20 77 61 79 20 74  t with the way t
26310 68 65 20 5b 74 61 72 5d 20 63 6f 6d 6d 61 6e 64  he [tar] command
26320 20 73 65 65 6d 73 20 74 6f 20 77 6f 72 6b 20 6f   seems to work o
26330 6e 0a 2a 2a 20 4c 69 6e 75 78 2e 0a 2a 2f 0a 73  n.** Linux..*/.s
26340 74 61 74 69 63 20 69 6e 74 20 61 72 43 68 65 63  tatic int arChec
26350 6b 45 6e 74 72 69 65 73 28 41 72 43 6f 6d 6d 61  kEntries(ArComma
26360 6e 64 20 2a 70 41 72 29 7b 0a 20 20 69 6e 74 20  nd *pAr){.  int 
26370 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
26380 20 20 69 66 28 20 70 41 72 2d 3e 6e 41 72 67 20    if( pAr->nArg 
26390 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  ){.    int i, j;
263a0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
263b0 74 20 2a 70 54 65 73 74 20 3d 20 30 3b 0a 0a 20  t *pTest = 0;.. 
263c0 20 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50     shellPrepareP
263d0 72 69 6e 74 66 28 70 41 72 2d 3e 64 62 2c 20 26  rintf(pAr->db, &
263e0 72 63 2c 20 26 70 54 65 73 74 2c 0a 20 20 20 20  rc, &pTest,.    
263f0 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65      "SELECT name
26400 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20 6e   FROM %s WHERE n
26410 61 6d 65 3d 24 6e 61 6d 65 22 2c 20 0a 20 20 20  ame=$name", .   
26420 20 20 20 20 20 70 41 72 2d 3e 7a 53 72 63 54 61       pAr->zSrcTa
26430 62 6c 65 0a 20 20 20 20 29 3b 0a 20 20 20 20 6a  ble.    );.    j
26440 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f   = sqlite3_bind_
26450 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78 28  parameter_index(
26460 70 54 65 73 74 2c 20 22 24 6e 61 6d 65 22 29 3b  pTest, "$name");
26470 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
26480 70 41 72 2d 3e 6e 41 72 67 20 26 26 20 72 63 3d  pAr->nArg && rc=
26490 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29  =SQLITE_OK; i++)
264a0 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20  {.      char *z 
264b0 3d 20 70 41 72 2d 3e 61 7a 41 72 67 5b 69 5d 3b  = pAr->azArg[i];
264c0 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
264d0 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20  trlen30(z);.    
264e0 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3b 0a 20    int bOk = 0;. 
264f0 20 20 20 20 20 77 68 69 6c 65 28 20 6e 3e 30 20       while( n>0 
26500 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29  && z[n-1]=='/' )
26510 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d   n--;.      z[n]
26520 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 73   = '\0';.      s
26530 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
26540 28 70 54 65 73 74 2c 20 6a 2c 20 7a 2c 20 2d 31  (pTest, j, z, -1
26550 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
26560 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ;.      if( SQLI
26570 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
26580 73 74 65 70 28 70 54 65 73 74 29 20 29 7b 0a 20  step(pTest) ){. 
26590 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b 0a         bOk = 1;.
265a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 68        }.      sh
265b0 65 6c 6c 52 65 73 65 74 28 26 72 63 2c 20 70 54  ellReset(&rc, pT
265c0 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  est);.      if( 
265d0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
265e0 20 62 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20   bOk==0 ){.     
265f0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
26600 74 64 65 72 72 2c 20 22 6e 6f 74 20 66 6f 75 6e  tderr, "not foun
26610 64 20 69 6e 20 61 72 63 68 69 76 65 3a 20 25 73  d in archive: %s
26620 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20  \n", z);.       
26630 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
26640 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  OR;.      }.    
26650 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c  }.    shellFinal
26660 69 7a 65 28 26 72 63 2c 20 70 54 65 73 74 29 3b  ize(&rc, pTest);
26670 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
26680 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 6d 61  ;.}../*.** Forma
26690 74 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  t a WHERE clause
266a0 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
266b0 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 22 73  d against the "s
266c0 71 6c 61 72 22 20 74 61 62 6c 65 20 74 6f 0a 2a  qlar" table to.*
266d0 2a 20 69 64 65 6e 74 69 66 79 20 61 6c 6c 20 61  * identify all a
266e0 72 63 68 69 76 65 20 6d 65 6d 62 65 72 73 20 74  rchive members t
266f0 68 61 74 20 6d 61 74 63 68 20 74 68 65 20 63 6f  hat match the co
26700 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
26710 68 65 6c 64 0a 2a 2a 20 69 6e 20 28 2a 70 41 72  held.** in (*pAr
26720 29 2e 20 4c 65 61 76 65 20 74 68 69 73 20 57 48  ). Leave this WH
26730 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 28 2a  ERE clause in (*
26740 70 7a 57 68 65 72 65 29 20 62 65 66 6f 72 65 20  pzWhere) before 
26750 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 54 68  returning..** Th
26760 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
26770 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 76 65 6e  onsible for even
26780 74 75 61 6c 6c 79 20 63 61 6c 6c 69 6e 67 20 73  tually calling s
26790 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 6f 6e  qlite3_free() on
267a0 0a 2a 2a 20 61 6e 79 20 6e 6f 6e 2d 4e 55 4c 4c  .** any non-NULL
267b0 20 28 2a 70 7a 57 68 65 72 65 29 20 76 61 6c 75   (*pzWhere) valu
267c0 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
267d0 64 20 61 72 57 68 65 72 65 43 6c 61 75 73 65 28  d arWhereClause(
267e0 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20  .  int *pRc, .  
267f0 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20  ArCommand *pAr, 
26800 0a 20 20 63 68 61 72 20 2a 2a 70 7a 57 68 65 72  .  char **pzWher
26810 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
26820 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 57     /* OUT: New W
26830 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 29  HERE clause */.)
26840 7b 0a 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65  {.  char *zWhere
26850 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63   = 0;.  if( *pRc
26860 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
26870 20 20 20 69 66 28 20 70 41 72 2d 3e 6e 41 72 67     if( pAr->nArg
26880 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 57 68  ==0 ){.      zWh
26890 65 72 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ere = sqlite3_mp
268a0 72 69 6e 74 66 28 22 31 22 29 3b 0a 20 20 20 20  rintf("1");.    
268b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
268c0 20 69 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   i;.      const 
268d0 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b  char *zSep = "";
268e0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
268f0 69 3c 70 41 72 2d 3e 6e 41 72 67 3b 20 69 2b 2b  i<pAr->nArg; i++
26900 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
26910 20 63 68 61 72 20 2a 7a 20 3d 20 70 41 72 2d 3e   char *z = pAr->
26920 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20  azArg[i];.      
26930 20 20 7a 57 68 65 72 65 20 3d 20 73 71 6c 69 74    zWhere = sqlit
26940 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
26950 20 20 20 20 20 20 22 25 7a 25 73 20 6e 61 6d 65        "%z%s name
26960 20 3d 20 27 25 71 27 20 4f 52 20 73 75 62 73 74   = '%q' OR subst
26970 72 28 6e 61 6d 65 2c 31 2c 25 64 29 20 3d 20 27  r(name,1,%d) = '
26980 25 71 2f 27 22 2c 20 0a 20 20 20 20 20 20 20 20  %q/'", .        
26990 20 20 7a 57 68 65 72 65 2c 20 7a 53 65 70 2c 20    zWhere, zSep, 
269a0 7a 2c 20 73 74 72 6c 65 6e 33 30 28 7a 29 2b 31  z, strlen30(z)+1
269b0 2c 20 7a 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  , z.        );. 
269c0 20 20 20 20 20 20 20 69 66 28 20 7a 57 68 65 72         if( zWher
269d0 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
269e0 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f    *pRc = SQLITE_
269f0 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20  NOMEM;.         
26a00 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
26a10 7d 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d  }.        zSep =
26a20 20 22 20 4f 52 20 22 3b 0a 20 20 20 20 20 20 7d   " OR ";.      }
26a30 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a  .    }.  }.  *pz
26a40 57 68 65 72 65 20 3d 20 7a 57 68 65 72 65 3b 0a  Where = zWhere;.
26a50 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
26a60 6e 74 61 74 69 6f 6e 20 6f 66 20 2e 61 72 20 22  ntation of .ar "
26a70 6c 69 73 54 22 20 63 6f 6d 6d 61 6e 64 2e 20 0a  lisT" command. .
26a80 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72  */.static int ar
26a90 4c 69 73 74 43 6f 6d 6d 61 6e 64 28 41 72 43 6f  ListCommand(ArCo
26aa0 6d 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20 63  mmand *pAr){.  c
26ab0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20  onst char *zSql 
26ac0 3d 20 22 53 45 4c 45 43 54 20 25 73 20 46 52 4f  = "SELECT %s FRO
26ad0 4d 20 25 73 20 57 48 45 52 45 20 25 73 22 3b 20  M %s WHERE %s"; 
26ae0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  .  const char *a
26af0 7a 43 6f 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20 20  zCols[] = {.    
26b00 22 6e 61 6d 65 22 2c 0a 20 20 20 20 22 6c 73 6d  "name",.    "lsm
26b10 6f 64 65 28 6d 6f 64 65 29 2c 20 73 7a 2c 20 64  ode(mode), sz, d
26b20 61 74 65 74 69 6d 65 28 6d 74 69 6d 65 2c 20 27  atetime(mtime, '
26b30 75 6e 69 78 65 70 6f 63 68 27 29 2c 20 6e 61 6d  unixepoch'), nam
26b40 65 22 0a 20 20 7d 3b 0a 0a 20 20 63 68 61 72 20  e".  };..  char 
26b50 2a 7a 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 73  *zWhere = 0;.  s
26b60 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 71  qlite3_stmt *pSq
26b70 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b  l = 0;.  int rc;
26b80 0a 0a 20 20 72 63 20 3d 20 61 72 43 68 65 63 6b  ..  rc = arCheck
26b90 45 6e 74 72 69 65 73 28 70 41 72 29 3b 0a 20 20  Entries(pAr);.  
26ba0 61 72 57 68 65 72 65 43 6c 61 75 73 65 28 26 72  arWhereClause(&r
26bb0 63 2c 20 70 41 72 2c 20 26 7a 57 68 65 72 65 29  c, pAr, &zWhere)
26bc0 3b 0a 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72  ;..  shellPrepar
26bd0 65 50 72 69 6e 74 66 28 70 41 72 2d 3e 64 62 2c  ePrintf(pAr->db,
26be0 20 26 72 63 2c 20 26 70 53 71 6c 2c 20 7a 53 71   &rc, &pSql, zSq
26bf0 6c 2c 20 61 7a 43 6f 6c 73 5b 70 41 72 2d 3e 62  l, azCols[pAr->b
26c00 56 65 72 62 6f 73 65 5d 2c 0a 20 20 20 20 20 20  Verbose],.      
26c10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
26c20 41 72 2d 3e 7a 53 72 63 54 61 62 6c 65 2c 20 7a  Ar->zSrcTable, z
26c30 57 68 65 72 65 29 3b 0a 20 20 69 66 28 20 70 41  Where);.  if( pA
26c40 72 2d 3e 62 44 72 79 52 75 6e 20 29 7b 0a 20 20  r->bDryRun ){.  
26c50 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41    utf8_printf(pA
26c60 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  r->p->out, "%s\n
26c70 22 2c 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70  ", sqlite3_sql(p
26c80 53 71 6c 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Sql));.  }else{.
26c90 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
26ca0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
26cb0 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
26cc0 73 74 65 70 28 70 53 71 6c 29 20 29 7b 0a 20 20  step(pSql) ){.  
26cd0 20 20 20 20 69 66 28 20 70 41 72 2d 3e 62 56 65      if( pAr->bVe
26ce0 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20  rbose ){.       
26cf0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72   utf8_printf(pAr
26d00 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 20 25 20  ->p->out, "%s % 
26d10 31 30 64 20 20 25 73 20 20 25 73 5c 6e 22 2c 0a  10d  %s  %s\n",.
26d20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
26d30 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
26d40 70 53 71 6c 2c 20 30 29 2c 0a 20 20 20 20 20 20  pSql, 0),.      
26d50 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
26d60 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 31  lumn_int(pSql, 1
26d70 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20  ), .            
26d80 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
26d90 65 78 74 28 70 53 71 6c 2c 20 32 29 2c 0a 20 20  ext(pSql, 2),.  
26da0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
26db0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
26dc0 71 6c 2c 20 33 29 0a 20 20 20 20 20 20 20 20 29  ql, 3).        )
26dd0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
26de0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
26df0 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20  tf(pAr->p->out, 
26e00 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f  "%s\n", sqlite3_
26e10 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
26e20 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  , 0));.      }. 
26e30 20 20 20 7d 0a 20 20 7d 0a 20 20 73 68 65 6c 6c     }.  }.  shell
26e40 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 53  Finalize(&rc, pS
26e50 71 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  ql);.  return rc
26e60 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  ;.}.../*.** Impl
26e70 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 2e 61  ementation of .a
26e80 72 20 22 65 58 74 72 61 63 74 22 20 63 6f 6d 6d  r "eXtract" comm
26e90 61 6e 64 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20  and. .*/.static 
26ea0 69 6e 74 20 61 72 45 78 74 72 61 63 74 43 6f 6d  int arExtractCom
26eb0 6d 61 6e 64 28 41 72 43 6f 6d 6d 61 6e 64 20 2a  mand(ArCommand *
26ec0 70 41 72 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68  pAr){.  const ch
26ed0 61 72 20 2a 7a 53 71 6c 31 20 3d 20 0a 20 20 20  ar *zSql1 = .   
26ee0 20 22 53 45 4c 45 43 54 20 22 0a 20 20 20 20 22   "SELECT ".    "
26ef0 20 28 24 64 69 72 20 7c 7c 20 6e 61 6d 65 29 2c   ($dir || name),
26f00 22 0a 20 20 20 20 22 20 77 72 69 74 65 66 69 6c  ".    " writefil
26f10 65 28 28 24 64 69 72 20 7c 7c 20 6e 61 6d 65 29  e(($dir || name)
26f20 2c 20 25 73 2c 20 6d 6f 64 65 2c 20 6d 74 69 6d  , %s, mode, mtim
26f30 65 29 20 22 0a 20 20 20 20 22 46 52 4f 4d 20 25  e) ".    "FROM %
26f40 73 20 57 48 45 52 45 20 28 25 73 29 20 41 4e 44  s WHERE (%s) AND
26f50 20 28 64 61 74 61 20 49 53 20 4e 55 4c 4c 20 4f   (data IS NULL O
26f60 52 20 24 64 69 72 4f 6e 6c 79 20 3d 20 30 29 22  R $dirOnly = 0)"
26f70 3b 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ;..  const char 
26f80 2a 61 7a 45 78 74 72 61 41 72 67 5b 5d 20 3d 20  *azExtraArg[] = 
26f90 7b 20 0a 20 20 20 20 22 73 71 6c 61 72 5f 75 6e  { .    "sqlar_un
26fa0 63 6f 6d 70 72 65 73 73 28 64 61 74 61 2c 20 73  compress(data, s
26fb0 7a 29 22 2c 0a 20 20 20 20 22 64 61 74 61 22 0a  z)",.    "data".
26fc0 20 20 7d 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f    };..  sqlite3_
26fd0 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30 3b 0a  stmt *pSql = 0;.
26fe0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
26ff0 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 44  E_OK;.  char *zD
27000 69 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  ir = 0;.  char *
27010 7a 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 69 6e  zWhere = 0;.  in
27020 74 20 69 2c 20 6a 3b 0a 0a 20 20 2f 2a 20 49 66  t i, j;..  /* If
27030 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 73   arguments are s
27040 70 65 63 69 66 69 65 64 2c 20 63 68 65 63 6b 20  pecified, check 
27050 74 68 61 74 20 74 68 65 79 20 61 63 74 75 61 6c  that they actual
27060 6c 79 20 65 78 69 73 74 20 77 69 74 68 69 6e 0a  ly exist within.
27070 20 20 2a 2a 20 74 68 65 20 61 72 63 68 69 76 65    ** the archive
27080 20 62 65 66 6f 72 65 20 70 72 6f 63 65 65 64 69   before proceedi
27090 6e 67 2e 20 41 6e 64 20 66 6f 72 6d 75 6c 61 74  ng. And formulat
270a0 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  e a WHERE clause
270b0 20 74 6f 0a 20 20 2a 2a 20 6d 61 74 63 68 20 74   to.  ** match t
270c0 68 65 6d 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20  hem.  */.  rc = 
270d0 61 72 43 68 65 63 6b 45 6e 74 72 69 65 73 28 70  arCheckEntries(p
270e0 41 72 29 3b 0a 20 20 61 72 57 68 65 72 65 43 6c  Ar);.  arWhereCl
270f0 61 75 73 65 28 26 72 63 2c 20 70 41 72 2c 20 26  ause(&rc, pAr, &
27100 7a 57 68 65 72 65 29 3b 0a 0a 20 20 69 66 28 20  zWhere);..  if( 
27110 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
27120 0a 20 20 20 20 69 66 28 20 70 41 72 2d 3e 7a 44  .    if( pAr->zD
27130 69 72 20 29 7b 0a 20 20 20 20 20 20 7a 44 69 72  ir ){.      zDir
27140 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
27150 74 66 28 22 25 73 2f 22 2c 20 70 41 72 2d 3e 7a  tf("%s/", pAr->z
27160 44 69 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Dir);.    }else{
27170 0a 20 20 20 20 20 20 7a 44 69 72 20 3d 20 73 71  .      zDir = sq
27180 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 22  lite3_mprintf(""
27190 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
271a0 20 7a 44 69 72 3d 3d 30 20 29 20 72 63 20 3d 20   zDir==0 ) rc = 
271b0 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20  SQLITE_NOMEM;.  
271c0 7d 0a 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72  }..  shellPrepar
271d0 65 50 72 69 6e 74 66 28 70 41 72 2d 3e 64 62 2c  ePrintf(pAr->db,
271e0 20 26 72 63 2c 20 26 70 53 71 6c 2c 20 7a 53 71   &rc, &pSql, zSq
271f0 6c 31 2c 20 0a 20 20 20 20 20 20 61 7a 45 78 74  l1, .      azExt
27200 72 61 41 72 67 5b 70 41 72 2d 3e 62 5a 69 70 5d  raArg[pAr->bZip]
27210 2c 20 70 41 72 2d 3e 7a 53 72 63 54 61 62 6c 65  , pAr->zSrcTable
27220 2c 20 7a 57 68 65 72 65 0a 20 20 29 3b 0a 0a 20  , zWhere.  );.. 
27230 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
27240 4f 4b 20 29 7b 0a 20 20 20 20 6a 20 3d 20 73 71  OK ){.    j = sq
27250 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d  lite3_bind_param
27260 65 74 65 72 5f 69 6e 64 65 78 28 70 53 71 6c 2c  eter_index(pSql,
27270 20 22 24 64 69 72 22 29 3b 0a 20 20 20 20 73 71   "$dir");.    sq
27280 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
27290 70 53 71 6c 2c 20 6a 2c 20 7a 44 69 72 2c 20 2d  pSql, j, zDir, -
272a0 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
272b0 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 75 6e 20 74  );..    /* Run t
272c0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
272d0 65 6e 74 20 74 77 69 63 65 2e 20 54 68 65 20 66  ent twice. The f
272e0 69 72 73 74 20 74 69 6d 65 2c 20 77 72 69 74 65  irst time, write
272f0 66 69 6c 65 28 29 20 69 73 20 63 61 6c 6c 65 64  file() is called
27300 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20  .    ** for all 
27310 61 72 63 68 69 76 65 20 6d 65 6d 62 65 72 73 20  archive members 
27320 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 65  that should be e
27330 78 74 72 61 63 74 65 64 2e 20 54 68 65 20 73 65  xtracted. The se
27340 63 6f 6e 64 20 74 69 6d 65 2c 0a 20 20 20 20 2a  cond time,.    *
27350 2a 20 6f 6e 6c 79 20 66 6f 72 20 74 68 65 20 64  * only for the d
27360 69 72 65 63 74 6f 72 69 65 73 2e 20 54 68 69 73  irectories. This
27370 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20   is because the 
27380 74 69 6d 65 73 74 61 6d 70 73 20 66 6f 72 0a 20  timestamps for. 
27390 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20     ** extracted 
273a0 64 69 72 65 63 74 6f 72 69 65 73 20 6d 75 73 74  directories must
273b0 20 62 65 20 72 65 73 65 74 20 61 66 74 65 72 20   be reset after 
273c0 74 68 65 79 20 61 72 65 20 70 6f 70 75 6c 61 74  they are populat
273d0 65 64 20 28 61 73 0a 20 20 20 20 2a 2a 20 70 6f  ed (as.    ** po
273e0 70 75 6c 61 74 69 6e 67 20 74 68 65 6d 20 63 68  pulating them ch
273f0 61 6e 67 65 73 20 74 68 65 20 74 69 6d 65 73 74  anges the timest
27400 61 6d 70 29 2e 20 20 2a 2f 0a 20 20 20 20 66 6f  amp).  */.    fo
27410 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29  r(i=0; i<2; i++)
27420 7b 0a 20 20 20 20 20 20 6a 20 3d 20 73 71 6c 69  {.      j = sqli
27430 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65 74  te3_bind_paramet
27440 65 72 5f 69 6e 64 65 78 28 70 53 71 6c 2c 20 22  er_index(pSql, "
27450 24 64 69 72 4f 6e 6c 79 22 29 3b 0a 20 20 20 20  $dirOnly");.    
27460 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
27470 6e 74 28 70 53 71 6c 2c 20 6a 2c 20 69 29 3b 0a  nt(pSql, j, i);.
27480 20 20 20 20 20 20 69 66 28 20 70 41 72 2d 3e 62        if( pAr->b
27490 44 72 79 52 75 6e 20 29 7b 0a 20 20 20 20 20 20  DryRun ){.      
274a0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41    utf8_printf(pA
274b0 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  r->p->out, "%s\n
274c0 22 2c 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70  ", sqlite3_sql(p
274d0 53 71 6c 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c  Sql));.      }el
274e0 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  se{.        whil
274f0 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
27500 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
27510 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 71  sqlite3_step(pSq
27520 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l) ){.          
27530 69 66 28 20 69 3d 3d 30 20 26 26 20 70 41 72 2d  if( i==0 && pAr-
27540 3e 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20  >bVerbose ){.   
27550 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
27560 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74  intf(pAr->p->out
27570 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  , "%s\n", sqlite
27580 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
27590 71 6c 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 20  ql, 0));.       
275a0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
275b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 68 65       }.      she
275c0 6c 6c 52 65 73 65 74 28 26 72 63 2c 20 70 53 71  llReset(&rc, pSq
275d0 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 68  l);.    }.    sh
275e0 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c  ellFinalize(&rc,
275f0 20 70 53 71 6c 29 3b 0a 20 20 7d 0a 0a 20 20 73   pSql);.  }..  s
27600 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 44 69 72  qlite3_free(zDir
27610 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
27620 65 28 7a 57 68 65 72 65 29 3b 0a 20 20 72 65 74  e(zWhere);.  ret
27630 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
27640 20 52 75 6e 20 74 68 65 20 53 51 4c 20 73 74 61   Run the SQL sta
27650 74 65 6d 65 6e 74 20 69 6e 20 7a 53 71 6c 2e 20  tement in zSql. 
27660 20 4f 72 20 69 66 20 64 6f 69 6e 67 20 61 20 2d   Or if doing a -
27670 2d 64 72 79 72 75 6e 2c 20 6d 65 72 65 6c 79 20  -dryrun, merely 
27680 70 72 69 6e 74 20 69 74 20 6f 75 74 2e 0a 2a 2f  print it out..*/
27690 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 45 78  .static int arEx
276a0 65 63 53 71 6c 28 41 72 43 6f 6d 6d 61 6e 64 20  ecSql(ArCommand 
276b0 2a 70 41 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  *pAr, const char
276c0 20 2a 7a 53 71 6c 29 7b 0a 20 20 69 6e 74 20 72   *zSql){.  int r
276d0 63 3b 0a 20 20 69 66 28 20 70 41 72 2d 3e 62 44  c;.  if( pAr->bD
276e0 72 79 52 75 6e 20 29 7b 0a 20 20 20 20 75 74 66  ryRun ){.    utf
276f0 38 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d  8_printf(pAr->p-
27700 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 53  >out, "%s\n", zS
27710 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 53 51  ql);.    rc = SQ
27720 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73 65  LITE_OK;.  }else
27730 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72  {.    char *zErr
27740 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 0;.    rc = s
27750 71 6c 69 74 65 33 5f 65 78 65 63 28 70 41 72 2d  qlite3_exec(pAr-
27760 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c  >db, zSql, 0, 0,
27770 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28   &zErr);.    if(
27780 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20 75   zErr ){.      u
27790 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 6f 75  tf8_printf(stdou
277a0 74 2c 20 22 45 52 52 4f 52 3a 20 25 73 5c 6e 22  t, "ERROR: %s\n"
277b0 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 73  , zErr);.      s
277c0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
277d0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
277e0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
277f0 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
27800 6f 6e 20 6f 66 20 2e 61 72 20 22 63 72 65 61 74  on of .ar "creat
27810 65 22 20 61 6e 64 20 22 75 70 64 61 74 65 22 20  e" and "update" 
27820 63 6f 6d 6d 61 6e 64 73 2e 0a 2a 2a 0a 2a 2a 20  commands..**.** 
27830 43 72 65 61 74 65 20 74 68 65 20 22 73 71 6c 61  Create the "sqla
27840 72 22 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20  r" table in the 
27850 64 61 74 61 62 61 73 65 20 69 66 20 69 74 20 64  database if it d
27860 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20  oes not already 
27870 65 78 69 73 74 2e 0a 2a 2a 20 54 68 65 6e 20 61  exist..** Then a
27880 64 64 20 65 61 63 68 20 66 69 6c 65 20 69 6e 20  dd each file in 
27890 74 68 65 20 61 7a 46 69 6c 65 5b 5d 20 61 72 72  the azFile[] arr
278a0 61 79 20 74 6f 20 74 68 65 20 61 72 63 68 69 76  ay to the archiv
278b0 65 2e 20 44 69 72 65 63 74 6f 72 69 65 73 0a 2a  e. Directories.*
278c0 2a 20 61 72 65 20 61 64 64 65 64 20 72 65 63 75  * are added recu
278d0 72 73 69 76 65 6c 79 2e 20 49 66 20 61 72 67 75  rsively. If argu
278e0 6d 65 6e 74 20 62 56 65 72 62 6f 73 65 20 69 73  ment bVerbose is
278f0 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 6d 65 73   non-zero, a mes
27900 73 61 67 65 20 69 73 0a 2a 2a 20 70 72 69 6e 74  sage is.** print
27910 65 64 20 6f 6e 20 73 74 64 6f 75 74 20 66 6f 72  ed on stdout for
27920 20 65 61 63 68 20 66 69 6c 65 20 61 72 63 68 69   each file archi
27930 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 63  ved..**.** The c
27940 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 69 73  reate command is
27950 20 74 68 65 20 73 61 6d 65 20 61 73 20 75 70 64   the same as upd
27960 61 74 65 2c 20 65 78 63 65 70 74 20 74 68 61 74  ate, except that
27970 20 69 74 20 64 72 6f 70 73 0a 2a 2a 20 61 6e 79   it drops.** any
27980 20 65 78 69 73 74 69 6e 67 20 22 73 71 6c 61 72   existing "sqlar
27990 22 20 74 61 62 6c 65 20 62 65 66 6f 72 65 20 62  " table before b
279a0 65 67 69 6e 6e 69 6e 67 2e 0a 2a 2f 0a 73 74 61  eginning..*/.sta
279b0 74 69 63 20 69 6e 74 20 61 72 43 72 65 61 74 65  tic int arCreate
279c0 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e 64 28  OrUpdateCommand(
279d0 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41  .  ArCommand *pA
279e0 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  r,              
279f0 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61 72     /* Command ar
27a00 67 75 6d 65 6e 74 73 20 61 6e 64 20 6f 70 74 69  guments and opti
27a10 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62 55 70  ons */.  int bUp
27a20 64 61 74 65 20 20 20 20 20 20 20 20 20 20 20 20  date            
27a30 20 20 20 20 20 20 20 20 20 2f 2a 20 74 72 75 65           /* true
27a40 20 66 6f 72 20 61 20 2d 2d 63 72 65 61 74 65 2e   for a --create.
27a50 20 20 66 61 6c 73 65 20 66 6f 72 20 2d 2d 75 70    false for --up
27a60 64 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f 6e  date */.){.  con
27a70 73 74 20 63 68 61 72 20 2a 7a 43 72 65 61 74 65  st char *zCreate
27a80 20 3d 20 0a 20 20 20 20 20 20 22 43 52 45 41 54   = .      "CREAT
27a90 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
27aa0 58 49 53 54 53 20 73 71 6c 61 72 28 5c 6e 22 0a  XISTS sqlar(\n".
27ab0 20 20 20 20 20 20 22 20 20 6e 61 6d 65 20 54 45        "  name TE
27ac0 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  XT PRIMARY KEY, 
27ad0 20 2d 2d 20 6e 61 6d 65 20 6f 66 20 74 68 65 20   -- name of the 
27ae0 66 69 6c 65 5c 6e 22 0a 20 20 20 20 20 20 22 20  file\n".      " 
27af0 20 6d 6f 64 65 20 49 4e 54 2c 20 20 20 20 20 20   mode INT,      
27b00 20 20 20 20 20 20 20 20 20 2d 2d 20 61 63 63 65           -- acce
27b10 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 5c 6e  ss permissions\n
27b20 22 0a 20 20 20 20 20 20 22 20 20 6d 74 69 6d 65  ".      "  mtime
27b30 20 49 4e 54 2c 20 20 20 20 20 20 20 20 20 20 20   INT,           
27b40 20 20 20 2d 2d 20 6c 61 73 74 20 6d 6f 64 69 66     -- last modif
27b50 69 63 61 74 69 6f 6e 20 74 69 6d 65 5c 6e 22 0a  ication time\n".
27b60 20 20 20 20 20 20 22 20 20 73 7a 20 49 4e 54 2c        "  sz INT,
27b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27b80 20 2d 2d 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c   -- original fil
27b90 65 20 73 69 7a 65 5c 6e 22 0a 20 20 20 20 20 20  e size\n".      
27ba0 22 20 20 64 61 74 61 20 42 4c 4f 42 20 20 20 20  "  data BLOB    
27bb0 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 63 6f             -- co
27bc0 6d 70 72 65 73 73 65 64 20 63 6f 6e 74 65 6e 74  mpressed content
27bd0 5c 6e 22 0a 20 20 20 20 20 20 22 29 22 3b 0a 20  \n".      ")";. 
27be0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 72   const char *zDr
27bf0 6f 70 20 3d 20 22 44 52 4f 50 20 54 41 42 4c 45  op = "DROP TABLE
27c00 20 49 46 20 45 58 49 53 54 53 20 73 71 6c 61 72   IF EXISTS sqlar
27c10 22 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ";.  const char 
27c20 2a 7a 49 6e 73 65 72 74 46 6d 74 5b 32 5d 20 3d  *zInsertFmt[2] =
27c30 20 7b 0a 20 20 20 20 20 22 52 45 50 4c 41 43 45   {.     "REPLACE
27c40 20 49 4e 54 4f 20 25 73 28 6e 61 6d 65 2c 6d 6f   INTO %s(name,mo
27c50 64 65 2c 6d 74 69 6d 65 2c 73 7a 2c 64 61 74 61  de,mtime,sz,data
27c60 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 53 45 4c  )\n".     "  SEL
27c70 45 43 54 5c 6e 22 0a 20 20 20 20 20 22 20 20 20  ECT\n".     "   
27c80 20 25 73 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20   %s,\n".     "  
27c90 20 20 6d 6f 64 65 2c 5c 6e 22 0a 20 20 20 20 20    mode,\n".     
27ca0 22 20 20 20 20 6d 74 69 6d 65 2c 5c 6e 22 0a 20  "    mtime,\n". 
27cb0 20 20 20 20 22 20 20 20 20 43 41 53 45 20 73 75      "    CASE su
27cc0 62 73 74 72 28 6c 73 6d 6f 64 65 28 6d 6f 64 65  bstr(lsmode(mode
27cd0 29 2c 31 2c 31 29 5c 6e 22 0a 20 20 20 20 20 22  ),1,1)\n".     "
27ce0 20 20 20 20 20 20 57 48 45 4e 20 27 2d 27 20 54        WHEN '-' T
27cf0 48 45 4e 20 6c 65 6e 67 74 68 28 64 61 74 61 29  HEN length(data)
27d00 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 20 20  \n".     "      
27d10 57 48 45 4e 20 27 64 27 20 54 48 45 4e 20 30 5c  WHEN 'd' THEN 0\
27d20 6e 22 0a 20 20 20 20 20 22 20 20 20 20 20 20 45  n".     "      E
27d30 4c 53 45 20 2d 31 20 45 4e 44 2c 5c 6e 22 0a 20  LSE -1 END,\n". 
27d40 20 20 20 20 22 20 20 20 20 73 71 6c 61 72 5f 63      "    sqlar_c
27d50 6f 6d 70 72 65 73 73 28 64 61 74 61 29 5c 6e 22  ompress(data)\n"
27d60 0a 20 20 20 20 20 22 20 20 46 52 4f 4d 20 66 73  .     "  FROM fs
27d70 64 69 72 28 25 51 2c 25 51 29 5c 6e 22 0a 20 20  dir(%Q,%Q)\n".  
27d80 20 20 20 22 20 20 57 48 45 52 45 20 6c 73 6d 6f     "  WHERE lsmo
27d90 64 65 28 6d 6f 64 65 29 20 4e 4f 54 20 4c 49 4b  de(mode) NOT LIK
27da0 45 20 27 3f 25 25 27 3b 22 2c 0a 20 20 20 20 20  E '?%%';",.     
27db0 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 25 73  "REPLACE INTO %s
27dc0 28 6e 61 6d 65 2c 6d 6f 64 65 2c 6d 74 69 6d 65  (name,mode,mtime
27dd0 2c 64 61 74 61 29 5c 6e 22 0a 20 20 20 20 20 22  ,data)\n".     "
27de0 20 20 53 45 4c 45 43 54 5c 6e 22 0a 20 20 20 20    SELECT\n".    
27df0 20 22 20 20 20 20 25 73 2c 5c 6e 22 0a 20 20 20   "    %s,\n".   
27e00 20 20 22 20 20 20 20 6d 6f 64 65 2c 5c 6e 22 0a    "    mode,\n".
27e10 20 20 20 20 20 22 20 20 20 20 6d 74 69 6d 65 2c       "    mtime,
27e20 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 64 61  \n".     "    da
27e30 74 61 5c 6e 22 0a 20 20 20 20 20 22 20 20 46 52  ta\n".     "  FR
27e40 4f 4d 20 66 73 64 69 72 28 25 51 2c 25 51 29 5c  OM fsdir(%Q,%Q)\
27e50 6e 22 0a 20 20 20 20 20 22 20 20 57 48 45 52 45  n".     "  WHERE
27e60 20 6c 73 6d 6f 64 65 28 6d 6f 64 65 29 20 4e 4f   lsmode(mode) NO
27e70 54 20 4c 49 4b 45 20 27 3f 25 25 27 3b 22 0a 20  T LIKE '?%%';". 
27e80 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20   };.  int i;    
27e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ea0 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 69 74 65        /* For ite
27eb0 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20 61  rating through a
27ec0 7a 46 69 6c 65 5b 5d 20 2a 2f 0a 20 20 69 6e 74  zFile[] */.  int
27ed0 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20 20   rc;            
27ee0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
27ef0 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a 20  Return code */. 
27f00 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
27f10 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
27f20 20 2f 2a 20 53 51 4c 20 74 61 62 6c 65 20 69 6e   /* SQL table in
27f30 74 6f 20 77 68 69 63 68 20 74 6f 20 69 6e 73 65  to which to inse
27f40 72 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53  rt */.  char *zS
27f50 71 6c 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d 70  ql;.  char zTemp
27f60 5b 35 30 5d 3b 0a 0a 20 20 61 72 45 78 65 63 53  [50];..  arExecS
27f70 71 6c 28 70 41 72 2c 20 22 50 52 41 47 4d 41 20  ql(pAr, "PRAGMA 
27f80 70 61 67 65 5f 73 69 7a 65 3d 35 31 32 22 29 3b  page_size=512");
27f90 0a 20 20 72 63 20 3d 20 61 72 45 78 65 63 53 71  .  rc = arExecSq
27fa0 6c 28 70 41 72 2c 20 22 53 41 56 45 50 4f 49 4e  l(pAr, "SAVEPOIN
27fb0 54 20 61 72 3b 22 29 3b 0a 20 20 69 66 28 20 72  T ar;");.  if( r
27fc0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
27fd0 65 74 75 72 6e 20 72 63 3b 0a 20 20 7a 54 65 6d  eturn rc;.  zTem
27fe0 70 5b 30 5d 20 3d 20 30 3b 20 0a 20 20 69 66 28  p[0] = 0; .  if(
27ff0 20 70 41 72 2d 3e 62 5a 69 70 20 29 7b 0a 20 20   pAr->bZip ){.  
28000 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20    /* Initialize 
28010 74 68 65 20 7a 69 70 66 69 6c 65 20 76 69 72 74  the zipfile virt
28020 75 61 6c 20 74 61 62 6c 65 2c 20 69 66 20 6e 65  ual table, if ne
28030 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20 69  cessary */.    i
28040 66 28 20 70 41 72 2d 3e 7a 46 69 6c 65 20 29 7b  f( pAr->zFile ){
28050 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 75  .      sqlite3_u
28060 69 6e 74 36 34 20 72 3b 0a 20 20 20 20 20 20 73  int64 r;.      s
28070 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73  qlite3_randomnes
28080 73 28 73 69 7a 65 6f 66 28 72 29 2c 26 72 29 3b  s(sizeof(r),&r);
28090 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
280a0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
280b0 54 65 6d 70 29 2c 7a 54 65 6d 70 2c 22 7a 69 70  Temp),zTemp,"zip
280c0 25 30 31 36 6c 6c 78 22 2c 72 29 3b 0a 20 20 20  %016llx",r);.   
280d0 20 20 20 7a 54 61 62 20 3d 20 7a 54 65 6d 70 3b     zTab = zTemp;
280e0 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  .      zSql = sq
280f0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
28100 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
28110 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 65  VIRTUAL TABLE te
28120 6d 70 2e 25 73 20 55 53 49 4e 47 20 7a 69 70 66  mp.%s USING zipf
28130 69 6c 65 28 25 51 29 22 2c 0a 20 20 20 20 20 20  ile(%Q)",.      
28140 20 20 20 7a 54 61 62 2c 20 70 41 72 2d 3e 7a 46     zTab, pAr->zF
28150 69 6c 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ile.      );.   
28160 20 20 20 72 63 20 3d 20 61 72 45 78 65 63 53 71     rc = arExecSq
28170 6c 28 70 41 72 2c 20 7a 53 71 6c 29 3b 0a 20 20  l(pAr, zSql);.  
28180 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
28190 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c 73  (zSql);.    }els
281a0 65 7b 0a 20 20 20 20 20 20 7a 54 61 62 20 3d 20  e{.      zTab = 
281b0 22 7a 69 70 22 3b 0a 20 20 20 20 7d 0a 20 20 7d  "zip";.    }.  }
281c0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e 69  else{.    /* Ini
281d0 74 69 61 6c 69 7a 65 20 74 68 65 20 74 61 62 6c  tialize the tabl
281e0 65 20 66 6f 72 20 61 6e 20 53 51 4c 41 52 20 2a  e for an SQLAR *
281f0 2f 0a 20 20 20 20 7a 54 61 62 20 3d 20 22 73 71  /.    zTab = "sq
28200 6c 61 72 22 3b 0a 20 20 20 20 69 66 28 20 62 55  lar";.    if( bU
28210 70 64 61 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20  pdate==0 ){.    
28220 20 20 72 63 20 3d 20 61 72 45 78 65 63 53 71 6c    rc = arExecSql
28230 28 70 41 72 2c 20 7a 44 72 6f 70 29 3b 0a 20 20  (pAr, zDrop);.  
28240 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
28250 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e 64  TE_OK ) goto end
28260 5f 61 72 5f 74 72 61 6e 73 61 63 74 69 6f 6e 3b  _ar_transaction;
28270 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20  .    }.    rc = 
28280 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a  arExecSql(pAr, z
28290 43 72 65 61 74 65 29 3b 0a 20 20 7d 0a 20 20 66  Create);.  }.  f
282a0 6f 72 28 69 3d 30 3b 20 69 3c 70 41 72 2d 3e 6e  or(i=0; i<pAr->n
282b0 41 72 67 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  Arg && rc==SQLIT
282c0 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  E_OK; i++){.    
282d0 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c  char *zSql = sql
282e0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 7a 49 6e  ite3_mprintf(zIn
282f0 73 65 72 74 46 6d 74 5b 70 41 72 2d 3e 62 5a 69  sertFmt[pAr->bZi
28300 70 5d 2c 20 7a 54 61 62 2c 0a 20 20 20 20 20 20  p], zTab,.      
28310 20 20 70 41 72 2d 3e 62 56 65 72 62 6f 73 65 20    pAr->bVerbose 
28320 3f 20 22 73 68 65 6c 6c 5f 70 75 74 73 6e 6c 28  ? "shell_putsnl(
28330 6e 61 6d 65 29 22 20 3a 20 22 6e 61 6d 65 22 2c  name)" : "name",
28340 0a 20 20 20 20 20 20 20 20 70 41 72 2d 3e 61 7a  .        pAr->az
28350 41 72 67 5b 69 5d 2c 20 70 41 72 2d 3e 7a 44 69  Arg[i], pAr->zDi
28360 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 61 72 45  r);.    rc = arE
28370 78 65 63 53 71 6c 28 70 41 72 2c 20 7a 53 71 6c  xecSql(pAr, zSql
28380 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
28390 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a 65  ree(zSql);.  }.e
283a0 6e 64 5f 61 72 5f 74 72 61 6e 73 61 63 74 69 6f  nd_ar_transactio
283b0 6e 3a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  n:.  if( rc!=SQL
283c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 61 72  ITE_OK ){.    ar
283d0 45 78 65 63 53 71 6c 28 70 41 72 2c 20 22 52 4f  ExecSql(pAr, "RO
283e0 4c 4c 42 41 43 4b 20 54 4f 20 61 72 3b 20 52 45  LLBACK TO ar; RE
283f0 4c 45 41 53 45 20 61 72 3b 22 29 3b 0a 20 20 7d  LEASE ar;");.  }
28400 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 61  else{.    rc = a
28410 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 22 52  rExecSql(pAr, "R
28420 45 4c 45 41 53 45 20 61 72 3b 22 29 3b 0a 20 20  ELEASE ar;");.  
28430 20 20 69 66 28 20 70 41 72 2d 3e 62 5a 69 70 20    if( pAr->bZip 
28440 26 26 20 70 41 72 2d 3e 7a 46 69 6c 65 20 29 7b  && pAr->zFile ){
28450 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  .      zSql = sq
28460 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 44  lite3_mprintf("D
28470 52 4f 50 20 54 41 42 4c 45 20 25 73 22 2c 20 7a  ROP TABLE %s", z
28480 54 65 6d 70 29 3b 0a 20 20 20 20 20 20 61 72 45  Temp);.      arE
28490 78 65 63 53 71 6c 28 70 41 72 2c 20 7a 53 71 6c  xecSql(pAr, zSql
284a0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
284b0 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
284c0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
284d0 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  rc;.}../*.** Imp
284e0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22  lementation of "
284f0 2e 61 72 22 20 64 6f 74 20 63 6f 6d 6d 61 6e 64  .ar" dot command
28500 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
28510 61 72 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20 20  arDotCommand(.  
28520 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61  ShellState *pSta
28530 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
28540 2f 2a 20 43 75 72 72 65 6e 74 20 73 68 65 6c 6c  /* Current shell
28550 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20   tool state */. 
28560 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20   char **azArg,  
28570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28580 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67   /* Array of arg
28590 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f  uments passed to
285a0 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a   dot command */.
285b0 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20    int nArg      
285c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
285d0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
285e0 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b  ntries in azArg[
285f0 5d 20 2a 2f 0a 29 7b 0a 20 20 41 72 43 6f 6d 6d  ] */.){.  ArComm
28600 61 6e 64 20 63 6d 64 3b 0a 20 20 69 6e 74 20 72  and cmd;.  int r
28610 63 3b 0a 20 20 6d 65 6d 73 65 74 28 26 63 6d 64  c;.  memset(&cmd
28620 2c 20 30 2c 20 73 69 7a 65 6f 66 28 63 6d 64 29  , 0, sizeof(cmd)
28630 29 3b 0a 20 20 72 63 20 3d 20 61 72 50 61 72 73  );.  rc = arPars
28640 65 43 6f 6d 6d 61 6e 64 28 61 7a 41 72 67 2c 20  eCommand(azArg, 
28650 6e 41 72 67 2c 20 26 63 6d 64 29 3b 0a 20 20 69  nArg, &cmd);.  i
28660 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
28670 20 29 7b 0a 20 20 20 20 69 6e 74 20 65 44 62 54   ){.    int eDbT
28680 79 70 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e  ype = SHELL_OPEN
28690 5f 55 4e 53 50 45 43 3b 0a 20 20 20 20 63 6d 64  _UNSPEC;.    cmd
286a0 2e 70 20 3d 20 70 53 74 61 74 65 3b 0a 20 20 20  .p = pState;.   
286b0 20 63 6d 64 2e 64 62 20 3d 20 70 53 74 61 74 65   cmd.db = pState
286c0 2d 3e 64 62 3b 0a 20 20 20 20 69 66 28 20 63 6d  ->db;.    if( cm
286d0 64 2e 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20 20  d.zFile ){.     
286e0 20 65 44 62 54 79 70 65 20 3d 20 64 65 64 75 63   eDbType = deduc
286f0 65 44 61 74 61 62 61 73 65 54 79 70 65 28 63 6d  eDatabaseType(cm
28700 64 2e 7a 46 69 6c 65 2c 20 31 29 3b 0a 20 20 20  d.zFile, 1);.   
28710 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 65 44   }else{.      eD
28720 62 54 79 70 65 20 3d 20 70 53 74 61 74 65 2d 3e  bType = pState->
28730 6f 70 65 6e 4d 6f 64 65 3b 0a 20 20 20 20 7d 0a  openMode;.    }.
28740 20 20 20 20 69 66 28 20 65 44 62 54 79 70 65 3d      if( eDbType=
28750 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46  =SHELL_OPEN_ZIPF
28760 49 4c 45 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ILE ){.      if(
28770 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d   cmd.eCmd==AR_CM
28780 44 5f 45 58 54 52 41 43 54 20 7c 7c 20 63 6d 64  D_EXTRACT || cmd
28790 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 4c 49  .eCmd==AR_CMD_LI
287a0 53 54 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ST ){.        if
287b0 28 20 63 6d 64 2e 7a 46 69 6c 65 3d 3d 30 20 29  ( cmd.zFile==0 )
287c0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64 2e  {.          cmd.
287d0 7a 53 72 63 54 61 62 6c 65 20 3d 20 73 71 6c 69  zSrcTable = sqli
287e0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 7a 69 70  te3_mprintf("zip
287f0 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ");.        }els
28800 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6d 64  e{.          cmd
28810 2e 7a 53 72 63 54 61 62 6c 65 20 3d 20 73 71 6c  .zSrcTable = sql
28820 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 7a 69  ite3_mprintf("zi
28830 70 66 69 6c 65 28 25 51 29 22 2c 20 63 6d 64 2e  pfile(%Q)", cmd.
28840 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  zFile);.        
28850 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
28860 63 6d 64 2e 62 5a 69 70 20 3d 20 31 3b 0a 20 20  cmd.bZip = 1;.  
28870 20 20 7d 65 6c 73 65 20 69 66 28 20 63 6d 64 2e    }else if( cmd.
28880 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69  zFile ){.      i
28890 6e 74 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20  nt flags;.      
288a0 69 66 28 20 63 6d 64 2e 62 41 70 70 65 6e 64 20  if( cmd.bAppend 
288b0 29 20 65 44 62 54 79 70 65 20 3d 20 53 48 45 4c  ) eDbType = SHEL
288c0 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53  L_OPEN_APPENDVFS
288d0 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e  ;.      if( cmd.
288e0 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 43 52 45  eCmd==AR_CMD_CRE
288f0 41 54 45 20 7c 7c 20 63 6d 64 2e 65 43 6d 64 3d  ATE || cmd.eCmd=
28900 3d 41 52 5f 43 4d 44 5f 55 50 44 41 54 45 20 29  =AR_CMD_UPDATE )
28910 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
28920 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
28930 41 44 57 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f  ADWRITE|SQLITE_O
28940 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20 20 20 20  PEN_CREATE;.    
28950 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
28960 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45 5f   flags = SQLITE_
28970 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20  OPEN_READONLY;. 
28980 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 6d 64       }.      cmd
28990 2e 64 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  .db = 0;.      i
289a0 66 28 20 63 6d 64 2e 62 44 72 79 52 75 6e 20 29  f( cmd.bDryRun )
289b0 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
289c0 72 69 6e 74 66 28 70 53 74 61 74 65 2d 3e 6f 75  rintf(pState->ou
289d0 74 2c 20 22 2d 2d 20 6f 70 65 6e 20 64 61 74 61  t, "-- open data
289e0 62 61 73 65 20 27 25 73 27 25 73 5c 6e 22 2c 20  base '%s'%s\n", 
289f0 63 6d 64 2e 7a 46 69 6c 65 2c 0a 20 20 20 20 20  cmd.zFile,.     
28a00 20 20 20 20 20 20 20 20 65 44 62 54 79 70 65 3d          eDbType=
28a10 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45  =SHELL_OPEN_APPE
28a20 4e 44 56 46 53 20 3f 20 22 20 75 73 69 6e 67 20  NDVFS ? " using 
28a30 27 61 70 6e 64 76 66 73 27 22 20 3a 20 22 22 29  'apndvfs'" : "")
28a40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28a50 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
28a60 6e 5f 76 32 28 63 6d 64 2e 7a 46 69 6c 65 2c 20  n_v2(cmd.zFile, 
28a70 26 63 6d 64 2e 64 62 2c 20 66 6c 61 67 73 2c 20  &cmd.db, flags, 
28a80 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 65 44  .             eD
28a90 62 54 79 70 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45  bType==SHELL_OPE
28aa0 4e 5f 41 50 50 45 4e 44 56 46 53 20 3f 20 22 61  N_APPENDVFS ? "a
28ab0 70 6e 64 76 66 73 22 20 3a 20 30 29 3b 0a 20 20  pndvfs" : 0);.  
28ac0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
28ad0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
28ae0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
28af0 65 72 72 2c 20 22 63 61 6e 6e 6f 74 20 6f 70 65  err, "cannot ope
28b00 6e 20 66 69 6c 65 3a 20 25 73 20 28 25 73 29 5c  n file: %s (%s)\
28b10 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  n", .           
28b20 20 63 6d 64 2e 7a 46 69 6c 65 2c 20 73 71 6c 69   cmd.zFile, sqli
28b30 74 65 33 5f 65 72 72 6d 73 67 28 63 6d 64 2e 64  te3_errmsg(cmd.d
28b40 62 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20  b).        );.  
28b50 20 20 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 61        goto end_a
28b60 72 5f 63 6f 6d 6d 61 6e 64 3b 0a 20 20 20 20 20  r_command;.     
28b70 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
28b80 5f 66 69 6c 65 69 6f 5f 69 6e 69 74 28 63 6d 64  _fileio_init(cmd
28b90 2e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  .db, 0, 0);.    
28ba0 20 20 73 71 6c 69 74 65 33 5f 73 71 6c 61 72 5f    sqlite3_sqlar_
28bb0 69 6e 69 74 28 63 6d 64 2e 64 62 2c 20 30 2c 20  init(cmd.db, 0, 
28bc0 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
28bd0 33 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f  3_create_functio
28be0 6e 28 63 6d 64 2e 64 62 2c 20 22 73 68 65 6c 6c  n(cmd.db, "shell
28bf0 5f 70 75 74 73 6e 6c 22 2c 20 31 2c 20 53 51 4c  _putsnl", 1, SQL
28c00 49 54 45 5f 55 54 46 38 2c 20 63 6d 64 2e 70 2c  ITE_UTF8, cmd.p,
28c10 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28c20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
28c30 68 65 6c 6c 50 75 74 73 46 75 6e 63 2c 20 30 2c  hellPutsFunc, 0,
28c40 20 30 29 3b 0a 0a 20 20 20 20 7d 0a 20 20 20 20   0);..    }.    
28c50 69 66 28 20 63 6d 64 2e 7a 53 72 63 54 61 62 6c  if( cmd.zSrcTabl
28c60 65 3d 3d 30 20 26 26 20 63 6d 64 2e 62 5a 69 70  e==0 && cmd.bZip
28c70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
28c80 20 63 6d 64 2e 65 43 6d 64 21 3d 41 52 5f 43 4d   cmd.eCmd!=AR_CM
28c90 44 5f 43 52 45 41 54 45 0a 20 20 20 20 20 20 20  D_CREATE.       
28ca0 26 26 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65  && sqlite3_table
28cb0 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61  _column_metadata
28cc0 28 63 6d 64 2e 64 62 2c 30 2c 22 73 71 6c 61 72  (cmd.db,0,"sqlar
28cd0 22 2c 22 6e 61 6d 65 22 2c 30 2c 30 2c 30 2c 30  ","name",0,0,0,0
28ce0 2c 30 29 0a 20 20 20 20 20 20 29 7b 0a 20 20 20  ,0).      ){.   
28cf0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
28d00 28 73 74 64 65 72 72 2c 20 22 64 61 74 61 62 61  (stderr, "databa
28d10 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  se does not cont
28d20 61 69 6e 20 61 6e 20 27 73 71 6c 61 72 27 20 74  ain an 'sqlar' t
28d30 61 62 6c 65 5c 6e 22 29 3b 0a 20 20 20 20 20 20  able\n");.      
28d40 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
28d50 52 4f 52 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  ROR;.        got
28d60 6f 20 65 6e 64 5f 61 72 5f 63 6f 6d 6d 61 6e 64  o end_ar_command
28d70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
28d80 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65 20 3d 20  cmd.zSrcTable = 
28d90 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
28da0 22 73 71 6c 61 72 22 29 3b 0a 20 20 20 20 7d 0a  "sqlar");.    }.
28db0 0a 20 20 20 20 73 77 69 74 63 68 28 20 63 6d 64  .    switch( cmd
28dc0 2e 65 43 6d 64 20 29 7b 0a 20 20 20 20 20 20 63  .eCmd ){.      c
28dd0 61 73 65 20 41 52 5f 43 4d 44 5f 43 52 45 41 54  ase AR_CMD_CREAT
28de0 45 3a 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  E:.        rc = 
28df0 61 72 43 72 65 61 74 65 4f 72 55 70 64 61 74 65  arCreateOrUpdate
28e00 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 2c 20 30 29  Command(&cmd, 0)
28e10 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
28e20 0a 0a 20 20 20 20 20 20 63 61 73 65 20 41 52 5f  ..      case AR_
28e30 43 4d 44 5f 45 58 54 52 41 43 54 3a 0a 20 20 20  CMD_EXTRACT:.   
28e40 20 20 20 20 20 72 63 20 3d 20 61 72 45 78 74 72       rc = arExtr
28e50 61 63 74 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 29  actCommand(&cmd)
28e60 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
28e70 0a 0a 20 20 20 20 20 20 63 61 73 65 20 41 52 5f  ..      case AR_
28e80 43 4d 44 5f 4c 49 53 54 3a 0a 20 20 20 20 20 20  CMD_LIST:.      
28e90 20 20 72 63 20 3d 20 61 72 4c 69 73 74 43 6f 6d    rc = arListCom
28ea0 6d 61 6e 64 28 26 63 6d 64 29 3b 0a 20 20 20 20  mand(&cmd);.    
28eb0 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
28ec0 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 48 45    case AR_CMD_HE
28ed0 4c 50 3a 0a 20 20 20 20 20 20 20 20 61 72 55 73  LP:.        arUs
28ee0 61 67 65 28 70 53 74 61 74 65 2d 3e 6f 75 74 29  age(pState->out)
28ef0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
28f00 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  ..      default:
28f10 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
28f20 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d   cmd.eCmd==AR_CM
28f30 44 5f 55 50 44 41 54 45 20 29 3b 0a 20 20 20 20  D_UPDATE );.    
28f40 20 20 20 20 72 63 20 3d 20 61 72 43 72 65 61 74      rc = arCreat
28f50 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e 64  eOrUpdateCommand
28f60 28 26 63 6d 64 2c 20 31 29 3b 0a 20 20 20 20 20  (&cmd, 1);.     
28f70 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
28f80 20 20 7d 0a 65 6e 64 5f 61 72 5f 63 6f 6d 6d 61    }.end_ar_comma
28f90 6e 64 3a 0a 20 20 69 66 28 20 63 6d 64 2e 64 62  nd:.  if( cmd.db
28fa0 21 3d 70 53 74 61 74 65 2d 3e 64 62 20 29 7b 0a  !=pState->db ){.
28fb0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
28fc0 65 28 63 6d 64 2e 64 62 29 3b 0a 20 20 7d 0a 20  e(cmd.db);.  }. 
28fd0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 63 6d   sqlite3_free(cm
28fe0 64 2e 7a 53 72 63 54 61 62 6c 65 29 3b 0a 0a 20  d.zSrcTable);.. 
28ff0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 2f 2a   return rc;.}./*
29000 20 45 6e 64 20 6f 66 20 74 68 65 20 22 2e 61 72   End of the ".ar
29010 63 68 69 76 65 22 20 6f 72 20 22 2e 61 72 22 20  chive" or ".ar" 
29020 63 6f 6d 6d 61 6e 64 20 6c 6f 67 69 63 0a 2a 2a  command logic.**
29030 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29040 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29050 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29060 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29080 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66  /.#endif /* !def
29090 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
290a0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29 20 26  _VIRTUALTABLE) &
290b0 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
290c0 5f 48 41 56 45 5f 5a 4c 49 42 29 20 2a 2f 0a 0a  _HAVE_ZLIB) */..
290d0 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 70  ./*.** If an inp
290e0 75 74 20 6c 69 6e 65 20 62 65 67 69 6e 73 20 77  ut line begins w
290f0 69 74 68 20 22 2e 22 20 74 68 65 6e 20 69 6e 76  ith "." then inv
29100 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oke this routine
29110 20 74 6f 0a 2a 2a 20 70 72 6f 63 65 73 73 20 74   to.** process t
29120 68 61 74 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20  hat line..**.** 
29130 52 65 74 75 72 6e 20 31 20 6f 6e 20 65 72 72 6f  Return 1 on erro
29140 72 2c 20 32 20 74 6f 20 65 78 69 74 2c 20 61 6e  r, 2 to exit, an
29150 64 20 30 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  d 0 otherwise..*
29160 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 5f  /.static int do_
29170 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 28 63 68 61  meta_command(cha
29180 72 20 2a 7a 4c 69 6e 65 2c 20 53 68 65 6c 6c 53  r *zLine, ShellS
29190 74 61 74 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tate *p){.  int 
291a0 68 20 3d 20 31 3b 0a 20 20 69 6e 74 20 6e 41 72  h = 1;.  int nAr
291b0 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 2c 20  g = 0;.  int n, 
291c0 63 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  c;.  int rc = 0;
291d0 0a 20 20 63 68 61 72 20 2a 61 7a 41 72 67 5b 35  .  char *azArg[5
291e0 30 5d 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  0];..#ifndef SQL
291f0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
29200 54 41 42 4c 45 0a 20 20 69 66 28 20 70 2d 3e 65  TABLE.  if( p->e
29210 78 70 65 72 74 2e 70 45 78 70 65 72 74 20 29 7b  xpert.pExpert ){
29220 0a 20 20 20 20 65 78 70 65 72 74 46 69 6e 69 73  .    expertFinis
29230 68 28 70 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a  h(p, 1, 0);.  }.
29240 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 50 61 72  #endif..  /* Par
29250 73 65 20 74 68 65 20 69 6e 70 75 74 20 6c 69 6e  se the input lin
29260 65 20 69 6e 74 6f 20 74 6f 6b 65 6e 73 2e 0a 20  e into tokens.. 
29270 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 7a 4c 69   */.  while( zLi
29280 6e 65 5b 68 5d 20 26 26 20 6e 41 72 67 3c 41 72  ne[h] && nArg<Ar
29290 72 61 79 53 69 7a 65 28 61 7a 41 72 67 29 20 29  raySize(azArg) )
292a0 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 49 73 53  {.    while( IsS
292b0 70 61 63 65 28 7a 4c 69 6e 65 5b 68 5d 29 20 29  pace(zLine[h]) )
292c0 7b 20 68 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28  { h++; }.    if(
292d0 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 30 20 29 20 62   zLine[h]==0 ) b
292e0 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 7a 4c  reak;.    if( zL
292f0 69 6e 65 5b 68 5d 3d 3d 27 5c 27 27 20 7c 7c 20  ine[h]=='\'' || 
29300 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 22 27 20 29 7b  zLine[h]=='"' ){
29310 0a 20 20 20 20 20 20 69 6e 74 20 64 65 6c 69 6d  .      int delim
29320 20 3d 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 3b 0a 20   = zLine[h++];. 
29330 20 20 20 20 20 61 7a 41 72 67 5b 6e 41 72 67 2b       azArg[nArg+
29340 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b 68 5d 3b 0a  +] = &zLine[h];.
29350 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69        while( zLi
29360 6e 65 5b 68 5d 20 26 26 20 7a 4c 69 6e 65 5b 68  ne[h] && zLine[h
29370 5d 21 3d 64 65 6c 69 6d 20 29 7b 0a 20 20 20 20  ]!=delim ){.    
29380 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d      if( zLine[h]
29390 3d 3d 27 5c 5c 27 20 26 26 20 64 65 6c 69 6d 3d  =='\\' && delim=
293a0 3d 27 22 27 20 26 26 20 7a 4c 69 6e 65 5b 68 2b  ='"' && zLine[h+
293b0 31 5d 21 3d 30 20 29 20 68 2b 2b 3b 0a 20 20 20  1]!=0 ) h++;.   
293c0 20 20 20 20 20 68 2b 2b 3b 0a 20 20 20 20 20 20       h++;.      
293d0 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e  }.      if( zLin
293e0 65 5b 68 5d 3d 3d 64 65 6c 69 6d 20 29 7b 0a 20  e[h]==delim ){. 
293f0 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b 68 2b 2b         zLine[h++
29400 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
29410 20 20 20 20 20 69 66 28 20 64 65 6c 69 6d 3d 3d       if( delim==
29420 27 22 27 20 29 20 72 65 73 6f 6c 76 65 5f 62 61  '"' ) resolve_ba
29430 63 6b 73 6c 61 73 68 65 73 28 61 7a 41 72 67 5b  ckslashes(azArg[
29440 6e 41 72 67 2d 31 5d 29 3b 0a 20 20 20 20 7d 65  nArg-1]);.    }e
29450 6c 73 65 7b 0a 20 20 20 20 20 20 61 7a 41 72 67  lse{.      azArg
29460 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26 7a 4c 69 6e  [nArg++] = &zLin
29470 65 5b 68 5d 3b 0a 20 20 20 20 20 20 77 68 69 6c  e[h];.      whil
29480 65 28 20 7a 4c 69 6e 65 5b 68 5d 20 26 26 20 21  e( zLine[h] && !
29490 49 73 53 70 61 63 65 28 7a 4c 69 6e 65 5b 68 5d  IsSpace(zLine[h]
294a0 29 20 29 7b 20 68 2b 2b 3b 20 7d 0a 20 20 20 20  ) ){ h++; }.    
294b0 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 20 29    if( zLine[h] )
294c0 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 20 3d 20 30 3b   zLine[h++] = 0;
294d0 0a 20 20 20 20 20 20 72 65 73 6f 6c 76 65 5f 62  .      resolve_b
294e0 61 63 6b 73 6c 61 73 68 65 73 28 61 7a 41 72 67  ackslashes(azArg
294f0 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20 20 20 20 7d  [nArg-1]);.    }
29500 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65  .  }..  /* Proce
29510 73 73 20 74 68 65 20 69 6e 70 75 74 20 6c 69 6e  ss the input lin
29520 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 41  e..  */.  if( nA
29530 72 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  rg==0 ) return 0
29540 3b 20 2f 2a 20 6e 6f 20 74 6f 6b 65 6e 73 2c 20  ; /* no tokens, 
29550 6e 6f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 6e 20  no error */.  n 
29560 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 41 72 67  = strlen30(azArg
29570 5b 30 5d 29 3b 0a 20 20 63 20 3d 20 61 7a 41 72  [0]);.  c = azAr
29580 67 5b 30 5d 5b 30 5d 3b 0a 20 20 63 6c 65 61 72  g[0][0];.  clear
29590 54 65 6d 70 46 69 6c 65 28 70 29 3b 0a 0a 23 69  TempFile(p);..#i
295a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
295b0 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
295c0 20 20 69 66 28 20 63 3d 3d 27 61 27 20 26 26 20    if( c=='a' && 
295d0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
295e0 2c 20 22 61 75 74 68 22 2c 20 6e 29 3d 3d 30 20  , "auth", n)==0 
295f0 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21  ){.    if( nArg!
29600 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  =2 ){.      raw_
29610 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
29620 55 73 61 67 65 3a 20 2e 61 75 74 68 20 4f 4e 7c  Usage: .auth ON|
29630 4f 46 46 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  OFF\n");.      r
29640 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74  c = 1;.      got
29650 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
29660 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f  xit;.    }.    o
29670 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
29680 20 20 69 66 28 20 62 6f 6f 6c 65 61 6e 56 61 6c    if( booleanVal
29690 75 65 28 61 7a 41 72 67 5b 31 5d 29 20 29 7b 0a  ue(azArg[1]) ){.
296a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65        sqlite3_se
296b0 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 2d 3e  t_authorizer(p->
296c0 64 62 2c 20 73 68 65 6c 6c 41 75 74 68 2c 20 70  db, shellAuth, p
296d0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
296e0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f      sqlite3_set_
296f0 61 75 74 68 6f 72 69 7a 65 72 28 70 2d 3e 64 62  authorizer(p->db
29700 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  , 0, 0);.    }. 
29710 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 23   }else.#endif..#
29720 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
29730 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
29740 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64  ABLE) && defined
29750 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49  (SQLITE_HAVE_ZLI
29760 42 29 0a 20 20 69 66 28 20 63 3d 3d 27 61 27 20  B).  if( c=='a' 
29770 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
29780 5b 30 5d 2c 20 22 61 72 63 68 69 76 65 22 2c 20  [0], "archive", 
29790 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65  n)==0 ){.    ope
297a0 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20  n_db(p, 0);.    
297b0 72 63 20 3d 20 61 72 44 6f 74 43 6f 6d 6d 61 6e  rc = arDotComman
297c0 64 28 70 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67  d(p, azArg, nArg
297d0 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69  );.  }else.#endi
297e0 66 0a 0a 20 20 69 66 28 20 28 63 3d 3d 27 62 27  f..  if( (c=='b'
297f0 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
29800 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62  cmp(azArg[0], "b
29810 61 63 6b 75 70 22 2c 20 6e 29 3d 3d 30 29 0a 20  ackup", n)==0). 
29820 20 20 7c 7c 20 28 63 3d 3d 27 73 27 20 26 26 20    || (c=='s' && 
29830 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=3 && strncmp(
29840 61 7a 41 72 67 5b 30 5d 2c 20 22 73 61 76 65 22  azArg[0], "save"
29850 2c 20 6e 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20  , n)==0).  ){.  
29860 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
29870 65 73 74 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20  estFile = 0;.   
29880 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
29890 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
298a0 33 20 2a 70 44 65 73 74 3b 0a 20 20 20 20 73 71  3 *pDest;.    sq
298b0 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42  lite3_backup *pB
298c0 61 63 6b 75 70 3b 0a 20 20 20 20 69 6e 74 20 6a  ackup;.    int j
298d0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a  ;.    for(j=1; j
298e0 3c 6e 41 72 67 3b 20 6a 2b 2b 29 7b 0a 20 20 20  <nArg; j++){.   
298f0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
29900 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20   = azArg[j];.   
29910 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27     if( z[0]=='-'
29920 20 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c   ){.        whil
29930 65 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a  e( z[0]=='-' ) z
29940 2b 2b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e  ++;.        /* N
29950 6f 20 6f 70 74 69 6f 6e 73 20 74 6f 20 70 72 6f  o options to pro
29960 63 65 73 73 20 61 74 20 74 68 69 73 20 74 69 6d  cess at this tim
29970 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 0a 20  e */.        {. 
29980 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
29990 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e  intf(stderr, "un
299a0 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25 73  known option: %s
299b0 5c 6e 22 2c 20 61 7a 41 72 67 5b 6a 5d 29 3b 0a  \n", azArg[j]);.
299c0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
299d0 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
299e0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 44      }else if( zD
299f0 65 73 74 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20  estFile==0 ){.  
29a00 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c 65 20        zDestFile 
29a10 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20 20  = azArg[j];.    
29a20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 44 62 3d    }else if( zDb=
29a30 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 44  =0 ){.        zD
29a40 62 20 3d 20 7a 44 65 73 74 46 69 6c 65 3b 0a 20  b = zDestFile;. 
29a50 20 20 20 20 20 20 20 7a 44 65 73 74 46 69 6c 65         zDestFile
29a60 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20   = azArg[j];.   
29a70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29a80 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
29a90 65 72 72 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 61  err, "too many a
29aa0 72 67 75 6d 65 6e 74 73 20 74 6f 20 2e 62 61 63  rguments to .bac
29ab0 6b 75 70 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  kup\n");.       
29ac0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
29ad0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
29ae0 20 7a 44 65 73 74 46 69 6c 65 3d 3d 30 20 29 7b   zDestFile==0 ){
29af0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
29b00 66 28 73 74 64 65 72 72 2c 20 22 6d 69 73 73 69  f(stderr, "missi
29b10 6e 67 20 46 49 4c 45 4e 41 4d 45 20 61 72 67 75  ng FILENAME argu
29b20 6d 65 6e 74 20 6f 6e 20 2e 62 61 63 6b 75 70 5c  ment on .backup\
29b30 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  n");.      retur
29b40 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n 1;.    }.    i
29b50 66 28 20 7a 44 62 3d 3d 30 20 29 20 7a 44 62 20  f( zDb==0 ) zDb 
29b60 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 72 63  = "main";.    rc
29b70 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28   = sqlite3_open(
29b80 7a 44 65 73 74 46 69 6c 65 2c 20 26 70 44 65 73  zDestFile, &pDes
29b90 74 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  t);.    if( rc!=
29ba0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
29bb0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
29bc0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63  tderr, "Error: c
29bd0 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c  annot open \"%s\
29be0 22 5c 6e 22 2c 20 7a 44 65 73 74 46 69 6c 65 29  "\n", zDestFile)
29bf0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
29c00 63 6c 6f 73 65 28 70 44 65 73 74 29 3b 0a 20 20  close(pDest);.  
29c10 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
29c20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28    }.    open_db(
29c30 70 2c 20 30 29 3b 0a 20 20 20 20 70 42 61 63 6b  p, 0);.    pBack
29c40 75 70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63  up = sqlite3_bac
29c50 6b 75 70 5f 69 6e 69 74 28 70 44 65 73 74 2c 20  kup_init(pDest, 
29c60 22 6d 61 69 6e 22 2c 20 70 2d 3e 64 62 2c 20 7a  "main", p->db, z
29c70 44 62 29 3b 0a 20 20 20 20 69 66 28 20 70 42 61  Db);.    if( pBa
29c80 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ckup==0 ){.     
29c90 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
29ca0 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c  err, "Error: %s\
29cb0 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
29cc0 73 67 28 70 44 65 73 74 29 29 3b 0a 20 20 20 20  sg(pDest));.    
29cd0 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
29ce0 70 44 65 73 74 29 3b 0a 20 20 20 20 20 20 72 65  pDest);.      re
29cf0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
29d00 20 20 77 68 69 6c 65 28 20 20 28 72 63 20 3d 20    while(  (rc = 
29d10 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73  sqlite3_backup_s
29d20 74 65 70 28 70 42 61 63 6b 75 70 2c 31 30 30 29  tep(pBackup,100)
29d30 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 7d  )==SQLITE_OK ){}
29d40 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63  .    sqlite3_bac
29d50 6b 75 70 5f 66 69 6e 69 73 68 28 70 42 61 63 6b  kup_finish(pBack
29d60 75 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  up);.    if( rc=
29d70 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
29d80 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20        rc = 0;.  
29d90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
29da0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
29db0 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  r, "Error: %s\n"
29dc0 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
29dd0 28 70 44 65 73 74 29 29 3b 0a 20 20 20 20 20 20  (pDest));.      
29de0 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
29df0 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
29e00 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a  pDest);.  }else.
29e10 0a 20 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26  .  if( c=='b' &&
29e20 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70   n>=3 && strncmp
29e30 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 61 69 6c  (azArg[0], "bail
29e40 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
29e50 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20  if( nArg==2 ){. 
29e60 20 20 20 20 20 62 61 69 6c 5f 6f 6e 5f 65 72 72       bail_on_err
29e70 6f 72 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75  or = booleanValu
29e80 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  e(azArg[1]);.   
29e90 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
29ea0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
29eb0 20 22 55 73 61 67 65 3a 20 2e 62 61 69 6c 20 6f   "Usage: .bail o
29ec0 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20  n|off\n");.     
29ed0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
29ee0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
29ef0 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20 26 26 20  ='b' && n>=3 && 
29f00 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
29f10 2c 20 22 62 69 6e 61 72 79 22 2c 20 6e 29 3d 3d  , "binary", n)==
29f20 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  0 ){.    if( nAr
29f30 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66  g==2 ){.      if
29f40 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61  ( booleanValue(a
29f50 7a 41 72 67 5b 31 5d 29 20 29 7b 0a 20 20 20 20  zArg[1]) ){.    
29f60 20 20 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64      setBinaryMod
29f70 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20  e(p->out, 1);.  
29f80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29f90 20 20 20 73 65 74 54 65 78 74 4d 6f 64 65 28 70     setTextMode(p
29fa0 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20 20  ->out, 1);.     
29fb0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
29fc0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
29fd0 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
29fe0 62 69 6e 61 72 79 20 6f 6e 7c 6f 66 66 5c 6e 22  binary on|off\n"
29ff0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
2a000 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
2a010 20 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20    if( c=='c' && 
2a020 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  strcmp(azArg[0],
2a030 22 63 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  "cd")==0 ){.    
2a040 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 23  if( nArg==2 ){.#
2a050 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  if defined(_WIN3
2a060 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49  2) || defined(WI
2a070 4e 33 32 29 0a 20 20 20 20 20 20 77 63 68 61 72  N32).      wchar
2a080 5f 74 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f  _t *z = sqlite3_
2a090 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 75 6e  win32_utf8_to_un
2a0a0 69 63 6f 64 65 28 61 7a 41 72 67 5b 31 5d 29 3b  icode(azArg[1]);
2a0b0 0a 20 20 20 20 20 20 72 63 20 3d 20 21 53 65 74  .      rc = !Set
2a0c0 43 75 72 72 65 6e 74 44 69 72 65 63 74 6f 72 79  CurrentDirectory
2a0d0 57 28 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  W(z);.      sqli
2a0e0 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 23 65 6c  te3_free(z);.#el
2a0f0 73 65 0a 20 20 20 20 20 20 72 63 20 3d 20 63 68  se.      rc = ch
2a100 64 69 72 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 23  dir(azArg[1]);.#
2a110 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28 20  endif.      if( 
2a120 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  rc ){.        ut
2a130 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2a140 2c 20 22 43 61 6e 6e 6f 74 20 63 68 61 6e 67 65  , "Cannot change
2a150 20 74 6f 20 64 69 72 65 63 74 6f 72 79 20 5c 22   to directory \"
2a160 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31  %s\"\n", azArg[1
2a170 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ]);.        rc =
2a180 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
2a190 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
2a1a0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2a1b0 22 55 73 61 67 65 3a 20 2e 63 64 20 44 49 52 45  "Usage: .cd DIRE
2a1c0 43 54 4f 52 59 5c 6e 22 29 3b 0a 20 20 20 20 20  CTORY\n");.     
2a1d0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
2a1e0 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 54 68 65   }else..  /* The
2a1f0 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64 20 22 2e   undocumented ".
2a200 62 72 65 61 6b 70 6f 69 6e 74 22 20 63 6f 6d 6d  breakpoint" comm
2a210 61 6e 64 20 63 61 75 73 65 73 20 61 20 63 61 6c  and causes a cal
2a220 6c 20 74 6f 20 74 68 65 20 6e 6f 2d 6f 70 0a 20  l to the no-op. 
2a230 20 2a 2a 20 72 6f 75 74 69 6e 65 20 6e 61 6d 65   ** routine name
2a240 64 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e  d test_breakpoin
2a250 74 28 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  t()..  */.  if( 
2a260 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20 26  c=='b' && n>=3 &
2a270 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2a280 30 5d 2c 20 22 62 72 65 61 6b 70 6f 69 6e 74 22  0], "breakpoint"
2a290 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74  , n)==0 ){.    t
2a2a0 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 29  est_breakpoint()
2a2b0 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
2a2c0 20 63 3d 3d 27 63 27 20 26 26 20 6e 3e 3d 33 20   c=='c' && n>=3 
2a2d0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2a2e0 5b 30 5d 2c 20 22 63 68 61 6e 67 65 73 22 2c 20  [0], "changes", 
2a2f0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  n)==0 ){.    if(
2a300 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
2a310 20 20 73 65 74 4f 72 43 6c 65 61 72 46 6c 61 67    setOrClearFlag
2a320 28 70 2c 20 53 48 46 4c 47 5f 43 6f 75 6e 74 43  (p, SHFLG_CountC
2a330 68 61 6e 67 65 73 2c 20 61 7a 41 72 67 5b 31 5d  hanges, azArg[1]
2a340 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
2a350 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2a360 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
2a370 63 68 61 6e 67 65 73 20 6f 6e 7c 6f 66 66 5c 6e  changes on|off\n
2a380 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
2a390 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
2a3a0 0a 20 20 2f 2a 20 43 61 6e 63 65 6c 20 6f 75 74  .  /* Cancel out
2a3b0 70 75 74 20 72 65 64 69 72 65 63 74 69 6f 6e 2c  put redirection,
2a3c0 20 69 66 20 69 74 20 69 73 20 63 75 72 72 65 6e   if it is curren
2a3d0 74 6c 79 20 73 65 74 20 28 62 79 20 2e 74 65 73  tly set (by .tes
2a3e0 74 63 61 73 65 29 0a 20 20 2a 2a 20 54 68 65 6e  tcase).  ** Then
2a3f0 20 72 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e   read the conten
2a400 74 20 6f 66 20 74 68 65 20 74 65 73 74 63 61 73  t of the testcas
2a410 65 2d 6f 75 74 2e 74 78 74 20 66 69 6c 65 20 61  e-out.txt file a
2a420 6e 64 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e  nd compare again
2a430 73 74 0a 20 20 2a 2a 20 61 7a 41 72 67 5b 31 5d  st.  ** azArg[1]
2a440 2e 20 20 49 66 20 74 68 65 72 65 20 61 72 65 20  .  If there are 
2a450 64 69 66 66 65 72 65 6e 63 65 73 2c 20 72 65 70  differences, rep
2a460 6f 72 74 20 61 6e 20 65 72 72 6f 72 20 61 6e 64  ort an error and
2a470 20 65 78 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66   exit..  */.  if
2a480 28 20 63 3d 3d 27 63 27 20 26 26 20 6e 3e 3d 33  ( c=='c' && n>=3
2a490 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2a4a0 67 5b 30 5d 2c 20 22 63 68 65 63 6b 22 2c 20 6e  g[0], "check", n
2a4b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  )==0 ){.    char
2a4c0 20 2a 7a 52 65 73 20 3d 20 30 3b 0a 20 20 20 20   *zRes = 0;.    
2a4d0 6f 75 74 70 75 74 5f 72 65 73 65 74 28 70 29 3b  output_reset(p);
2a4e0 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 32  .    if( nArg!=2
2a4f0 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
2a500 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
2a510 61 67 65 3a 20 2e 63 68 65 63 6b 20 47 4c 4f 42  age: .check GLOB
2a520 2d 50 41 54 54 45 52 4e 5c 6e 22 29 3b 0a 20 20  -PATTERN\n");.  
2a530 20 20 20 20 72 63 20 3d 20 32 3b 0a 20 20 20 20      rc = 2;.    
2a540 7d 65 6c 73 65 20 69 66 28 20 28 7a 52 65 73 20  }else if( (zRes 
2a550 3d 20 72 65 61 64 46 69 6c 65 28 22 74 65 73 74  = readFile("test
2a560 63 61 73 65 2d 6f 75 74 2e 74 78 74 22 2c 20 30  case-out.txt", 0
2a570 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ))==0 ){.      r
2a580 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
2a590 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74  , "Error: cannot
2a5a0 20 72 65 61 64 20 27 74 65 73 74 63 61 73 65 2d   read 'testcase-
2a5b0 6f 75 74 2e 74 78 74 27 5c 6e 22 29 3b 0a 20 20  out.txt'\n");.  
2a5c0 20 20 20 20 72 63 20 3d 20 32 3b 0a 20 20 20 20      rc = 2;.    
2a5d0 7d 65 6c 73 65 20 69 66 28 20 74 65 73 74 63 61  }else if( testca
2a5e0 73 65 5f 67 6c 6f 62 28 61 7a 41 72 67 5b 31 5d  se_glob(azArg[1]
2a5f0 2c 7a 52 65 73 29 3d 3d 30 20 29 7b 0a 20 20 20  ,zRes)==0 ){.   
2a600 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2a610 74 64 65 72 72 2c 0a 20 20 20 20 20 20 20 20 20  tderr,.         
2a620 20 20 20 20 20 20 20 20 22 74 65 73 74 63 61 73          "testcas
2a630 65 2d 25 73 20 46 41 49 4c 45 44 5c 6e 20 45 78  e-%s FAILED\n Ex
2a640 70 65 63 74 65 64 3a 20 5b 25 73 5d 5c 6e 20 20  pected: [%s]\n  
2a650 20 20 20 20 47 6f 74 3a 20 5b 25 73 5d 5c 6e 22      Got: [%s]\n"
2a660 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2a670 20 20 20 70 2d 3e 7a 54 65 73 74 63 61 73 65 2c     p->zTestcase,
2a680 20 61 7a 41 72 67 5b 31 5d 2c 20 7a 52 65 73 29   azArg[1], zRes)
2a690 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
2a6a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a6b0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2a6c0 6f 75 74 2c 20 22 74 65 73 74 63 61 73 65 2d 25  out, "testcase-%
2a6d0 73 20 6f 6b 5c 6e 22 2c 20 70 2d 3e 7a 54 65 73  s ok\n", p->zTes
2a6e0 74 63 61 73 65 29 3b 0a 20 20 20 20 20 20 70 2d  tcase);.      p-
2a6f0 3e 6e 43 68 65 63 6b 2b 2b 3b 0a 20 20 20 20 7d  >nCheck++;.    }
2a700 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
2a710 65 28 7a 52 65 73 29 3b 0a 20 20 7d 65 6c 73 65  e(zRes);.  }else
2a720 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63 27 20 26  ..  if( c=='c' &
2a730 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2a740 30 5d 2c 20 22 63 6c 6f 6e 65 22 2c 20 6e 29 3d  0], "clone", n)=
2a750 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
2a760 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 74  rg==2 ){.      t
2a770 72 79 54 6f 43 6c 6f 6e 65 28 70 2c 20 61 7a 41  ryToClone(p, azA
2a780 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  rg[1]);.    }els
2a790 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
2a7a0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
2a7b0 67 65 3a 20 2e 63 6c 6f 6e 65 20 46 49 4c 45 4e  ge: .clone FILEN
2a7c0 41 4d 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  AME\n");.      r
2a7d0 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
2a7e0 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
2a7f0 64 27 20 26 26 20 6e 3e 31 20 26 26 20 73 74 72  d' && n>1 && str
2a800 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2a810 64 61 74 61 62 61 73 65 73 22 2c 20 6e 29 3d 3d  databases", n)==
2a820 30 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c 53 74  0 ){.    ShellSt
2a830 61 74 65 20 64 61 74 61 3b 0a 20 20 20 20 63 68  ate data;.    ch
2a840 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
2a850 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
2a860 30 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  0);.    memcpy(&
2a870 64 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28  data, p, sizeof(
2a880 64 61 74 61 29 29 3b 0a 20 20 20 20 64 61 74 61  data));.    data
2a890 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b  .showHeader = 0;
2a8a0 0a 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20  .    data.cMode 
2a8b0 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f  = data.mode = MO
2a8c0 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 73 71 6c  DE_List;.    sql
2a8d0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
2a8e0 7a 65 6f 66 28 64 61 74 61 2e 63 6f 6c 53 65 70  zeof(data.colSep
2a8f0 61 72 61 74 6f 72 29 2c 64 61 74 61 2e 63 6f 6c  arator),data.col
2a900 53 65 70 61 72 61 74 6f 72 2c 22 3a 20 22 29 3b  Separator,": ");
2a910 0a 20 20 20 20 64 61 74 61 2e 63 6e 74 20 3d 20  .    data.cnt = 
2a920 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65  0;.    sqlite3_e
2a930 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45  xec(p->db, "SELE
2a940 43 54 20 6e 61 6d 65 2c 20 66 69 6c 65 20 46 52  CT name, file FR
2a950 4f 4d 20 70 72 61 67 6d 61 5f 64 61 74 61 62 61  OM pragma_databa
2a960 73 65 5f 6c 69 73 74 22 2c 0a 20 20 20 20 20 20  se_list",.      
2a970 20 20 20 20 20 20 20 20 20 20 20 63 61 6c 6c 62             callb
2a980 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72  ack, &data, &zEr
2a990 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20 7a  rMsg);.    if( z
2a9a0 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
2a9b0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
2a9c0 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  rr,"Error: %s\n"
2a9d0 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  , zErrMsg);.    
2a9e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2a9f0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72  ErrMsg);.      r
2aa00 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
2aa10 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
2aa20 64 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  d' && strncmp(az
2aa30 41 72 67 5b 30 5d 2c 20 22 64 62 69 6e 66 6f 22  Arg[0], "dbinfo"
2aa40 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  , n)==0 ){.    r
2aa50 63 20 3d 20 73 68 65 6c 6c 5f 64 62 69 6e 66 6f  c = shell_dbinfo
2aa60 5f 63 6f 6d 6d 61 6e 64 28 70 2c 20 6e 41 72 67  _command(p, nArg
2aa70 2c 20 61 7a 41 72 67 29 3b 0a 20 20 7d 65 6c 73  , azArg);.  }els
2aa80 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64 27 20  e..  if( c=='d' 
2aa90 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2aaa0 5b 30 5d 2c 20 22 64 75 6d 70 22 2c 20 6e 29 3d  [0], "dump", n)=
2aab0 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
2aac0 63 68 61 72 20 2a 7a 4c 69 6b 65 20 3d 20 30 3b  char *zLike = 0;
2aad0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
2aae0 69 6e 74 20 73 61 76 65 64 53 68 6f 77 48 65 61  int savedShowHea
2aaf0 64 65 72 20 3d 20 70 2d 3e 73 68 6f 77 48 65 61  der = p->showHea
2ab00 64 65 72 3b 0a 20 20 20 20 53 68 65 6c 6c 43 6c  der;.    ShellCl
2ab10 65 61 72 46 6c 61 67 28 70 2c 20 53 48 46 4c 47  earFlag(p, SHFLG
2ab20 5f 50 72 65 73 65 72 76 65 52 6f 77 69 64 7c 53  _PreserveRowid|S
2ab30 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29 3b 0a  HFLG_Newlines);.
2ab40 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
2ab50 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
2ab60 20 69 66 28 20 61 7a 41 72 67 5b 69 5d 5b 30 5d   if( azArg[i][0]
2ab70 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20  =='-' ){.       
2ab80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
2ab90 20 61 7a 41 72 67 5b 69 5d 2b 31 3b 0a 20 20 20   azArg[i]+1;.   
2aba0 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27       if( z[0]=='
2abb0 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20  -' ) z++;.      
2abc0 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22    if( strcmp(z,"
2abd0 70 72 65 73 65 72 76 65 2d 72 6f 77 69 64 73 22  preserve-rowids"
2abe0 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53  )==0 ){.#ifdef S
2abf0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
2ac00 41 4c 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20  ALTABLE.        
2ac10 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2ac20 65 72 72 2c 20 22 54 68 65 20 2d 2d 70 72 65 73  err, "The --pres
2ac30 65 72 76 65 2d 72 6f 77 69 64 73 20 6f 70 74 69  erve-rowids opti
2ac40 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61 74  on is not compat
2ac50 69 62 6c 65 22 0a 20 20 20 20 20 20 20 20 20 20  ible".          
2ac60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac70 20 20 20 22 20 77 69 74 68 20 53 51 4c 49 54 45     " with SQLITE
2ac80 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
2ac90 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  LE\n");.        
2aca0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
2acb0 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
2acc0 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 23 65 6c 73  mmand_exit;.#els
2acd0 65 0a 20 20 20 20 20 20 20 20 20 20 53 68 65 6c  e.          Shel
2ace0 6c 53 65 74 46 6c 61 67 28 70 2c 20 53 48 46 4c  lSetFlag(p, SHFL
2acf0 47 5f 50 72 65 73 65 72 76 65 52 6f 77 69 64 29  G_PreserveRowid)
2ad00 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  ;.#endif.       
2ad10 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69   }else.        i
2ad20 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 6e 65 77  f( strcmp(z,"new
2ad30 6c 69 6e 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20  lines")==0 ){.  
2ad40 20 20 20 20 20 20 20 20 53 68 65 6c 6c 53 65 74          ShellSet
2ad50 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65  Flag(p, SHFLG_Ne
2ad60 77 6c 69 6e 65 73 29 3b 0a 20 20 20 20 20 20 20  wlines);.       
2ad70 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 7b   }else.        {
2ad80 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
2ad90 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
2ada0 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 20 5c 22  nknown option \"
2adb0 25 73 5c 22 20 6f 6e 20 5c 22 2e 64 75 6d 70 5c  %s\" on \".dump\
2adc0 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  "\n", azArg[i]);
2add0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2ade0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  1;.          got
2adf0 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
2ae00 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xit;.        }. 
2ae10 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a       }else if( z
2ae20 4c 69 6b 65 20 29 7b 0a 20 20 20 20 20 20 20 20  Like ){.        
2ae30 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2ae40 72 2c 20 22 55 73 61 67 65 3a 20 2e 64 75 6d 70  r, "Usage: .dump
2ae50 20 3f 2d 2d 70 72 65 73 65 72 76 65 2d 72 6f 77   ?--preserve-row
2ae60 69 64 73 3f 20 22 0a 20 20 20 20 20 20 20 20 20  ids? ".         
2ae70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae80 20 20 22 3f 2d 2d 6e 65 77 6c 69 6e 65 73 3f 20    "?--newlines? 
2ae90 3f 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e  ?LIKE-PATTERN?\n
2aea0 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ");.        rc =
2aeb0 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
2aec0 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
2aed0 69 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  it;.      }else{
2aee0 0a 20 20 20 20 20 20 20 20 7a 4c 69 6b 65 20 3d  .        zLike =
2aef0 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20   azArg[i];.     
2af00 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65   }.    }.    ope
2af10 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20  n_db(p, 0);.    
2af20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69 6e 67 20  /* When playing 
2af30 62 61 63 6b 20 61 20 22 64 75 6d 70 22 2c 20 74  back a "dump", t
2af40 68 65 20 63 6f 6e 74 65 6e 74 20 6d 69 67 68 74  he content might
2af50 20 61 70 70 65 61 72 20 69 6e 20 61 6e 20 6f 72   appear in an or
2af60 64 65 72 0a 20 20 20 20 2a 2a 20 77 68 69 63 68  der.    ** which
2af70 20 63 61 75 73 65 73 20 69 6d 6d 65 64 69 61 74   causes immediat
2af80 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  e foreign key co
2af90 6e 73 74 72 61 69 6e 74 73 20 74 6f 20 62 65 20  nstraints to be 
2afa0 76 69 6f 6c 61 74 65 64 2e 0a 20 20 20 20 2a 2a  violated..    **
2afb0 20 53 6f 20 64 69 73 61 62 6c 65 20 66 6f 72 65   So disable fore
2afc0 69 67 6e 2d 6b 65 79 20 63 6f 6e 73 74 72 61 69  ign-key constrai
2afd0 6e 74 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 74  nt enforcement t
2afe0 6f 20 70 72 65 76 65 6e 74 20 70 72 6f 62 6c 65  o prevent proble
2aff0 6d 73 2e 20 2a 2f 0a 20 20 20 20 72 61 77 5f 70  ms. */.    raw_p
2b000 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50  rintf(p->out, "P
2b010 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65  RAGMA foreign_ke
2b020 79 73 3d 4f 46 46 3b 5c 6e 22 29 3b 0a 20 20 20  ys=OFF;\n");.   
2b030 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
2b040 75 74 2c 20 22 42 45 47 49 4e 20 54 52 41 4e 53  ut, "BEGIN TRANS
2b050 41 43 54 49 4f 4e 3b 5c 6e 22 29 3b 0a 20 20 20  ACTION;\n");.   
2b060 20 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65   p->writableSche
2b070 6d 61 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73  ma = 0;.    p->s
2b080 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20  howHeader = 0;. 
2b090 20 20 20 2f 2a 20 53 65 74 20 77 72 69 74 61 62     /* Set writab
2b0a0 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 20 73 69 6e  le_schema=ON sin
2b0b0 63 65 20 64 6f 69 6e 67 20 73 6f 20 66 6f 72 63  ce doing so forc
2b0c0 65 73 20 53 51 4c 69 74 65 20 74 6f 20 69 6e 69  es SQLite to ini
2b0d0 74 69 61 6c 69 7a 65 0a 20 20 20 20 2a 2a 20 61  tialize.    ** a
2b0e0 73 20 6d 75 63 68 20 6f 66 20 74 68 65 20 73 63  s much of the sc
2b0f0 68 65 6d 61 20 61 73 20 69 74 20 63 61 6e 20 65  hema as it can e
2b100 76 65 6e 20 69 66 20 74 68 65 20 73 71 6c 69 74  ven if the sqlit
2b110 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 20 69  e_master table i
2b120 73 0a 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74  s.    ** corrupt
2b130 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  . */.    sqlite3
2b140 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 41  _exec(p->db, "SA
2b150 56 45 50 4f 49 4e 54 20 64 75 6d 70 3b 20 50 52  VEPOINT dump; PR
2b160 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63  AGMA writable_sc
2b170 68 65 6d 61 3d 4f 4e 22 2c 20 30 2c 20 30 2c 20  hema=ON", 0, 0, 
2b180 30 29 3b 0a 20 20 20 20 70 2d 3e 6e 45 72 72 20  0);.    p->nErr 
2b190 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 7a 4c 69  = 0;.    if( zLi
2b1a0 6b 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ke==0 ){.      r
2b1b0 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71  un_schema_dump_q
2b1c0 75 65 72 79 28 70 2c 0a 20 20 20 20 20 20 20 20  uery(p,.        
2b1d0 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79  "SELECT name, ty
2b1e0 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c  pe, sql FROM sql
2b1f0 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20  ite_master ".   
2b200 20 20 20 20 20 22 57 48 45 52 45 20 73 71 6c 20       "WHERE sql 
2b210 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79 70  NOT NULL AND typ
2b220 65 3d 3d 27 74 61 62 6c 65 27 20 41 4e 44 20 6e  e=='table' AND n
2b230 61 6d 65 21 3d 27 73 71 6c 69 74 65 5f 73 65 71  ame!='sqlite_seq
2b240 75 65 6e 63 65 27 22 0a 20 20 20 20 20 20 29 3b  uence'".      );
2b250 0a 20 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d  .      run_schem
2b260 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 0a  a_dump_query(p,.
2b270 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20          "SELECT 
2b280 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c 20  name, type, sql 
2b290 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
2b2a0 65 72 20 22 0a 20 20 20 20 20 20 20 20 22 57 48  er ".        "WH
2b2b0 45 52 45 20 6e 61 6d 65 3d 3d 27 73 71 6c 69 74  ERE name=='sqlit
2b2c0 65 5f 73 65 71 75 65 6e 63 65 27 22 0a 20 20 20  e_sequence'".   
2b2d0 20 20 20 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f     );.      run_
2b2e0 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79  table_dump_query
2b2f0 28 70 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c  (p,.        "SEL
2b300 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c  ECT sql FROM sql
2b310 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20  ite_master ".   
2b320 20 20 20 20 20 22 57 48 45 52 45 20 73 71 6c 20       "WHERE sql 
2b330 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79 70  NOT NULL AND typ
2b340 65 20 49 4e 20 28 27 69 6e 64 65 78 27 2c 27 74  e IN ('index','t
2b350 72 69 67 67 65 72 27 2c 27 76 69 65 77 27 29 22  rigger','view')"
2b360 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  , 0.      );.   
2b370 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68   }else{.      ch
2b380 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 20 20  ar *zSql;.      
2b390 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
2b3a0 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
2b3b0 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79  "SELECT name, ty
2b3c0 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c  pe, sql FROM sql
2b3d0 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20  ite_master ".   
2b3e0 20 20 20 20 20 22 57 48 45 52 45 20 74 62 6c 5f       "WHERE tbl_
2b3f0 6e 61 6d 65 20 4c 49 4b 45 20 25 51 20 41 4e 44  name LIKE %Q AND
2b400 20 74 79 70 65 3d 3d 27 74 61 62 6c 65 27 22 0a   type=='table'".
2b410 20 20 20 20 20 20 20 20 22 20 20 41 4e 44 20 73          "  AND s
2b420 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22 2c 20 7a 4c  ql NOT NULL", zL
2b430 69 6b 65 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f  ike);.      run_
2b440 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72  schema_dump_quer
2b450 79 28 70 2c 7a 53 71 6c 29 3b 0a 20 20 20 20 20  y(p,zSql);.     
2b460 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
2b470 71 6c 29 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20  ql);.      zSql 
2b480 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2b490 66 28 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45  f(.        "SELE
2b4a0 43 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  CT sql FROM sqli
2b4b0 74 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20  te_master ".    
2b4c0 20 20 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e      "WHERE sql N
2b4d0 4f 54 20 4e 55 4c 4c 22 0a 20 20 20 20 20 20 20  OT NULL".       
2b4e0 20 22 20 20 41 4e 44 20 74 79 70 65 20 49 4e 20   "  AND type IN 
2b4f0 28 27 69 6e 64 65 78 27 2c 27 74 72 69 67 67 65  ('index','trigge
2b500 72 27 2c 27 76 69 65 77 27 29 22 0a 20 20 20 20  r','view')".    
2b510 20 20 20 20 22 20 20 41 4e 44 20 74 62 6c 5f 6e      "  AND tbl_n
2b520 61 6d 65 20 4c 49 4b 45 20 25 51 22 2c 20 7a 4c  ame LIKE %Q", zL
2b530 69 6b 65 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f  ike);.      run_
2b540 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79  table_dump_query
2b550 28 70 2c 20 7a 53 71 6c 2c 20 30 29 3b 0a 20 20  (p, zSql, 0);.  
2b560 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2b570 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20  (zSql);.    }.  
2b580 20 20 69 66 28 20 70 2d 3e 77 72 69 74 61 62 6c    if( p->writabl
2b590 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  eSchema ){.     
2b5a0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
2b5b0 75 74 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74  ut, "PRAGMA writ
2b5c0 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b  able_schema=OFF;
2b5d0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77  \n");.      p->w
2b5e0 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20  ritableSchema = 
2b5f0 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  0;.    }.    sql
2b600 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
2b610 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c   "PRAGMA writabl
2b620 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 22 2c 20  e_schema=OFF;", 
2b630 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
2b640 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
2b650 2c 20 22 52 45 4c 45 41 53 45 20 64 75 6d 70 3b  , "RELEASE dump;
2b660 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ", 0, 0, 0);.   
2b670 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
2b680 75 74 2c 20 70 2d 3e 6e 45 72 72 20 3f 20 22 52  ut, p->nErr ? "R
2b690 4f 4c 4c 42 41 43 4b 3b 20 2d 2d 20 64 75 65 20  OLLBACK; -- due 
2b6a0 74 6f 20 65 72 72 6f 72 73 5c 6e 22 20 3a 20 22  to errors\n" : "
2b6b0 43 4f 4d 4d 49 54 3b 5c 6e 22 29 3b 0a 20 20 20  COMMIT;\n");.   
2b6c0 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d   p->showHeader =
2b6d0 20 73 61 76 65 64 53 68 6f 77 48 65 61 64 65 72   savedShowHeader
2b6e0 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
2b6f0 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63   c=='e' && strnc
2b700 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 63  mp(azArg[0], "ec
2b710 68 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ho", n)==0 ){.  
2b720 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b    if( nArg==2 ){
2b730 0a 20 20 20 20 20 20 73 65 74 4f 72 43 6c 65 61  .      setOrClea
2b740 72 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 45  rFlag(p, SHFLG_E
2b750 63 68 6f 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  cho, azArg[1]);.
2b760 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b770 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2b780 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 65 63 68  rr, "Usage: .ech
2b790 6f 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20  o on|off\n");.  
2b7a0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2b7b0 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
2b7c0 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63   c=='e' && strnc
2b7d0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 71  mp(azArg[0], "eq
2b7e0 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  p", n)==0 ){.   
2b7f0 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a   if( nArg==2 ){.
2b800 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
2b810 28 61 7a 41 72 67 5b 31 5d 2c 22 66 75 6c 6c 22  (azArg[1],"full"
2b820 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2b830 70 2d 3e 61 75 74 6f 45 51 50 20 3d 20 41 55 54  p->autoEQP = AUT
2b840 4f 45 51 50 5f 66 75 6c 6c 3b 0a 20 20 20 20 20  OEQP_full;.     
2b850 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
2b860 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74 72 69 67  p(azArg[1],"trig
2b870 67 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ger")==0 ){.    
2b880 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50 20 3d      p->autoEQP =
2b890 20 41 55 54 4f 45 51 50 5f 74 72 69 67 67 65 72   AUTOEQP_trigger
2b8a0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2b8b0 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51         p->autoEQ
2b8c0 50 20 3d 20 28 75 38 29 62 6f 6f 6c 65 61 6e 56  P = (u8)booleanV
2b8d0 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a  alue(azArg[1]);.
2b8e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2b8f0 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
2b900 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
2b910 67 65 3a 20 2e 65 71 70 20 6f 66 66 7c 6f 6e 7c  ge: .eqp off|on|
2b920 74 72 69 67 67 65 72 7c 66 75 6c 6c 5c 6e 22 29  trigger|full\n")
2b930 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
2b940 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
2b950 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73   if( c=='e' && s
2b960 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2b970 20 22 65 78 69 74 22 2c 20 6e 29 3d 3d 30 20 29   "exit", n)==0 )
2b980 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 31  {.    if( nArg>1
2b990 20 26 26 20 28 72 63 20 3d 20 28 69 6e 74 29 69   && (rc = (int)i
2b9a0 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72  ntegerValue(azAr
2b9b0 67 5b 31 5d 29 29 21 3d 30 20 29 20 65 78 69 74  g[1]))!=0 ) exit
2b9c0 28 72 63 29 3b 0a 20 20 20 20 72 63 20 3d 20 32  (rc);.    rc = 2
2b9d0 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20  ;.  }else..  /* 
2b9e0 54 68 65 20 22 2e 65 78 70 6c 61 69 6e 22 20 63  The ".explain" c
2b9f0 6f 6d 6d 61 6e 64 20 69 73 20 61 75 74 6f 6d 61  ommand is automa
2ba00 74 69 63 20 6e 6f 77 2e 20 20 49 74 20 69 73 20  tic now.  It is 
2ba10 6c 61 72 67 65 6c 79 20 70 6f 69 6e 74 6c 65 73  largely pointles
2ba20 73 2e 20 20 49 74 0a 20 20 2a 2a 20 72 65 74 61  s.  It.  ** reta
2ba30 69 6e 65 64 20 70 75 72 65 6c 79 20 66 6f 72 20  ined purely for 
2ba40 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
2ba50 69 62 69 6c 69 74 79 20 2a 2f 0a 20 20 69 66 28  ibility */.  if(
2ba60 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63   c=='e' && strnc
2ba70 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78  mp(azArg[0], "ex
2ba80 70 6c 61 69 6e 22 2c 20 6e 29 3d 3d 30 20 29 7b  plain", n)==0 ){
2ba90 0a 20 20 20 20 69 6e 74 20 76 61 6c 20 3d 20 31  .    int val = 1
2baa0 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 3d  ;.    if( nArg>=
2bab0 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  2 ){.      if( s
2bac0 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  trcmp(azArg[1],"
2bad0 61 75 74 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20  auto")==0 ){.   
2bae0 20 20 20 20 20 76 61 6c 20 3d 20 39 39 3b 0a 20       val = 99;. 
2baf0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2bb00 20 20 20 20 76 61 6c 20 3d 20 20 62 6f 6f 6c 65      val =  boole
2bb10 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d  anValue(azArg[1]
2bb20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2bb30 0a 20 20 20 20 69 66 28 20 76 61 6c 3d 3d 31 20  .    if( val==1 
2bb40 26 26 20 70 2d 3e 6d 6f 64 65 21 3d 4d 4f 44 45  && p->mode!=MODE
2bb50 5f 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  _Explain ){.    
2bb60 20 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 20    p->normalMode 
2bb70 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20  = p->mode;.     
2bb80 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
2bb90 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 70  Explain;.      p
2bba0 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20 3d 20  ->autoExplain = 
2bbb0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
2bbc0 20 76 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20   val==0 ){.     
2bbd0 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f   if( p->mode==MO
2bbe0 44 45 5f 45 78 70 6c 61 69 6e 20 29 20 70 2d 3e  DE_Explain ) p->
2bbf0 6d 6f 64 65 20 3d 20 70 2d 3e 6e 6f 72 6d 61 6c  mode = p->normal
2bc00 4d 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e 61  Mode;.      p->a
2bc10 75 74 6f 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a  utoExplain = 0;.
2bc20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 76 61      }else if( va
2bc30 6c 3d 3d 39 39 20 29 7b 0a 20 20 20 20 20 20 69  l==99 ){.      i
2bc40 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45  f( p->mode==MODE
2bc50 5f 45 78 70 6c 61 69 6e 20 29 20 70 2d 3e 6d 6f  _Explain ) p->mo
2bc60 64 65 20 3d 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f  de = p->normalMo
2bc70 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74  de;.      p->aut
2bc80 6f 45 78 70 6c 61 69 6e 20 3d 20 31 3b 0a 20 20  oExplain = 1;.  
2bc90 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66    }.  }else..#if
2bca0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2bcb0 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20  _VIRTUALTABLE.  
2bcc0 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74  if( c=='e' && st
2bcd0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2bce0 22 65 78 70 65 72 74 22 2c 20 6e 29 3d 3d 30 20  "expert", n)==0 
2bcf0 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  ){.    open_db(p
2bd00 2c 20 30 29 3b 0a 20 20 20 20 65 78 70 65 72 74  , 0);.    expert
2bd10 44 6f 74 43 6f 6d 6d 61 6e 64 28 70 2c 20 61 7a  DotCommand(p, az
2bd20 41 72 67 2c 20 6e 41 72 67 29 3b 0a 20 20 7d 65  Arg, nArg);.  }e
2bd30 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  lse.#endif..  if
2bd40 28 20 63 3d 3d 27 66 27 20 26 26 20 73 74 72 6e  ( c=='f' && strn
2bd50 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 66  cmp(azArg[0], "f
2bd60 75 6c 6c 73 63 68 65 6d 61 22 2c 20 6e 29 3d 3d  ullschema", n)==
2bd70 30 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c 53 74  0 ){.    ShellSt
2bd80 61 74 65 20 64 61 74 61 3b 0a 20 20 20 20 63 68  ate data;.    ch
2bd90 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b  ar *zErrMsg = 0;
2bda0 0a 20 20 20 20 69 6e 74 20 64 6f 53 74 61 74 73  .    int doStats
2bdb0 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 63 70 79   = 0;.    memcpy
2bdc0 28 26 64 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f  (&data, p, sizeo
2bdd0 66 28 64 61 74 61 29 29 3b 0a 20 20 20 20 64 61  f(data));.    da
2bde0 74 61 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20  ta.showHeader = 
2bdf0 30 3b 0a 20 20 20 20 64 61 74 61 2e 63 4d 6f 64  0;.    data.cMod
2be00 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20  e = data.mode = 
2be10 4d 4f 44 45 5f 53 65 6d 69 3b 0a 20 20 20 20 69  MODE_Semi;.    i
2be20 66 28 20 6e 41 72 67 3d 3d 32 20 26 26 20 6f 70  f( nArg==2 && op
2be30 74 69 6f 6e 4d 61 74 63 68 28 61 7a 41 72 67 5b  tionMatch(azArg[
2be40 31 5d 2c 20 22 69 6e 64 65 6e 74 22 29 20 29 7b  1], "indent") ){
2be50 0a 20 20 20 20 20 20 64 61 74 61 2e 63 4d 6f 64  .      data.cMod
2be60 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20  e = data.mode = 
2be70 4d 4f 44 45 5f 50 72 65 74 74 79 3b 0a 20 20 20  MODE_Pretty;.   
2be80 20 20 20 6e 41 72 67 20 3d 20 31 3b 0a 20 20 20     nArg = 1;.   
2be90 20 7d 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21   }.    if( nArg!
2bea0 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  =1 ){.      raw_
2beb0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2bec0 55 73 61 67 65 3a 20 2e 66 75 6c 6c 73 63 68 65  Usage: .fullsche
2bed0 6d 61 20 3f 2d 2d 69 6e 64 65 6e 74 3f 5c 6e 22  ma ?--indent?\n"
2bee0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
2bef0 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61  .      goto meta
2bf00 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
2bf10 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62     }.    open_db
2bf20 28 70 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d  (p, 0);.    rc =
2bf30 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
2bf40 3e 64 62 2c 0a 20 20 20 20 20 20 20 22 53 45 4c  >db,.       "SEL
2bf50 45 43 54 20 73 71 6c 20 46 52 4f 4d 22 0a 20 20  ECT sql FROM".  
2bf60 20 20 20 20 20 22 20 20 28 53 45 4c 45 43 54 20       "  (SELECT 
2bf70 73 71 6c 20 73 71 6c 2c 20 74 79 70 65 20 74 79  sql sql, type ty
2bf80 70 65 2c 20 74 62 6c 5f 6e 61 6d 65 20 74 62 6c  pe, tbl_name tbl
2bf90 5f 6e 61 6d 65 2c 20 6e 61 6d 65 20 6e 61 6d 65  _name, name name
2bfa0 2c 20 72 6f 77 69 64 20 78 22 0a 20 20 20 20 20  , rowid x".     
2bfb0 20 20 22 20 20 20 20 20 46 52 4f 4d 20 73 71 6c    "     FROM sql
2bfc0 69 74 65 5f 6d 61 73 74 65 72 20 55 4e 49 4f 4e  ite_master UNION
2bfd0 20 41 4c 4c 22 0a 20 20 20 20 20 20 20 22 20 20   ALL".       "  
2bfe0 20 53 45 4c 45 43 54 20 73 71 6c 2c 20 74 79 70   SELECT sql, typ
2bff0 65 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d  e, tbl_name, nam
2c000 65 2c 20 72 6f 77 69 64 20 46 52 4f 4d 20 73 71  e, rowid FROM sq
2c010 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
2c020 29 20 22 0a 20 20 20 20 20 20 20 22 57 48 45 52  ) ".       "WHER
2c030 45 20 74 79 70 65 21 3d 27 6d 65 74 61 27 20 41  E type!='meta' A
2c040 4e 44 20 73 71 6c 20 4e 4f 54 4e 55 4c 4c 20 41  ND sql NOTNULL A
2c050 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45  ND name NOT LIKE
2c060 20 27 73 71 6c 69 74 65 5f 25 27 20 22 0a 20 20   'sqlite_%' ".  
2c070 20 20 20 20 20 22 4f 52 44 45 52 20 42 59 20 72       "ORDER BY r
2c080 6f 77 69 64 22 2c 0a 20 20 20 20 20 20 20 63 61  owid",.       ca
2c090 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26  llback, &data, &
2c0a0 7a 45 72 72 4d 73 67 0a 20 20 20 20 29 3b 0a 20  zErrMsg.    );. 
2c0b0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
2c0c0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 73 71  E_OK ){.      sq
2c0d0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
2c0e0 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  t;.      rc = sq
2c0f0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
2c100 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  (p->db,.        
2c110 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 72         "SELECT r
2c120 6f 77 69 64 20 46 52 4f 4d 20 73 71 6c 69 74 65  owid FROM sqlite
2c130 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20 20  _master".       
2c140 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20          " WHERE 
2c150 6e 61 6d 65 20 47 4c 4f 42 20 27 73 71 6c 69 74  name GLOB 'sqlit
2c160 65 5f 73 74 61 74 5b 31 33 34 5d 27 22 2c 0a 20  e_stat[134]'",. 
2c170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31                -1
2c180 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
2c190 20 20 20 20 64 6f 53 74 61 74 73 20 3d 20 73 71      doStats = sq
2c1a0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
2c1b0 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 3b 0a 20  )==SQLITE_ROW;. 
2c1c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
2c1d0 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
2c1e0 20 20 7d 0a 20 20 20 20 69 66 28 20 64 6f 53 74    }.    if( doSt
2c1f0 61 74 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ats==0 ){.      
2c200 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
2c210 74 2c 20 22 2f 2a 20 4e 6f 20 53 54 41 54 20 74  t, "/* No STAT t
2c220 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c 65 20  ables available 
2c230 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20 7d 65 6c 73  */\n");.    }els
2c240 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
2c250 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 41 4e 41  ntf(p->out, "ANA
2c260 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73 74  LYZE sqlite_mast
2c270 65 72 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 73  er;\n");.      s
2c280 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
2c290 62 2c 20 22 53 45 4c 45 43 54 20 27 41 4e 41 4c  b, "SELECT 'ANAL
2c2a0 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  YZE sqlite_maste
2c2b0 72 27 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  r'",.           
2c2c0 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b          callback
2c2d0 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73  , &data, &zErrMs
2c2e0 67 29 3b 0a 20 20 20 20 20 20 64 61 74 61 2e 63  g);.      data.c
2c2f0 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65  Mode = data.mode
2c300 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b 0a   = MODE_Insert;.
2c310 20 20 20 20 20 20 64 61 74 61 2e 7a 44 65 73 74        data.zDest
2c320 54 61 62 6c 65 20 3d 20 22 73 71 6c 69 74 65 5f  Table = "sqlite_
2c330 73 74 61 74 31 22 3b 0a 20 20 20 20 20 20 73 68  stat1";.      sh
2c340 65 6c 6c 5f 65 78 65 63 28 70 2c 20 22 53 45 4c  ell_exec(p, "SEL
2c350 45 43 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74  ECT * FROM sqlit
2c360 65 5f 73 74 61 74 31 22 2c 20 26 7a 45 72 72 4d  e_stat1", &zErrM
2c370 73 67 29 3b 0a 20 20 20 20 20 20 64 61 74 61 2e  sg);.      data.
2c380 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 22 73 71  zDestTable = "sq
2c390 6c 69 74 65 5f 73 74 61 74 33 22 3b 0a 20 20 20  lite_stat3";.   
2c3a0 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2c     shell_exec(p,
2c3b0 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20   "SELECT * FROM 
2c3c0 73 71 6c 69 74 65 5f 73 74 61 74 33 22 2c 20 26  sqlite_stat3", &
2c3d0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
2c3e0 64 61 74 61 2e 7a 44 65 73 74 54 61 62 6c 65 20  data.zDestTable 
2c3f0 3d 20 22 73 71 6c 69 74 65 5f 73 74 61 74 34 22  = "sqlite_stat4"
2c400 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f 65 78  ;.      shell_ex
2c410 65 63 28 70 2c 20 22 53 45 4c 45 43 54 20 2a 20  ec(p, "SELECT * 
2c420 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61 74  FROM sqlite_stat
2c430 34 22 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  4", &zErrMsg);. 
2c440 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2c450 70 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45  p->out, "ANALYZE
2c460 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c   sqlite_master;\
2c470 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  n");.    }.  }el
2c480 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 68 27  se..  if( c=='h'
2c490 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2c4a0 67 5b 30 5d 2c 20 22 68 65 61 64 65 72 73 22 2c  g[0], "headers",
2c4b0 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   n)==0 ){.    if
2c4c0 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20  ( nArg==2 ){.   
2c4d0 20 20 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72     p->showHeader
2c4e0 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28   = booleanValue(
2c4f0 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d  azArg[1]);.    }
2c500 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
2c510 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2c520 55 73 61 67 65 3a 20 2e 68 65 61 64 65 72 73 20  Usage: .headers 
2c530 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20  on|off\n");.    
2c540 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
2c550 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
2c560 3d 3d 27 68 27 20 26 26 20 73 74 72 6e 63 6d 70  =='h' && strncmp
2c570 28 61 7a 41 72 67 5b 30 5d 2c 20 22 68 65 6c 70  (azArg[0], "help
2c580 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
2c590 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
2c5a0 75 74 2c 20 22 25 73 22 2c 20 7a 48 65 6c 70 29  ut, "%s", zHelp)
2c5b0 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
2c5c0 20 63 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63   c=='i' && strnc
2c5d0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6d  mp(azArg[0], "im
2c5e0 70 6f 72 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  port", n)==0 ){.
2c5f0 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 6c 65      char *zTable
2c600 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
2c610 2f 2a 20 49 6e 73 65 72 74 20 64 61 74 61 20 69  /* Insert data i
2c620 6e 74 6f 20 74 68 69 73 20 74 61 62 6c 65 20 2a  nto this table *
2c630 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 46 69 6c  /.    char *zFil
2c640 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
2c650 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 66 69 6c    /* Name of fil
2c660 65 20 74 6f 20 65 78 74 72 61 20 63 6f 6e 74 65  e to extra conte
2c670 6e 74 20 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 73  nt from */.    s
2c680 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
2c690 6d 74 20 3d 20 4e 55 4c 4c 3b 20 2f 2a 20 41 20  mt = NULL; /* A 
2c6a0 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
2c6b0 20 69 6e 74 20 6e 43 6f 6c 3b 20 20 20 20 20 20   int nCol;      
2c6c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c6d0 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  Number of column
2c6e0 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 2a  s in the table *
2c6f0 2f 0a 20 20 20 20 69 6e 74 20 6e 42 79 74 65 3b  /.    int nByte;
2c700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c710 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62    /* Number of b
2c720 79 74 65 73 20 69 6e 20 61 6e 20 53 51 4c 20 73  ytes in an SQL s
2c730 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74  tring */.    int
2c740 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
2c750 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2c760 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 20   counters */.   
2c770 20 69 6e 74 20 6e 65 65 64 43 6f 6d 6d 69 74 3b   int needCommit;
2c780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c790 54 72 75 65 20 74 6f 20 43 4f 4d 4d 49 54 20 6f  True to COMMIT o
2c7a0 72 20 52 4f 4c 4c 42 41 43 4b 20 61 74 20 65 6e  r ROLLBACK at en
2c7b0 64 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 53 65  d */.    int nSe
2c7c0 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
2c7d0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
2c7e0 66 20 62 79 74 65 73 20 69 6e 20 70 2d 3e 63 6f  f bytes in p->co
2c7f0 6c 53 65 70 61 72 61 74 6f 72 5b 5d 20 2a 2f 0a  lSeparator[] */.
2c800 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20      char *zSql; 
2c810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c820 2f 2a 20 41 6e 20 53 51 4c 20 73 74 61 74 65 6d  /* An SQL statem
2c830 65 6e 74 20 2a 2f 0a 20 20 20 20 49 6d 70 6f 72  ent */.    Impor
2c840 74 43 74 78 20 73 43 74 78 3b 20 20 20 20 20 20  tCtx sCtx;      
2c850 20 20 20 20 20 20 20 2f 2a 20 52 65 61 64 65 72         /* Reader
2c860 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 20 20   context */.    
2c870 63 68 61 72 20 2a 28 53 51 4c 49 54 45 5f 43 44  char *(SQLITE_CD
2c880 45 43 4c 20 2a 78 52 65 61 64 29 28 49 6d 70 6f  ECL *xRead)(Impo
2c890 72 74 43 74 78 2a 29 3b 20 2f 2a 20 46 75 6e 63  rtCtx*); /* Func
2c8a0 20 74 6f 20 72 65 61 64 20 6f 6e 65 20 76 61 6c   to read one val
2c8b0 75 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 28 53  ue */.    int (S
2c8c0 51 4c 49 54 45 5f 43 44 45 43 4c 20 2a 78 43 6c  QLITE_CDECL *xCl
2c8d0 6f 73 65 72 29 28 46 49 4c 45 2a 29 3b 20 20 20  oser)(FILE*);   
2c8e0 20 20 20 2f 2a 20 46 75 6e 63 20 74 6f 20 63 6c     /* Func to cl
2c8f0 6f 73 65 20 66 69 6c 65 20 2a 2f 0a 0a 20 20 20  ose file */..   
2c900 20 69 66 28 20 6e 41 72 67 21 3d 33 20 29 7b 0a   if( nArg!=3 ){.
2c910 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2c920 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
2c930 20 2e 69 6d 70 6f 72 74 20 46 49 4c 45 20 54 41   .import FILE TA
2c940 42 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 67  BLE\n");.      g
2c950 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
2c960 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
2c970 20 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31   zFile = azArg[1
2c980 5d 3b 0a 20 20 20 20 7a 54 61 62 6c 65 20 3d 20  ];.    zTable = 
2c990 61 7a 41 72 67 5b 32 5d 3b 0a 20 20 20 20 73 65  azArg[2];.    se
2c9a0 65 6e 49 6e 74 65 72 72 75 70 74 20 3d 20 30 3b  enInterrupt = 0;
2c9b0 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73 43 74  .    memset(&sCt
2c9c0 78 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 43 74  x, 0, sizeof(sCt
2c9d0 78 29 29 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62  x));.    open_db
2c9e0 28 70 2c 20 30 29 3b 0a 20 20 20 20 6e 53 65 70  (p, 0);.    nSep
2c9f0 20 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 63   = strlen30(p->c
2ca00 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  olSeparator);.  
2ca10 20 20 69 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b    if( nSep==0 ){
2ca20 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
2ca30 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20 20  f(stderr,.      
2ca40 20 20 20 20 20 20 20 20 20 20 20 22 45 72 72 6f             "Erro
2ca50 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 63 6f 6c 75  r: non-null colu
2ca60 6d 6e 20 73 65 70 61 72 61 74 6f 72 20 72 65 71  mn separator req
2ca70 75 69 72 65 64 20 66 6f 72 20 69 6d 70 6f 72 74  uired for import
2ca80 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  \n");.      retu
2ca90 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
2caa0 69 66 28 20 6e 53 65 70 3e 31 20 29 7b 0a 20 20  if( nSep>1 ){.  
2cab0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2cac0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6d  tderr, "Error: m
2cad0 75 6c 74 69 2d 63 68 61 72 61 63 74 65 72 20 63  ulti-character c
2cae0 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 73  olumn separators
2caf0 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 22 0a 20 20   not allowed".  
2cb00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cb10 20 20 20 20 22 20 66 6f 72 20 69 6d 70 6f 72 74      " for import
2cb20 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  \n");.      retu
2cb30 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
2cb40 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28  nSep = strlen30(
2cb50 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
2cb60 3b 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d  ;.    if( nSep==
2cb70 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  0 ){.      raw_p
2cb80 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
2cb90 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20 72  rror: non-null r
2cba0 6f 77 20 73 65 70 61 72 61 74 6f 72 20 72 65 71  ow separator req
2cbb0 75 69 72 65 64 20 66 6f 72 20 69 6d 70 6f 72 74  uired for import
2cbc0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75  \n");.      retu
2cbd0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
2cbe0 69 66 28 20 6e 53 65 70 3d 3d 32 20 26 26 20 70  if( nSep==2 && p
2cbf0 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 43 73 76  ->mode==MODE_Csv
2cc00 20 26 26 20 73 74 72 63 6d 70 28 70 2d 3e 72 6f   && strcmp(p->ro
2cc10 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f  wSeparator, SEP_
2cc20 43 72 4c 66 29 3d 3d 30 20 29 7b 0a 20 20 20 20  CrLf)==0 ){.    
2cc30 20 20 2f 2a 20 57 68 65 6e 20 69 6d 70 6f 72 74    /* When import
2cc40 69 6e 67 20 43 53 56 20 28 6f 6e 6c 79 29 2c 20  ing CSV (only), 
2cc50 69 66 20 74 68 65 20 72 6f 77 20 73 65 70 61 72  if the row separ
2cc60 61 74 6f 72 20 69 73 20 73 65 74 20 74 6f 20 74  ator is set to t
2cc70 68 65 0a 20 20 20 20 20 20 2a 2a 20 64 65 66 61  he.      ** defa
2cc80 75 6c 74 20 6f 75 74 70 75 74 20 72 6f 77 20 73  ult output row s
2cc90 65 70 61 72 61 74 6f 72 2c 20 63 68 61 6e 67 65  eparator, change
2cca0 20 69 74 20 74 6f 20 74 68 65 20 64 65 66 61 75   it to the defau
2ccb0 6c 74 20 69 6e 70 75 74 0a 20 20 20 20 20 20 2a  lt input.      *
2ccc0 2a 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 2e  * row separator.
2ccd0 20 20 54 68 69 73 20 61 76 6f 69 64 73 20 68 61    This avoids ha
2cce0 76 69 6e 67 20 74 6f 20 6d 61 69 6e 74 61 69 6e  ving to maintain
2ccf0 20 64 69 66 66 65 72 65 6e 74 20 69 6e 70 75 74   different input
2cd00 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 6f 75  .      ** and ou
2cd10 74 70 75 74 20 72 6f 77 20 73 65 70 61 72 61 74  tput row separat
2cd20 6f 72 73 2e 20 2a 2f 0a 20 20 20 20 20 20 73 71  ors. */.      sq
2cd30 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
2cd40 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61  izeof(p->rowSepa
2cd50 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65  rator), p->rowSe
2cd60 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77  parator, SEP_Row
2cd70 29 3b 0a 20 20 20 20 20 20 6e 53 65 70 20 3d 20  );.      nSep = 
2cd80 73 74 72 6c 65 6e 33 30 28 70 2d 3e 72 6f 77 53  strlen30(p->rowS
2cd90 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 7d  eparator);.    }
2cda0 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3e 31 20  .    if( nSep>1 
2cdb0 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
2cdc0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
2cdd0 6f 72 3a 20 6d 75 6c 74 69 2d 63 68 61 72 61 63  or: multi-charac
2cde0 74 65 72 20 72 6f 77 20 73 65 70 61 72 61 74 6f  ter row separato
2cdf0 72 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 22 0a  rs not allowed".
2ce00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce10 20 20 20 20 20 20 22 20 66 6f 72 20 69 6d 70 6f        " for impo
2ce20 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65  rt\n");.      re
2ce30 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
2ce40 20 20 73 43 74 78 2e 7a 46 69 6c 65 20 3d 20 7a    sCtx.zFile = z
2ce50 46 69 6c 65 3b 0a 20 20 20 20 73 43 74 78 2e 6e  File;.    sCtx.n
2ce60 4c 69 6e 65 20 3d 20 31 3b 0a 20 20 20 20 69 66  Line = 1;.    if
2ce70 28 20 73 43 74 78 2e 7a 46 69 6c 65 5b 30 5d 3d  ( sCtx.zFile[0]=
2ce80 3d 27 7c 27 20 29 7b 0a 23 69 66 64 65 66 20 53  ='|' ){.#ifdef S
2ce90 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f 50 45 4e  QLITE_OMIT_POPEN
2cea0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
2ceb0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
2cec0 3a 20 70 69 70 65 73 20 61 72 65 20 6e 6f 74 20  : pipes are not 
2ced0 73 75 70 70 6f 72 74 65 64 20 69 6e 20 74 68 69  supported in thi
2cee0 73 20 4f 53 5c 6e 22 29 3b 0a 20 20 20 20 20 20  s OS\n");.      
2cef0 72 65 74 75 72 6e 20 31 3b 0a 23 65 6c 73 65 0a  return 1;.#else.
2cf00 20 20 20 20 20 20 73 43 74 78 2e 69 6e 20 3d 20        sCtx.in = 
2cf10 70 6f 70 65 6e 28 73 43 74 78 2e 7a 46 69 6c 65  popen(sCtx.zFile
2cf20 2b 31 2c 20 22 72 22 29 3b 0a 20 20 20 20 20 20  +1, "r");.      
2cf30 73 43 74 78 2e 7a 46 69 6c 65 20 3d 20 22 3c 70  sCtx.zFile = "<p
2cf40 69 70 65 3e 22 3b 0a 20 20 20 20 20 20 78 43 6c  ipe>";.      xCl
2cf50 6f 73 65 72 20 3d 20 70 63 6c 6f 73 65 3b 0a 23  oser = pclose;.#
2cf60 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
2cf70 0a 20 20 20 20 20 20 73 43 74 78 2e 69 6e 20 3d  .      sCtx.in =
2cf80 20 66 6f 70 65 6e 28 73 43 74 78 2e 7a 46 69 6c   fopen(sCtx.zFil
2cf90 65 2c 20 22 72 62 22 29 3b 0a 20 20 20 20 20 20  e, "rb");.      
2cfa0 78 43 6c 6f 73 65 72 20 3d 20 66 63 6c 6f 73 65  xCloser = fclose
2cfb0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2cfc0 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 41 73  p->mode==MODE_As
2cfd0 63 69 69 20 29 7b 0a 20 20 20 20 20 20 78 52 65  cii ){.      xRe
2cfe0 61 64 20 3d 20 61 73 63 69 69 5f 72 65 61 64 5f  ad = ascii_read_
2cff0 6f 6e 65 5f 66 69 65 6c 64 3b 0a 20 20 20 20 7d  one_field;.    }
2d000 65 6c 73 65 7b 0a 20 20 20 20 20 20 78 52 65 61  else{.      xRea
2d010 64 20 3d 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65  d = csv_read_one
2d020 5f 66 69 65 6c 64 3b 0a 20 20 20 20 7d 0a 20 20  _field;.    }.  
2d030 20 20 69 66 28 20 73 43 74 78 2e 69 6e 3d 3d 30    if( sCtx.in==0
2d040 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
2d050 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
2d060 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65  rror: cannot ope
2d070 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69  n \"%s\"\n", zFi
2d080 6c 65 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  le);.      retur
2d090 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  n 1;.    }.    s
2d0a0 43 74 78 2e 63 43 6f 6c 53 65 70 20 3d 20 70 2d  Ctx.cColSep = p-
2d0b0 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b 30 5d  >colSeparator[0]
2d0c0 3b 0a 20 20 20 20 73 43 74 78 2e 63 52 6f 77 53  ;.    sCtx.cRowS
2d0d0 65 70 20 3d 20 70 2d 3e 72 6f 77 53 65 70 61 72  ep = p->rowSepar
2d0e0 61 74 6f 72 5b 30 5d 3b 0a 20 20 20 20 7a 53 71  ator[0];.    zSq
2d0f0 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
2d100 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52  ntf("SELECT * FR
2d110 4f 4d 20 25 73 22 2c 20 7a 54 61 62 6c 65 29 3b  OM %s", zTable);
2d120 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  .    if( zSql==0
2d130 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
2d140 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
2d150 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f  ror: out of memo
2d160 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 78 43  ry\n");.      xC
2d170 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a  loser(sCtx.in);.
2d180 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2d190 20 20 20 20 7d 0a 20 20 20 20 6e 42 79 74 65 20      }.    nByte 
2d1a0 3d 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29  = strlen30(zSql)
2d1b0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2d1c0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
2d1d0 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
2d1e0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69  pStmt, 0);.    i
2d1f0 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61  mport_append_cha
2d200 72 28 26 73 43 74 78 2c 20 30 29 3b 20 20 20 20  r(&sCtx, 0);    
2d210 2f 2a 20 54 6f 20 65 6e 73 75 72 65 20 73 43 74  /* To ensure sCt
2d220 78 2e 7a 20 69 73 20 61 6c 6c 6f 63 61 74 65 64  x.z is allocated
2d230 20 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 20 26   */.    if( rc &
2d240 26 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  & sqlite3_strglo
2d250 62 28 22 6e 6f 20 73 75 63 68 20 74 61 62 6c 65  b("no such table
2d260 3a 20 2a 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  : *", sqlite3_er
2d270 72 6d 73 67 28 70 2d 3e 64 62 29 29 3d 3d 30 20  rmsg(p->db))==0 
2d280 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
2d290 43 72 65 61 74 65 20 3d 20 73 71 6c 69 74 65 33  Create = sqlite3
2d2a0 5f 6d 70 72 69 6e 74 66 28 22 43 52 45 41 54 45  _mprintf("CREATE
2d2b0 20 54 41 42 4c 45 20 25 73 22 2c 20 7a 54 61 62   TABLE %s", zTab
2d2c0 6c 65 29 3b 0a 20 20 20 20 20 20 63 68 61 72 20  le);.      char 
2d2d0 63 53 65 70 20 3d 20 27 28 27 3b 0a 20 20 20 20  cSep = '(';.    
2d2e0 20 20 77 68 69 6c 65 28 20 78 52 65 61 64 28 26    while( xRead(&
2d2f0 73 43 74 78 29 20 29 7b 0a 20 20 20 20 20 20 20  sCtx) ){.       
2d300 20 7a 43 72 65 61 74 65 20 3d 20 73 71 6c 69 74   zCreate = sqlit
2d310 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 25 63  e3_mprintf("%z%c
2d320 5c 6e 20 20 5c 22 25 77 5c 22 20 54 45 58 54 22  \n  \"%w\" TEXT"
2d330 2c 20 7a 43 72 65 61 74 65 2c 20 63 53 65 70 2c  , zCreate, cSep,
2d340 20 73 43 74 78 2e 7a 29 3b 0a 20 20 20 20 20 20   sCtx.z);.      
2d350 20 20 63 53 65 70 20 3d 20 27 2c 27 3b 0a 20 20    cSep = ',';.  
2d360 20 20 20 20 20 20 69 66 28 20 73 43 74 78 2e 63        if( sCtx.c
2d370 54 65 72 6d 21 3d 73 43 74 78 2e 63 43 6f 6c 53  Term!=sCtx.cColS
2d380 65 70 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  ep ) break;.    
2d390 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 53    }.      if( cS
2d3a0 65 70 3d 3d 27 28 27 20 29 7b 0a 20 20 20 20 20  ep=='(' ){.     
2d3b0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2d3c0 7a 43 72 65 61 74 65 29 3b 0a 20 20 20 20 20 20  zCreate);.      
2d3d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 73    sqlite3_free(s
2d3e0 43 74 78 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20  Ctx.z);.        
2d3f0 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29  xCloser(sCtx.in)
2d400 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  ;.        utf8_p
2d410 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73  rintf(stderr,"%s
2d420 3a 20 65 6d 70 74 79 20 66 69 6c 65 5c 6e 22 2c  : empty file\n",
2d430 20 73 43 74 78 2e 7a 46 69 6c 65 29 3b 0a 20 20   sCtx.zFile);.  
2d440 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2d450 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 43        }.      zC
2d460 72 65 61 74 65 20 3d 20 73 71 6c 69 74 65 33 5f  reate = sqlite3_
2d470 6d 70 72 69 6e 74 66 28 22 25 7a 5c 6e 29 22 2c  mprintf("%z\n)",
2d480 20 7a 43 72 65 61 74 65 29 3b 0a 20 20 20 20 20   zCreate);.     
2d490 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
2d4a0 65 63 28 70 2d 3e 64 62 2c 20 7a 43 72 65 61 74  ec(p->db, zCreat
2d4b0 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  e, 0, 0, 0);.   
2d4c0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2d4d0 7a 43 72 65 61 74 65 29 3b 0a 20 20 20 20 20 20  zCreate);.      
2d4e0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2d4f0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2d500 64 65 72 72 2c 20 22 43 52 45 41 54 45 20 54 41  derr, "CREATE TA
2d510 42 4c 45 20 25 73 28 2e 2e 2e 29 20 66 61 69 6c  BLE %s(...) fail
2d520 65 64 3a 20 25 73 5c 6e 22 2c 20 7a 54 61 62 6c  ed: %s\n", zTabl
2d530 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
2d540 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73     sqlite3_errms
2d550 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20  g(p->db));.     
2d560 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2d570 73 43 74 78 2e 7a 29 3b 0a 20 20 20 20 20 20 20  sCtx.z);.       
2d580 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e   xCloser(sCtx.in
2d590 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
2d5a0 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
2d5b0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
2d5c0 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
2d5d0 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
2d5e0 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  mt, 0);.    }.  
2d5f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2d600 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Sql);.    if( rc
2d610 20 29 7b 0a 20 20 20 20 20 20 69 66 20 28 70 53   ){.      if (pS
2d620 74 6d 74 29 20 73 71 6c 69 74 65 33 5f 66 69 6e  tmt) sqlite3_fin
2d630 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
2d640 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2d650 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25  stderr,"Error: %
2d660 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  s\n", sqlite3_er
2d670 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20  rmsg(p->db));.  
2d680 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78      xCloser(sCtx
2d690 2e 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75  .in);.      retu
2d6a0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
2d6b0 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  nCol = sqlite3_c
2d6c0 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d  olumn_count(pStm
2d6d0 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
2d6e0 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
2d6f0 0a 20 20 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a  .    pStmt = 0;.
2d700 20 20 20 20 69 66 28 20 6e 43 6f 6c 3d 3d 30 20      if( nCol==0 
2d710 29 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 6e  ) return 0; /* n
2d720 6f 20 63 6f 6c 75 6d 6e 73 2c 20 6e 6f 20 65 72  o columns, no er
2d730 72 6f 72 20 2a 2f 0a 20 20 20 20 7a 53 71 6c 20  ror */.    zSql 
2d740 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
2d750 36 34 28 20 6e 42 79 74 65 2a 32 20 2b 20 32 30  64( nByte*2 + 20
2d760 20 2b 20 6e 43 6f 6c 2a 32 20 29 3b 0a 20 20 20   + nCol*2 );.   
2d770 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a   if( zSql==0 ){.
2d780 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2d790 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
2d7a0 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e   out of memory\n
2d7b0 22 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65  ");.      xClose
2d7c0 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20  r(sCtx.in);.    
2d7d0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2d7e0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  }.    sqlite3_sn
2d7f0 70 72 69 6e 74 66 28 6e 42 79 74 65 2b 32 30 2c  printf(nByte+20,
2d800 20 7a 53 71 6c 2c 20 22 49 4e 53 45 52 54 20 49   zSql, "INSERT I
2d810 4e 54 4f 20 5c 22 25 77 5c 22 20 56 41 4c 55 45  NTO \"%w\" VALUE
2d820 53 28 3f 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20  S(?", zTable);. 
2d830 20 20 20 6a 20 3d 20 73 74 72 6c 65 6e 33 30 28     j = strlen30(
2d840 7a 53 71 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69  zSql);.    for(i
2d850 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =1; i<nCol; i++)
2d860 7b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b  {.      zSql[j++
2d870 5d 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 7a  ] = ',';.      z
2d880 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 3f 27 3b 0a  Sql[j++] = '?';.
2d890 20 20 20 20 7d 0a 20 20 20 20 7a 53 71 6c 5b 6a      }.    zSql[j
2d8a0 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20 20 20 20 7a  ++] = ')';.    z
2d8b0 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20  Sql[j] = 0;.    
2d8c0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
2d8d0 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a  pare_v2(p->db, z
2d8e0 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
2d8f0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
2d900 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
2d910 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2d920 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2d930 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c  err, "Error: %s\
2d940 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
2d950 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  sg(p->db));.    
2d960 20 20 69 66 20 28 70 53 74 6d 74 29 20 73 71 6c    if (pStmt) sql
2d970 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
2d980 74 6d 74 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f  tmt);.      xClo
2d990 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20  ser(sCtx.in);.  
2d9a0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2d9b0 20 20 7d 0a 20 20 20 20 6e 65 65 64 43 6f 6d 6d    }.    needComm
2d9c0 69 74 20 3d 20 73 71 6c 69 74 65 33 5f 67 65 74  it = sqlite3_get
2d9d0 5f 61 75 74 6f 63 6f 6d 6d 69 74 28 70 2d 3e 64  _autocommit(p->d
2d9e0 62 29 3b 0a 20 20 20 20 69 66 28 20 6e 65 65 64  b);.    if( need
2d9f0 43 6f 6d 6d 69 74 20 29 20 73 71 6c 69 74 65 33  Commit ) sqlite3
2da00 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 42 45  _exec(p->db, "BE
2da10 47 49 4e 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  GIN", 0, 0, 0);.
2da20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 69 6e      do{.      in
2da30 74 20 73 74 61 72 74 4c 69 6e 65 20 3d 20 73 43  t startLine = sC
2da40 74 78 2e 6e 4c 69 6e 65 3b 0a 20 20 20 20 20 20  tx.nLine;.      
2da50 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b  for(i=0; i<nCol;
2da60 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   i++){.        c
2da70 68 61 72 20 2a 7a 20 3d 20 78 52 65 61 64 28 26  har *z = xRead(&
2da80 73 43 74 78 29 3b 0a 20 20 20 20 20 20 20 20 2f  sCtx);.        /
2da90 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 44 69 64  *.        ** Did
2daa0 20 77 65 20 72 65 61 63 68 20 65 6e 64 2d 6f 66   we reach end-of
2dab0 2d 66 69 6c 65 20 62 65 66 6f 72 65 20 66 69 6e  -file before fin
2dac0 64 69 6e 67 20 61 6e 79 20 63 6f 6c 75 6d 6e 73  ding any columns
2dad0 3f 0a 20 20 20 20 20 20 20 20 2a 2a 20 49 66 20  ?.        ** If 
2dae0 73 6f 2c 20 73 74 6f 70 20 69 6e 73 74 65 61 64  so, stop instead
2daf0 20 6f 66 20 4e 55 4c 4c 20 66 69 6c 6c 69 6e 67   of NULL filling
2db00 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 63   the remaining c
2db10 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 20 20 20 20  olumns..        
2db20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  */.        if( z
2db30 3d 3d 30 20 26 26 20 69 3d 3d 30 20 29 20 62 72  ==0 && i==0 ) br
2db40 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 2f 2a 0a  eak;.        /*.
2db50 20 20 20 20 20 20 20 20 2a 2a 20 44 69 64 20 77          ** Did w
2db60 65 20 72 65 61 63 68 20 65 6e 64 2d 6f 66 2d 66  e reach end-of-f
2db70 69 6c 65 20 4f 52 20 65 6e 64 2d 6f 66 2d 6c 69  ile OR end-of-li
2db80 6e 65 20 62 65 66 6f 72 65 20 66 69 6e 64 69 6e  ne before findin
2db90 67 20 61 6e 79 0a 20 20 20 20 20 20 20 20 2a 2a  g any.        **
2dba0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 41 53 43 49   columns in ASCI
2dbb0 49 20 6d 6f 64 65 3f 20 20 49 66 20 73 6f 2c 20  I mode?  If so, 
2dbc0 73 74 6f 70 20 69 6e 73 74 65 61 64 20 6f 66 20  stop instead of 
2dbd0 4e 55 4c 4c 20 66 69 6c 6c 69 6e 67 0a 20 20 20  NULL filling.   
2dbe0 20 20 20 20 20 2a 2a 20 74 68 65 20 72 65 6d 61       ** the rema
2dbf0 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 73 2e 0a 20  ining columns.. 
2dc00 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
2dc10 20 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d    if( p->mode==M
2dc20 4f 44 45 5f 41 73 63 69 69 20 26 26 20 28 7a 3d  ODE_Ascii && (z=
2dc30 3d 30 20 7c 7c 20 7a 5b 30 5d 3d 3d 30 29 20 26  =0 || z[0]==0) &
2dc40 26 20 69 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  & i==0 ) break;.
2dc50 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2dc60 62 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c  bind_text(pStmt,
2dc70 20 69 2b 31 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c   i+1, z, -1, SQL
2dc80 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
2dc90 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 6e 43          if( i<nC
2dca0 6f 6c 2d 31 20 26 26 20 73 43 74 78 2e 63 54 65  ol-1 && sCtx.cTe
2dcb0 72 6d 21 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70  rm!=sCtx.cColSep
2dcc0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74   ){.          ut
2dcd0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2dce0 2c 20 22 25 73 3a 25 64 3a 20 65 78 70 65 63 74  , "%s:%d: expect
2dcf0 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20 62 75  ed %d columns bu
2dd00 74 20 66 6f 75 6e 64 20 25 64 20 2d 20 22 0a 20  t found %d - ". 
2dd10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd20 20 20 20 20 20 20 20 20 20 22 66 69 6c 6c 69 6e           "fillin
2dd30 67 20 74 68 65 20 72 65 73 74 20 77 69 74 68 20  g the rest with 
2dd40 4e 55 4c 4c 5c 6e 22 2c 0a 20 20 20 20 20 20 20  NULL\n",.       
2dd50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd60 20 20 20 73 43 74 78 2e 7a 46 69 6c 65 2c 20 73     sCtx.zFile, s
2dd70 74 61 72 74 4c 69 6e 65 2c 20 6e 43 6f 6c 2c 20  tartLine, nCol, 
2dd80 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  i+1);.          
2dd90 69 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  i += 2;.        
2dda0 20 20 77 68 69 6c 65 28 20 69 3c 3d 6e 43 6f 6c    while( i<=nCol
2ddb0 20 29 7b 20 73 71 6c 69 74 65 33 5f 62 69 6e 64   ){ sqlite3_bind
2ddc0 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c 20 69 29 3b  _null(pStmt, i);
2ddd0 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20   i++; }.        
2dde0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2ddf0 69 66 28 20 73 43 74 78 2e 63 54 65 72 6d 3d 3d  if( sCtx.cTerm==
2de00 73 43 74 78 2e 63 43 6f 6c 53 65 70 20 29 7b 0a  sCtx.cColSep ){.
2de10 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20          do{.    
2de20 20 20 20 20 20 20 78 52 65 61 64 28 26 73 43 74        xRead(&sCt
2de30 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 2b  x);.          i+
2de40 2b 3b 0a 20 20 20 20 20 20 20 20 7d 77 68 69 6c  +;.        }whil
2de50 65 28 20 73 43 74 78 2e 63 54 65 72 6d 3d 3d 73  e( sCtx.cTerm==s
2de60 43 74 78 2e 63 43 6f 6c 53 65 70 20 29 3b 0a 20  Ctx.cColSep );. 
2de70 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2de80 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25  tf(stderr, "%s:%
2de90 64 3a 20 65 78 70 65 63 74 65 64 20 25 64 20 63  d: expected %d c
2dea0 6f 6c 75 6d 6e 73 20 62 75 74 20 66 6f 75 6e 64  olumns but found
2deb0 20 25 64 20 2d 20 22 0a 20 20 20 20 20 20 20 20   %d - ".        
2dec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ded0 22 65 78 74 72 61 73 20 69 67 6e 6f 72 65 64 5c  "extras ignored\
2dee0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
2def0 20 20 20 20 20 20 20 20 20 20 20 20 73 43 74 78              sCtx
2df00 2e 7a 46 69 6c 65 2c 20 73 74 61 72 74 4c 69 6e  .zFile, startLin
2df10 65 2c 20 6e 43 6f 6c 2c 20 69 29 3b 0a 20 20 20  e, nCol, i);.   
2df20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
2df30 3e 3d 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  >=nCol ){.      
2df40 20 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70    sqlite3_step(p
2df50 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 72  Stmt);.        r
2df60 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65  c = sqlite3_rese
2df70 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  t(pStmt);.      
2df80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
2df90 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
2dfa0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2dfb0 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 49 4e 53  err, "%s:%d: INS
2dfc0 45 52 54 20 66 61 69 6c 65 64 3a 20 25 73 5c 6e  ERT failed: %s\n
2dfd0 22 2c 20 73 43 74 78 2e 7a 46 69 6c 65 2c 0a 20  ", sCtx.zFile,. 
2dfe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dff0 20 20 20 20 20 73 74 61 72 74 4c 69 6e 65 2c 20       startLine, 
2e000 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
2e010 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20 20  ->db));.        
2e020 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 77  }.      }.    }w
2e030 68 69 6c 65 28 20 73 43 74 78 2e 63 54 65 72 6d  hile( sCtx.cTerm
2e040 21 3d 45 4f 46 20 29 3b 0a 0a 20 20 20 20 78 43  !=EOF );..    xC
2e050 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a  loser(sCtx.in);.
2e060 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2e070 28 73 43 74 78 2e 7a 29 3b 0a 20 20 20 20 73 71  (sCtx.z);.    sq
2e080 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
2e090 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20 6e  Stmt);.    if( n
2e0a0 65 65 64 43 6f 6d 6d 69 74 20 29 20 73 71 6c 69  eedCommit ) sqli
2e0b0 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
2e0c0 22 43 4f 4d 4d 49 54 22 2c 20 30 2c 20 30 2c 20  "COMMIT", 0, 0, 
2e0d0 30 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66  0);.  }else..#if
2e0e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 55 4e 54 45  ndef SQLITE_UNTE
2e0f0 53 54 41 42 4c 45 0a 20 20 69 66 28 20 63 3d 3d  STABLE.  if( c==
2e100 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'i' && strncmp(a
2e110 7a 41 72 67 5b 30 5d 2c 20 22 69 6d 70 6f 73 74  zArg[0], "impost
2e120 65 72 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  er", n)==0 ){.  
2e130 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
2e140 20 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 69 73 74    char *zCollist
2e150 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
2e160 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
2e170 20 20 20 69 6e 74 20 74 6e 75 6d 20 3d 20 30 3b     int tnum = 0;
2e180 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
2e190 69 66 28 20 6e 41 72 67 21 3d 33 20 29 7b 0a 20  if( nArg!=3 ){. 
2e1a0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2e1b0 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
2e1c0 20 2e 69 6d 70 6f 73 74 65 72 20 49 4e 44 45 58   .imposter INDEX
2e1d0 20 49 4d 50 4f 53 54 45 52 5c 6e 22 29 3b 0a 20   IMPOSTER\n");. 
2e1e0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
2e1f0 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
2e200 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d  mand_exit;.    }
2e210 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
2e220 30 29 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73  0);.    zSql = s
2e230 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
2e240 53 45 4c 45 43 54 20 72 6f 6f 74 70 61 67 65 20  SELECT rootpage 
2e250 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
2e260 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  er".            
2e270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2e280 20 57 48 45 52 45 20 6e 61 6d 65 3d 27 25 71 27   WHERE name='%q'
2e290 20 41 4e 44 20 74 79 70 65 3d 27 69 6e 64 65 78   AND type='index
2e2a0 27 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  '", azArg[1]);. 
2e2b0 20 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61     sqlite3_prepa
2e2c0 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71  re_v2(p->db, zSq
2e2d0 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
2e2e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
2e2f0 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69  ree(zSql);.    i
2e300 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  f( sqlite3_step(
2e310 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
2e320 4f 57 20 29 7b 0a 20 20 20 20 20 20 74 6e 75 6d  OW ){.      tnum
2e330 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
2e340 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b  n_int(pStmt, 0);
2e350 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2e360 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
2e370 74 29 3b 0a 20 20 20 20 69 66 28 20 74 6e 75 6d  t);.    if( tnum
2e380 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66  ==0 ){.      utf
2e390 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2e3a0 20 22 6e 6f 20 73 75 63 68 20 69 6e 64 65 78 3a   "no such index:
2e3b0 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72   \"%s\"\n", azAr
2e3c0 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 72 63 20  g[1]);.      rc 
2e3d0 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 1;.      goto 
2e3e0 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
2e3f0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53 71  t;.    }.    zSq
2e400 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  l = sqlite3_mpri
2e410 6e 74 66 28 22 50 52 41 47 4d 41 20 69 6e 64 65  ntf("PRAGMA inde
2e420 78 5f 78 69 6e 66 6f 3d 27 25 71 27 22 2c 20 61  x_xinfo='%q'", a
2e430 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 72 63  zArg[1]);.    rc
2e440 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
2e450 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71  re_v2(p->db, zSq
2e460 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
2e470 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
2e480 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69  ree(zSql);.    i
2e490 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
2e4a0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
2e4b0 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
2e4c0 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a   ){.      char z
2e4d0 4c 61 62 65 6c 5b 32 30 5d 3b 0a 20 20 20 20 20  Label[20];.     
2e4e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
2e4f0 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  l = (const char*
2e500 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
2e510 74 65 78 74 28 70 53 74 6d 74 2c 32 29 3b 0a 20  text(pStmt,2);. 
2e520 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20       i++;.      
2e530 69 66 28 20 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20  if( zCol==0 ){. 
2e540 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
2e550 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
2e560 74 6d 74 2c 31 29 3d 3d 2d 31 20 29 7b 0a 20 20  tmt,1)==-1 ){.  
2e570 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d 20 22          zCol = "
2e580 5f 52 4f 57 49 44 5f 22 3b 0a 20 20 20 20 20 20  _ROWID_";.      
2e590 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2e5a0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2e5b0 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 61 62 65  ntf(sizeof(zLabe
2e5c0 6c 29 2c 7a 4c 61 62 65 6c 2c 22 65 78 70 72 25  l),zLabel,"expr%
2e5d0 64 22 2c 69 29 3b 0a 20 20 20 20 20 20 20 20 20  d",i);.         
2e5e0 20 7a 43 6f 6c 20 3d 20 7a 4c 61 62 65 6c 3b 0a   zCol = zLabel;.
2e5f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2e600 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f 6c  }.      if( zCol
2e610 6c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  list==0 ){.     
2e620 20 20 20 7a 43 6f 6c 6c 69 73 74 20 3d 20 73 71     zCollist = sq
2e630 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 5c  lite3_mprintf("\
2e640 22 25 77 5c 22 22 2c 20 7a 43 6f 6c 29 3b 0a 20  "%w\"", zCol);. 
2e650 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2e660 20 20 20 20 7a 43 6f 6c 6c 69 73 74 20 3d 20 73      zCollist = s
2e670 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
2e680 25 7a 2c 5c 22 25 77 5c 22 22 2c 20 7a 43 6f 6c  %z,\"%w\"", zCol
2e690 6c 69 73 74 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20  list, zCol);.   
2e6a0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
2e6b0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
2e6c0 70 53 74 6d 74 29 3b 0a 20 20 20 20 7a 53 71 6c  pStmt);.    zSql
2e6d0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2e6e0 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 22 43  tf(.          "C
2e6f0 52 45 41 54 45 20 54 41 42 4c 45 20 5c 22 25 77  REATE TABLE \"%w
2e700 5c 22 28 25 73 2c 50 52 49 4d 41 52 59 20 4b 45  \"(%s,PRIMARY KE
2e710 59 28 25 73 29 29 57 49 54 48 4f 55 54 20 52 4f  Y(%s))WITHOUT RO
2e720 57 49 44 22 2c 0a 20 20 20 20 20 20 20 20 20 20  WID",.          
2e730 61 7a 41 72 67 5b 32 5d 2c 20 7a 43 6f 6c 6c 69  azArg[2], zColli
2e740 73 74 2c 20 7a 43 6f 6c 6c 69 73 74 29 3b 0a 20  st, zCollist);. 
2e750 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2e760 7a 43 6f 6c 6c 69 73 74 29 3b 0a 20 20 20 20 72  zCollist);.    r
2e770 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74  c = sqlite3_test
2e780 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
2e790 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45  TESTCTRL_IMPOSTE
2e7a0 52 2c 20 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22  R, p->db, "main"
2e7b0 2c 20 31 2c 20 74 6e 75 6d 29 3b 0a 20 20 20 20  , 1, tnum);.    
2e7c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
2e7d0 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
2e7e0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
2e7f0 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20  db, zSql, 0, 0, 
2e800 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
2e810 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53  3_test_control(S
2e820 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49  QLITE_TESTCTRL_I
2e830 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64 62 2c 20  MPOSTER, p->db, 
2e840 22 6d 61 69 6e 22 2c 20 30 2c 20 30 29 3b 0a 20  "main", 0, 0);. 
2e850 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
2e860 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2e870 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
2e880 72 20 69 6e 20 5b 25 73 5d 3a 20 25 73 5c 6e 22  r in [%s]: %s\n"
2e890 2c 20 7a 53 71 6c 2c 20 73 71 6c 69 74 65 33 5f  , zSql, sqlite3_
2e8a0 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a  errmsg(p->db));.
2e8b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2e8c0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2e8d0 28 73 74 64 6f 75 74 2c 20 22 25 73 3b 5c 6e 22  (stdout, "%s;\n"
2e8e0 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20  , zSql);.       
2e8f0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 6f   raw_printf(stdo
2e900 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 22  ut,.           "
2e910 57 41 52 4e 49 4e 47 3a 20 77 72 69 74 69 6e 67  WARNING: writing
2e920 20 74 6f 20 61 6e 20 69 6d 70 6f 73 74 65 72 20   to an imposter 
2e930 74 61 62 6c 65 20 77 69 6c 6c 20 63 6f 72 72 75  table will corru
2e940 70 74 20 74 68 65 20 69 6e 64 65 78 21 5c 6e 22  pt the index!\n"
2e950 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
2e960 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
2e970 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2e980 73 74 64 65 72 72 2c 20 22 53 51 4c 49 54 45 5f  stderr, "SQLITE_
2e990 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45  TESTCTRL_IMPOSTE
2e9a0 52 20 72 65 74 75 72 6e 73 20 25 64 5c 6e 22 2c  R returns %d\n",
2e9b0 20 72 63 29 3b 0a 20 20 20 20 20 20 72 63 20 3d   rc);.      rc =
2e9c0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   1;.    }.    sq
2e9d0 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
2e9e0 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
2e9f0 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
2ea00 49 54 45 5f 4f 4d 49 54 5f 54 45 53 54 5f 43 4f  ITE_OMIT_TEST_CO
2ea10 4e 54 52 4f 4c 29 20 2a 2f 0a 0a 23 69 66 64 65  NTROL) */..#ifde
2ea20 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2ea30 49 4f 54 52 41 43 45 0a 20 20 69 66 28 20 63 3d  IOTRACE.  if( c=
2ea40 3d 27 69 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='i' && strncmp(
2ea50 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6f 74 72 61  azArg[0], "iotra
2ea60 63 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ce", n)==0 ){.  
2ea70 20 20 53 51 4c 49 54 45 5f 41 50 49 20 65 78 74    SQLITE_API ext
2ea80 65 72 6e 20 76 6f 69 64 20 28 53 51 4c 49 54 45  ern void (SQLITE
2ea90 5f 43 44 45 43 4c 20 2a 73 71 6c 69 74 65 33 49  _CDECL *sqlite3I
2eaa0 6f 54 72 61 63 65 29 28 63 6f 6e 73 74 20 63 68  oTrace)(const ch
2eab0 61 72 2a 2c 20 2e 2e 2e 29 3b 0a 20 20 20 20 69  ar*, ...);.    i
2eac0 66 28 20 69 6f 74 72 61 63 65 20 26 26 20 69 6f  f( iotrace && io
2ead0 74 72 61 63 65 21 3d 73 74 64 6f 75 74 20 29 20  trace!=stdout ) 
2eae0 66 63 6c 6f 73 65 28 69 6f 74 72 61 63 65 29 3b  fclose(iotrace);
2eaf0 0a 20 20 20 20 69 6f 74 72 61 63 65 20 3d 20 30  .    iotrace = 0
2eb00 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32  ;.    if( nArg<2
2eb10 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2eb20 33 49 6f 54 72 61 63 65 20 3d 20 30 3b 0a 20 20  3IoTrace = 0;.  
2eb30 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
2eb40 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 20 22 2d 22  mp(azArg[1], "-"
2eb50 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  )==0 ){.      sq
2eb60 6c 69 74 65 33 49 6f 54 72 61 63 65 20 3d 20 69  lite3IoTrace = i
2eb70 6f 74 72 61 63 65 50 72 69 6e 74 66 3b 0a 20 20  otracePrintf;.  
2eb80 20 20 20 20 69 6f 74 72 61 63 65 20 3d 20 73 74      iotrace = st
2eb90 64 6f 75 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  dout;.    }else{
2eba0 0a 20 20 20 20 20 20 69 6f 74 72 61 63 65 20 3d  .      iotrace =
2ebb0 20 66 6f 70 65 6e 28 61 7a 41 72 67 5b 31 5d 2c   fopen(azArg[1],
2ebc0 20 22 77 22 29 3b 0a 20 20 20 20 20 20 69 66 28   "w");.      if(
2ebd0 20 69 6f 74 72 61 63 65 3d 3d 30 20 29 7b 0a 20   iotrace==0 ){. 
2ebe0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2ebf0 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
2ec00 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c  r: cannot open \
2ec10 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b  "%s\"\n", azArg[
2ec20 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  1]);.        sql
2ec30 69 74 65 33 49 6f 54 72 61 63 65 20 3d 20 30 3b  ite3IoTrace = 0;
2ec40 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
2ec50 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2ec60 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54        sqlite3IoT
2ec70 72 61 63 65 20 3d 20 69 6f 74 72 61 63 65 50 72  race = iotracePr
2ec80 69 6e 74 66 3b 0a 20 20 20 20 20 20 7d 0a 20 20  intf;.      }.  
2ec90 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64    }.  }else.#end
2eca0 69 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27  if..  if( c=='l'
2ecb0 20 26 26 20 6e 3e 3d 35 20 26 26 20 73 74 72 6e   && n>=5 && strn
2ecc0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c  cmp(azArg[0], "l
2ecd0 69 6d 69 74 73 22 2c 20 6e 29 3d 3d 30 20 29 7b  imits", n)==0 ){
2ece0 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
2ecf0 74 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20  t struct {.     
2ed00 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c    const char *zL
2ed10 69 6d 69 74 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e  imitName;   /* N
2ed20 61 6d 65 20 6f 66 20 61 20 6c 69 6d 69 74 20 2a  ame of a limit *
2ed30 2f 0a 20 20 20 20 20 20 20 69 6e 74 20 6c 69 6d  /.       int lim
2ed40 69 74 43 6f 64 65 3b 20 20 20 20 20 20 20 20 20  itCode;         
2ed50 20 20 20 2f 2a 20 49 6e 74 65 67 65 72 20 63 6f     /* Integer co
2ed60 64 65 20 66 6f 72 20 74 68 61 74 20 6c 69 6d 69  de for that limi
2ed70 74 20 2a 2f 0a 20 20 20 20 7d 20 61 4c 69 6d 69  t */.    } aLimi
2ed80 74 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20  t[] = {.      { 
2ed90 22 6c 65 6e 67 74 68 22 2c 20 20 20 20 20 20 20  "length",       
2eda0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
2edb0 4c 49 4d 49 54 5f 4c 45 4e 47 54 48 20 20 20 20  LIMIT_LENGTH    
2edc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2edd0 7d 2c 0a 20 20 20 20 20 20 7b 20 22 73 71 6c 5f  },.      { "sql_
2ede0 6c 65 6e 67 74 68 22 2c 20 20 20 20 20 20 20 20  length",        
2edf0 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
2ee00 5f 53 51 4c 5f 4c 45 4e 47 54 48 20 20 20 20 20  _SQL_LENGTH     
2ee10 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2ee20 20 20 20 20 7b 20 22 63 6f 6c 75 6d 6e 22 2c 20      { "column", 
2ee30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
2ee40 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55  QLITE_LIMIT_COLU
2ee50 4d 4e 20 20 20 20 20 20 20 20 20 20 20 20 20 20  MN              
2ee60 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
2ee70 20 22 65 78 70 72 5f 64 65 70 74 68 22 2c 20 20   "expr_depth",  
2ee80 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
2ee90 5f 4c 49 4d 49 54 5f 45 58 50 52 5f 44 45 50 54  _LIMIT_EXPR_DEPT
2eea0 48 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  H               
2eeb0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 63 6f 6d   },.      { "com
2eec0 70 6f 75 6e 64 5f 73 65 6c 65 63 74 22 2c 20 20  pound_select",  
2eed0 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
2eee0 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53 45 4c 45 43  T_COMPOUND_SELEC
2eef0 54 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  T           },. 
2ef00 20 20 20 20 20 7b 20 22 76 64 62 65 5f 6f 70 22       { "vdbe_op"
2ef10 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
2ef20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 44 42  SQLITE_LIMIT_VDB
2ef30 45 5f 4f 50 20 20 20 20 20 20 20 20 20 20 20 20  E_OP            
2ef40 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
2ef50 7b 20 22 66 75 6e 63 74 69 6f 6e 5f 61 72 67 22  { "function_arg"
2ef60 2c 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  ,          SQLIT
2ef70 45 5f 4c 49 4d 49 54 5f 46 55 4e 43 54 49 4f 4e  E_LIMIT_FUNCTION
2ef80 5f 41 52 47 20 20 20 20 20 20 20 20 20 20 20 20  _ARG            
2ef90 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 61 74    },.      { "at
2efa0 74 61 63 68 65 64 22 2c 20 20 20 20 20 20 20 20  tached",        
2efb0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
2efc0 49 54 5f 41 54 54 41 43 48 45 44 20 20 20 20 20  IT_ATTACHED     
2efd0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
2efe0 20 20 20 20 20 20 7b 20 22 6c 69 6b 65 5f 70 61        { "like_pa
2eff0 74 74 65 72 6e 5f 6c 65 6e 67 74 68 22 2c 20 20  ttern_length",  
2f000 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c 49   SQLITE_LIMIT_LI
2f010 4b 45 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54  KE_PATTERN_LENGT
2f020 48 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  H       },.     
2f030 20 7b 20 22 76 61 72 69 61 62 6c 65 5f 6e 75 6d   { "variable_num
2f040 62 65 72 22 2c 20 20 20 20 20 20 20 53 51 4c 49  ber",       SQLI
2f050 54 45 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c  TE_LIMIT_VARIABL
2f060 45 5f 4e 55 4d 42 45 52 20 20 20 20 20 20 20 20  E_NUMBER        
2f070 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 74     },.      { "t
2f080 72 69 67 67 65 72 5f 64 65 70 74 68 22 2c 20 20  rigger_depth",  
2f090 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49         SQLITE_LI
2f0a0 4d 49 54 5f 54 52 49 47 47 45 52 5f 44 45 50 54  MIT_TRIGGER_DEPT
2f0b0 48 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c  H             },
2f0c0 0a 20 20 20 20 20 20 7b 20 22 77 6f 72 6b 65 72  .      { "worker
2f0d0 5f 74 68 72 65 61 64 73 22 2c 20 20 20 20 20 20  _threads",      
2f0e0 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 57    SQLITE_LIMIT_W
2f0f0 4f 52 4b 45 52 5f 54 48 52 45 41 44 53 20 20 20  ORKER_THREADS   
2f100 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2f110 7d 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 32  };.    int i, n2
2f120 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  ;.    open_db(p,
2f130 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72   0);.    if( nAr
2f140 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 66 6f  g==1 ){.      fo
2f150 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
2f160 7a 65 28 61 4c 69 6d 69 74 29 3b 20 69 2b 2b 29  ze(aLimit); i++)
2f170 7b 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66  {.        printf
2f180 28 22 25 32 30 73 20 25 64 5c 6e 22 2c 20 61 4c  ("%20s %d\n", aL
2f190 69 6d 69 74 5b 69 5d 2e 7a 4c 69 6d 69 74 4e 61  imit[i].zLimitNa
2f1a0 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  me,.            
2f1b0 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74     sqlite3_limit
2f1c0 28 70 2d 3e 64 62 2c 20 61 4c 69 6d 69 74 5b 69  (p->db, aLimit[i
2f1d0 5d 2e 6c 69 6d 69 74 43 6f 64 65 2c 20 2d 31 29  ].limitCode, -1)
2f1e0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
2f1f0 65 6c 73 65 20 69 66 28 20 6e 41 72 67 3e 33 20  else if( nArg>3 
2f200 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
2f210 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
2f220 67 65 3a 20 2e 6c 69 6d 69 74 20 4e 41 4d 45 20  ge: .limit NAME 
2f230 3f 4e 45 57 2d 56 41 4c 55 45 3f 5c 6e 22 29 3b  ?NEW-VALUE?\n");
2f240 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
2f250 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
2f260 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
2f270 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
2f280 74 20 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20  t iLimit = -1;. 
2f290 20 20 20 20 20 6e 32 20 3d 20 73 74 72 6c 65 6e       n2 = strlen
2f2a0 33 30 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  30(azArg[1]);.  
2f2b0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41      for(i=0; i<A
2f2c0 72 72 61 79 53 69 7a 65 28 61 4c 69 6d 69 74 29  rraySize(aLimit)
2f2d0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2f2e0 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e  if( sqlite3_strn
2f2f0 69 63 6d 70 28 61 4c 69 6d 69 74 5b 69 5d 2e 7a  icmp(aLimit[i].z
2f300 4c 69 6d 69 74 4e 61 6d 65 2c 20 61 7a 41 72 67  LimitName, azArg
2f310 5b 31 5d 2c 20 6e 32 29 3d 3d 30 20 29 7b 0a 20  [1], n2)==0 ){. 
2f320 20 20 20 20 20 20 20 20 20 69 66 28 20 69 4c 69           if( iLi
2f330 6d 69 74 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  mit<0 ){.       
2f340 20 20 20 20 20 69 4c 69 6d 69 74 20 3d 20 69 3b       iLimit = i;
2f350 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
2f360 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74  {.            ut
2f370 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2f380 2c 20 22 61 6d 62 69 67 75 6f 75 73 20 6c 69 6d  , "ambiguous lim
2f390 69 74 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61  it: \"%s\"\n", a
2f3a0 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
2f3b0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
2f3c0 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d            goto m
2f3d0 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
2f3e0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2f3f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2f400 20 20 20 20 20 20 69 66 28 20 69 4c 69 6d 69 74        if( iLimit
2f410 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  <0 ){.        ut
2f420 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2f430 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6c 69 6d 69 74  , "unknown limit
2f440 3a 20 5c 22 25 73 5c 22 5c 6e 22 0a 20 20 20 20  : \"%s\"\n".    
2f450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f460 20 20 20 20 22 65 6e 74 65 72 20 5c 22 2e 6c 69      "enter \".li
2f470 6d 69 74 73 5c 22 20 77 69 74 68 20 6e 6f 20 61  mits\" with no a
2f480 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 61 20 6c  rguments for a l
2f490 69 73 74 2e 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ist.\n",.       
2f4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f4b0 20 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20    azArg[1]);.   
2f4c0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
2f4d0 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
2f4e0 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
2f4f0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
2f500 41 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20  Arg==3 ){.      
2f510 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28    sqlite3_limit(
2f520 70 2d 3e 64 62 2c 20 61 4c 69 6d 69 74 5b 69 4c  p->db, aLimit[iL
2f530 69 6d 69 74 5d 2e 6c 69 6d 69 74 43 6f 64 65 2c  imit].limitCode,
2f540 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f550 20 20 20 20 20 20 20 28 69 6e 74 29 69 6e 74 65         (int)inte
2f560 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 32  gerValue(azArg[2
2f570 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ]));.      }.   
2f580 20 20 20 70 72 69 6e 74 66 28 22 25 32 30 73 20     printf("%20s 
2f590 25 64 5c 6e 22 2c 20 61 4c 69 6d 69 74 5b 69 4c  %d\n", aLimit[iL
2f5a0 69 6d 69 74 5d 2e 7a 4c 69 6d 69 74 4e 61 6d 65  imit].zLimitName
2f5b0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73  ,.             s
2f5c0 71 6c 69 74 65 33 5f 6c 69 6d 69 74 28 70 2d 3e  qlite3_limit(p->
2f5d0 64 62 2c 20 61 4c 69 6d 69 74 5b 69 4c 69 6d 69  db, aLimit[iLimi
2f5e0 74 5d 2e 6c 69 6d 69 74 43 6f 64 65 2c 20 2d 31  t].limitCode, -1
2f5f0 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ));.    }.  }els
2f600 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27 20  e..  if( c=='l' 
2f610 26 26 20 6e 3e 32 20 26 26 20 73 74 72 6e 63 6d  && n>2 && strncm
2f620 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 69 6e  p(azArg[0], "lin
2f630 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  t", n)==0 ){.   
2f640 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
2f650 20 20 20 20 6c 69 6e 74 44 6f 74 43 6f 6d 6d 61      lintDotComma
2f660 6e 64 28 70 2c 20 61 7a 41 72 67 2c 20 6e 41 72  nd(p, azArg, nAr
2f670 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 23 69 66  g);.  }else..#if
2f680 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
2f690 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a  _LOAD_EXTENSION.
2f6a0 20 20 69 66 28 20 63 3d 3d 27 6c 27 20 26 26 20    if( c=='l' && 
2f6b0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2f6c0 2c 20 22 6c 6f 61 64 22 2c 20 6e 29 3d 3d 30 20  , "load", n)==0 
2f6d0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
2f6e0 72 20 2a 7a 46 69 6c 65 2c 20 2a 7a 50 72 6f 63  r *zFile, *zProc
2f6f0 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72  ;.    char *zErr
2f700 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Msg = 0;.    if(
2f710 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20   nArg<2 ){.     
2f720 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2f730 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 6c 6f 61  rr, "Usage: .loa
2f740 64 20 46 49 4c 45 20 3f 45 4e 54 52 59 50 4f 49  d FILE ?ENTRYPOI
2f750 4e 54 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  NT?\n");.      r
2f760 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74  c = 1;.      got
2f770 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
2f780 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a  xit;.    }.    z
2f790 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b  File = azArg[1];
2f7a0 0a 20 20 20 20 7a 50 72 6f 63 20 3d 20 6e 41 72  .    zProc = nAr
2f7b0 67 3e 3d 33 20 3f 20 61 7a 41 72 67 5b 32 5d 20  g>=3 ? azArg[2] 
2f7c0 3a 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62  : 0;.    open_db
2f7d0 28 70 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d  (p, 0);.    rc =
2f7e0 20 73 71 6c 69 74 65 33 5f 6c 6f 61 64 5f 65 78   sqlite3_load_ex
2f7f0 74 65 6e 73 69 6f 6e 28 70 2d 3e 64 62 2c 20 7a  tension(p->db, z
2f800 46 69 6c 65 2c 20 7a 50 72 6f 63 2c 20 26 7a 45  File, zProc, &zE
2f810 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66 28 20  rrMsg);.    if( 
2f820 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2f830 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
2f840 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
2f850 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73  r: %s\n", zErrMs
2f860 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  g);.      sqlite
2f870 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b  3_free(zErrMsg);
2f880 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
2f890 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e     }.  }else.#en
2f8a0 64 69 66 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6c  dif..  if( c=='l
2f8b0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
2f8c0 72 67 5b 30 5d 2c 20 22 6c 6f 67 22 2c 20 6e 29  rg[0], "log", n)
2f8d0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
2f8e0 41 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg!=2 ){.      
2f8f0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2f900 72 2c 20 22 55 73 61 67 65 3a 20 2e 6c 6f 67 20  r, "Usage: .log 
2f910 46 49 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20  FILENAME\n");.  
2f920 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2f930 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 6f 6e  }else{.      con
2f940 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d  st char *zFile =
2f950 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 20   azArg[1];.     
2f960 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f   output_file_clo
2f970 73 65 28 70 2d 3e 70 4c 6f 67 29 3b 0a 20 20 20  se(p->pLog);.   
2f980 20 20 20 70 2d 3e 70 4c 6f 67 20 3d 20 6f 75 74     p->pLog = out
2f990 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28 7a 46  put_file_open(zF
2f9a0 69 6c 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  ile, 0);.    }. 
2f9b0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
2f9c0 3d 27 6d 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='m' && strncmp(
2f9d0 61 7a 41 72 67 5b 30 5d 2c 20 22 6d 6f 64 65 22  azArg[0], "mode"
2f9e0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63  , n)==0 ){.    c
2f9f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f 64 65  onst char *zMode
2fa00 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41   = nArg>=2 ? azA
2fa10 72 67 5b 31 5d 20 3a 20 22 22 3b 0a 20 20 20 20  rg[1] : "";.    
2fa20 69 6e 74 20 6e 32 20 3d 20 73 74 72 6c 65 6e 33  int n2 = strlen3
2fa30 30 28 7a 4d 6f 64 65 29 3b 0a 20 20 20 20 69 6e  0(zMode);.    in
2fa40 74 20 63 32 20 3d 20 7a 4d 6f 64 65 5b 30 5d 3b  t c2 = zMode[0];
2fa50 0a 20 20 20 20 69 66 28 20 63 32 3d 3d 27 6c 27  .    if( c2=='l'
2fa60 20 26 26 20 6e 32 3e 32 20 26 26 20 73 74 72 6e   && n2>2 && strn
2fa70 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 69  cmp(azArg[1],"li
2fa80 6e 65 73 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20  nes",n2)==0 ){. 
2fa90 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d       p->mode = M
2faa0 4f 44 45 5f 4c 69 6e 65 3b 0a 20 20 20 20 20 20  ODE_Line;.      
2fab0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2fac0 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65  (sizeof(p->rowSe
2fad0 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77  parator), p->row
2fae0 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52  Separator, SEP_R
2faf0 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ow);.    }else i
2fb00 66 28 20 63 32 3d 3d 27 63 27 20 26 26 20 73 74  f( c2=='c' && st
2fb10 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  rncmp(azArg[1],"
2fb20 63 6f 6c 75 6d 6e 73 22 2c 6e 32 29 3d 3d 30 20  columns",n2)==0 
2fb30 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  ){.      p->mode
2fb40 20 3d 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3b 0a   = MODE_Column;.
2fb50 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
2fb60 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
2fb70 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20  >rowSeparator), 
2fb80 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c  p->rowSeparator,
2fb90 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20 7d   SEP_Row);.    }
2fba0 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 6c 27  else if( c2=='l'
2fbb0 20 26 26 20 6e 32 3e 32 20 26 26 20 73 74 72 6e   && n2>2 && strn
2fbc0 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 69  cmp(azArg[1],"li
2fbd0 73 74 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  st",n2)==0 ){.  
2fbe0 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
2fbf0 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 20 20 73  DE_List;.      s
2fc00 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2fc10 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70  sizeof(p->colSep
2fc20 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53  arator), p->colS
2fc30 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 43 6f  eparator, SEP_Co
2fc40 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  lumn);.      sql
2fc50 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
2fc60 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72  zeof(p->rowSepar
2fc70 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70  ator), p->rowSep
2fc80 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29  arator, SEP_Row)
2fc90 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2fca0 63 32 3d 3d 27 68 27 20 26 26 20 73 74 72 6e 63  c2=='h' && strnc
2fcb0 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 68 74 6d  mp(azArg[1],"htm
2fcc0 6c 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20  l",n2)==0 ){.   
2fcd0 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
2fce0 45 5f 48 74 6d 6c 3b 0a 20 20 20 20 7d 65 6c 73  E_Html;.    }els
2fcf0 65 20 69 66 28 20 63 32 3d 3d 27 74 27 20 26 26  e if( c2=='t' &&
2fd00 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31   strncmp(azArg[1
2fd10 5d 2c 22 74 63 6c 22 2c 6e 32 29 3d 3d 30 20 29  ],"tcl",n2)==0 )
2fd20 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20  {.      p->mode 
2fd30 3d 20 4d 4f 44 45 5f 54 63 6c 3b 0a 20 20 20 20  = MODE_Tcl;.    
2fd40 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2fd50 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c  tf(sizeof(p->col
2fd60 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63  Separator), p->c
2fd70 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50  olSeparator, SEP
2fd80 5f 53 70 61 63 65 29 3b 0a 20 20 20 20 20 20 73  _Space);.      s
2fd90 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2fda0 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70  sizeof(p->rowSep
2fdb0 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53  arator), p->rowS
2fdc0 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f  eparator, SEP_Ro
2fdd0 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  w);.    }else if
2fde0 28 20 63 32 3d 3d 27 63 27 20 26 26 20 73 74 72  ( c2=='c' && str
2fdf0 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 63  ncmp(azArg[1],"c
2fe00 73 76 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  sv",n2)==0 ){.  
2fe10 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
2fe20 44 45 5f 43 73 76 3b 0a 20 20 20 20 20 20 73 71  DE_Csv;.      sq
2fe30 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
2fe40 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61  izeof(p->colSepa
2fe50 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65  rator), p->colSe
2fe60 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 43 6f 6d  parator, SEP_Com
2fe70 6d 61 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ma);.      sqlit
2fe80 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
2fe90 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  of(p->rowSeparat
2fea0 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  or), p->rowSepar
2feb0 61 74 6f 72 2c 20 53 45 50 5f 43 72 4c 66 29 3b  ator, SEP_CrLf);
2fec0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
2fed0 32 3d 3d 27 74 27 20 26 26 20 73 74 72 6e 63 6d  2=='t' && strncm
2fee0 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74 61 62 73  p(azArg[1],"tabs
2fef0 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ",n2)==0 ){.    
2ff00 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45    p->mode = MODE
2ff10 5f 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 71 6c  _List;.      sql
2ff20 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
2ff30 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72  zeof(p->colSepar
2ff40 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70  ator), p->colSep
2ff50 61 72 61 74 6f 72 2c 20 53 45 50 5f 54 61 62 29  arator, SEP_Tab)
2ff60 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2ff70 63 32 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63  c2=='i' && strnc
2ff80 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 69 6e 73  mp(azArg[1],"ins
2ff90 65 72 74 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20  ert",n2)==0 ){. 
2ffa0 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d       p->mode = M
2ffb0 4f 44 45 5f 49 6e 73 65 72 74 3b 0a 20 20 20 20  ODE_Insert;.    
2ffc0 20 20 73 65 74 5f 74 61 62 6c 65 5f 6e 61 6d 65    set_table_name
2ffd0 28 70 2c 20 6e 41 72 67 3e 3d 33 20 3f 20 61 7a  (p, nArg>=3 ? az
2ffe0 41 72 67 5b 32 5d 20 3a 20 22 74 61 62 6c 65 22  Arg[2] : "table"
2fff0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
30000 20 63 32 3d 3d 27 71 27 20 26 26 20 73 74 72 6e   c2=='q' && strn
30010 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 71 75  cmp(azArg[1],"qu
30020 6f 74 65 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20  ote",n2)==0 ){. 
30030 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d       p->mode = M
30040 4f 44 45 5f 51 75 6f 74 65 3b 0a 20 20 20 20 7d  ODE_Quote;.    }
30050 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 61 27  else if( c2=='a'
30060 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
30070 67 5b 31 5d 2c 22 61 73 63 69 69 22 2c 6e 32 29  g[1],"ascii",n2)
30080 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
30090 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 41 73 63 69  mode = MODE_Asci
300a0 69 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  i;.      sqlite3
300b0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
300c0 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72  (p->colSeparator
300d0 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  ), p->colSeparat
300e0 6f 72 2c 20 53 45 50 5f 55 6e 69 74 29 3b 0a 20  or, SEP_Unit);. 
300f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
30100 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
30110 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70  rowSeparator), p
30120 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20  ->rowSeparator, 
30130 53 45 50 5f 52 65 63 6f 72 64 29 3b 0a 20 20 20  SEP_Record);.   
30140 20 7d 65 6c 73 65 20 69 66 28 20 6e 41 72 67 3d   }else if( nArg=
30150 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  =1 ){.      raw_
30160 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
30170 63 75 72 72 65 6e 74 20 6f 75 74 70 75 74 20 6d  current output m
30180 6f 64 65 3a 20 25 73 5c 6e 22 2c 20 6d 6f 64 65  ode: %s\n", mode
30190 44 65 73 63 72 5b 70 2d 3e 6d 6f 64 65 5d 29 3b  Descr[p->mode]);
301a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
301b0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
301c0 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6d 6f 64  err, "Error: mod
301d0 65 20 73 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20  e should be one 
301e0 6f 66 3a 20 22 0a 20 20 20 20 20 20 20 20 20 22  of: ".         "
301f0 61 73 63 69 69 20 63 6f 6c 75 6d 6e 20 63 73 76  ascii column csv
30200 20 68 74 6d 6c 20 69 6e 73 65 72 74 20 6c 69 6e   html insert lin
30210 65 20 6c 69 73 74 20 71 75 6f 74 65 20 74 61 62  e list quote tab
30220 73 20 74 63 6c 5c 6e 22 29 3b 0a 20 20 20 20 20  s tcl\n");.     
30230 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
30240 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d     p->cMode = p-
30250 3e 6d 6f 64 65 3b 0a 20 20 7d 65 6c 73 65 0a 0a  >mode;.  }else..
30260 20 20 69 66 28 20 63 3d 3d 27 6e 27 20 26 26 20    if( c=='n' && 
30270 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
30280 2c 20 22 6e 75 6c 6c 76 61 6c 75 65 22 2c 20 6e  , "nullvalue", n
30290 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
302a0 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20  nArg==2 ){.     
302b0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
302c0 66 28 73 69 7a 65 6f 66 28 70 2d 3e 6e 75 6c 6c  f(sizeof(p->null
302d0 56 61 6c 75 65 29 2c 20 70 2d 3e 6e 75 6c 6c 56  Value), p->nullV
302e0 61 6c 75 65 2c 0a 20 20 20 20 20 20 20 20 20 20  alue,.          
302f0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25 2e               "%.
30300 2a 73 22 2c 20 28 69 6e 74 29 41 72 72 61 79 53  *s", (int)ArrayS
30310 69 7a 65 28 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65  ize(p->nullValue
30320 29 2d 31 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  )-1, azArg[1]);.
30330 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30340 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
30350 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 6e 75 6c  rr, "Usage: .nul
30360 6c 76 61 6c 75 65 20 53 54 52 49 4e 47 5c 6e 22  lvalue STRING\n"
30370 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
30380 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
30390 20 20 69 66 28 20 63 3d 3d 27 6f 27 20 26 26 20    if( c=='o' && 
303a0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
303b0 2c 20 22 6f 70 65 6e 22 2c 20 6e 29 3d 3d 30 20  , "open", n)==0 
303c0 26 26 20 6e 3e 3d 32 20 29 7b 0a 20 20 20 20 63  && n>=2 ){.    c
303d0 68 61 72 20 2a 7a 4e 65 77 46 69 6c 65 6e 61 6d  har *zNewFilenam
303e0 65 3b 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  e;  /* Name of t
303f0 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
30400 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a 20 20 20 20   to open */.    
30410 69 6e 74 20 69 4e 61 6d 65 20 3d 20 31 3b 20 20  int iName = 1;  
30420 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 69 6e       /* Index in
30430 20 61 7a 41 72 67 5b 5d 20 6f 66 20 74 68 65 20   azArg[] of the 
30440 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  filename */.    
30450 69 6e 74 20 6e 65 77 46 6c 61 67 20 3d 20 30 3b  int newFlag = 0;
30460 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
30470 64 65 6c 65 74 65 20 66 69 6c 65 20 62 65 66 6f  delete file befo
30480 72 65 20 6f 70 65 6e 69 6e 67 20 2a 2f 0a 20 20  re opening */.  
30490 20 20 2f 2a 20 43 6c 6f 73 65 20 74 68 65 20 65    /* Close the e
304a0 78 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65  xisting database
304b0 20 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f   */.    session_
304c0 63 6c 6f 73 65 5f 61 6c 6c 28 70 29 3b 0a 20 20  close_all(p);.  
304d0 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
304e0 70 2d 3e 64 62 29 3b 0a 20 20 20 20 70 2d 3e 64  p->db);.    p->d
304f0 62 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 7a 44  b = 0;.    p->zD
30500 62 46 69 6c 65 6e 61 6d 65 20 3d 20 30 3b 0a 20  bFilename = 0;. 
30510 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
30520 70 2d 3e 7a 46 72 65 65 4f 6e 43 6c 6f 73 65 29  p->zFreeOnClose)
30530 3b 0a 20 20 20 20 70 2d 3e 7a 46 72 65 65 4f 6e  ;.    p->zFreeOn
30540 43 6c 6f 73 65 20 3d 20 30 3b 0a 20 20 20 20 70  Close = 0;.    p
30550 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20 53 48 45  ->openMode = SHE
30560 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43 3b 0a  LL_OPEN_UNSPEC;.
30570 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72      /* Check for
30580 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72   command-line ar
30590 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 66  guments */.    f
305a0 6f 72 28 69 4e 61 6d 65 3d 31 3b 20 69 4e 61 6d  or(iName=1; iNam
305b0 65 3c 6e 41 72 67 20 26 26 20 61 7a 41 72 67 5b  e<nArg && azArg[
305c0 69 4e 61 6d 65 5d 5b 30 5d 3d 3d 27 2d 27 3b 20  iName][0]=='-'; 
305d0 69 4e 61 6d 65 2b 2b 29 7b 0a 20 20 20 20 20 20  iName++){.      
305e0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
305f0 61 7a 41 72 67 5b 69 4e 61 6d 65 5d 3b 0a 20 20  azArg[iName];.  
30600 20 20 20 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61      if( optionMa
30610 74 63 68 28 7a 2c 22 6e 65 77 22 29 20 29 7b 0a  tch(z,"new") ){.
30620 20 20 20 20 20 20 20 20 6e 65 77 46 6c 61 67 20          newFlag 
30630 3d 20 31 3b 0a 23 69 66 64 65 66 20 53 51 4c 49  = 1;.#ifdef SQLI
30640 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a 20 20 20  TE_HAVE_ZLIB.   
30650 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 74     }else if( opt
30660 69 6f 6e 4d 61 74 63 68 28 7a 2c 20 22 7a 69 70  ionMatch(z, "zip
30670 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  ") ){.        p-
30680 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20 53 48 45 4c  >openMode = SHEL
30690 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3b 0a  L_OPEN_ZIPFILE;.
306a0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65 6c  #endif.      }el
306b0 73 65 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74  se if( optionMat
306c0 63 68 28 7a 2c 20 22 61 70 70 65 6e 64 22 29 20  ch(z, "append") 
306d0 29 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 70  ){.        p->op
306e0 65 6e 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f  enMode = SHELL_O
306f0 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 3b 0a 20  PEN_APPENDVFS;. 
30700 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f       }else if( o
30710 70 74 69 6f 6e 4d 61 74 63 68 28 7a 2c 20 22 72  ptionMatch(z, "r
30720 65 61 64 6f 6e 6c 79 22 29 20 29 7b 0a 20 20 20  eadonly") ){.   
30730 20 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65       p->openMode
30740 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 52 45   = SHELL_OPEN_RE
30750 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 65  ADONLY;.      }e
30760 6c 73 65 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d  lse if( z[0]=='-
30770 27 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  ' ){.        utf
30780 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
30790 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e   "unknown option
307a0 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20  : %s\n", z);.   
307b0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
307c0 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
307d0 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
307e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f     }.    }.    /
307f0 2a 20 49 66 20 61 20 66 69 6c 65 6e 61 6d 65 20  * If a filename 
30800 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 74 72  is specified, tr
30810 79 20 74 6f 20 6f 70 65 6e 20 69 74 20 66 69 72  y to open it fir
30820 73 74 20 2a 2f 0a 20 20 20 20 7a 4e 65 77 46 69  st */.    zNewFi
30830 6c 65 6e 61 6d 65 20 3d 20 6e 41 72 67 3e 69 4e  lename = nArg>iN
30840 61 6d 65 20 3f 20 73 71 6c 69 74 65 33 5f 6d 70  ame ? sqlite3_mp
30850 72 69 6e 74 66 28 22 25 73 22 2c 20 61 7a 41 72  rintf("%s", azAr
30860 67 5b 69 4e 61 6d 65 5d 29 20 3a 20 30 3b 0a 20  g[iName]) : 0;. 
30870 20 20 20 69 66 28 20 7a 4e 65 77 46 69 6c 65 6e     if( zNewFilen
30880 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ame ){.      if(
30890 20 6e 65 77 46 6c 61 67 20 29 20 73 68 65 6c 6c   newFlag ) shell
308a0 44 65 6c 65 74 65 46 69 6c 65 28 7a 4e 65 77 46  DeleteFile(zNewF
308b0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
308c0 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d  p->zDbFilename =
308d0 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 3b 0a 20   zNewFilename;. 
308e0 20 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20       open_db(p, 
308f0 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  1);.      if( p-
30900 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  >db==0 ){.      
30910 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
30920 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61  derr, "Error: ca
30930 6e 6e 6f 74 20 6f 70 65 6e 20 27 25 73 27 5c 6e  nnot open '%s'\n
30940 22 2c 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 29  ", zNewFilename)
30950 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
30960 33 5f 66 72 65 65 28 7a 4e 65 77 46 69 6c 65 6e  3_free(zNewFilen
30970 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ame);.      }els
30980 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a 46  e{.        p->zF
30990 72 65 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 4e 65  reeOnClose = zNe
309a0 77 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20  wFilename;.     
309b0 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
309c0 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20   p->db==0 ){.   
309d0 20 20 20 2f 2a 20 41 73 20 61 20 66 61 6c 6c 2d     /* As a fall-
309e0 62 61 63 6b 20 6f 70 65 6e 20 61 20 54 45 4d 50  back open a TEMP
309f0 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
30a00 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d     p->zDbFilenam
30a10 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 6f 70 65  e = 0;.      ope
30a20 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20  n_db(p, 0);.    
30a30 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
30a40 20 28 63 3d 3d 27 6f 27 0a 20 20 20 20 20 20 20   (c=='o'.       
30a50 20 26 26 20 28 73 74 72 6e 63 6d 70 28 61 7a 41   && (strncmp(azA
30a60 72 67 5b 30 5d 2c 20 22 6f 75 74 70 75 74 22 2c  rg[0], "output",
30a70 20 6e 29 3d 3d 30 7c 7c 73 74 72 6e 63 6d 70 28   n)==0||strncmp(
30a80 61 7a 41 72 67 5b 30 5d 2c 20 22 6f 6e 63 65 22  azArg[0], "once"
30a90 2c 20 6e 29 3d 3d 30 29 29 0a 20 20 20 7c 7c 20  , n)==0)).   || 
30aa0 28 63 3d 3d 27 65 27 20 26 26 20 6e 3d 3d 35 20  (c=='e' && n==5 
30ab0 26 26 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b  && strcmp(azArg[
30ac0 30 5d 2c 22 65 78 63 65 6c 22 29 3d 3d 30 29 0a  0],"excel")==0).
30ad0 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63    ){.    const c
30ae0 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 6e 41 72  har *zFile = nAr
30af0 67 3e 3d 32 20 3f 20 61 7a 41 72 67 5b 31 5d 20  g>=2 ? azArg[1] 
30b00 3a 20 22 73 74 64 6f 75 74 22 3b 0a 20 20 20 20  : "stdout";.    
30b10 69 6e 74 20 62 54 78 74 4d 6f 64 65 20 3d 20 30  int bTxtMode = 0
30b20 3b 0a 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b  ;.    if( azArg[
30b30 30 5d 5b 30 5d 3d 3d 27 65 27 20 29 7b 0a 20 20  0][0]=='e' ){.  
30b40 20 20 20 20 2f 2a 20 54 72 61 6e 73 66 6f 72 6d      /* Transform
30b50 20 74 68 65 20 22 2e 65 78 63 65 6c 22 20 63 6f   the ".excel" co
30b60 6d 6d 61 6e 64 20 69 6e 74 6f 20 22 2e 6f 6e 63  mmand into ".onc
30b70 65 20 2d 78 22 20 2a 2f 0a 20 20 20 20 20 20 6e  e -x" */.      n
30b80 41 72 67 20 3d 20 32 3b 0a 20 20 20 20 20 20 61  Arg = 2;.      a
30b90 7a 41 72 67 5b 30 5d 20 3d 20 22 6f 6e 63 65 22  zArg[0] = "once"
30ba0 3b 0a 20 20 20 20 20 20 7a 46 69 6c 65 20 3d 20  ;.      zFile = 
30bb0 61 7a 41 72 67 5b 31 5d 20 3d 20 22 2d 78 22 3b  azArg[1] = "-x";
30bc0 0a 20 20 20 20 20 20 6e 20 3d 20 34 3b 0a 20 20  .      n = 4;.  
30bd0 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41 72 67    }.    if( nArg
30be0 3e 32 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  >2 ){.      utf8
30bf0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
30c00 22 55 73 61 67 65 3a 20 2e 25 73 20 5b 2d 65 7c  "Usage: .%s [-e|
30c10 2d 78 7c 46 49 4c 45 5d 5c 6e 22 2c 20 61 7a 41  -x|FILE]\n", azA
30c20 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 72 63  rg[0]);.      rc
30c30 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
30c40 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
30c50 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  it;.    }.    if
30c60 28 20 6e 3e 31 20 26 26 20 73 74 72 6e 63 6d 70  ( n>1 && strncmp
30c70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f 6e 63 65  (azArg[0], "once
30c80 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
30c90 20 20 69 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a    if( nArg<2 ){.
30ca0 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
30cb0 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
30cc0 65 3a 20 2e 6f 6e 63 65 20 28 2d 65 7c 2d 78 7c  e: .once (-e|-x|
30cd0 46 49 4c 45 29 5c 6e 22 29 3b 0a 20 20 20 20 20  FILE)\n");.     
30ce0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
30cf0 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
30d00 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20  mand_exit;.     
30d10 20 7d 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 43   }.      p->outC
30d20 6f 75 6e 74 20 3d 20 32 3b 0a 20 20 20 20 7d 65  ount = 2;.    }e
30d30 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6f 75  lse{.      p->ou
30d40 74 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20  tCount = 0;.    
30d50 7d 0a 20 20 20 20 6f 75 74 70 75 74 5f 72 65 73  }.    output_res
30d60 65 74 28 70 29 3b 0a 20 20 20 20 69 66 28 20 7a  et(p);.    if( z
30d70 46 69 6c 65 5b 30 5d 3d 3d 27 2d 27 20 26 26 20  File[0]=='-' && 
30d80 7a 46 69 6c 65 5b 31 5d 3d 3d 27 2d 27 20 29 20  zFile[1]=='-' ) 
30d90 7a 46 69 6c 65 2b 2b 3b 0a 23 69 66 6e 64 65 66  zFile++;.#ifndef
30da0 20 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53   SQLITE_NOHAVE_S
30db0 59 53 54 45 4d 0a 20 20 20 20 69 66 28 20 73 74  YSTEM.    if( st
30dc0 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22 2d 65 22  rcmp(zFile, "-e"
30dd0 29 3d 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28 7a  )==0 || strcmp(z
30de0 46 69 6c 65 2c 20 22 2d 78 22 29 3d 3d 30 20 29  File, "-x")==0 )
30df0 7b 0a 20 20 20 20 20 20 70 2d 3e 64 6f 58 64 67  {.      p->doXdg
30e00 4f 70 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20  Open = 1;.      
30e10 6f 75 74 70 75 74 4d 6f 64 65 50 75 73 68 28 70  outputModePush(p
30e20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 46 69  );.      if( zFi
30e30 6c 65 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a 20 20  le[1]=='x' ){.  
30e40 20 20 20 20 20 20 6e 65 77 54 65 6d 70 46 69 6c        newTempFil
30e50 65 28 70 2c 20 22 63 73 76 22 29 3b 0a 20 20 20  e(p, "csv");.   
30e60 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d       p->mode = M
30e70 4f 44 45 5f 43 73 76 3b 0a 20 20 20 20 20 20 20  ODE_Csv;.       
30e80 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
30e90 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53  f(sizeof(p->colS
30ea0 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f  eparator), p->co
30eb0 6c 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f  lSeparator, SEP_
30ec0 43 6f 6d 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  Comma);.        
30ed0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
30ee0 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65  (sizeof(p->rowSe
30ef0 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77  parator), p->row
30f00 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 43  Separator, SEP_C
30f10 72 4c 66 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rLf);.      }els
30f20 65 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 54 65  e{.        newTe
30f30 6d 70 46 69 6c 65 28 70 2c 20 22 74 78 74 22 29  mpFile(p, "txt")
30f40 3b 0a 20 20 20 20 20 20 20 20 62 54 78 74 4d 6f  ;.        bTxtMo
30f50 64 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  de = 1;.      }.
30f60 20 20 20 20 20 20 7a 46 69 6c 65 20 3d 20 70 2d        zFile = p-
30f70 3e 7a 54 65 6d 70 46 69 6c 65 3b 0a 20 20 20 20  >zTempFile;.    
30f80 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
30f90 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d  TE_NOHAVE_SYSTEM
30fa0 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 46 69 6c   */.    if( zFil
30fb0 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69 66  e[0]=='|' ){.#if
30fc0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
30fd0 50 4f 50 45 4e 0a 20 20 20 20 20 20 72 61 77 5f  POPEN.      raw_
30fe0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
30ff0 45 72 72 6f 72 3a 20 70 69 70 65 73 20 61 72 65  Error: pipes are
31000 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 69   not supported i
31010 6e 20 74 68 69 73 20 4f 53 5c 6e 22 29 3b 0a 20  n this OS\n");. 
31020 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
31030 20 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f     p->out = stdo
31040 75 74 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20  ut;.#else.      
31050 70 2d 3e 6f 75 74 20 3d 20 70 6f 70 65 6e 28 7a  p->out = popen(z
31060 46 69 6c 65 20 2b 20 31 2c 20 22 77 22 29 3b 0a  File + 1, "w");.
31070 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 75 74        if( p->out
31080 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ==0 ){.        u
31090 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
310a0 72 2c 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74  r,"Error: cannot
310b0 20 6f 70 65 6e 20 70 69 70 65 20 5c 22 25 73 5c   open pipe \"%s\
310c0 22 5c 6e 22 2c 20 7a 46 69 6c 65 20 2b 20 31 29  "\n", zFile + 1)
310d0 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 75 74  ;.        p->out
310e0 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20 20 20   = stdout;.     
310f0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
31100 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
31110 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
31120 28 73 69 7a 65 6f 66 28 70 2d 3e 6f 75 74 66 69  (sizeof(p->outfi
31130 6c 65 29 2c 20 70 2d 3e 6f 75 74 66 69 6c 65 2c  le), p->outfile,
31140 20 22 25 73 22 2c 20 7a 46 69 6c 65 29 3b 0a 20   "%s", zFile);. 
31150 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
31160 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
31170 2d 3e 6f 75 74 20 3d 20 6f 75 74 70 75 74 5f 66  ->out = output_f
31180 69 6c 65 5f 6f 70 65 6e 28 7a 46 69 6c 65 2c 20  ile_open(zFile, 
31190 62 54 78 74 4d 6f 64 65 29 3b 0a 20 20 20 20 20  bTxtMode);.     
311a0 20 69 66 28 20 70 2d 3e 6f 75 74 3d 3d 30 20 29   if( p->out==0 )
311b0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74  {.        if( st
311c0 72 63 6d 70 28 7a 46 69 6c 65 2c 22 6f 66 66 22  rcmp(zFile,"off"
311d0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
311e0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
311f0 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 63 61 6e  derr,"Error: can
31200 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 5c 22 25  not write to \"%
31210 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a  s\"\n", zFile);.
31220 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31230 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75    p->out = stdou
31240 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  t;.        rc = 
31250 31 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20  1;.      } else 
31260 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
31270 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
31280 66 28 70 2d 3e 6f 75 74 66 69 6c 65 29 2c 20 70  f(p->outfile), p
31290 2d 3e 6f 75 74 66 69 6c 65 2c 20 22 25 73 22 2c  ->outfile, "%s",
312a0 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 7d   zFile);.      }
312b0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
312c0 20 20 69 66 28 20 63 3d 3d 27 70 27 20 26 26 20    if( c=='p' && 
312d0 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=3 && strncmp(
312e0 61 7a 41 72 67 5b 30 5d 2c 20 22 70 72 69 6e 74  azArg[0], "print
312f0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
31300 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
31310 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =1; i<nArg; i++)
31320 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3e 31 20  {.      if( i>1 
31330 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e  ) raw_printf(p->
31340 6f 75 74 2c 20 22 20 22 29 3b 0a 20 20 20 20 20  out, " ");.     
31350 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
31360 6f 75 74 2c 20 22 25 73 22 2c 20 61 7a 41 72 67  out, "%s", azArg
31370 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
31380 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
31390 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73  t, "\n");.  }els
313a0 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 70 27 20  e..  if( c=='p' 
313b0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
313c0 5b 30 5d 2c 20 22 70 72 6f 6d 70 74 22 2c 20 6e  [0], "prompt", n
313d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
313e0 6e 41 72 67 20 3e 3d 20 32 29 20 7b 0a 20 20 20  nArg >= 2) {.   
313f0 20 20 20 73 74 72 6e 63 70 79 28 6d 61 69 6e 50     strncpy(mainP
31400 72 6f 6d 70 74 2c 61 7a 41 72 67 5b 31 5d 2c 28  rompt,azArg[1],(
31410 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28 6d 61  int)ArraySize(ma
31420 69 6e 50 72 6f 6d 70 74 29 2d 31 29 3b 0a 20 20  inPrompt)-1);.  
31430 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41 72 67    }.    if( nArg
31440 20 3e 3d 20 33 29 20 7b 0a 20 20 20 20 20 20 73   >= 3) {.      s
31450 74 72 6e 63 70 79 28 63 6f 6e 74 69 6e 75 65 50  trncpy(continueP
31460 72 6f 6d 70 74 2c 61 7a 41 72 67 5b 32 5d 2c 28  rompt,azArg[2],(
31470 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28 63 6f  int)ArraySize(co
31480 6e 74 69 6e 75 65 50 72 6f 6d 70 74 29 2d 31 29  ntinuePrompt)-1)
31490 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
314a0 0a 20 20 69 66 28 20 63 3d 3d 27 71 27 20 26 26  .  if( c=='q' &&
314b0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
314c0 5d 2c 20 22 71 75 69 74 22 2c 20 6e 29 3d 3d 30  ], "quit", n)==0
314d0 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 32 3b 0a   ){.    rc = 2;.
314e0 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
314f0 3d 3d 27 72 27 20 26 26 20 6e 3e 3d 33 20 26 26  =='r' && n>=3 &&
31500 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
31510 5d 2c 20 22 72 65 61 64 22 2c 20 6e 29 3d 3d 30  ], "read", n)==0
31520 20 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a 61 6c   ){.    FILE *al
31530 74 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21  t;.    if( nArg!
31540 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  =2 ){.      raw_
31550 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
31560 55 73 61 67 65 3a 20 2e 72 65 61 64 20 46 49 4c  Usage: .read FIL
31570 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  E\n");.      rc 
31580 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 1;.      goto 
31590 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
315a0 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 6c 74  t;.    }.    alt
315b0 20 3d 20 66 6f 70 65 6e 28 61 7a 41 72 67 5b 31   = fopen(azArg[1
315c0 5d 2c 20 22 72 62 22 29 3b 0a 20 20 20 20 69 66  ], "rb");.    if
315d0 28 20 61 6c 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( alt==0 ){.    
315e0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
315f0 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 63 61 6e  derr,"Error: can
31600 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c  not open \"%s\"\
31610 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  n", azArg[1]);. 
31620 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
31630 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
31640 20 3d 20 70 72 6f 63 65 73 73 5f 69 6e 70 75 74   = process_input
31650 28 70 2c 20 61 6c 74 29 3b 0a 20 20 20 20 20 20  (p, alt);.      
31660 66 63 6c 6f 73 65 28 61 6c 74 29 3b 0a 20 20 20  fclose(alt);.   
31670 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
31680 28 20 63 3d 3d 27 72 27 20 26 26 20 6e 3e 3d 33  ( c=='r' && n>=3
31690 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
316a0 67 5b 30 5d 2c 20 22 72 65 73 74 6f 72 65 22 2c  g[0], "restore",
316b0 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f   n)==0 ){.    co
316c0 6e 73 74 20 63 68 61 72 20 2a 7a 53 72 63 46 69  nst char *zSrcFi
316d0 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68  le;.    const ch
316e0 61 72 20 2a 7a 44 62 3b 0a 20 20 20 20 73 71 6c  ar *zDb;.    sql
316f0 69 74 65 33 20 2a 70 53 72 63 3b 0a 20 20 20 20  ite3 *pSrc;.    
31700 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20 2a  sqlite3_backup *
31710 70 42 61 63 6b 75 70 3b 0a 20 20 20 20 69 6e 74  pBackup;.    int
31720 20 6e 54 69 6d 65 6f 75 74 20 3d 20 30 3b 0a 0a   nTimeout = 0;..
31730 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
31740 29 7b 0a 20 20 20 20 20 20 7a 53 72 63 46 69 6c  ){.      zSrcFil
31750 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20  e = azArg[1];.  
31760 20 20 20 20 7a 44 62 20 3d 20 22 6d 61 69 6e 22      zDb = "main"
31770 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
31780 6e 41 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20  nArg==3 ){.     
31790 20 7a 53 72 63 46 69 6c 65 20 3d 20 61 7a 41 72   zSrcFile = azAr
317a0 67 5b 32 5d 3b 0a 20 20 20 20 20 20 7a 44 62 20  g[2];.      zDb 
317b0 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20  = azArg[1];.    
317c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
317d0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
317e0 22 55 73 61 67 65 3a 20 2e 72 65 73 74 6f 72 65  "Usage: .restore
317f0 20 3f 44 42 3f 20 46 49 4c 45 5c 6e 22 29 3b 0a   ?DB? FILE\n");.
31800 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
31810 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
31820 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
31830 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
31840 65 33 5f 6f 70 65 6e 28 7a 53 72 63 46 69 6c 65  e3_open(zSrcFile
31850 2c 20 26 70 53 72 63 29 3b 0a 20 20 20 20 69 66  , &pSrc);.    if
31860 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
31870 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
31880 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
31890 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  ror: cannot open
318a0 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 53 72 63   \"%s\"\n", zSrc
318b0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  File);.      sql
318c0 69 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29  ite3_close(pSrc)
318d0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
318e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e  ;.    }.    open
318f0 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 70  _db(p, 0);.    p
31900 42 61 63 6b 75 70 20 3d 20 73 71 6c 69 74 65 33  Backup = sqlite3
31910 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28 70 2d 3e  _backup_init(p->
31920 64 62 2c 20 7a 44 62 2c 20 70 53 72 63 2c 20 22  db, zDb, pSrc, "
31930 6d 61 69 6e 22 29 3b 0a 20 20 20 20 69 66 28 20  main");.    if( 
31940 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20  pBackup==0 ){.  
31950 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
31960 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
31970 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  %s\n", sqlite3_e
31980 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
31990 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f       sqlite3_clo
319a0 73 65 28 70 53 72 63 29 3b 0a 20 20 20 20 20 20  se(pSrc);.      
319b0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
319c0 20 20 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d      while( (rc =
319d0 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
319e0 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31 30 30  step(pBackup,100
319f0 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a 20 20  ))==SQLITE_OK.  
31a00 20 20 20 20 20 20 20 20 7c 7c 20 72 63 3d 3d 53          || rc==S
31a10 51 4c 49 54 45 5f 42 55 53 59 20 20 29 7b 0a 20  QLITE_BUSY  ){. 
31a20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
31a30 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20 20 20  ITE_BUSY ){.    
31a40 20 20 20 20 69 66 28 20 6e 54 69 6d 65 6f 75 74      if( nTimeout
31a50 2b 2b 20 3e 3d 20 33 20 29 20 62 72 65 61 6b 3b  ++ >= 3 ) break;
31a60 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
31a70 5f 73 6c 65 65 70 28 31 30 30 29 3b 0a 20 20 20  _sleep(100);.   
31a80 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
31a90 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 66 69  qlite3_backup_fi
31aa0 6e 69 73 68 28 70 42 61 63 6b 75 70 29 3b 0a 20  nish(pBackup);. 
31ab0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
31ac0 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 20 20  E_DONE ){.      
31ad0 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  rc = 0;.    }els
31ae0 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45  e if( rc==SQLITE
31af0 5f 42 55 53 59 20 7c 7c 20 72 63 3d 3d 53 51 4c  _BUSY || rc==SQL
31b00 49 54 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a 20 20  ITE_LOCKED ){.  
31b10 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
31b20 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 73  tderr, "Error: s
31b30 6f 75 72 63 65 20 64 61 74 61 62 61 73 65 20 69  ource database i
31b40 73 20 62 75 73 79 5c 6e 22 29 3b 0a 20 20 20 20  s busy\n");.    
31b50 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65    rc = 1;.    }e
31b60 6c 73 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  lse{.      utf8_
31b70 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
31b80 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71  Error: %s\n", sq
31b90 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
31ba0 64 62 29 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  db));.      rc =
31bb0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71   1;.    }.    sq
31bc0 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63  lite3_close(pSrc
31bd0 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  );.  }else..  if
31be0 28 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72 6e  ( c=='s' && strn
31bf0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73  cmp(azArg[0], "s
31c00 63 61 6e 73 74 61 74 73 22 2c 20 6e 29 3d 3d 30  canstats", n)==0
31c10 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
31c20 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==2 ){.      p->
31c30 73 63 61 6e 73 74 61 74 73 4f 6e 20 3d 20 28 75  scanstatsOn = (u
31c40 38 29 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61  8)booleanValue(a
31c50 7a 41 72 67 5b 31 5d 29 3b 0a 23 69 66 6e 64 65  zArg[1]);.#ifnde
31c60 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
31c70 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
31c80 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
31c90 28 73 74 64 65 72 72 2c 20 22 57 61 72 6e 69 6e  (stderr, "Warnin
31ca0 67 3a 20 2e 73 63 61 6e 73 74 61 74 73 20 6e 6f  g: .scanstats no
31cb0 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  t available in t
31cc0 68 69 73 20 62 75 69 6c 64 2e 5c 6e 22 29 3b 0a  his build.\n");.
31cd0 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
31ce0 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
31cf0 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
31d00 65 3a 20 2e 73 63 61 6e 73 74 61 74 73 20 6f 6e  e: .scanstats on
31d10 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20  |off\n");.      
31d20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
31d30 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
31d40 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  's' && strncmp(a
31d50 7a 41 72 67 5b 30 5d 2c 20 22 73 63 68 65 6d 61  zArg[0], "schema
31d60 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
31d70 53 68 65 6c 6c 54 65 78 74 20 73 53 65 6c 65 63  ShellText sSelec
31d80 74 3b 0a 20 20 20 20 53 68 65 6c 6c 53 74 61 74  t;.    ShellStat
31d90 65 20 64 61 74 61 3b 0a 20 20 20 20 63 68 61 72  e data;.    char
31da0 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
31db0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
31dc0 44 69 76 20 3d 20 22 28 22 3b 0a 20 20 20 20 63  Div = "(";.    c
31dd0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
31de0 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 53   = 0;.    int iS
31df0 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 69  chema = 0;.    i
31e00 6e 74 20 62 44 65 62 75 67 20 3d 20 30 3b 0a 20  nt bDebug = 0;. 
31e10 20 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 20 20     int ii;..    
31e20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
31e30 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 2c     memcpy(&data,
31e40 20 70 2c 20 73 69 7a 65 6f 66 28 64 61 74 61 29   p, sizeof(data)
31e50 29 3b 0a 20 20 20 20 64 61 74 61 2e 73 68 6f 77  );.    data.show
31e60 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  Header = 0;.    
31e70 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74  data.cMode = dat
31e80 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 53 65  a.mode = MODE_Se
31e90 6d 69 3b 0a 20 20 20 20 69 6e 69 74 54 65 78 74  mi;.    initText
31ea0 28 26 73 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  (&sSelect);.    
31eb0 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e 41 72  for(ii=1; ii<nAr
31ec0 67 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  g; ii++){.      
31ed0 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28  if( optionMatch(
31ee0 61 7a 41 72 67 5b 69 69 5d 2c 22 69 6e 64 65 6e  azArg[ii],"inden
31ef0 74 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 64  t") ){.        d
31f00 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61  ata.cMode = data
31f10 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 50 72 65  .mode = MODE_Pre
31f20 74 74 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  tty;.      }else
31f30 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68   if( optionMatch
31f40 28 61 7a 41 72 67 5b 69 69 5d 2c 22 64 65 62 75  (azArg[ii],"debu
31f50 67 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62  g") ){.        b
31f60 44 65 62 75 67 20 3d 20 31 3b 0a 20 20 20 20 20  Debug = 1;.     
31f70 20 7d 65 6c 73 65 20 69 66 28 20 7a 4e 61 6d 65   }else if( zName
31f80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
31f90 4e 61 6d 65 20 3d 20 61 7a 41 72 67 5b 69 69 5d  Name = azArg[ii]
31fa0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
31fb0 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
31fc0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
31fd0 3a 20 2e 73 63 68 65 6d 61 20 3f 2d 2d 69 6e 64  : .schema ?--ind
31fe0 65 6e 74 3f 20 3f 4c 49 4b 45 2d 50 41 54 54 45  ent? ?LIKE-PATTE
31ff0 52 4e 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  RN?\n");.       
32000 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
32010 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
32020 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d  nd_exit;.      }
32030 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
32040 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  Name!=0 ){.     
32050 20 69 6e 74 20 69 73 4d 61 73 74 65 72 20 3d 20   int isMaster = 
32060 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28  sqlite3_strlike(
32070 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 6d  zName, "sqlite_m
32080 61 73 74 65 72 22 2c 20 30 29 3d 3d 30 3b 0a 20  aster", 0)==0;. 
32090 20 20 20 20 20 69 66 28 20 69 73 4d 61 73 74 65       if( isMaste
320a0 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72  r || sqlite3_str
320b0 6c 69 6b 65 28 7a 4e 61 6d 65 2c 22 73 71 6c 69  like(zName,"sqli
320c0 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 2c  te_temp_master",
320d0 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  0)==0 ){.       
320e0 20 63 68 61 72 20 2a 6e 65 77 5f 61 72 67 76 5b   char *new_argv[
320f0 32 5d 2c 20 2a 6e 65 77 5f 63 6f 6c 76 5b 32 5d  2], *new_colv[2]
32100 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 61 72  ;.        new_ar
32110 67 76 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f  gv[0] = sqlite3_
32120 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
32130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
32140 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 73 20  CREATE TABLE %s 
32150 28 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  (\n".           
32160 20 20 20 20 20 20 20 20 20 20 20 22 20 20 74 79             "  ty
32170 70 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20  pe text,\n".    
32180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32190 20 20 22 20 20 6e 61 6d 65 20 74 65 78 74 2c 5c    "  name text,\
321a0 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
321b0 20 20 20 20 20 20 20 20 20 22 20 20 74 62 6c 5f           "  tbl_
321c0 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20  name text,\n".  
321d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
321e0 20 20 20 20 22 20 20 72 6f 6f 74 70 61 67 65 20      "  rootpage 
321f0 69 6e 74 65 67 65 72 2c 5c 6e 22 0a 20 20 20 20  integer,\n".    
32200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32210 20 20 22 20 20 73 71 6c 20 74 65 78 74 5c 6e 22    "  sql text\n"
32220 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32230 20 20 20 20 20 20 20 22 29 22 2c 20 69 73 4d 61         ")", isMa
32240 73 74 65 72 20 3f 20 22 73 71 6c 69 74 65 5f 6d  ster ? "sqlite_m
32250 61 73 74 65 72 22 20 3a 20 22 73 71 6c 69 74 65  aster" : "sqlite
32260 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 29 3b 0a  _temp_master");.
32270 20 20 20 20 20 20 20 20 6e 65 77 5f 61 72 67 76          new_argv
32280 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  [1] = 0;.       
32290 20 6e 65 77 5f 63 6f 6c 76 5b 30 5d 20 3d 20 22   new_colv[0] = "
322a0 73 71 6c 22 3b 0a 20 20 20 20 20 20 20 20 6e 65  sql";.        ne
322b0 77 5f 63 6f 6c 76 5b 31 5d 20 3d 20 30 3b 0a 20  w_colv[1] = 0;. 
322c0 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 28         callback(
322d0 26 64 61 74 61 2c 20 31 2c 20 6e 65 77 5f 61 72  &data, 1, new_ar
322e0 67 76 2c 20 6e 65 77 5f 63 6f 6c 76 29 3b 0a 20  gv, new_colv);. 
322f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
32300 72 65 65 28 6e 65 77 5f 61 72 67 76 5b 30 5d 29  ree(new_argv[0])
32310 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
32320 20 20 20 20 69 66 28 20 7a 44 69 76 20 29 7b 0a      if( zDiv ){.
32330 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
32340 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
32350 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
32360 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
32370 64 62 2c 20 22 53 45 4c 45 43 54 20 6e 61 6d 65  db, "SELECT name
32380 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 64 61 74   FROM pragma_dat
32390 61 62 61 73 65 5f 6c 69 73 74 22 2c 0a 20 20 20  abase_list",.   
323a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
323b0 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 26             -1, &
323c0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20  pStmt, 0);.     
323d0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
323e0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
323f0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25  tderr, "Error: %
32400 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  s\n", sqlite3_er
32410 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20  rmsg(p->db));.  
32420 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
32430 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
32440 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
32450 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61         goto meta
32460 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
32470 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 70 70       }.      app
32480 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
32490 2c 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52  , "SELECT sql FR
324a0 4f 4d 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  OM", 0);.      i
324b0 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20  Schema = 0;.    
324c0 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
324d0 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51  _step(pStmt)==SQ
324e0 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
324f0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
32500 7a 44 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  zDb = (const cha
32510 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
32520 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29  n_text(pStmt, 0)
32530 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a  ;.        char z
32540 53 63 4e 75 6d 5b 33 30 5d 3b 0a 20 20 20 20 20  ScNum[30];.     
32550 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
32560 6e 74 66 28 73 69 7a 65 6f 66 28 7a 53 63 4e 75  ntf(sizeof(zScNu
32570 6d 29 2c 20 7a 53 63 4e 75 6d 2c 20 22 25 64 22  m), zScNum, "%d"
32580 2c 20 2b 2b 69 53 63 68 65 6d 61 29 3b 0a 20 20  , ++iSchema);.  
32590 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
325a0 28 26 73 53 65 6c 65 63 74 2c 20 7a 44 69 76 2c  (&sSelect, zDiv,
325b0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7a 44 69   0);.        zDi
325c0 76 20 3d 20 22 20 55 4e 49 4f 4e 20 41 4c 4c 20  v = " UNION ALL 
325d0 22 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  ";.        appen
325e0 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
325f0 22 53 45 4c 45 43 54 20 73 68 65 6c 6c 5f 61 64  "SELECT shell_ad
32600 64 5f 73 63 68 65 6d 61 28 73 71 6c 2c 22 2c 20  d_schema(sql,", 
32610 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
32620 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
32630 7a 44 62 2c 20 22 6d 61 69 6e 22 29 21 3d 30 20  zDb, "main")!=0 
32640 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 70  ){.          app
32650 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
32660 2c 20 7a 44 62 2c 20 27 22 27 29 3b 0a 20 20 20  , zDb, '"');.   
32670 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
32680 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
32690 28 26 73 53 65 6c 65 63 74 2c 20 22 4e 55 4c 4c  (&sSelect, "NULL
326a0 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  ", 0);.        }
326b0 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
326c0 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 2c  ext(&sSelect, ",
326d0 6e 61 6d 65 29 20 41 53 20 73 71 6c 2c 20 74 79  name) AS sql, ty
326e0 70 65 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61  pe, tbl_name, na
326f0 6d 65 2c 20 72 6f 77 69 64 2c 22 2c 20 30 29 3b  me, rowid,", 0);
32700 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
32710 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 53  ext(&sSelect, zS
32720 63 4e 75 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  cNum, 0);.      
32730 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
32740 65 6c 65 63 74 2c 20 22 20 41 53 20 73 6e 75 6d  elect, " AS snum
32750 2c 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , ", 0);.       
32760 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
32770 6c 65 63 74 2c 20 7a 44 62 2c 20 27 5c 27 27 29  lect, zDb, '\'')
32780 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ;.        append
32790 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22  Text(&sSelect, "
327a0 20 41 53 20 73 6e 61 6d 65 20 46 52 4f 4d 20 22   AS sname FROM "
327b0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70  , 0);.        ap
327c0 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63  pendText(&sSelec
327d0 74 2c 20 7a 44 62 2c 20 27 22 27 29 3b 0a 20 20  t, zDb, '"');.  
327e0 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
327f0 28 26 73 53 65 6c 65 63 74 2c 20 22 2e 73 71 6c  (&sSelect, ".sql
32800 69 74 65 5f 6d 61 73 74 65 72 22 2c 20 30 29 3b  ite_master", 0);
32810 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
32820 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
32830 70 53 74 6d 74 29 3b 0a 23 69 66 64 65 66 20 53  pStmt);.#ifdef S
32840 51 4c 49 54 45 5f 49 4e 54 52 4f 53 50 45 43 54  QLITE_INTROSPECT
32850 49 4f 4e 5f 50 52 41 47 4d 41 53 0a 20 20 20 20  ION_PRAGMAS.    
32860 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
32870 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
32880 74 28 26 73 53 65 6c 65 63 74 2c 0a 20 20 20 20  t(&sSelect,.    
32890 20 20 20 20 20 20 20 22 20 55 4e 49 4f 4e 20 41         " UNION A
328a0 4c 4c 20 53 45 4c 45 43 54 20 73 68 65 6c 6c 5f  LL SELECT shell_
328b0 6d 6f 64 75 6c 65 5f 73 63 68 65 6d 61 28 6e 61  module_schema(na
328c0 6d 65 29 2c 22 0a 20 20 20 20 20 20 20 20 20 20  me),".          
328d0 20 22 20 27 74 61 62 6c 65 27 2c 20 6e 61 6d 65   " 'table', name
328e0 2c 20 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20 39 65  , name, name, 9e
328f0 2b 39 39 2c 20 27 6d 61 69 6e 27 20 46 52 4f 4d  +99, 'main' FROM
32900 20 70 72 61 67 6d 61 5f 6d 6f 64 75 6c 65 5f 6c   pragma_module_l
32910 69 73 74 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ist", 0);.      
32920 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 61  }.#endif.      a
32930 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
32940 63 74 2c 20 22 29 20 57 48 45 52 45 20 22 2c 20  ct, ") WHERE ", 
32950 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4e  0);.      if( zN
32960 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ame ){.        c
32970 68 61 72 20 2a 7a 51 61 72 67 20 3d 20 73 71 6c  har *zQarg = sql
32980 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 51  ite3_mprintf("%Q
32990 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
329a0 20 20 20 69 66 28 20 73 74 72 63 68 72 28 7a 4e     if( strchr(zN
329b0 61 6d 65 2c 20 27 2e 27 29 20 29 7b 0a 20 20 20  ame, '.') ){.   
329c0 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
329d0 74 28 26 73 53 65 6c 65 63 74 2c 20 22 6c 6f 77  t(&sSelect, "low
329e0 65 72 28 70 72 69 6e 74 66 28 27 25 73 2e 25 73  er(printf('%s.%s
329f0 27 2c 73 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65  ',sname,tbl_name
32a00 29 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ))", 0);.       
32a10 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
32a20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
32a30 65 6c 65 63 74 2c 20 22 6c 6f 77 65 72 28 74 62  elect, "lower(tb
32a40 6c 5f 6e 61 6d 65 29 22 2c 20 30 29 3b 0a 20 20  l_name)", 0);.  
32a50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
32a60 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
32a70 65 63 74 2c 20 73 74 72 63 68 72 28 7a 4e 61 6d  ect, strchr(zNam
32a80 65 2c 20 27 2a 27 29 20 3f 20 22 20 47 4c 4f 42  e, '*') ? " GLOB
32a90 20 22 20 3a 20 22 20 4c 49 4b 45 20 22 2c 20 30   " : " LIKE ", 0
32aa0 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  );.        appen
32ab0 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
32ac0 7a 51 61 72 67 2c 20 30 29 3b 0a 20 20 20 20 20  zQarg, 0);.     
32ad0 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
32ae0 53 65 6c 65 63 74 2c 20 22 20 41 4e 44 20 22 2c  Select, " AND ",
32af0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
32b00 69 74 65 33 5f 66 72 65 65 28 7a 51 61 72 67 29  ite3_free(zQarg)
32b10 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
32b20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
32b30 65 63 74 2c 20 22 74 79 70 65 21 3d 27 6d 65 74  ect, "type!='met
32b40 61 27 20 41 4e 44 20 73 71 6c 20 49 53 20 4e 4f  a' AND sql IS NO
32b50 54 20 4e 55 4c 4c 22 0a 20 20 20 20 20 20 20 20  T NULL".        
32b60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32b70 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 73 6e     " ORDER BY sn
32b80 75 6d 2c 20 72 6f 77 69 64 22 2c 20 30 29 3b 0a  um, rowid", 0);.
32b90 20 20 20 20 20 20 69 66 28 20 62 44 65 62 75 67        if( bDebug
32ba0 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
32bb0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
32bc0 22 53 51 4c 3a 20 25 73 3b 5c 6e 22 2c 20 73 53  "SQL: %s;\n", sS
32bd0 65 6c 65 63 74 2e 7a 29 3b 0a 20 20 20 20 20 20  elect.z);.      
32be0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
32bf0 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
32c00 28 70 2d 3e 64 62 2c 20 73 53 65 6c 65 63 74 2e  (p->db, sSelect.
32c10 7a 2c 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61  z, callback, &da
32c20 74 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  ta, &zErrMsg);. 
32c30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 72 65       }.      fre
32c40 65 54 65 78 74 28 26 73 53 65 6c 65 63 74 29 3b  eText(&sSelect);
32c50 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
32c60 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
32c70 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
32c80 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  rr,"Error: %s\n"
32c90 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  , zErrMsg);.    
32ca0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
32cb0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72  ErrMsg);.      r
32cc0 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 1;.    }else
32cd0 20 69 66 28 20 72 63 20 21 3d 20 53 51 4c 49 54   if( rc != SQLIT
32ce0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 61  E_OK ){.      ra
32cf0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
32d00 22 45 72 72 6f 72 3a 20 71 75 65 72 79 69 6e 67  "Error: querying
32d10 20 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74   schema informat
32d20 69 6f 6e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  ion\n");.      r
32d30 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 1;.    }else
32d40 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a  {.      rc = 0;.
32d50 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23      }.  }else..#
32d60 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
32d70 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69  E_DEBUG) && defi
32d80 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
32d90 45 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a 20  E_SELECTTRACE). 
32da0 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20 6e   if( c=='s' && n
32db0 3d 3d 31 31 20 26 26 20 73 74 72 6e 63 6d 70 28  ==11 && strncmp(
32dc0 61 7a 41 72 67 5b 30 5d 2c 20 22 73 65 6c 65 63  azArg[0], "selec
32dd0 74 74 72 61 63 65 22 2c 20 6e 29 3d 3d 30 20 29  ttrace", n)==0 )
32de0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
32df0 65 63 74 54 72 61 63 65 20 3d 20 28 69 6e 74 29  ectTrace = (int)
32e00 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41  integerValue(azA
32e10 72 67 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 0a  rg[1]);.  }else.
32e20 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
32e30 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
32e40 45 5f 53 45 53 53 49 4f 4e 29 0a 20 20 69 66 28  E_SESSION).  if(
32e50 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72 6e 63   c=='s' && strnc
32e60 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22 73 65 73  mp(azArg[0],"ses
32e70 73 69 6f 6e 22 2c 6e 29 3d 3d 30 20 26 26 20 6e  sion",n)==0 && n
32e80 3e 3d 33 20 29 7b 0a 20 20 20 20 4f 70 65 6e 53  >=3 ){.    OpenS
32e90 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e  ession *pSession
32ea0 20 3d 20 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b   = &p->aSession[
32eb0 30 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61  0];.    char **a
32ec0 7a 43 6d 64 20 3d 20 26 61 7a 41 72 67 5b 31 5d  zCmd = &azArg[1]
32ed0 3b 0a 20 20 20 20 69 6e 74 20 69 53 65 73 20 3d  ;.    int iSes =
32ee0 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6d 64   0;.    int nCmd
32ef0 20 3d 20 6e 41 72 67 20 2d 20 31 3b 0a 20 20 20   = nArg - 1;.   
32f00 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20   int i;.    if( 
32f10 6e 41 72 67 3c 3d 31 20 29 20 67 6f 74 6f 20 73  nArg<=1 ) goto s
32f20 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72  ession_syntax_er
32f30 72 6f 72 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62  ror;.    open_db
32f40 28 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  (p, 0);.    if( 
32f50 6e 41 72 67 3e 3d 33 20 29 7b 0a 20 20 20 20 20  nArg>=3 ){.     
32f60 20 66 6f 72 28 69 53 65 73 3d 30 3b 20 69 53 65   for(iSes=0; iSe
32f70 73 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b 20 69  s<p->nSession; i
32f80 53 65 73 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Ses++){.        
32f90 69 66 28 20 73 74 72 63 6d 70 28 70 2d 3e 61 53  if( strcmp(p->aS
32fa0 65 73 73 69 6f 6e 5b 69 53 65 73 5d 2e 7a 4e 61  ession[iSes].zNa
32fb0 6d 65 2c 20 61 7a 41 72 67 5b 31 5d 29 3d 3d 30  me, azArg[1])==0
32fc0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
32fd0 7d 0a 20 20 20 20 20 20 69 66 28 20 69 53 65 73  }.      if( iSes
32fe0 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a  <p->nSession ){.
32ff0 20 20 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e          pSession
33000 20 3d 20 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b   = &p->aSession[
33010 69 53 65 73 5d 3b 0a 20 20 20 20 20 20 20 20 61  iSes];.        a
33020 7a 43 6d 64 2b 2b 3b 0a 20 20 20 20 20 20 20 20  zCmd++;.        
33030 6e 43 6d 64 2d 2d 3b 0a 20 20 20 20 20 20 7d 65  nCmd--;.      }e
33040 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 53 65  lse{.        pSe
33050 73 73 69 6f 6e 20 3d 20 26 70 2d 3e 61 53 65 73  ssion = &p->aSes
33060 73 69 6f 6e 5b 30 5d 3b 0a 20 20 20 20 20 20 20  sion[0];.       
33070 20 69 53 65 73 20 3d 20 30 3b 0a 20 20 20 20 20   iSes = 0;.     
33080 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
33090 20 2e 73 65 73 73 69 6f 6e 20 61 74 74 61 63 68   .session attach
330a0 20 54 41 42 4c 45 0a 20 20 20 20 2a 2a 20 49 6e   TABLE.    ** In
330b0 76 6f 6b 65 20 74 68 65 20 73 71 6c 69 74 65 33  voke the sqlite3
330c0 73 65 73 73 69 6f 6e 5f 61 74 74 61 63 68 28 29  session_attach()
330d0 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 61 74   interface to at
330e0 74 61 63 68 20 61 20 70 61 72 74 69 63 75 6c 61  tach a particula
330f0 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 73  r.    ** table s
33100 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e 65 76  o that it is nev
33110 65 72 20 66 69 6c 74 65 72 65 64 2e 0a 20 20 20  er filtered..   
33120 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63   */.    if( strc
33130 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 61 74 74  mp(azCmd[0],"att
33140 61 63 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ach")==0 ){.    
33150 20 20 69 66 28 20 6e 43 6d 64 21 3d 32 20 29 20    if( nCmd!=2 ) 
33160 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e  goto session_syn
33170 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  tax_error;.     
33180 20 69 66 28 20 70 53 65 73 73 69 6f 6e 2d 3e 70   if( pSession->p
33190 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
331a0 65 73 73 69 6f 6e 5f 6e 6f 74 5f 6f 70 65 6e 3a  ession_not_open:
331b0 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
331c0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 52 52  ntf(stderr, "ERR
331d0 4f 52 3a 20 4e 6f 20 73 65 73 73 69 6f 6e 73 20  OR: No sessions 
331e0 61 72 65 20 6f 70 65 6e 5c 6e 22 29 3b 0a 20 20  are open\n");.  
331f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33200 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 73     rc = sqlite3s
33210 65 73 73 69 6f 6e 5f 61 74 74 61 63 68 28 70 53  ession_attach(pS
33220 65 73 73 69 6f 6e 2d 3e 70 2c 20 61 7a 43 6d 64  ession->p, azCmd
33230 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  [1]);.        if
33240 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
33250 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
33260 65 72 72 2c 20 22 45 52 52 4f 52 3a 20 73 71 6c  err, "ERROR: sql
33270 69 74 65 33 73 65 73 73 69 6f 6e 5f 61 74 74 61  ite3session_atta
33280 63 68 28 29 20 72 65 74 75 72 6e 73 20 25 64 5c  ch() returns %d\
33290 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  n", rc);.       
332a0 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 20     rc = 0;.     
332b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
332c0 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e   }else..    /* .
332d0 73 65 73 73 69 6f 6e 20 63 68 61 6e 67 65 73 65  session changese
332e0 74 20 46 49 4c 45 0a 20 20 20 20 2a 2a 20 2e 73  t FILE.    ** .s
332f0 65 73 73 69 6f 6e 20 70 61 74 63 68 73 65 74 20  ession patchset 
33300 46 49 4c 45 0a 20 20 20 20 2a 2a 20 57 72 69 74  FILE.    ** Writ
33310 65 20 61 20 63 68 61 6e 67 65 73 65 74 20 6f 72  e a changeset or
33320 20 70 61 74 63 68 73 65 74 20 69 6e 74 6f 20 61   patchset into a
33330 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 6c 65   file.  The file
33340 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 2e   is overwritten.
33350 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
33360 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c  strcmp(azCmd[0],
33370 22 63 68 61 6e 67 65 73 65 74 22 29 3d 3d 30 20  "changeset")==0 
33380 7c 7c 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b  || strcmp(azCmd[
33390 30 5d 2c 22 70 61 74 63 68 73 65 74 22 29 3d 3d  0],"patchset")==
333a0 30 20 29 7b 0a 20 20 20 20 20 20 46 49 4c 45 20  0 ){.      FILE 
333b0 2a 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  *out = 0;.      
333c0 69 66 28 20 6e 43 6d 64 21 3d 32 20 29 20 67 6f  if( nCmd!=2 ) go
333d0 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61  to session_synta
333e0 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69  x_error;.      i
333f0 66 28 20 70 53 65 73 73 69 6f 6e 2d 3e 70 3d 3d  f( pSession->p==
33400 30 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e  0 ) goto session
33410 5f 6e 6f 74 5f 6f 70 65 6e 3b 0a 20 20 20 20 20  _not_open;.     
33420 20 6f 75 74 20 3d 20 66 6f 70 65 6e 28 61 7a 43   out = fopen(azC
33430 6d 64 5b 31 5d 2c 20 22 77 62 22 29 3b 0a 20 20  md[1], "wb");.  
33440 20 20 20 20 69 66 28 20 6f 75 74 3d 3d 30 20 29      if( out==0 )
33450 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
33460 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
33470 52 52 4f 52 3a 20 63 61 6e 6e 6f 74 20 6f 70 65  RROR: cannot ope
33480 6e 20 5c 22 25 73 5c 22 20 66 6f 72 20 77 72 69  n \"%s\" for wri
33490 74 69 6e 67 5c 6e 22 2c 20 61 7a 43 6d 64 5b 31  ting\n", azCmd[1
334a0 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
334b0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 43  .        int szC
334c0 68 6e 67 3b 0a 20 20 20 20 20 20 20 20 76 6f 69  hng;.        voi
334d0 64 20 2a 70 43 68 6e 67 3b 0a 20 20 20 20 20 20  d *pChng;.      
334e0 20 20 69 66 28 20 61 7a 43 6d 64 5b 30 5d 5b 30    if( azCmd[0][0
334f0 5d 3d 3d 27 63 27 20 29 7b 0a 20 20 20 20 20 20  ]=='c' ){.      
33500 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
33510 73 65 73 73 69 6f 6e 5f 63 68 61 6e 67 65 73 65  session_changese
33520 74 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 26  t(pSession->p, &
33530 73 7a 43 68 6e 67 2c 20 26 70 43 68 6e 67 29 3b  szChng, &pChng);
33540 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
33550 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
33560 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 70 61  qlite3session_pa
33570 74 63 68 73 65 74 28 70 53 65 73 73 69 6f 6e 2d  tchset(pSession-
33580 3e 70 2c 20 26 73 7a 43 68 6e 67 2c 20 26 70 43  >p, &szChng, &pC
33590 68 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  hng);.        }.
335a0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
335b0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6e  {.          prin
335c0 74 66 28 22 45 72 72 6f 72 3a 20 65 72 72 6f 72  tf("Error: error
335d0 20 63 6f 64 65 20 25 64 5c 6e 22 2c 20 72 63 29   code %d\n", rc)
335e0 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
335f0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
33600 20 20 20 20 20 20 69 66 28 20 70 43 68 6e 67 0a        if( pChng.
33610 20 20 20 20 20 20 20 20 20 20 26 26 20 66 77 72            && fwr
33620 69 74 65 28 70 43 68 6e 67 2c 20 73 7a 43 68 6e  ite(pChng, szChn
33630 67 2c 20 31 2c 20 6f 75 74 29 21 3d 31 20 29 7b  g, 1, out)!=1 ){
33640 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
33650 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
33660 52 52 4f 52 3a 20 46 61 69 6c 65 64 20 74 6f 20  RROR: Failed to 
33670 77 72 69 74 65 20 65 6e 74 69 72 65 20 25 64 2d  write entire %d-
33680 62 79 74 65 20 6f 75 74 70 75 74 5c 6e 22 2c 0a  byte output\n",.
33690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
336a0 20 20 73 7a 43 68 6e 67 29 3b 0a 20 20 20 20 20    szChng);.     
336b0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
336c0 69 74 65 33 5f 66 72 65 65 28 70 43 68 6e 67 29  ite3_free(pChng)
336d0 3b 0a 20 20 20 20 20 20 20 20 66 63 6c 6f 73 65  ;.        fclose
336e0 28 6f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (out);.      }. 
336f0 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a     }else..    /*
33700 20 2e 73 65 73 73 69 6f 6e 20 63 6c 6f 73 65 0a   .session close.
33710 20 20 20 20 2a 2a 20 43 6c 6f 73 65 20 74 68 65      ** Close the
33720 20 69 64 65 6e 74 69 66 69 65 64 20 73 65 73 73   identified sess
33730 69 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ion.    */.    i
33740 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b  f( strcmp(azCmd[
33750 30 5d 2c 20 22 63 6c 6f 73 65 22 29 3d 3d 30 20  0], "close")==0 
33760 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6d  ){.      if( nCm
33770 64 21 3d 31 20 29 20 67 6f 74 6f 20 73 65 73 73  d!=1 ) goto sess
33780 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72  ion_syntax_error
33790 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  ;.      if( p->n
337a0 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20  Session ){.     
337b0 20 20 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65     session_close
337c0 28 70 53 65 73 73 69 6f 6e 29 3b 0a 20 20 20 20  (pSession);.    
337d0 20 20 20 20 70 2d 3e 61 53 65 73 73 69 6f 6e 5b      p->aSession[
337e0 69 53 65 73 5d 20 3d 20 70 2d 3e 61 53 65 73 73  iSes] = p->aSess
337f0 69 6f 6e 5b 2d 2d 70 2d 3e 6e 53 65 73 73 69 6f  ion[--p->nSessio
33800 6e 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n];.      }.    
33810 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73  }else..    /* .s
33820 65 73 73 69 6f 6e 20 65 6e 61 62 6c 65 20 3f 42  ession enable ?B
33830 4f 4f 4c 45 41 4e 3f 0a 20 20 20 20 2a 2a 20 51  OOLEAN?.    ** Q
33840 75 65 72 79 20 6f 72 20 73 65 74 20 74 68 65 20  uery or set the 
33850 65 6e 61 62 6c 65 20 66 6c 61 67 0a 20 20 20 20  enable flag.    
33860 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  */.    if( strcm
33870 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22 65 6e 61  p(azCmd[0], "ena
33880 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ble")==0 ){.    
33890 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
338a0 69 66 28 20 6e 43 6d 64 3e 32 20 29 20 67 6f 74  if( nCmd>2 ) got
338b0 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78  o session_syntax
338c0 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 69  _error;.      ii
338d0 20 3d 20 6e 43 6d 64 3d 3d 31 20 3f 20 2d 31 20   = nCmd==1 ? -1 
338e0 3a 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61  : booleanValue(a
338f0 7a 43 6d 64 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zCmd[1]);.      
33900 69 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20  if( p->nSession 
33910 29 7b 0a 20 20 20 20 20 20 20 20 69 69 20 3d 20  ){.        ii = 
33920 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 65  sqlite3session_e
33930 6e 61 62 6c 65 28 70 53 65 73 73 69 6f 6e 2d 3e  nable(pSession->
33940 70 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 20 20  p, ii);.        
33950 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
33960 75 74 2c 20 22 73 65 73 73 69 6f 6e 20 25 73 20  ut, "session %s 
33970 65 6e 61 62 6c 65 20 66 6c 61 67 20 3d 20 25 64  enable flag = %d
33980 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
33990 20 20 20 20 20 20 20 20 20 70 53 65 73 73 69 6f           pSessio
339a0 6e 2d 3e 7a 4e 61 6d 65 2c 20 69 69 29 3b 0a 20  n->zName, ii);. 
339b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
339c0 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f  ..    /* .sessio
339d0 6e 20 66 69 6c 74 65 72 20 47 4c 4f 42 20 2e 2e  n filter GLOB ..
339e0 2e 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20 61 20  ...    ** Set a 
339f0 6c 69 73 74 20 6f 66 20 47 4c 4f 42 20 70 61 74  list of GLOB pat
33a00 74 65 72 6e 73 20 6f 66 20 74 61 62 6c 65 20 6e  terns of table n
33a10 61 6d 65 73 20 74 6f 20 62 65 20 65 78 63 6c 75  ames to be exclu
33a20 64 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ded..    */.    
33a30 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64  if( strcmp(azCmd
33a40 5b 30 5d 2c 20 22 66 69 6c 74 65 72 22 29 3d 3d  [0], "filter")==
33a50 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
33a60 69 2c 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20  i, nByte;.      
33a70 69 66 28 20 6e 43 6d 64 3c 32 20 29 20 67 6f 74  if( nCmd<2 ) got
33a80 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78  o session_syntax
33a90 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 66  _error;.      if
33aa0 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b  ( p->nSession ){
33ab0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d  .        for(ii=
33ac0 30 3b 20 69 69 3c 70 53 65 73 73 69 6f 6e 2d 3e  0; ii<pSession->
33ad0 6e 46 69 6c 74 65 72 3b 20 69 69 2b 2b 29 7b 0a  nFilter; ii++){.
33ae0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
33af0 33 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d  3_free(pSession-
33b00 3e 61 7a 46 69 6c 74 65 72 5b 69 69 5d 29 3b 0a  >azFilter[ii]);.
33b10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
33b20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
33b30 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65  Session->azFilte
33b40 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 42 79 74  r);.        nByt
33b50 65 20 3d 20 73 69 7a 65 6f 66 28 70 53 65 73 73  e = sizeof(pSess
33b60 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 30 5d  ion->azFilter[0]
33b70 29 2a 28 6e 43 6d 64 2d 31 29 3b 0a 20 20 20 20  )*(nCmd-1);.    
33b80 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 61 7a      pSession->az
33b90 46 69 6c 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Filter = sqlite3
33ba0 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29  _malloc( nByte )
33bb0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ;.        if( pS
33bc0 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72  ession->azFilter
33bd0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
33be0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
33bf0 72 72 2c 20 22 45 72 72 6f 72 3a 20 6f 75 74 20  rr, "Error: out 
33c00 6f 72 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20  or memory\n");. 
33c10 20 20 20 20 20 20 20 20 20 65 78 69 74 28 31 29           exit(1)
33c20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
33c30 20 20 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69      for(ii=1; ii
33c40 3c 6e 43 6d 64 3b 20 69 69 2b 2b 29 7b 0a 20 20  <nCmd; ii++){.  
33c50 20 20 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e          pSession
33c60 2d 3e 61 7a 46 69 6c 74 65 72 5b 69 69 2d 31 5d  ->azFilter[ii-1]
33c70 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
33c80 74 66 28 22 25 73 22 2c 20 61 7a 43 6d 64 5b 69  tf("%s", azCmd[i
33c90 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
33ca0 20 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d         pSession-
33cb0 3e 6e 46 69 6c 74 65 72 20 3d 20 69 69 2d 31 3b  >nFilter = ii-1;
33cc0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
33cd0 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73  se..    /* .sess
33ce0 69 6f 6e 20 69 6e 64 69 72 65 63 74 20 3f 42 4f  ion indirect ?BO
33cf0 4f 4c 45 41 4e 3f 0a 20 20 20 20 2a 2a 20 51 75  OLEAN?.    ** Qu
33d00 65 72 79 20 6f 72 20 73 65 74 20 74 68 65 20 69  ery or set the i
33d10 6e 64 69 72 65 63 74 20 66 6c 61 67 0a 20 20 20  ndirect flag.   
33d20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63   */.    if( strc
33d30 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22 69 6e  mp(azCmd[0], "in
33d40 64 69 72 65 63 74 22 29 3d 3d 30 20 29 7b 0a 20  direct")==0 ){. 
33d50 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
33d60 20 20 20 69 66 28 20 6e 43 6d 64 3e 32 20 29 20     if( nCmd>2 ) 
33d70 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e  goto session_syn
33d80 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  tax_error;.     
33d90 20 69 69 20 3d 20 6e 43 6d 64 3d 3d 31 20 3f 20   ii = nCmd==1 ? 
33da0 2d 31 20 3a 20 62 6f 6f 6c 65 61 6e 56 61 6c 75  -1 : booleanValu
33db0 65 28 61 7a 43 6d 64 5b 31 5d 29 3b 0a 20 20 20  e(azCmd[1]);.   
33dc0 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 73 73 69     if( p->nSessi
33dd0 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 69  on ){.        ii
33de0 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f   = sqlite3sessio
33df0 6e 5f 69 6e 64 69 72 65 63 74 28 70 53 65 73 73  n_indirect(pSess
33e00 69 6f 6e 2d 3e 70 2c 20 69 69 29 3b 0a 20 20 20  ion->p, ii);.   
33e10 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
33e20 28 70 2d 3e 6f 75 74 2c 20 22 73 65 73 73 69 6f  (p->out, "sessio
33e30 6e 20 25 73 20 69 6e 64 69 72 65 63 74 20 66 6c  n %s indirect fl
33e40 61 67 20 3d 20 25 64 5c 6e 22 2c 0a 20 20 20 20  ag = %d\n",.    
33e50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33e60 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 2c  pSession->zName,
33e70 20 69 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   ii);.      }.  
33e80 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20    }else..    /* 
33e90 2e 73 65 73 73 69 6f 6e 20 69 73 65 6d 70 74 79  .session isempty
33ea0 0a 20 20 20 20 2a 2a 20 44 65 74 65 72 6d 69 6e  .    ** Determin
33eb0 65 20 69 66 20 74 68 65 20 73 65 73 73 69 6f 6e  e if the session
33ec0 20 69 73 20 65 6d 70 74 79 0a 20 20 20 20 2a 2f   is empty.    */
33ed0 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
33ee0 61 7a 43 6d 64 5b 30 5d 2c 20 22 69 73 65 6d 70  azCmd[0], "isemp
33ef0 74 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ty")==0 ){.     
33f00 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 69   int ii;.      i
33f10 66 28 20 6e 43 6d 64 21 3d 31 20 29 20 67 6f 74  f( nCmd!=1 ) got
33f20 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78  o session_syntax
33f30 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 66  _error;.      if
33f40 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b  ( p->nSession ){
33f50 0a 20 20 20 20 20 20 20 20 69 69 20 3d 20 73 71  .        ii = sq
33f60 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 69 73 65  lite3session_ise
33f70 6d 70 74 79 28 70 53 65 73 73 69 6f 6e 2d 3e 70  mpty(pSession->p
33f80 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  );.        utf8_
33f90 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
33fa0 73 65 73 73 69 6f 6e 20 25 73 20 69 73 65 6d 70  session %s isemp
33fb0 74 79 20 66 6c 61 67 20 3d 20 25 64 5c 6e 22 2c  ty flag = %d\n",
33fc0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
33fd0 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 7a       pSession->z
33fe0 4e 61 6d 65 2c 20 69 69 29 3b 0a 20 20 20 20 20  Name, ii);.     
33ff0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20   }.    }else..  
34000 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 6c 69    /* .session li
34010 73 74 0a 20 20 20 20 2a 2a 20 4c 69 73 74 20 61  st.    ** List a
34020 6c 6c 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  ll currently ope
34030 6e 20 73 65 73 73 69 6f 6e 73 0a 20 20 20 20 2a  n sessions.    *
34040 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  /.    if( strcmp
34050 28 61 7a 43 6d 64 5b 30 5d 2c 22 6c 69 73 74 22  (azCmd[0],"list"
34060 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f  )==0 ){.      fo
34070 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 65 73  r(i=0; i<p->nSes
34080 73 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  sion; i++){.    
34090 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
340a0 70 2d 3e 6f 75 74 2c 20 22 25 64 20 25 73 5c 6e  p->out, "%d %s\n
340b0 22 2c 20 69 2c 20 70 2d 3e 61 53 65 73 73 69 6f  ", i, p->aSessio
340c0 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  n[i].zName);.   
340d0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a     }.    }else..
340e0 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20      /* .session 
340f0 6f 70 65 6e 20 44 42 20 4e 41 4d 45 0a 20 20 20  open DB NAME.   
34100 20 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 73   ** Open a new s
34110 65 73 73 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41  ession called NA
34120 4d 45 20 6f 6e 20 74 68 65 20 61 74 74 61 63 68  ME on the attach
34130 65 64 20 64 61 74 61 62 61 73 65 20 44 42 2e 0a  ed database DB..
34140 20 20 20 20 2a 2a 20 44 42 20 69 73 20 6e 6f 72      ** DB is nor
34150 6d 61 6c 6c 79 20 22 6d 61 69 6e 22 2e 0a 20 20  mally "main"..  
34160 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72    */.    if( str
34170 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 6f 70  cmp(azCmd[0],"op
34180 65 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  en")==0 ){.     
34190 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
341a0 20 20 20 20 69 66 28 20 6e 43 6d 64 21 3d 33 20      if( nCmd!=3 
341b0 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73  ) goto session_s
341c0 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20  yntax_error;.   
341d0 20 20 20 7a 4e 61 6d 65 20 3d 20 61 7a 43 6d 64     zName = azCmd
341e0 5b 32 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  [2];.      if( z
341f0 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 20 67 6f 74  Name[0]==0 ) got
34200 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78  o session_syntax
34210 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 66 6f  _error;.      fo
34220 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 65 73  r(i=0; i<p->nSes
34230 73 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  sion; i++){.    
34240 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 70      if( strcmp(p
34250 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 5d 2e 7a 4e  ->aSession[i].zN
34260 61 6d 65 2c 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  ame,zName)==0 ){
34270 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
34280 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
34290 53 65 73 73 69 6f 6e 20 5c 22 25 73 5c 22 20 61  Session \"%s\" a
342a0 6c 72 65 61 64 79 20 65 78 69 73 74 73 5c 6e 22  lready exists\n"
342b0 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
342c0 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
342d0 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
342e0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
342f0 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 73 73      if( p->nSess
34300 69 6f 6e 3e 3d 41 72 72 61 79 53 69 7a 65 28 70  ion>=ArraySize(p
34310 2d 3e 61 53 65 73 73 69 6f 6e 29 20 29 7b 0a 20  ->aSession) ){. 
34320 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
34330 66 28 73 74 64 65 72 72 2c 20 22 4d 61 78 69 6d  f(stderr, "Maxim
34340 75 6d 20 6f 66 20 25 64 20 73 65 73 73 69 6f 6e  um of %d session
34350 73 5c 6e 22 2c 20 41 72 72 61 79 53 69 7a 65 28  s\n", ArraySize(
34360 70 2d 3e 61 53 65 73 73 69 6f 6e 29 29 3b 0a 20  p->aSession));. 
34370 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61         goto meta
34380 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
34390 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 65       }.      pSe
343a0 73 73 69 6f 6e 20 3d 20 26 70 2d 3e 61 53 65 73  ssion = &p->aSes
343b0 73 69 6f 6e 5b 70 2d 3e 6e 53 65 73 73 69 6f 6e  sion[p->nSession
343c0 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ];.      rc = sq
343d0 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 63 72 65  lite3session_cre
343e0 61 74 65 28 70 2d 3e 64 62 2c 20 61 7a 43 6d 64  ate(p->db, azCmd
343f0 5b 31 5d 2c 20 26 70 53 65 73 73 69 6f 6e 2d 3e  [1], &pSession->
34400 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  p);.      if( rc
34410 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
34420 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
34430 43 61 6e 6e 6f 74 20 6f 70 65 6e 20 73 65 73 73  Cannot open sess
34440 69 6f 6e 3a 20 65 72 72 6f 72 20 63 6f 64 65 3d  ion: error code=
34450 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20  %d\n", rc);.    
34460 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
34470 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
34480 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
34490 20 20 7d 0a 20 20 20 20 20 20 70 53 65 73 73 69    }.      pSessi
344a0 6f 6e 2d 3e 6e 46 69 6c 74 65 72 20 3d 20 30 3b  on->nFilter = 0;
344b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 73 65  .      sqlite3se
344c0 73 73 69 6f 6e 5f 74 61 62 6c 65 5f 66 69 6c 74  ssion_table_filt
344d0 65 72 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20  er(pSession->p, 
344e0 73 65 73 73 69 6f 6e 5f 66 69 6c 74 65 72 2c 20  session_filter, 
344f0 70 53 65 73 73 69 6f 6e 29 3b 0a 20 20 20 20 20  pSession);.     
34500 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 2b 2b 3b 0a   p->nSession++;.
34510 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e        pSession->
34520 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f  zName = sqlite3_
34530 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 4e  mprintf("%s", zN
34540 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  ame);.    }else.
34550 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 63 6f 6d      /* If no com
34560 6d 61 6e 64 20 6e 61 6d 65 20 6d 61 74 63 68 65  mand name matche
34570 73 2c 20 73 68 6f 77 20 61 20 73 79 6e 74 61 78  s, show a syntax
34580 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 73 65   error */.    se
34590 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72  ssion_syntax_err
345a0 6f 72 3a 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f  or:.    session_
345b0 68 65 6c 70 28 70 29 3b 0a 20 20 7d 65 6c 73 65  help(p);.  }else
345c0 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
345d0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
345e0 2a 20 55 6e 64 6f 63 75 6d 65 6e 74 65 64 20 63  * Undocumented c
345f0 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 69 6e 74 65  ommands for inte
34600 72 6e 61 6c 20 74 65 73 74 69 6e 67 2e 20 20 53  rnal testing.  S
34610 75 62 6a 65 63 74 20 74 6f 20 63 68 61 6e 67 65  ubject to change
34620 0a 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 6e 6f  .  ** without no
34630 74 69 63 65 2e 20 2a 2f 0a 20 20 69 66 28 20 63  tice. */.  if( c
34640 3d 3d 27 73 27 20 26 26 20 6e 3e 3d 31 30 20 26  =='s' && n>=10 &
34650 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
34660 30 5d 2c 20 22 73 65 6c 66 74 65 73 74 2d 22 2c  0], "selftest-",
34670 20 39 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   9)==0 ){.    if
34680 28 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  ( strncmp(azArg[
34690 30 5d 2b 39 2c 20 22 62 6f 6f 6c 65 61 6e 22 2c  0]+9, "boolean",
346a0 20 6e 2d 39 29 3d 3d 30 20 29 7b 0a 20 20 20 20   n-9)==0 ){.    
346b0 20 20 69 6e 74 20 69 2c 20 76 3b 0a 20 20 20 20    int i, v;.    
346c0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72    for(i=1; i<nAr
346d0 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
346e0 20 76 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75   v = booleanValu
346f0 65 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  e(azArg[i]);.   
34700 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
34710 28 70 2d 3e 6f 75 74 2c 20 22 25 73 3a 20 25 64  (p->out, "%s: %d
34720 20 30 78 25 78 5c 6e 22 2c 20 61 7a 41 72 67 5b   0x%x\n", azArg[
34730 69 5d 2c 20 76 2c 20 76 29 3b 0a 20 20 20 20 20  i], v, v);.     
34740 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
34750 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
34760 5d 2b 39 2c 20 22 69 6e 74 65 67 65 72 22 2c 20  ]+9, "integer", 
34770 6e 2d 39 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  n-9)==0 ){.     
34780 20 69 6e 74 20 69 3b 20 73 71 6c 69 74 65 33 5f   int i; sqlite3_
34790 69 6e 74 36 34 20 76 3b 0a 20 20 20 20 20 20 66  int64 v;.      f
347a0 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20  or(i=1; i<nArg; 
347b0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  i++){.        ch
347c0 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20  ar zBuf[200];.  
347d0 20 20 20 20 20 20 76 20 3d 20 69 6e 74 65 67 65        v = intege
347e0 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 69 5d 29  rValue(azArg[i])
347f0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
34800 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
34810 66 28 7a 42 75 66 29 2c 7a 42 75 66 2c 22 25 73  f(zBuf),zBuf,"%s
34820 3a 20 25 6c 6c 64 20 30 78 25 6c 6c 78 5c 6e 22  : %lld 0x%llx\n"
34830 2c 20 61 7a 41 72 67 5b 69 5d 2c 76 2c 76 29 3b  , azArg[i],v,v);
34840 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
34850 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
34860 22 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ", zBuf);.      
34870 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  }.    }.  }else.
34880 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 3d  #endif..  if( c=
34890 3d 27 73 27 20 26 26 20 6e 3e 3d 34 20 26 26 20  ='s' && n>=4 && 
348a0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
348b0 2c 22 73 65 6c 66 74 65 73 74 22 2c 6e 29 3d 3d  ,"selftest",n)==
348c0 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 49 73  0 ){.    int bIs
348d0 49 6e 69 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Init = 0;       
348e0 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 69    /* True to ini
348f0 74 69 61 6c 69 7a 65 20 74 68 65 20 53 45 4c 46  tialize the SELF
34900 54 45 53 54 20 74 61 62 6c 65 20 2a 2f 0a 20 20  TEST table */.  
34910 20 20 69 6e 74 20 62 56 65 72 62 6f 73 65 20 3d    int bVerbose =
34920 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 65   0;        /* Ve
34930 72 62 6f 73 65 20 6f 75 74 70 75 74 20 2a 2f 0a  rbose output */.
34940 20 20 20 20 69 6e 74 20 62 53 65 6c 66 74 65 73      int bSelftes
34950 74 45 78 69 73 74 73 3b 20 20 20 20 20 2f 2a 20  tExists;     /* 
34960 54 72 75 65 20 69 66 20 53 45 4c 46 54 45 53 54  True if SELFTEST
34970 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
34980 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20 6b 3b  */.    int i, k;
34990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
349a0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
349b0 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 54 65 73   */.    int nTes
349c0 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
349d0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
349e0 73 74 73 20 72 75 6e 73 20 2a 2f 0a 20 20 20 20  sts runs */.    
349f0 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20  int nErr = 0;   
34a00 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
34a10 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65  er of errors see
34a20 6e 20 2a 2f 0a 20 20 20 20 53 68 65 6c 6c 54 65  n */.    ShellTe
34a30 78 74 20 73 74 72 3b 20 20 20 20 20 20 20 20 20  xt str;         
34a40 20 20 2f 2a 20 41 6e 73 77 65 72 20 66 6f 72 20    /* Answer for 
34a50 61 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 73  a query */.    s
34a60 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
34a70 6d 74 20 3d 20 30 3b 20 2f 2a 20 51 75 65 72 79  mt = 0; /* Query
34a80 20 61 67 61 69 6e 73 74 20 74 68 65 20 53 45 4c   against the SEL
34a90 46 54 45 53 54 20 74 61 62 6c 65 20 2a 2f 0a 0a  FTEST table */..
34aa0 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 30 29      open_db(p,0)
34ab0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  ;.    for(i=1; i
34ac0 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
34ad0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
34ae0 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20   = azArg[i];.   
34af0 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27     if( z[0]=='-'
34b00 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20   && z[1]=='-' ) 
34b10 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 73  z++;.      if( s
34b20 74 72 63 6d 70 28 7a 2c 22 2d 69 6e 69 74 22 29  trcmp(z,"-init")
34b30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62  ==0 ){.        b
34b40 49 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20  IsInit = 1;.    
34b50 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 69 66    }else.      if
34b60 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 76 22 29  ( strcmp(z,"-v")
34b70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62  ==0 ){.        b
34b80 56 65 72 62 6f 73 65 2b 2b 3b 0a 20 20 20 20 20  Verbose++;.     
34b90 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 20   }else.      {. 
34ba0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
34bb0 74 66 28 73 74 64 65 72 72 2c 20 22 55 6e 6b 6e  tf(stderr, "Unkn
34bc0 6f 77 6e 20 6f 70 74 69 6f 6e 20 5c 22 25 73 5c  own option \"%s\
34bd0 22 20 6f 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a  " on \"%s\"\n",.
34be0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34bf0 20 20 20 20 61 7a 41 72 67 5b 69 5d 2c 20 61 7a      azArg[i], az
34c00 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[0]);.       
34c10 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
34c20 72 72 2c 20 22 53 68 6f 75 6c 64 20 62 65 20 6f  rr, "Should be o
34c30 6e 65 20 6f 66 3a 20 2d 2d 69 6e 69 74 20 2d 76  ne of: --init -v
34c40 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63  \n");.        rc
34c50 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 1;.        go
34c60 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
34c70 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  exit;.      }.  
34c80 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
34c90 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
34ca0 5f 6d 65 74 61 64 61 74 61 28 70 2d 3e 64 62 2c  _metadata(p->db,
34cb0 22 6d 61 69 6e 22 2c 22 73 65 6c 66 74 65 73 74  "main","selftest
34cc0 22 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 29 0a 20  ",0,0,0,0,0,0). 
34cd0 20 20 20 20 20 20 20 20 20 20 21 3d 20 53 51 4c            != SQL
34ce0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
34cf0 62 53 65 6c 66 74 65 73 74 45 78 69 73 74 73 20  bSelftestExists 
34d00 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
34d10 20 20 20 20 20 20 62 53 65 6c 66 74 65 73 74 45        bSelftestE
34d20 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d  xists = 1;.    }
34d30 0a 20 20 20 20 69 66 28 20 62 49 73 49 6e 69 74  .    if( bIsInit
34d40 20 29 7b 0a 20 20 20 20 20 20 63 72 65 61 74 65   ){.      create
34d50 53 65 6c 66 74 65 73 74 54 61 62 6c 65 28 70 29  SelftestTable(p)
34d60 3b 0a 20 20 20 20 20 20 62 53 65 6c 66 74 65 73  ;.      bSelftes
34d70 74 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20  tExists = 1;.   
34d80 20 7d 0a 20 20 20 20 69 6e 69 74 54 65 78 74 28   }.    initText(
34d90 26 73 74 72 29 3b 0a 20 20 20 20 61 70 70 65 6e  &str);.    appen
34da0 64 54 65 78 74 28 26 73 74 72 2c 20 22 78 22 2c  dText(&str, "x",
34db0 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 62   0);.    for(k=b
34dc0 53 65 6c 66 74 65 73 74 45 78 69 73 74 73 3b 20  SelftestExists; 
34dd0 6b 3e 3d 30 3b 20 6b 2d 2d 29 7b 0a 20 20 20 20  k>=0; k--){.    
34de0 20 20 69 66 28 20 6b 3d 3d 31 20 29 7b 0a 20 20    if( k==1 ){.  
34df0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
34e00 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
34e10 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
34e20 20 22 53 45 4c 45 43 54 20 74 6e 6f 2c 6f 70 2c   "SELECT tno,op,
34e30 63 6d 64 2c 61 6e 73 20 46 52 4f 4d 20 73 65 6c  cmd,ans FROM sel
34e40 66 74 65 73 74 20 4f 52 44 45 52 20 42 59 20 74  ftest ORDER BY t
34e50 6e 6f 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  no",.           
34e60 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
34e70 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
34e80 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
34e90 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
34ea0 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 22  >db,.          "
34eb0 56 41 4c 55 45 53 28 30 2c 27 6d 65 6d 6f 27 2c  VALUES(0,'memo',
34ec0 27 4d 69 73 73 69 6e 67 20 53 45 4c 46 54 45 53  'Missing SELFTES
34ed0 54 20 74 61 62 6c 65 20 2d 20 64 65 66 61 75 6c  T table - defaul
34ee0 74 20 63 68 65 63 6b 73 20 6f 6e 6c 79 27 2c 27  t checks only','
34ef0 27 29 2c 22 0a 20 20 20 20 20 20 20 20 20 20 22  '),".          "
34f00 20 20 20 20 20 20 28 31 2c 27 72 75 6e 27 2c 27        (1,'run','
34f10 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
34f20 5f 63 68 65 63 6b 27 2c 27 6f 6b 27 29 22 2c 0a  _check','ok')",.
34f30 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 26 70            -1, &p
34f40 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Stmt, 0);.      
34f50 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
34f60 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
34f70 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
34f80 72 6f 72 20 71 75 65 72 79 69 6e 67 20 74 68 65  ror querying the
34f90 20 73 65 6c 66 74 65 73 74 20 74 61 62 6c 65 5c   selftest table\
34fa0 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  n");.        rc 
34fb0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 1;.        sql
34fc0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
34fd0 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  tmt);.        go
34fe0 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
34ff0 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  exit;.      }.  
35000 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 73 71 6c      for(i=1; sql
35010 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
35020 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 3b 20 69 2b  ==SQLITE_ROW; i+
35030 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
35040 74 6e 6f 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  tno = sqlite3_co
35050 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20  lumn_int(pStmt, 
35060 30 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  0);.        cons
35070 74 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20 28 63  t char *zOp = (c
35080 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
35090 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
350a0 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  Stmt, 1);.      
350b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
350c0 71 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ql = (const char
350d0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
350e0 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 32 29 3b  _text(pStmt, 2);
350f0 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
35100 68 61 72 20 2a 7a 41 6e 73 20 3d 20 28 63 6f 6e  har *zAns = (con
35110 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
35120 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
35130 6d 74 2c 20 33 29 3b 0a 0a 20 20 20 20 20 20 20  mt, 3);..       
35140 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   k = 0;.        
35150 69 66 28 20 62 56 65 72 62 6f 73 65 3e 30 20 29  if( bVerbose>0 )
35160 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  {.          char
35170 20 2a 7a 51 75 6f 74 65 20 3d 20 73 71 6c 69 74   *zQuote = sqlit
35180 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 71 22 2c  e3_mprintf("%q",
35190 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20   zSql);.        
351a0 20 20 70 72 69 6e 74 66 28 22 25 64 3a 20 25 73    printf("%d: %s
351b0 20 25 73 5c 6e 22 2c 20 74 6e 6f 2c 20 7a 4f 70   %s\n", tno, zOp
351c0 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20  , zSql);.       
351d0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
351e0 7a 51 75 6f 74 65 29 3b 0a 20 20 20 20 20 20 20  zQuote);.       
351f0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73   }.        if( s
35200 74 72 63 6d 70 28 7a 4f 70 2c 22 6d 65 6d 6f 22  trcmp(zOp,"memo"
35210 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
35220 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
35230 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 53  >out, "%s\n", zS
35240 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ql);.        }el
35250 73 65 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  se.        if( s
35260 74 72 63 6d 70 28 7a 4f 70 2c 22 72 75 6e 22 29  trcmp(zOp,"run")
35270 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
35280 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
35290 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74   0;.          st
352a0 72 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  r.n = 0;.       
352b0 20 20 20 73 74 72 2e 7a 5b 30 5d 20 3d 20 30 3b     str.z[0] = 0;
352c0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
352d0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
352e0 64 62 2c 20 7a 53 71 6c 2c 20 63 61 70 74 75 72  db, zSql, captur
352f0 65 4f 75 74 70 75 74 43 61 6c 6c 62 61 63 6b 2c  eOutputCallback,
35300 20 26 73 74 72 2c 20 26 7a 45 72 72 4d 73 67 29   &str, &zErrMsg)
35310 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 54 65 73  ;.          nTes
35320 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 69  t++;.          i
35330 66 28 20 62 56 65 72 62 6f 73 65 20 29 7b 0a 20  f( bVerbose ){. 
35340 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f             utf8_
35350 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
35360 52 65 73 75 6c 74 3a 20 25 73 5c 6e 22 2c 20 73  Result: %s\n", s
35370 74 72 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 20  tr.z);.         
35380 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
35390 20 72 63 20 7c 7c 20 7a 45 72 72 4d 73 67 20 29   rc || zErrMsg )
353a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 45  {.            nE
353b0 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  rr++;.          
353c0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
353d0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
353e0 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 3a 20 65  f(p->out, "%d: e
353f0 72 72 6f 72 2d 63 6f 64 65 2d 25 64 3a 20 25 73  rror-code-%d: %s
35400 5c 6e 22 2c 20 74 6e 6f 2c 20 72 63 2c 20 7a 45  \n", tno, rc, zE
35410 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrMsg);.        
35420 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
35430 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  (zErrMsg);.     
35440 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
35450 74 72 63 6d 70 28 7a 41 6e 73 2c 73 74 72 2e 7a  trcmp(zAns,str.z
35460 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
35470 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20      nErr++;.    
35480 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
35490 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38              utf8
354a0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
354b0 22 25 64 3a 20 45 78 70 65 63 74 65 64 3a 20 5b  "%d: Expected: [
354c0 25 73 5d 5c 6e 22 2c 20 74 6e 6f 2c 20 7a 41 6e  %s]\n", tno, zAn
354d0 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  s);.            
354e0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
354f0 75 74 2c 20 22 25 64 3a 20 20 20 20 20 20 47 6f  ut, "%d:      Go
35500 74 3a 20 5b 25 73 5d 5c 6e 22 2c 20 74 6e 6f 2c  t: [%s]\n", tno,
35510 20 73 74 72 2e 7a 29 3b 0a 20 20 20 20 20 20 20   str.z);.       
35520 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
35530 73 65 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  se.        {.   
35540 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
35550 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20  tf(stderr,.     
35560 20 20 20 20 20 20 20 22 55 6e 6b 6e 6f 77 6e 20         "Unknown 
35570 6f 70 65 72 61 74 69 6f 6e 20 5c 22 25 73 5c 22  operation \"%s\"
35580 20 6f 6e 20 73 65 6c 66 74 65 73 74 20 6c 69 6e   on selftest lin
35590 65 20 25 64 5c 6e 22 2c 20 7a 4f 70 2c 20 74 6e  e %d\n", zOp, tn
355a0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  o);.          rc
355b0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
355c0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
355d0 0a 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20  .      } /* End 
355e0 6c 6f 6f 70 20 6f 76 65 72 20 72 6f 77 73 20 6f  loop over rows o
355f0 66 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 53  f content from S
35600 45 4c 46 54 45 53 54 20 2a 2f 0a 20 20 20 20 20  ELFTEST */.     
35610 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
35620 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 20  e(pStmt);.    } 
35630 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 6f 76 65 72  /* End loop over
35640 20 6b 20 2a 2f 0a 20 20 20 20 66 72 65 65 54 65   k */.    freeTe
35650 78 74 28 26 73 74 72 29 3b 0a 20 20 20 20 75 74  xt(&str);.    ut
35660 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
35670 2c 20 22 25 64 20 65 72 72 6f 72 73 20 6f 75 74  , "%d errors out
35680 20 6f 66 20 25 64 20 74 65 73 74 73 5c 6e 22 2c   of %d tests\n",
35690 20 6e 45 72 72 2c 20 6e 54 65 73 74 29 3b 0a 20   nErr, nTest);. 
356a0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
356b0 3d 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='s' && strncmp(
356c0 61 7a 41 72 67 5b 30 5d 2c 20 22 73 65 70 61 72  azArg[0], "separ
356d0 61 74 6f 72 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  ator", n)==0 ){.
356e0 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20 7c      if( nArg<2 |
356f0 7c 20 6e 41 72 67 3e 33 20 29 7b 0a 20 20 20 20  | nArg>3 ){.    
35700 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
35710 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73 65  err, "Usage: .se
35720 70 61 72 61 74 6f 72 20 43 4f 4c 20 3f 52 4f 57  parator COL ?ROW
35730 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  ?\n");.      rc 
35740 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
35750 66 28 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20 20  f( nArg>=2 ){.  
35760 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
35770 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63  intf(sizeof(p->c
35780 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d  olSeparator), p-
35790 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 0a 20  >colSeparator,. 
357a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
357b0 20 20 20 20 20 20 22 25 2e 2a 73 22 2c 20 28 69        "%.*s", (i
357c0 6e 74 29 41 72 72 61 79 53 69 7a 65 28 70 2d 3e  nt)ArraySize(p->
357d0 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2d 31 2c  colSeparator)-1,
357e0 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
357f0 7d 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 3d  }.    if( nArg>=
35800 33 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  3 ){.      sqlit
35810 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
35820 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  of(p->rowSeparat
35830 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  or), p->rowSepar
35840 61 74 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20  ator,.          
35850 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25 2e               "%.
35860 2a 73 22 2c 20 28 69 6e 74 29 41 72 72 61 79 53  *s", (int)ArrayS
35870 69 7a 65 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  ize(p->rowSepara
35880 74 6f 72 29 2d 31 2c 20 61 7a 41 72 67 5b 32 5d  tor)-1, azArg[2]
35890 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
358a0 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26  ..  if( c=='s' &
358b0 26 20 6e 3e 3d 34 20 26 26 20 73 74 72 6e 63 6d  & n>=4 && strncm
358c0 70 28 61 7a 41 72 67 5b 30 5d 2c 22 73 68 61 33  p(azArg[0],"sha3
358d0 73 75 6d 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20  sum",n)==0 ){.  
358e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c    const char *zL
358f0 69 6b 65 20 3d 20 30 3b 20 20 20 2f 2a 20 57 68  ike = 0;   /* Wh
35900 69 63 68 20 74 61 62 6c 65 20 74 6f 20 63 68 65  ich table to che
35910 63 6b 73 75 6d 2e 20 30 20 6d 65 61 6e 73 20 65  cksum. 0 means e
35920 76 65 72 79 74 68 69 6e 67 20 2a 2f 0a 20 20 20  verything */.   
35930 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
35940 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
35950 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
35960 20 69 6e 74 20 62 53 63 68 65 6d 61 20 3d 20 30   int bSchema = 0
35970 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 73  ;         /* Als
35980 6f 20 68 61 73 68 20 74 68 65 20 73 63 68 65 6d  o hash the schem
35990 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 53 65  a */.    int bSe
359a0 70 61 72 61 74 65 20 3d 20 30 3b 20 20 20 20 20  parate = 0;     
359b0 20 20 2f 2a 20 48 61 73 68 20 65 61 63 68 20 74    /* Hash each t
359c0 61 62 6c 65 20 73 65 70 61 72 61 74 65 6c 79 20  able separately 
359d0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 53 69 7a 65  */.    int iSize
359e0 20 3d 20 32 32 34 3b 20 20 20 20 20 20 20 20 20   = 224;         
359f0 2f 2a 20 48 61 73 68 20 61 6c 67 6f 72 69 74 68  /* Hash algorith
35a00 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20  m to use */.    
35a10 69 6e 74 20 62 44 65 62 75 67 20 3d 20 30 3b 20  int bDebug = 0; 
35a20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79           /* Only
35a30 20 73 68 6f 77 20 74 68 65 20 71 75 65 72 79 20   show the query 
35a40 74 68 61 74 20 77 6f 75 6c 64 20 68 61 76 65 20  that would have 
35a50 72 75 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  run */.    sqlit
35a60 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20  e3_stmt *pStmt; 
35a70 20 20 20 20 2f 2a 20 46 6f 72 20 71 75 65 72 79      /* For query
35a80 69 6e 67 20 74 61 62 6c 65 73 20 6e 61 6d 65 73  ing tables names
35a90 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   */.    char *zS
35aa0 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ql;             
35ab0 20 2f 2a 20 53 51 4c 20 74 6f 20 62 65 20 72 75   /* SQL to be ru
35ac0 6e 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  n */.    char *z
35ad0 53 65 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sep;            
35ae0 20 20 2f 2a 20 53 65 70 61 72 61 74 6f 72 20 2a    /* Separator *
35af0 2f 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20  /.    ShellText 
35b00 73 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 2f  sSql;          /
35b10 2a 20 43 6f 6d 70 6c 65 74 65 20 53 51 4c 20 66  * Complete SQL f
35b20 6f 72 20 74 68 65 20 71 75 65 72 79 20 74 6f 20  or the query to 
35b30 72 75 6e 20 74 68 65 20 68 61 73 68 20 2a 2f 0a  run the hash */.
35b40 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73 51      ShellText sQ
35b50 75 65 72 79 3b 20 20 20 20 20 20 20 20 2f 2a 20  uery;        /* 
35b60 53 65 74 20 6f 66 20 71 75 65 72 69 65 73 20 75  Set of queries u
35b70 73 65 64 20 74 6f 20 72 65 61 64 20 61 6c 6c 20  sed to read all 
35b80 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 20 20 6f  content */.    o
35b90 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
35ba0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72    for(i=1; i<nAr
35bb0 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  g; i++){.      c
35bc0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61  onst char *z = a
35bd0 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 69  zArg[i];.      i
35be0 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a  f( z[0]=='-' ){.
35bf0 20 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20          z++;.   
35c00 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27       if( z[0]=='
35c10 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20  -' ) z++;.      
35c20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22    if( strcmp(z,"
35c30 73 63 68 65 6d 61 22 29 3d 3d 30 20 29 7b 0a 20  schema")==0 ){. 
35c40 20 20 20 20 20 20 20 20 20 62 53 63 68 65 6d 61           bSchema
35c50 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 1;.        }e
35c60 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28 20  lse.        if( 
35c70 73 74 72 63 6d 70 28 7a 2c 22 73 68 61 33 2d 32  strcmp(z,"sha3-2
35c80 32 34 22 29 3d 3d 30 20 7c 7c 20 73 74 72 63 6d  24")==0 || strcm
35c90 70 28 7a 2c 22 73 68 61 33 2d 32 35 36 22 29 3d  p(z,"sha3-256")=
35ca0 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 73  =0.         || s
35cb0 74 72 63 6d 70 28 7a 2c 22 73 68 61 33 2d 33 38  trcmp(z,"sha3-38
35cc0 34 22 29 3d 3d 30 20 7c 7c 20 73 74 72 63 6d 70  4")==0 || strcmp
35cd0 28 7a 2c 22 73 68 61 33 2d 35 31 32 22 29 3d 3d  (z,"sha3-512")==
35ce0 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  0.        ){.   
35cf0 20 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 61         iSize = a
35d00 74 6f 69 28 26 7a 5b 35 5d 29 3b 0a 20 20 20 20  toi(&z[5]);.    
35d10 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20      }else.      
35d20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22    if( strcmp(z,"
35d30 64 65 62 75 67 22 29 3d 3d 30 20 29 7b 0a 20 20  debug")==0 ){.  
35d40 20 20 20 20 20 20 20 20 62 44 65 62 75 67 20 3d          bDebug =
35d50 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   1;.        }els
35d60 65 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  e.        {.    
35d70 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
35d80 66 28 73 74 64 65 72 72 2c 20 22 55 6e 6b 6e 6f  f(stderr, "Unkno
35d90 77 6e 20 6f 70 74 69 6f 6e 20 5c 22 25 73 5c 22  wn option \"%s\"
35da0 20 6f 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20   on \"%s\"\n",. 
35db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35dc0 20 20 20 20 20 61 7a 41 72 67 5b 69 5d 2c 20 61       azArg[i], a
35dd0 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20  zArg[0]);.      
35de0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
35df0 74 64 65 72 72 2c 20 22 53 68 6f 75 6c 64 20 62  tderr, "Should b
35e00 65 20 6f 6e 65 20 6f 66 3a 20 2d 2d 73 63 68 65  e one of: --sche
35e10 6d 61 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  ma".            
35e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35e30 20 22 20 2d 2d 73 68 61 33 2d 32 32 34 20 2d 2d   " --sha3-224 --
35e40 73 68 61 33 2d 32 35 35 20 2d 2d 73 68 61 33 2d  sha3-255 --sha3-
35e50 33 38 34 20 2d 2d 73 68 61 33 2d 35 31 32 5c 6e  384 --sha3-512\n
35e60 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ");.          rc
35e70 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
35e80 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
35e90 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  d_exit;.        
35ea0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
35eb0 28 20 7a 4c 69 6b 65 20 29 7b 0a 20 20 20 20 20  ( zLike ){.     
35ec0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
35ed0 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73  derr, "Usage: .s
35ee0 68 61 33 73 75 6d 20 3f 4f 50 54 49 4f 4e 53 3f  ha3sum ?OPTIONS?
35ef0 20 3f 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c   ?LIKE-PATTERN?\
35f00 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  n");.        rc 
35f10 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 1;.        got
35f20 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
35f30 78 69 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  xit;.      }else
35f40 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6b 65 20  {.        zLike 
35f50 3d 20 7a 3b 0a 20 20 20 20 20 20 20 20 62 53 65  = z;.        bSe
35f60 70 61 72 61 74 65 20 3d 20 31 3b 0a 20 20 20 20  parate = 1;.    
35f70 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
35f80 73 74 72 6c 69 6b 65 28 22 73 71 6c 69 74 65 5f  strlike("sqlite_
35f90 25 22 2c 20 7a 4c 69 6b 65 2c 20 30 29 3d 3d 30  %", zLike, 0)==0
35fa0 20 29 20 62 53 63 68 65 6d 61 20 3d 20 31 3b 0a   ) bSchema = 1;.
35fb0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
35fc0 20 20 69 66 28 20 62 53 63 68 65 6d 61 20 29 7b    if( bSchema ){
35fd0 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 22 53  .      zSql = "S
35fe0 45 4c 45 43 54 20 6c 6f 77 65 72 28 6e 61 6d 65  ELECT lower(name
35ff0 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  ) FROM sqlite_ma
36000 73 74 65 72 22 0a 20 20 20 20 20 20 20 20 20 20  ster".          
36010 20 20 20 22 20 57 48 45 52 45 20 74 79 70 65 3d     " WHERE type=
36020 27 74 61 62 6c 65 27 20 41 4e 44 20 63 6f 61 6c  'table' AND coal
36030 65 73 63 65 28 72 6f 6f 74 70 61 67 65 2c 30 29  esce(rootpage,0)
36040 3e 31 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  >1".            
36050 20 22 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c   " UNION ALL SEL
36060 45 43 54 20 27 73 71 6c 69 74 65 5f 6d 61 73 74  ECT 'sqlite_mast
36070 65 72 27 22 0a 20 20 20 20 20 20 20 20 20 20 20  er'".           
36080 20 20 22 20 4f 52 44 45 52 20 42 59 20 31 20 63    " ORDER BY 1 c
36090 6f 6c 6c 61 74 65 20 6e 6f 63 61 73 65 22 3b 0a  ollate nocase";.
360a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
360b0 20 7a 53 71 6c 20 3d 20 22 53 45 4c 45 43 54 20   zSql = "SELECT 
360c0 6c 6f 77 65 72 28 6e 61 6d 65 29 20 46 52 4f 4d  lower(name) FROM
360d0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a   sqlite_master".
360e0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57               " W
360f0 48 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c 65  HERE type='table
36100 27 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28 72  ' AND coalesce(r
36110 6f 6f 74 70 61 67 65 2c 30 29 3e 31 22 0a 20 20  ootpage,0)>1".  
36120 20 20 20 20 20 20 20 20 20 20 20 22 20 41 4e 44             " AND
36130 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27   name NOT LIKE '
36140 73 71 6c 69 74 65 5f 25 27 22 0a 20 20 20 20 20  sqlite_%'".     
36150 20 20 20 20 20 20 20 20 22 20 4f 52 44 45 52 20          " ORDER 
36160 42 59 20 31 20 63 6f 6c 6c 61 74 65 20 6e 6f 63  BY 1 collate noc
36170 61 73 65 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ase";.    }.    
36180 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
36190 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  v2(p->db, zSql, 
361a0 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
361b0 20 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 51      initText(&sQ
361c0 75 65 72 79 29 3b 0a 20 20 20 20 69 6e 69 74 54  uery);.    initT
361d0 65 78 74 28 26 73 53 71 6c 29 3b 0a 20 20 20 20  ext(&sSql);.    
361e0 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 71 6c  appendText(&sSql
361f0 2c 20 22 57 49 54 48 20 5b 73 68 61 33 73 75 6d  , "WITH [sha3sum
36200 24 71 75 65 72 79 5d 28 61 2c 62 29 20 41 53 28  $query](a,b) AS(
36210 22 2c 30 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d  ",0);.    zSep =
36220 20 22 56 41 4c 55 45 53 28 22 3b 0a 20 20 20 20   "VALUES(";.    
36230 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f  while( SQLITE_RO
36240 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
36250 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20  pStmt) ){.      
36260 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
36270 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
36280 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
36290 65 78 74 28 70 53 74 6d 74 2c 30 29 3b 0a 20 20  ext(pStmt,0);.  
362a0 20 20 20 20 69 66 28 20 7a 4c 69 6b 65 20 26 26      if( zLike &&
362b0 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65   sqlite3_strlike
362c0 28 7a 4c 69 6b 65 2c 20 7a 54 61 62 2c 20 30 29  (zLike, zTab, 0)
362d0 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
362e0 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d        if( strncm
362f0 70 28 7a 54 61 62 2c 20 22 73 71 6c 69 74 65 5f  p(zTab, "sqlite_
36300 22 2c 37 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ",7)!=0 ){.     
36310 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
36320 51 75 65 72 79 2c 22 53 45 4c 45 43 54 20 2a 20  Query,"SELECT * 
36330 46 52 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20  FROM ", 0);.    
36340 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
36350 73 51 75 65 72 79 2c 7a 54 61 62 2c 27 22 27 29  sQuery,zTab,'"')
36360 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ;.        append
36370 54 65 78 74 28 26 73 51 75 65 72 79 2c 22 20 4e  Text(&sQuery," N
36380 4f 54 20 49 4e 44 45 58 45 44 3b 22 2c 20 30 29  OT INDEXED;", 0)
36390 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
363a0 28 20 73 74 72 63 6d 70 28 7a 54 61 62 2c 20 22  ( strcmp(zTab, "
363b0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 29 3d  sqlite_master")=
363c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70  =0 ){.        ap
363d0 70 65 6e 64 54 65 78 74 28 26 73 51 75 65 72 79  pendText(&sQuery
363e0 2c 22 53 45 4c 45 43 54 20 74 79 70 65 2c 6e 61  ,"SELECT type,na
363f0 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c 73 71 6c 20  me,tbl_name,sql 
36400 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
36410 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  er".            
36420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
36430 20 4f 52 44 45 52 20 42 59 20 6e 61 6d 65 3b 22   ORDER BY name;"
36440 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 0);.      }els
36450 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54 61  e if( strcmp(zTa
36460 62 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65  b, "sqlite_seque
36470 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nce")==0 ){.    
36480 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
36490 73 51 75 65 72 79 2c 22 53 45 4c 45 43 54 20 6e  sQuery,"SELECT n
364a0 61 6d 65 2c 73 65 71 20 46 52 4f 4d 20 73 71 6c  ame,seq FROM sql
364b0 69 74 65 5f 73 65 71 75 65 6e 63 65 22 0a 20 20  ite_sequence".  
364c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
364d0 20 20 20 20 20 20 20 20 20 22 20 4f 52 44 45 52           " ORDER
364e0 20 42 59 20 6e 61 6d 65 3b 22 2c 20 30 29 3b 0a   BY name;", 0);.
364f0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
36500 73 74 72 63 6d 70 28 7a 54 61 62 2c 20 22 73 71  strcmp(zTab, "sq
36510 6c 69 74 65 5f 73 74 61 74 31 22 29 3d 3d 30 20  lite_stat1")==0 
36520 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  ){.        appen
36530 64 54 65 78 74 28 26 73 51 75 65 72 79 2c 22 53  dText(&sQuery,"S
36540 45 4c 45 43 54 20 74 62 6c 2c 69 64 78 2c 73 74  ELECT tbl,idx,st
36550 61 74 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73  at FROM sqlite_s
36560 74 61 74 31 22 0a 20 20 20 20 20 20 20 20 20 20  tat1".          
36570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36580 20 22 20 4f 52 44 45 52 20 42 59 20 74 62 6c 2c   " ORDER BY tbl,
36590 69 64 78 3b 22 2c 20 30 29 3b 0a 20 20 20 20 20  idx;", 0);.     
365a0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
365b0 70 28 7a 54 61 62 2c 20 22 73 71 6c 69 74 65 5f  p(zTab, "sqlite_
365c0 73 74 61 74 33 22 29 3d 3d 30 0a 20 20 20 20 20  stat3")==0.     
365d0 20 20 20 20 20 20 20 20 7c 7c 20 73 74 72 63 6d          || strcm
365e0 70 28 7a 54 61 62 2c 20 22 73 71 6c 69 74 65 5f  p(zTab, "sqlite_
365f0 73 74 61 74 34 22 29 3d 3d 30 20 29 7b 0a 20 20  stat4")==0 ){.  
36600 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
36610 28 26 73 51 75 65 72 79 2c 20 22 53 45 4c 45 43  (&sQuery, "SELEC
36620 54 20 2a 20 46 52 4f 4d 20 22 2c 20 30 29 3b 0a  T * FROM ", 0);.
36630 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
36640 78 74 28 26 73 51 75 65 72 79 2c 20 7a 54 61 62  xt(&sQuery, zTab
36650 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70  , 0);.        ap
36660 70 65 6e 64 54 65 78 74 28 26 73 51 75 65 72 79  pendText(&sQuery
36670 2c 20 22 20 4f 52 44 45 52 20 42 59 20 74 62 6c  , " ORDER BY tbl
36680 2c 20 69 64 78 2c 20 72 6f 77 69 64 3b 5c 6e 22  , idx, rowid;\n"
36690 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
366a0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
366b0 73 53 71 6c 2c 20 7a 53 65 70 2c 20 30 29 3b 0a  sSql, zSep, 0);.
366c0 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
366d0 28 26 73 53 71 6c 2c 20 73 51 75 65 72 79 2e 7a  (&sSql, sQuery.z
366e0 2c 20 27 5c 27 27 29 3b 0a 20 20 20 20 20 20 73  , '\'');.      s
366f0 51 75 65 72 79 2e 6e 20 3d 20 30 3b 0a 20 20 20  Query.n = 0;.   
36700 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
36710 53 71 6c 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20  Sql, ",", 0);.  
36720 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
36730 73 53 71 6c 2c 20 7a 54 61 62 2c 20 27 5c 27 27  sSql, zTab, '\''
36740 29 3b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20  );.      zSep = 
36750 22 29 2c 28 22 3b 0a 20 20 20 20 7d 0a 20 20 20  "),(";.    }.   
36760 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
36770 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66  e(pStmt);.    if
36780 28 20 62 53 65 70 61 72 61 74 65 20 29 7b 0a 20  ( bSeparate ){. 
36790 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69       zSql = sqli
367a0 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
367b0 20 20 20 20 20 20 20 22 25 73 29 29 22 0a 20 20         "%s))".  
367c0 20 20 20 20 20 20 20 20 22 20 53 45 4c 45 43 54          " SELECT
367d0 20 6c 6f 77 65 72 28 68 65 78 28 73 68 61 33 5f   lower(hex(sha3_
367e0 71 75 65 72 79 28 61 2c 25 64 29 29 29 20 41 53  query(a,%d))) AS
367f0 20 68 61 73 68 2c 20 62 20 41 53 20 6c 61 62 65   hash, b AS labe
36800 6c 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 20  l".          "  
36810 20 46 52 4f 4d 20 5b 73 68 61 33 73 75 6d 24 71   FROM [sha3sum$q
36820 75 65 72 79 5d 22 2c 0a 20 20 20 20 20 20 20 20  uery]",.        
36830 20 20 73 53 71 6c 2e 7a 2c 20 69 53 69 7a 65 29    sSql.z, iSize)
36840 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
36850 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
36860 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
36870 20 20 20 20 20 22 25 73 29 29 22 0a 20 20 20 20       "%s))".    
36880 20 20 20 20 20 20 22 20 53 45 4c 45 43 54 20 6c        " SELECT l
36890 6f 77 65 72 28 68 65 78 28 73 68 61 33 5f 71 75  ower(hex(sha3_qu
368a0 65 72 79 28 67 72 6f 75 70 5f 63 6f 6e 63 61 74  ery(group_concat
368b0 28 61 2c 27 27 29 2c 25 64 29 29 29 20 41 53 20  (a,''),%d))) AS 
368c0 68 61 73 68 22 0a 20 20 20 20 20 20 20 20 20 20  hash".          
368d0 22 20 20 20 46 52 4f 4d 20 5b 73 68 61 33 73 75  "   FROM [sha3su
368e0 6d 24 71 75 65 72 79 5d 22 2c 0a 20 20 20 20 20  m$query]",.     
368f0 20 20 20 20 20 73 53 71 6c 2e 7a 2c 20 69 53 69       sSql.z, iSi
36900 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ze);.    }.    f
36910 72 65 65 54 65 78 74 28 26 73 51 75 65 72 79 29  reeText(&sQuery)
36920 3b 0a 20 20 20 20 66 72 65 65 54 65 78 74 28 26  ;.    freeText(&
36930 73 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 62  sSql);.    if( b
36940 44 65 62 75 67 20 29 7b 0a 20 20 20 20 20 20 75  Debug ){.      u
36950 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
36960 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 53 71 6c 29  t, "%s\n", zSql)
36970 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
36980 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2c     shell_exec(p,
36990 20 7a 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20 7d   zSql, 0);.    }
369a0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
369b0 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 65 6c 73 65  e(zSql);.  }else
369c0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
369d0 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a 20  _NOHAVE_SYSTEM. 
369e0 20 69 66 28 20 63 3d 3d 27 73 27 0a 20 20 20 26   if( c=='s'.   &
369f0 26 20 28 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  & (strncmp(azArg
36a00 5b 30 5d 2c 20 22 73 68 65 6c 6c 22 2c 20 6e 29  [0], "shell", n)
36a10 3d 3d 30 20 7c 7c 20 73 74 72 6e 63 6d 70 28 61  ==0 || strncmp(a
36a20 7a 41 72 67 5b 30 5d 2c 22 73 79 73 74 65 6d 22  zArg[0],"system"
36a30 2c 6e 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20  ,n)==0).  ){.   
36a40 20 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20 20   char *zCmd;.   
36a50 20 69 6e 74 20 69 2c 20 78 3b 0a 20 20 20 20 69   int i, x;.    i
36a60 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20  f( nArg<2 ){.   
36a70 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
36a80 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73  derr, "Usage: .s
36a90 79 73 74 65 6d 20 43 4f 4d 4d 41 4e 44 5c 6e 22  ystem COMMAND\n"
36aa0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
36ab0 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61  .      goto meta
36ac0 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
36ad0 20 20 20 7d 0a 20 20 20 20 7a 43 6d 64 20 3d 20     }.    zCmd = 
36ae0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
36af0 73 74 72 63 68 72 28 61 7a 41 72 67 5b 31 5d 2c  strchr(azArg[1],
36b00 27 20 27 29 3d 3d 30 3f 22 25 73 22 3a 22 5c 22  ' ')==0?"%s":"\"
36b10 25 73 5c 22 22 2c 20 61 7a 41 72 67 5b 31 5d 29  %s\"", azArg[1])
36b20 3b 0a 20 20 20 20 66 6f 72 28 69 3d 32 3b 20 69  ;.    for(i=2; i
36b30 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
36b40 20 20 20 7a 43 6d 64 20 3d 20 73 71 6c 69 74 65     zCmd = sqlite
36b50 33 5f 6d 70 72 69 6e 74 66 28 73 74 72 63 68 72  3_mprintf(strchr
36b60 28 61 7a 41 72 67 5b 69 5d 2c 27 20 27 29 3d 3d  (azArg[i],' ')==
36b70 30 3f 22 25 7a 20 25 73 22 3a 22 25 7a 20 5c 22  0?"%z %s":"%z \"
36b80 25 73 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20  %s\"",.         
36b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36ba0 20 20 20 20 7a 43 6d 64 2c 20 61 7a 41 72 67 5b      zCmd, azArg[
36bb0 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 78  i]);.    }.    x
36bc0 20 3d 20 73 79 73 74 65 6d 28 7a 43 6d 64 29 3b   = system(zCmd);
36bd0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
36be0 65 28 7a 43 6d 64 29 3b 0a 20 20 20 20 69 66 28  e(zCmd);.    if(
36bf0 20 78 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28   x ) raw_printf(
36c00 73 74 64 65 72 72 2c 20 22 53 79 73 74 65 6d 20  stderr, "System 
36c10 63 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 73 20  command returns 
36c20 25 64 5c 6e 22 2c 20 78 29 3b 0a 20 20 7d 65 6c  %d\n", x);.  }el
36c30 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  se.#endif /* !de
36c40 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f 48  fined(SQLITE_NOH
36c50 41 56 45 5f 53 59 53 54 45 4d 29 20 2a 2f 0a 0a  AVE_SYSTEM) */..
36c60 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20    if( c=='s' && 
36c70 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
36c80 2c 20 22 73 68 6f 77 22 2c 20 6e 29 3d 3d 30 20  , "show", n)==0 
36c90 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f  ){.    static co
36ca0 6e 73 74 20 63 68 61 72 20 2a 61 7a 42 6f 6f 6c  nst char *azBool
36cb0 5b 5d 20 3d 20 7b 20 22 6f 66 66 22 2c 20 22 6f  [] = { "off", "o
36cc0 6e 22 2c 20 22 74 72 69 67 67 65 72 22 2c 20 22  n", "trigger", "
36cd0 66 75 6c 6c 22 7d 3b 0a 20 20 20 20 69 6e 74 20  full"};.    int 
36ce0 69 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21  i;.    if( nArg!
36cf0 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  =1 ){.      raw_
36d00 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
36d10 55 73 61 67 65 3a 20 2e 73 68 6f 77 5c 6e 22 29  Usage: .show\n")
36d20 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
36d30 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
36d40 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
36d50 20 20 7d 0a 20 20 20 20 75 74 66 38 5f 70 72 69    }.    utf8_pri
36d60 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31 32  ntf(p->out, "%12
36d70 2e 31 32 73 3a 20 25 73 5c 6e 22 2c 22 65 63 68  .12s: %s\n","ech
36d80 6f 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  o",.            
36d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36da0 20 20 20 20 20 20 61 7a 42 6f 6f 6c 5b 53 68 65        azBool[She
36db0 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20 53 48 46  llHasFlag(p, SHF
36dc0 4c 47 5f 45 63 68 6f 29 5d 29 3b 0a 20 20 20 20  LG_Echo)]);.    
36dd0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
36de0 75 74 2c 20 22 25 31 32 2e 31 32 73 3a 20 25 73  ut, "%12.12s: %s
36df0 5c 6e 22 2c 22 65 71 70 22 2c 20 61 7a 42 6f 6f  \n","eqp", azBoo
36e00 6c 5b 70 2d 3e 61 75 74 6f 45 51 50 26 33 5d 29  l[p->autoEQP&3])
36e10 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  ;.    utf8_print
36e20 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31 32 2e 31  f(p->out, "%12.1
36e30 32 73 3a 20 25 73 5c 6e 22 2c 22 65 78 70 6c 61  2s: %s\n","expla
36e40 69 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d  in",.         p-
36e50 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c  >mode==MODE_Expl
36e60 61 69 6e 20 3f 20 22 6f 6e 22 20 3a 20 70 2d 3e  ain ? "on" : p->
36e70 61 75 74 6f 45 78 70 6c 61 69 6e 20 3f 20 22 61  autoExplain ? "a
36e80 75 74 6f 22 20 3a 20 22 6f 66 66 22 29 3b 0a 20  uto" : "off");. 
36e90 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
36ea0 2d 3e 6f 75 74 2c 22 25 31 32 2e 31 32 73 3a 20  ->out,"%12.12s: 
36eb0 25 73 5c 6e 22 2c 22 68 65 61 64 65 72 73 22 2c  %s\n","headers",
36ec0 20 61 7a 42 6f 6f 6c 5b 70 2d 3e 73 68 6f 77 48   azBool[p->showH
36ed0 65 61 64 65 72 21 3d 30 5d 29 3b 0a 20 20 20 20  eader!=0]);.    
36ee0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
36ef0 75 74 2c 20 22 25 31 32 2e 31 32 73 3a 20 25 73  ut, "%12.12s: %s
36f00 5c 6e 22 2c 22 6d 6f 64 65 22 2c 20 6d 6f 64 65  \n","mode", mode
36f10 44 65 73 63 72 5b 70 2d 3e 6d 6f 64 65 5d 29 3b  Descr[p->mode]);
36f20 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
36f30 28 70 2d 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32  (p->out, "%12.12
36f40 73 3a 20 22 2c 20 22 6e 75 6c 6c 76 61 6c 75 65  s: ", "nullvalue
36f50 22 29 3b 0a 20 20 20 20 20 20 6f 75 74 70 75 74  ");.      output
36f60 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  _c_string(p->out
36f70 2c 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b  , p->nullValue);
36f80 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
36f90 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b  f(p->out, "\n");
36fa0 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
36fb0 28 70 2d 3e 6f 75 74 2c 22 25 31 32 2e 31 32 73  (p->out,"%12.12s
36fc0 3a 20 25 73 5c 6e 22 2c 22 6f 75 74 70 75 74 22  : %s\n","output"
36fd0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  ,.            st
36fe0 72 6c 65 6e 33 30 28 70 2d 3e 6f 75 74 66 69 6c  rlen30(p->outfil
36ff0 65 29 20 3f 20 70 2d 3e 6f 75 74 66 69 6c 65 20  e) ? p->outfile 
37000 3a 20 22 73 74 64 6f 75 74 22 29 3b 0a 20 20 20  : "stdout");.   
37010 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
37020 6f 75 74 2c 22 25 31 32 2e 31 32 73 3a 20 22 2c  out,"%12.12s: ",
37030 20 22 63 6f 6c 73 65 70 61 72 61 74 6f 72 22 29   "colseparator")
37040 3b 0a 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63  ;.      output_c
37050 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
37060 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
37070 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  ;.      raw_prin
37080 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29  tf(p->out, "\n")
37090 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  ;.    utf8_print
370a0 66 28 70 2d 3e 6f 75 74 2c 22 25 31 32 2e 31 32  f(p->out,"%12.12
370b0 73 3a 20 22 2c 20 22 72 6f 77 73 65 70 61 72 61  s: ", "rowsepara
370c0 74 6f 72 22 29 3b 0a 20 20 20 20 20 20 6f 75 74  tor");.      out
370d0 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e  put_c_string(p->
370e0 6f 75 74 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  out, p->rowSepar
370f0 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 72 61 77  ator);.      raw
37100 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
37110 22 5c 6e 22 29 3b 0a 20 20 20 20 75 74 66 38 5f  "\n");.    utf8_
37120 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
37130 25 31 32 2e 31 32 73 3a 20 25 73 5c 6e 22 2c 22  %12.12s: %s\n","
37140 73 74 61 74 73 22 2c 20 61 7a 42 6f 6f 6c 5b 70  stats", azBool[p
37150 2d 3e 73 74 61 74 73 4f 6e 21 3d 30 5d 29 3b 0a  ->statsOn!=0]);.
37160 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
37170 70 2d 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32 73  p->out, "%12.12s
37180 3a 20 22 2c 20 22 77 69 64 74 68 22 29 3b 0a 20  : ", "width");. 
37190 20 20 20 66 6f 72 20 28 69 3d 30 3b 69 3c 28 69     for (i=0;i<(i
371a0 6e 74 29 41 72 72 61 79 53 69 7a 65 28 70 2d 3e  nt)ArraySize(p->
371b0 63 6f 6c 57 69 64 74 68 29 20 26 26 20 70 2d 3e  colWidth) && p->
371c0 63 6f 6c 57 69 64 74 68 5b 69 5d 20 21 3d 20 30  colWidth[i] != 0
371d0 3b 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20 72 61  ;i++) {.      ra
371e0 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
371f0 20 22 25 64 20 22 2c 20 70 2d 3e 63 6f 6c 57 69   "%d ", p->colWi
37200 64 74 68 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  dth[i]);.    }. 
37210 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
37220 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20  >out, "\n");.   
37230 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
37240 6f 75 74 2c 20 22 25 31 32 2e 31 32 73 3a 20 25  out, "%12.12s: %
37250 73 5c 6e 22 2c 20 22 66 69 6c 65 6e 61 6d 65 22  s\n", "filename"
37260 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
37270 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65    p->zDbFilename
37280 20 3f 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d   ? p->zDbFilenam
37290 65 20 3a 20 22 22 29 3b 0a 20 20 7d 65 6c 73 65  e : "");.  }else
372a0 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26  ..  if( c=='s' &
372b0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
372c0 30 5d 2c 20 22 73 74 61 74 73 22 2c 20 6e 29 3d  0], "stats", n)=
372d0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
372e0 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 70  rg==2 ){.      p
372f0 2d 3e 73 74 61 74 73 4f 6e 20 3d 20 28 75 38 29  ->statsOn = (u8)
37300 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41  booleanValue(azA
37310 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  rg[1]);.    }els
37320 65 20 69 66 28 20 6e 41 72 67 3d 3d 31 20 29 7b  e if( nArg==1 ){
37330 0a 20 20 20 20 20 20 64 69 73 70 6c 61 79 5f 73  .      display_s
37340 74 61 74 73 28 70 2d 3e 64 62 2c 20 70 2c 20 30  tats(p->db, p, 0
37350 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
37360 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
37370 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
37380 73 74 61 74 73 20 3f 6f 6e 7c 6f 66 66 3f 5c 6e  stats ?on|off?\n
37390 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
373a0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
373b0 0a 20 20 69 66 28 20 28 63 3d 3d 27 74 27 20 26  .  if( (c=='t' &
373c0 26 20 6e 3e 31 20 26 26 20 73 74 72 6e 63 6d 70  & n>1 && strncmp
373d0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 74 61 62 6c  (azArg[0], "tabl
373e0 65 73 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 20 7c  es", n)==0).   |
373f0 7c 20 28 63 3d 3d 27 69 27 20 26 26 20 28 73 74  | (c=='i' && (st
37400 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
37410 22 69 6e 64 69 63 65 73 22 2c 20 6e 29 3d 3d 30  "indices", n)==0
37420 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
37430 20 20 7c 7c 20 73 74 72 6e 63 6d 70 28 61 7a 41    || strncmp(azA
37440 72 67 5b 30 5d 2c 20 22 69 6e 64 65 78 65 73 22  rg[0], "indexes"
37450 2c 20 6e 29 3d 3d 30 29 20 29 0a 20 20 29 7b 0a  , n)==0) ).  ){.
37460 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
37470 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 63 68 61   *pStmt;.    cha
37480 72 20 2a 2a 61 7a 52 65 73 75 6c 74 3b 0a 20 20  r **azResult;.  
37490 20 20 69 6e 74 20 6e 52 6f 77 2c 20 6e 41 6c 6c    int nRow, nAll
374a0 6f 63 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a  oc;.    int ii;.
374b0 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73 3b      ShellText s;
374c0 0a 20 20 20 20 69 6e 69 74 54 65 78 74 28 26 73  .    initText(&s
374d0 29 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  );.    open_db(p
374e0 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  , 0);.    rc = s
374f0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
37500 32 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41  2(p->db, "PRAGMA
37510 20 64 61 74 61 62 61 73 65 5f 6c 69 73 74 22 2c   database_list",
37520 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
37530 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
37540 74 75 72 6e 20 73 68 65 6c 6c 44 61 74 61 62 61  turn shellDataba
37550 73 65 45 72 72 6f 72 28 70 2d 3e 64 62 29 3b 0a  seError(p->db);.
37560 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 32 20  .    if( nArg>2 
37570 26 26 20 63 3d 3d 27 69 27 20 29 7b 0a 20 20 20  && c=='i' ){.   
37580 20 20 20 2f 2a 20 49 74 20 69 73 20 61 6e 20 68     /* It is an h
37590 69 73 74 6f 72 69 63 61 6c 20 61 63 63 69 64 65  istorical accide
375a0 6e 74 20 74 68 61 74 20 74 68 65 20 2e 69 6e 64  nt that the .ind
375b0 65 78 65 73 20 63 6f 6d 6d 61 6e 64 20 73 68 6f  exes command sho
375c0 77 73 20 61 6e 20 65 72 72 6f 72 0a 20 20 20 20  ws an error.    
375d0 20 20 2a 2a 20 77 68 65 6e 20 63 61 6c 6c 65 64    ** when called
375e0 20 77 69 74 68 20 74 68 65 20 77 72 6f 6e 67 20