/ Hex Artifact Content
Login

Artifact d6a07811aa9f3b10200c15ab8dd4b6b998849a3b0c8b125bfa980329a33c26a6:


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 69 66 6e 64 65  .# endif.# ifnde
0d60: 66 20 75 6e 6c 69 6e 6b 0a 23 20 20 64 65 66 69  f unlink.#  defi
0d70: 6e 65 20 75 6e 6c 69 6e 6b 20 5f 75 6e 6c 69 6e  ne unlink _unlin
0d80: 6b 0a 23 20 65 6e 64 69 66 0a 23 20 75 6e 64 65  k.# endif.# unde
0d90: 66 20 70 6f 70 65 6e 0a 23 20 64 65 66 69 6e 65  f popen.# define
0da0: 20 70 6f 70 65 6e 20 5f 70 6f 70 65 6e 0a 23 20   popen _popen.# 
0db0: 75 6e 64 65 66 20 70 63 6c 6f 73 65 0a 23 20 64  undef pclose.# d
0dc0: 65 66 69 6e 65 20 70 63 6c 6f 73 65 20 5f 70 63  efine pclose _pc
0dd0: 6c 6f 73 65 0a 23 65 6c 73 65 0a 20 2f 2a 20 4d  lose.#else. /* M
0de0: 61 6b 65 20 73 75 72 65 20 69 73 61 74 74 79 28  ake sure isatty(
0df0: 29 20 68 61 73 20 61 20 70 72 6f 74 6f 74 79 70  ) has a prototyp
0e00: 65 2e 20 2a 2f 0a 20 65 78 74 65 72 6e 20 69 6e  e. */. extern in
0e10: 74 20 69 73 61 74 74 79 28 69 6e 74 29 3b 0a 0a  t isatty(int);..
0e20: 23 20 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f  # if !defined(__
0e30: 52 54 50 5f 5f 29 20 26 26 20 21 64 65 66 69 6e  RTP__) && !defin
0e40: 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a  ed(_WRS_KERNEL).
0e50: 20 20 2f 2a 20 70 6f 70 65 6e 20 61 6e 64 20 70    /* popen and p
0e60: 63 6c 6f 73 65 20 61 72 65 20 6e 6f 74 20 43 38  close are not C8
0e70: 39 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20  9 functions and 
0e80: 73 6f 20 61 72 65 0a 20 20 2a 2a 20 73 6f 6d 65  so are.  ** some
0e90: 74 69 6d 65 73 20 6f 6d 69 74 74 65 64 20 66 72  times omitted fr
0ea0: 6f 6d 20 74 68 65 20 3c 73 74 64 69 6f 2e 68 3e  om the <stdio.h>
0eb0: 20 68 65 61 64 65 72 20 2a 2f 0a 20 20 20 65 78   header */.   ex
0ec0: 74 65 72 6e 20 46 49 4c 45 20 2a 70 6f 70 65 6e  tern FILE *popen
0ed0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e  (const char*,con
0ee0: 73 74 20 63 68 61 72 2a 29 3b 0a 20 20 20 65 78  st char*);.   ex
0ef0: 74 65 72 6e 20 69 6e 74 20 70 63 6c 6f 73 65 28  tern int pclose(
0f00: 46 49 4c 45 2a 29 3b 0a 23 20 65 6c 73 65 0a 23  FILE*);.# else.#
0f10: 20 20 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f    define SQLITE_
0f20: 4f 4d 49 54 5f 50 4f 50 45 4e 20 31 0a 23 20 65  OMIT_POPEN 1.# e
0f30: 6e 64 69 66 0a 23 65 6e 64 69 66 0a 0a 23 69 66  ndif.#endif..#if
0f40: 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f   defined(_WIN32_
0f50: 57 43 45 29 0a 2f 2a 20 57 69 6e 64 6f 77 73 20  WCE)./* Windows 
0f60: 43 45 20 28 61 72 6d 2d 77 69 6e 63 65 2d 6d 69  CE (arm-wince-mi
0f70: 6e 67 77 33 32 63 65 2d 67 63 63 29 20 64 6f 65  ngw32ce-gcc) doe
0f80: 73 20 6e 6f 74 20 70 72 6f 76 69 64 65 20 69 73  s not provide is
0f90: 61 74 74 79 28 29 0a 20 2a 20 74 68 75 73 20 77  atty(). * thus w
0fa0: 65 20 61 6c 77 61 79 73 20 61 73 73 75 6d 65 20  e always assume 
0fb0: 74 68 61 74 20 77 65 20 68 61 76 65 20 61 20 63  that we have a c
0fc0: 6f 6e 73 6f 6c 65 2e 20 54 68 61 74 20 63 61 6e  onsole. That can
0fd0: 20 62 65 0a 20 2a 20 6f 76 65 72 72 69 64 64 65   be. * overridde
0fe0: 6e 20 77 69 74 68 20 74 68 65 20 2d 62 61 74 63  n with the -batc
0ff0: 68 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 6f  h command line o
1000: 70 74 69 6f 6e 2e 0a 20 2a 2f 0a 23 64 65 66 69  ption.. */.#defi
1010: 6e 65 20 69 73 61 74 74 79 28 78 29 20 31 0a 23  ne isatty(x) 1.#
1020: 65 6e 64 69 66 0a 0a 2f 2a 20 63 74 79 70 65 20  endif../* ctype 
1030: 6d 61 63 72 6f 73 20 74 68 61 74 20 77 6f 72 6b  macros that work
1040: 20 77 69 74 68 20 73 69 67 6e 65 64 20 63 68 61   with signed cha
1050: 72 61 63 74 65 72 73 20 2a 2f 0a 23 64 65 66 69  racters */.#defi
1060: 6e 65 20 49 73 53 70 61 63 65 28 58 29 20 20 69  ne IsSpace(X)  i
1070: 73 73 70 61 63 65 28 28 75 6e 73 69 67 6e 65 64  sspace((unsigned
1080: 20 63 68 61 72 29 58 29 0a 23 64 65 66 69 6e 65   char)X).#define
1090: 20 49 73 44 69 67 69 74 28 58 29 20 20 69 73 64   IsDigit(X)  isd
10a0: 69 67 69 74 28 28 75 6e 73 69 67 6e 65 64 20 63  igit((unsigned c
10b0: 68 61 72 29 58 29 0a 23 64 65 66 69 6e 65 20 54  har)X).#define T
10c0: 6f 4c 6f 77 65 72 28 58 29 20 20 28 63 68 61 72  oLower(X)  (char
10d0: 29 74 6f 6c 6f 77 65 72 28 28 75 6e 73 69 67 6e  )tolower((unsign
10e0: 65 64 20 63 68 61 72 29 58 29 0a 0a 23 69 66 20  ed char)X)..#if 
10f0: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20  defined(_WIN32) 
1100: 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32  || defined(WIN32
1110: 29 0a 23 69 6e 63 6c 75 64 65 20 3c 77 69 6e 64  ).#include <wind
1120: 6f 77 73 2e 68 3e 0a 0a 2f 2a 20 73 74 72 69 6e  ows.h>../* strin
1130: 67 20 63 6f 6e 76 65 72 73 69 6f 6e 20 72 6f 75  g conversion rou
1140: 74 69 6e 65 73 20 6f 6e 6c 79 20 6e 65 65 64 65  tines only neede
1150: 64 20 6f 6e 20 57 69 6e 33 32 20 2a 2f 0a 65 78  d on Win32 */.ex
1160: 74 65 72 6e 20 63 68 61 72 20 2a 73 71 6c 69 74  tern char *sqlit
1170: 65 33 5f 77 69 6e 33 32 5f 75 6e 69 63 6f 64 65  e3_win32_unicode
1180: 5f 74 6f 5f 75 74 66 38 28 4c 50 43 57 53 54 52  _to_utf8(LPCWSTR
1190: 29 3b 0a 65 78 74 65 72 6e 20 63 68 61 72 20 2a  );.extern char *
11a0: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62  sqlite3_win32_mb
11b0: 63 73 5f 74 6f 5f 75 74 66 38 5f 76 32 28 63 6f  cs_to_utf8_v2(co
11c0: 6e 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 29  nst char *, int)
11d0: 3b 0a 65 78 74 65 72 6e 20 63 68 61 72 20 2a 73  ;.extern char *s
11e0: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66  qlite3_win32_utf
11f0: 38 5f 74 6f 5f 6d 62 63 73 5f 76 32 28 63 6f 6e  8_to_mbcs_v2(con
1200: 73 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 29 3b  st char *, int);
1210: 0a 65 78 74 65 72 6e 20 4c 50 57 53 54 52 20 73  .extern LPWSTR s
1220: 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66  qlite3_win32_utf
1230: 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 63 6f 6e  8_to_unicode(con
1240: 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 29 3b  st char *zText);
1250: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 4f 6e 20 57  .#endif../* On W
1260: 69 6e 64 6f 77 73 2c 20 77 65 20 6e 6f 72 6d 61  indows, we norma
1270: 6c 6c 79 20 72 75 6e 20 77 69 74 68 20 6f 75 74  lly run with out
1280: 70 75 74 20 6d 6f 64 65 20 6f 66 20 54 45 58 54  put mode of TEXT
1290: 20 73 6f 20 74 68 61 74 20 5c 6e 20 63 68 61 72   so that \n char
12a0: 61 63 74 65 72 73 0a 2a 2a 20 61 72 65 20 61 75  acters.** are au
12b0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 74 72 61 6e  tomatically tran
12c0: 73 6c 61 74 65 64 20 69 6e 74 6f 20 5c 72 5c 6e  slated into \r\n
12d0: 2e 20 20 48 6f 77 65 76 65 72 2c 20 74 68 69 73  .  However, this
12e0: 20 62 65 68 61 76 69 6f 72 20 6e 65 65 64 73 0a   behavior needs.
12f0: 2a 2a 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65  ** to be disable
1300: 64 20 69 6e 20 73 6f 6d 65 20 63 61 73 65 73 20  d in some cases 
1310: 28 65 78 3a 20 77 68 65 6e 20 67 65 6e 65 72 61  (ex: when genera
1320: 74 69 6e 67 20 43 53 56 20 6f 75 74 70 75 74 20  ting CSV output 
1330: 61 6e 64 20 77 68 65 6e 0a 2a 2a 20 72 65 6e 64  and when.** rend
1340: 65 72 69 6e 67 20 71 75 6f 74 65 64 20 73 74 72  ering quoted str
1350: 69 6e 67 73 20 74 68 61 74 20 63 6f 6e 74 61 69  ings that contai
1360: 6e 20 5c 6e 20 63 68 61 72 61 63 74 65 72 73 29  n \n characters)
1370: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
1380: 0a 2a 2a 20 72 6f 75 74 69 6e 65 73 20 74 61 6b  .** routines tak
1390: 65 20 63 61 72 65 20 6f 66 20 74 68 61 74 2e 0a  e care of that..
13a0: 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  */.#if defined(_
13b0: 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65  WIN32) || define
13c0: 64 28 57 49 4e 33 32 29 0a 73 74 61 74 69 63 20  d(WIN32).static 
13d0: 76 6f 69 64 20 73 65 74 42 69 6e 61 72 79 4d 6f  void setBinaryMo
13e0: 64 65 28 46 49 4c 45 20 2a 66 69 6c 65 2c 20 69  de(FILE *file, i
13f0: 6e 74 20 69 73 4f 75 74 70 75 74 29 7b 0a 20 20  nt isOutput){.  
1400: 69 66 28 20 69 73 4f 75 74 70 75 74 20 29 20 66  if( isOutput ) f
1410: 66 6c 75 73 68 28 66 69 6c 65 29 3b 0a 20 20 5f  flush(file);.  _
1420: 73 65 74 6d 6f 64 65 28 5f 66 69 6c 65 6e 6f 28  setmode(_fileno(
1430: 66 69 6c 65 29 2c 20 5f 4f 5f 42 49 4e 41 52 59  file), _O_BINARY
1440: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
1450: 20 73 65 74 54 65 78 74 4d 6f 64 65 28 46 49 4c   setTextMode(FIL
1460: 45 20 2a 66 69 6c 65 2c 20 69 6e 74 20 69 73 4f  E *file, int isO
1470: 75 74 70 75 74 29 7b 0a 20 20 69 66 28 20 69 73  utput){.  if( is
1480: 4f 75 74 70 75 74 20 29 20 66 66 6c 75 73 68 28  Output ) fflush(
1490: 66 69 6c 65 29 3b 0a 20 20 5f 73 65 74 6d 6f 64  file);.  _setmod
14a0: 65 28 5f 66 69 6c 65 6e 6f 28 66 69 6c 65 29 2c  e(_fileno(file),
14b0: 20 5f 4f 5f 54 45 58 54 29 3b 0a 7d 0a 23 65 6c   _O_TEXT);.}.#el
14c0: 73 65 0a 23 20 64 65 66 69 6e 65 20 73 65 74 42  se.# define setB
14d0: 69 6e 61 72 79 4d 6f 64 65 28 58 2c 59 29 0a 23  inaryMode(X,Y).#
14e0: 20 64 65 66 69 6e 65 20 73 65 74 54 65 78 74 4d   define setTextM
14f0: 6f 64 65 28 58 2c 59 29 0a 23 65 6e 64 69 66 0a  ode(X,Y).#endif.
1500: 0a 0a 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65  ../* True if the
1510: 20 74 69 6d 65 72 20 69 73 20 65 6e 61 62 6c 65   timer is enable
1520: 64 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  d */.static int 
1530: 65 6e 61 62 6c 65 54 69 6d 65 72 20 3d 20 30 3b  enableTimer = 0;
1540: 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20  ../* Return the 
1550: 63 75 72 72 65 6e 74 20 77 61 6c 6c 2d 63 6c 6f  current wall-clo
1560: 63 6b 20 74 69 6d 65 20 2a 2f 0a 73 74 61 74 69  ck time */.stati
1570: 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20  c sqlite3_int64 
1580: 74 69 6d 65 4f 66 44 61 79 28 76 6f 69 64 29 7b  timeOfDay(void){
1590: 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
15a0: 33 5f 76 66 73 20 2a 63 6c 6f 63 6b 56 66 73 20  3_vfs *clockVfs 
15b0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69  = 0;.  sqlite3_i
15c0: 6e 74 36 34 20 74 3b 0a 20 20 69 66 28 20 63 6c  nt64 t;.  if( cl
15d0: 6f 63 6b 56 66 73 3d 3d 30 20 29 20 63 6c 6f 63  ockVfs==0 ) cloc
15e0: 6b 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76  kVfs = sqlite3_v
15f0: 66 73 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66  fs_find(0);.  if
1600: 28 20 63 6c 6f 63 6b 56 66 73 2d 3e 69 56 65 72  ( clockVfs->iVer
1610: 73 69 6f 6e 3e 3d 32 20 26 26 20 63 6c 6f 63 6b  sion>=2 && clock
1620: 56 66 73 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d  Vfs->xCurrentTim
1630: 65 49 6e 74 36 34 21 3d 30 20 29 7b 0a 20 20 20  eInt64!=0 ){.   
1640: 20 63 6c 6f 63 6b 56 66 73 2d 3e 78 43 75 72 72   clockVfs->xCurr
1650: 65 6e 74 54 69 6d 65 49 6e 74 36 34 28 63 6c 6f  entTimeInt64(clo
1660: 63 6b 56 66 73 2c 20 26 74 29 3b 0a 20 20 7d 65  ckVfs, &t);.  }e
1670: 6c 73 65 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20  lse{.    double 
1680: 72 3b 0a 20 20 20 20 63 6c 6f 63 6b 56 66 73 2d  r;.    clockVfs-
1690: 3e 78 43 75 72 72 65 6e 74 54 69 6d 65 28 63 6c  >xCurrentTime(cl
16a0: 6f 63 6b 56 66 73 2c 20 26 72 29 3b 0a 20 20 20  ockVfs, &r);.   
16b0: 20 74 20 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e   t = (sqlite3_in
16c0: 74 36 34 29 28 72 2a 38 36 34 30 30 30 30 30 2e  t64)(r*86400000.
16d0: 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
16e0: 20 74 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69   t;.}..#if !defi
16f0: 6e 65 64 28 5f 57 49 4e 33 32 29 20 26 26 20 21  ned(_WIN32) && !
1700: 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 20 26  defined(WIN32) &
1710: 26 20 21 64 65 66 69 6e 65 64 28 5f 5f 6d 69 6e  & !defined(__min
1720: 75 78 29 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79  ux).#include <sy
1730: 73 2f 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75  s/time.h>.#inclu
1740: 64 65 20 3c 73 79 73 2f 72 65 73 6f 75 72 63 65  de <sys/resource
1750: 2e 68 3e 0a 0a 2f 2a 20 56 78 57 6f 72 6b 73 20  .h>../* VxWorks 
1760: 64 6f 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74  does not support
1770: 20 67 65 74 72 75 73 61 67 65 28 29 20 61 73 20   getrusage() as 
1780: 66 61 72 20 61 73 20 77 65 20 63 61 6e 20 64 65  far as we can de
1790: 74 65 72 6d 69 6e 65 20 2a 2f 0a 23 69 66 20 64  termine */.#if d
17a0: 65 66 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e  efined(_WRS_KERN
17b0: 45 4c 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f  EL) || defined(_
17c0: 5f 52 54 50 5f 5f 29 0a 73 74 72 75 63 74 20 72  _RTP__).struct r
17d0: 75 73 61 67 65 20 7b 0a 20 20 73 74 72 75 63 74  usage {.  struct
17e0: 20 74 69 6d 65 76 61 6c 20 72 75 5f 75 74 69 6d   timeval ru_utim
17f0: 65 3b 20 2f 2a 20 75 73 65 72 20 43 50 55 20 74  e; /* user CPU t
1800: 69 6d 65 20 75 73 65 64 20 2a 2f 0a 20 20 73 74  ime used */.  st
1810: 72 75 63 74 20 74 69 6d 65 76 61 6c 20 72 75 5f  ruct timeval ru_
1820: 73 74 69 6d 65 3b 20 2f 2a 20 73 79 73 74 65 6d  stime; /* system
1830: 20 43 50 55 20 74 69 6d 65 20 75 73 65 64 20 2a   CPU time used *
1840: 2f 0a 7d 3b 0a 23 64 65 66 69 6e 65 20 67 65 74  /.};.#define get
1850: 72 75 73 61 67 65 28 41 2c 42 29 20 6d 65 6d 73  rusage(A,B) mems
1860: 65 74 28 42 2c 30 2c 73 69 7a 65 6f 66 28 2a 42  et(B,0,sizeof(*B
1870: 29 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 53 61  )).#endif../* Sa
1880: 76 65 64 20 72 65 73 6f 75 72 63 65 20 69 6e 66  ved resource inf
1890: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65  ormation for the
18a0: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 6e   beginning of an
18b0: 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 73 74   operation */.st
18c0: 61 74 69 63 20 73 74 72 75 63 74 20 72 75 73 61  atic struct rusa
18d0: 67 65 20 73 42 65 67 69 6e 3b 20 20 2f 2a 20 43  ge sBegin;  /* C
18e0: 50 55 20 74 69 6d 65 20 61 74 20 73 74 61 72 74  PU time at start
18f0: 20 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74   */.static sqlit
1900: 65 33 5f 69 6e 74 36 34 20 69 42 65 67 69 6e 3b  e3_int64 iBegin;
1910: 20 20 2f 2a 20 57 61 6c 6c 2d 63 6c 6f 63 6b 20    /* Wall-clock 
1920: 74 69 6d 65 20 61 74 20 73 74 61 72 74 20 2a 2f  time at start */
1930: 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 74 69  ../*.** Begin ti
1940: 6d 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f  ming an operatio
1950: 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  n.*/.static void
1960: 20 62 65 67 69 6e 54 69 6d 65 72 28 76 6f 69 64   beginTimer(void
1970: 29 7b 0a 20 20 69 66 28 20 65 6e 61 62 6c 65 54  ){.  if( enableT
1980: 69 6d 65 72 20 29 7b 0a 20 20 20 20 67 65 74 72  imer ){.    getr
1990: 75 73 61 67 65 28 52 55 53 41 47 45 5f 53 45 4c  usage(RUSAGE_SEL
19a0: 46 2c 20 26 73 42 65 67 69 6e 29 3b 0a 20 20 20  F, &sBegin);.   
19b0: 20 69 42 65 67 69 6e 20 3d 20 74 69 6d 65 4f 66   iBegin = timeOf
19c0: 44 61 79 28 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  Day();.  }.}../*
19d0: 20 52 65 74 75 72 6e 20 74 68 65 20 64 69 66 66   Return the diff
19e0: 65 72 65 6e 63 65 20 6f 66 20 74 77 6f 20 74 69  erence of two ti
19f0: 6d 65 5f 73 74 72 75 63 74 73 20 69 6e 20 73 65  me_structs in se
1a00: 63 6f 6e 64 73 20 2a 2f 0a 73 74 61 74 69 63 20  conds */.static 
1a10: 64 6f 75 62 6c 65 20 74 69 6d 65 44 69 66 66 28  double timeDiff(
1a20: 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20 2a  struct timeval *
1a30: 70 53 74 61 72 74 2c 20 73 74 72 75 63 74 20 74  pStart, struct t
1a40: 69 6d 65 76 61 6c 20 2a 70 45 6e 64 29 7b 0a 20  imeval *pEnd){. 
1a50: 20 72 65 74 75 72 6e 20 28 70 45 6e 64 2d 3e 74   return (pEnd->t
1a60: 76 5f 75 73 65 63 20 2d 20 70 53 74 61 72 74 2d  v_usec - pStart-
1a70: 3e 74 76 5f 75 73 65 63 29 2a 30 2e 30 30 30 30  >tv_usec)*0.0000
1a80: 30 31 20 2b 0a 20 20 20 20 20 20 20 20 20 28 64  01 +.         (d
1a90: 6f 75 62 6c 65 29 28 70 45 6e 64 2d 3e 74 76 5f  ouble)(pEnd->tv_
1aa0: 73 65 63 20 2d 20 70 53 74 61 72 74 2d 3e 74 76  sec - pStart->tv
1ab0: 5f 73 65 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  _sec);.}../*.** 
1ac0: 50 72 69 6e 74 20 74 68 65 20 74 69 6d 69 6e 67  Print the timing
1ad0: 20 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a 73 74 61   results..*/.sta
1ae0: 74 69 63 20 76 6f 69 64 20 65 6e 64 54 69 6d 65  tic void endTime
1af0: 72 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65  r(void){.  if( e
1b00: 6e 61 62 6c 65 54 69 6d 65 72 20 29 7b 0a 20 20  nableTimer ){.  
1b10: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1b20: 69 45 6e 64 20 3d 20 74 69 6d 65 4f 66 44 61 79  iEnd = timeOfDay
1b30: 28 29 3b 0a 20 20 20 20 73 74 72 75 63 74 20 72  ();.    struct r
1b40: 75 73 61 67 65 20 73 45 6e 64 3b 0a 20 20 20 20  usage sEnd;.    
1b50: 67 65 74 72 75 73 61 67 65 28 52 55 53 41 47 45  getrusage(RUSAGE
1b60: 5f 53 45 4c 46 2c 20 26 73 45 6e 64 29 3b 0a 20  _SELF, &sEnd);. 
1b70: 20 20 20 70 72 69 6e 74 66 28 22 52 75 6e 20 54     printf("Run T
1b80: 69 6d 65 3a 20 72 65 61 6c 20 25 2e 33 66 20 75  ime: real %.3f u
1b90: 73 65 72 20 25 66 20 73 79 73 20 25 66 5c 6e 22  ser %f sys %f\n"
1ba0: 2c 0a 20 20 20 20 20 20 20 28 69 45 6e 64 20 2d  ,.       (iEnd -
1bb0: 20 69 42 65 67 69 6e 29 2a 30 2e 30 30 31 2c 0a   iBegin)*0.001,.
1bc0: 20 20 20 20 20 20 20 74 69 6d 65 44 69 66 66 28         timeDiff(
1bd0: 26 73 42 65 67 69 6e 2e 72 75 5f 75 74 69 6d 65  &sBegin.ru_utime
1be0: 2c 20 26 73 45 6e 64 2e 72 75 5f 75 74 69 6d 65  , &sEnd.ru_utime
1bf0: 29 2c 0a 20 20 20 20 20 20 20 74 69 6d 65 44 69  ),.       timeDi
1c00: 66 66 28 26 73 42 65 67 69 6e 2e 72 75 5f 73 74  ff(&sBegin.ru_st
1c10: 69 6d 65 2c 20 26 73 45 6e 64 2e 72 75 5f 73 74  ime, &sEnd.ru_st
1c20: 69 6d 65 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 64  ime));.  }.}..#d
1c30: 65 66 69 6e 65 20 42 45 47 49 4e 5f 54 49 4d 45  efine BEGIN_TIME
1c40: 52 20 62 65 67 69 6e 54 69 6d 65 72 28 29 0a 23  R beginTimer().#
1c50: 64 65 66 69 6e 65 20 45 4e 44 5f 54 49 4d 45 52  define END_TIMER
1c60: 20 65 6e 64 54 69 6d 65 72 28 29 0a 23 64 65 66   endTimer().#def
1c70: 69 6e 65 20 48 41 53 5f 54 49 4d 45 52 20 31 0a  ine HAS_TIMER 1.
1c80: 0a 23 65 6c 69 66 20 28 64 65 66 69 6e 65 64 28  .#elif (defined(
1c90: 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e  _WIN32) || defin
1ca0: 65 64 28 57 49 4e 33 32 29 29 0a 0a 2f 2a 20 53  ed(WIN32))../* S
1cb0: 61 76 65 64 20 72 65 73 6f 75 72 63 65 20 69 6e  aved resource in
1cc0: 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68  formation for th
1cd0: 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61  e beginning of a
1ce0: 6e 20 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 73  n operation */.s
1cf0: 74 61 74 69 63 20 48 41 4e 44 4c 45 20 68 50 72  tatic HANDLE hPr
1d00: 6f 63 65 73 73 3b 0a 73 74 61 74 69 63 20 46 49  ocess;.static FI
1d10: 4c 45 54 49 4d 45 20 66 74 4b 65 72 6e 65 6c 42  LETIME ftKernelB
1d20: 65 67 69 6e 3b 0a 73 74 61 74 69 63 20 46 49 4c  egin;.static FIL
1d30: 45 54 49 4d 45 20 66 74 55 73 65 72 42 65 67 69  ETIME ftUserBegi
1d40: 6e 3b 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65  n;.static sqlite
1d50: 33 5f 69 6e 74 36 34 20 66 74 57 61 6c 6c 42 65  3_int64 ftWallBe
1d60: 67 69 6e 3b 0a 74 79 70 65 64 65 66 20 42 4f 4f  gin;.typedef BOO
1d70: 4c 20 28 57 49 4e 41 50 49 20 2a 47 45 54 50 52  L (WINAPI *GETPR
1d80: 4f 43 54 49 4d 45 53 29 28 48 41 4e 44 4c 45 2c  OCTIMES)(HANDLE,
1d90: 20 4c 50 46 49 4c 45 54 49 4d 45 2c 20 4c 50 46   LPFILETIME, LPF
1da0: 49 4c 45 54 49 4d 45 2c 0a 20 20 20 20 20 20 20  ILETIME,.       
1db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 50 46               LPF
1dd0: 49 4c 45 54 49 4d 45 2c 20 4c 50 46 49 4c 45 54  ILETIME, LPFILET
1de0: 49 4d 45 29 3b 0a 73 74 61 74 69 63 20 47 45 54  IME);.static GET
1df0: 50 52 4f 43 54 49 4d 45 53 20 67 65 74 50 72 6f  PROCTIMES getPro
1e00: 63 65 73 73 54 69 6d 65 73 41 64 64 72 20 3d 20  cessTimesAddr = 
1e10: 4e 55 4c 4c 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65  NULL;../*.** Che
1e20: 63 6b 20 74 6f 20 73 65 65 20 69 66 20 77 65 20  ck to see if we 
1e30: 68 61 76 65 20 74 69 6d 65 72 20 73 75 70 70 6f  have timer suppo
1e40: 72 74 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  rt.  Return 1 if
1e50: 20 6e 65 63 65 73 73 61 72 79 0a 2a 2a 20 73 75   necessary.** su
1e60: 70 70 6f 72 74 20 66 6f 75 6e 64 20 28 6f 72 20  pport found (or 
1e70: 66 6f 75 6e 64 20 70 72 65 76 69 6f 75 73 6c 79  found previously
1e80: 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
1e90: 20 68 61 73 54 69 6d 65 72 28 76 6f 69 64 29 7b   hasTimer(void){
1ea0: 0a 20 20 69 66 28 20 67 65 74 50 72 6f 63 65 73  .  if( getProces
1eb0: 73 54 69 6d 65 73 41 64 64 72 20 29 7b 0a 20 20  sTimesAddr ){.  
1ec0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 20    return 1;.  } 
1ed0: 65 6c 73 65 20 7b 0a 20 20 20 20 2f 2a 20 47 65  else {.    /* Ge
1ee0: 74 50 72 6f 63 65 73 73 54 69 6d 65 73 28 29 20  tProcessTimes() 
1ef0: 69 73 6e 27 74 20 73 75 70 70 6f 72 74 65 64 20  isn't supported 
1f00: 69 6e 20 57 49 4e 39 35 20 61 6e 64 20 73 6f 6d  in WIN95 and som
1f10: 65 20 6f 74 68 65 72 20 57 69 6e 64 6f 77 73 0a  e other Windows.
1f20: 20 20 20 20 2a 2a 20 76 65 72 73 69 6f 6e 73 2e      ** versions.
1f30: 20 53 65 65 20 69 66 20 74 68 65 20 76 65 72 73   See if the vers
1f40: 69 6f 6e 20 77 65 20 61 72 65 20 72 75 6e 6e 69  ion we are runni
1f50: 6e 67 20 6f 6e 20 68 61 73 20 69 74 2c 20 61 6e  ng on has it, an
1f60: 64 20 69 66 20 69 74 0a 20 20 20 20 2a 2a 20 64  d if it.    ** d
1f70: 6f 65 73 2c 20 73 61 76 65 20 6f 66 66 20 61 20  oes, save off a 
1f80: 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 20 61 6e  pointer to it an
1f90: 64 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72  d the current pr
1fa0: 6f 63 65 73 73 20 68 61 6e 64 6c 65 2e 0a 20 20  ocess handle..  
1fb0: 20 20 2a 2f 0a 20 20 20 20 68 50 72 6f 63 65 73    */.    hProces
1fc0: 73 20 3d 20 47 65 74 43 75 72 72 65 6e 74 50 72  s = GetCurrentPr
1fd0: 6f 63 65 73 73 28 29 3b 0a 20 20 20 20 69 66 28  ocess();.    if(
1fe0: 20 68 50 72 6f 63 65 73 73 20 29 7b 0a 20 20 20   hProcess ){.   
1ff0: 20 20 20 48 49 4e 53 54 41 4e 43 45 20 68 69 6e     HINSTANCE hin
2000: 73 74 4c 69 62 20 3d 20 4c 6f 61 64 4c 69 62 72  stLib = LoadLibr
2010: 61 72 79 28 54 45 58 54 28 22 4b 65 72 6e 65 6c  ary(TEXT("Kernel
2020: 33 32 2e 64 6c 6c 22 29 29 3b 0a 20 20 20 20 20  32.dll"));.     
2030: 20 69 66 28 20 4e 55 4c 4c 20 21 3d 20 68 69 6e   if( NULL != hin
2040: 73 74 4c 69 62 20 29 7b 0a 20 20 20 20 20 20 20  stLib ){.       
2050: 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73   getProcessTimes
2060: 41 64 64 72 20 3d 0a 20 20 20 20 20 20 20 20 20  Addr =.         
2070: 20 20 20 28 47 45 54 50 52 4f 43 54 49 4d 45 53     (GETPROCTIMES
2080: 29 20 47 65 74 50 72 6f 63 41 64 64 72 65 73 73  ) GetProcAddress
2090: 28 68 69 6e 73 74 4c 69 62 2c 20 22 47 65 74 50  (hinstLib, "GetP
20a0: 72 6f 63 65 73 73 54 69 6d 65 73 22 29 3b 0a 20  rocessTimes");. 
20b0: 20 20 20 20 20 20 20 69 66 28 20 4e 55 4c 4c 20         if( NULL 
20c0: 21 3d 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d  != getProcessTim
20d0: 65 73 41 64 64 72 20 29 7b 0a 20 20 20 20 20 20  esAddr ){.      
20e0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
20f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2100: 46 72 65 65 4c 69 62 72 61 72 79 28 68 69 6e 73  FreeLibrary(hins
2110: 74 4c 69 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20  tLib);.      }. 
2120: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2130: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65  n 0;.}../*.** Be
2140: 67 69 6e 20 74 69 6d 69 6e 67 20 61 6e 20 6f 70  gin timing an op
2150: 65 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69  eration.*/.stati
2160: 63 20 76 6f 69 64 20 62 65 67 69 6e 54 69 6d 65  c void beginTime
2170: 72 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65  r(void){.  if( e
2180: 6e 61 62 6c 65 54 69 6d 65 72 20 26 26 20 67 65  nableTimer && ge
2190: 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64  tProcessTimesAdd
21a0: 72 20 29 7b 0a 20 20 20 20 46 49 4c 45 54 49 4d  r ){.    FILETIM
21b0: 45 20 66 74 43 72 65 61 74 69 6f 6e 2c 20 66 74  E ftCreation, ft
21c0: 45 78 69 74 3b 0a 20 20 20 20 67 65 74 50 72 6f  Exit;.    getPro
21d0: 63 65 73 73 54 69 6d 65 73 41 64 64 72 28 68 50  cessTimesAddr(hP
21e0: 72 6f 63 65 73 73 2c 26 66 74 43 72 65 61 74 69  rocess,&ftCreati
21f0: 6f 6e 2c 26 66 74 45 78 69 74 2c 0a 20 20 20 20  on,&ftExit,.    
2200: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2210: 20 20 20 20 26 66 74 4b 65 72 6e 65 6c 42 65 67      &ftKernelBeg
2220: 69 6e 2c 26 66 74 55 73 65 72 42 65 67 69 6e 29  in,&ftUserBegin)
2230: 3b 0a 20 20 20 20 66 74 57 61 6c 6c 42 65 67 69  ;.    ftWallBegi
2240: 6e 20 3d 20 74 69 6d 65 4f 66 44 61 79 28 29 3b  n = timeOfDay();
2250: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72  .  }.}../* Retur
2260: 6e 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65  n the difference
2270: 20 6f 66 20 74 77 6f 20 46 49 4c 45 54 49 4d 45   of two FILETIME
2280: 20 73 74 72 75 63 74 73 20 69 6e 20 73 65 63 6f   structs in seco
2290: 6e 64 73 20 2a 2f 0a 73 74 61 74 69 63 20 64 6f  nds */.static do
22a0: 75 62 6c 65 20 74 69 6d 65 44 69 66 66 28 46 49  uble timeDiff(FI
22b0: 4c 45 54 49 4d 45 20 2a 70 53 74 61 72 74 2c 20  LETIME *pStart, 
22c0: 46 49 4c 45 54 49 4d 45 20 2a 70 45 6e 64 29 7b  FILETIME *pEnd){
22d0: 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20  .  sqlite_int64 
22e0: 69 36 34 53 74 61 72 74 20 3d 20 2a 28 28 73 71  i64Start = *((sq
22f0: 6c 69 74 65 5f 69 6e 74 36 34 20 2a 29 20 70 53  lite_int64 *) pS
2300: 74 61 72 74 29 3b 0a 20 20 73 71 6c 69 74 65 5f  tart);.  sqlite_
2310: 69 6e 74 36 34 20 69 36 34 45 6e 64 20 3d 20 2a  int64 i64End = *
2320: 28 28 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a  ((sqlite_int64 *
2330: 29 20 70 45 6e 64 29 3b 0a 20 20 72 65 74 75 72  ) pEnd);.  retur
2340: 6e 20 28 64 6f 75 62 6c 65 29 20 28 28 69 36 34  n (double) ((i64
2350: 45 6e 64 20 2d 20 69 36 34 53 74 61 72 74 29 20  End - i64Start) 
2360: 2f 20 31 30 30 30 30 30 30 30 2e 30 29 3b 0a 7d  / 10000000.0);.}
2370: 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68  ../*.** Print th
2380: 65 20 74 69 6d 69 6e 67 20 72 65 73 75 6c 74 73  e timing results
2390: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
23a0: 20 65 6e 64 54 69 6d 65 72 28 76 6f 69 64 29 7b   endTimer(void){
23b0: 0a 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d  .  if( enableTim
23c0: 65 72 20 26 26 20 67 65 74 50 72 6f 63 65 73 73  er && getProcess
23d0: 54 69 6d 65 73 41 64 64 72 29 7b 0a 20 20 20 20  TimesAddr){.    
23e0: 46 49 4c 45 54 49 4d 45 20 66 74 43 72 65 61 74  FILETIME ftCreat
23f0: 69 6f 6e 2c 20 66 74 45 78 69 74 2c 20 66 74 4b  ion, ftExit, ftK
2400: 65 72 6e 65 6c 45 6e 64 2c 20 66 74 55 73 65 72  ernelEnd, ftUser
2410: 45 6e 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  End;.    sqlite3
2420: 5f 69 6e 74 36 34 20 66 74 57 61 6c 6c 45 6e 64  _int64 ftWallEnd
2430: 20 3d 20 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a   = timeOfDay();.
2440: 20 20 20 20 67 65 74 50 72 6f 63 65 73 73 54 69      getProcessTi
2450: 6d 65 73 41 64 64 72 28 68 50 72 6f 63 65 73 73  mesAddr(hProcess
2460: 2c 26 66 74 43 72 65 61 74 69 6f 6e 2c 26 66 74  ,&ftCreation,&ft
2470: 45 78 69 74 2c 26 66 74 4b 65 72 6e 65 6c 45 6e  Exit,&ftKernelEn
2480: 64 2c 26 66 74 55 73 65 72 45 6e 64 29 3b 0a 20  d,&ftUserEnd);. 
2490: 20 20 20 70 72 69 6e 74 66 28 22 52 75 6e 20 54     printf("Run T
24a0: 69 6d 65 3a 20 72 65 61 6c 20 25 2e 33 66 20 75  ime: real %.3f u
24b0: 73 65 72 20 25 66 20 73 79 73 20 25 66 5c 6e 22  ser %f sys %f\n"
24c0: 2c 0a 20 20 20 20 20 20 20 28 66 74 57 61 6c 6c  ,.       (ftWall
24d0: 45 6e 64 20 2d 20 66 74 57 61 6c 6c 42 65 67 69  End - ftWallBegi
24e0: 6e 29 2a 30 2e 30 30 31 2c 0a 20 20 20 20 20 20  n)*0.001,.      
24f0: 20 74 69 6d 65 44 69 66 66 28 26 66 74 55 73 65   timeDiff(&ftUse
2500: 72 42 65 67 69 6e 2c 20 26 66 74 55 73 65 72 45  rBegin, &ftUserE
2510: 6e 64 29 2c 0a 20 20 20 20 20 20 20 74 69 6d 65  nd),.       time
2520: 44 69 66 66 28 26 66 74 4b 65 72 6e 65 6c 42 65  Diff(&ftKernelBe
2530: 67 69 6e 2c 20 26 66 74 4b 65 72 6e 65 6c 45 6e  gin, &ftKernelEn
2540: 64 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 64 65 66  d));.  }.}..#def
2550: 69 6e 65 20 42 45 47 49 4e 5f 54 49 4d 45 52 20  ine BEGIN_TIMER 
2560: 62 65 67 69 6e 54 69 6d 65 72 28 29 0a 23 64 65  beginTimer().#de
2570: 66 69 6e 65 20 45 4e 44 5f 54 49 4d 45 52 20 65  fine END_TIMER e
2580: 6e 64 54 69 6d 65 72 28 29 0a 23 64 65 66 69 6e  ndTimer().#defin
2590: 65 20 48 41 53 5f 54 49 4d 45 52 20 68 61 73 54  e HAS_TIMER hasT
25a0: 69 6d 65 72 28 29 0a 0a 23 65 6c 73 65 0a 23 64  imer()..#else.#d
25b0: 65 66 69 6e 65 20 42 45 47 49 4e 5f 54 49 4d 45  efine BEGIN_TIME
25c0: 52 0a 23 64 65 66 69 6e 65 20 45 4e 44 5f 54 49  R.#define END_TI
25d0: 4d 45 52 0a 23 64 65 66 69 6e 65 20 48 41 53 5f  MER.#define HAS_
25e0: 54 49 4d 45 52 20 30 0a 23 65 6e 64 69 66 0a 0a  TIMER 0.#endif..
25f0: 2f 2a 0a 2a 2a 20 55 73 65 64 20 74 6f 20 70 72  /*.** Used to pr
2600: 65 76 65 6e 74 20 77 61 72 6e 69 6e 67 73 20 61  event warnings a
2610: 62 6f 75 74 20 75 6e 75 73 65 64 20 70 61 72 61  bout unused para
2620: 6d 65 74 65 72 73 0a 2a 2f 0a 23 64 65 66 69 6e  meters.*/.#defin
2630: 65 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54  e UNUSED_PARAMET
2640: 45 52 28 78 29 20 28 76 6f 69 64 29 28 78 29 0a  ER(x) (void)(x).
2650: 0a 2f 2a 0a 2a 2a 20 4e 75 6d 62 65 72 20 6f 66  ./*.** Number of
2660: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 6e 20   elements in an 
2670: 61 72 72 61 79 0a 2a 2f 0a 23 64 65 66 69 6e 65  array.*/.#define
2680: 20 41 72 72 61 79 53 69 7a 65 28 58 29 20 20 28   ArraySize(X)  (
2690: 69 6e 74 29 28 73 69 7a 65 6f 66 28 58 29 2f 73  int)(sizeof(X)/s
26a0: 69 7a 65 6f 66 28 58 5b 30 5d 29 29 0a 0a 2f 2a  izeof(X[0]))../*
26b0: 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f  .** If the follo
26c0: 77 69 6e 67 20 66 6c 61 67 20 69 73 20 73 65 74  wing flag is set
26d0: 2c 20 74 68 65 6e 20 63 6f 6d 6d 61 6e 64 20 65  , then command e
26e0: 78 65 63 75 74 69 6f 6e 20 73 74 6f 70 73 0a 2a  xecution stops.*
26f0: 2a 20 61 74 20 61 6e 20 65 72 72 6f 72 20 69 66  * at an error if
2700: 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 74 65   we are not inte
2710: 72 61 63 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74  ractive..*/.stat
2720: 69 63 20 69 6e 74 20 62 61 69 6c 5f 6f 6e 5f 65  ic int bail_on_e
2730: 72 72 6f 72 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  rror = 0;../*.**
2740: 20 54 68 72 65 61 74 20 73 74 64 69 6e 20 61 73   Threat stdin as
2750: 20 61 6e 20 69 6e 74 65 72 61 63 74 69 76 65 20   an interactive 
2760: 69 6e 70 75 74 20 69 66 20 74 68 65 20 66 6f 6c  input if the fol
2770: 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65 0a  lowing variable.
2780: 2a 2a 20 69 73 20 74 72 75 65 2e 20 20 4f 74 68  ** is true.  Oth
2790: 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20 73  erwise, assume s
27a0: 74 64 69 6e 20 69 73 20 63 6f 6e 6e 65 63 74 65  tdin is connecte
27b0: 64 20 74 6f 20 61 20 66 69 6c 65 20 6f 72 20 70  d to a file or p
27c0: 69 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ipe..*/.static i
27d0: 6e 74 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65  nt stdin_is_inte
27e0: 72 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a 2f 2a  ractive = 1;../*
27f0: 0a 2a 2a 20 4f 6e 20 57 69 6e 64 6f 77 73 20 73  .** On Windows s
2800: 79 73 74 65 6d 73 20 77 65 20 68 61 76 65 20 74  ystems we have t
2810: 6f 20 6b 6e 6f 77 20 69 66 20 73 74 61 6e 64 61  o know if standa
2820: 72 64 20 6f 75 74 70 75 74 20 69 73 20 61 20 63  rd output is a c
2830: 6f 6e 73 6f 6c 65 0a 2a 2a 20 69 6e 20 6f 72 64  onsole.** in ord
2840: 65 72 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20  er to translate 
2850: 55 54 46 2d 38 20 69 6e 74 6f 20 4d 42 43 53 2e  UTF-8 into MBCS.
2860: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
2870: 76 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 74  variable is.** t
2880: 72 75 65 20 69 66 20 74 72 61 6e 73 6c 61 74 69  rue if translati
2890: 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  on is required..
28a0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74  */.static int st
28b0: 64 6f 75 74 5f 69 73 5f 63 6f 6e 73 6f 6c 65 20  dout_is_console 
28c0: 3d 20 31 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20  = 1;../*.** The 
28d0: 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 68 65  following is the
28e0: 20 6f 70 65 6e 20 53 51 4c 69 74 65 20 64 61 74   open SQLite dat
28f0: 61 62 61 73 65 2e 20 20 57 65 20 6d 61 6b 65 20  abase.  We make 
2900: 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20  a pointer.** to 
2910: 74 68 69 73 20 64 61 74 61 62 61 73 65 20 61 20  this database a 
2920: 73 74 61 74 69 63 20 76 61 72 69 61 62 6c 65 20  static variable 
2930: 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20 62  so that it can b
2940: 65 20 61 63 63 65 73 73 65 64 0a 2a 2a 20 62 79  e accessed.** by
2950: 20 74 68 65 20 53 49 47 49 4e 54 20 68 61 6e 64   the SIGINT hand
2960: 6c 65 72 20 74 6f 20 69 6e 74 65 72 72 75 70 74  ler to interrupt
2970: 20 64 61 74 61 62 61 73 65 20 70 72 6f 63 65 73   database proces
2980: 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  sing..*/.static 
2990: 73 71 6c 69 74 65 33 20 2a 67 6c 6f 62 61 6c 44  sqlite3 *globalD
29a0: 62 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72  b = 0;../*.** Tr
29b0: 75 65 20 69 66 20 61 6e 20 69 6e 74 65 72 72 75  ue if an interru
29c0: 70 74 20 28 43 6f 6e 74 72 6f 6c 2d 43 29 20 68  pt (Control-C) h
29d0: 61 73 20 62 65 65 6e 20 72 65 63 65 69 76 65 64  as been received
29e0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 6c 61  ..*/.static vola
29f0: 74 69 6c 65 20 69 6e 74 20 73 65 65 6e 49 6e 74  tile int seenInt
2a00: 65 72 72 75 70 74 20 3d 20 30 3b 0a 0a 2f 2a 0a  errupt = 0;../*.
2a10: 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 6e  ** This is the n
2a20: 61 6d 65 20 6f 66 20 6f 75 72 20 70 72 6f 67 72  ame of our progr
2a30: 61 6d 2e 20 49 74 20 69 73 20 73 65 74 20 69 6e  am. It is set in
2a40: 20 6d 61 69 6e 28 29 2c 20 75 73 65 64 0a 2a 2a   main(), used.**
2a50: 20 69 6e 20 61 20 6e 75 6d 62 65 72 20 6f 66 20   in a number of 
2a60: 6f 74 68 65 72 20 70 6c 61 63 65 73 2c 20 6d 6f  other places, mo
2a70: 73 74 6c 79 20 66 6f 72 20 65 72 72 6f 72 20 6d  stly for error m
2a80: 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74  essages..*/.stat
2a90: 69 63 20 63 68 61 72 20 2a 41 72 67 76 30 3b 0a  ic char *Argv0;.
2aa0: 0a 2f 2a 0a 2a 2a 20 50 72 6f 6d 70 74 20 73 74  ./*.** Prompt st
2ab0: 72 69 6e 67 73 2e 20 49 6e 69 74 69 61 6c 69 7a  rings. Initializ
2ac0: 65 64 20 69 6e 20 6d 61 69 6e 2e 20 53 65 74 74  ed in main. Sett
2ad0: 61 62 6c 65 20 77 69 74 68 0a 2a 2a 20 20 20 2e  able with.**   .
2ae0: 70 72 6f 6d 70 74 20 6d 61 69 6e 20 63 6f 6e 74  prompt main cont
2af0: 69 6e 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63  inue.*/.static c
2b00: 68 61 72 20 6d 61 69 6e 50 72 6f 6d 70 74 5b 32  har mainPrompt[2
2b10: 30 5d 3b 20 20 20 20 20 2f 2a 20 46 69 72 73 74  0];     /* First
2b20: 20 6c 69 6e 65 20 70 72 6f 6d 70 74 2e 20 64 65   line prompt. de
2b30: 66 61 75 6c 74 3a 20 22 73 71 6c 69 74 65 3e 20  fault: "sqlite> 
2b40: 22 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  "*/.static char 
2b50: 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 5b 32  continuePrompt[2
2b60: 30 5d 3b 20 2f 2a 20 43 6f 6e 74 69 6e 75 61 74  0]; /* Continuat
2b70: 69 6f 6e 20 70 72 6f 6d 70 74 2e 20 64 65 66 61  ion prompt. defa
2b80: 75 6c 74 3a 20 22 20 20 20 2e 2e 2e 3e 20 22 20  ult: "   ...> " 
2b90: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e 64 65 72  */../*.** Render
2ba0: 20 6f 75 74 70 75 74 20 6c 69 6b 65 20 66 70 72   output like fpr
2bb0: 69 6e 74 66 28 29 2e 20 20 45 78 63 65 70 74 2c  intf().  Except,
2bc0: 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20 69   if the output i
2bd0: 73 20 67 6f 69 6e 67 20 74 6f 20 74 68 65 0a 2a  s going to the.*
2be0: 2a 20 63 6f 6e 73 6f 6c 65 20 61 6e 64 20 69 66  * console and if
2bf0: 20 74 68 69 73 20 69 73 20 72 75 6e 6e 69 6e 67   this is running
2c00: 20 6f 6e 20 61 20 57 69 6e 64 6f 77 73 20 6d 61   on a Windows ma
2c10: 63 68 69 6e 65 2c 20 74 72 61 6e 73 6c 61 74 65  chine, translate
2c20: 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 66   the.** output f
2c30: 72 6f 6d 20 55 54 46 2d 38 20 69 6e 74 6f 20 4d  rom UTF-8 into M
2c40: 42 43 53 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  BCS..*/.#if defi
2c50: 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64  ned(_WIN32) || d
2c60: 65 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 76 6f  efined(WIN32).vo
2c70: 69 64 20 75 74 66 38 5f 70 72 69 6e 74 66 28 46  id utf8_printf(F
2c80: 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20  ILE *out, const 
2c90: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e  char *zFormat, .
2ca0: 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
2cb0: 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70  p;.  va_start(ap
2cc0: 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 69 66  , zFormat);.  if
2cd0: 28 20 73 74 64 6f 75 74 5f 69 73 5f 63 6f 6e 73  ( stdout_is_cons
2ce0: 6f 6c 65 20 26 26 20 28 6f 75 74 3d 3d 73 74 64  ole && (out==std
2cf0: 6f 75 74 20 7c 7c 20 6f 75 74 3d 3d 73 74 64 65  out || out==stde
2d00: 72 72 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20  rr) ){.    char 
2d10: 2a 7a 31 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d  *z1 = sqlite3_vm
2d20: 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20  printf(zFormat, 
2d30: 61 70 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ap);.    char *z
2d40: 32 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33  2 = sqlite3_win3
2d50: 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 5f 76  2_utf8_to_mbcs_v
2d60: 32 28 7a 31 2c 20 30 29 3b 0a 20 20 20 20 73 71  2(z1, 0);.    sq
2d70: 6c 69 74 65 33 5f 66 72 65 65 28 7a 31 29 3b 0a  lite3_free(z1);.
2d80: 20 20 20 20 66 70 75 74 73 28 7a 32 2c 20 6f 75      fputs(z2, ou
2d90: 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
2da0: 66 72 65 65 28 7a 32 29 3b 0a 20 20 7d 65 6c 73  free(z2);.  }els
2db0: 65 7b 0a 20 20 20 20 76 66 70 72 69 6e 74 66 28  e{.    vfprintf(
2dc0: 6f 75 74 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70  out, zFormat, ap
2dd0: 29 3b 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28  );.  }.  va_end(
2de0: 61 70 29 3b 0a 7d 0a 23 65 6c 69 66 20 21 64 65  ap);.}.#elif !de
2df0: 66 69 6e 65 64 28 75 74 66 38 5f 70 72 69 6e 74  fined(utf8_print
2e00: 66 29 0a 23 20 64 65 66 69 6e 65 20 75 74 66 38  f).# define utf8
2e10: 5f 70 72 69 6e 74 66 20 66 70 72 69 6e 74 66 0a  _printf fprintf.
2e20: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65  #endif../*.** Re
2e30: 6e 64 65 72 20 6f 75 74 70 75 74 20 6c 69 6b 65  nder output like
2e40: 20 66 70 72 69 6e 74 66 28 29 2e 20 20 54 68 69   fprintf().  Thi
2e50: 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20  s should not be 
2e60: 75 73 65 64 20 6f 6e 20 61 6e 79 74 68 69 6e 67  used on anything
2e70: 20 74 68 61 74 0a 2a 2a 20 69 6e 63 6c 75 64 65   that.** include
2e80: 73 20 73 74 72 69 6e 67 20 66 6f 72 6d 61 74 74  s string formatt
2e90: 69 6e 67 20 28 65 2e 67 2e 20 22 25 73 22 29 2e  ing (e.g. "%s").
2ea0: 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64  .*/.#if !defined
2eb0: 28 72 61 77 5f 70 72 69 6e 74 66 29 0a 23 20 64  (raw_printf).# d
2ec0: 65 66 69 6e 65 20 72 61 77 5f 70 72 69 6e 74 66  efine raw_printf
2ed0: 20 66 70 72 69 6e 74 66 0a 23 65 6e 64 69 66 0a   fprintf.#endif.
2ee0: 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 49 2f 4f  ./*.** Write I/O
2ef0: 20 74 72 61 63 65 73 20 74 6f 20 74 68 65 20 66   traces to the f
2f00: 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 65 61 6d 2e  ollowing stream.
2f10: 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54  .*/.#ifdef SQLIT
2f20: 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
2f30: 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a 69 6f  .static FILE *io
2f40: 74 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69  trace = 0;.#endi
2f50: 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  f../*.** This ro
2f60: 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65  utine works like
2f70: 20 70 72 69 6e 74 66 20 69 6e 20 74 68 61 74 20   printf in that 
2f80: 69 74 73 20 66 69 72 73 74 20 61 72 67 75 6d 65  its first argume
2f90: 6e 74 20 69 73 20 61 0a 2a 2a 20 66 6f 72 6d 61  nt is a.** forma
2fa0: 74 20 73 74 72 69 6e 67 20 61 6e 64 20 73 75 62  t string and sub
2fb0: 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74  sequent argument
2fc0: 73 20 61 72 65 20 76 61 6c 75 65 73 20 74 6f 20  s are values to 
2fd0: 62 65 20 73 75 62 73 74 69 74 75 74 65 64 0a 2a  be substituted.*
2fe0: 2a 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 25 20  * in place of % 
2ff0: 66 69 65 6c 64 73 2e 20 20 54 68 65 20 72 65 73  fields.  The res
3000: 75 6c 74 20 6f 66 20 66 6f 72 6d 61 74 74 69 6e  ult of formattin
3010: 67 20 74 68 69 73 20 73 74 72 69 6e 67 0a 2a 2a  g this string.**
3020: 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20 69   is written to i
3030: 6f 74 72 61 63 65 2e 0a 2a 2f 0a 23 69 66 64 65  otrace..*/.#ifde
3040: 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
3050: 49 4f 54 52 41 43 45 0a 73 74 61 74 69 63 20 76  IOTRACE.static v
3060: 6f 69 64 20 53 51 4c 49 54 45 5f 43 44 45 43 4c  oid SQLITE_CDECL
3070: 20 69 6f 74 72 61 63 65 50 72 69 6e 74 66 28 63   iotracePrintf(c
3080: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d  onst char *zForm
3090: 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c  at, ...){.  va_l
30a0: 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a  ist ap;.  char *
30b0: 7a 3b 0a 20 20 69 66 28 20 69 6f 74 72 61 63 65  z;.  if( iotrace
30c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
30d0: 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f  va_start(ap, zFo
30e0: 72 6d 61 74 29 3b 0a 20 20 7a 20 3d 20 73 71 6c  rmat);.  z = sql
30f0: 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46  ite3_vmprintf(zF
3100: 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61  ormat, ap);.  va
3110: 5f 65 6e 64 28 61 70 29 3b 0a 20 20 75 74 66 38  _end(ap);.  utf8
3120: 5f 70 72 69 6e 74 66 28 69 6f 74 72 61 63 65 2c  _printf(iotrace,
3130: 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 73 71 6c   "%s", z);.  sql
3140: 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 7d 0a  ite3_free(z);.}.
3150: 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 75  #endif../*.** Ou
3160: 74 70 75 74 20 73 74 72 69 6e 67 20 7a 55 74 66  tput string zUtf
3170: 20 74 6f 20 73 74 72 65 61 6d 20 70 4f 75 74 20   to stream pOut 
3180: 61 73 20 77 20 63 68 61 72 61 63 74 65 72 73 2e  as w characters.
3190: 20 20 49 66 20 77 20 69 73 20 6e 65 67 61 74 69    If w is negati
31a0: 76 65 2c 0a 2a 2a 20 74 68 65 6e 20 72 69 67 68  ve,.** then righ
31b0: 74 2d 6a 75 73 74 69 66 79 20 74 68 65 20 74 65  t-justify the te
31c0: 78 74 2e 20 20 57 20 69 73 20 74 68 65 20 77 69  xt.  W is the wi
31d0: 64 74 68 20 69 6e 20 55 54 46 2d 38 20 63 68 61  dth in UTF-8 cha
31e0: 72 61 63 74 65 72 73 2c 20 6e 6f 74 0a 2a 2a 20  racters, not.** 
31f0: 69 6e 20 62 79 74 65 73 2e 20 20 54 68 69 73 20  in bytes.  This 
3200: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  is different fro
3210: 6d 20 74 68 65 20 25 2a 2e 2a 73 20 73 70 65 63  m the %*.*s spec
3220: 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 70 72 69  ification in pri
3230: 6e 74 66 0a 2a 2a 20 73 69 6e 63 65 20 77 69 74  ntf.** since wit
3240: 68 20 25 2a 2e 2a 73 20 74 68 65 20 77 69 64 74  h %*.*s the widt
3250: 68 20 69 73 20 6d 65 61 73 75 72 65 64 20 69 6e  h is measured in
3260: 20 62 79 74 65 73 2c 20 6e 6f 74 20 63 68 61 72   bytes, not char
3270: 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  acters..*/.stati
3280: 63 20 76 6f 69 64 20 75 74 66 38 5f 77 69 64 74  c void utf8_widt
3290: 68 5f 70 72 69 6e 74 28 46 49 4c 45 20 2a 70 4f  h_print(FILE *pO
32a0: 75 74 2c 20 69 6e 74 20 77 2c 20 63 6f 6e 73 74  ut, int w, const
32b0: 20 63 68 61 72 20 2a 7a 55 74 66 29 7b 0a 20 20   char *zUtf){.  
32c0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 3b 0a  int i;.  int n;.
32d0: 20 20 69 6e 74 20 61 77 20 3d 20 77 3c 30 20 3f    int aw = w<0 ?
32e0: 20 2d 77 20 3a 20 77 3b 0a 20 20 63 68 61 72 20   -w : w;.  char 
32f0: 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20 69 66  zBuf[1000];.  if
3300: 28 20 61 77 3e 28 69 6e 74 29 73 69 7a 65 6f 66  ( aw>(int)sizeof
3310: 28 7a 42 75 66 29 2f 33 20 29 20 61 77 20 3d 20  (zBuf)/3 ) aw = 
3320: 28 69 6e 74 29 73 69 7a 65 6f 66 28 7a 42 75 66  (int)sizeof(zBuf
3330: 29 2f 33 3b 0a 20 20 66 6f 72 28 69 3d 6e 3d 30  )/3;.  for(i=n=0
3340: 3b 20 7a 55 74 66 5b 69 5d 3b 20 69 2b 2b 29 7b  ; zUtf[i]; i++){
3350: 0a 20 20 20 20 69 66 28 20 28 7a 55 74 66 5b 69  .    if( (zUtf[i
3360: 5d 26 30 78 63 30 29 21 3d 30 78 38 30 20 29 7b  ]&0xc0)!=0x80 ){
3370: 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20  .      n++;.    
3380: 20 20 69 66 28 20 6e 3d 3d 61 77 20 29 7b 0a 20    if( n==aw ){. 
3390: 20 20 20 20 20 20 20 64 6f 7b 20 69 2b 2b 3b 20         do{ i++; 
33a0: 7d 77 68 69 6c 65 28 20 28 7a 55 74 66 5b 69 5d  }while( (zUtf[i]
33b0: 26 30 78 63 30 29 3d 3d 30 78 38 30 20 29 3b 0a  &0xc0)==0x80 );.
33c0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
33d0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
33e0: 0a 20 20 69 66 28 20 6e 3e 3d 61 77 20 29 7b 0a  .  if( n>=aw ){.
33f0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
3400: 70 4f 75 74 2c 20 22 25 2e 2a 73 22 2c 20 69 2c  pOut, "%.*s", i,
3410: 20 7a 55 74 66 29 3b 0a 20 20 7d 65 6c 73 65 20   zUtf);.  }else 
3420: 69 66 28 20 77 3c 30 20 29 7b 0a 20 20 20 20 75  if( w<0 ){.    u
3430: 74 66 38 5f 70 72 69 6e 74 66 28 70 4f 75 74 2c  tf8_printf(pOut,
3440: 20 22 25 2a 73 25 73 22 2c 20 61 77 2d 6e 2c 20   "%*s%s", aw-n, 
3450: 22 22 2c 20 7a 55 74 66 29 3b 0a 20 20 7d 65 6c  "", zUtf);.  }el
3460: 73 65 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69  se{.    utf8_pri
3470: 6e 74 66 28 70 4f 75 74 2c 20 22 25 73 25 2a 73  ntf(pOut, "%s%*s
3480: 22 2c 20 7a 55 74 66 2c 20 61 77 2d 6e 2c 20 22  ", zUtf, aw-n, "
3490: 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a  ");.  }.}.../*.*
34a0: 2a 20 44 65 74 65 72 6d 69 6e 65 73 20 69 66 20  * Determines if 
34b0: 61 20 73 74 72 69 6e 67 20 69 73 20 61 20 6e 75  a string is a nu
34c0: 6d 62 65 72 20 6f 66 20 6e 6f 74 2e 0a 2a 2f 0a  mber of not..*/.
34d0: 73 74 61 74 69 63 20 69 6e 74 20 69 73 4e 75 6d  static int isNum
34e0: 62 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ber(const char *
34f0: 7a 2c 20 69 6e 74 20 2a 72 65 61 6c 6e 75 6d 29  z, int *realnum)
3500: 7b 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2d 27 20  {.  if( *z=='-' 
3510: 7c 7c 20 2a 7a 3d 3d 27 2b 27 20 29 20 7a 2b 2b  || *z=='+' ) z++
3520: 3b 0a 20 20 69 66 28 20 21 49 73 44 69 67 69 74  ;.  if( !IsDigit
3530: 28 2a 7a 29 20 29 7b 0a 20 20 20 20 72 65 74 75  (*z) ){.    retu
3540: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 2b 2b 3b  rn 0;.  }.  z++;
3550: 0a 20 20 69 66 28 20 72 65 61 6c 6e 75 6d 20 29  .  if( realnum )
3560: 20 2a 72 65 61 6c 6e 75 6d 20 3d 20 30 3b 0a 20   *realnum = 0;. 
3570: 20 77 68 69 6c 65 28 20 49 73 44 69 67 69 74 28   while( IsDigit(
3580: 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20  *z) ){ z++; }.  
3590: 69 66 28 20 2a 7a 3d 3d 27 2e 27 20 29 7b 0a 20  if( *z=='.' ){. 
35a0: 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20     z++;.    if( 
35b0: 21 49 73 44 69 67 69 74 28 2a 7a 29 20 29 20 72  !IsDigit(*z) ) r
35c0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69  eturn 0;.    whi
35d0: 6c 65 28 20 49 73 44 69 67 69 74 28 2a 7a 29 20  le( IsDigit(*z) 
35e0: 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69 66  ){ z++; }.    if
35f0: 28 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61  ( realnum ) *rea
3600: 6c 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20  lnum = 1;.  }.  
3610: 69 66 28 20 2a 7a 3d 3d 27 65 27 20 7c 7c 20 2a  if( *z=='e' || *
3620: 7a 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20 7a 2b  z=='E' ){.    z+
3630: 2b 3b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27  +;.    if( *z=='
3640: 2b 27 20 7c 7c 20 2a 7a 3d 3d 27 2d 27 20 29 20  +' || *z=='-' ) 
3650: 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 21 49 73  z++;.    if( !Is
3660: 44 69 67 69 74 28 2a 7a 29 20 29 20 72 65 74 75  Digit(*z) ) retu
3670: 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28  rn 0;.    while(
3680: 20 49 73 44 69 67 69 74 28 2a 7a 29 20 29 7b 20   IsDigit(*z) ){ 
3690: 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 72  z++; }.    if( r
36a0: 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c 6e 75  ealnum ) *realnu
36b0: 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74  m = 1;.  }.  ret
36c0: 75 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a 2f 2a  urn *z==0;.}../*
36d0: 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74  .** Compute a st
36e0: 72 69 6e 67 20 6c 65 6e 67 74 68 20 74 68 61 74  ring length that
36f0: 20 69 73 20 6c 69 6d 69 74 65 64 20 74 6f 20 77   is limited to w
3700: 68 61 74 20 63 61 6e 20 62 65 20 73 74 6f 72 65  hat can be store
3710: 64 20 69 6e 0a 2a 2a 20 6c 6f 77 65 72 20 33 30  d in.** lower 30
3720: 20 62 69 74 73 20 6f 66 20 61 20 33 32 2d 62 69   bits of a 32-bi
3730: 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72  t signed integer
3740: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
3750: 73 74 72 6c 65 6e 33 30 28 63 6f 6e 73 74 20 63  strlen30(const c
3760: 68 61 72 20 2a 7a 29 7b 0a 20 20 63 6f 6e 73 74  har *z){.  const
3770: 20 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b 0a 20   char *z2 = z;. 
3780: 20 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b 20 7a   while( *z2 ){ z
3790: 32 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20  2++; }.  return 
37a0: 30 78 33 66 66 66 66 66 66 66 20 26 20 28 69 6e  0x3fffffff & (in
37b0: 74 29 28 7a 32 20 2d 20 7a 29 3b 0a 7d 0a 0a 2f  t)(z2 - z);.}../
37c0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
37d0: 6c 65 6e 67 74 68 20 6f 66 20 61 20 73 74 72 69  length of a stri
37e0: 6e 67 20 69 6e 20 63 68 61 72 61 63 74 65 72 73  ng in characters
37f0: 2e 20 20 4d 75 6c 74 69 62 79 74 65 20 55 54 46  .  Multibyte UTF
3800: 38 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a 20  8 characters.** 
3810: 63 6f 75 6e 74 20 61 73 20 61 20 73 69 6e 67 6c  count as a singl
3820: 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a  e character..*/.
3830: 73 74 61 74 69 63 20 69 6e 74 20 73 74 72 6c 65  static int strle
3840: 6e 43 68 61 72 28 63 6f 6e 73 74 20 63 68 61 72  nChar(const char
3850: 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20   *z){.  int n = 
3860: 30 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20 29  0;.  while( *z )
3870: 7b 0a 20 20 20 20 69 66 28 20 28 30 78 63 30 26  {.    if( (0xc0&
3880: 2a 28 7a 2b 2b 29 29 21 3d 30 78 38 30 20 29 20  *(z++))!=0x80 ) 
3890: 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n++;.  }.  retur
38a0: 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  n n;.}../*.** Th
38b0: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61 64 73  is routine reads
38c0: 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 20   a line of text 
38d0: 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73 74  from FILE in, st
38e0: 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74 65 78 74  ores.** the text
38f0: 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69   in memory obtai
3900: 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28  ned from malloc(
3910: 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20  ) and returns a 
3920: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
3930: 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69 73  e text.  NULL is
3940: 20 72 65 74 75 72 6e 65 64 20 61 74 20 65 6e 64   returned at end
3950: 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69 66 20   of file, or if 
3960: 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69 6c  malloc().** fail
3970: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4c 69 6e  s..**.** If zLin
3980: 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68  e is not NULL th
3990: 65 6e 20 69 74 20 69 73 20 61 20 6d 61 6c 6c 6f  en it is a mallo
39a0: 63 65 64 20 62 75 66 66 65 72 20 72 65 74 75 72  ced buffer retur
39b0: 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72  ned from.** a pr
39c0: 65 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20 74  evious call to t
39d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 74 68 61 74  his routine that
39e0: 20 6d 61 79 20 62 65 20 72 65 75 73 65 64 2e 0a   may be reused..
39f0: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
3a00: 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63 68  local_getline(ch
3a10: 61 72 20 2a 7a 4c 69 6e 65 2c 20 46 49 4c 45 20  ar *zLine, FILE 
3a20: 2a 69 6e 29 7b 0a 20 20 69 6e 74 20 6e 4c 69 6e  *in){.  int nLin
3a30: 65 20 3d 20 7a 4c 69 6e 65 3d 3d 30 20 3f 20 30  e = zLine==0 ? 0
3a40: 20 3a 20 31 30 30 3b 0a 20 20 69 6e 74 20 6e 20   : 100;.  int n 
3a50: 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31  = 0;..  while( 1
3a60: 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 2b 31 30   ){.    if( n+10
3a70: 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20  0>nLine ){.     
3a80: 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65 2a 32   nLine = nLine*2
3a90: 20 2b 20 31 30 30 3b 0a 20 20 20 20 20 20 7a 4c   + 100;.      zL
3aa0: 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 7a 4c  ine = realloc(zL
3ab0: 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20 20  ine, nLine);.   
3ac0: 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20     if( zLine==0 
3ad0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
3ae0: 7d 0a 20 20 20 20 69 66 28 20 66 67 65 74 73 28  }.    if( fgets(
3af0: 26 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65  &zLine[n], nLine
3b00: 20 2d 20 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a   - n, in)==0 ){.
3b10: 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29        if( n==0 )
3b20: 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 28 7a  {.        free(z
3b30: 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 72  Line);.        r
3b40: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
3b50: 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20  .      zLine[n] 
3b60: 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 0;.      break
3b70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
3b80: 65 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29 20 6e 2b  e( zLine[n] ) n+
3b90: 2b 3b 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26  +;.    if( n>0 &
3ba0: 26 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c  & zLine[n-1]=='\
3bb0: 6e 27 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b  n' ){.      n--;
3bc0: 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 30 20 26  .      if( n>0 &
3bd0: 26 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c  & zLine[n-1]=='\
3be0: 72 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20  r' ) n--;.      
3bf0: 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20  zLine[n] = 0;.  
3c00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3c10: 0a 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64  .  }.#if defined
3c20: 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69  (_WIN32) || defi
3c30: 6e 65 64 28 57 49 4e 33 32 29 0a 20 20 2f 2a 20  ned(WIN32).  /* 
3c40: 46 6f 72 20 69 6e 74 65 72 61 63 74 69 76 65 20  For interactive 
3c50: 69 6e 70 75 74 20 6f 6e 20 57 69 6e 64 6f 77 73  input on Windows
3c60: 20 73 79 73 74 65 6d 73 2c 20 74 72 61 6e 73 6c   systems, transl
3c70: 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 6d 75 6c  ate the.  ** mul
3c80: 74 69 2d 62 79 74 65 20 63 68 61 72 61 63 74 65  ti-byte characte
3c90: 72 73 65 74 20 63 68 61 72 61 63 74 65 72 73 20  rset characters 
3ca0: 69 6e 74 6f 20 55 54 46 2d 38 2e 20 2a 2f 0a 20  into UTF-8. */. 
3cb0: 20 69 66 28 20 73 74 64 69 6e 5f 69 73 5f 69 6e   if( stdin_is_in
3cc0: 74 65 72 61 63 74 69 76 65 20 26 26 20 69 6e 3d  teractive && in=
3cd0: 3d 73 74 64 69 6e 20 29 7b 0a 20 20 20 20 63 68  =stdin ){.    ch
3ce0: 61 72 20 2a 7a 54 72 61 6e 73 20 3d 20 73 71 6c  ar *zTrans = sql
3cf0: 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f  ite3_win32_mbcs_
3d00: 74 6f 5f 75 74 66 38 5f 76 32 28 7a 4c 69 6e 65  to_utf8_v2(zLine
3d10: 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 54  , 0);.    if( zT
3d20: 72 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 69 6e  rans ){.      in
3d30: 74 20 6e 54 72 61 6e 73 20 3d 20 73 74 72 6c 65  t nTrans = strle
3d40: 6e 33 30 28 7a 54 72 61 6e 73 29 2b 31 3b 0a 20  n30(zTrans)+1;. 
3d50: 20 20 20 20 20 69 66 28 20 6e 54 72 61 6e 73 3e       if( nTrans>
3d60: 6e 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20  nLine ){.       
3d70: 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63   zLine = realloc
3d80: 28 7a 4c 69 6e 65 2c 20 6e 54 72 61 6e 73 29 3b  (zLine, nTrans);
3d90: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4c 69  .        if( zLi
3da0: 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ne==0 ){.       
3db0: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
3dc0: 7a 54 72 61 6e 73 29 3b 0a 20 20 20 20 20 20 20  zTrans);.       
3dd0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
3de0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
3df0: 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 4c 69 6e       memcpy(zLin
3e00: 65 2c 20 7a 54 72 61 6e 73 2c 20 6e 54 72 61 6e  e, zTrans, nTran
3e10: 73 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  s);.      sqlite
3e20: 33 5f 66 72 65 65 28 7a 54 72 61 6e 73 29 3b 0a  3_free(zTrans);.
3e30: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
3e40: 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 57 49 4e   /* defined(_WIN
3e50: 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57  32) || defined(W
3e60: 49 4e 33 32 29 20 2a 2f 0a 20 20 72 65 74 75 72  IN32) */.  retur
3e70: 6e 20 7a 4c 69 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  n zLine;.}../*.*
3e80: 2a 20 52 65 74 72 69 65 76 65 20 61 20 73 69 6e  * Retrieve a sin
3e90: 67 6c 65 20 6c 69 6e 65 20 6f 66 20 69 6e 70 75  gle line of inpu
3ea0: 74 20 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  t text..**.** If
3eb0: 20 69 6e 3d 3d 30 20 74 68 65 6e 20 72 65 61 64   in==0 then read
3ec0: 20 66 72 6f 6d 20 73 74 61 6e 64 61 72 64 20 69   from standard i
3ed0: 6e 70 75 74 20 61 6e 64 20 70 72 6f 6d 70 74 20  nput and prompt 
3ee0: 62 65 66 6f 72 65 20 65 61 63 68 20 6c 69 6e 65  before each line
3ef0: 2e 0a 2a 2a 20 49 66 20 69 73 43 6f 6e 74 69 6e  ..** If isContin
3f00: 75 61 74 69 6f 6e 20 69 73 20 74 72 75 65 2c 20  uation is true, 
3f10: 74 68 65 6e 20 61 20 63 6f 6e 74 69 6e 75 61 74  then a continuat
3f20: 69 6f 6e 20 70 72 6f 6d 70 74 20 69 73 20 61 70  ion prompt is ap
3f30: 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2a 20 49 66  propriate..** If
3f40: 20 69 73 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 20   isContinuation 
3f50: 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68  is zero, then th
3f60: 65 20 6d 61 69 6e 20 70 72 6f 6d 70 74 20 73 68  e main prompt sh
3f70: 6f 75 6c 64 20 62 65 20 75 73 65 64 2e 0a 2a 2a  ould be used..**
3f80: 0a 2a 2a 20 49 66 20 7a 50 72 69 6f 72 20 69 73  .** If zPrior is
3f90: 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69   not NULL then i
3fa0: 74 20 69 73 20 61 20 62 75 66 66 65 72 20 66 72  t is a buffer fr
3fb0: 6f 6d 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20  om a prior call 
3fc0: 74 6f 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  to this.** routi
3fd0: 6e 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 72  ne that can be r
3fe0: 65 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  eused..**.** The
3ff0: 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65   result is store
4000: 64 20 69 6e 20 73 70 61 63 65 20 6f 62 74 61 69  d in space obtai
4010: 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28  ned from malloc(
4020: 29 20 61 6e 64 20 6d 75 73 74 20 65 69 74 68 65  ) and must eithe
4030: 72 0a 2a 2a 20 62 65 20 66 72 65 65 64 20 62 79  r.** be freed by
4040: 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 72 20 65   the caller or e
4050: 6c 73 65 20 70 61 73 73 65 64 20 62 61 63 6b 20  lse passed back 
4060: 69 6e 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e  into this routin
4070: 65 20 76 69 61 20 74 68 65 0a 2a 2a 20 7a 50 72  e via the.** zPr
4080: 69 6f 72 20 61 72 67 75 6d 65 6e 74 20 66 6f 72  ior argument for
4090: 20 72 65 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69   reuse..*/.stati
40a0: 63 20 63 68 61 72 20 2a 6f 6e 65 5f 69 6e 70 75  c char *one_inpu
40b0: 74 5f 6c 69 6e 65 28 46 49 4c 45 20 2a 69 6e 2c  t_line(FILE *in,
40c0: 20 63 68 61 72 20 2a 7a 50 72 69 6f 72 2c 20 69   char *zPrior, i
40d0: 6e 74 20 69 73 43 6f 6e 74 69 6e 75 61 74 69 6f  nt isContinuatio
40e0: 6e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f  n){.  char *zPro
40f0: 6d 70 74 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65  mpt;.  char *zRe
4100: 73 75 6c 74 3b 0a 20 20 69 66 28 20 69 6e 21 3d  sult;.  if( in!=
4110: 30 20 29 7b 0a 20 20 20 20 7a 52 65 73 75 6c 74  0 ){.    zResult
4120: 20 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65   = local_getline
4130: 28 7a 50 72 69 6f 72 2c 20 69 6e 29 3b 0a 20 20  (zPrior, in);.  
4140: 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 50 72 6f 6d  }else{.    zProm
4150: 70 74 20 3d 20 69 73 43 6f 6e 74 69 6e 75 61 74  pt = isContinuat
4160: 69 6f 6e 20 3f 20 63 6f 6e 74 69 6e 75 65 50 72  ion ? continuePr
4170: 6f 6d 70 74 20 3a 20 6d 61 69 6e 50 72 6f 6d 70  ompt : mainPromp
4180: 74 3b 0a 23 69 66 20 53 48 45 4c 4c 5f 55 53 45  t;.#if SHELL_USE
4190: 5f 4c 4f 43 41 4c 5f 47 45 54 4c 49 4e 45 0a 20  _LOCAL_GETLINE. 
41a0: 20 20 20 70 72 69 6e 74 66 28 22 25 73 22 2c 20     printf("%s", 
41b0: 7a 50 72 6f 6d 70 74 29 3b 0a 20 20 20 20 66 66  zPrompt);.    ff
41c0: 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20  lush(stdout);.  
41d0: 20 20 7a 52 65 73 75 6c 74 20 3d 20 6c 6f 63 61    zResult = loca
41e0: 6c 5f 67 65 74 6c 69 6e 65 28 7a 50 72 69 6f 72  l_getline(zPrior
41f0: 2c 20 73 74 64 69 6e 29 3b 0a 23 65 6c 73 65 0a  , stdin);.#else.
4200: 20 20 20 20 66 72 65 65 28 7a 50 72 69 6f 72 29      free(zPrior)
4210: 3b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20 3d 20  ;.    zResult = 
4220: 73 68 65 6c 6c 5f 72 65 61 64 6c 69 6e 65 28 7a  shell_readline(z
4230: 50 72 6f 6d 70 74 29 3b 0a 20 20 20 20 69 66 28  Prompt);.    if(
4240: 20 7a 52 65 73 75 6c 74 20 26 26 20 2a 7a 52 65   zResult && *zRe
4250: 73 75 6c 74 20 29 20 73 68 65 6c 6c 5f 61 64 64  sult ) shell_add
4260: 5f 68 69 73 74 6f 72 79 28 7a 52 65 73 75 6c 74  _history(zResult
4270: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20  );.#endif.  }.  
4280: 72 65 74 75 72 6e 20 7a 52 65 73 75 6c 74 3b 0a  return zResult;.
4290: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  }.../*.** Return
42a0: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61 20   the value of a 
42b0: 68 65 78 61 64 65 63 69 6d 61 6c 20 64 69 67 69  hexadecimal digi
42c0: 74 2e 20 20 52 65 74 75 72 6e 20 2d 31 20 69 66  t.  Return -1 if
42d0: 20 74 68 65 20 69 6e 70 75 74 0a 2a 2a 20 69 73   the input.** is
42e0: 20 6e 6f 74 20 61 20 68 65 78 20 64 69 67 69 74   not a hex digit
42f0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
4300: 68 65 78 44 69 67 69 74 56 61 6c 75 65 28 63 68  hexDigitValue(ch
4310: 61 72 20 63 29 7b 0a 20 20 69 66 28 20 63 3e 3d  ar c){.  if( c>=
4320: 27 30 27 20 26 26 20 63 3c 3d 27 39 27 20 29 20  '0' && c<='9' ) 
4330: 72 65 74 75 72 6e 20 63 20 2d 20 27 30 27 3b 0a  return c - '0';.
4340: 20 20 69 66 28 20 63 3e 3d 27 61 27 20 26 26 20    if( c>='a' && 
4350: 63 3c 3d 27 66 27 20 29 20 72 65 74 75 72 6e 20  c<='f' ) return 
4360: 63 20 2d 20 27 61 27 20 2b 20 31 30 3b 0a 20 20  c - 'a' + 10;.  
4370: 69 66 28 20 63 3e 3d 27 41 27 20 26 26 20 63 3c  if( c>='A' && c<
4380: 3d 27 46 27 20 29 20 72 65 74 75 72 6e 20 63 20  ='F' ) return c 
4390: 2d 20 27 41 27 20 2b 20 31 30 3b 0a 20 20 72 65  - 'A' + 10;.  re
43a0: 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn -1;.}../*.*
43b0: 2a 20 49 6e 74 65 72 70 72 65 74 20 7a 41 72 67  * Interpret zArg
43c0: 20 61 73 20 61 6e 20 69 6e 74 65 67 65 72 20 76   as an integer v
43d0: 61 6c 75 65 2c 20 70 6f 73 73 69 62 6c 79 20 77  alue, possibly w
43e0: 69 74 68 20 73 75 66 66 69 78 65 73 2e 0a 2a 2f  ith suffixes..*/
43f0: 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
4400: 69 6e 74 36 34 20 69 6e 74 65 67 65 72 56 61 6c  int64 integerVal
4410: 75 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ue(const char *z
4420: 41 72 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f  Arg){.  sqlite3_
4430: 69 6e 74 36 34 20 76 20 3d 20 30 3b 0a 20 20 73  int64 v = 0;.  s
4440: 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
4450: 63 74 20 7b 20 63 68 61 72 20 2a 7a 53 75 66 66  ct { char *zSuff
4460: 69 78 3b 20 69 6e 74 20 69 4d 75 6c 74 3b 20 7d  ix; int iMult; }
4470: 20 61 4d 75 6c 74 5b 5d 20 3d 20 7b 0a 20 20 20   aMult[] = {.   
4480: 20 7b 20 22 4b 69 42 22 2c 20 31 30 32 34 20 7d   { "KiB", 1024 }
4490: 2c 0a 20 20 20 20 7b 20 22 4d 69 42 22 2c 20 31  ,.    { "MiB", 1
44a0: 30 32 34 2a 31 30 32 34 20 7d 2c 0a 20 20 20 20  024*1024 },.    
44b0: 7b 20 22 47 69 42 22 2c 20 31 30 32 34 2a 31 30  { "GiB", 1024*10
44c0: 32 34 2a 31 30 32 34 20 7d 2c 0a 20 20 20 20 7b  24*1024 },.    {
44d0: 20 22 4b 42 22 2c 20 20 31 30 30 30 20 7d 2c 0a   "KB",  1000 },.
44e0: 20 20 20 20 7b 20 22 4d 42 22 2c 20 20 31 30 30      { "MB",  100
44f0: 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 47  0000 },.    { "G
4500: 42 22 2c 20 20 31 30 30 30 30 30 30 30 30 30 20  B",  1000000000 
4510: 7d 2c 0a 20 20 20 20 7b 20 22 4b 22 2c 20 20 20  },.    { "K",   
4520: 31 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 4d  1000 },.    { "M
4530: 22 2c 20 20 20 31 30 30 30 30 30 30 20 7d 2c 0a  ",   1000000 },.
4540: 20 20 20 20 7b 20 22 47 22 2c 20 20 20 31 30 30      { "G",   100
4550: 30 30 30 30 30 30 30 20 7d 2c 0a 20 20 7d 3b 0a  0000000 },.  };.
4560: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69    int i;.  int i
4570: 73 4e 65 67 20 3d 20 30 3b 0a 20 20 69 66 28 20  sNeg = 0;.  if( 
4580: 7a 41 72 67 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a  zArg[0]=='-' ){.
4590: 20 20 20 20 69 73 4e 65 67 20 3d 20 31 3b 0a 20      isNeg = 1;. 
45a0: 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 7d 65 6c     zArg++;.  }el
45b0: 73 65 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d  se if( zArg[0]==
45c0: 27 2b 27 20 29 7b 0a 20 20 20 20 7a 41 72 67 2b  '+' ){.    zArg+
45d0: 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a 41 72  +;.  }.  if( zAr
45e0: 67 5b 30 5d 3d 3d 27 30 27 20 26 26 20 7a 41 72  g[0]=='0' && zAr
45f0: 67 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a 20 20 20  g[1]=='x' ){.   
4600: 20 69 6e 74 20 78 3b 0a 20 20 20 20 7a 41 72 67   int x;.    zArg
4610: 20 2b 3d 20 32 3b 0a 20 20 20 20 77 68 69 6c 65   += 2;.    while
4620: 28 20 28 78 20 3d 20 68 65 78 44 69 67 69 74 56  ( (x = hexDigitV
4630: 61 6c 75 65 28 7a 41 72 67 5b 30 5d 29 29 3e 3d  alue(zArg[0]))>=
4640: 30 20 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 28  0 ){.      v = (
4650: 76 3c 3c 34 29 20 2b 20 78 3b 0a 20 20 20 20 20  v<<4) + x;.     
4660: 20 7a 41 72 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20   zArg++;.    }. 
4670: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77 68 69 6c   }else{.    whil
4680: 65 28 20 49 73 44 69 67 69 74 28 7a 41 72 67 5b  e( IsDigit(zArg[
4690: 30 5d 29 20 29 7b 0a 20 20 20 20 20 20 76 20 3d  0]) ){.      v =
46a0: 20 76 2a 31 30 20 2b 20 7a 41 72 67 5b 30 5d 20   v*10 + zArg[0] 
46b0: 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 7a 41 72  - '0';.      zAr
46c0: 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  g++;.    }.  }. 
46d0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
46e0: 79 53 69 7a 65 28 61 4d 75 6c 74 29 3b 20 69 2b  ySize(aMult); i+
46f0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  +){.    if( sqli
4700: 74 65 33 5f 73 74 72 69 63 6d 70 28 61 4d 75 6c  te3_stricmp(aMul
4710: 74 5b 69 5d 2e 7a 53 75 66 66 69 78 2c 20 7a 41  t[i].zSuffix, zA
4720: 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  rg)==0 ){.      
4730: 76 20 2a 3d 20 61 4d 75 6c 74 5b 69 5d 2e 69 4d  v *= aMult[i].iM
4740: 75 6c 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ult;.      break
4750: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
4760: 74 75 72 6e 20 69 73 4e 65 67 3f 20 2d 76 20 3a  turn isNeg? -v :
4770: 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 76   v;.}../*.** A v
4780: 61 72 69 61 62 6c 65 20 6c 65 6e 67 74 68 20 73  ariable length s
4790: 74 72 69 6e 67 20 74 6f 20 77 68 69 63 68 20 6f  tring to which o
47a0: 6e 65 20 63 61 6e 20 61 70 70 65 6e 64 20 74 65  ne can append te
47b0: 78 74 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  xt..*/.typedef s
47c0: 74 72 75 63 74 20 53 68 65 6c 6c 54 65 78 74 20  truct ShellText 
47d0: 53 68 65 6c 6c 54 65 78 74 3b 0a 73 74 72 75 63  ShellText;.struc
47e0: 74 20 53 68 65 6c 6c 54 65 78 74 20 7b 0a 20 20  t ShellText {.  
47f0: 63 68 61 72 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e  char *z;.  int n
4800: 3b 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 3b 0a  ;.  int nAlloc;.
4810: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61  };../*.** Initia
4820: 6c 69 7a 65 20 61 6e 64 20 64 65 73 74 72 6f 79  lize and destroy
4830: 20 61 20 53 68 65 6c 6c 54 65 78 74 20 6f 62 6a   a ShellText obj
4840: 65 63 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ect.*/.static vo
4850: 69 64 20 69 6e 69 74 54 65 78 74 28 53 68 65 6c  id initText(Shel
4860: 6c 54 65 78 74 20 2a 70 29 7b 0a 20 20 6d 65 6d  lText *p){.  mem
4870: 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66  set(p, 0, sizeof
4880: 28 2a 70 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20  (*p));.}.static 
4890: 76 6f 69 64 20 66 72 65 65 54 65 78 74 28 53 68  void freeText(Sh
48a0: 65 6c 6c 54 65 78 74 20 2a 70 29 7b 0a 20 20 66  ellText *p){.  f
48b0: 72 65 65 28 70 2d 3e 7a 29 3b 0a 20 20 69 6e 69  ree(p->z);.  ini
48c0: 74 54 65 78 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 20  tText(p);.}../* 
48d0: 7a 49 6e 20 69 73 20 65 69 74 68 65 72 20 61 20  zIn is either a 
48e0: 70 6f 69 6e 74 65 72 20 74 6f 20 61 20 4e 55 4c  pointer to a NUL
48f0: 4c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72  L-terminated str
4900: 69 6e 67 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62  ing in memory ob
4910: 74 61 69 6e 65 64 0a 2a 2a 20 66 72 6f 6d 20 6d  tained.** from m
4920: 61 6c 6c 6f 63 28 29 2c 20 6f 72 20 61 20 4e 55  alloc(), or a NU
4930: 4c 4c 20 70 6f 69 6e 74 65 72 2e 20 54 68 65 20  LL pointer. The 
4940: 73 74 72 69 6e 67 20 70 6f 69 6e 74 65 64 20 74  string pointed t
4950: 6f 20 62 79 20 7a 41 70 70 65 6e 64 20 69 73 0a  o by zAppend is.
4960: 2a 2a 20 61 64 64 65 64 20 74 6f 20 7a 49 6e 2c  ** added to zIn,
4970: 20 61 6e 64 20 74 68 65 20 72 65 73 75 6c 74 20   and the result 
4980: 72 65 74 75 72 6e 65 64 20 69 6e 20 6d 65 6d 6f  returned in memo
4990: 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
49a0: 20 6d 61 6c 6c 6f 63 28 29 2e 0a 2a 2a 20 7a 49   malloc()..** zI
49b0: 6e 2c 20 69 66 20 69 74 20 77 61 73 20 6e 6f 74  n, if it was not
49c0: 20 4e 55 4c 4c 2c 20 69 73 20 66 72 65 65 64 2e   NULL, is freed.
49d0: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 74 68  .**.** If the th
49e0: 69 72 64 20 61 72 67 75 6d 65 6e 74 2c 20 71 75  ird argument, qu
49f0: 6f 74 65 2c 20 69 73 20 6e 6f 74 20 27 5c 30 27  ote, is not '\0'
4a00: 2c 20 74 68 65 6e 20 69 74 20 69 73 20 75 73 65  , then it is use
4a10: 64 20 61 73 20 61 0a 2a 2a 20 71 75 6f 74 65 20  d as a.** quote 
4a20: 63 68 61 72 61 63 74 65 72 20 66 6f 72 20 7a 41  character for zA
4a30: 70 70 65 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  ppend..*/.static
4a40: 20 76 6f 69 64 20 61 70 70 65 6e 64 54 65 78 74   void appendText
4a50: 28 53 68 65 6c 6c 54 65 78 74 20 2a 70 2c 20 63  (ShellText *p, c
4a60: 68 61 72 20 63 6f 6e 73 74 20 2a 7a 41 70 70 65  har const *zAppe
4a70: 6e 64 2c 20 63 68 61 72 20 71 75 6f 74 65 29 7b  nd, char quote){
4a80: 0a 20 20 69 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e  .  int len;.  in
4a90: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 41 70 70 65  t i;.  int nAppe
4aa0: 6e 64 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 41  nd = strlen30(zA
4ab0: 70 70 65 6e 64 29 3b 0a 0a 20 20 6c 65 6e 20 3d  ppend);..  len =
4ac0: 20 6e 41 70 70 65 6e 64 2b 70 2d 3e 6e 2b 31 3b   nAppend+p->n+1;
4ad0: 0a 20 20 69 66 28 20 71 75 6f 74 65 20 29 7b 0a  .  if( quote ){.
4ae0: 20 20 20 20 6c 65 6e 20 2b 3d 20 32 3b 0a 20 20      len += 2;.  
4af0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 70    for(i=0; i<nAp
4b00: 70 65 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  pend; i++){.    
4b10: 20 20 69 66 28 20 7a 41 70 70 65 6e 64 5b 69 5d    if( zAppend[i]
4b20: 3d 3d 71 75 6f 74 65 20 29 20 6c 65 6e 2b 2b 3b  ==quote ) len++;
4b30: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
4b40: 28 20 70 2d 3e 6e 2b 6c 65 6e 3e 3d 70 2d 3e 6e  ( p->n+len>=p->n
4b50: 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e  Alloc ){.    p->
4b60: 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 41 6c 6c  nAlloc = p->nAll
4b70: 6f 63 2a 32 20 2b 20 6c 65 6e 20 2b 20 32 30 3b  oc*2 + len + 20;
4b80: 0a 20 20 20 20 70 2d 3e 7a 20 3d 20 72 65 61 6c  .    p->z = real
4b90: 6c 6f 63 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c  loc(p->z, p->nAl
4ba0: 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  loc);.    if( p-
4bb0: 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6d  >z==0 ){.      m
4bc0: 65 6d 73 65 74 28 70 2c 20 30 2c 20 73 69 7a 65  emset(p, 0, size
4bd0: 6f 66 28 2a 70 29 29 3b 0a 20 20 20 20 20 20 72  of(*p));.      r
4be0: 65 74 75 72 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d  eturn;.    }.  }
4bf0: 0a 0a 20 20 69 66 28 20 71 75 6f 74 65 20 29 7b  ..  if( quote ){
4c00: 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 73 72 20  .    char *zCsr 
4c10: 3d 20 70 2d 3e 7a 2b 70 2d 3e 6e 3b 0a 20 20 20  = p->z+p->n;.   
4c20: 20 2a 7a 43 73 72 2b 2b 20 3d 20 71 75 6f 74 65   *zCsr++ = quote
4c30: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
4c40: 3c 6e 41 70 70 65 6e 64 3b 20 69 2b 2b 29 7b 0a  <nAppend; i++){.
4c50: 20 20 20 20 20 20 2a 7a 43 73 72 2b 2b 20 3d 20        *zCsr++ = 
4c60: 7a 41 70 70 65 6e 64 5b 69 5d 3b 0a 20 20 20 20  zAppend[i];.    
4c70: 20 20 69 66 28 20 7a 41 70 70 65 6e 64 5b 69 5d    if( zAppend[i]
4c80: 3d 3d 71 75 6f 74 65 20 29 20 2a 7a 43 73 72 2b  ==quote ) *zCsr+
4c90: 2b 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20 7d  + = quote;.    }
4ca0: 0a 20 20 20 20 2a 7a 43 73 72 2b 2b 20 3d 20 71  .    *zCsr++ = q
4cb0: 75 6f 74 65 3b 0a 20 20 20 20 70 2d 3e 6e 20 3d  uote;.    p->n =
4cc0: 20 28 69 6e 74 29 28 7a 43 73 72 20 2d 20 70 2d   (int)(zCsr - p-
4cd0: 3e 7a 29 3b 0a 20 20 20 20 2a 7a 43 73 72 20 3d  >z);.    *zCsr =
4ce0: 20 27 5c 30 27 3b 0a 20 20 7d 65 6c 73 65 7b 0a   '\0';.  }else{.
4cf0: 20 20 20 20 6d 65 6d 63 70 79 28 70 2d 3e 7a 2b      memcpy(p->z+
4d00: 70 2d 3e 6e 2c 20 7a 41 70 70 65 6e 64 2c 20 6e  p->n, zAppend, n
4d10: 41 70 70 65 6e 64 29 3b 0a 20 20 20 20 70 2d 3e  Append);.    p->
4d20: 6e 20 2b 3d 20 6e 41 70 70 65 6e 64 3b 0a 20 20  n += nAppend;.  
4d30: 20 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 27    p->z[p->n] = '
4d40: 5c 30 27 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  \0';.  }.}../*.*
4d50: 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 64 65 74  * Attempt to det
4d60: 65 72 6d 69 6e 65 20 69 66 20 69 64 65 6e 74 69  ermine if identi
4d70: 66 69 65 72 20 7a 4e 61 6d 65 20 6e 65 65 64 73  fier zName needs
4d80: 20 74 6f 20 62 65 20 71 75 6f 74 65 64 2c 20 65   to be quoted, e
4d90: 69 74 68 65 72 0a 2a 2a 20 62 65 63 61 75 73 65  ither.** because
4da0: 20 69 74 20 63 6f 6e 74 61 69 6e 73 20 6e 6f 6e   it contains non
4db0: 2d 61 6c 70 68 61 6e 75 6d 65 72 69 63 20 63 68  -alphanumeric ch
4dc0: 61 72 61 63 74 65 72 73 2c 20 6f 72 20 62 65 63  aracters, or bec
4dd0: 61 75 73 65 20 69 74 20 69 73 20 61 6e 0a 2a 2a  ause it is an.**
4de0: 20 53 51 4c 69 74 65 20 6b 65 79 77 6f 72 64 2e   SQLite keyword.
4df0: 20 20 42 65 20 63 6f 6e 73 65 72 76 61 74 69 76    Be conservativ
4e00: 65 20 69 6e 20 74 68 69 73 20 65 73 74 69 6d 61  e in this estima
4e10: 74 65 3a 20 20 57 68 65 6e 20 69 6e 20 64 6f 75  te:  When in dou
4e20: 62 74 20 61 73 73 75 6d 65 0a 2a 2a 20 74 68 61  bt assume.** tha
4e30: 74 20 71 75 6f 74 69 6e 67 20 69 73 20 72 65 71  t quoting is req
4e40: 75 69 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  uired..**.** Ret
4e50: 75 72 6e 20 27 22 27 20 69 66 20 71 75 6f 74 69  urn '"' if quoti
4e60: 6e 67 20 69 73 20 72 65 71 75 69 72 65 64 2e 20  ng is required. 
4e70: 20 52 65 74 75 72 6e 20 30 20 69 66 20 6e 6f 20   Return 0 if no 
4e80: 71 75 6f 74 69 6e 67 20 69 73 20 72 65 71 75 69  quoting is requi
4e90: 72 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  red..*/.static c
4ea0: 68 61 72 20 71 75 6f 74 65 43 68 61 72 28 63 6f  har quoteChar(co
4eb0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29  nst char *zName)
4ec0: 7b 0a 20 20 2f 2a 20 41 6c 6c 20 53 51 4c 69 74  {.  /* All SQLit
4ed0: 65 20 6b 65 79 77 6f 72 64 73 2c 20 69 6e 20 61  e keywords, in a
4ee0: 6c 70 68 61 62 65 74 69 63 61 6c 20 6f 72 64 65  lphabetical orde
4ef0: 72 20 2a 2f 0a 20 20 73 74 61 74 69 63 20 63 6f  r */.  static co
4f00: 6e 73 74 20 63 68 61 72 20 2a 61 7a 4b 65 79 77  nst char *azKeyw
4f10: 6f 72 64 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22  ords[] = {.    "
4f20: 41 42 4f 52 54 22 2c 20 22 41 43 54 49 4f 4e 22  ABORT", "ACTION"
4f30: 2c 20 22 41 44 44 22 2c 20 22 41 46 54 45 52 22  , "ADD", "AFTER"
4f40: 2c 20 22 41 4c 4c 22 2c 20 22 41 4c 54 45 52 22  , "ALL", "ALTER"
4f50: 2c 20 22 41 4e 41 4c 59 5a 45 22 2c 20 22 41 4e  , "ANALYZE", "AN
4f60: 44 22 2c 20 22 41 53 22 2c 0a 20 20 20 20 22 41  D", "AS",.    "A
4f70: 53 43 22 2c 20 22 41 54 54 41 43 48 22 2c 20 22  SC", "ATTACH", "
4f80: 41 55 54 4f 49 4e 43 52 45 4d 45 4e 54 22 2c 20  AUTOINCREMENT", 
4f90: 22 42 45 46 4f 52 45 22 2c 20 22 42 45 47 49 4e  "BEFORE", "BEGIN
4fa0: 22 2c 20 22 42 45 54 57 45 45 4e 22 2c 20 22 42  ", "BETWEEN", "B
4fb0: 59 22 2c 0a 20 20 20 20 22 43 41 53 43 41 44 45  Y",.    "CASCADE
4fc0: 22 2c 20 22 43 41 53 45 22 2c 20 22 43 41 53 54  ", "CASE", "CAST
4fd0: 22 2c 20 22 43 48 45 43 4b 22 2c 20 22 43 4f 4c  ", "CHECK", "COL
4fe0: 4c 41 54 45 22 2c 20 22 43 4f 4c 55 4d 4e 22 2c  LATE", "COLUMN",
4ff0: 20 22 43 4f 4d 4d 49 54 22 2c 0a 20 20 20 20 22   "COMMIT",.    "
5000: 43 4f 4e 46 4c 49 43 54 22 2c 20 22 43 4f 4e 53  CONFLICT", "CONS
5010: 54 52 41 49 4e 54 22 2c 20 22 43 52 45 41 54 45  TRAINT", "CREATE
5020: 22 2c 20 22 43 52 4f 53 53 22 2c 20 22 43 55 52  ", "CROSS", "CUR
5030: 52 45 4e 54 5f 44 41 54 45 22 2c 0a 20 20 20 20  RENT_DATE",.    
5040: 22 43 55 52 52 45 4e 54 5f 54 49 4d 45 22 2c 20  "CURRENT_TIME", 
5050: 22 43 55 52 52 45 4e 54 5f 54 49 4d 45 53 54 41  "CURRENT_TIMESTA
5060: 4d 50 22 2c 20 22 44 41 54 41 42 41 53 45 22 2c  MP", "DATABASE",
5070: 20 22 44 45 46 41 55 4c 54 22 2c 20 22 44 45 46   "DEFAULT", "DEF
5080: 45 52 52 41 42 4c 45 22 2c 0a 20 20 20 20 22 44  ERRABLE",.    "D
5090: 45 46 45 52 52 45 44 22 2c 20 22 44 45 4c 45 54  EFERRED", "DELET
50a0: 45 22 2c 20 22 44 45 53 43 22 2c 20 22 44 45 54  E", "DESC", "DET
50b0: 41 43 48 22 2c 20 22 44 49 53 54 49 4e 43 54 22  ACH", "DISTINCT"
50c0: 2c 20 22 44 52 4f 50 22 2c 20 22 45 41 43 48 22  , "DROP", "EACH"
50d0: 2c 0a 20 20 20 20 22 45 4c 53 45 22 2c 20 22 45  ,.    "ELSE", "E
50e0: 4e 44 22 2c 20 22 45 53 43 41 50 45 22 2c 20 22  ND", "ESCAPE", "
50f0: 45 58 43 45 50 54 22 2c 20 22 45 58 43 4c 55 53  EXCEPT", "EXCLUS
5100: 49 56 45 22 2c 20 22 45 58 49 53 54 53 22 2c 20  IVE", "EXISTS", 
5110: 22 45 58 50 4c 41 49 4e 22 2c 0a 20 20 20 20 22  "EXPLAIN",.    "
5120: 46 41 49 4c 22 2c 20 22 46 4f 52 22 2c 20 22 46  FAIL", "FOR", "F
5130: 4f 52 45 49 47 4e 22 2c 20 22 46 52 4f 4d 22 2c  OREIGN", "FROM",
5140: 20 22 46 55 4c 4c 22 2c 20 22 47 4c 4f 42 22 2c   "FULL", "GLOB",
5150: 20 22 47 52 4f 55 50 22 2c 20 22 48 41 56 49 4e   "GROUP", "HAVIN
5160: 47 22 2c 20 22 49 46 22 2c 0a 20 20 20 20 22 49  G", "IF",.    "I
5170: 47 4e 4f 52 45 22 2c 20 22 49 4d 4d 45 44 49 41  GNORE", "IMMEDIA
5180: 54 45 22 2c 20 22 49 4e 22 2c 20 22 49 4e 44 45  TE", "IN", "INDE
5190: 58 22 2c 20 22 49 4e 44 45 58 45 44 22 2c 20 22  X", "INDEXED", "
51a0: 49 4e 49 54 49 41 4c 4c 59 22 2c 20 22 49 4e 4e  INITIALLY", "INN
51b0: 45 52 22 2c 0a 20 20 20 20 22 49 4e 53 45 52 54  ER",.    "INSERT
51c0: 22 2c 20 22 49 4e 53 54 45 41 44 22 2c 20 22 49  ", "INSTEAD", "I
51d0: 4e 54 45 52 53 45 43 54 22 2c 20 22 49 4e 54 4f  NTERSECT", "INTO
51e0: 22 2c 20 22 49 53 22 2c 20 22 49 53 4e 55 4c 4c  ", "IS", "ISNULL
51f0: 22 2c 20 22 4a 4f 49 4e 22 2c 20 22 4b 45 59 22  ", "JOIN", "KEY"
5200: 2c 0a 20 20 20 20 22 4c 45 46 54 22 2c 20 22 4c  ,.    "LEFT", "L
5210: 49 4b 45 22 2c 20 22 4c 49 4d 49 54 22 2c 20 22  IKE", "LIMIT", "
5220: 4d 41 54 43 48 22 2c 20 22 4e 41 54 55 52 41 4c  MATCH", "NATURAL
5230: 22 2c 20 22 4e 4f 22 2c 20 22 4e 4f 54 22 2c 20  ", "NO", "NOT", 
5240: 22 4e 4f 54 4e 55 4c 4c 22 2c 0a 20 20 20 20 22  "NOTNULL",.    "
5250: 4e 55 4c 4c 22 2c 20 22 4f 46 22 2c 20 22 4f 46  NULL", "OF", "OF
5260: 46 53 45 54 22 2c 20 22 4f 4e 22 2c 20 22 4f 52  FSET", "ON", "OR
5270: 22 2c 20 22 4f 52 44 45 52 22 2c 20 22 4f 55 54  ", "ORDER", "OUT
5280: 45 52 22 2c 20 22 50 4c 41 4e 22 2c 20 22 50 52  ER", "PLAN", "PR
5290: 41 47 4d 41 22 2c 0a 20 20 20 20 22 50 52 49 4d  AGMA",.    "PRIM
52a0: 41 52 59 22 2c 20 22 51 55 45 52 59 22 2c 20 22  ARY", "QUERY", "
52b0: 52 41 49 53 45 22 2c 20 22 52 45 43 55 52 53 49  RAISE", "RECURSI
52c0: 56 45 22 2c 20 22 52 45 46 45 52 45 4e 43 45 53  VE", "REFERENCES
52d0: 22 2c 20 22 52 45 47 45 58 50 22 2c 0a 20 20 20  ", "REGEXP",.   
52e0: 20 22 52 45 49 4e 44 45 58 22 2c 20 22 52 45 4c   "REINDEX", "REL
52f0: 45 41 53 45 22 2c 20 22 52 45 4e 41 4d 45 22 2c  EASE", "RENAME",
5300: 20 22 52 45 50 4c 41 43 45 22 2c 20 22 52 45 53   "REPLACE", "RES
5310: 54 52 49 43 54 22 2c 20 22 52 49 47 48 54 22 2c  TRICT", "RIGHT",
5320: 0a 20 20 20 20 22 52 4f 4c 4c 42 41 43 4b 22 2c  .    "ROLLBACK",
5330: 20 22 52 4f 57 22 2c 20 22 53 41 56 45 50 4f 49   "ROW", "SAVEPOI
5340: 4e 54 22 2c 20 22 53 45 4c 45 43 54 22 2c 20 22  NT", "SELECT", "
5350: 53 45 54 22 2c 20 22 54 41 42 4c 45 22 2c 20 22  SET", "TABLE", "
5360: 54 45 4d 50 22 2c 0a 20 20 20 20 22 54 45 4d 50  TEMP",.    "TEMP
5370: 4f 52 41 52 59 22 2c 20 22 54 48 45 4e 22 2c 20  ORARY", "THEN", 
5380: 22 54 4f 22 2c 20 22 54 52 41 4e 53 41 43 54 49  "TO", "TRANSACTI
5390: 4f 4e 22 2c 20 22 54 52 49 47 47 45 52 22 2c 20  ON", "TRIGGER", 
53a0: 22 55 4e 49 4f 4e 22 2c 20 22 55 4e 49 51 55 45  "UNION", "UNIQUE
53b0: 22 2c 0a 20 20 20 20 22 55 50 44 41 54 45 22 2c  ",.    "UPDATE",
53c0: 20 22 55 53 49 4e 47 22 2c 20 22 56 41 43 55 55   "USING", "VACUU
53d0: 4d 22 2c 20 22 56 41 4c 55 45 53 22 2c 20 22 56  M", "VALUES", "V
53e0: 49 45 57 22 2c 20 22 56 49 52 54 55 41 4c 22 2c  IEW", "VIRTUAL",
53f0: 20 22 57 48 45 4e 22 2c 20 22 57 48 45 52 45 22   "WHEN", "WHERE"
5400: 2c 0a 20 20 20 20 22 57 49 54 48 22 2c 20 22 57  ,.    "WITH", "W
5410: 49 54 48 4f 55 54 22 2c 0a 20 20 7d 3b 0a 20 20  ITHOUT",.  };.  
5420: 69 6e 74 20 69 2c 20 6c 77 72 2c 20 75 70 72 2c  int i, lwr, upr,
5430: 20 6d 69 64 2c 20 63 3b 0a 20 20 69 66 28 20 21   mid, c;.  if( !
5440: 69 73 61 6c 70 68 61 28 28 75 6e 73 69 67 6e 65  isalpha((unsigne
5450: 64 20 63 68 61 72 29 7a 4e 61 6d 65 5b 30 5d 29  d char)zName[0])
5460: 20 26 26 20 7a 4e 61 6d 65 5b 30 5d 21 3d 27 5f   && zName[0]!='_
5470: 27 20 29 20 72 65 74 75 72 6e 20 27 22 27 3b 0a  ' ) return '"';.
5480: 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d 65    for(i=0; zName
5490: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  [i]; i++){.    i
54a0: 66 28 20 21 69 73 61 6c 6e 75 6d 28 28 75 6e 73  f( !isalnum((uns
54b0: 69 67 6e 65 64 20 63 68 61 72 29 7a 4e 61 6d 65  igned char)zName
54c0: 5b 69 5d 29 20 26 26 20 7a 4e 61 6d 65 5b 69 5d  [i]) && zName[i]
54d0: 21 3d 27 5f 27 20 29 20 72 65 74 75 72 6e 20 27  !='_' ) return '
54e0: 22 27 3b 0a 20 20 7d 0a 20 20 6c 77 72 20 3d 20  "';.  }.  lwr = 
54f0: 30 3b 0a 20 20 75 70 72 20 3d 20 73 69 7a 65 6f  0;.  upr = sizeo
5500: 66 28 61 7a 4b 65 79 77 6f 72 64 73 29 2f 73 69  f(azKeywords)/si
5510: 7a 65 6f 66 28 61 7a 4b 65 79 77 6f 72 64 73 5b  zeof(azKeywords[
5520: 30 5d 29 20 2d 20 31 3b 0a 20 20 77 68 69 6c 65  0]) - 1;.  while
5530: 28 20 6c 77 72 3c 3d 75 70 72 20 29 7b 0a 20 20  ( lwr<=upr ){.  
5540: 20 20 6d 69 64 20 3d 20 28 6c 77 72 2b 75 70 72    mid = (lwr+upr
5550: 29 2f 32 3b 0a 20 20 20 20 63 20 3d 20 73 71 6c  )/2;.    c = sql
5560: 69 74 65 33 5f 73 74 72 69 63 6d 70 28 61 7a 4b  ite3_stricmp(azK
5570: 65 79 77 6f 72 64 73 5b 6d 69 64 5d 2c 20 7a 4e  eywords[mid], zN
5580: 61 6d 65 29 3b 0a 20 20 20 20 69 66 28 20 63 3d  ame);.    if( c=
5590: 3d 30 20 29 20 72 65 74 75 72 6e 20 27 22 27 3b  =0 ) return '"';
55a0: 0a 20 20 20 20 69 66 28 20 63 3c 30 20 29 7b 0a  .    if( c<0 ){.
55b0: 20 20 20 20 20 20 6c 77 72 20 3d 20 6d 69 64 2b        lwr = mid+
55c0: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
55d0: 20 20 20 20 75 70 72 20 3d 20 6d 69 64 2d 31 3b      upr = mid-1;
55e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
55f0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
5600: 43 6f 6e 73 74 72 75 63 74 20 61 20 66 61 6b 65  Construct a fake
5610: 20 6f 62 6a 65 63 74 20 6e 61 6d 65 20 61 6e 64   object name and
5620: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 74 6f 20   column list to 
5630: 64 65 73 63 72 69 62 65 20 74 68 65 20 73 74 72  describe the str
5640: 75 63 74 75 72 65 0a 2a 2a 20 6f 66 20 74 68 65  ucture.** of the
5650: 20 76 69 65 77 2c 20 76 69 72 74 75 61 6c 20 74   view, virtual t
5660: 61 62 6c 65 2c 20 6f 72 20 74 61 62 6c 65 20 76  able, or table v
5670: 61 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 7a  alued function z
5680: 53 63 68 65 6d 61 2e 7a 4e 61 6d 65 2e 0a 2a 2f  Schema.zName..*/
5690: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 73 68  .static char *sh
56a0: 65 6c 6c 46 61 6b 65 53 63 68 65 6d 61 28 0a 20  ellFakeSchema(. 
56b0: 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20   sqlite3 *db,   
56c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
56d0: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
56e0: 69 6f 6e 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ion containing t
56f0: 68 65 20 76 74 61 62 20 2a 2f 0a 20 20 63 6f 6e  he vtab */.  con
5700: 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61  st char *zSchema
5710: 2c 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20 6f  ,    /* Schema o
5720: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
5730: 6f 6c 64 69 6e 67 20 74 68 65 20 76 74 61 62 20  olding the vtab 
5740: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
5750: 2a 7a 4e 61 6d 65 20 20 20 20 20 20 20 2f 2a 20  *zName       /* 
5760: 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
5770: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
5780: 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  .){.  sqlite3_st
5790: 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
57a0: 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 53   char *zSql;.  S
57b0: 68 65 6c 6c 54 65 78 74 20 73 3b 0a 20 20 63 68  hellText s;.  ch
57c0: 61 72 20 63 51 75 6f 74 65 3b 0a 20 20 63 68 61  ar cQuote;.  cha
57d0: 72 20 2a 7a 44 69 76 20 3d 20 22 28 22 3b 0a 20  r *zDiv = "(";. 
57e0: 20 69 6e 74 20 6e 52 6f 77 20 3d 20 30 3b 0a 0a   int nRow = 0;..
57f0: 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
5800: 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41  _mprintf("PRAGMA
5810: 20 5c 22 25 77 5c 22 2e 74 61 62 6c 65 5f 69 6e   \"%w\".table_in
5820: 66 6f 3d 25 51 3b 22 2c 0a 20 20 20 20 20 20 20  fo=%Q;",.       
5830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5840: 20 20 7a 53 63 68 65 6d 61 20 3f 20 7a 53 63 68    zSchema ? zSch
5850: 65 6d 61 20 3a 20 22 6d 61 69 6e 22 2c 20 7a 4e  ema : "main", zN
5860: 61 6d 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ame);.  sqlite3_
5870: 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a  prepare_v2(db, z
5880: 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
5890: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
58a0: 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 69 6e 69  ree(zSql);.  ini
58b0: 74 54 65 78 74 28 26 73 29 3b 0a 20 20 69 66 28  tText(&s);.  if(
58c0: 20 7a 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20   zSchema ){.    
58d0: 63 51 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68  cQuote = quoteCh
58e0: 61 72 28 7a 53 63 68 65 6d 61 29 3b 0a 20 20 20  ar(zSchema);.   
58f0: 20 69 66 28 20 63 51 75 6f 74 65 20 26 26 20 73   if( cQuote && s
5900: 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
5910: 53 63 68 65 6d 61 2c 22 74 65 6d 70 22 29 3d 3d  Schema,"temp")==
5920: 30 20 29 20 63 51 75 6f 74 65 20 3d 20 30 3b 0a  0 ) cQuote = 0;.
5930: 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
5940: 73 2c 20 7a 53 63 68 65 6d 61 2c 20 63 51 75 6f  s, zSchema, cQuo
5950: 74 65 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54  te);.    appendT
5960: 65 78 74 28 26 73 2c 20 22 2e 22 2c 20 30 29 3b  ext(&s, ".", 0);
5970: 0a 20 20 7d 0a 20 20 63 51 75 6f 74 65 20 3d 20  .  }.  cQuote = 
5980: 71 75 6f 74 65 43 68 61 72 28 7a 4e 61 6d 65 29  quoteChar(zName)
5990: 3b 0a 20 20 61 70 70 65 6e 64 54 65 78 74 28 26  ;.  appendText(&
59a0: 73 2c 20 7a 4e 61 6d 65 2c 20 63 51 75 6f 74 65  s, zName, cQuote
59b0: 29 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69  );.  while( sqli
59c0: 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
59d0: 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
59e0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
59f0: 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  Col = (const cha
5a00: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
5a10: 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29  n_text(pStmt, 1)
5a20: 3b 0a 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20  ;.    nRow++;.  
5a30: 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c    appendText(&s,
5a40: 20 7a 44 69 76 2c 20 30 29 3b 0a 20 20 20 20 7a   zDiv, 0);.    z
5a50: 44 69 76 20 3d 20 22 2c 22 3b 0a 20 20 20 20 63  Div = ",";.    c
5a60: 51 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61  Quote = quoteCha
5a70: 72 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 61 70 70  r(zCol);.    app
5a80: 65 6e 64 54 65 78 74 28 26 73 2c 20 7a 43 6f 6c  endText(&s, zCol
5a90: 2c 20 63 51 75 6f 74 65 29 3b 0a 20 20 7d 0a 20  , cQuote);.  }. 
5aa0: 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20   appendText(&s, 
5ab0: 22 29 22 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  ")", 0);.  sqlit
5ac0: 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
5ad0: 74 29 3b 0a 20 20 69 66 28 20 6e 52 6f 77 3d 3d  t);.  if( nRow==
5ae0: 30 20 29 7b 0a 20 20 20 20 66 72 65 65 54 65 78  0 ){.    freeTex
5af0: 74 28 26 73 29 3b 0a 20 20 20 20 73 2e 7a 20 3d  t(&s);.    s.z =
5b00: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
5b10: 20 73 2e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   s.z;.}../*.** S
5b20: 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73 68  QL function:  sh
5b30: 65 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68 65 6d  ell_module_schem
5b40: 61 28 58 29 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  a(X).**.** Retur
5b50: 6e 20 61 20 66 61 6b 65 20 73 63 68 65 6d 61 20  n a fake schema 
5b60: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 2d 76 61  for the table-va
5b70: 6c 75 65 64 20 66 75 6e 63 74 69 6f 6e 20 6f 72  lued function or
5b80: 20 65 70 6f 6e 79 6d 6f 75 73 20 76 69 72 74 75   eponymous virtu
5b90: 61 6c 0a 2a 2a 20 74 61 62 6c 65 20 58 2e 0a 2a  al.** table X..*
5ba0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68  /.static void sh
5bb0: 65 6c 6c 4d 6f 64 75 6c 65 53 63 68 65 6d 61 28  ellModuleSchema(
5bc0: 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
5bd0: 78 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20  xt *pCtx,.  int 
5be0: 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nVal,.  sqlite3_
5bf0: 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b  value **apVal.){
5c00: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5c10: 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  Name = (const ch
5c20: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
5c30: 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29  e_text(apVal[0])
5c40: 3b 0a 20 20 63 68 61 72 20 2a 7a 46 61 6b 65 20  ;.  char *zFake 
5c50: 3d 20 73 68 65 6c 6c 46 61 6b 65 53 63 68 65 6d  = shellFakeSchem
5c60: 61 28 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  a(sqlite3_contex
5c70: 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78  t_db_handle(pCtx
5c80: 29 2c 20 30 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  ), 0, zName);.  
5c90: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
5ca0: 28 6e 56 61 6c 29 3b 0a 20 20 69 66 28 20 7a 46  (nVal);.  if( zF
5cb0: 61 6b 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ake ){.    sqlit
5cc0: 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70  e3_result_text(p
5cd0: 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72  Ctx, sqlite3_mpr
5ce0: 69 6e 74 66 28 22 2f 2a 20 25 73 20 2a 2f 22 2c  intf("/* %s */",
5cf0: 20 7a 46 61 6b 65 29 2c 0a 20 20 20 20 20 20 20   zFake),.       
5d00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d10: 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65   -1, sqlite3_fre
5d20: 65 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 46 61  e);.    free(zFa
5d30: 6b 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ke);.  }.}../*.*
5d40: 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20  * SQL function: 
5d50: 20 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68 65 6d   shell_add_schem
5d60: 61 28 53 2c 58 29 0a 2a 2a 0a 2a 2a 20 41 64 64  a(S,X).**.** Add
5d70: 20 74 68 65 20 73 63 68 65 6d 61 20 6e 61 6d 65   the schema name
5d80: 20 58 20 74 6f 20 74 68 65 20 43 52 45 41 54 45   X to the CREATE
5d90: 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 53 20   statement in S 
5da0: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 72  and return the r
5db0: 65 73 75 6c 74 2e 0a 2a 2a 20 45 78 61 6d 70 6c  esult..** Exampl
5dc0: 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45  es:.**.**    CRE
5dd0: 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 20  ATE TABLE t1(x) 
5de0: 20 20 2d 3e 20 20 20 43 52 45 41 54 45 20 54 41    ->   CREATE TA
5df0: 42 4c 45 20 78 79 7a 2e 74 31 28 78 29 3b 0a 2a  BLE xyz.t1(x);.*
5e00: 2a 0a 2a 2a 20 41 6c 73 6f 20 77 6f 72 6b 73 20  *.** Also works 
5e10: 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41  on.**.**    CREA
5e20: 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 43  TE INDEX.**    C
5e30: 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44  REATE UNIQUE IND
5e40: 45 58 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20  EX.**    CREATE 
5e50: 56 49 45 57 0a 2a 2a 20 20 20 20 43 52 45 41 54  VIEW.**    CREAT
5e60: 45 20 54 52 49 47 47 45 52 0a 2a 2a 20 20 20 20  E TRIGGER.**    
5e70: 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54  CREATE VIRTUAL T
5e80: 41 42 4c 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ABLE.**.** This 
5e90: 55 44 46 20 69 73 20 75 73 65 64 20 62 79 20 74  UDF is used by t
5ea0: 68 65 20 2e 73 63 68 65 6d 61 20 63 6f 6d 6d 61  he .schema comma
5eb0: 6e 64 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65  nd to insert the
5ec0: 20 73 63 68 65 6d 61 20 6e 61 6d 65 20 6f 66 0a   schema name of.
5ed0: 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61  ** attached data
5ee0: 62 61 73 65 73 20 69 6e 74 6f 20 74 68 65 20 6d  bases into the m
5ef0: 69 64 64 6c 65 20 6f 66 20 74 68 65 20 73 71 6c  iddle of the sql
5f00: 69 74 65 5f 6d 61 73 74 65 72 2e 73 71 6c 20 66  ite_master.sql f
5f10: 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ield..*/.static 
5f20: 76 6f 69 64 20 73 68 65 6c 6c 41 64 64 53 63 68  void shellAddSch
5f30: 65 6d 61 4e 61 6d 65 28 0a 20 20 73 71 6c 69 74  emaName(.  sqlit
5f40: 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78  e3_context *pCtx
5f50: 2c 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20  ,.  int nVal,.  
5f60: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a  sqlite3_value **
5f70: 61 70 56 61 6c 0a 29 7b 0a 20 20 73 74 61 74 69  apVal.){.  stati
5f80: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 50  c const char *aP
5f90: 72 65 66 69 78 5b 5d 20 3d 20 7b 0a 20 20 20 20  refix[] = {.    
5fa0: 20 22 54 41 42 4c 45 22 2c 0a 20 20 20 20 20 22   "TABLE",.     "
5fb0: 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 55 4e  INDEX",.     "UN
5fc0: 49 51 55 45 20 49 4e 44 45 58 22 2c 0a 20 20 20  IQUE INDEX",.   
5fd0: 20 20 22 56 49 45 57 22 2c 0a 20 20 20 20 20 22    "VIEW",.     "
5fe0: 54 52 49 47 47 45 52 22 2c 0a 20 20 20 20 20 22  TRIGGER",.     "
5ff0: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 22 0a 20  VIRTUAL TABLE". 
6000: 20 7d 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b   };.  int i = 0;
6010: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6020: 49 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  In = (const char
6030: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
6040: 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a  text(apVal[0]);.
6050: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
6060: 63 68 65 6d 61 20 3d 20 28 63 6f 6e 73 74 20 63  chema = (const c
6070: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
6080: 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 31 5d  ue_text(apVal[1]
6090: 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  );.  const char 
60a0: 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20  *zName = (const 
60b0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
60c0: 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 32  lue_text(apVal[2
60d0: 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ]);.  sqlite3 *d
60e0: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  b = sqlite3_cont
60f0: 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43  ext_db_handle(pC
6100: 74 78 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  tx);.  UNUSED_PA
6110: 52 41 4d 45 54 45 52 28 6e 56 61 6c 29 3b 0a 20  RAMETER(nVal);. 
6120: 20 69 66 28 20 7a 49 6e 21 3d 30 20 26 26 20 73   if( zIn!=0 && s
6130: 74 72 6e 63 6d 70 28 7a 49 6e 2c 20 22 43 52 45  trncmp(zIn, "CRE
6140: 41 54 45 20 22 2c 20 37 29 3d 3d 30 20 29 7b 0a  ATE ", 7)==0 ){.
6150: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 28      for(i=0; i<(
6160: 69 6e 74 29 28 73 69 7a 65 6f 66 28 61 50 72 65  int)(sizeof(aPre
6170: 66 69 78 29 2f 73 69 7a 65 6f 66 28 61 50 72 65  fix)/sizeof(aPre
6180: 66 69 78 5b 30 5d 29 29 3b 20 69 2b 2b 29 7b 0a  fix[0])); i++){.
6190: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74        int n = st
61a0: 72 6c 65 6e 33 30 28 61 50 72 65 66 69 78 5b 69  rlen30(aPrefix[i
61b0: 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  ]);.      if( st
61c0: 72 6e 63 6d 70 28 7a 49 6e 2b 37 2c 20 61 50 72  rncmp(zIn+7, aPr
61d0: 65 66 69 78 5b 69 5d 2c 20 6e 29 3d 3d 30 20 26  efix[i], n)==0 &
61e0: 26 20 7a 49 6e 5b 6e 2b 37 5d 3d 3d 27 20 27 20  & zIn[n+7]==' ' 
61f0: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
6200: 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  *z = 0;.        
6210: 63 68 61 72 20 2a 7a 46 61 6b 65 20 3d 20 30 3b  char *zFake = 0;
6220: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 53 63  .        if( zSc
6230: 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 20 20  hema ){.        
6240: 20 20 63 68 61 72 20 63 51 75 6f 74 65 20 3d 20    char cQuote = 
6250: 71 75 6f 74 65 43 68 61 72 28 7a 53 63 68 65 6d  quoteChar(zSchem
6260: 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  a);.          if
6270: 28 20 63 51 75 6f 74 65 20 26 26 20 73 71 6c 69  ( cQuote && sqli
6280: 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 53 63 68  te3_stricmp(zSch
6290: 65 6d 61 2c 22 74 65 6d 70 22 29 21 3d 30 20 29  ema,"temp")!=0 )
62a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  {.            z 
62b0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
62c0: 66 28 22 25 2e 2a 73 20 5c 22 25 77 5c 22 2e 25  f("%.*s \"%w\".%
62d0: 73 22 2c 20 6e 2b 37 2c 20 7a 49 6e 2c 20 7a 53  s", n+7, zIn, zS
62e0: 63 68 65 6d 61 2c 20 7a 49 6e 2b 6e 2b 38 29 3b  chema, zIn+n+8);
62f0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
6300: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  {.            z 
6310: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
6320: 66 28 22 25 2e 2a 73 20 25 73 2e 25 73 22 2c 20  f("%.*s %s.%s", 
6330: 6e 2b 37 2c 20 7a 49 6e 2c 20 7a 53 63 68 65 6d  n+7, zIn, zSchem
6340: 61 2c 20 7a 49 6e 2b 6e 2b 38 29 3b 0a 20 20 20  a, zIn+n+8);.   
6350: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6360: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a   }.        if( z
6370: 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 20 26 26  Name.         &&
6380: 20 61 50 72 65 66 69 78 5b 69 5d 5b 30 5d 3d 3d   aPrefix[i][0]==
6390: 27 56 27 0a 20 20 20 20 20 20 20 20 20 26 26 20  'V'.         && 
63a0: 28 7a 46 61 6b 65 20 3d 20 73 68 65 6c 6c 46 61  (zFake = shellFa
63b0: 6b 65 53 63 68 65 6d 61 28 64 62 2c 20 7a 53 63  keSchema(db, zSc
63c0: 68 65 6d 61 2c 20 7a 4e 61 6d 65 29 29 21 3d 30  hema, zName))!=0
63d0: 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
63e0: 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29        if( z==0 )
63f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  {.            z 
6400: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
6410: 66 28 22 25 73 5c 6e 2f 2a 20 25 73 20 2a 2f 22  f("%s\n/* %s */"
6420: 2c 20 7a 49 6e 2c 20 7a 46 61 6b 65 29 3b 0a 20  , zIn, zFake);. 
6430: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
6440: 20 20 20 20 20 20 20 20 20 20 20 20 7a 20 3d 20              z = 
6450: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
6460: 22 25 7a 5c 6e 2f 2a 20 25 73 20 2a 2f 22 2c 20  "%z\n/* %s */", 
6470: 7a 2c 20 7a 46 61 6b 65 29 3b 0a 20 20 20 20 20  z, zFake);.     
6480: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6490: 20 66 72 65 65 28 7a 46 61 6b 65 29 3b 0a 20 20   free(zFake);.  
64a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
64b0: 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 20  if( z ){.       
64c0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
64d0: 74 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 2c 20  t_text(pCtx, z, 
64e0: 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  -1, sqlite3_free
64f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
6500: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  urn;.        }. 
6510: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
6520: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
6530: 74 5f 76 61 6c 75 65 28 70 43 74 78 2c 20 61 70  t_value(pCtx, ap
6540: 56 61 6c 5b 30 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Val[0]);.}../*.*
6550: 2a 20 54 68 65 20 73 6f 75 72 63 65 20 63 6f 64  * The source cod
6560: 65 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 75  e for several ru
6570: 6e 2d 74 69 6d 65 20 6c 6f 61 64 61 62 6c 65 20  n-time loadable 
6580: 65 78 74 65 6e 73 69 6f 6e 73 20 69 73 20 69 6e  extensions is in
6590: 73 65 72 74 65 64 0a 2a 2a 20 62 65 6c 6f 77 20  serted.** below 
65a0: 62 79 20 74 68 65 20 2e 2e 2f 74 6f 6f 6c 2f 6d  by the ../tool/m
65b0: 6b 73 68 65 6c 6c 63 2e 74 63 6c 20 73 63 72 69  kshellc.tcl scri
65c0: 70 74 2e 20 20 42 65 66 6f 72 65 20 70 72 6f 63  pt.  Before proc
65d0: 65 73 73 69 6e 67 20 74 68 61 74 20 69 6e 63 6c  essing that incl
65e0: 75 64 65 64 0a 2a 2a 20 63 6f 64 65 2c 20 77 65  uded.** code, we
65f0: 20 6e 65 65 64 20 74 6f 20 6f 76 65 72 72 69 64   need to overrid
6600: 65 20 73 6f 6d 65 20 6d 61 63 72 6f 73 20 74 6f  e some macros to
6610: 20 6d 61 6b 65 20 74 68 65 20 69 6e 63 6c 75 64   make the includ
6620: 65 64 20 70 72 6f 67 72 61 6d 20 63 6f 64 65 0a  ed program code.
6630: 2a 2a 20 77 6f 72 6b 20 68 65 72 65 20 69 6e 20  ** work here in 
6640: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68  the middle of th
6650: 69 73 20 72 65 67 75 6c 61 72 20 70 72 6f 67 72  is regular progr
6660: 61 6d 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  am..*/.#define S
6670: 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f  QLITE_EXTENSION_
6680: 49 4e 49 54 31 0a 23 64 65 66 69 6e 65 20 53 51  INIT1.#define SQ
6690: 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49  LITE_EXTENSION_I
66a0: 4e 49 54 32 28 58 29 20 28 76 6f 69 64 29 28 58  NIT2(X) (void)(X
66b0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  )..#if defined(_
66c0: 57 49 4e 33 32 29 20 26 26 20 64 65 66 69 6e 65  WIN32) && define
66d0: 64 28 5f 4d 53 43 5f 56 45 52 29 0a 49 4e 43 4c  d(_MSC_VER).INCL
66e0: 55 44 45 20 74 65 73 74 5f 77 69 6e 64 69 72 65  UDE test_windire
66f0: 6e 74 2e 68 0a 49 4e 43 4c 55 44 45 20 74 65 73  nt.h.INCLUDE tes
6700: 74 5f 77 69 6e 64 69 72 65 6e 74 2e 63 0a 23 64  t_windirent.c.#d
6710: 65 66 69 6e 65 20 64 69 72 65 6e 74 20 44 49 52  efine dirent DIR
6720: 45 4e 54 0a 23 65 6e 64 69 66 0a 49 4e 43 4c 55  ENT.#endif.INCLU
6730: 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 73  DE ../ext/misc/s
6740: 68 61 74 68 72 65 65 2e 63 0a 49 4e 43 4c 55 44  hathree.c.INCLUD
6750: 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 66 69  E ../ext/misc/fi
6760: 6c 65 69 6f 2e 63 0a 49 4e 43 4c 55 44 45 20 2e  leio.c.INCLUDE .
6770: 2e 2f 65 78 74 2f 6d 69 73 63 2f 63 6f 6d 70 6c  ./ext/misc/compl
6780: 65 74 69 6f 6e 2e 63 0a 49 4e 43 4c 55 44 45 20  etion.c.INCLUDE 
6790: 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 61 70 70 65  ../ext/misc/appe
67a0: 6e 64 76 66 73 2e 63 0a 23 69 66 64 65 66 20 53  ndvfs.c.#ifdef S
67b0: 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a  QLITE_HAVE_ZLIB.
67c0: 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d  INCLUDE ../ext/m
67d0: 69 73 63 2f 7a 69 70 66 69 6c 65 2e 63 0a 49 4e  isc/zipfile.c.IN
67e0: 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73  CLUDE ../ext/mis
67f0: 63 2f 73 71 6c 61 72 2e 63 0a 23 65 6e 64 69 66  c/sqlar.c.#endif
6800: 0a 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f  .INCLUDE ../ext/
6810: 65 78 70 65 72 74 2f 73 71 6c 69 74 65 33 65 78  expert/sqlite3ex
6820: 70 65 72 74 2e 68 0a 49 4e 43 4c 55 44 45 20 2e  pert.h.INCLUDE .
6830: 2e 2f 65 78 74 2f 65 78 70 65 72 74 2f 73 71 6c  ./ext/expert/sql
6840: 69 74 65 33 65 78 70 65 72 74 2e 63 0a 0a 23 69  ite3expert.c..#i
6850: 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
6860: 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29  _ENABLE_SESSION)
6870: 0a 2f 2a 0a 2a 2a 20 53 74 61 74 65 20 69 6e 66  ./*.** State inf
6880: 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 73  ormation for a s
6890: 69 6e 67 6c 65 20 6f 70 65 6e 20 73 65 73 73 69  ingle open sessi
68a0: 6f 6e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74  on.*/.typedef st
68b0: 72 75 63 74 20 4f 70 65 6e 53 65 73 73 69 6f 6e  ruct OpenSession
68c0: 20 4f 70 65 6e 53 65 73 73 69 6f 6e 3b 0a 73 74   OpenSession;.st
68d0: 72 75 63 74 20 4f 70 65 6e 53 65 73 73 69 6f 6e  ruct OpenSession
68e0: 20 7b 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65   {.  char *zName
68f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
6900: 20 53 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 66   Symbolic name f
6910: 6f 72 20 74 68 69 73 20 73 65 73 73 69 6f 6e 20  or this session 
6920: 2a 2f 0a 20 20 69 6e 74 20 6e 46 69 6c 74 65 72  */.  int nFilter
6930: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
6940: 20 4e 75 6d 62 65 72 20 6f 66 20 78 46 69 6c 74   Number of xFilt
6950: 65 72 20 72 65 6a 65 63 74 69 6f 6e 20 47 4c 4f  er rejection GLO
6960: 42 20 70 61 74 74 65 72 6e 73 20 2a 2f 0a 20 20  B patterns */.  
6970: 63 68 61 72 20 2a 2a 61 7a 46 69 6c 74 65 72 3b  char **azFilter;
6980: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
6990: 79 20 6f 66 20 78 46 69 6c 74 65 72 20 72 65 6a  y of xFilter rej
69a0: 65 63 74 69 6f 6e 20 47 4c 4f 42 20 70 61 74 74  ection GLOB patt
69b0: 65 72 6e 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  erns */.  sqlite
69c0: 33 5f 73 65 73 73 69 6f 6e 20 2a 70 3b 20 20 20  3_session *p;   
69d0: 20 20 20 2f 2a 20 54 68 65 20 6f 70 65 6e 20 73     /* The open s
69e0: 65 73 73 69 6f 6e 20 2a 2f 0a 7d 3b 0a 23 65 6e  ession */.};.#en
69f0: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53 68 65 6c 6c  dif../*.** Shell
6a00: 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 69 6e 66   output mode inf
6a10: 6f 72 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 62 65  ormation from be
6a20: 66 6f 72 65 20 22 2e 65 78 70 6c 61 69 6e 20 6f  fore ".explain o
6a30: 6e 22 2c 0a 2a 2a 20 73 61 76 65 64 20 73 6f 20  n",.** saved so 
6a40: 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 20 72  that it can be r
6a50: 65 73 74 6f 72 65 64 20 62 79 20 22 2e 65 78 70  estored by ".exp
6a60: 6c 61 69 6e 20 6f 66 66 22 0a 2a 2f 0a 74 79 70  lain off".*/.typ
6a70: 65 64 65 66 20 73 74 72 75 63 74 20 53 61 76 65  edef struct Save
6a80: 64 4d 6f 64 65 49 6e 66 6f 20 53 61 76 65 64 4d  dModeInfo SavedM
6a90: 6f 64 65 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20  odeInfo;.struct 
6aa0: 53 61 76 65 64 4d 6f 64 65 49 6e 66 6f 20 7b 0a  SavedModeInfo {.
6ab0: 20 20 69 6e 74 20 76 61 6c 69 64 3b 20 20 20 20    int valid;    
6ac0: 20 20 20 20 20 20 2f 2a 20 49 73 20 74 68 65 72        /* Is ther
6ad0: 65 20 6c 65 67 69 74 20 64 61 74 61 20 69 6e 20  e legit data in 
6ae0: 68 65 72 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 6d  here? */.  int m
6af0: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ode;           /
6b00: 2a 20 4d 6f 64 65 20 70 72 69 6f 72 20 74 6f 20  * Mode prior to 
6b10: 22 2e 65 78 70 6c 61 69 6e 20 6f 6e 22 20 2a 2f  ".explain on" */
6b20: 0a 20 20 69 6e 74 20 73 68 6f 77 48 65 61 64 65  .  int showHeade
6b30: 72 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 22 2e  r;     /* The ".
6b40: 68 65 61 64 65 72 22 20 73 65 74 74 69 6e 67 20  header" setting 
6b50: 70 72 69 6f 72 20 74 6f 20 22 2e 65 78 70 6c 61  prior to ".expla
6b60: 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74 20  in on" */.  int 
6b70: 63 6f 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20 20  colWidth[100];  
6b80: 2f 2a 20 43 6f 6c 75 6d 6e 20 77 69 64 74 68 73  /* Column widths
6b90: 20 70 72 69 6f 72 20 74 6f 20 22 2e 65 78 70 6c   prior to ".expl
6ba0: 61 69 6e 20 6f 6e 22 20 2a 2f 0a 7d 3b 0a 0a 74  ain on" */.};..t
6bb0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 45 78  ypedef struct Ex
6bc0: 70 65 72 74 49 6e 66 6f 20 45 78 70 65 72 74 49  pertInfo ExpertI
6bd0: 6e 66 6f 3b 0a 73 74 72 75 63 74 20 45 78 70 65  nfo;.struct Expe
6be0: 72 74 49 6e 66 6f 20 7b 0a 20 20 73 71 6c 69 74  rtInfo {.  sqlit
6bf0: 65 33 65 78 70 65 72 74 20 2a 70 45 78 70 65 72  e3expert *pExper
6c00: 74 3b 0a 20 20 69 6e 74 20 62 56 65 72 62 6f 73  t;.  int bVerbos
6c10: 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 61  e;.};../*.** Sta
6c20: 74 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  te information a
6c30: 62 6f 75 74 20 74 68 65 20 64 61 74 61 62 61 73  bout the databas
6c40: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20  e connection is 
6c50: 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 61 6e 0a  contained in an.
6c60: 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  ** instance of t
6c70: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72  he following str
6c80: 75 63 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64  ucture..*/.typed
6c90: 65 66 20 73 74 72 75 63 74 20 53 68 65 6c 6c 53  ef struct ShellS
6ca0: 74 61 74 65 20 53 68 65 6c 6c 53 74 61 74 65 3b  tate ShellState;
6cb0: 0a 73 74 72 75 63 74 20 53 68 65 6c 6c 53 74 61  .struct ShellSta
6cc0: 74 65 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  te {.  sqlite3 *
6cd0: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  db;           /*
6ce0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   The database */
6cf0: 0a 20 20 75 38 20 61 75 74 6f 45 78 70 6c 61 69  .  u8 autoExplai
6d00: 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 75 74  n;        /* Aut
6d10: 6f 6d 61 74 69 63 61 6c 6c 79 20 74 75 72 6e 20  omatically turn 
6d20: 6f 6e 20 2e 65 78 70 6c 61 69 6e 20 6d 6f 64 65  on .explain mode
6d30: 20 2a 2f 0a 20 20 75 38 20 61 75 74 6f 45 51 50   */.  u8 autoEQP
6d40: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
6d50: 52 75 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52  Run EXPLAIN QUER
6d60: 59 20 50 4c 41 4e 20 70 72 69 6f 72 20 74 6f 20  Y PLAN prior to 
6d70: 73 65 61 63 68 20 53 51 4c 20 73 74 6d 74 20 2a  seach SQL stmt *
6d80: 2f 0a 20 20 75 38 20 73 74 61 74 73 4f 6e 3b 20  /.  u8 statsOn; 
6d90: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
6da0: 75 65 20 74 6f 20 64 69 73 70 6c 61 79 20 6d 65  ue to display me
6db0: 6d 6f 72 79 20 73 74 61 74 73 20 62 65 66 6f 72  mory stats befor
6dc0: 65 20 65 61 63 68 20 66 69 6e 61 6c 69 7a 65 20  e each finalize 
6dd0: 2a 2f 0a 20 20 75 38 20 73 63 61 6e 73 74 61 74  */.  u8 scanstat
6de0: 73 4f 6e 3b 20 20 20 20 20 20 20 20 2f 2a 20 54  sOn;        /* T
6df0: 72 75 65 20 74 6f 20 64 69 73 70 6c 61 79 20 73  rue to display s
6e00: 63 61 6e 20 73 74 61 74 73 20 62 65 66 6f 72 65  can stats before
6e10: 20 65 61 63 68 20 66 69 6e 61 6c 69 7a 65 20 2a   each finalize *
6e20: 2f 0a 20 20 75 38 20 6f 70 65 6e 4d 6f 64 65 3b  /.  u8 openMode;
6e30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 48             /* SH
6e40: 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41 4c 2c  ELL_OPEN_NORMAL,
6e50: 20 5f 41 50 50 45 4e 44 56 46 53 2c 20 6f 72 20   _APPENDVFS, or 
6e60: 5f 5a 49 50 46 49 4c 45 20 2a 2f 0a 20 20 75 38  _ZIPFILE */.  u8
6e70: 20 64 6f 58 64 67 4f 70 65 6e 3b 20 20 20 20 20   doXdgOpen;     
6e80: 20 20 20 20 20 2f 2a 20 49 6e 76 6f 6b 65 20 73       /* Invoke s
6e90: 74 61 72 74 2f 6f 70 65 6e 2f 78 64 67 2d 6f 70  tart/open/xdg-op
6ea0: 65 6e 20 69 6e 20 6f 75 74 70 75 74 5f 72 65 73  en in output_res
6eb0: 65 74 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6f 75  et() */.  int ou
6ec0: 74 43 6f 75 6e 74 3b 20 20 20 20 20 20 20 20 20  tCount;         
6ed0: 20 2f 2a 20 52 65 76 65 72 74 20 74 6f 20 73 74   /* Revert to st
6ee0: 64 6f 75 74 20 77 68 65 6e 20 72 65 61 63 68 69  dout when reachi
6ef0: 6e 67 20 7a 65 72 6f 20 2a 2f 0a 20 20 69 6e 74  ng zero */.  int
6f00: 20 63 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20   cnt;           
6f10: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
6f20: 20 72 65 63 6f 72 64 73 20 64 69 73 70 6c 61 79   records display
6f30: 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 46  ed so far */.  F
6f40: 49 4c 45 20 2a 6f 75 74 3b 20 20 20 20 20 20 20  ILE *out;       
6f50: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 72        /* Write r
6f60: 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a 20  esults here */. 
6f70: 20 46 49 4c 45 20 2a 74 72 61 63 65 4f 75 74 3b   FILE *traceOut;
6f80: 20 20 20 20 20 20 20 20 2f 2a 20 4f 75 74 70 75          /* Outpu
6f90: 74 20 66 6f 72 20 73 71 6c 69 74 65 33 5f 74 72  t for sqlite3_tr
6fa0: 61 63 65 28 29 20 2a 2f 0a 20 20 69 6e 74 20 6e  ace() */.  int n
6fb0: 45 72 72 3b 20 20 20 20 20 20 20 20 20 20 20 20  Err;            
6fc0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
6fd0: 72 72 6f 72 73 20 73 65 65 6e 20 2a 2f 0a 20 20  rrors seen */.  
6fe0: 69 6e 74 20 6d 6f 64 65 3b 20 20 20 20 20 20 20  int mode;       
6ff0: 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 75 74         /* An out
7000: 70 75 74 20 6d 6f 64 65 20 73 65 74 74 69 6e 67  put mode setting
7010: 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64 65 50 72   */.  int modePr
7020: 69 6f 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ior;         /* 
7030: 53 61 76 65 64 20 6d 6f 64 65 20 2a 2f 0a 20 20  Saved mode */.  
7040: 69 6e 74 20 63 4d 6f 64 65 3b 20 20 20 20 20 20  int cMode;      
7050: 20 20 20 20 20 20 20 2f 2a 20 74 65 6d 70 6f 72         /* tempor
7060: 61 72 79 20 6f 75 74 70 75 74 20 6d 6f 64 65 20  ary output mode 
7070: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20  for the current 
7080: 71 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e  query */.  int n
7090: 6f 72 6d 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20  ormalMode;      
70a0: 20 20 2f 2a 20 4f 75 74 70 75 74 20 6d 6f 64 65    /* Output mode
70b0: 20 62 65 66 6f 72 65 20 22 2e 65 78 70 6c 61 69   before ".explai
70c0: 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74 20 77  n on" */.  int w
70d0: 72 69 74 61 62 6c 65 53 63 68 65 6d 61 3b 20 20  ritableSchema;  
70e0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 50 52 41    /* True if PRA
70f0: 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68  GMA writable_sch
7100: 65 6d 61 3d 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20  ema=ON */.  int 
7110: 73 68 6f 77 48 65 61 64 65 72 3b 20 20 20 20 20  showHeader;     
7120: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 68     /* True to sh
7130: 6f 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ow column names 
7140: 69 6e 20 4c 69 73 74 20 6f 72 20 43 6f 6c 75 6d  in List or Colum
7150: 6e 20 6d 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  n mode */.  int 
7160: 6e 43 68 65 63 6b 3b 20 20 20 20 20 20 20 20 20  nCheck;         
7170: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7180: 22 2e 63 68 65 63 6b 22 20 63 6f 6d 6d 61 6e 64  ".check" command
7190: 73 20 72 75 6e 20 2a 2f 0a 20 20 75 6e 73 69 67  s run */.  unsig
71a0: 6e 65 64 20 73 68 65 6c 6c 46 6c 67 73 3b 20 20  ned shellFlgs;  
71b0: 20 20 2f 2a 20 56 61 72 69 6f 75 73 20 66 6c 61    /* Various fla
71c0: 67 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44  gs */.  char *zD
71d0: 65 73 74 54 61 62 6c 65 3b 20 20 20 20 20 20 2f  estTable;      /
71e0: 2a 20 4e 61 6d 65 20 6f 66 20 64 65 73 74 69 6e  * Name of destin
71f0: 61 74 69 6f 6e 20 74 61 62 6c 65 20 77 68 65 6e  ation table when
7200: 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20 2a 2f 0a   MODE_Insert */.
7210: 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 46 69 6c    char *zTempFil
7220: 65 3b 20 20 20 20 20 20 20 2f 2a 20 54 65 6d 70  e;       /* Temp
7230: 6f 72 61 72 79 20 66 69 6c 65 20 74 68 61 74 20  orary file that 
7240: 6d 69 67 68 74 20 6e 65 65 64 20 64 65 6c 65 74  might need delet
7250: 69 6e 67 20 2a 2f 0a 20 20 63 68 61 72 20 7a 54  ing */.  char zT
7260: 65 73 74 63 61 73 65 5b 33 30 5d 3b 20 20 20 20  estcase[30];    
7270: 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 75 72 72 65  /* Name of curre
7280: 6e 74 20 74 65 73 74 20 63 61 73 65 20 2a 2f 0a  nt test case */.
7290: 20 20 63 68 61 72 20 63 6f 6c 53 65 70 61 72 61    char colSepara
72a0: 74 6f 72 5b 32 30 5d 3b 20 2f 2a 20 43 6f 6c 75  tor[20]; /* Colu
72b0: 6d 6e 20 73 65 70 61 72 61 74 6f 72 20 63 68 61  mn separator cha
72c0: 72 61 63 74 65 72 20 66 6f 72 20 73 65 76 65 72  racter for sever
72d0: 61 6c 20 6d 6f 64 65 73 20 2a 2f 0a 20 20 63 68  al modes */.  ch
72e0: 61 72 20 72 6f 77 53 65 70 61 72 61 74 6f 72 5b  ar rowSeparator[
72f0: 32 30 5d 3b 20 2f 2a 20 52 6f 77 20 73 65 70 61  20]; /* Row sepa
7300: 72 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 20  rator character 
7310: 66 6f 72 20 4d 4f 44 45 5f 41 73 63 69 69 20 2a  for MODE_Ascii *
7320: 2f 0a 20 20 63 68 61 72 20 63 6f 6c 53 65 70 50  /.  char colSepP
7330: 72 69 6f 72 5b 32 30 5d 3b 20 20 2f 2a 20 53 61  rior[20];  /* Sa
7340: 76 65 64 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72  ved column separ
7350: 61 74 6f 72 20 2a 2f 0a 20 20 63 68 61 72 20 72  ator */.  char r
7360: 6f 77 53 65 70 50 72 69 6f 72 5b 32 30 5d 3b 20  owSepPrior[20]; 
7370: 20 2f 2a 20 53 61 76 65 64 20 72 6f 77 20 73 65   /* Saved row se
7380: 70 61 72 61 74 6f 72 20 2a 2f 0a 20 20 69 6e 74  parator */.  int
7390: 20 63 6f 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20   colWidth[100]; 
73a0: 20 20 20 20 2f 2a 20 52 65 71 75 65 73 74 65 64      /* Requested
73b0: 20 77 69 64 74 68 20 6f 66 20 65 61 63 68 20 63   width of each c
73c0: 6f 6c 75 6d 6e 20 77 68 65 6e 20 69 6e 20 63 6f  olumn when in co
73d0: 6c 75 6d 6e 20 6d 6f 64 65 2a 2f 0a 20 20 69 6e  lumn mode*/.  in
73e0: 74 20 61 63 74 75 61 6c 57 69 64 74 68 5b 31 30  t actualWidth[10
73f0: 30 5d 3b 20 20 2f 2a 20 41 63 74 75 61 6c 20 77  0];  /* Actual w
7400: 69 64 74 68 20 6f 66 20 65 61 63 68 20 63 6f 6c  idth of each col
7410: 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 6e 75  umn */.  char nu
7420: 6c 6c 56 61 6c 75 65 5b 32 30 5d 3b 20 20 20 20  llValue[20];    
7430: 2f 2a 20 54 68 65 20 74 65 78 74 20 74 6f 20 70  /* The text to p
7440: 72 69 6e 74 20 77 68 65 6e 20 61 20 4e 55 4c 4c  rint when a NULL
7450: 20 63 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f 6d   comes back from
7460: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7470: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65            ** the
7480: 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63   database */.  c
7490: 68 61 72 20 6f 75 74 66 69 6c 65 5b 46 49 4c 45  har outfile[FILE
74a0: 4e 41 4d 45 5f 4d 41 58 5d 3b 20 2f 2a 20 46 69  NAME_MAX]; /* Fi
74b0: 6c 65 6e 61 6d 65 20 66 6f 72 20 2a 6f 75 74 20  lename for *out 
74c0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
74d0: 2a 7a 44 62 46 69 6c 65 6e 61 6d 65 3b 20 20 20  *zDbFilename;   
74e0: 20 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20   /* name of the 
74f0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
7500: 0a 20 20 63 68 61 72 20 2a 7a 46 72 65 65 4f 6e  .  char *zFreeOn
7510: 43 6c 6f 73 65 3b 20 20 20 20 20 20 20 20 20 2f  Close;         /
7520: 2a 20 46 69 6c 65 6e 61 6d 65 20 74 6f 20 66 72  * Filename to fr
7530: 65 65 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20  ee when closing 
7540: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
7550: 2a 7a 56 66 73 3b 20 20 20 20 20 20 20 20 20 20  *zVfs;          
7560: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53 20   /* Name of VFS 
7570: 74 6f 20 75 73 65 20 2a 2f 0a 20 20 73 71 6c 69  to use */.  sqli
7580: 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
7590: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 74     /* Current st
75a0: 61 74 65 6d 65 6e 74 20 69 66 20 61 6e 79 2e 20  atement if any. 
75b0: 2a 2f 0a 20 20 46 49 4c 45 20 2a 70 4c 6f 67 3b  */.  FILE *pLog;
75c0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57              /* W
75d0: 72 69 74 65 20 6c 6f 67 20 6f 75 74 70 75 74 20  rite log output 
75e0: 68 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61  here */.  int *a
75f0: 69 49 6e 64 65 6e 74 3b 20 20 20 20 20 20 20 20  iIndent;        
7600: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 69 6e 64   /* Array of ind
7610: 65 6e 74 73 20 75 73 65 64 20 69 6e 20 4d 4f 44  ents used in MOD
7620: 45 5f 45 78 70 6c 61 69 6e 20 2a 2f 0a 20 20 69  E_Explain */.  i
7630: 6e 74 20 6e 49 6e 64 65 6e 74 3b 20 20 20 20 20  nt nIndent;     
7640: 20 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66        /* Size of
7650: 20 61 72 72 61 79 20 61 69 49 6e 64 65 6e 74 5b   array aiIndent[
7660: 5d 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65  ] */.  int iInde
7670: 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  nt;           /*
7680: 20 49 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e   Index of curren
7690: 74 20 6f 70 20 69 6e 20 61 69 49 6e 64 65 6e 74  t op in aiIndent
76a0: 5b 5d 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  [] */.#if define
76b0: 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
76c0: 53 45 53 53 49 4f 4e 29 0a 20 20 69 6e 74 20 6e  SESSION).  int n
76d0: 53 65 73 73 69 6f 6e 3b 20 20 20 20 20 20 20 20  Session;        
76e0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
76f0: 66 20 61 63 74 69 76 65 20 73 65 73 73 69 6f 6e  f active session
7700: 73 20 2a 2f 0a 20 20 4f 70 65 6e 53 65 73 73 69  s */.  OpenSessi
7710: 6f 6e 20 61 53 65 73 73 69 6f 6e 5b 34 5d 3b 20  on aSession[4]; 
7720: 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 65 73   /* Array of ses
7730: 73 69 6f 6e 73 2e 20 20 5b 30 5d 20 69 73 20 69  sions.  [0] is i
7740: 6e 20 66 6f 63 75 73 2e 20 2a 2f 0a 23 65 6e 64  n focus. */.#end
7750: 69 66 0a 20 20 45 78 70 65 72 74 49 6e 66 6f 20  if.  ExpertInfo 
7760: 65 78 70 65 72 74 3b 20 20 20 20 20 20 20 20 2f  expert;        /
7770: 2a 20 56 61 6c 69 64 20 69 66 20 70 72 65 76 69  * Valid if previ
7780: 6f 75 73 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20  ous command was 
7790: 22 2e 65 78 70 65 72 74 20 4f 50 54 2e 2e 2e 22  ".expert OPT..."
77a0: 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 20 41 6c 6c 6f   */.};.../* Allo
77b0: 77 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20 53  wed values for S
77c0: 68 65 6c 6c 53 74 61 74 65 2e 61 75 74 6f 45 51  hellState.autoEQ
77d0: 50 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 41 55 54  P.*/.#define AUT
77e0: 4f 45 51 50 5f 6f 66 66 20 20 20 20 20 20 30 0a  OEQP_off      0.
77f0: 23 64 65 66 69 6e 65 20 41 55 54 4f 45 51 50 5f  #define AUTOEQP_
7800: 6f 6e 20 20 20 20 20 20 20 31 0a 23 64 65 66 69  on       1.#defi
7810: 6e 65 20 41 55 54 4f 45 51 50 5f 74 72 69 67 67  ne AUTOEQP_trigg
7820: 65 72 20 20 32 0a 23 64 65 66 69 6e 65 20 41 55  er  2.#define AU
7830: 54 4f 45 51 50 5f 66 75 6c 6c 20 20 20 20 20 33  TOEQP_full     3
7840: 0a 0a 2f 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c  ../* Allowed val
7850: 75 65 73 20 66 6f 72 20 53 68 65 6c 6c 53 74 61  ues for ShellSta
7860: 74 65 2e 6f 70 65 6e 4d 6f 64 65 0a 2a 2f 0a 23  te.openMode.*/.#
7870: 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45  define SHELL_OPE
7880: 4e 5f 55 4e 53 50 45 43 20 20 20 20 20 30 20 20  N_UNSPEC     0  
7890: 20 20 20 20 2f 2a 20 4e 6f 20 6f 70 65 6e 2d 6d      /* No open-m
78a0: 6f 64 65 20 73 70 65 63 69 66 69 65 64 20 2a 2f  ode specified */
78b0: 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f  .#define SHELL_O
78c0: 50 45 4e 5f 4e 4f 52 4d 41 4c 20 20 20 20 20 31  PEN_NORMAL     1
78d0: 20 20 20 20 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20        /* Normal 
78e0: 64 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f  database file */
78f0: 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f  .#define SHELL_O
7900: 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 20 20 32  PEN_APPENDVFS  2
7910: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 61 70 70        /* Use app
7920: 65 6e 64 76 66 73 20 2a 2f 0a 23 64 65 66 69 6e  endvfs */.#defin
7930: 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50  e SHELL_OPEN_ZIP
7940: 46 49 4c 45 20 20 20 20 33 20 20 20 20 20 20 2f  FILE    3      /
7950: 2a 20 55 73 65 20 74 68 65 20 7a 69 70 66 69 6c  * Use the zipfil
7960: 65 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20  e virtual table 
7970: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 45 4c 4c  */.#define SHELL
7980: 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 20 20  _OPEN_READONLY  
7990: 20 34 20 20 20 20 20 20 2f 2a 20 4f 70 65 6e 20   4      /* Open 
79a0: 61 20 6e 6f 72 6d 61 6c 20 64 61 74 61 62 61 73  a normal databas
79b0: 65 20 72 65 61 64 2d 6f 6e 6c 79 20 2a 2f 0a 0a  e read-only */..
79c0: 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20  /*.** These are 
79d0: 74 68 65 20 61 6c 6c 6f 77 65 64 20 73 68 65 6c  the allowed shel
79e0: 6c 46 6c 67 73 20 76 61 6c 75 65 73 0a 2a 2f 0a  lFlgs values.*/.
79f0: 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 50 61  #define SHFLG_Pa
7a00: 67 65 63 61 63 68 65 20 20 20 20 20 20 30 78 30  gecache      0x0
7a10: 30 30 30 30 30 30 31 20 2f 2a 20 54 68 65 20 2d  0000001 /* The -
7a20: 2d 70 61 67 65 63 61 63 68 65 20 6f 70 74 69 6f  -pagecache optio
7a30: 6e 20 69 73 20 75 73 65 64 20 2a 2f 0a 23 64 65  n is used */.#de
7a40: 66 69 6e 65 20 53 48 46 4c 47 5f 4c 6f 6f 6b 61  fine SHFLG_Looka
7a50: 73 69 64 65 20 20 20 20 20 20 30 78 30 30 30 30  side      0x0000
7a60: 30 30 30 32 20 2f 2a 20 4c 6f 6f 6b 61 73 69 64  0002 /* Lookasid
7a70: 65 20 6d 65 6d 6f 72 79 20 69 73 20 75 73 65 64  e memory is used
7a80: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c   */.#define SHFL
7a90: 47 5f 42 61 63 6b 73 6c 61 73 68 20 20 20 20 20  G_Backslash     
7aa0: 20 30 78 30 30 30 30 30 30 30 34 20 2f 2a 20 54   0x00000004 /* T
7ab0: 68 65 20 2d 2d 62 61 63 6b 73 6c 61 73 68 20 6f  he --backslash o
7ac0: 70 74 69 6f 6e 20 69 73 20 75 73 65 64 20 2a 2f  ption is used */
7ad0: 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 50  .#define SHFLG_P
7ae0: 72 65 73 65 72 76 65 52 6f 77 69 64 20 20 30 78  reserveRowid  0x
7af0: 30 30 30 30 30 30 30 38 20 2f 2a 20 2e 64 75 6d  00000008 /* .dum
7b00: 70 20 70 72 65 73 65 72 76 65 73 20 72 6f 77 69  p preserves rowi
7b10: 64 20 76 61 6c 75 65 73 20 2a 2f 0a 23 64 65 66  d values */.#def
7b20: 69 6e 65 20 53 48 46 4c 47 5f 4e 65 77 6c 69 6e  ine SHFLG_Newlin
7b30: 65 73 20 20 20 20 20 20 20 30 78 30 30 30 30 30  es       0x00000
7b40: 30 31 30 20 2f 2a 20 2e 64 75 6d 70 20 2d 2d 6e  010 /* .dump --n
7b50: 65 77 6c 69 6e 65 20 66 6c 61 67 20 2a 2f 0a 23  ewline flag */.#
7b60: 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 43 6f 75  define SHFLG_Cou
7b70: 6e 74 43 68 61 6e 67 65 73 20 20 20 30 78 30 30  ntChanges   0x00
7b80: 30 30 30 30 32 30 20 2f 2a 20 2e 63 68 61 6e 67  000020 /* .chang
7b90: 65 73 20 73 65 74 74 69 6e 67 20 2a 2f 0a 23 64  es setting */.#d
7ba0: 65 66 69 6e 65 20 53 48 46 4c 47 5f 45 63 68 6f  efine SHFLG_Echo
7bb0: 20 20 20 20 20 20 20 20 20 20 20 30 78 30 30 30             0x000
7bc0: 30 30 30 34 30 20 2f 2a 20 2e 65 63 68 6f 20 6f  00040 /* .echo o
7bd0: 72 20 2d 2d 65 63 68 6f 20 73 65 74 74 69 6e 67  r --echo setting
7be0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f   */../*.** Macro
7bf0: 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e  s for testing an
7c00: 64 20 73 65 74 74 69 6e 67 20 73 68 65 6c 6c 46  d setting shellF
7c10: 6c 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  lgs.*/.#define S
7c20: 68 65 6c 6c 48 61 73 46 6c 61 67 28 50 2c 58 29  hellHasFlag(P,X)
7c30: 20 20 20 20 28 28 28 50 29 2d 3e 73 68 65 6c 6c      (((P)->shell
7c40: 46 6c 67 73 20 26 20 28 58 29 29 21 3d 30 29 0a  Flgs & (X))!=0).
7c50: 23 64 65 66 69 6e 65 20 53 68 65 6c 6c 53 65 74  #define ShellSet
7c60: 46 6c 61 67 28 50 2c 58 29 20 20 20 20 28 28 50  Flag(P,X)    ((P
7c70: 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 7c 3d 28 58  )->shellFlgs|=(X
7c80: 29 29 0a 23 64 65 66 69 6e 65 20 53 68 65 6c 6c  )).#define Shell
7c90: 43 6c 65 61 72 46 6c 61 67 28 50 2c 58 29 20 20  ClearFlag(P,X)  
7ca0: 28 28 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 26  ((P)->shellFlgs&
7cb0: 3d 28 7e 28 58 29 29 29 0a 0a 2f 2a 0a 2a 2a 20  =(~(X)))../*.** 
7cc0: 54 68 65 73 65 20 61 72 65 20 74 68 65 20 61 6c  These are the al
7cd0: 6c 6f 77 65 64 20 6d 6f 64 65 73 2e 0a 2a 2f 0a  lowed modes..*/.
7ce0: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 4c 69 6e  #define MODE_Lin
7cf0: 65 20 20 20 20 20 30 20 20 2f 2a 20 4f 6e 65 20  e     0  /* One 
7d00: 63 6f 6c 75 6d 6e 20 70 65 72 20 6c 69 6e 65 2e  column per line.
7d10: 20 20 42 6c 61 6e 6b 20 6c 69 6e 65 20 62 65 74    Blank line bet
7d20: 77 65 65 6e 20 72 65 63 6f 72 64 73 20 2a 2f 0a  ween records */.
7d30: 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 43 6f 6c  #define MODE_Col
7d40: 75 6d 6e 20 20 20 31 20 20 2f 2a 20 4f 6e 65 20  umn   1  /* One 
7d50: 72 65 63 6f 72 64 20 70 65 72 20 6c 69 6e 65 20  record per line 
7d60: 69 6e 20 6e 65 61 74 20 63 6f 6c 75 6d 6e 73 20  in neat columns 
7d70: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
7d80: 4c 69 73 74 20 20 20 20 20 32 20 20 2f 2a 20 4f  List     2  /* O
7d90: 6e 65 20 72 65 63 6f 72 64 20 70 65 72 20 6c 69  ne record per li
7da0: 6e 65 20 77 69 74 68 20 61 20 73 65 70 61 72 61  ne with a separa
7db0: 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  tor */.#define M
7dc0: 4f 44 45 5f 53 65 6d 69 20 20 20 20 20 33 20 20  ODE_Semi     3  
7dd0: 2f 2a 20 53 61 6d 65 20 61 73 20 4d 4f 44 45 5f  /* Same as MODE_
7de0: 4c 69 73 74 20 62 75 74 20 61 70 70 65 6e 64 20  List but append 
7df0: 22 3b 22 20 74 6f 20 65 61 63 68 20 6c 69 6e 65  ";" to each line
7e00: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
7e10: 5f 48 74 6d 6c 20 20 20 20 20 34 20 20 2f 2a 20  _Html     4  /* 
7e20: 47 65 6e 65 72 61 74 65 20 61 6e 20 58 48 54 4d  Generate an XHTM
7e30: 4c 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69  L table */.#defi
7e40: 6e 65 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20 20  ne MODE_Insert  
7e50: 20 35 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20   5  /* Generate 
7e60: 53 51 4c 20 22 69 6e 73 65 72 74 22 20 73 74 61  SQL "insert" sta
7e70: 74 65 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69  tements */.#defi
7e80: 6e 65 20 4d 4f 44 45 5f 51 75 6f 74 65 20 20 20  ne MODE_Quote   
7e90: 20 36 20 20 2f 2a 20 51 75 6f 74 65 20 76 61 6c   6  /* Quote val
7ea0: 75 65 73 20 61 73 20 66 6f 72 20 53 51 4c 20 2a  ues as for SQL *
7eb0: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 54  /.#define MODE_T
7ec0: 63 6c 20 20 20 20 20 20 37 20 20 2f 2a 20 47 65  cl      7  /* Ge
7ed0: 6e 65 72 61 74 65 20 41 4e 53 49 2d 43 20 6f 72  nerate ANSI-C or
7ee0: 20 54 43 4c 20 71 75 6f 74 65 64 20 65 6c 65 6d   TCL quoted elem
7ef0: 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  ents */.#define 
7f00: 4d 4f 44 45 5f 43 73 76 20 20 20 20 20 20 38 20  MODE_Csv      8 
7f10: 20 2f 2a 20 51 75 6f 74 65 20 73 74 72 69 6e 67   /* Quote string
7f20: 73 2c 20 6e 75 6d 62 65 72 73 20 61 72 65 20 70  s, numbers are p
7f30: 6c 61 69 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20  lain */.#define 
7f40: 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 20 39 20  MODE_Explain  9 
7f50: 20 2f 2a 20 4c 69 6b 65 20 4d 4f 44 45 5f 43 6f   /* Like MODE_Co
7f60: 6c 75 6d 6e 2c 20 62 75 74 20 64 6f 20 6e 6f 74  lumn, but do not
7f70: 20 74 72 75 6e 63 61 74 65 20 64 61 74 61 20 2a   truncate data *
7f80: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 41  /.#define MODE_A
7f90: 73 63 69 69 20 20 20 31 30 20 20 2f 2a 20 55 73  scii   10  /* Us
7fa0: 65 20 41 53 43 49 49 20 75 6e 69 74 20 61 6e 64  e ASCII unit and
7fb0: 20 72 65 63 6f 72 64 20 73 65 70 61 72 61 74 6f   record separato
7fc0: 72 73 20 28 30 78 31 46 2f 30 78 31 45 29 20 2a  rs (0x1F/0x1E) *
7fd0: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 50  /.#define MODE_P
7fe0: 72 65 74 74 79 20 20 31 31 20 20 2f 2a 20 50 72  retty  11  /* Pr
7ff0: 65 74 74 79 2d 70 72 69 6e 74 20 73 63 68 65 6d  etty-print schem
8000: 61 73 20 2a 2f 0a 0a 73 74 61 74 69 63 20 63 6f  as */..static co
8010: 6e 73 74 20 63 68 61 72 20 2a 6d 6f 64 65 44 65  nst char *modeDe
8020: 73 63 72 5b 5d 20 3d 20 7b 0a 20 20 22 6c 69 6e  scr[] = {.  "lin
8030: 65 22 2c 0a 20 20 22 63 6f 6c 75 6d 6e 22 2c 0a  e",.  "column",.
8040: 20 20 22 6c 69 73 74 22 2c 0a 20 20 22 73 65 6d    "list",.  "sem
8050: 69 22 2c 0a 20 20 22 68 74 6d 6c 22 2c 0a 20 20  i",.  "html",.  
8060: 22 69 6e 73 65 72 74 22 2c 0a 20 20 22 71 75 6f  "insert",.  "quo
8070: 74 65 22 2c 0a 20 20 22 74 63 6c 22 2c 0a 20 20  te",.  "tcl",.  
8080: 22 63 73 76 22 2c 0a 20 20 22 65 78 70 6c 61 69  "csv",.  "explai
8090: 6e 22 2c 0a 20 20 22 61 73 63 69 69 22 2c 0a 20  n",.  "ascii",. 
80a0: 20 22 70 72 65 74 74 79 70 72 69 6e 74 22 2c 0a   "prettyprint",.
80b0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  };../*.** These 
80c0: 61 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 2f 72  are the column/r
80d0: 6f 77 2f 6c 69 6e 65 20 73 65 70 61 72 61 74 6f  ow/line separato
80e0: 72 73 20 75 73 65 64 20 62 79 20 74 68 65 20 76  rs used by the v
80f0: 61 72 69 6f 75 73 0a 2a 2a 20 69 6d 70 6f 72 74  arious.** import
8100: 2f 65 78 70 6f 72 74 20 6d 6f 64 65 73 2e 0a 2a  /export modes..*
8110: 2f 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 43 6f  /.#define SEP_Co
8120: 6c 75 6d 6e 20 20 20 20 22 7c 22 0a 23 64 65 66  lumn    "|".#def
8130: 69 6e 65 20 53 45 50 5f 52 6f 77 20 20 20 20 20  ine SEP_Row     
8140: 20 20 22 5c 6e 22 0a 23 64 65 66 69 6e 65 20 53    "\n".#define S
8150: 45 50 5f 54 61 62 20 20 20 20 20 20 20 22 5c 74  EP_Tab       "\t
8160: 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 53 70  ".#define SEP_Sp
8170: 61 63 65 20 20 20 20 20 22 20 22 0a 23 64 65 66  ace     " ".#def
8180: 69 6e 65 20 53 45 50 5f 43 6f 6d 6d 61 20 20 20  ine SEP_Comma   
8190: 20 20 22 2c 22 0a 23 64 65 66 69 6e 65 20 53 45    ",".#define SE
81a0: 50 5f 43 72 4c 66 20 20 20 20 20 20 22 5c 72 5c  P_CrLf      "\r\
81b0: 6e 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 55  n".#define SEP_U
81c0: 6e 69 74 20 20 20 20 20 20 22 5c 78 31 46 22 0a  nit      "\x1F".
81d0: 23 64 65 66 69 6e 65 20 53 45 50 5f 52 65 63 6f  #define SEP_Reco
81e0: 72 64 20 20 20 20 22 5c 78 31 45 22 0a 0a 2f 2a  rd    "\x1E"../*
81f0: 0a 2a 2a 20 41 20 63 61 6c 6c 62 61 63 6b 20 66  .** A callback f
8200: 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6c  or the sqlite3_l
8210: 6f 67 28 29 20 69 6e 74 65 72 66 61 63 65 2e 0a  og() interface..
8220: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
8230: 68 65 6c 6c 4c 6f 67 28 76 6f 69 64 20 2a 70 41  hellLog(void *pA
8240: 72 67 2c 20 69 6e 74 20 69 45 72 72 43 6f 64 65  rg, int iErrCode
8250: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
8260: 73 67 29 7b 0a 20 20 53 68 65 6c 6c 53 74 61 74  sg){.  ShellStat
8270: 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61  e *p = (ShellSta
8280: 74 65 2a 29 70 41 72 67 3b 0a 20 20 69 66 28 20  te*)pArg;.  if( 
8290: 70 2d 3e 70 4c 6f 67 3d 3d 30 20 29 20 72 65 74  p->pLog==0 ) ret
82a0: 75 72 6e 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e  urn;.  utf8_prin
82b0: 74 66 28 70 2d 3e 70 4c 6f 67 2c 20 22 28 25 64  tf(p->pLog, "(%d
82c0: 29 20 25 73 5c 6e 22 2c 20 69 45 72 72 43 6f 64  ) %s\n", iErrCod
82d0: 65 2c 20 7a 4d 73 67 29 3b 0a 20 20 66 66 6c 75  e, zMsg);.  fflu
82e0: 73 68 28 70 2d 3e 70 4c 6f 67 29 3b 0a 7d 0a 0a  sh(p->pLog);.}..
82f0: 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69  /*.** SQL functi
8300: 6f 6e 3a 20 20 73 68 65 6c 6c 5f 70 75 74 73 6e  on:  shell_putsn
8310: 6c 28 58 29 0a 2a 2a 0a 2a 2a 20 57 72 69 74 65  l(X).**.** Write
8320: 20 74 68 65 20 74 65 78 74 20 58 20 74 6f 20 74   the text X to t
8330: 68 65 20 73 63 72 65 65 6e 20 28 6f 72 20 77 68  he screen (or wh
8340: 61 74 65 76 65 72 20 6f 75 74 70 75 74 20 69 73  atever output is
8350: 20 62 65 69 6e 67 20 64 69 72 65 63 74 65 64 29   being directed)
8360: 0a 2a 2a 20 61 64 64 69 6e 67 20 61 20 6e 65 77  .** adding a new
8370: 6c 69 6e 65 20 61 74 20 74 68 65 20 65 6e 64 2c  line at the end,
8380: 20 61 6e 64 20 74 68 65 6e 20 72 65 74 75 72 6e   and then return
8390: 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f   X..*/.static vo
83a0: 69 64 20 73 68 65 6c 6c 50 75 74 73 46 75 6e 63  id shellPutsFunc
83b0: 28 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74  (.  sqlite3_cont
83c0: 65 78 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74  ext *pCtx,.  int
83d0: 20 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33   nVal,.  sqlite3
83e0: 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29  _value **apVal.)
83f0: 7b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  {.  ShellState *
8400: 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 2a  p = (ShellState*
8410: 29 73 71 6c 69 74 65 33 5f 75 73 65 72 5f 64 61  )sqlite3_user_da
8420: 74 61 28 70 43 74 78 29 3b 0a 20 20 28 76 6f 69  ta(pCtx);.  (voi
8430: 64 29 6e 56 61 6c 3b 0a 20 20 75 74 66 38 5f 70  d)nVal;.  utf8_p
8440: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
8450: 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 76 61  s\n", sqlite3_va
8460: 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30  lue_text(apVal[0
8470: 5d 29 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72  ]));.  sqlite3_r
8480: 65 73 75 6c 74 5f 76 61 6c 75 65 28 70 43 74 78  esult_value(pCtx
8490: 2c 20 61 70 56 61 6c 5b 30 5d 29 3b 0a 7d 0a 0a  , apVal[0]);.}..
84a0: 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69  /*.** SQL functi
84b0: 6f 6e 3a 20 20 20 65 64 69 74 28 56 41 4c 55 45  on:   edit(VALUE
84c0: 29 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  ).**            
84d0: 20 20 20 20 20 65 64 69 74 28 56 41 4c 55 45 2c       edit(VALUE,
84e0: 45 44 49 54 4f 52 29 0a 2a 2a 0a 2a 2a 20 54 68  EDITOR).**.** Th
84f0: 65 73 65 20 73 74 65 70 73 3a 0a 2a 2a 0a 2a 2a  ese steps:.**.**
8500: 20 20 20 20 20 28 31 29 20 57 72 69 74 65 20 56       (1) Write V
8510: 41 4c 55 45 20 69 6e 74 6f 20 61 20 74 65 6d 70  ALUE into a temp
8520: 6f 72 61 72 79 20 66 69 6c 65 2e 0a 2a 2a 20 20  orary file..**  
8530: 20 20 20 28 32 29 20 52 75 6e 20 70 72 6f 67 72     (2) Run progr
8540: 61 6d 20 45 44 49 54 4f 52 20 6f 6e 20 74 68 61  am EDITOR on tha
8550: 74 20 74 65 6d 70 6f 72 61 72 79 20 66 69 6c 65  t temporary file
8560: 2e 0a 2a 2a 20 20 20 20 20 28 33 29 20 52 65 61  ..**     (3) Rea
8570: 64 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  d the temporary 
8580: 66 69 6c 65 20 62 61 63 6b 20 61 6e 64 20 72 65  file back and re
8590: 74 75 72 6e 20 69 74 73 20 63 6f 6e 74 65 6e 74  turn its content
85a0: 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 2e 0a   as the result..
85b0: 2a 2a 20 20 20 20 20 28 34 29 20 44 65 6c 65 74  **     (4) Delet
85c0: 65 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  e the temporary 
85d0: 66 69 6c 65 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  file.**.** If th
85e0: 65 20 45 44 49 54 4f 52 20 61 72 67 75 6d 65 6e  e EDITOR argumen
85f0: 74 20 69 73 20 6f 6d 69 74 74 65 64 2c 20 75 73  t is omitted, us
8600: 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74  e the value in t
8610: 68 65 20 56 49 53 55 41 4c 0a 2a 2a 20 65 6e 76  he VISUAL.** env
8620: 69 72 6f 6e 6d 65 6e 74 20 76 61 72 69 61 62 6c  ironment variabl
8630: 65 2e 20 20 49 66 20 73 74 69 6c 6c 20 74 68 65  e.  If still the
8640: 72 65 20 69 73 20 6e 6f 20 45 44 49 54 4f 52 2c  re is no EDITOR,
8650: 20 74 68 72 6f 75 67 68 20 61 6e 20 65 72 72 6f   through an erro
8660: 72 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 74 68  r..**.** Also th
8670: 72 6f 77 20 61 6e 20 65 72 72 6f 72 20 69 66 20  row an error if 
8680: 74 68 65 20 45 44 49 54 4f 52 20 70 72 6f 67 72  the EDITOR progr
8690: 61 6d 20 72 65 74 75 72 6e 73 20 61 20 6e 6f 6e  am returns a non
86a0: 2d 7a 65 72 6f 20 65 78 69 74 20 63 6f 64 65 2e  -zero exit code.
86b0: 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .*/.#ifndef SQLI
86c0: 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d  TE_NOHAVE_SYSTEM
86d0: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65 64 69  .static void edi
86e0: 74 46 75 6e 63 28 0a 20 20 73 71 6c 69 74 65 33  tFunc(.  sqlite3
86f0: 5f 63 6f 6e 74 65 78 74 20 2a 63 6f 6e 74 65 78  _context *contex
8700: 74 2c 0a 20 20 69 6e 74 20 61 72 67 63 2c 0a 20  t,.  int argc,. 
8710: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
8720: 2a 61 72 67 76 0a 29 7b 0a 20 20 63 6f 6e 73 74  *argv.){.  const
8730: 20 63 68 61 72 20 2a 7a 45 64 69 74 6f 72 3b 0a   char *zEditor;.
8740: 20 20 63 68 61 72 20 2a 7a 54 65 6d 70 46 69 6c    char *zTempFil
8750: 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  e = 0;.  sqlite3
8760: 20 2a 64 62 3b 0a 20 20 63 68 61 72 20 2a 7a 43   *db;.  char *zC
8770: 6d 64 20 3d 20 30 3b 0a 20 20 69 6e 74 20 62 42  md = 0;.  int bB
8780: 69 6e 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  in;.  int rc;.  
8790: 46 49 4c 45 20 2a 66 20 3d 20 30 3b 0a 20 20 73  FILE *f = 0;.  s
87a0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 73 7a 3b  qlite3_int64 sz;
87b0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
87c0: 20 78 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63   x;.  unsigned c
87d0: 68 61 72 20 2a 70 20 3d 20 30 3b 0a 0a 20 20 69  har *p = 0;..  i
87e0: 66 28 20 61 72 67 63 3d 3d 32 20 29 7b 0a 20 20  f( argc==2 ){.  
87f0: 20 20 7a 45 64 69 74 6f 72 20 3d 20 28 63 6f 6e    zEditor = (con
8800: 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
8810: 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 72 67 76  _value_text(argv
8820: 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  [1]);.  }else{. 
8830: 20 20 20 7a 45 64 69 74 6f 72 20 3d 20 67 65 74     zEditor = get
8840: 65 6e 76 28 22 56 49 53 55 41 4c 22 29 3b 0a 20  env("VISUAL");. 
8850: 20 7d 0a 20 20 69 66 28 20 7a 45 64 69 74 6f 72   }.  if( zEditor
8860: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
8870: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
8880: 63 6f 6e 74 65 78 74 2c 20 22 6e 6f 20 65 64 69  context, "no edi
8890: 74 6f 72 20 66 6f 72 20 65 64 69 74 28 29 22 2c  tor for edit()",
88a0: 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72 6e   -1);.    return
88b0: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
88c0: 74 65 33 5f 76 61 6c 75 65 5f 74 79 70 65 28 61  te3_value_type(a
88d0: 72 67 76 5b 30 5d 29 3d 3d 53 51 4c 49 54 45 5f  rgv[0])==SQLITE_
88e0: 4e 55 4c 4c 20 29 7b 0a 20 20 20 20 73 71 6c 69  NULL ){.    sqli
88f0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
8900: 28 63 6f 6e 74 65 78 74 2c 20 22 4e 55 4c 4c 20  (context, "NULL 
8910: 69 6e 70 75 74 20 74 6f 20 65 64 69 74 28 29 22  input to edit()"
8920: 2c 20 2d 31 29 3b 0a 20 20 20 20 72 65 74 75 72  , -1);.    retur
8930: 6e 3b 0a 20 20 7d 0a 20 20 64 62 20 3d 20 73 71  n;.  }.  db = sq
8940: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62  lite3_context_db
8950: 5f 68 61 6e 64 6c 65 28 63 6f 6e 74 65 78 74 29  _handle(context)
8960: 3b 0a 20 20 7a 54 65 6d 70 46 69 6c 65 20 3d 20  ;.  zTempFile = 
8970: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6c  0;.  sqlite3_fil
8980: 65 5f 63 6f 6e 74 72 6f 6c 28 64 62 2c 20 30 2c  e_control(db, 0,
8990: 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 54 45   SQLITE_FCNTL_TE
89a0: 4d 50 46 49 4c 45 4e 41 4d 45 2c 20 26 7a 54 65  MPFILENAME, &zTe
89b0: 6d 70 46 69 6c 65 29 3b 0a 20 20 69 66 28 20 7a  mpFile);.  if( z
89c0: 54 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20  TempFile==0 ){. 
89d0: 20 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36     sqlite3_uint6
89e0: 34 20 72 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  4 r = 0;.    sql
89f0: 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65 73 73 28  ite3_randomness(
8a00: 73 69 7a 65 6f 66 28 72 29 2c 20 26 72 29 3b 0a  sizeof(r), &r);.
8a10: 20 20 20 20 7a 54 65 6d 70 46 69 6c 65 20 3d 20      zTempFile = 
8a20: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
8a30: 22 74 65 6d 70 25 6c 6c 78 22 2c 20 72 29 3b 0a  "temp%llx", r);.
8a40: 20 20 20 20 69 66 28 20 7a 54 65 6d 70 46 69 6c      if( zTempFil
8a50: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71  e==0 ){.      sq
8a60: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72  lite3_result_err
8a70: 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65 78 74  or_nomem(context
8a80: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
8a90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 62 42 69  .    }.  }.  bBi
8aa0: 6e 20 3d 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  n = sqlite3_valu
8ab0: 65 5f 74 79 70 65 28 61 72 67 76 5b 30 5d 29 3d  e_type(argv[0])=
8ac0: 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 3b 0a 20 20  =SQLITE_BLOB;.  
8ad0: 66 20 3d 20 66 6f 70 65 6e 28 7a 54 65 6d 70 46  f = fopen(zTempF
8ae0: 69 6c 65 2c 20 62 42 69 6e 20 3f 20 22 77 62 22  ile, bBin ? "wb"
8af0: 20 3a 20 22 77 22 29 3b 0a 20 20 69 66 28 20 66   : "w");.  if( f
8b00: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
8b10: 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 28  e3_result_error(
8b20: 63 6f 6e 74 65 78 74 2c 20 22 65 64 69 74 28 29  context, "edit()
8b30: 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 74 65 6d   cannot open tem
8b40: 70 20 66 69 6c 65 22 2c 20 2d 31 29 3b 0a 20 20  p file", -1);.  
8b50: 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63    goto edit_func
8b60: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 73 7a 20 3d  _end;.  }.  sz =
8b70: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 62   sqlite3_value_b
8b80: 79 74 65 73 28 61 72 67 76 5b 30 5d 29 3b 0a 20  ytes(argv[0]);. 
8b90: 20 69 66 28 20 62 42 69 6e 20 29 7b 0a 20 20 20   if( bBin ){.   
8ba0: 20 78 20 3d 20 66 77 72 69 74 65 28 73 71 6c 69   x = fwrite(sqli
8bb0: 74 65 33 5f 76 61 6c 75 65 5f 62 6c 6f 62 28 61  te3_value_blob(a
8bc0: 72 67 76 5b 30 5d 29 2c 20 31 2c 20 73 7a 2c 20  rgv[0]), 1, sz, 
8bd0: 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f);.  }else{.   
8be0: 20 78 20 3d 20 66 77 72 69 74 65 28 73 71 6c 69   x = fwrite(sqli
8bf0: 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
8c00: 72 67 76 5b 30 5d 29 2c 20 31 2c 20 73 7a 2c 20  rgv[0]), 1, sz, 
8c10: 66 29 3b 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65  f);.  }.  fclose
8c20: 28 66 29 3b 0a 20 20 66 20 3d 20 30 3b 0a 20 20  (f);.  f = 0;.  
8c30: 69 66 28 20 78 21 3d 73 7a 20 29 7b 0a 20 20 20  if( x!=sz ){.   
8c40: 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
8c50: 65 72 72 6f 72 28 63 6f 6e 74 65 78 74 2c 20 22  error(context, "
8c60: 65 64 69 74 28 29 20 63 6f 75 6c 64 20 6e 6f 74  edit() could not
8c70: 20 77 72 69 74 65 20 74 68 65 20 77 68 6f 6c 65   write the whole
8c80: 20 66 69 6c 65 22 2c 20 2d 31 29 3b 0a 20 20 20   file", -1);.   
8c90: 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63 5f   goto edit_func_
8ca0: 65 6e 64 3b 0a 20 20 7d 0a 20 20 7a 43 6d 64 20  end;.  }.  zCmd 
8cb0: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
8cc0: 66 28 22 25 73 20 5c 22 25 73 5c 22 22 2c 20 7a  f("%s \"%s\"", z
8cd0: 45 64 69 74 6f 72 2c 20 7a 54 65 6d 70 46 69 6c  Editor, zTempFil
8ce0: 65 29 3b 0a 20 20 69 66 28 20 7a 43 6d 64 3d 3d  e);.  if( zCmd==
8cf0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
8d00: 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72 5f 6e 6f  _result_error_no
8d10: 6d 65 6d 28 63 6f 6e 74 65 78 74 29 3b 0a 20 20  mem(context);.  
8d20: 20 20 67 6f 74 6f 20 65 64 69 74 5f 66 75 6e 63    goto edit_func
8d30: 5f 65 6e 64 3b 0a 20 20 7d 0a 20 20 72 63 20 3d  _end;.  }.  rc =
8d40: 20 73 79 73 74 65 6d 28 7a 43 6d 64 29 3b 0a 20   system(zCmd);. 
8d50: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43   sqlite3_free(zC
8d60: 6d 64 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b  md);.  if( rc ){
8d70: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
8d80: 75 6c 74 5f 65 72 72 6f 72 28 63 6f 6e 74 65 78  ult_error(contex
8d90: 74 2c 20 22 45 44 49 54 4f 52 20 72 65 74 75 72  t, "EDITOR retur
8da0: 6e 65 64 20 6e 6f 6e 2d 7a 65 72 6f 22 2c 20 2d  ned non-zero", -
8db0: 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64 69  1);.    goto edi
8dc0: 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a  t_func_end;.  }.
8dd0: 20 20 66 20 3d 20 66 6f 70 65 6e 28 7a 54 65 6d    f = fopen(zTem
8de0: 70 46 69 6c 65 2c 20 62 42 69 6e 20 3f 20 22 72  pFile, bBin ? "r
8df0: 62 22 20 3a 20 22 72 22 29 3b 0a 20 20 69 66 28  b" : "r");.  if(
8e00: 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c   f==0 ){.    sql
8e10: 69 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f  ite3_result_erro
8e20: 72 28 63 6f 6e 74 65 78 74 2c 0a 20 20 20 20 20  r(context,.     
8e30: 20 22 65 64 69 74 28 29 20 63 61 6e 6e 6f 74 20   "edit() cannot 
8e40: 72 65 6f 70 65 6e 20 74 65 6d 70 20 66 69 6c 65  reopen temp file
8e50: 20 61 66 74 65 72 20 65 64 69 74 22 2c 20 2d 31   after edit", -1
8e60: 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64 69 74  );.    goto edit
8e70: 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d 0a 20  _func_end;.  }. 
8e80: 20 66 73 65 65 6b 28 66 2c 20 30 2c 20 53 45 45   fseek(f, 0, SEE
8e90: 4b 5f 45 4e 44 29 3b 0a 20 20 73 7a 20 3d 20 66  K_END);.  sz = f
8ea0: 74 65 6c 6c 28 66 29 3b 0a 20 20 72 65 77 69 6e  tell(f);.  rewin
8eb0: 64 28 66 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69  d(f);.  p = sqli
8ec0: 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 73 7a  te3_malloc64( sz
8ed0: 2b 28 62 42 69 6e 3d 3d 30 29 20 29 3b 0a 20 20  +(bBin==0) );.  
8ee0: 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20 20 20  if( p==0 ){.    
8ef0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 65  sqlite3_result_e
8f00: 72 72 6f 72 5f 6e 6f 6d 65 6d 28 63 6f 6e 74 65  rror_nomem(conte
8f10: 78 74 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64  xt);.    goto ed
8f20: 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d  it_func_end;.  }
8f30: 0a 20 20 69 66 28 20 62 42 69 6e 20 29 7b 0a 20  .  if( bBin ){. 
8f40: 20 20 20 78 20 3d 20 66 72 65 61 64 28 70 2c 20     x = fread(p, 
8f50: 31 2c 20 73 7a 2c 20 66 29 3b 0a 20 20 7d 65 6c  1, sz, f);.  }el
8f60: 73 65 7b 0a 20 20 20 20 78 20 3d 20 66 72 65 61  se{.    x = frea
8f70: 64 28 70 2c 20 31 2c 20 73 7a 2c 20 66 29 3b 0a  d(p, 1, sz, f);.
8f80: 20 20 20 20 70 5b 73 7a 5d 20 3d 20 30 3b 0a 20      p[sz] = 0;. 
8f90: 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66 29 3b 0a   }.  fclose(f);.
8fa0: 20 20 66 20 3d 20 30 3b 0a 20 20 69 66 28 20 78    f = 0;.  if( x
8fb0: 21 3d 73 7a 20 29 7b 0a 20 20 20 20 73 71 6c 69  !=sz ){.    sqli
8fc0: 74 65 33 5f 72 65 73 75 6c 74 5f 65 72 72 6f 72  te3_result_error
8fd0: 28 63 6f 6e 74 65 78 74 2c 20 22 63 6f 75 6c 64  (context, "could
8fe0: 20 6e 6f 74 20 72 65 61 64 20 62 61 63 6b 20 74   not read back t
8ff0: 68 65 20 77 68 6f 6c 65 20 66 69 6c 65 22 2c 20  he whole file", 
9000: 2d 31 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 64  -1);.    goto ed
9010: 69 74 5f 66 75 6e 63 5f 65 6e 64 3b 0a 20 20 7d  it_func_end;.  }
9020: 0a 20 20 69 66 28 20 62 42 69 6e 20 29 7b 0a 20  .  if( bBin ){. 
9030: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
9040: 74 5f 62 6c 6f 62 36 34 28 63 6f 6e 74 65 78 74  t_blob64(context
9050: 2c 20 70 2c 20 73 7a 2c 20 73 71 6c 69 74 65 33  , p, sz, sqlite3
9060: 5f 66 72 65 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  _free);.  }else{
9070: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73  .    sqlite3_res
9080: 75 6c 74 5f 74 65 78 74 36 34 28 63 6f 6e 74 65  ult_text64(conte
9090: 78 74 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  xt, (const char*
90a0: 29 70 2c 20 73 7a 2c 0a 20 20 20 20 20 20 20 20  )p, sz,.        
90b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
90c0: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 2c 20    sqlite3_free, 
90d0: 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20  SQLITE_UTF8);.  
90e0: 7d 0a 20 20 70 20 3d 20 30 3b 0a 0a 65 64 69 74  }.  p = 0;..edit
90f0: 5f 66 75 6e 63 5f 65 6e 64 3a 0a 20 20 69 66 28  _func_end:.  if(
9100: 20 66 20 29 20 66 63 6c 6f 73 65 28 66 29 3b 0a   f ) fclose(f);.
9110: 20 20 75 6e 6c 69 6e 6b 28 7a 54 65 6d 70 46 69    unlink(zTempFi
9120: 6c 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  le);.  sqlite3_f
9130: 72 65 65 28 7a 54 65 6d 70 46 69 6c 65 29 3b 0a  ree(zTempFile);.
9140: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
9150: 29 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53  );.}.#endif /* S
9160: 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53  QLITE_NOHAVE_SYS
9170: 54 45 4d 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 53 61  TEM */../*.** Sa
9180: 76 65 20 6f 72 20 72 65 73 74 6f 72 65 20 74 68  ve or restore th
9190: 65 20 63 75 72 72 65 6e 74 20 6f 75 74 70 75 74  e current output
91a0: 20 6d 6f 64 65 0a 2a 2f 0a 73 74 61 74 69 63 20   mode.*/.static 
91b0: 76 6f 69 64 20 6f 75 74 70 75 74 4d 6f 64 65 50  void outputModeP
91c0: 75 73 68 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  ush(ShellState *
91d0: 70 29 7b 0a 20 20 70 2d 3e 6d 6f 64 65 50 72 69  p){.  p->modePri
91e0: 6f 72 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20  or = p->mode;.  
91f0: 6d 65 6d 63 70 79 28 70 2d 3e 63 6f 6c 53 65 70  memcpy(p->colSep
9200: 50 72 69 6f 72 2c 20 70 2d 3e 63 6f 6c 53 65 70  Prior, p->colSep
9210: 61 72 61 74 6f 72 2c 20 73 69 7a 65 6f 66 28 70  arator, sizeof(p
9220: 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 29  ->colSeparator))
9230: 3b 0a 20 20 6d 65 6d 63 70 79 28 70 2d 3e 72 6f  ;.  memcpy(p->ro
9240: 77 53 65 70 50 72 69 6f 72 2c 20 70 2d 3e 72 6f  wSepPrior, p->ro
9250: 77 53 65 70 61 72 61 74 6f 72 2c 20 73 69 7a 65  wSeparator, size
9260: 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  of(p->rowSeparat
9270: 6f 72 29 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76  or));.}.static v
9280: 6f 69 64 20 6f 75 74 70 75 74 4d 6f 64 65 50 6f  oid outputModePo
9290: 70 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29  p(ShellState *p)
92a0: 7b 0a 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 70 2d  {.  p->mode = p-
92b0: 3e 6d 6f 64 65 50 72 69 6f 72 3b 0a 20 20 6d 65  >modePrior;.  me
92c0: 6d 63 70 79 28 70 2d 3e 63 6f 6c 53 65 70 61 72  mcpy(p->colSepar
92d0: 61 74 6f 72 2c 20 70 2d 3e 63 6f 6c 53 65 70 50  ator, p->colSepP
92e0: 72 69 6f 72 2c 20 73 69 7a 65 6f 66 28 70 2d 3e  rior, sizeof(p->
92f0: 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 29 3b 0a  colSeparator));.
9300: 20 20 6d 65 6d 63 70 79 28 70 2d 3e 72 6f 77 53    memcpy(p->rowS
9310: 65 70 61 72 61 74 6f 72 2c 20 70 2d 3e 72 6f 77  eparator, p->row
9320: 53 65 70 50 72 69 6f 72 2c 20 73 69 7a 65 6f 66  SepPrior, sizeof
9330: 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72  (p->rowSeparator
9340: 29 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74  ));.}../*.** Out
9350: 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73 74  put the given st
9360: 72 69 6e 67 20 61 73 20 61 20 68 65 78 2d 65 6e  ring as a hex-en
9370: 63 6f 64 65 64 20 62 6c 6f 62 20 28 65 67 2e 20  coded blob (eg. 
9380: 58 27 31 32 33 34 27 20 29 0a 2a 2f 0a 73 74 61  X'1234' ).*/.sta
9390: 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f  tic void output_
93a0: 68 65 78 5f 62 6c 6f 62 28 46 49 4c 45 20 2a 6f  hex_blob(FILE *o
93b0: 75 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a  ut, const void *
93c0: 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f 62  pBlob, int nBlob
93d0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  ){.  int i;.  ch
93e0: 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 28 63 68 61  ar *zBlob = (cha
93f0: 72 20 2a 29 70 42 6c 6f 62 3b 0a 20 20 72 61 77  r *)pBlob;.  raw
9400: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 58 27 22  _printf(out,"X'"
9410: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
9420: 6e 42 6c 6f 62 3b 20 69 2b 2b 29 7b 20 72 61 77  nBlob; i++){ raw
9430: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 30 32  _printf(out,"%02
9440: 78 22 2c 7a 42 6c 6f 62 5b 69 5d 26 30 78 66 66  x",zBlob[i]&0xff
9450: 29 3b 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74  ); }.  raw_print
9460: 66 28 6f 75 74 2c 22 27 22 29 3b 0a 7d 0a 0a 2f  f(out,"'");.}../
9470: 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 73 74 72 69  *.** Find a stri
9480: 6e 67 20 74 68 61 74 20 69 73 20 6e 6f 74 20 66  ng that is not f
9490: 6f 75 6e 64 20 61 6e 79 77 68 65 72 65 20 69 6e  ound anywhere in
94a0: 20 7a 5b 5d 2e 20 20 52 65 74 75 72 6e 20 61 20   z[].  Return a 
94b0: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
94c0: 61 74 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a 2a  at string..**.**
94d0: 20 54 72 79 20 74 6f 20 75 73 65 20 7a 41 20 61   Try to use zA a
94e0: 6e 64 20 7a 42 20 66 69 72 73 74 2e 20 20 49 66  nd zB first.  If
94f0: 20 62 6f 74 68 20 6f 66 20 74 68 6f 73 65 20 61   both of those a
9500: 72 65 20 61 6c 72 65 61 64 79 20 66 6f 75 6e 64  re already found
9510: 20 69 6e 20 7a 5b 5d 0a 2a 2a 20 74 68 65 6e 20   in z[].** then 
9520: 6d 61 6b 65 20 75 70 20 73 6f 6d 65 20 73 74 72  make up some str
9530: 69 6e 67 20 61 6e 64 20 73 74 6f 72 65 20 69 74  ing and store it
9540: 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20 7a   in the buffer z
9550: 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  Buf..*/.static c
9560: 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 75 73 65  onst char *unuse
9570: 64 5f 73 74 72 69 6e 67 28 0a 20 20 63 6f 6e 73  d_string(.  cons
9580: 74 20 63 68 61 72 20 2a 7a 2c 20 20 20 20 20 20  t char *z,      
9590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
95a0: 20 52 65 73 75 6c 74 20 6d 75 73 74 20 6e 6f 74   Result must not
95b0: 20 61 70 70 65 61 72 20 61 6e 79 77 68 65 72 65   appear anywhere
95c0: 20 69 6e 20 7a 20 2a 2f 0a 20 20 63 6f 6e 73 74   in z */.  const
95d0: 20 63 68 61 72 20 2a 7a 41 2c 20 63 6f 6e 73 74   char *zA, const
95e0: 20 63 68 61 72 20 2a 7a 42 2c 20 20 20 2f 2a 20   char *zB,   /* 
95f0: 54 72 79 20 74 68 65 73 65 20 66 69 72 73 74 20  Try these first 
9600: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 20  */.  char *zBuf 
9610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9620: 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65 20         /* Space 
9630: 74 6f 20 73 74 6f 72 65 20 61 20 67 65 6e 65 72  to store a gener
9640: 61 74 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 29  ated string */.)
9650: 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 20 3d  {.  unsigned i =
9660: 20 30 3b 0a 20 20 69 66 28 20 73 74 72 73 74 72   0;.  if( strstr
9670: 28 7a 2c 20 7a 41 29 3d 3d 30 20 29 20 72 65 74  (z, zA)==0 ) ret
9680: 75 72 6e 20 7a 41 3b 0a 20 20 69 66 28 20 73 74  urn zA;.  if( st
9690: 72 73 74 72 28 7a 2c 20 7a 42 29 3d 3d 30 20 29  rstr(z, zB)==0 )
96a0: 20 72 65 74 75 72 6e 20 7a 42 3b 0a 20 20 64 6f   return zB;.  do
96b0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e  {.    sqlite3_sn
96c0: 70 72 69 6e 74 66 28 32 30 2c 7a 42 75 66 2c 22  printf(20,zBuf,"
96d0: 28 25 73 25 75 29 22 2c 20 7a 41 2c 20 69 2b 2b  (%s%u)", zA, i++
96e0: 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 73 74 72  );.  }while( str
96f0: 73 74 72 28 7a 2c 7a 42 75 66 29 21 3d 30 20 29  str(z,zBuf)!=0 )
9700: 3b 0a 20 20 72 65 74 75 72 6e 20 7a 42 75 66 3b  ;.  return zBuf;
9710: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74  .}../*.** Output
9720: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
9730: 67 20 61 73 20 61 20 71 75 6f 74 65 64 20 73 74  g as a quoted st
9740: 72 69 6e 67 20 75 73 69 6e 67 20 53 51 4c 20 71  ring using SQL q
9750: 75 6f 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f  uoting conventio
9760: 6e 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61 6c  ns..**.** See al
9770: 73 6f 3a 20 6f 75 74 70 75 74 5f 71 75 6f 74 65  so: output_quote
9780: 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67  d_escaped_string
9790: 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ().*/.static voi
97a0: 64 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f  d output_quoted_
97b0: 73 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74  string(FILE *out
97c0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  , const char *z)
97d0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  {.  int i;.  cha
97e0: 72 20 63 3b 0a 20 20 73 65 74 42 69 6e 61 72 79  r c;.  setBinary
97f0: 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a 20 20  Mode(out, 1);.  
9800: 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 5b  for(i=0; (c = z[
9810: 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 27  i])!=0 && c!='\'
9820: 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20  '; i++){}.  if( 
9830: 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38  c==0 ){.    utf8
9840: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 25 73  _printf(out,"'%s
9850: 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  '",z);.  }else{.
9860: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
9870: 75 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 77 68  ut, "'");.    wh
9880: 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20  ile( *z ){.     
9890: 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a   for(i=0; (c = z
98a0: 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 5c  [i])!=0 && c!='\
98b0: 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20  ''; i++){}.     
98c0: 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 20 69   if( c=='\'' ) i
98d0: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69 20  ++;.      if( i 
98e0: 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
98f0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2e 2a  printf(out, "%.*
9900: 73 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 20 20 20  s", i, z);.     
9910: 20 20 20 7a 20 2b 3d 20 69 3b 0a 20 20 20 20 20     z += i;.     
9920: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d   }.      if( c==
9930: 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20  '\'' ){.        
9940: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
9950: 22 27 22 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  "'");.        co
9960: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a  ntinue;.      }.
9970: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
9980: 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  {.        break;
9990: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
99a0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 61  ++;.    }.    ra
99b0: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27  w_printf(out, "'
99c0: 22 29 3b 0a 20 20 7d 0a 20 20 73 65 74 54 65 78  ");.  }.  setTex
99d0: 74 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a 7d  tMode(out, 1);.}
99e0: 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74  ../*.** Output t
99f0: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20  he given string 
9a00: 61 73 20 61 20 71 75 6f 74 65 64 20 73 74 72 69  as a quoted stri
9a10: 6e 67 20 75 73 69 6e 67 20 53 51 4c 20 71 75 6f  ng using SQL quo
9a20: 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e 73  ting conventions
9a30: 2e 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c 6c  ..** Additionall
9a40: 6c 79 20 2c 20 65 73 63 61 70 65 20 74 68 65 20  ly , escape the 
9a50: 22 5c 6e 22 20 61 6e 64 20 22 5c 72 22 20 63 68  "\n" and "\r" ch
9a60: 61 72 61 63 74 65 72 73 20 73 6f 20 74 68 61 74  aracters so that
9a70: 20 74 68 65 79 20 64 6f 20 6e 6f 74 0a 2a 2a 20   they do not.** 
9a80: 67 65 74 20 63 6f 72 72 75 70 74 65 64 20 62 79  get corrupted by
9a90: 20 65 6e 64 2d 6f 66 2d 6c 69 6e 65 20 74 72 61   end-of-line tra
9aa0: 6e 73 6c 61 74 69 6f 6e 20 66 61 63 69 6c 69 74  nslation facilit
9ab0: 69 65 73 20 69 6e 20 73 6f 6d 65 20 6f 70 65 72  ies in some oper
9ac0: 61 74 69 6e 67 0a 2a 2a 20 73 79 73 74 65 6d 73  ating.** systems
9ad0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20  ..**.** This is 
9ae0: 6c 69 6b 65 20 6f 75 74 70 75 74 5f 71 75 6f 74  like output_quot
9af0: 65 64 5f 73 74 72 69 6e 67 28 29 20 62 75 74 20  ed_string() but 
9b00: 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69 6f  with the additio
9b10: 6e 20 6f 66 20 74 68 65 20 5c 72 5c 6e 0a 2a 2a  n of the \r\n.**
9b20: 20 65 73 63 61 70 65 20 6d 65 63 68 61 6e 69 73   escape mechanis
9b30: 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  m..*/.static voi
9b40: 64 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f  d output_quoted_
9b50: 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28 46  escaped_string(F
9b60: 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20  ILE *out, const 
9b70: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
9b80: 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 73  i;.  char c;.  s
9b90: 65 74 42 69 6e 61 72 79 4d 6f 64 65 28 6f 75 74  etBinaryMode(out
9ba0: 2c 20 31 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  , 1);.  for(i=0;
9bb0: 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26   (c = z[i])!=0 &
9bc0: 26 20 63 21 3d 27 5c 27 27 20 26 26 20 63 21 3d  & c!='\'' && c!=
9bd0: 27 5c 6e 27 20 26 26 20 63 21 3d 27 5c 72 27 3b  '\n' && c!='\r';
9be0: 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 63 3d   i++){}.  if( c=
9bf0: 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  =0 ){.    utf8_p
9c00: 72 69 6e 74 66 28 6f 75 74 2c 22 27 25 73 27 22  rintf(out,"'%s'"
9c10: 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  ,z);.  }else{.  
9c20: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
9c30: 4c 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74  L = 0;.    const
9c40: 20 63 68 61 72 20 2a 7a 43 52 20 3d 20 30 3b 0a   char *zCR = 0;.
9c50: 20 20 20 20 69 6e 74 20 6e 4e 4c 20 3d 20 30 3b      int nNL = 0;
9c60: 0a 20 20 20 20 69 6e 74 20 6e 43 52 20 3d 20 30  .    int nCR = 0
9c70: 3b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66 31  ;.    char zBuf1
9c80: 5b 32 30 5d 2c 20 7a 42 75 66 32 5b 32 30 5d 3b  [20], zBuf2[20];
9c90: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b  .    for(i=0; z[
9ca0: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
9cb0: 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29  if( z[i]=='\n' )
9cc0: 20 6e 4e 4c 2b 2b 3b 0a 20 20 20 20 20 20 69 66   nNL++;.      if
9cd0: 28 20 7a 5b 69 5d 3d 3d 27 5c 72 27 20 29 20 6e  ( z[i]=='\r' ) n
9ce0: 43 52 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  CR++;.    }.    
9cf0: 69 66 28 20 6e 4e 4c 20 29 7b 0a 20 20 20 20 20  if( nNL ){.     
9d00: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
9d10: 20 22 72 65 70 6c 61 63 65 28 22 29 3b 0a 20 20   "replace(");.  
9d20: 20 20 20 20 7a 4e 4c 20 3d 20 75 6e 75 73 65 64      zNL = unused
9d30: 5f 73 74 72 69 6e 67 28 7a 2c 20 22 5c 5c 6e 22  _string(z, "\\n"
9d40: 2c 20 22 5c 5c 30 31 32 22 2c 20 7a 42 75 66 31  , "\\012", zBuf1
9d50: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
9d60: 20 6e 43 52 20 29 7b 0a 20 20 20 20 20 20 72 61   nCR ){.      ra
9d70: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 72  w_printf(out, "r
9d80: 65 70 6c 61 63 65 28 22 29 3b 0a 20 20 20 20 20  eplace(");.     
9d90: 20 7a 43 52 20 3d 20 75 6e 75 73 65 64 5f 73 74   zCR = unused_st
9da0: 72 69 6e 67 28 7a 2c 20 22 5c 5c 72 22 2c 20 22  ring(z, "\\r", "
9db0: 5c 5c 30 31 35 22 2c 20 7a 42 75 66 32 29 3b 0a  \\015", zBuf2);.
9dc0: 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70 72      }.    raw_pr
9dd0: 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a  intf(out, "'");.
9de0: 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b      while( *z ){
9df0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
9e00: 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26  (c = z[i])!=0 &&
9e10: 20 63 21 3d 27 5c 6e 27 20 26 26 20 63 21 3d 27   c!='\n' && c!='
9e20: 5c 72 27 20 26 26 20 63 21 3d 27 5c 27 27 3b 20  \r' && c!='\''; 
9e30: 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 69 66 28  i++){}.      if(
9e40: 20 63 3d 3d 27 5c 27 27 20 29 20 69 2b 2b 3b 0a   c=='\'' ) i++;.
9e50: 20 20 20 20 20 20 69 66 28 20 69 20 29 7b 0a 20        if( i ){. 
9e60: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
9e70: 74 66 28 6f 75 74 2c 20 22 25 2e 2a 73 22 2c 20  tf(out, "%.*s", 
9e80: 69 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 7a  i, z);.        z
9e90: 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20   += i;.      }. 
9ea0: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27 27       if( c=='\''
9eb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
9ec0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29  printf(out, "'")
9ed0: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
9ee0: 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
9ef0: 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20    if( c==0 ){.  
9f00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9f10: 20 20 20 7d 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a     }.      z++;.
9f20: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e        if( c=='\n
9f30: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  ' ){.        raw
9f40: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
9f50: 22 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20 20 20 20  ", zNL);.       
9f60: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
9f70: 20 7d 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69   }.      raw_pri
9f80: 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a  ntf(out, "%s", z
9f90: 43 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  CR);.    }.    r
9fa0: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
9fb0: 27 22 29 3b 0a 20 20 20 20 69 66 28 20 6e 43 52  '");.    if( nCR
9fc0: 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
9fd0: 69 6e 74 66 28 6f 75 74 2c 20 22 2c 27 25 73 27  intf(out, ",'%s'
9fe0: 2c 63 68 61 72 28 31 33 29 29 22 2c 20 7a 43 52  ,char(13))", zCR
9ff0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
a000: 20 6e 4e 4c 20 29 7b 0a 20 20 20 20 20 20 72 61   nNL ){.      ra
a010: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2c  w_printf(out, ",
a020: 27 25 73 27 2c 63 68 61 72 28 31 30 29 29 22 2c  '%s',char(10))",
a030: 20 7a 4e 4c 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   zNL);.    }.  }
a040: 0a 20 20 73 65 74 54 65 78 74 4d 6f 64 65 28 6f  .  setTextMode(o
a050: 75 74 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ut, 1);.}../*.**
a060: 20 4f 75 74 70 75 74 20 74 68 65 20 67 69 76 65   Output the give
a070: 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20 71 75  n string as a qu
a080: 6f 74 65 64 20 61 63 63 6f 72 64 69 6e 67 20 74  oted according t
a090: 6f 20 43 20 6f 72 20 54 43 4c 20 71 75 6f 74 69  o C or TCL quoti
a0a0: 6e 67 20 72 75 6c 65 73 2e 0a 2a 2f 0a 73 74 61  ng rules..*/.sta
a0b0: 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f  tic void output_
a0c0: 63 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f  c_string(FILE *o
a0d0: 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ut, const char *
a0e0: 7a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69  z){.  unsigned i
a0f0: 6e 74 20 63 3b 0a 20 20 66 70 75 74 63 28 27 22  nt c;.  fputc('"
a100: 27 2c 20 6f 75 74 29 3b 0a 20 20 77 68 69 6c 65  ', out);.  while
a110: 28 20 28 63 20 3d 20 2a 28 7a 2b 2b 29 29 21 3d  ( (c = *(z++))!=
a120: 30 20 29 7b 0a 20 20 20 20 69 66 28 20 63 3d 3d  0 ){.    if( c==
a130: 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 66 70  '\\' ){.      fp
a140: 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20  utc(c, out);.   
a150: 20 20 20 66 70 75 74 63 28 63 2c 20 6f 75 74 29     fputc(c, out)
a160: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
a170: 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20  c=='"' ){.      
a180: 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29  fputc('\\', out)
a190: 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 22  ;.      fputc('"
a1a0: 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c  ', out);.    }el
a1b0: 73 65 20 69 66 28 20 63 3d 3d 27 5c 74 27 20 29  se if( c=='\t' )
a1c0: 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 5c  {.      fputc('\
a1d0: 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20  \', out);.      
a1e0: 66 70 75 74 63 28 27 74 27 2c 20 6f 75 74 29 3b  fputc('t', out);
a1f0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
a200: 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20  =='\n' ){.      
a210: 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29  fputc('\\', out)
a220: 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 6e  ;.      fputc('n
a230: 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c  ', out);.    }el
a240: 73 65 20 69 66 28 20 63 3d 3d 27 5c 72 27 20 29  se if( c=='\r' )
a250: 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 5c  {.      fputc('\
a260: 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20  \', out);.      
a270: 66 70 75 74 63 28 27 72 27 2c 20 6f 75 74 29 3b  fputc('r', out);
a280: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 21  .    }else if( !
a290: 69 73 70 72 69 6e 74 28 63 26 30 78 66 66 29 20  isprint(c&0xff) 
a2a0: 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
a2b0: 6e 74 66 28 6f 75 74 2c 20 22 5c 5c 25 30 33 6f  ntf(out, "\\%03o
a2c0: 22 2c 20 63 26 30 78 66 66 29 3b 0a 20 20 20 20  ", c&0xff);.    
a2d0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70 75  }else{.      fpu
a2e0: 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20  tc(c, out);.    
a2f0: 7d 0a 20 20 7d 0a 20 20 66 70 75 74 63 28 27 22  }.  }.  fputc('"
a300: 27 2c 20 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ', out);.}../*.*
a310: 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67 69 76  * Output the giv
a320: 65 6e 20 73 74 72 69 6e 67 20 77 69 74 68 20 63  en string with c
a330: 68 61 72 61 63 74 65 72 73 20 74 68 61 74 20 61  haracters that a
a340: 72 65 20 73 70 65 63 69 61 6c 20 74 6f 0a 2a 2a  re special to.**
a350: 20 48 54 4d 4c 20 65 73 63 61 70 65 64 2e 0a 2a   HTML escaped..*
a360: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75  /.static void ou
a370: 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67  tput_html_string
a380: 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73  (FILE *out, cons
a390: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  t char *z){.  in
a3a0: 74 20 69 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  t i;.  if( z==0 
a3b0: 29 20 7a 20 3d 20 22 22 3b 0a 20 20 77 68 69 6c  ) z = "";.  whil
a3c0: 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 66 6f 72  e( *z ){.    for
a3d0: 28 69 3d 30 3b 20 20 20 7a 5b 69 5d 0a 20 20 20  (i=0;   z[i].   
a3e0: 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d           && z[i]
a3f0: 21 3d 27 3c 27 0a 20 20 20 20 20 20 20 20 20 20  !='<'.          
a400: 20 20 26 26 20 7a 5b 69 5d 21 3d 27 26 27 0a 20    && z[i]!='&'. 
a410: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b             && z[
a420: 69 5d 21 3d 27 3e 27 0a 20 20 20 20 20 20 20 20  i]!='>'.        
a430: 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 5c 22      && z[i]!='\"
a440: 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26  '.            &&
a450: 20 7a 5b 69 5d 21 3d 27 5c 27 27 3b 0a 20 20 20   z[i]!='\'';.   
a460: 20 20 20 20 20 69 2b 2b 29 7b 7d 0a 20 20 20 20       i++){}.    
a470: 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20 20  if( i>0 ){.     
a480: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74   utf8_printf(out
a490: 2c 22 25 2e 2a 73 22 2c 69 2c 7a 29 3b 0a 20 20  ,"%.*s",i,z);.  
a4a0: 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d    }.    if( z[i]
a4b0: 3d 3d 27 3c 27 20 29 7b 0a 20 20 20 20 20 20 72  =='<' ){.      r
a4c0: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26  aw_printf(out,"&
a4d0: 6c 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  lt;");.    }else
a4e0: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 26 27 20 29   if( z[i]=='&' )
a4f0: 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
a500: 74 66 28 6f 75 74 2c 22 26 61 6d 70 3b 22 29 3b  tf(out,"&amp;");
a510: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
a520: 5b 69 5d 3d 3d 27 3e 27 20 29 7b 0a 20 20 20 20  [i]=='>' ){.    
a530: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
a540: 2c 22 26 67 74 3b 22 29 3b 0a 20 20 20 20 7d 65  ,"&gt;");.    }e
a550: 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c  lse if( z[i]=='\
a560: 22 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  "' ){.      raw_
a570: 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 71 75 6f  printf(out,"&quo
a580: 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  t;");.    }else 
a590: 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 27 27 20 29  if( z[i]=='\'' )
a5a0: 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
a5b0: 74 66 28 6f 75 74 2c 22 26 23 33 39 3b 22 29 3b  tf(out,"&#39;");
a5c0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
a5d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
a5e0: 20 20 20 7a 20 2b 3d 20 69 20 2b 20 31 3b 0a 20     z += i + 1;. 
a5f0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61   }.}../*.** If a
a600: 20 66 69 65 6c 64 20 63 6f 6e 74 61 69 6e 73 20   field contains 
a610: 61 6e 79 20 63 68 61 72 61 63 74 65 72 20 69 64  any character id
a620: 65 6e 74 69 66 69 65 64 20 62 79 20 61 20 31 20  entified by a 1 
a630: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
a640: 0a 2a 2a 20 61 72 72 61 79 2c 20 74 68 65 6e 20  .** array, then 
a650: 74 68 65 20 73 74 72 69 6e 67 20 6d 75 73 74 20  the string must 
a660: 62 65 20 71 75 6f 74 65 64 20 66 6f 72 20 43 53  be quoted for CS
a670: 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  V..*/.static con
a680: 73 74 20 63 68 61 72 20 6e 65 65 64 43 73 76 51  st char needCsvQ
a690: 75 6f 74 65 5b 5d 20 3d 20 7b 0a 20 20 31 2c 20  uote[] = {.  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 20 20 31 2c 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 0a 20  1, 1, 1, 1, 1,. 
a6d0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a6e0: 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c  1, 1, 1,   1, 1,
a6f0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a700: 31 2c 0a 20 20 31 2c 20 30 2c 20 31 2c 20 30 2c  1,.  1, 0, 1, 0,
a710: 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20 20 20 30   0, 0, 0, 1,   0
a720: 2c 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 0a 20 20 30 2c 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 20 20 30 2c 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 0a 20 20 30 2c 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 20 20 30 2c 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 0a 20  0, 0, 0, 0, 0,. 
a7a0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
a7b0: 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c 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 0a 20 20 30 2c 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 20 20 30   0, 0, 0, 0,   0
a7f0: 2c 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 0a 20 20 30 2c 20 30 2c 20 30   0, 0,.  0, 0, 0
a810: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
a820: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
a830: 2c 20 30 2c 20 30 2c 20 31 2c 0a 20 20 31 2c 20  , 0, 0, 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 20 20 31 2c 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 0a 20  1, 1, 1, 1, 1,. 
a870: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a880: 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 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 0a 20 20 31 2c 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 20 20 31   1, 1, 1, 1,   1
a8c0: 2c 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 0a 20 20 31 2c 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 20 20 31 2c 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 0a 20 20 31 2c 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 20 20 31 2c 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 0a 20  1, 1, 1, 1, 1,. 
a940: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
a950: 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 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 0a 20 20 31 2c 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 20 20 31   1, 1, 1, 1,   1
a990: 2c 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 0a 20 20 31 2c 20 31 2c 20 31   1, 1,.  1, 1, 1
a9b0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
a9c0: 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31     1, 1, 1, 1, 1
a9d0: 2c 20 31 2c 20 31 2c 20 31 2c 0a 7d 3b 0a 0a 2f  , 1, 1, 1,.};../
a9e0: 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 61 20 73 69  *.** Output a si
a9f0: 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 43 53 56  ngle term of CSV
aa00: 2e 20 20 41 63 74 75 61 6c 6c 79 2c 20 70 2d 3e  .  Actually, p->
aa10: 63 6f 6c 53 65 70 61 72 61 74 6f 72 20 69 73 20  colSeparator is 
aa20: 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 68 65 20  used for.** the 
aa30: 73 65 70 61 72 61 74 6f 72 2c 20 77 68 69 63 68  separator, which
aa40: 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74 20   may or may not 
aa50: 62 65 20 61 20 63 6f 6d 6d 61 2e 20 20 70 2d 3e  be a comma.  p->
aa60: 6e 75 6c 6c 56 61 6c 75 65 20 69 73 0a 2a 2a 20  nullValue is.** 
aa70: 74 68 65 20 6e 75 6c 6c 20 76 61 6c 75 65 2e 20  the null value. 
aa80: 20 53 74 72 69 6e 67 73 20 61 72 65 20 71 75 6f   Strings are quo
aa90: 74 65 64 20 69 66 20 6e 65 63 65 73 73 61 72 79  ted if necessary
aaa0: 2e 20 20 54 68 65 20 73 65 70 61 72 61 74 6f 72  .  The separator
aab0: 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 69 73 73 75  .** is only issu
aac0: 65 64 20 69 66 20 62 53 65 70 20 69 73 20 74 72  ed if bSep is tr
aad0: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ue..*/.static vo
aae0: 69 64 20 6f 75 74 70 75 74 5f 63 73 76 28 53 68  id output_csv(Sh
aaf0: 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e  ellState *p, con
ab00: 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
ab10: 62 53 65 70 29 7b 0a 20 20 46 49 4c 45 20 2a 6f  bSep){.  FILE *o
ab20: 75 74 20 3d 20 70 2d 3e 6f 75 74 3b 0a 20 20 69  ut = p->out;.  i
ab30: 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 75  f( z==0 ){.    u
ab40: 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22  tf8_printf(out,"
ab50: 25 73 22 2c 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65  %s",p->nullValue
ab60: 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
ab70: 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20 6e  int i;.    int n
ab80: 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 70  Sep = strlen30(p
ab90: 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b  ->colSeparator);
aba0: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b  .    for(i=0; z[
abb0: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
abc0: 69 66 28 20 6e 65 65 64 43 73 76 51 75 6f 74 65  if( needCsvQuote
abd0: 5b 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  [((unsigned char
abe0: 2a 29 7a 29 5b 69 5d 5d 0a 20 20 20 20 20 20 20  *)z)[i]].       
abf0: 20 20 7c 7c 20 28 7a 5b 69 5d 3d 3d 70 2d 3e 63    || (z[i]==p->c
ac00: 6f 6c 53 65 70 61 72 61 74 6f 72 5b 30 5d 20 26  olSeparator[0] &
ac10: 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 28  &.             (
ac20: 6e 53 65 70 3d 3d 31 20 7c 7c 20 6d 65 6d 63 6d  nSep==1 || memcm
ac30: 70 28 7a 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  p(z, p->colSepar
ac40: 61 74 6f 72 2c 20 6e 53 65 70 29 3d 3d 30 29 29  ator, nSep)==0))
ac50: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d 20   ){.        i = 
ac60: 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  0;.        break
ac70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
ac80: 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b 0a      if( i==0 ){.
ac90: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 51 75 6f        char *zQuo
aca0: 74 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ted = sqlite3_mp
acb0: 72 69 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c 20  rintf("\"%w\"", 
acc0: 7a 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  z);.      utf8_p
acd0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c  rintf(out, "%s",
ace0: 20 7a 51 75 6f 74 65 64 29 3b 0a 20 20 20 20 20   zQuoted);.     
acf0: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51   sqlite3_free(zQ
ad00: 75 6f 74 65 64 29 3b 0a 20 20 20 20 7d 65 6c 73  uoted);.    }els
ad10: 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  e{.      utf8_pr
ad20: 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20  intf(out, "%s", 
ad30: 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  z);.    }.  }.  
ad40: 69 66 28 20 62 53 65 70 20 29 7b 0a 20 20 20 20  if( bSep ){.    
ad50: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
ad60: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c  ut, "%s", p->col
ad70: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 7d 0a  Separator);.  }.
ad80: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
ad90: 75 74 69 6e 65 20 72 75 6e 73 20 77 68 65 6e 20  utine runs when 
ada0: 74 68 65 20 75 73 65 72 20 70 72 65 73 73 65 73  the user presses
adb0: 20 43 74 72 6c 2d 43 0a 2a 2f 0a 73 74 61 74 69   Ctrl-C.*/.stati
adc0: 63 20 76 6f 69 64 20 69 6e 74 65 72 72 75 70 74  c void interrupt
add0: 5f 68 61 6e 64 6c 65 72 28 69 6e 74 20 4e 6f 74  _handler(int Not
ade0: 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f  Used){.  UNUSED_
adf0: 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65  PARAMETER(NotUse
ae00: 64 29 3b 0a 20 20 73 65 65 6e 49 6e 74 65 72 72  d);.  seenInterr
ae10: 75 70 74 2b 2b 3b 0a 20 20 69 66 28 20 73 65 65  upt++;.  if( see
ae20: 6e 49 6e 74 65 72 72 75 70 74 3e 32 20 29 20 65  nInterrupt>2 ) e
ae30: 78 69 74 28 31 29 3b 0a 20 20 69 66 28 20 67 6c  xit(1);.  if( gl
ae40: 6f 62 61 6c 44 62 20 29 20 73 71 6c 69 74 65 33  obalDb ) sqlite3
ae50: 5f 69 6e 74 65 72 72 75 70 74 28 67 6c 6f 62 61  _interrupt(globa
ae60: 6c 44 62 29 3b 0a 7d 0a 0a 23 69 66 20 28 64 65  lDb);.}..#if (de
ae70: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c  fined(_WIN32) ||
ae80: 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 29   defined(WIN32))
ae90: 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 57 49   && !defined(_WI
aea0: 4e 33 32 5f 57 43 45 29 0a 2f 2a 0a 2a 2a 20 54  N32_WCE)./*.** T
aeb0: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73  his routine runs
aec0: 20 66 6f 72 20 63 6f 6e 73 6f 6c 65 20 65 76 65   for console eve
aed0: 6e 74 73 20 28 65 2e 67 2e 20 43 74 72 6c 2d 43  nts (e.g. Ctrl-C
aee0: 29 20 6f 6e 20 57 69 6e 33 32 0a 2a 2f 0a 73 74  ) on Win32.*/.st
aef0: 61 74 69 63 20 42 4f 4f 4c 20 57 49 4e 41 50 49  atic BOOL WINAPI
af00: 20 43 6f 6e 73 6f 6c 65 43 74 72 6c 48 61 6e 64   ConsoleCtrlHand
af10: 6c 65 72 28 0a 20 20 44 57 4f 52 44 20 64 77 43  ler(.  DWORD dwC
af20: 74 72 6c 54 79 70 65 20 2f 2a 20 4f 6e 65 20 6f  trlType /* One o
af30: 66 20 74 68 65 20 43 54 52 4c 5f 2a 5f 45 56 45  f the CTRL_*_EVE
af40: 4e 54 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f 0a  NT constants */.
af50: 29 7b 0a 20 20 69 66 28 20 64 77 43 74 72 6c 54  ){.  if( dwCtrlT
af60: 79 70 65 3d 3d 43 54 52 4c 5f 43 5f 45 56 45 4e  ype==CTRL_C_EVEN
af70: 54 20 29 7b 0a 20 20 20 20 69 6e 74 65 72 72 75  T ){.    interru
af80: 70 74 5f 68 61 6e 64 6c 65 72 28 30 29 3b 0a 20  pt_handler(0);. 
af90: 20 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b 0a     return TRUE;.
afa0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 46 41 4c    }.  return FAL
afb0: 53 45 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23 69  SE;.}.#endif..#i
afc0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
afd0: 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a  T_AUTHORIZATION.
afe0: 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20 22  /*.** When the "
aff0: 2e 61 75 74 68 20 4f 4e 22 20 69 73 20 73 65 74  .auth ON" is set
b000: 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
b010: 61 75 74 68 6f 72 69 7a 65 72 20 63 61 6c 6c 62  authorizer callb
b020: 61 63 6b 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b 65  ack is.** invoke
b030: 64 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72 65  d.  It always re
b040: 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b 2e  turns SQLITE_OK.
b050: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
b060: 68 65 6c 6c 41 75 74 68 28 0a 20 20 76 6f 69 64  hellAuth(.  void
b070: 20 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c 0a 20   *pClientData,. 
b080: 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f 6e 73 74   int op,.  const
b090: 20 63 68 61 72 20 2a 7a 41 31 2c 0a 20 20 63 6f   char *zA1,.  co
b0a0: 6e 73 74 20 63 68 61 72 20 2a 7a 41 32 2c 0a 20  nst char *zA2,. 
b0b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 33   const char *zA3
b0c0: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
b0d0: 7a 41 34 0a 29 7b 0a 20 20 53 68 65 6c 6c 53 74  zA4.){.  ShellSt
b0e0: 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53  ate *p = (ShellS
b0f0: 74 61 74 65 2a 29 70 43 6c 69 65 6e 74 44 61 74  tate*)pClientDat
b100: 61 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  a;.  static cons
b110: 74 20 63 68 61 72 20 2a 61 7a 41 63 74 69 6f 6e  t char *azAction
b120: 5b 5d 20 3d 20 7b 20 30 2c 0a 20 20 20 20 20 22  [] = { 0,.     "
b130: 43 52 45 41 54 45 5f 49 4e 44 45 58 22 2c 20 20  CREATE_INDEX",  
b140: 20 20 20 20 20 20 20 22 43 52 45 41 54 45 5f 54         "CREATE_T
b150: 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20 20 22  ABLE",         "
b160: 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44 45  CREATE_TEMP_INDE
b170: 58 22 2c 0a 20 20 20 20 20 22 43 52 45 41 54 45  X",.     "CREATE
b180: 5f 54 45 4d 50 5f 54 41 42 4c 45 22 2c 20 20 20  _TEMP_TABLE",   
b190: 20 22 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 52   "CREATE_TEMP_TR
b1a0: 49 47 47 45 52 22 2c 20 20 22 43 52 45 41 54 45  IGGER",  "CREATE
b1b0: 5f 54 45 4d 50 5f 56 49 45 57 22 2c 0a 20 20 20  _TEMP_VIEW",.   
b1c0: 20 20 22 43 52 45 41 54 45 5f 54 52 49 47 47 45    "CREATE_TRIGGE
b1d0: 52 22 2c 20 20 20 20 20 20 20 22 43 52 45 41 54  R",       "CREAT
b1e0: 45 5f 56 49 45 57 22 2c 20 20 20 20 20 20 20 20  E_VIEW",        
b1f0: 20 20 22 44 45 4c 45 54 45 22 2c 0a 20 20 20 20    "DELETE",.    
b200: 20 22 44 52 4f 50 5f 49 4e 44 45 58 22 2c 20 20   "DROP_INDEX",  
b210: 20 20 20 20 20 20 20 20 20 22 44 52 4f 50 5f 54           "DROP_T
b220: 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20 20 20  ABLE",          
b230: 20 22 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44 45   "DROP_TEMP_INDE
b240: 58 22 2c 0a 20 20 20 20 20 22 44 52 4f 50 5f 54  X",.     "DROP_T
b250: 45 4d 50 5f 54 41 42 4c 45 22 2c 20 20 20 20 20  EMP_TABLE",     
b260: 20 22 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49 47   "DROP_TEMP_TRIG
b270: 47 45 52 22 2c 20 20 20 20 22 44 52 4f 50 5f 54  GER",    "DROP_T
b280: 45 4d 50 5f 56 49 45 57 22 2c 0a 20 20 20 20 20  EMP_VIEW",.     
b290: 22 44 52 4f 50 5f 54 52 49 47 47 45 52 22 2c 20  "DROP_TRIGGER", 
b2a0: 20 20 20 20 20 20 20 20 22 44 52 4f 50 5f 56 49          "DROP_VI
b2b0: 45 57 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  EW",            
b2c0: 22 49 4e 53 45 52 54 22 2c 0a 20 20 20 20 20 22  "INSERT",.     "
b2d0: 50 52 41 47 4d 41 22 2c 20 20 20 20 20 20 20 20  PRAGMA",        
b2e0: 20 20 20 20 20 20 20 22 52 45 41 44 22 2c 20 20         "READ",  
b2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
b300: 53 45 4c 45 43 54 22 2c 0a 20 20 20 20 20 22 54  SELECT",.     "T
b310: 52 41 4e 53 41 43 54 49 4f 4e 22 2c 20 20 20 20  RANSACTION",    
b320: 20 20 20 20 20 20 22 55 50 44 41 54 45 22 2c 20        "UPDATE", 
b330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 41                "A
b340: 54 54 41 43 48 22 2c 0a 20 20 20 20 20 22 44 45  TTACH",.     "DE
b350: 54 41 43 48 22 2c 20 20 20 20 20 20 20 20 20 20  TACH",          
b360: 20 20 20 20 20 22 41 4c 54 45 52 5f 54 41 42 4c       "ALTER_TABL
b370: 45 22 2c 20 20 20 20 20 20 20 20 20 20 22 52 45  E",          "RE
b380: 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 41 4e  INDEX",.     "AN
b390: 41 4c 59 5a 45 22 2c 20 20 20 20 20 20 20 20 20  ALYZE",         
b3a0: 20 20 20 20 20 22 43 52 45 41 54 45 5f 56 54 41       "CREATE_VTA
b3b0: 42 4c 45 22 2c 20 20 20 20 20 20 20 20 22 44 52  BLE",        "DR
b3c0: 4f 50 5f 56 54 41 42 4c 45 22 2c 0a 20 20 20 20  OP_VTABLE",.    
b3d0: 20 22 46 55 4e 43 54 49 4f 4e 22 2c 20 20 20 20   "FUNCTION",    
b3e0: 20 20 20 20 20 20 20 20 20 22 53 41 56 45 50 4f           "SAVEPO
b3f0: 49 4e 54 22 2c 20 20 20 20 20 20 20 20 20 20 20  INT",           
b400: 20 22 52 45 43 55 52 53 49 56 45 22 0a 20 20 7d   "RECURSIVE".  }
b410: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e  ;.  int i;.  con
b420: 73 74 20 63 68 61 72 20 2a 61 7a 5b 34 5d 3b 0a  st char *az[4];.
b430: 20 20 61 7a 5b 30 5d 20 3d 20 7a 41 31 3b 0a 20    az[0] = zA1;. 
b440: 20 61 7a 5b 31 5d 20 3d 20 7a 41 32 3b 0a 20 20   az[1] = zA2;.  
b450: 61 7a 5b 32 5d 20 3d 20 7a 41 33 3b 0a 20 20 61  az[2] = zA3;.  a
b460: 7a 5b 33 5d 20 3d 20 7a 41 34 3b 0a 20 20 75 74  z[3] = zA4;.  ut
b470: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
b480: 2c 20 22 61 75 74 68 6f 72 69 7a 65 72 3a 20 25  , "authorizer: %
b490: 73 22 2c 20 61 7a 41 63 74 69 6f 6e 5b 6f 70 5d  s", azAction[op]
b4a0: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  );.  for(i=0; i<
b4b0: 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 61 77  4; i++){.    raw
b4c0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
b4d0: 22 20 22 29 3b 0a 20 20 20 20 69 66 28 20 61 7a  " ");.    if( az
b4e0: 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 6f 75 74  [i] ){.      out
b4f0: 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e  put_c_string(p->
b500: 6f 75 74 2c 20 61 7a 5b 69 5d 29 3b 0a 20 20 20  out, az[i]);.   
b510: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
b520: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
b530: 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 7d 0a   "NULL");.    }.
b540: 20 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74 66    }.  raw_printf
b550: 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  (p->out, "\n");.
b560: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
b570: 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  OK;.}.#endif../*
b580: 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 63 68 65  .** Print a sche
b590: 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 50  ma statement.  P
b5a0: 61 72 74 20 6f 66 20 4d 4f 44 45 5f 53 65 6d 69  art of MODE_Semi
b5b0: 20 61 6e 64 20 4d 4f 44 45 5f 50 72 65 74 74 79   and MODE_Pretty
b5c0: 20 6f 75 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 54   output..**.** T
b5d0: 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e 76  his routine conv
b5e0: 65 72 74 73 20 73 6f 6d 65 20 43 52 45 41 54 45  erts some CREATE
b5f0: 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e 74   TABLE statement
b600: 73 20 66 6f 72 20 73 68 61 64 6f 77 20 74 61 62  s for shadow tab
b610: 6c 65 73 0a 2a 2a 20 69 6e 20 46 54 53 33 2f 34  les.** in FTS3/4
b620: 2f 35 20 69 6e 74 6f 20 43 52 45 41 54 45 20 54  /5 into CREATE T
b630: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
b640: 54 53 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a  TS statements..*
b650: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72  /.static void pr
b660: 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 46 49  intSchemaLine(FI
b670: 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63  LE *out, const c
b680: 68 61 72 20 2a 7a 2c 20 63 6f 6e 73 74 20 63 68  har *z, const ch
b690: 61 72 20 2a 7a 54 61 69 6c 29 7b 0a 20 20 69 66  ar *zTail){.  if
b6a0: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  ( sqlite3_strglo
b6b0: 62 28 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  b("CREATE TABLE 
b6c0: 5b 27 5c 22 5d 2a 22 2c 20 7a 29 3d 3d 30 20 29  ['\"]*", z)==0 )
b6d0: 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
b6e0: 66 28 6f 75 74 2c 20 22 43 52 45 41 54 45 20 54  f(out, "CREATE T
b6f0: 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49 53  ABLE IF NOT EXIS
b700: 54 53 20 25 73 25 73 22 2c 20 7a 2b 31 33 2c 20  TS %s%s", z+13, 
b710: 7a 54 61 69 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b  zTail);.  }else{
b720: 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
b730: 28 6f 75 74 2c 20 22 25 73 25 73 22 2c 20 7a 2c  (out, "%s%s", z,
b740: 20 7a 54 61 69 6c 29 3b 0a 20 20 7d 0a 7d 0a 73   zTail);.  }.}.s
b750: 74 61 74 69 63 20 76 6f 69 64 20 70 72 69 6e 74  tatic void print
b760: 53 63 68 65 6d 61 4c 69 6e 65 4e 28 46 49 4c 45  SchemaLineN(FILE
b770: 20 2a 6f 75 74 2c 20 63 68 61 72 20 2a 7a 2c 20   *out, char *z, 
b780: 69 6e 74 20 6e 2c 20 63 6f 6e 73 74 20 63 68 61  int n, const cha
b790: 72 20 2a 7a 54 61 69 6c 29 7b 0a 20 20 63 68 61  r *zTail){.  cha
b7a0: 72 20 63 20 3d 20 7a 5b 6e 5d 3b 0a 20 20 7a 5b  r c = z[n];.  z[
b7b0: 6e 5d 20 3d 20 30 3b 0a 20 20 70 72 69 6e 74 53  n] = 0;.  printS
b7c0: 63 68 65 6d 61 4c 69 6e 65 28 6f 75 74 2c 20 7a  chemaLine(out, z
b7d0: 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7a 5b 6e 5d  , zTail);.  z[n]
b7e0: 20 3d 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52   = c;.}../*.** R
b7f0: 65 74 75 72 6e 20 74 72 75 65 20 69 66 20 73 74  eturn true if st
b800: 72 69 6e 67 20 7a 5b 5d 20 68 61 73 20 6e 6f 74  ring z[] has not
b810: 68 69 6e 67 20 62 75 74 20 77 68 69 74 65 73 70  hing but whitesp
b820: 61 63 65 20 61 6e 64 20 63 6f 6d 6d 65 6e 74 73  ace and comments
b830: 20 74 6f 20 74 68 65 0a 2a 2a 20 65 6e 64 20 6f   to the.** end o
b840: 66 20 74 68 65 20 66 69 72 73 74 20 6c 69 6e 65  f the first line
b850: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
b860: 77 73 54 6f 45 6f 6c 28 63 6f 6e 73 74 20 63 68  wsToEol(const ch
b870: 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b  ar *z){.  int i;
b880: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d  .  for(i=0; z[i]
b890: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
b8a0: 7a 5b 69 5d 3d 3d 27 5c 6e 27 20 29 20 72 65 74  z[i]=='\n' ) ret
b8b0: 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 49  urn 1;.    if( I
b8c0: 73 53 70 61 63 65 28 7a 5b 69 5d 29 20 29 20 63  sSpace(z[i]) ) c
b8d0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 69 66 28  ontinue;.    if(
b8e0: 20 7a 5b 69 5d 3d 3d 27 2d 27 20 26 26 20 7a 5b   z[i]=='-' && z[
b8f0: 69 2b 31 5d 3d 3d 27 2d 27 20 29 20 72 65 74 75  i+1]=='-' ) retu
b900: 72 6e 20 31 3b 0a 20 20 20 20 72 65 74 75 72 6e  rn 1;.    return
b910: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
b920: 20 31 3b 0a 7d 0a 20 20 20 20 0a 0a 2f 2a 0a 2a   1;.}.    ../*.*
b930: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63 61  * This is the ca
b940: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 74  llback routine t
b950: 68 61 74 20 74 68 65 20 73 68 65 6c 6c 0a 2a 2a  hat the shell.**
b960: 20 69 6e 76 6f 6b 65 73 20 66 6f 72 20 65 61 63   invokes for eac
b970: 68 20 72 6f 77 20 6f 66 20 61 20 71 75 65 72 79  h row of a query
b980: 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74   result..*/.stat
b990: 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f 63 61 6c  ic int shell_cal
b9a0: 6c 62 61 63 6b 28 0a 20 20 76 6f 69 64 20 2a 70  lback(.  void *p
b9b0: 41 72 67 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c  Arg,.  int nArg,
b9c0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
b9d0: 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  r of result colu
b9e0: 6d 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  mns */.  char **
b9f0: 61 7a 41 72 67 2c 20 20 20 20 2f 2a 20 54 65 78  azArg,    /* Tex
ba00: 74 20 6f 66 20 65 61 63 68 20 72 65 73 75 6c 74  t of each result
ba10: 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61   column */.  cha
ba20: 72 20 2a 2a 61 7a 43 6f 6c 2c 20 20 20 20 2f 2a  r **azCol,    /*
ba30: 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   Column names */
ba40: 0a 20 20 69 6e 74 20 2a 61 69 54 79 70 65 20 20  .  int *aiType  
ba50: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 79      /* Column ty
ba60: 70 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  pes */.){.  int 
ba70: 69 3b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  i;.  ShellState 
ba80: 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65  *p = (ShellState
ba90: 2a 29 70 41 72 67 3b 0a 0a 20 20 69 66 28 20 61  *)pArg;..  if( a
baa0: 7a 41 72 67 3d 3d 30 20 29 20 72 65 74 75 72 6e  zArg==0 ) return
bab0: 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d   0;.  switch( p-
bac0: 3e 63 4d 6f 64 65 20 29 7b 0a 20 20 20 20 63 61  >cMode ){.    ca
bad0: 73 65 20 4d 4f 44 45 5f 4c 69 6e 65 3a 20 7b 0a  se MODE_Line: {.
bae0: 20 20 20 20 20 20 69 6e 74 20 77 20 3d 20 35 3b        int w = 5;
baf0: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
bb00: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
bb10: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
bb20: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
bb30: 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c    int len = strl
bb40: 65 6e 33 30 28 61 7a 43 6f 6c 5b 69 5d 20 3f 20  en30(azCol[i] ? 
bb50: 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a  azCol[i] : "");.
bb60: 20 20 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e          if( len>
bb70: 77 20 29 20 77 20 3d 20 6c 65 6e 3b 0a 20 20 20  w ) w = len;.   
bb80: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
bb90: 2d 3e 63 6e 74 2b 2b 3e 30 20 29 20 75 74 66 38  ->cnt++>0 ) utf8
bba0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
bbb0: 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61  "%s", p->rowSepa
bbc0: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 66 6f  rator);.      fo
bbd0: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
bbe0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  ++){.        utf
bbf0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
bc00: 22 25 2a 73 20 3d 20 25 73 25 73 22 2c 20 77 2c  "%*s = %s%s", w,
bc10: 20 61 7a 43 6f 6c 5b 69 5d 2c 0a 20 20 20 20 20   azCol[i],.     
bc20: 20 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67             azArg
bc30: 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a  [i] ? azArg[i] :
bc40: 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 2c 20 70   p->nullValue, p
bc50: 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b  ->rowSeparator);
bc60: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
bc70: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
bc80: 63 61 73 65 20 4d 4f 44 45 5f 45 78 70 6c 61 69  case MODE_Explai
bc90: 6e 3a 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45  n:.    case MODE
bca0: 5f 43 6f 6c 75 6d 6e 3a 20 7b 0a 20 20 20 20 20  _Column: {.     
bcb0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e   static const in
bcc0: 74 20 61 45 78 70 6c 61 69 6e 57 69 64 74 68 73  t aExplainWidths
bcd0: 5b 5d 20 3d 20 7b 34 2c 20 31 33 2c 20 34 2c 20  [] = {4, 13, 4, 
bce0: 34 2c 20 34 2c 20 31 33 2c 20 32 2c 20 31 33 7d  4, 4, 13, 2, 13}
bcf0: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e  ;.      const in
bd00: 74 20 2a 63 6f 6c 57 69 64 74 68 3b 0a 20 20 20  t *colWidth;.   
bd10: 20 20 20 69 6e 74 20 73 68 6f 77 48 64 72 3b 0a     int showHdr;.
bd20: 20 20 20 20 20 20 63 68 61 72 20 2a 72 6f 77 53        char *rowS
bd30: 65 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ep;.      if( p-
bd40: 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 43 6f 6c  >cMode==MODE_Col
bd50: 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 63  umn ){.        c
bd60: 6f 6c 57 69 64 74 68 20 3d 20 70 2d 3e 63 6f 6c  olWidth = p->col
bd70: 57 69 64 74 68 3b 0a 20 20 20 20 20 20 20 20 73  Width;.        s
bd80: 68 6f 77 48 64 72 20 3d 20 70 2d 3e 73 68 6f 77  howHdr = p->show
bd90: 48 65 61 64 65 72 3b 0a 20 20 20 20 20 20 20 20  Header;.        
bda0: 72 6f 77 53 65 70 20 3d 20 70 2d 3e 72 6f 77 53  rowSep = p->rowS
bdb0: 65 70 61 72 61 74 6f 72 3b 0a 20 20 20 20 20 20  eparator;.      
bdc0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63  }else{.        c
bdd0: 6f 6c 57 69 64 74 68 20 3d 20 61 45 78 70 6c 61  olWidth = aExpla
bde0: 69 6e 57 69 64 74 68 73 3b 0a 20 20 20 20 20 20  inWidths;.      
bdf0: 20 20 73 68 6f 77 48 64 72 20 3d 20 31 3b 0a 20    showHdr = 1;. 
be00: 20 20 20 20 20 20 20 72 6f 77 53 65 70 20 3d 20         rowSep = 
be10: 53 45 50 5f 52 6f 77 3b 0a 20 20 20 20 20 20 7d  SEP_Row;.      }
be20: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e  .      if( p->cn
be30: 74 2b 2b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t++==0 ){.      
be40: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
be50: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
be60: 20 20 20 69 6e 74 20 77 2c 20 6e 3b 0a 20 20 20     int w, n;.   
be70: 20 20 20 20 20 20 20 69 66 28 20 69 3c 41 72 72         if( i<Arr
be80: 61 79 53 69 7a 65 28 70 2d 3e 63 6f 6c 57 69 64  aySize(p->colWid
be90: 74 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  th) ){.         
bea0: 20 20 20 77 20 3d 20 63 6f 6c 57 69 64 74 68 5b     w = colWidth[
beb0: 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  i];.          }e
bec0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
bed0: 20 77 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   w = 0;.        
bee0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
bef0: 28 20 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( w==0 ){.      
bf00: 20 20 20 20 20 20 77 20 3d 20 73 74 72 6c 65 6e        w = strlen
bf10: 43 68 61 72 28 61 7a 43 6f 6c 5b 69 5d 20 3f 20  Char(azCol[i] ? 
bf20: 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a  azCol[i] : "");.
bf30: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
bf40: 77 3c 31 30 20 29 20 77 20 3d 20 31 30 3b 0a 20  w<10 ) w = 10;. 
bf50: 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d 20 73             n = s
bf60: 74 72 6c 65 6e 43 68 61 72 28 61 7a 41 72 67 20  trlenChar(azArg 
bf70: 26 26 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a  && azArg[i] ? az
bf80: 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c  Arg[i] : p->null
bf90: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20  Value);.        
bfa0: 20 20 20 20 69 66 28 20 77 3c 6e 20 29 20 77 20      if( w<n ) w 
bfb0: 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = n;.          }
bfc0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
bfd0: 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 63  <ArraySize(p->ac
bfe0: 74 75 61 6c 57 69 64 74 68 29 20 29 7b 0a 20 20  tualWidth) ){.  
bff0: 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61 63 74            p->act
c000: 75 61 6c 57 69 64 74 68 5b 69 5d 20 3d 20 77 3b  ualWidth[i] = w;
c010: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
c020: 20 20 20 20 20 20 20 69 66 28 20 73 68 6f 77 48         if( showH
c030: 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  dr ){.          
c040: 20 20 75 74 66 38 5f 77 69 64 74 68 5f 70 72 69    utf8_width_pri
c050: 6e 74 28 70 2d 3e 6f 75 74 2c 20 77 2c 20 61 7a  nt(p->out, w, az
c060: 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Col[i]);.       
c070: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
c080: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 69  (p->out, "%s", i
c090: 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f 77 53 65  ==nArg-1 ? rowSe
c0a0: 70 20 3a 20 22 20 20 22 29 3b 0a 20 20 20 20 20  p : "  ");.     
c0b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
c0c0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 68 6f  .        if( sho
c0d0: 77 48 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20  wHdr ){.        
c0e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
c0f0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
c100: 20 20 20 20 20 69 6e 74 20 77 3b 0a 20 20 20 20       int w;.    
c110: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 41 72          if( i<Ar
c120: 72 61 79 53 69 7a 65 28 70 2d 3e 61 63 74 75 61  raySize(p->actua
c130: 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20  lWidth) ){.     
c140: 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 70 2d            w = p-
c150: 3e 61 63 74 75 61 6c 57 69 64 74 68 5b 69 5d 3b  >actualWidth[i];
c160: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c170: 69 66 28 20 77 3c 30 20 29 20 77 20 3d 20 2d 77  if( w<0 ) w = -w
c180: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
c190: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
c1a0: 20 20 20 20 77 20 3d 20 31 30 3b 0a 20 20 20 20      w = 10;.    
c1b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c1c0: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
c1d0: 66 28 70 2d 3e 6f 75 74 2c 22 25 2d 2a 2e 2a 73  f(p->out,"%-*.*s
c1e0: 25 73 22 2c 77 2c 77 2c 0a 20 20 20 20 20 20 20  %s",w,w,.       
c1f0: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
c200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 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 22 0a 20 20 20 20 20 20 20  -------".       
c240: 20 20 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d              "---
c250: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c260: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
c280: 2d 2d 2d 2d 2d 2d 2d 22 2c 0a 20 20 20 20 20 20  -------",.      
c290: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 3d                i=
c2a0: 3d 6e 41 72 67 2d 31 20 3f 20 72 6f 77 53 65 70  =nArg-1 ? rowSep
c2b0: 20 3a 20 22 20 20 22 29 3b 0a 20 20 20 20 20 20   : "  ");.      
c2c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
c2d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
c2e0: 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65  ( azArg==0 ) bre
c2f0: 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ak;.      for(i=
c300: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
c310: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 77 3b 0a  .        int w;.
c320: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 41 72          if( i<Ar
c330: 72 61 79 53 69 7a 65 28 70 2d 3e 61 63 74 75 61  raySize(p->actua
c340: 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20  lWidth) ){.     
c350: 20 20 20 20 20 20 77 20 3d 20 70 2d 3e 61 63 74        w = p->act
c360: 75 61 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20  ualWidth[i];.   
c370: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c380: 20 20 20 20 20 20 20 77 20 3d 20 31 30 3b 0a 20         w = 10;. 
c390: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c3a0: 20 69 66 28 20 70 2d 3e 63 4d 6f 64 65 3d 3d 4d   if( p->cMode==M
c3b0: 4f 44 45 5f 45 78 70 6c 61 69 6e 20 26 26 20 61  ODE_Explain && a
c3c0: 7a 41 72 67 5b 69 5d 20 26 26 20 73 74 72 6c 65  zArg[i] && strle
c3d0: 6e 43 68 61 72 28 61 7a 41 72 67 5b 69 5d 29 3e  nChar(azArg[i])>
c3e0: 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77  w ){.          w
c3f0: 20 3d 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a   = strlenChar(az
c400: 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[i]);.       
c410: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
c420: 3d 3d 31 20 26 26 20 70 2d 3e 61 69 49 6e 64 65  ==1 && p->aiInde
c430: 6e 74 20 26 26 20 70 2d 3e 70 53 74 6d 74 20 29  nt && p->pStmt )
c440: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
c450: 70 2d 3e 69 49 6e 64 65 6e 74 3c 70 2d 3e 6e 49  p->iIndent<p->nI
c460: 6e 64 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20  ndent ){.       
c470: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
c480: 28 70 2d 3e 6f 75 74 2c 20 22 25 2a 2e 73 22 2c  (p->out, "%*.s",
c490: 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 70 2d 3e   p->aiIndent[p->
c4a0: 69 49 6e 64 65 6e 74 5d 2c 20 22 22 29 3b 0a 20  iIndent], "");. 
c4b0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
c4c0: 20 20 20 20 20 70 2d 3e 69 49 6e 64 65 6e 74 2b       p->iIndent+
c4d0: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  +;.        }.   
c4e0: 20 20 20 20 20 75 74 66 38 5f 77 69 64 74 68 5f       utf8_width_
c4f0: 70 72 69 6e 74 28 70 2d 3e 6f 75 74 2c 20 77 2c  print(p->out, w,
c500: 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72   azArg[i] ? azAr
c510: 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61  g[i] : p->nullVa
c520: 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 75 74  lue);.        ut
c530: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
c540: 2c 20 22 25 73 22 2c 20 69 3d 3d 6e 41 72 67 2d  , "%s", i==nArg-
c550: 31 20 3f 20 72 6f 77 53 65 70 20 3a 20 22 20 20  1 ? rowSep : "  
c560: 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
c570: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
c580: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 53 65 6d     case MODE_Sem
c590: 69 3a 20 7b 20 20 20 2f 2a 20 2e 73 63 68 65 6d  i: {   /* .schem
c5a0: 61 20 61 6e 64 20 2e 66 75 6c 6c 73 63 68 65 6d  a and .fullschem
c5b0: 61 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20  a output */.    
c5c0: 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e    printSchemaLin
c5d0: 65 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b  e(p->out, azArg[
c5e0: 30 5d 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20  0], ";\n");.    
c5f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
c600: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 50 72 65     case MODE_Pre
c610: 74 74 79 3a 20 7b 20 20 2f 2a 20 2e 73 63 68 65  tty: {  /* .sche
c620: 6d 61 20 61 6e 64 20 2e 66 75 6c 6c 73 63 68 65  ma and .fullsche
c630: 6d 61 20 77 69 74 68 20 2d 2d 69 6e 64 65 6e 74  ma with --indent
c640: 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a   */.      char *
c650: 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a  z;.      int j;.
c660: 20 20 20 20 20 20 69 6e 74 20 6e 50 61 72 65 6e        int nParen
c670: 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72   = 0;.      char
c680: 20 63 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20   cEnd = 0;.     
c690: 20 63 68 61 72 20 63 3b 0a 20 20 20 20 20 20 69   char c;.      i
c6a0: 6e 74 20 6e 4c 69 6e 65 20 3d 20 30 3b 0a 20 20  nt nLine = 0;.  
c6b0: 20 20 20 20 61 73 73 65 72 74 28 20 6e 41 72 67      assert( nArg
c6c0: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ==1 );.      if(
c6d0: 20 61 7a 41 72 67 5b 30 5d 3d 3d 30 20 29 20 62   azArg[0]==0 ) b
c6e0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
c6f0: 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28  sqlite3_strlike(
c700: 22 43 52 45 41 54 45 20 56 49 45 57 25 22 2c 20  "CREATE VIEW%", 
c710: 61 7a 41 72 67 5b 30 5d 2c 20 30 29 3d 3d 30 0a  azArg[0], 0)==0.
c720: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
c730: 33 5f 73 74 72 6c 69 6b 65 28 22 43 52 45 41 54  3_strlike("CREAT
c740: 45 20 54 52 49 47 25 22 2c 20 61 7a 41 72 67 5b  E TRIG%", azArg[
c750: 30 5d 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20  0], 0)==0.      
c760: 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
c770: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
c780: 25 73 3b 5c 6e 22 2c 20 61 7a 41 72 67 5b 30 5d  %s;\n", azArg[0]
c790: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
c7a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c7b0: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
c7c0: 6e 74 66 28 22 25 73 22 2c 20 61 7a 41 72 67 5b  ntf("%s", azArg[
c7d0: 30 5d 29 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30  0]);.      j = 0
c7e0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
c7f0: 20 49 73 53 70 61 63 65 28 7a 5b 69 5d 29 3b 20   IsSpace(z[i]); 
c800: 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 66 6f 72  i++){}.      for
c810: 28 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30  (; (c = z[i])!=0
c820: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
c830: 69 66 28 20 49 73 53 70 61 63 65 28 63 29 20 29  if( IsSpace(c) )
c840: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
c850: 7a 5b 6a 2d 31 5d 3d 3d 27 5c 72 27 20 29 20 7a  z[j-1]=='\r' ) z
c860: 5b 6a 2d 31 5d 20 3d 20 27 5c 6e 27 3b 0a 20 20  [j-1] = '\n';.  
c870: 20 20 20 20 20 20 20 20 69 66 28 20 49 73 53 70          if( IsSp
c880: 61 63 65 28 7a 5b 6a 2d 31 5d 29 20 7c 7c 20 7a  ace(z[j-1]) || z
c890: 5b 6a 2d 31 5d 3d 3d 27 28 27 20 29 20 63 6f 6e  [j-1]=='(' ) con
c8a0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
c8b0: 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27 28 27  else if( (c=='('
c8c0: 20 7c 7c 20 63 3d 3d 27 29 27 29 20 26 26 20 6a   || c==')') && j
c8d0: 3e 30 20 26 26 20 49 73 53 70 61 63 65 28 7a 5b  >0 && IsSpace(z[
c8e0: 6a 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20  j-1]) ){.       
c8f0: 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20     j--;.        
c900: 7d 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d  }.        z[j++]
c910: 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = c;.      }.  
c920: 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26      while( j>0 &
c930: 26 20 49 73 53 70 61 63 65 28 7a 5b 6a 2d 31 5d  & IsSpace(z[j-1]
c940: 29 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20  ) ){ j--; }.    
c950: 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20    z[j] = 0;.    
c960: 20 20 69 66 28 20 73 74 72 6c 65 6e 33 30 28 7a    if( strlen30(z
c970: 29 3e 3d 37 39 20 29 7b 0a 20 20 20 20 20 20 20  )>=79 ){.       
c980: 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 28 63 20 3d   for(i=j=0; (c =
c990: 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b   z[i])!=0; i++){
c9a0: 20 20 2f 2a 20 43 6f 70 79 20 63 68 61 6e 67 65    /* Copy change
c9b0: 73 20 66 72 6f 6d 20 7a 5b 69 5d 20 62 61 63 6b  s from z[i] back
c9c0: 20 74 6f 20 7a 5b 6a 5d 20 2a 2f 0a 20 20 20 20   to z[j] */.    
c9d0: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 63 45 6e        if( c==cEn
c9e0: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d ){.           
c9f0: 20 63 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20   cEnd = 0;.     
ca00: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
ca10: 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27 5c 27 27  =='"' || c=='\''
ca20: 20 7c 7c 20 63 3d 3d 27 60 27 20 29 7b 0a 20 20   || c=='`' ){.  
ca30: 20 20 20 20 20 20 20 20 20 20 63 45 6e 64 20 3d            cEnd =
ca40: 20 63 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   c;.          }e
ca50: 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b 27 20 29  lse if( c=='[' )
ca60: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 45  {.            cE
ca70: 6e 64 20 3d 20 27 5d 27 3b 0a 20 20 20 20 20 20  nd = ']';.      
ca80: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
ca90: 3d 27 2d 27 20 26 26 20 7a 5b 69 2b 31 5d 3d 3d  ='-' && z[i+1]==
caa0: 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  '-' ){.         
cab0: 20 20 20 63 45 6e 64 20 3d 20 27 5c 6e 27 3b 0a     cEnd = '\n';.
cac0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
cad0: 69 66 28 20 63 3d 3d 27 28 27 20 29 7b 0a 20 20  if( c=='(' ){.  
cae0: 20 20 20 20 20 20 20 20 20 20 6e 50 61 72 65 6e            nParen
caf0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  ++;.          }e
cb00: 6c 73 65 20 69 66 28 20 63 3d 3d 27 29 27 20 29  lse if( c==')' )
cb10: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 50  {.            nP
cb20: 61 72 65 6e 2d 2d 3b 0a 20 20 20 20 20 20 20 20  aren--;.        
cb30: 20 20 20 20 69 66 28 20 6e 4c 69 6e 65 3e 30 20      if( nLine>0 
cb40: 26 26 20 6e 50 61 72 65 6e 3d 3d 30 20 26 26 20  && nParen==0 && 
cb50: 6a 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  j>0 ){.         
cb60: 20 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61       printSchema
cb70: 4c 69 6e 65 4e 28 70 2d 3e 6f 75 74 2c 20 7a 2c  LineN(p->out, z,
cb80: 20 6a 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20   j, "\n");.     
cb90: 20 20 20 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a           j = 0;.
cba0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
cbb0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cbc0: 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a      z[j++] = c;.
cbd0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 50            if( nP
cbe0: 61 72 65 6e 3d 3d 31 20 26 26 20 63 45 6e 64 3d  aren==1 && cEnd=
cbf0: 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20 26 26  =0.           &&
cc00: 20 28 63 3d 3d 27 28 27 20 7c 7c 20 63 3d 3d 27   (c=='(' || c=='
cc10: 5c 6e 27 20 7c 7c 20 28 63 3d 3d 27 2c 27 20 26  \n' || (c==',' &
cc20: 26 20 21 77 73 54 6f 45 6f 6c 28 7a 2b 69 2b 31  & !wsToEol(z+i+1
cc30: 29 29 29 0a 20 20 20 20 20 20 20 20 20 20 29 7b  ))).          ){
cc40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
cc50: 20 63 3d 3d 27 5c 6e 27 20 29 20 6a 2d 2d 3b 0a   c=='\n' ) j--;.
cc60: 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69 6e              prin
cc70: 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28 70 2d 3e  tSchemaLineN(p->
cc80: 6f 75 74 2c 20 7a 2c 20 6a 2c 20 22 5c 6e 20 20  out, z, j, "\n  
cc90: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
cca0: 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  j = 0;.         
ccb0: 20 20 20 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20     nLine++;.    
ccc0: 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 49          while( I
ccd0: 73 53 70 61 63 65 28 7a 5b 69 2b 31 5d 29 20 29  sSpace(z[i+1]) )
cce0: 7b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20 20 20 20  { i++; }.       
ccf0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
cd00: 20 20 20 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b         z[j] = 0;
cd10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
cd20: 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 70  rintSchemaLine(p
cd30: 2d 3e 6f 75 74 2c 20 7a 2c 20 22 3b 5c 6e 22 29  ->out, z, ";\n")
cd40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
cd50: 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 62  free(z);.      b
cd60: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
cd70: 63 61 73 65 20 4d 4f 44 45 5f 4c 69 73 74 3a 20  case MODE_List: 
cd80: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63  {.      if( p->c
cd90: 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68  nt++==0 && p->sh
cda0: 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20  owHeader ){.    
cdb0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
cdc0: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
cdd0: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
cde0: 28 70 2d 3e 6f 75 74 2c 22 25 73 25 73 22 2c 61  (p->out,"%s%s",a
cdf0: 7a 43 6f 6c 5b 69 5d 2c 0a 20 20 20 20 20 20 20  zCol[i],.       
ce00: 20 20 20 20 20 20 20 20 20 20 20 69 3d 3d 6e 41             i==nA
ce10: 72 67 2d 31 20 3f 20 70 2d 3e 72 6f 77 53 65 70  rg-1 ? p->rowSep
ce20: 61 72 61 74 6f 72 20 3a 20 70 2d 3e 63 6f 6c 53  arator : p->colS
ce30: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
ce40: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
ce50: 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20     if( azArg==0 
ce60: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 66  ) break;.      f
ce70: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
ce80: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  i++){.        ch
ce90: 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d  ar *z = azArg[i]
cea0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 3d  ;.        if( z=
ceb0: 3d 30 20 29 20 7a 20 3d 20 70 2d 3e 6e 75 6c 6c  =0 ) z = p->null
cec0: 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 75  Value;.        u
ced0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
cee0: 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20  t, "%s", z);.   
cef0: 20 20 20 20 20 69 66 28 20 69 3c 6e 41 72 67 2d       if( i<nArg-
cf00: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  1 ){.          u
cf10: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
cf20: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53  t, "%s", p->colS
cf30: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
cf40: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
cf50: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
cf60: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
cf70: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a  >rowSeparator);.
cf80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
cf90: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
cfa0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
cfb0: 44 45 5f 48 74 6d 6c 3a 20 7b 0a 20 20 20 20 20  DE_Html: {.     
cfc0: 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30   if( p->cnt++==0
cfd0: 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65   && p->showHeade
cfe0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  r ){.        raw
cff0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
d000: 3c 54 52 3e 22 29 3b 0a 20 20 20 20 20 20 20 20  <TR>");.        
d010: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
d020: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
d030: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
d040: 75 74 2c 22 3c 54 48 3e 22 29 3b 0a 20 20 20 20  ut,"<TH>");.    
d050: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68 74 6d        output_htm
d060: 6c 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c  l_string(p->out,
d070: 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20   azCol[i]);.    
d080: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
d090: 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 48 3e 5c 6e  (p->out,"</TH>\n
d0a0: 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ");.        }.  
d0b0: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
d0c0: 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52 3e 5c 6e  (p->out,"</TR>\n
d0d0: 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
d0e0: 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29    if( azArg==0 )
d0f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 72 61   break;.      ra
d100: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
d110: 22 3c 54 52 3e 22 29 3b 0a 20 20 20 20 20 20 66  "<TR>");.      f
d120: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
d130: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 72 61  i++){.        ra
d140: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
d150: 22 3c 54 44 3e 22 29 3b 0a 20 20 20 20 20 20 20  "<TD>");.       
d160: 20 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72   output_html_str
d170: 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72  ing(p->out, azAr
d180: 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20  g[i] ? azArg[i] 
d190: 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b  : p->nullValue);
d1a0: 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
d1b0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 2f 54 44  ntf(p->out,"</TD
d1c0: 3e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  >\n");.      }. 
d1d0: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
d1e0: 70 2d 3e 6f 75 74 2c 22 3c 2f 54 52 3e 5c 6e 22  p->out,"</TR>\n"
d1f0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
d200: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d      }.    case M
d210: 4f 44 45 5f 54 63 6c 3a 20 7b 0a 20 20 20 20 20  ODE_Tcl: {.     
d220: 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30   if( p->cnt++==0
d230: 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65   && p->showHeade
d240: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  r ){.        for
d250: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
d260: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75  +){.          ou
d270: 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d  tput_c_string(p-
d280: 3e 6f 75 74 2c 61 7a 43 6f 6c 5b 69 5d 20 3f 20  >out,azCol[i] ? 
d290: 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a  azCol[i] : "");.
d2a0: 20 20 20 20 20 20 20 20 20 20 69 66 28 69 3c 6e            if(i<n
d2b0: 41 72 67 2d 31 29 20 75 74 66 38 5f 70 72 69 6e  Arg-1) utf8_prin
d2c0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
d2d0: 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
d2e0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
d2f0: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
d300: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70  (p->out, "%s", p
d310: 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b  ->rowSeparator);
d320: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
d330: 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72  f( azArg==0 ) br
d340: 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  eak;.      for(i
d350: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
d360: 7b 0a 20 20 20 20 20 20 20 20 6f 75 74 70 75 74  {.        output
d370: 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  _c_string(p->out
d380: 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41  , azArg[i] ? azA
d390: 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56  rg[i] : p->nullV
d3a0: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 69  alue);.        i
d3b0: 66 28 69 3c 6e 41 72 67 2d 31 29 20 75 74 66 38  f(i<nArg-1) utf8
d3c0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
d3d0: 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61  "%s", p->colSepa
d3e0: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  rator);.      }.
d3f0: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
d400: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
d410: 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
d420: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
d430: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
d440: 44 45 5f 43 73 76 3a 20 7b 0a 20 20 20 20 20 20  DE_Csv: {.      
d450: 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28 70 2d  setBinaryMode(p-
d460: 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  >out, 1);.      
d470: 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20  if( p->cnt++==0 
d480: 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72  && p->showHeader
d490: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
d4a0: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
d4b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74  ){.          out
d4c0: 70 75 74 5f 63 73 76 28 70 2c 20 61 7a 43 6f 6c  put_csv(p, azCol
d4d0: 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a  [i] ? azCol[i] :
d4e0: 20 22 22 2c 20 69 3c 6e 41 72 67 2d 31 29 3b 0a   "", i<nArg-1);.
d4f0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d500: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
d510: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72  >out, "%s", p->r
d520: 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  owSeparator);.  
d530: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
d540: 6e 41 72 67 3e 30 20 29 7b 0a 20 20 20 20 20 20  nArg>0 ){.      
d550: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
d560: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
d570: 20 20 20 6f 75 74 70 75 74 5f 63 73 76 28 70 2c     output_csv(p,
d580: 20 61 7a 41 72 67 5b 69 5d 2c 20 69 3c 6e 41 72   azArg[i], i<nAr
d590: 67 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  g-1);.        }.
d5a0: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
d5b0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
d5c0: 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
d5d0: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
d5e0: 20 20 73 65 74 54 65 78 74 4d 6f 64 65 28 70 2d    setTextMode(p-
d5f0: 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  >out, 1);.      
d600: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
d610: 20 63 61 73 65 20 4d 4f 44 45 5f 49 6e 73 65 72   case MODE_Inser
d620: 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 61  t: {.      if( a
d630: 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b  zArg==0 ) break;
d640: 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
d650: 74 66 28 70 2d 3e 6f 75 74 2c 22 49 4e 53 45 52  tf(p->out,"INSER
d660: 54 20 49 4e 54 4f 20 25 73 22 2c 70 2d 3e 7a 44  T INTO %s",p->zD
d670: 65 73 74 54 61 62 6c 65 29 3b 0a 20 20 20 20 20  estTable);.     
d680: 20 69 66 28 20 70 2d 3e 73 68 6f 77 48 65 61 64   if( p->showHead
d690: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61  er ){.        ra
d6a0: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
d6b0: 22 28 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f  "(");.        fo
d6c0: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
d6d0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
d6e0: 66 28 20 69 3e 30 20 29 20 72 61 77 5f 70 72 69  f( i>0 ) raw_pri
d6f0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 22 29  ntf(p->out, ",")
d700: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
d710: 71 75 6f 74 65 43 68 61 72 28 61 7a 43 6f 6c 5b  quoteChar(azCol[
d720: 69 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  i]) ){.         
d730: 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c     char *z = sql
d740: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22  ite3_mprintf("\"
d750: 25 77 5c 22 22 2c 20 61 7a 43 6f 6c 5b 69 5d 29  %w\"", azCol[i])
d760: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74  ;.            ut
d770: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
d780: 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20  , "%s", z);.    
d790: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
d7a0: 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 20  free(z);.       
d7b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d7c0: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
d7d0: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 61  (p->out, "%s", a
d7e0: 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zCol[i]);.      
d7f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
d800: 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
d810: 74 66 28 70 2d 3e 6f 75 74 2c 22 29 22 29 3b 0a  tf(p->out,")");.
d820: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
d830: 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 66 6f  >cnt++;.      fo
d840: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
d850: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  ++){.        raw
d860: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
d870: 69 3e 30 20 3f 20 22 2c 22 20 3a 20 22 20 56 41  i>0 ? "," : " VA
d880: 4c 55 45 53 28 22 29 3b 0a 20 20 20 20 20 20 20  LUES(");.       
d890: 20 69 66 28 20 28 61 7a 41 72 67 5b 69 5d 3d 3d   if( (azArg[i]==
d8a0: 30 29 20 7c 7c 20 28 61 69 54 79 70 65 20 26 26  0) || (aiType &&
d8b0: 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49   aiType[i]==SQLI
d8c0: 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20  TE_NULL) ){.    
d8d0: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
d8e0: 66 28 70 2d 3e 6f 75 74 2c 22 4e 55 4c 4c 22 29  f(p->out,"NULL")
d8f0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
d900: 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69  if( aiType && ai
d910: 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f  Type[i]==SQLITE_
d920: 54 45 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20  TEXT ){.        
d930: 20 20 69 66 28 20 53 68 65 6c 6c 48 61 73 46 6c    if( ShellHasFl
d940: 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65 77 6c  ag(p, SHFLG_Newl
d950: 69 6e 65 73 29 20 29 7b 0a 20 20 20 20 20 20 20  ines) ){.       
d960: 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74       output_quot
d970: 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  ed_string(p->out
d980: 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  , azArg[i]);.   
d990: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
d9a0: 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74            output
d9b0: 5f 71 75 6f 74 65 64 5f 65 73 63 61 70 65 64 5f  _quoted_escaped_
d9c0: 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61  string(p->out, a
d9d0: 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zArg[i]);.      
d9e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65      }.        }e
d9f0: 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26  lse if( aiType &
da00: 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c  & aiType[i]==SQL
da10: 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  ITE_INTEGER ){. 
da20: 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
da30: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22  intf(p->out,"%s"
da40: 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  , azArg[i]);.   
da50: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61       }else if( a
da60: 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b  iType && aiType[
da70: 69 5d 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54  i]==SQLITE_FLOAT
da80: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68   ){.          ch
da90: 61 72 20 7a 5b 35 30 5d 3b 0a 20 20 20 20 20 20  ar z[50];.      
daa0: 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73      double r = s
dab0: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f  qlite3_column_do
dac0: 75 62 6c 65 28 70 2d 3e 70 53 74 6d 74 2c 20 69  uble(p->pStmt, i
dad0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
dae0: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 35 30  ite3_snprintf(50
daf0: 2c 7a 2c 22 25 21 2e 32 30 67 22 2c 20 72 29 3b  ,z,"%!.20g", r);
db00: 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
db10: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
db20: 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20  s", z);.        
db30: 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65  }else if( aiType
db40: 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53   && aiType[i]==S
db50: 51 4c 49 54 45 5f 42 4c 4f 42 20 26 26 20 70 2d  QLITE_BLOB && p-
db60: 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  >pStmt ){.      
db70: 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a      const void *
db80: 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f  pBlob = sqlite3_
db90: 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 2d 3e 70  column_blob(p->p
dba0: 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20  Stmt, i);.      
dbb0: 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62 20 3d 20      int nBlob = 
dbc0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
dbd0: 79 74 65 73 28 70 2d 3e 70 53 74 6d 74 2c 20 69  ytes(p->pStmt, i
dbe0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74  );.          out
dbf0: 70 75 74 5f 68 65 78 5f 62 6c 6f 62 28 70 2d 3e  put_hex_blob(p->
dc00: 6f 75 74 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f  out, pBlob, nBlo
dc10: 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  b);.        }els
dc20: 65 20 69 66 28 20 69 73 4e 75 6d 62 65 72 28 61  e if( isNumber(a
dc30: 7a 41 72 67 5b 69 5d 2c 20 30 29 20 29 7b 0a 20  zArg[i], 0) ){. 
dc40: 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
dc50: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22  intf(p->out,"%s"
dc60: 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  , azArg[i]);.   
dc70: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 53       }else if( S
dc80: 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20 53  hellHasFlag(p, S
dc90: 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29 20 29  HFLG_Newlines) )
dca0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70  {.          outp
dcb0: 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67  ut_quoted_string
dcc0: 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69  (p->out, azArg[i
dcd0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ]);.        }els
dce0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74  e{.          out
dcf0: 70 75 74 5f 71 75 6f 74 65 64 5f 65 73 63 61 70  put_quoted_escap
dd00: 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  ed_string(p->out
dd10: 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  , azArg[i]);.   
dd20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
dd30: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
dd40: 70 2d 3e 6f 75 74 2c 22 29 3b 5c 6e 22 29 3b 0a  p->out,");\n");.
dd50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
dd60: 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45   }.    case MODE
dd70: 5f 51 75 6f 74 65 3a 20 7b 0a 20 20 20 20 20 20  _Quote: {.      
dd80: 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62  if( azArg==0 ) b
dd90: 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
dda0: 70 2d 3e 63 6e 74 3d 3d 30 20 26 26 20 70 2d 3e  p->cnt==0 && p->
ddb0: 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20  showHeader ){.  
ddc0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
ddd0: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
dde0: 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29         if( i>0 )
ddf0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
de00: 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20  ut, ",");.      
de10: 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65      output_quote
de20: 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c  d_string(p->out,
de30: 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20   azCol[i]);.    
de40: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61      }.        ra
de50: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
de60: 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  "\n");.      }. 
de70: 20 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a 20       p->cnt++;. 
de80: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
de90: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
dea0: 20 20 20 20 69 66 28 20 69 3e 30 20 29 20 72 61      if( i>0 ) ra
deb0: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
dec0: 20 22 2c 22 29 3b 0a 20 20 20 20 20 20 20 20 69   ",");.        i
ded0: 66 28 20 28 61 7a 41 72 67 5b 69 5d 3d 3d 30 29  f( (azArg[i]==0)
dee0: 20 7c 7c 20 28 61 69 54 79 70 65 20 26 26 20 61   || (aiType && a
def0: 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45  iType[i]==SQLITE
df00: 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20  _NULL) ){.      
df10: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
df20: 70 2d 3e 6f 75 74 2c 22 4e 55 4c 4c 22 29 3b 0a  p->out,"NULL");.
df30: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
df40: 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79  ( aiType && aiTy
df50: 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 54 45  pe[i]==SQLITE_TE
df60: 58 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  XT ){.          
df70: 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74  output_quoted_st
df80: 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41  ring(p->out, azA
df90: 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
dfa0: 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65  }else if( aiType
dfb0: 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53   && aiType[i]==S
dfc0: 51 4c 49 54 45 5f 49 4e 54 45 47 45 52 20 29 7b  QLITE_INTEGER ){
dfd0: 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
dfe0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
dff0: 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  s", azArg[i]);. 
e000: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
e010: 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70   aiType && aiTyp
e020: 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f  e[i]==SQLITE_FLO
e030: 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AT ){.          
e040: 63 68 61 72 20 7a 5b 35 30 5d 3b 0a 20 20 20 20  char z[50];.    
e050: 20 20 20 20 20 20 64 6f 75 62 6c 65 20 72 20 3d        double r =
e060: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
e070: 64 6f 75 62 6c 65 28 70 2d 3e 70 53 74 6d 74 2c  double(p->pStmt,
e080: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   i);.          s
e090: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
e0a0: 35 30 2c 7a 2c 22 25 21 2e 32 30 67 22 2c 20 72  50,z,"%!.20g", r
e0b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  );.          raw
e0c0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
e0d0: 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20  "%s", z);.      
e0e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79    }else if( aiTy
e0f0: 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d  pe && aiType[i]=
e100: 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 26 26 20  =SQLITE_BLOB && 
e110: 70 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  p->pStmt ){.    
e120: 20 20 20 20 20 20 63 6f 6e 73 74 20 76 6f 69 64        const void
e130: 20 2a 70 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65   *pBlob = sqlite
e140: 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 2d  3_column_blob(p-
e150: 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  >pStmt, i);.    
e160: 20 20 20 20 20 20 69 6e 74 20 6e 42 6c 6f 62 20        int nBlob 
e170: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
e180: 5f 62 79 74 65 73 28 70 2d 3e 70 53 74 6d 74 2c  _bytes(p->pStmt,
e190: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f   i);.          o
e1a0: 75 74 70 75 74 5f 68 65 78 5f 62 6c 6f 62 28 70  utput_hex_blob(p
e1b0: 2d 3e 6f 75 74 2c 20 70 42 6c 6f 62 2c 20 6e 42  ->out, pBlob, nB
e1c0: 6c 6f 62 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  lob);.        }e
e1d0: 6c 73 65 20 69 66 28 20 69 73 4e 75 6d 62 65 72  lse if( isNumber
e1e0: 28 61 7a 41 72 67 5b 69 5d 2c 20 30 29 20 29 7b  (azArg[i], 0) ){
e1f0: 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
e200: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
e210: 73 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  s", azArg[i]);. 
e220: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
e230: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71          output_q
e240: 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e  uoted_string(p->
e250: 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  out, azArg[i]);.
e260: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
e270: 7d 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  }.      raw_prin
e280: 74 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b  tf(p->out,"\n");
e290: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e2a0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44    }.    case MOD
e2b0: 45 5f 41 73 63 69 69 3a 20 7b 0a 20 20 20 20 20  E_Ascii: {.     
e2c0: 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30   if( p->cnt++==0
e2d0: 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65   && p->showHeade
e2e0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  r ){.        for
e2f0: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
e300: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
e310: 28 20 69 3e 30 20 29 20 75 74 66 38 5f 70 72 69  ( i>0 ) utf8_pri
e320: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
e330: 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
e340: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 75 74  r);.          ut
e350: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
e360: 2c 22 25 73 22 2c 61 7a 43 6f 6c 5b 69 5d 20 3f  ,"%s",azCol[i] ?
e370: 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b   azCol[i] : "");
e380: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
e390: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
e3a0: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e  ->out, "%s", p->
e3b0: 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  rowSeparator);. 
e3c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
e3d0: 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61   azArg==0 ) brea
e3e0: 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  k;.      for(i=0
e3f0: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
e400: 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20          if( i>0 
e410: 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d  ) utf8_printf(p-
e420: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63  >out, "%s", p->c
e430: 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  olSeparator);.  
e440: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
e450: 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 61 7a  f(p->out,"%s",az
e460: 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69  Arg[i] ? azArg[i
e470: 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65  ] : p->nullValue
e480: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
e490: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
e4a0: 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f  out, "%s", p->ro
e4b0: 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  wSeparator);.   
e4c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
e4d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
e4e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
e4f0: 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f   the callback ro
e500: 75 74 69 6e 65 20 74 68 61 74 20 74 68 65 20 53  utine that the S
e510: 51 4c 69 74 65 20 6c 69 62 72 61 72 79 0a 2a 2a  QLite library.**
e520: 20 69 6e 76 6f 6b 65 73 20 66 6f 72 20 65 61 63   invokes for eac
e530: 68 20 72 6f 77 20 6f 66 20 61 20 71 75 65 72 79  h row of a query
e540: 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74   result..*/.stat
e550: 69 63 20 69 6e 74 20 63 61 6c 6c 62 61 63 6b 28  ic int callback(
e560: 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20  void *pArg, int 
e570: 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41  nArg, char **azA
e580: 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c  rg, char **azCol
e590: 29 7b 0a 20 20 2f 2a 20 73 69 6e 63 65 20 77 65  ){.  /* since we
e5a0: 20 64 6f 6e 27 74 20 68 61 76 65 20 74 79 70 65   don't have type
e5b0: 20 69 6e 66 6f 2c 20 63 61 6c 6c 20 74 68 65 20   info, call the 
e5c0: 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 20 77  shell_callback w
e5d0: 69 74 68 20 61 20 4e 55 4c 4c 20 76 61 6c 75 65  ith a NULL value
e5e0: 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 73 68 65   */.  return she
e5f0: 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28 70 41 72 67  ll_callback(pArg
e600: 2c 20 6e 41 72 67 2c 20 61 7a 41 72 67 2c 20 61  , nArg, azArg, a
e610: 7a 43 6f 6c 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a  zCol, NULL);.}..
e620: 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68  /*.** This is th
e630: 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  e callback routi
e640: 6e 65 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ne from sqlite3_
e650: 65 78 65 63 28 29 20 74 68 61 74 20 61 70 70 65  exec() that appe
e660: 6e 64 73 20 61 6c 6c 0a 2a 2a 20 6f 75 74 70 75  nds all.** outpu
e670: 74 20 6f 6e 74 6f 20 74 68 65 20 65 6e 64 20 6f  t onto the end o
e680: 66 20 61 20 53 68 65 6c 6c 54 65 78 74 20 6f 62  f a ShellText ob
e690: 6a 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ject..*/.static 
e6a0: 69 6e 74 20 63 61 70 74 75 72 65 4f 75 74 70 75  int captureOutpu
e6b0: 74 43 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a  tCallback(void *
e6c0: 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20  pArg, int nArg, 
e6d0: 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68  char **azArg, ch
e6e0: 61 72 20 2a 2a 61 7a 29 7b 0a 20 20 53 68 65 6c  ar **az){.  Shel
e6f0: 6c 54 65 78 74 20 2a 70 20 3d 20 28 53 68 65 6c  lText *p = (Shel
e700: 6c 54 65 78 74 2a 29 70 41 72 67 3b 0a 20 20 69  lText*)pArg;.  i
e710: 6e 74 20 69 3b 0a 20 20 55 4e 55 53 45 44 5f 50  nt i;.  UNUSED_P
e720: 41 52 41 4d 45 54 45 52 28 61 7a 29 3b 0a 20 20  ARAMETER(az);.  
e730: 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 72  if( azArg==0 ) r
e740: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
e750: 2d 3e 6e 20 29 20 61 70 70 65 6e 64 54 65 78 74  ->n ) appendText
e760: 28 70 2c 20 22 7c 22 2c 20 30 29 3b 0a 20 20 66  (p, "|", 0);.  f
e770: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
e780: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 69 20  i++){.    if( i 
e790: 29 20 61 70 70 65 6e 64 54 65 78 74 28 70 2c 20  ) appendText(p, 
e7a0: 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  ",", 0);.    if(
e7b0: 20 61 7a 41 72 67 5b 69 5d 20 29 20 61 70 70 65   azArg[i] ) appe
e7c0: 6e 64 54 65 78 74 28 70 2c 20 61 7a 41 72 67 5b  ndText(p, azArg[
e7d0: 69 5d 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 72 65  i], 0);.  }.  re
e7e0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
e7f0: 20 47 65 6e 65 72 61 74 65 20 61 6e 20 61 70 70   Generate an app
e800: 72 6f 70 72 69 61 74 65 20 53 45 4c 46 54 45 53  ropriate SELFTES
e810: 54 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 6d  T table in the m
e820: 61 69 6e 20 64 61 74 61 62 61 73 65 2e 0a 2a 2f  ain database..*/
e830: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 72 65  .static void cre
e840: 61 74 65 53 65 6c 66 74 65 73 74 54 61 62 6c 65  ateSelftestTable
e850: 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b  (ShellState *p){
e860: 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67  .  char *zErrMsg
e870: 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
e880: 65 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20  exec(p->db,.    
e890: 22 53 41 56 45 50 4f 49 4e 54 20 73 65 6c 66 74  "SAVEPOINT selft
e8a0: 65 73 74 5f 69 6e 69 74 3b 5c 6e 22 0a 20 20 20  est_init;\n".   
e8b0: 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49   "CREATE TABLE I
e8c0: 46 20 4e 4f 54 20 45 58 49 53 54 53 20 73 65 6c  F NOT EXISTS sel
e8d0: 66 74 65 73 74 28 5c 6e 22 0a 20 20 20 20 22 20  ftest(\n".    " 
e8e0: 20 74 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 49   tno INTEGER PRI
e8f0: 4d 41 52 59 20 4b 45 59 2c 5c 6e 22 20 20 20 2f  MARY KEY,\n"   /
e900: 2a 20 54 65 73 74 20 6e 75 6d 62 65 72 20 2a 2f  * Test number */
e910: 0a 20 20 20 20 22 20 20 6f 70 20 54 45 58 54 2c  .    "  op TEXT,
e920: 5c 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20  \n"             
e930: 20 20 20 20 20 20 2f 2a 20 4f 70 65 72 61 74 6f        /* Operato
e940: 72 3a 20 20 6d 65 6d 6f 20 72 75 6e 20 2a 2f 0a  r:  memo run */.
e950: 20 20 20 20 22 20 20 63 6d 64 20 54 45 58 54 2c      "  cmd TEXT,
e960: 5c 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20  \n"             
e970: 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20       /* Command 
e980: 74 65 78 74 20 2a 2f 0a 20 20 20 20 22 20 20 61  text */.    "  a
e990: 6e 73 20 54 45 58 54 5c 6e 22 20 20 20 20 20 20  ns TEXT\n"      
e9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e9b0: 44 65 73 69 72 65 64 20 61 6e 73 77 65 72 20 2a  Desired answer *
e9c0: 2f 0a 20 20 20 20 22 29 3b 22 0a 20 20 20 20 22  /.    ");".    "
e9d0: 43 52 45 41 54 45 20 54 45 4d 50 20 54 41 42 4c  CREATE TEMP TABL
e9e0: 45 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 28  E [_shell$self](
e9f0: 6f 70 2c 63 6d 64 2c 61 6e 73 29 3b 5c 6e 22 0a  op,cmd,ans);\n".
ea00: 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
ea10: 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 28 72   [_shell$self](r
ea20: 6f 77 69 64 2c 6f 70 2c 63 6d 64 29 5c 6e 22 0a  owid,op,cmd)\n".
ea30: 20 20 20 20 22 20 20 56 41 4c 55 45 53 28 63 6f      "  VALUES(co
ea40: 61 6c 65 73 63 65 28 28 53 45 4c 45 43 54 20 28  alesce((SELECT (
ea50: 6d 61 78 28 74 6e 6f 29 2b 31 30 30 29 2f 31 30  max(tno)+100)/10
ea60: 20 46 52 4f 4d 20 73 65 6c 66 74 65 73 74 29 2c   FROM selftest),
ea70: 31 30 29 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20  10),\n".    "   
ea80: 20 20 20 20 20 20 27 6d 65 6d 6f 27 2c 27 54 65        'memo','Te
ea90: 73 74 73 20 67 65 6e 65 72 61 74 65 64 20 62 79  sts generated by
eaa0: 20 2d 2d 69 6e 69 74 27 29 3b 5c 6e 22 0a 20 20   --init');\n".  
eab0: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b    "INSERT INTO [
eac0: 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a  _shell$self]\n".
ead0: 20 20 20 20 22 20 20 53 45 4c 45 43 54 20 27 72      "  SELECT 'r
eae0: 75 6e 27 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20  un',\n".    "   
eaf0: 20 27 53 45 4c 45 43 54 20 68 65 78 28 73 68 61   'SELECT hex(sha
eb00: 33 5f 71 75 65 72 79 28 27 27 53 45 4c 45 43 54  3_query(''SELECT
eb10: 20 74 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e   type,name,tbl_n
eb20: 61 6d 65 2c 73 71 6c 20 22 0a 20 20 20 20 20 20  ame,sql ".      
eb30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb40: 20 20 20 20 20 20 20 20 20 20 20 22 46 52 4f 4d             "FROM
eb50: 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 4f   sqlite_master O
eb60: 52 44 45 52 20 42 59 20 32 27 27 2c 32 32 34 29  RDER BY 2'',224)
eb70: 29 27 2c 5c 6e 22 0a 20 20 20 20 22 20 20 20 20  )',\n".    "    
eb80: 68 65 78 28 73 68 61 33 5f 71 75 65 72 79 28 27  hex(sha3_query('
eb90: 53 45 4c 45 43 54 20 74 79 70 65 2c 6e 61 6d 65  SELECT type,name
eba0: 2c 74 62 6c 5f 6e 61 6d 65 2c 73 71 6c 20 22 0a  ,tbl_name,sql ".
ebb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebc0: 20 20 20 20 20 20 20 20 20 20 22 46 52 4f 4d 20            "FROM 
ebd0: 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 4f 52  sqlite_master OR
ebe0: 44 45 52 20 42 59 20 32 27 2c 32 32 34 29 29 3b  DER BY 2',224));
ebf0: 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20  \n".    "INSERT 
ec00: 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c  INTO [_shell$sel
ec10: 66 5d 5c 6e 22 0a 20 20 20 20 22 20 20 53 45 4c  f]\n".    "  SEL
ec20: 45 43 54 20 27 72 75 6e 27 2c 22 0a 20 20 20 20  ECT 'run',".    
ec30: 22 20 20 20 20 27 53 45 4c 45 43 54 20 68 65 78  "    'SELECT hex
ec40: 28 73 68 61 33 5f 71 75 65 72 79 28 27 27 53 45  (sha3_query(''SE
ec50: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 27 20  LECT * FROM \"' 
ec60: 7c 7c 22 0a 20 20 20 20 22 20 20 20 20 20 20 20  ||".    "       
ec70: 20 70 72 69 6e 74 66 28 27 25 77 27 2c 6e 61 6d   printf('%w',nam
ec80: 65 29 20 7c 7c 20 27 5c 22 20 4e 4f 54 20 49 4e  e) || '\" NOT IN
ec90: 44 45 58 45 44 27 27 2c 32 32 34 29 29 27 2c 5c  DEXED'',224))',\
eca0: 6e 22 0a 20 20 20 20 22 20 20 20 20 68 65 78 28  n".    "    hex(
ecb0: 73 68 61 33 5f 71 75 65 72 79 28 70 72 69 6e 74  sha3_query(print
ecc0: 66 28 27 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  f('SELECT * FROM
ecd0: 20 5c 22 25 77 5c 22 20 4e 4f 54 20 49 4e 44 45   \"%w\" NOT INDE
ece0: 58 45 44 27 2c 6e 61 6d 65 29 2c 32 32 34 29 29  XED',name),224))
ecf0: 5c 6e 22 0a 20 20 20 20 22 20 20 46 52 4f 4d 20  \n".    "  FROM 
ed00: 28 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 53 45  (\n".    "    SE
ed10: 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d 20 73  LECT name FROM s
ed20: 71 6c 69 74 65 5f 6d 61 73 74 65 72 5c 6e 22 0a  qlite_master\n".
ed30: 20 20 20 20 22 20 20 20 20 20 57 48 45 52 45 20      "     WHERE 
ed40: 74 79 70 65 3d 27 74 61 62 6c 65 27 5c 6e 22 0a  type='table'\n".
ed50: 20 20 20 20 22 20 20 20 20 20 20 20 41 4e 44 20      "       AND 
ed60: 6e 61 6d 65 3c 3e 27 73 65 6c 66 74 65 73 74 27  name<>'selftest'
ed70: 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20 20  \n".    "       
ed80: 41 4e 44 20 63 6f 61 6c 65 73 63 65 28 72 6f 6f  AND coalesce(roo
ed90: 74 70 61 67 65 2c 30 29 3e 30 5c 6e 22 0a 20 20  tpage,0)>0\n".  
eda0: 20 20 22 20 20 29 5c 6e 22 0a 20 20 20 20 22 20    "  )\n".    " 
edb0: 4f 52 44 45 52 20 42 59 20 6e 61 6d 65 3b 5c 6e  ORDER BY name;\n
edc0: 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e  ".    "INSERT IN
edd0: 54 4f 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d  TO [_shell$self]
ede0: 5c 6e 22 0a 20 20 20 20 22 20 20 56 41 4c 55 45  \n".    "  VALUE
edf0: 53 28 27 72 75 6e 27 2c 27 50 52 41 47 4d 41 20  S('run','PRAGMA 
ee00: 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 27  integrity_check'
ee10: 2c 27 6f 6b 27 29 3b 5c 6e 22 0a 20 20 20 20 22  ,'ok');\n".    "
ee20: 49 4e 53 45 52 54 20 49 4e 54 4f 20 73 65 6c 66  INSERT INTO self
ee30: 74 65 73 74 28 74 6e 6f 2c 6f 70 2c 63 6d 64 2c  test(tno,op,cmd,
ee40: 61 6e 73 29 22 0a 20 20 20 20 22 20 20 53 45 4c  ans)".    "  SEL
ee50: 45 43 54 20 72 6f 77 69 64 2a 31 30 2c 6f 70 2c  ECT rowid*10,op,
ee60: 63 6d 64 2c 61 6e 73 20 46 52 4f 4d 20 5b 5f 73  cmd,ans FROM [_s
ee70: 68 65 6c 6c 24 73 65 6c 66 5d 3b 5c 6e 22 0a 20  hell$self];\n". 
ee80: 20 20 20 22 44 52 4f 50 20 54 41 42 4c 45 20 5b     "DROP TABLE [
ee90: 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 3b 22 0a 20  _shell$self];". 
eea0: 20 20 20 2c 30 2c 30 2c 26 7a 45 72 72 4d 73 67     ,0,0,&zErrMsg
eeb0: 29 3b 0a 20 20 69 66 28 20 7a 45 72 72 4d 73 67  );.  if( zErrMsg
eec0: 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
eed0: 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 45 4c  ntf(stderr, "SEL
eee0: 46 54 45 53 54 20 69 6e 69 74 69 61 6c 69 7a 61  FTEST initializa
eef0: 74 69 6f 6e 20 66 61 69 6c 75 72 65 3a 20 25 73  tion failure: %s
ef00: 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  \n", zErrMsg);. 
ef10: 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
ef20: 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20  zErrMsg);.  }.  
ef30: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
ef40: 64 62 2c 20 22 52 45 4c 45 41 53 45 20 73 65 6c  db, "RELEASE sel
ef50: 66 74 65 73 74 5f 69 6e 69 74 22 2c 30 2c 30 2c  ftest_init",0,0,
ef60: 30 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65  0);.}.../*.** Se
ef70: 74 20 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f  t the destinatio
ef80: 6e 20 74 61 62 6c 65 20 66 69 65 6c 64 20 6f 66  n table field of
ef90: 20 74 68 65 20 53 68 65 6c 6c 53 74 61 74 65 20   the ShellState 
efa0: 73 74 72 75 63 74 75 72 65 20 74 6f 0a 2a 2a 20  structure to.** 
efb0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
efc0: 74 61 62 6c 65 20 67 69 76 65 6e 2e 20 20 45 73  table given.  Es
efd0: 63 61 70 65 20 61 6e 79 20 71 75 6f 74 65 20 63  cape any quote c
efe0: 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
eff0: 0a 2a 2a 20 74 61 62 6c 65 20 6e 61 6d 65 2e 0a  .** table name..
f000: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
f010: 65 74 5f 74 61 62 6c 65 5f 6e 61 6d 65 28 53 68  et_table_name(Sh
f020: 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e  ellState *p, con
f030: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b  st char *zName){
f040: 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 63  .  int i, n;.  c
f050: 68 61 72 20 63 51 75 6f 74 65 3b 0a 20 20 63 68  har cQuote;.  ch
f060: 61 72 20 2a 7a 3b 0a 0a 20 20 69 66 28 20 70 2d  ar *z;..  if( p-
f070: 3e 7a 44 65 73 74 54 61 62 6c 65 20 29 7b 0a 20  >zDestTable ){. 
f080: 20 20 20 66 72 65 65 28 70 2d 3e 7a 44 65 73 74     free(p->zDest
f090: 54 61 62 6c 65 29 3b 0a 20 20 20 20 70 2d 3e 7a  Table);.    p->z
f0a0: 44 65 73 74 54 61 62 6c 65 20 3d 20 30 3b 0a 20  DestTable = 0;. 
f0b0: 20 7d 0a 20 20 69 66 28 20 7a 4e 61 6d 65 3d 3d   }.  if( zName==
f0c0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 63 51  0 ) return;.  cQ
f0d0: 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61 72  uote = quoteChar
f0e0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 6e 20 3d 20 73  (zName);.  n = s
f0f0: 74 72 6c 65 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a  trlen30(zName);.
f100: 20 20 69 66 28 20 63 51 75 6f 74 65 20 29 20 6e    if( cQuote ) n
f110: 20 2b 3d 20 6e 2b 32 3b 0a 20 20 7a 20 3d 20 70   += n+2;.  z = p
f120: 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 6d  ->zDestTable = m
f130: 61 6c 6c 6f 63 28 20 6e 2b 31 20 29 3b 0a 20 20  alloc( n+1 );.  
f140: 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  if( z==0 ){.    
f150: 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
f160: 72 2c 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66  r,"Error: out of
f170: 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20   memory\n");.   
f180: 20 65 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20   exit(1);.  }.  
f190: 6e 20 3d 20 30 3b 0a 20 20 69 66 28 20 63 51 75  n = 0;.  if( cQu
f1a0: 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63  ote ) z[n++] = c
f1b0: 51 75 6f 74 65 3b 0a 20 20 66 6f 72 28 69 3d 30  Quote;.  for(i=0
f1c0: 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29  ; zName[i]; i++)
f1d0: 7b 0a 20 20 20 20 7a 5b 6e 2b 2b 5d 20 3d 20 7a  {.    z[n++] = z
f1e0: 4e 61 6d 65 5b 69 5d 3b 0a 20 20 20 20 69 66 28  Name[i];.    if(
f1f0: 20 7a 4e 61 6d 65 5b 69 5d 3d 3d 63 51 75 6f 74   zName[i]==cQuot
f200: 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75  e ) z[n++] = cQu
f210: 6f 74 65 3b 0a 20 20 7d 0a 20 20 69 66 28 20 63  ote;.  }.  if( c
f220: 51 75 6f 74 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d  Quote ) z[n++] =
f230: 20 63 51 75 6f 74 65 3b 0a 20 20 7a 5b 6e 5d 20   cQuote;.  z[n] 
f240: 3d 20 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45  = 0;.}.../*.** E
f250: 78 65 63 75 74 65 20 61 20 71 75 65 72 79 20 73  xecute a query s
f260: 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 77 69  tatement that wi
f270: 6c 6c 20 67 65 6e 65 72 61 74 65 20 53 51 4c 20  ll generate SQL 
f280: 6f 75 74 70 75 74 2e 20 20 50 72 69 6e 74 0a 2a  output.  Print.*
f290: 2a 20 74 68 65 20 72 65 73 75 6c 74 20 63 6f 6c  * the result col
f2a0: 75 6d 6e 73 2c 20 63 6f 6d 6d 61 2d 73 65 70 61  umns, comma-sepa
f2b0: 72 61 74 65 64 2c 20 6f 6e 20 61 20 6c 69 6e 65  rated, on a line
f2c0: 20 61 6e 64 20 74 68 65 6e 20 61 64 64 20 61 0a   and then add a.
f2d0: 2a 2a 20 73 65 6d 69 63 6f 6c 6f 6e 20 74 65 72  ** semicolon ter
f2e0: 6d 69 6e 61 74 6f 72 20 74 6f 20 74 68 65 20 65  minator to the e
f2f0: 6e 64 20 6f 66 20 74 68 61 74 20 6c 69 6e 65 2e  nd of that line.
f300: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 75  .**.** If the nu
f310: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
f320: 69 73 20 31 20 61 6e 64 20 74 68 61 74 20 63 6f  is 1 and that co
f330: 6c 75 6d 6e 20 63 6f 6e 74 61 69 6e 73 20 74 65  lumn contains te
f340: 78 74 20 22 2d 2d 22 0a 2a 2a 20 74 68 65 6e 20  xt "--".** then 
f350: 77 72 69 74 65 20 74 68 65 20 73 65 6d 69 63 6f  write the semico
f360: 6c 6f 6e 20 6f 6e 20 61 20 73 65 70 61 72 61 74  lon on a separat
f370: 65 20 6c 69 6e 65 2e 20 20 54 68 61 74 20 77 61  e line.  That wa
f380: 79 2c 20 69 66 20 61 0a 2a 2a 20 22 2d 2d 22 20  y, if a.** "--" 
f390: 63 6f 6d 6d 65 6e 74 20 6f 63 63 75 72 73 20 61  comment occurs a
f3a0: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
f3b0: 20 73 74 61 74 65 6d 65 6e 74 2c 20 74 68 65 20   statement, the 
f3c0: 63 6f 6d 6d 65 6e 74 0a 2a 2a 20 77 6f 6e 27 74  comment.** won't
f3d0: 20 63 6f 6e 73 75 6d 65 20 74 68 65 20 73 65 6d   consume the sem
f3e0: 69 63 6f 6c 6f 6e 20 74 65 72 6d 69 6e 61 74 6f  icolon terminato
f3f0: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
f400: 20 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f   run_table_dump_
f410: 71 75 65 72 79 28 0a 20 20 53 68 65 6c 6c 53 74  query(.  ShellSt
f420: 61 74 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20  ate *p,         
f430: 20 20 2f 2a 20 51 75 65 72 79 20 63 6f 6e 74 65    /* Query conte
f440: 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  xt */.  const ch
f450: 61 72 20 2a 7a 53 65 6c 65 63 74 2c 20 20 20 20  ar *zSelect,    
f460: 20 2f 2a 20 53 45 4c 45 43 54 20 73 74 61 74 65   /* SELECT state
f470: 6d 65 6e 74 20 74 6f 20 65 78 74 72 61 63 74 20  ment to extract 
f480: 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e  content */.  con
f490: 73 74 20 63 68 61 72 20 2a 7a 46 69 72 73 74 52  st char *zFirstR
f4a0: 6f 77 20 20 20 20 2f 2a 20 50 72 69 6e 74 20 62  ow    /* Print b
f4b0: 65 66 6f 72 65 20 66 69 72 73 74 20 72 6f 77 2c  efore first row,
f4c0: 20 69 66 20 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a   if not NULL */.
f4d0: 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
f4e0: 74 20 2a 70 53 65 6c 65 63 74 3b 0a 20 20 69 6e  t *pSelect;.  in
f4f0: 74 20 72 63 3b 0a 20 20 69 6e 74 20 6e 52 65 73  t rc;.  int nRes
f500: 75 6c 74 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  ult;.  int i;.  
f510: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20  const char *z;. 
f520: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
f530: 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20  epare_v2(p->db, 
f540: 7a 53 65 6c 65 63 74 2c 20 2d 31 2c 20 26 70 53  zSelect, -1, &pS
f550: 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 69 66 28  elect, 0);.  if(
f560: 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c   rc!=SQLITE_OK |
f570: 7c 20 21 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  | !pSelect ){.  
f580: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
f590: 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45 52 52  >out, "/**** ERR
f5a0: 4f 52 3a 20 28 25 64 29 20 25 73 20 2a 2a 2a 2a  OR: (%d) %s ****
f5b0: 2a 2f 5c 6e 22 2c 20 72 63 2c 0a 20 20 20 20 20  */\n", rc,.     
f5c0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
f5d0: 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
f5e0: 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63 26 30  );.    if( (rc&0
f5f0: 78 66 66 29 21 3d 53 51 4c 49 54 45 5f 43 4f 52  xff)!=SQLITE_COR
f600: 52 55 50 54 20 29 20 70 2d 3e 6e 45 72 72 2b 2b  RUPT ) p->nErr++
f610: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b  ;.    return rc;
f620: 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
f630: 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74  te3_step(pSelect
f640: 29 3b 0a 20 20 6e 52 65 73 75 6c 74 20 3d 20 73  );.  nResult = s
f650: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
f660: 75 6e 74 28 70 53 65 6c 65 63 74 29 3b 0a 20 20  unt(pSelect);.  
f670: 77 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54  while( rc==SQLIT
f680: 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 66 28  E_ROW ){.    if(
f690: 20 7a 46 69 72 73 74 52 6f 77 20 29 7b 0a 20 20   zFirstRow ){.  
f6a0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
f6b0: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 46  p->out, "%s", zF
f6c0: 69 72 73 74 52 6f 77 29 3b 0a 20 20 20 20 20 20  irstRow);.      
f6d0: 7a 46 69 72 73 74 52 6f 77 20 3d 20 30 3b 0a 20  zFirstRow = 0;. 
f6e0: 20 20 20 7d 0a 20 20 20 20 7a 20 3d 20 28 63 6f     }.    z = (co
f6f0: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
f700: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
f710: 65 6c 65 63 74 2c 20 30 29 3b 0a 20 20 20 20 75  elect, 0);.    u
f720: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
f730: 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20  t, "%s", z);.   
f740: 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 52 65 73   for(i=1; i<nRes
f750: 75 6c 74 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ult; i++){.     
f760: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
f770: 6f 75 74 2c 20 22 2c 25 73 22 2c 20 73 71 6c 69  out, ",%s", sqli
f780: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
f790: 70 53 65 6c 65 63 74 2c 20 69 29 29 3b 0a 20 20  pSelect, i));.  
f7a0: 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 3d 3d 30    }.    if( z==0
f7b0: 20 29 20 7a 20 3d 20 22 22 3b 0a 20 20 20 20 77   ) z = "";.    w
f7c0: 68 69 6c 65 28 20 7a 5b 30 5d 20 26 26 20 28 7a  hile( z[0] && (z
f7d0: 5b 30 5d 21 3d 27 2d 27 20 7c 7c 20 7a 5b 31 5d  [0]!='-' || z[1]
f7e0: 21 3d 27 2d 27 29 20 29 20 7a 2b 2b 3b 0a 20 20  !='-') ) z++;.  
f7f0: 20 20 69 66 28 20 7a 5b 30 5d 20 29 7b 0a 20 20    if( z[0] ){.  
f800: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
f810: 2d 3e 6f 75 74 2c 20 22 5c 6e 3b 5c 6e 22 29 3b  ->out, "\n;\n");
f820: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
f830: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
f840: 6f 75 74 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20  out, ";\n");.   
f850: 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
f860: 74 65 33 5f 73 74 65 70 28 70 53 65 6c 65 63 74  te3_step(pSelect
f870: 29 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71  );.  }.  rc = sq
f880: 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
f890: 53 65 6c 65 63 74 29 3b 0a 20 20 69 66 28 20 72  Select);.  if( r
f8a0: 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
f8b0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
f8c0: 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45  p->out, "/**** E
f8d0: 52 52 4f 52 3a 20 28 25 64 29 20 25 73 20 2a 2a  RROR: (%d) %s **
f8e0: 2a 2a 2a 2f 5c 6e 22 2c 20 72 63 2c 0a 20 20 20  ***/\n", rc,.   
f8f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
f900: 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
f910: 62 29 29 3b 0a 20 20 20 20 69 66 28 20 28 72 63  b));.    if( (rc
f920: 26 30 78 66 66 29 21 3d 53 51 4c 49 54 45 5f 43  &0xff)!=SQLITE_C
f930: 4f 52 52 55 50 54 20 29 20 70 2d 3e 6e 45 72 72  ORRUPT ) p->nErr
f940: 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
f950: 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c   rc;.}../*.** Al
f960: 6c 6f 63 61 74 65 20 73 70 61 63 65 20 61 6e 64  locate space and
f970: 20 73 61 76 65 20 6f 66 66 20 63 75 72 72 65 6e   save off curren
f980: 74 20 65 72 72 6f 72 20 73 74 72 69 6e 67 2e 0a  t error string..
f990: 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
f9a0: 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 0a 20 20  save_err_msg(.  
f9b0: 73 71 6c 69 74 65 33 20 2a 64 62 20 20 20 20 20  sqlite3 *db     
f9c0: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
f9d0: 73 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 29  se to query */.)
f9e0: 7b 0a 20 20 69 6e 74 20 6e 45 72 72 4d 73 67 20  {.  int nErrMsg 
f9f0: 3d 20 31 2b 73 74 72 6c 65 6e 33 30 28 73 71 6c  = 1+strlen30(sql
fa00: 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
fa10: 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
fa20: 67 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  g = sqlite3_mall
fa30: 6f 63 36 34 28 6e 45 72 72 4d 73 67 29 3b 0a 20  oc64(nErrMsg);. 
fa40: 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a   if( zErrMsg ){.
fa50: 20 20 20 20 6d 65 6d 63 70 79 28 7a 45 72 72 4d      memcpy(zErrM
fa60: 73 67 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  sg, sqlite3_errm
fa70: 73 67 28 64 62 29 2c 20 6e 45 72 72 4d 73 67 29  sg(db), nErrMsg)
fa80: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 7a  ;.  }.  return z
fa90: 45 72 72 4d 73 67 3b 0a 7d 0a 0a 23 69 66 64 65  ErrMsg;.}..#ifde
faa0: 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 2f 2a 0a 2a  f __linux__./*.*
fab0: 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 64 69 73  * Attempt to dis
fac0: 70 6c 61 79 20 49 2f 4f 20 73 74 61 74 73 20 6f  play I/O stats o
fad0: 6e 20 4c 69 6e 75 78 20 75 73 69 6e 67 20 2f 70  n Linux using /p
fae0: 72 6f 63 2f 50 49 44 2f 69 6f 0a 2a 2f 0a 73 74  roc/PID/io.*/.st
faf0: 61 74 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61  atic void displa
fb00: 79 4c 69 6e 75 78 49 6f 53 74 61 74 73 28 46 49  yLinuxIoStats(FI
fb10: 4c 45 20 2a 6f 75 74 29 7b 0a 20 20 46 49 4c 45  LE *out){.  FILE
fb20: 20 2a 69 6e 3b 0a 20 20 63 68 61 72 20 7a 5b 32   *in;.  char z[2
fb30: 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  00];.  sqlite3_s
fb40: 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
fb50: 29 2c 20 7a 2c 20 22 2f 70 72 6f 63 2f 25 64 2f  ), z, "/proc/%d/
fb60: 69 6f 22 2c 20 67 65 74 70 69 64 28 29 29 3b 0a  io", getpid());.
fb70: 20 20 69 6e 20 3d 20 66 6f 70 65 6e 28 7a 2c 20    in = fopen(z, 
fb80: 22 72 62 22 29 3b 0a 20 20 69 66 28 20 69 6e 3d  "rb");.  if( in=
fb90: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 77  =0 ) return;.  w
fba0: 68 69 6c 65 28 20 66 67 65 74 73 28 7a 2c 20 73  hile( fgets(z, s
fbb0: 69 7a 65 6f 66 28 7a 29 2c 20 69 6e 29 21 3d 30  izeof(z), in)!=0
fbc0: 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63   ){.    static c
fbd0: 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20 20  onst struct {.  
fbe0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
fbf0: 7a 50 61 74 74 65 72 6e 3b 0a 20 20 20 20 20 20  zPattern;.      
fc00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73  const char *zDes
fc10: 63 3b 0a 20 20 20 20 7d 20 61 54 72 61 6e 73 5b  c;.    } aTrans[
fc20: 5d 20 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 72  ] = {.      { "r
fc30: 63 68 61 72 3a 20 22 2c 20 20 20 20 20 20 20 20  char: ",        
fc40: 20 20 20 20 20 20 20 20 20 20 22 42 79 74 65 73            "Bytes
fc50: 20 72 65 63 65 69 76 65 64 20 62 79 20 72 65 61   received by rea
fc60: 64 28 29 3a 22 20 7d 2c 0a 20 20 20 20 20 20 7b  d():" },.      {
fc70: 20 22 77 63 68 61 72 3a 20 22 2c 20 20 20 20 20   "wchar: ",     
fc80: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 42 79               "By
fc90: 74 65 73 20 73 65 6e 74 20 74 6f 20 77 72 69 74  tes sent to writ
fca0: 65 28 29 3a 22 20 20 20 20 7d 2c 0a 20 20 20 20  e():"    },.    
fcb0: 20 20 7b 20 22 73 79 73 63 72 3a 20 22 2c 20 20    { "syscr: ",  
fcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fcd0: 22 52 65 61 64 28 29 20 73 79 73 74 65 6d 20 63  "Read() system c
fce0: 61 6c 6c 73 3a 22 20 20 20 20 20 20 7d 2c 0a 20  alls:"      },. 
fcf0: 20 20 20 20 20 7b 20 22 73 79 73 63 77 3a 20 22       { "syscw: "
fd00: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
fd10: 20 20 20 22 57 72 69 74 65 28 29 20 73 79 73 74     "Write() syst
fd20: 65 6d 20 63 61 6c 6c 73 3a 22 20 20 20 20 20 7d  em calls:"     }
fd30: 2c 0a 20 20 20 20 20 20 7b 20 22 72 65 61 64 5f  ,.      { "read_
fd40: 62 79 74 65 73 3a 20 22 2c 20 20 20 20 20 20 20  bytes: ",       
fd50: 20 20 20 20 20 20 22 42 79 74 65 73 20 72 65 61        "Bytes rea
fd60: 64 20 66 72 6f 6d 20 73 74 6f 72 61 67 65 3a 22  d from storage:"
fd70: 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 77 72    },.      { "wr
fd80: 69 74 65 5f 62 79 74 65 73 3a 20 22 2c 20 20 20  ite_bytes: ",   
fd90: 20 20 20 20 20 20 20 20 20 22 42 79 74 65 73 20           "Bytes 
fda0: 77 72 69 74 74 65 6e 20 74 6f 20 73 74 6f 72 61  written to stora
fdb0: 67 65 3a 22 20 7d 2c 0a 20 20 20 20 20 20 7b 20  ge:" },.      { 
fdc0: 22 63 61 6e 63 65 6c 6c 65 64 5f 77 72 69 74 65  "cancelled_write
fdd0: 5f 62 79 74 65 73 3a 20 22 2c 20 20 22 43 61 6e  _bytes: ",  "Can
fde0: 63 65 6c 6c 65 64 20 77 72 69 74 65 20 62 79 74  celled write byt
fdf0: 65 73 3a 22 20 20 20 20 7d 2c 0a 20 20 20 20 7d  es:"    },.    }
fe00: 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
fe10: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
fe20: 79 53 69 7a 65 28 61 54 72 61 6e 73 29 3b 20 69  ySize(aTrans); i
fe30: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ++){.      int n
fe40: 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 54 72 61   = strlen30(aTra
fe50: 6e 73 5b 69 5d 2e 7a 50 61 74 74 65 72 6e 29 3b  ns[i].zPattern);
fe60: 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63  .      if( strnc
fe70: 6d 70 28 61 54 72 61 6e 73 5b 69 5d 2e 7a 50 61  mp(aTrans[i].zPa
fe80: 74 74 65 72 6e 2c 20 7a 2c 20 6e 29 3d 3d 30 20  ttern, z, n)==0 
fe90: 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
fea0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33  printf(out, "%-3
feb0: 36 73 20 25 73 22 2c 20 61 54 72 61 6e 73 5b 69  6s %s", aTrans[i
fec0: 5d 2e 7a 44 65 73 63 2c 20 26 7a 5b 6e 5d 29 3b  ].zDesc, &z[n]);
fed0: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
fee0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
fef0: 7d 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a  }.  fclose(in);.
ff00: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
ff10: 44 69 73 70 6c 61 79 20 61 20 73 69 6e 67 6c 65  Display a single
ff20: 20 6c 69 6e 65 20 6f 66 20 73 74 61 74 75 73 20   line of status 
ff30: 75 73 69 6e 67 20 36 34 2d 62 69 74 20 76 61 6c  using 64-bit val
ff40: 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ues..*/.static v
ff50: 6f 69 64 20 64 69 73 70 6c 61 79 53 74 61 74 4c  oid displayStatL
ff60: 69 6e 65 28 0a 20 20 53 68 65 6c 6c 53 74 61 74  ine(.  ShellStat
ff70: 65 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20  e *p,           
ff80: 20 2f 2a 20 54 68 65 20 73 68 65 6c 6c 20 63 6f   /* The shell co
ff90: 6e 74 65 78 74 20 2a 2f 0a 20 20 63 68 61 72 20  ntext */.  char 
ffa0: 2a 7a 4c 61 62 65 6c 2c 20 20 20 20 20 20 20 20  *zLabel,        
ffb0: 20 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f       /* Label fo
ffc0: 72 20 74 68 69 73 20 6f 6e 65 20 6c 69 6e 65 20  r this one line 
ffd0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 46 6f 72 6d  */.  char *zForm
ffe0: 61 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  at,            /
fff0: 2a 20 46 6f 72 6d 61 74 20 66 6f 72 20 74 68 65  * Format for the
10000 20 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69 6e 74   result */.  int
10010 20 69 53 74 61 74 75 73 43 74 72 6c 2c 20 20 20   iStatusCtrl,   
10020 20 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20         /* Which 
10030 73 74 61 74 75 73 20 74 6f 20 64 69 73 70 6c 61  status to displa
10040 79 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 73 65  y */.  int bRese
10050 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
10060 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65   /* True to rese
10070 74 20 74 68 65 20 73 74 61 74 73 20 2a 2f 0a 29  t the stats */.)
10080 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  {.  sqlite3_int6
10090 34 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 73  4 iCur = -1;.  s
100a0 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 48 69  qlite3_int64 iHi
100b0 77 74 72 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20  wtr = -1;.  int 
100c0 69 2c 20 6e 50 65 72 63 65 6e 74 3b 0a 20 20 63  i, nPercent;.  c
100d0 68 61 72 20 7a 4c 69 6e 65 5b 32 30 30 5d 3b 0a  har zLine[200];.
100e0 20 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73    sqlite3_status
100f0 36 34 28 69 53 74 61 74 75 73 43 74 72 6c 2c 20  64(iStatusCtrl, 
10100 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
10110 62 52 65 73 65 74 29 3b 0a 20 20 66 6f 72 28 69  bReset);.  for(i
10120 3d 30 2c 20 6e 50 65 72 63 65 6e 74 3d 30 3b 20  =0, nPercent=0; 
10130 7a 46 6f 72 6d 61 74 5b 69 5d 3b 20 69 2b 2b 29  zFormat[i]; i++)
10140 7b 0a 20 20 20 20 69 66 28 20 7a 46 6f 72 6d 61  {.    if( zForma
10150 74 5b 69 5d 3d 3d 27 25 27 20 29 20 6e 50 65 72  t[i]=='%' ) nPer
10160 63 65 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66  cent++;.  }.  if
10170 28 20 6e 50 65 72 63 65 6e 74 3e 31 20 29 7b 0a  ( nPercent>1 ){.
10180 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
10190 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e  intf(sizeof(zLin
101a0 65 29 2c 20 7a 4c 69 6e 65 2c 20 7a 46 6f 72 6d  e), zLine, zForm
101b0 61 74 2c 20 69 43 75 72 2c 20 69 48 69 77 74 72  at, iCur, iHiwtr
101c0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
101d0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
101e0 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20  (sizeof(zLine), 
101f0 7a 4c 69 6e 65 2c 20 7a 46 6f 72 6d 61 74 2c 20  zLine, zFormat, 
10200 69 48 69 77 74 72 29 3b 0a 20 20 7d 0a 20 20 72  iHiwtr);.  }.  r
10210 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
10220 2c 20 22 25 2d 33 36 73 20 25 73 5c 6e 22 2c 20  , "%-36s %s\n", 
10230 7a 4c 61 62 65 6c 2c 20 7a 4c 69 6e 65 29 3b 0a  zLabel, zLine);.
10240 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79  }../*.** Display
10250 20 6d 65 6d 6f 72 79 20 73 74 61 74 73 2e 0a 2a   memory stats..*
10260 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 69 73  /.static int dis
10270 70 6c 61 79 5f 73 74 61 74 73 28 0a 20 20 73 71  play_stats(.  sq
10280 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
10290 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
102a0 61 62 61 73 65 20 74 6f 20 71 75 65 72 79 20 2a  abase to query *
102b0 2f 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  /.  ShellState *
102c0 70 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20  pArg,           
102d0 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68  /* Pointer to Sh
102e0 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20 69 6e  ellState */.  in
102f0 74 20 62 52 65 73 65 74 20 20 20 20 20 20 20 20  t bReset        
10300 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
10310 65 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 73  e to reset the s
10320 74 61 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  tats */.){.  int
10330 20 69 43 75 72 3b 0a 20 20 69 6e 74 20 69 48 69   iCur;.  int iHi
10340 77 74 72 3b 0a 20 20 46 49 4c 45 20 2a 6f 75 74  wtr;.  FILE *out
10350 3b 0a 20 20 69 66 28 20 70 41 72 67 3d 3d 30 20  ;.  if( pArg==0 
10360 7c 7c 20 70 41 72 67 2d 3e 6f 75 74 3d 3d 30 20  || pArg->out==0 
10370 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f 75  ) return 0;.  ou
10380 74 20 3d 20 70 41 72 67 2d 3e 6f 75 74 3b 0a 0a  t = pArg->out;..
10390 20 20 69 66 28 20 70 41 72 67 2d 3e 70 53 74 6d    if( pArg->pStm
103a0 74 20 26 26 20 28 70 41 72 67 2d 3e 73 74 61 74  t && (pArg->stat
103b0 73 4f 6e 20 26 20 32 29 20 29 7b 0a 20 20 20 20  sOn & 2) ){.    
103c0 69 6e 74 20 6e 43 6f 6c 2c 20 69 2c 20 78 3b 0a  int nCol, i, x;.
103d0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
103e0 20 2a 70 53 74 6d 74 20 3d 20 70 41 72 67 2d 3e   *pStmt = pArg->
103f0 70 53 74 6d 74 3b 0a 20 20 20 20 63 68 61 72 20  pStmt;.    char 
10400 7a 5b 31 30 30 5d 3b 0a 20 20 20 20 6e 43 6f 6c  z[100];.    nCol
10410 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
10420 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a  n_count(pStmt);.
10430 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
10440 75 74 2c 20 22 25 2d 33 36 73 20 25 64 5c 6e 22  ut, "%-36s %d\n"
10450 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 6f 75 74  , "Number of out
10460 70 75 74 20 63 6f 6c 75 6d 6e 73 3a 22 2c 20 6e  put columns:", n
10470 43 6f 6c 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  Col);.    for(i=
10480 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
10490 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
104a0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
104b0 29 2c 7a 2c 22 43 6f 6c 75 6d 6e 20 25 64 20 25  ),z,"Column %d %
104c0 6e 6e 61 6d 65 3a 22 2c 20 69 2c 20 26 78 29 3b  nname:", i, &x);
104d0 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
104e0 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25  tf(out, "%-36s %
104f0 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74 65 33  s\n", z, sqlite3
10500 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74  _column_name(pSt
10510 6d 74 2c 69 29 29 3b 0a 23 69 66 6e 64 65 66 20  mt,i));.#ifndef 
10520 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 44 45 43 4c  SQLITE_OMIT_DECL
10530 54 59 50 45 0a 20 20 20 20 20 20 73 71 6c 69 74  TYPE.      sqlit
10540 65 33 5f 73 6e 70 72 69 6e 74 66 28 33 30 2c 20  e3_snprintf(30, 
10550 7a 2b 78 2c 20 22 64 65 63 6c 61 72 65 64 20 74  z+x, "declared t
10560 79 70 65 3a 22 29 3b 0a 20 20 20 20 20 20 75 74  ype:");.      ut
10570 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  f8_printf(out, "
10580 25 2d 33 36 73 20 25 73 5c 6e 22 2c 20 7a 2c 20  %-36s %s\n", z, 
10590 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64  sqlite3_column_d
105a0 65 63 6c 74 79 70 65 28 70 53 74 6d 74 2c 20 69  ecltype(pStmt, i
105b0 29 29 3b 0a 23 65 6e 64 69 66 0a 23 69 66 64 65  ));.#endif.#ifde
105c0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
105d0 43 4f 4c 55 4d 4e 5f 4d 45 54 41 44 41 54 41 0a  COLUMN_METADATA.
105e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
105f0 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78 2c 20  printf(30, z+x, 
10600 22 64 61 74 61 62 61 73 65 20 6e 61 6d 65 3a 22  "database name:"
10610 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  );.      utf8_pr
10620 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73  intf(out, "%-36s
10630 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74   %s\n", z, sqlit
10640 65 33 5f 63 6f 6c 75 6d 6e 5f 64 61 74 61 62 61  e3_column_databa
10650 73 65 5f 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29  se_name(pStmt,i)
10660 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
10670 5f 73 6e 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b  _snprintf(30, z+
10680 78 2c 20 22 74 61 62 6c 65 20 6e 61 6d 65 3a 22  x, "table name:"
10690 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  );.      utf8_pr
106a0 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73  intf(out, "%-36s
106b0 20 25 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74   %s\n", z, sqlit
106c0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 61 62 6c 65 5f  e3_column_table_
106d0 6e 61 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a  name(pStmt,i));.
106e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
106f0 70 72 69 6e 74 66 28 33 30 2c 20 7a 2b 78 2c 20  printf(30, z+x, 
10700 22 6f 72 69 67 69 6e 20 6e 61 6d 65 3a 22 29 3b  "origin name:");
10710 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
10720 74 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25  tf(out, "%-36s %
10730 73 5c 6e 22 2c 20 7a 2c 20 73 71 6c 69 74 65 33  s\n", z, sqlite3
10740 5f 63 6f 6c 75 6d 6e 5f 6f 72 69 67 69 6e 5f 6e  _column_origin_n
10750 61 6d 65 28 70 53 74 6d 74 2c 69 29 29 3b 0a 23  ame(pStmt,i));.#
10760 65 6e 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a  endif.    }.  }.
10770 0a 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69  .  displayStatLi
10780 6e 65 28 70 41 72 67 2c 20 22 4d 65 6d 6f 72 79  ne(pArg, "Memory
10790 20 55 73 65 64 3a 22 2c 0a 20 20 20 20 20 22 25   Used:",.     "%
107a0 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 20 62  lld (max %lld) b
107b0 79 74 65 73 22 2c 20 53 51 4c 49 54 45 5f 53 54  ytes", SQLITE_ST
107c0 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44  ATUS_MEMORY_USED
107d0 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 64 69 73  , bReset);.  dis
107e0 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72  playStatLine(pAr
107f0 67 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 4f 75  g, "Number of Ou
10800 74 73 74 61 6e 64 69 6e 67 20 41 6c 6c 6f 63 61  tstanding Alloca
10810 74 69 6f 6e 73 3a 22 2c 0a 20 20 20 20 20 22 25  tions:",.     "%
10820 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 22 2c  lld (max %lld)",
10830 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d   SQLITE_STATUS_M
10840 41 4c 4c 4f 43 5f 43 4f 55 4e 54 2c 20 62 52 65  ALLOC_COUNT, bRe
10850 73 65 74 29 3b 0a 20 20 69 66 28 20 70 41 72 67  set);.  if( pArg
10860 2d 3e 73 68 65 6c 6c 46 6c 67 73 20 26 20 53 48  ->shellFlgs & SH
10870 46 4c 47 5f 50 61 67 65 63 61 63 68 65 20 29 7b  FLG_Pagecache ){
10880 0a 20 20 20 20 64 69 73 70 6c 61 79 53 74 61 74  .    displayStat
10890 4c 69 6e 65 28 70 41 72 67 2c 20 22 4e 75 6d 62  Line(pArg, "Numb
108a0 65 72 20 6f 66 20 50 63 61 63 68 65 20 50 61 67  er of Pcache Pag
108b0 65 73 20 55 73 65 64 3a 22 2c 0a 20 20 20 20 20  es Used:",.     
108c0 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c    "%lld (max %ll
108d0 64 29 20 70 61 67 65 73 22 2c 20 53 51 4c 49 54  d) pages", SQLIT
108e0 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41 43  E_STATUS_PAGECAC
108f0 48 45 5f 55 53 45 44 2c 20 62 52 65 73 65 74 29  HE_USED, bReset)
10900 3b 0a 20 20 7d 0a 20 20 64 69 73 70 6c 61 79 53  ;.  }.  displayS
10910 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4e  tatLine(pArg, "N
10920 75 6d 62 65 72 20 6f 66 20 50 63 61 63 68 65 20  umber of Pcache 
10930 4f 76 65 72 66 6c 6f 77 20 42 79 74 65 73 3a 22  Overflow Bytes:"
10940 2c 0a 20 20 20 20 20 22 25 6c 6c 64 20 28 6d 61  ,.     "%lld (ma
10950 78 20 25 6c 6c 64 29 20 62 79 74 65 73 22 2c 20  x %lld) bytes", 
10960 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41  SQLITE_STATUS_PA
10970 47 45 43 41 43 48 45 5f 4f 56 45 52 46 4c 4f 57  GECACHE_OVERFLOW
10980 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 64 69 73  , bReset);.  dis
10990 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72  playStatLine(pAr
109a0 67 2c 20 22 4c 61 72 67 65 73 74 20 41 6c 6c 6f  g, "Largest Allo
109b0 63 61 74 69 6f 6e 3a 22 2c 0a 20 20 20 20 20 22  cation:",.     "
109c0 25 6c 6c 64 20 62 79 74 65 73 22 2c 20 53 51 4c  %lld bytes", SQL
109d0 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f  ITE_STATUS_MALLO
109e0 43 5f 53 49 5a 45 2c 20 62 52 65 73 65 74 29 3b  C_SIZE, bReset);
109f0 0a 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69  .  displayStatLi
10a00 6e 65 28 70 41 72 67 2c 20 22 4c 61 72 67 65 73  ne(pArg, "Larges
10a10 74 20 50 63 61 63 68 65 20 41 6c 6c 6f 63 61 74  t Pcache Allocat
10a20 69 6f 6e 3a 22 2c 0a 20 20 20 20 20 22 25 6c 6c  ion:",.     "%ll
10a30 64 20 62 79 74 65 73 22 2c 20 53 51 4c 49 54 45  d bytes", SQLITE
10a40 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41 43 48  _STATUS_PAGECACH
10a50 45 5f 53 49 5a 45 2c 20 62 52 65 73 65 74 29 3b  E_SIZE, bReset);
10a60 0a 23 69 66 64 65 66 20 59 59 54 52 41 43 4b 4d  .#ifdef YYTRACKM
10a70 41 58 53 54 41 43 4b 44 45 50 54 48 0a 20 20 64  AXSTACKDEPTH.  d
10a80 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70  isplayStatLine(p
10a90 41 72 67 2c 20 22 44 65 65 70 65 73 74 20 50 61  Arg, "Deepest Pa
10aa0 72 73 65 72 20 53 74 61 63 6b 3a 22 2c 0a 20 20  rser Stack:",.  
10ab0 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c     "%lld (max %l
10ac0 6c 64 29 22 2c 20 53 51 4c 49 54 45 5f 53 54 41  ld)", SQLITE_STA
10ad0 54 55 53 5f 50 41 52 53 45 52 5f 53 54 41 43 4b  TUS_PARSER_STACK
10ae0 2c 20 62 52 65 73 65 74 29 3b 0a 23 65 6e 64 69  , bReset);.#endi
10af0 66 0a 0a 20 20 69 66 28 20 64 62 20 29 7b 0a 20  f..  if( db ){. 
10b00 20 20 20 69 66 28 20 70 41 72 67 2d 3e 73 68 65     if( pArg->she
10b10 6c 6c 46 6c 67 73 20 26 20 53 48 46 4c 47 5f 4c  llFlgs & SHFLG_L
10b20 6f 6f 6b 61 73 69 64 65 20 29 7b 0a 20 20 20 20  ookaside ){.    
10b30 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
10b40 3d 20 2d 31 3b 0a 20 20 20 20 20 20 73 71 6c 69  = -1;.      sqli
10b50 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
10b60 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
10b70 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 55 53 45 44  S_LOOKASIDE_USED
10b80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10b90 20 20 20 20 20 20 20 20 20 20 26 69 43 75 72 2c            &iCur,
10ba0 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74   &iHiwtr, bReset
10bb0 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  );.      raw_pri
10bc0 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 0a 20  ntf(pArg->out,. 
10bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4c 6f               "Lo
10be0 6f 6b 61 73 69 64 65 20 53 6c 6f 74 73 20 55 73  okaside Slots Us
10bf0 65 64 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ed:             
10c00 20 20 20 25 64 20 28 6d 61 78 20 25 64 29 5c 6e     %d (max %d)\n
10c10 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
10c20 20 69 43 75 72 2c 20 69 48 69 77 74 72 29 3b 0a   iCur, iHiwtr);.
10c30 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62        sqlite3_db
10c40 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
10c50 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b  TE_DBSTATUS_LOOK
10c60 41 53 49 44 45 5f 48 49 54 2c 0a 20 20 20 20 20  ASIDE_HIT,.     
10c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c80 20 20 20 26 69 43 75 72 2c 20 26 69 48 69 77 74     &iCur, &iHiwt
10c90 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20  r, bReset);.    
10ca0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
10cb0 67 2d 3e 6f 75 74 2c 20 22 53 75 63 63 65 73 73  g->out, "Success
10cc0 66 75 6c 20 6c 6f 6f 6b 61 73 69 64 65 20 61 74  ful lookaside at
10cd0 74 65 6d 70 74 73 3a 20 20 20 20 20 20 20 25 64  tempts:       %d
10ce0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
10cf0 20 20 20 69 48 69 77 74 72 29 3b 0a 20 20 20 20     iHiwtr);.    
10d00 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
10d10 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  tus(db, SQLITE_D
10d20 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44  BSTATUS_LOOKASID
10d30 45 5f 4d 49 53 53 5f 53 49 5a 45 2c 0a 20 20 20  E_MISS_SIZE,.   
10d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10d50 20 20 20 20 20 26 69 43 75 72 2c 20 26 69 48 69       &iCur, &iHi
10d60 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  wtr, bReset);.  
10d70 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
10d80 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 6b 61  Arg->out, "Looka
10d90 73 69 64 65 20 66 61 69 6c 75 72 65 73 20 64 75  side failures du
10da0 65 20 74 6f 20 73 69 7a 65 3a 20 20 20 20 20 20  e to size:      
10db0 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
10dc0 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a 20 20       iHiwtr);.  
10dd0 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
10de0 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
10df0 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53  _DBSTATUS_LOOKAS
10e00 49 44 45 5f 4d 49 53 53 5f 46 55 4c 4c 2c 0a 20  IDE_MISS_FULL,. 
10e10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10e20 20 20 20 20 20 20 20 26 69 43 75 72 2c 20 26 69         &iCur, &i
10e30 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a  Hiwtr, bReset);.
10e40 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
10e50 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f  (pArg->out, "Loo
10e60 6b 61 73 69 64 65 20 66 61 69 6c 75 72 65 73 20  kaside failures 
10e70 64 75 65 20 74 6f 20 4f 4f 4d 3a 20 20 20 20 20  due to OOM:     
10e80 20 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20    %d\n",.       
10e90 20 20 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a         iHiwtr);.
10ea0 20 20 20 20 7d 0a 20 20 20 20 69 48 69 77 74 72      }.    iHiwtr
10eb0 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20   = iCur = -1;.  
10ec0 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
10ed0 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  tus(db, SQLITE_D
10ee0 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 55 53  BSTATUS_CACHE_US
10ef0 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77  ED, &iCur, &iHiw
10f00 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  tr, bReset);.   
10f10 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
10f20 2d 3e 6f 75 74 2c 20 22 50 61 67 65 72 20 48 65  ->out, "Pager He
10f30 61 70 20 55 73 61 67 65 3a 20 20 20 20 20 20 20  ap Usage:       
10f40 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 20               %d 
10f50 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20  bytes\n",.      
10f60 20 20 20 20 20 20 69 43 75 72 29 3b 0a 20 20 20        iCur);.   
10f70 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
10f80 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
10f90 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53  _db_status(db, S
10fa0 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43  QLITE_DBSTATUS_C
10fb0 41 43 48 45 5f 48 49 54 2c 20 26 69 43 75 72 2c  ACHE_HIT, &iCur,
10fc0 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20   &iHiwtr, 1);.  
10fd0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
10fe0 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61  g->out, "Page ca
10ff0 63 68 65 20 68 69 74 73 3a 20 20 20 20 20 20 20  che hits:       
11000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
11010 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20  \n", iCur);.    
11020 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20  iHiwtr = iCur = 
11030 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  -1;.    sqlite3_
11040 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
11050 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41  LITE_DBSTATUS_CA
11060 43 48 45 5f 4d 49 53 53 2c 20 26 69 43 75 72 2c  CHE_MISS, &iCur,
11070 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20 20   &iHiwtr, 1);.  
11080 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
11090 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63 61  g->out, "Page ca
110a0 63 68 65 20 6d 69 73 73 65 73 3a 20 20 20 20 20  che misses:     
110b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
110c0 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20  \n", iCur);.    
110d0 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20  iHiwtr = iCur = 
110e0 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  -1;.    sqlite3_
110f0 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
11100 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41  LITE_DBSTATUS_CA
11110 43 48 45 5f 57 52 49 54 45 2c 20 26 69 43 75 72  CHE_WRITE, &iCur
11120 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20  , &iHiwtr, 1);. 
11130 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
11140 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63  rg->out, "Page c
11150 61 63 68 65 20 77 72 69 74 65 73 3a 20 20 20 20  ache writes:    
11160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
11170 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20  d\n", iCur);.   
11180 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
11190 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
111a0 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53  _db_status(db, S
111b0 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43  QLITE_DBSTATUS_C
111c0 41 43 48 45 5f 53 50 49 4c 4c 2c 20 26 69 43 75  ACHE_SPILL, &iCu
111d0 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a  r, &iHiwtr, 1);.
111e0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
111f0 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20  Arg->out, "Page 
11200 63 61 63 68 65 20 73 70 69 6c 6c 73 3a 20 20 20  cache spills:   
11210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11220 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
11230 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
11240 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -1;.    sqlite
11250 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
11260 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
11270 53 43 48 45 4d 41 5f 55 53 45 44 2c 20 26 69 43  SCHEMA_USED, &iC
11280 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65  ur, &iHiwtr, bRe
11290 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72  set);.    raw_pr
112a0 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
112b0 22 53 63 68 65 6d 61 20 48 65 61 70 20 55 73 61  "Schema Heap Usa
112c0 67 65 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ge:             
112d0 20 20 20 20 20 20 25 64 20 62 79 74 65 73 5c 6e        %d bytes\n
112e0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ",.            i
112f0 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72  Cur);.    iHiwtr
11300 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20   = iCur = -1;.  
11310 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
11320 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  tus(db, SQLITE_D
11330 42 53 54 41 54 55 53 5f 53 54 4d 54 5f 55 53 45  BSTATUS_STMT_USE
11340 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74  D, &iCur, &iHiwt
11350 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20  r, bReset);.    
11360 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
11370 3e 6f 75 74 2c 20 22 53 74 61 74 65 6d 65 6e 74  >out, "Statement
11380 20 48 65 61 70 2f 4c 6f 6f 6b 61 73 69 64 65 20   Heap/Lookaside 
11390 55 73 61 67 65 3a 20 20 20 20 20 20 25 64 20 62  Usage:      %d b
113a0 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ytes\n",.       
113b0 20 20 20 20 20 69 43 75 72 29 3b 0a 20 20 7d 0a       iCur);.  }.
113c0 0a 20 20 69 66 28 20 70 41 72 67 2d 3e 70 53 74  .  if( pArg->pSt
113d0 6d 74 20 29 7b 0a 20 20 20 20 69 43 75 72 20 3d  mt ){.    iCur =
113e0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74   sqlite3_stmt_st
113f0 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74  atus(pArg->pStmt
11400 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  , SQLITE_STMTSTA
11410 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45  TUS_FULLSCAN_STE
11420 50 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  P,.             
11430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11440 20 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72    bReset);.    r
11450 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
11460 6f 75 74 2c 20 22 46 75 6c 6c 73 63 61 6e 20 53  out, "Fullscan S
11470 74 65 70 73 3a 20 20 20 20 20 20 20 20 20 20 20  teps:           
11480 20 20 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22             %d\n"
11490 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75  , iCur);.    iCu
114a0 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  r = sqlite3_stmt
114b0 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53  _status(pArg->pS
114c0 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54  tmt, SQLITE_STMT
114d0 53 54 41 54 55 53 5f 53 4f 52 54 2c 20 62 52 65  STATUS_SORT, bRe
114e0 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72  set);.    raw_pr
114f0 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
11500 22 53 6f 72 74 20 4f 70 65 72 61 74 69 6f 6e 73  "Sort Operations
11510 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
11520 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75        %d\n", iCu
11530 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73  r);.    iCur = s
11540 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74  qlite3_stmt_stat
11550 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20  us(pArg->pStmt, 
11560 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
11570 53 5f 41 55 54 4f 49 4e 44 45 58 2c 62 52 65 73  S_AUTOINDEX,bRes
11580 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69  et);.    raw_pri
11590 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
115a0 41 75 74 6f 69 6e 64 65 78 20 49 6e 73 65 72 74  Autoindex Insert
115b0 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s:              
115c0 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72       %d\n", iCur
115d0 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71  );.    iCur = sq
115e0 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75  lite3_stmt_statu
115f0 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53  s(pArg->pStmt, S
11600 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53  QLITE_STMTSTATUS
11610 5f 56 4d 5f 53 54 45 50 2c 20 62 52 65 73 65 74  _VM_STEP, bReset
11620 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  );.    raw_print
11630 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 56 69  f(pArg->out, "Vi
11640 72 74 75 61 6c 20 4d 61 63 68 69 6e 65 20 53 74  rtual Machine St
11650 65 70 73 3a 20 20 20 20 20 20 20 20 20 20 20 20  eps:            
11660 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b     %d\n", iCur);
11670 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69  .    iCur = sqli
11680 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28  te3_stmt_status(
11690 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c  pArg->pStmt, SQL
116a0 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 52  ITE_STMTSTATUS_R
116b0 45 50 52 45 50 41 52 45 2c 20 62 52 65 73 65 74  EPREPARE, bReset
116c0 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  );.    raw_print
116d0 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 52 65  f(pArg->out, "Re
116e0 70 72 65 70 61 72 65 20 6f 70 65 72 61 74 69 6f  prepare operatio
116f0 6e 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ns:             
11700 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b     %d\n", iCur);
11710 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69  .    iCur = sqli
11720 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28  te3_stmt_status(
11730 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c  pArg->pStmt, SQL
11740 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 52  ITE_STMTSTATUS_R
11750 55 4e 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  UN, bReset);.   
11760 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
11770 2d 3e 6f 75 74 2c 20 22 4e 75 6d 62 65 72 20 6f  ->out, "Number o
11780 66 20 74 69 6d 65 73 20 72 75 6e 3a 20 20 20 20  f times run:    
11790 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c               %d\
117a0 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69  n", iCur);.    i
117b0 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  Cur = sqlite3_st
117c0 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e  mt_status(pArg->
117d0 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54  pStmt, SQLITE_ST
117e0 4d 54 53 54 41 54 55 53 5f 4d 45 4d 55 53 45 44  MTSTATUS_MEMUSED
117f0 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72  , bReset);.    r
11800 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
11810 6f 75 74 2c 20 22 4d 65 6d 6f 72 79 20 75 73 65  out, "Memory use
11820 64 20 62 79 20 70 72 65 70 61 72 65 64 20 73 74  d by prepared st
11830 6d 74 3a 20 20 20 20 20 20 20 20 25 64 5c 6e 22  mt:        %d\n"
11840 2c 20 69 43 75 72 29 3b 0a 20 20 7d 0a 0a 23 69  , iCur);.  }..#i
11850 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f 5f 0a 20  fdef __linux__. 
11860 20 64 69 73 70 6c 61 79 4c 69 6e 75 78 49 6f 53   displayLinuxIoS
11870 74 61 74 73 28 70 41 72 67 2d 3e 6f 75 74 29 3b  tats(pArg->out);
11880 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a 20 44 6f  .#endif..  /* Do
11890 20 6e 6f 74 20 72 65 6d 6f 76 65 20 74 68 69 73   not remove this
118a0 20 6d 61 63 68 69 6e 65 20 72 65 61 64 61 62 6c   machine readabl
118b0 65 20 63 6f 6d 6d 65 6e 74 3a 20 65 78 74 72 61  e comment: extra
118c0 2d 73 74 61 74 73 2d 6f 75 74 70 75 74 2d 68 65  -stats-output-he
118d0 72 65 20 2a 2f 0a 0a 20 20 72 65 74 75 72 6e 20  re */..  return 
118e0 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70  0;.}../*.** Disp
118f0 6c 61 79 20 73 63 61 6e 20 73 74 61 74 73 2e 0a  lay scan stats..
11900 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
11910 69 73 70 6c 61 79 5f 73 63 61 6e 73 74 61 74 73  isplay_scanstats
11920 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
11930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11940 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20      /* Database 
11950 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 68  to query */.  Sh
11960 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 20 20  ellState *pArg  
11970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
11980 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68 65 6c   Pointer to Shel
11990 6c 53 74 61 74 65 20 2a 2f 0a 29 7b 0a 23 69 66  lState */.){.#if
119a0 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42  ndef SQLITE_ENAB
119b0 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41 54  LE_STMT_SCANSTAT
119c0 55 53 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  US.  UNUSED_PARA
119d0 4d 45 54 45 52 28 64 62 29 3b 0a 20 20 55 4e 55  METER(db);.  UNU
119e0 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 41  SED_PARAMETER(pA
119f0 72 67 29 3b 0a 23 65 6c 73 65 0a 20 20 69 6e 74  rg);.#else.  int
11a00 20 69 2c 20 6b 2c 20 6e 2c 20 6d 78 3b 0a 20 20   i, k, n, mx;.  
11a10 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
11a20 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20  >out, "-------- 
11a30 73 63 61 6e 73 74 61 74 73 20 2d 2d 2d 2d 2d 2d  scanstats ------
11a40 2d 2d 5c 6e 22 29 3b 0a 20 20 6d 78 20 3d 20 30  --\n");.  mx = 0
11a50 3b 0a 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 3d  ;.  for(k=0; k<=
11a60 6d 78 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 64 6f  mx; k++){.    do
11a70 75 62 6c 65 20 72 45 73 74 4c 6f 6f 70 20 3d 20  uble rEstLoop = 
11a80 31 2e 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 6e  1.0;.    for(i=n
11a90 3d 30 3b 20 31 3b 20 69 2b 2b 29 7b 0a 20 20 20  =0; 1; i++){.   
11aa0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
11ab0 2a 70 20 3d 20 70 41 72 67 2d 3e 70 53 74 6d 74  *p = pArg->pStmt
11ac0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
11ad0 69 6e 74 36 34 20 6e 4c 6f 6f 70 2c 20 6e 56 69  int64 nLoop, nVi
11ae0 73 69 74 3b 0a 20 20 20 20 20 20 64 6f 75 62 6c  sit;.      doubl
11af0 65 20 72 45 73 74 3b 0a 20 20 20 20 20 20 69 6e  e rEst;.      in
11b00 74 20 69 53 69 64 3b 0a 20 20 20 20 20 20 63 6f  t iSid;.      co
11b10 6e 73 74 20 63 68 61 72 20 2a 7a 45 78 70 6c 61  nst char *zExpla
11b20 69 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  in;.      if( sq
11b30 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73  lite3_stmt_scans
11b40 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51 4c 49  tatus(p, i, SQLI
11b50 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e 4c 4f 4f  TE_SCANSTAT_NLOO
11b60 50 2c 20 28 76 6f 69 64 2a 29 26 6e 4c 6f 6f 70  P, (void*)&nLoop
11b70 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65  ) ){.        bre
11b80 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
11b90 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73    sqlite3_stmt_s
11ba0 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20  canstatus(p, i, 
11bb0 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f  SQLITE_SCANSTAT_
11bc0 53 45 4c 45 43 54 49 44 2c 20 28 76 6f 69 64 2a  SELECTID, (void*
11bd0 29 26 69 53 69 64 29 3b 0a 20 20 20 20 20 20 69  )&iSid);.      i
11be0 66 28 20 69 53 69 64 3e 6d 78 20 29 20 6d 78 20  f( iSid>mx ) mx 
11bf0 3d 20 69 53 69 64 3b 0a 20 20 20 20 20 20 69 66  = iSid;.      if
11c00 28 20 69 53 69 64 21 3d 6b 20 29 20 63 6f 6e 74  ( iSid!=k ) cont
11c10 69 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20  inue;.      if( 
11c20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n==0 ){.        
11c30 72 45 73 74 4c 6f 6f 70 20 3d 20 28 64 6f 75 62  rEstLoop = (doub
11c40 6c 65 29 6e 4c 6f 6f 70 3b 0a 20 20 20 20 20 20  le)nLoop;.      
11c50 20 20 69 66 28 20 6b 3e 30 20 29 20 72 61 77 5f    if( k>0 ) raw_
11c60 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
11c70 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73 75 62 71  , "-------- subq
11c80 75 65 72 79 20 25 64 20 2d 2d 2d 2d 2d 2d 2d 5c  uery %d -------\
11c90 6e 22 2c 20 6b 29 3b 0a 20 20 20 20 20 20 7d 0a  n", k);.      }.
11ca0 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20        n++;.     
11cb0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63   sqlite3_stmt_sc
11cc0 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53  anstatus(p, i, S
11cd0 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e  QLITE_SCANSTAT_N
11ce0 56 49 53 49 54 2c 20 28 76 6f 69 64 2a 29 26 6e  VISIT, (void*)&n
11cf0 56 69 73 69 74 29 3b 0a 20 20 20 20 20 20 73 71  Visit);.      sq
11d00 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73  lite3_stmt_scans
11d10 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51 4c 49  tatus(p, i, SQLI
11d20 54 45 5f 53 43 41 4e 53 54 41 54 5f 45 53 54 2c  TE_SCANSTAT_EST,
11d30 20 28 76 6f 69 64 2a 29 26 72 45 73 74 29 3b 0a   (void*)&rEst);.
11d40 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
11d50 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 70 2c  mt_scanstatus(p,
11d60 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53   i, SQLITE_SCANS
11d70 54 41 54 5f 45 58 50 4c 41 49 4e 2c 20 28 76 6f  TAT_EXPLAIN, (vo
11d80 69 64 2a 29 26 7a 45 78 70 6c 61 69 6e 29 3b 0a  id*)&zExplain);.
11d90 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
11da0 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f  f(pArg->out, "Lo
11db0 6f 70 20 25 32 64 3a 20 25 73 5c 6e 22 2c 20 6e  op %2d: %s\n", n
11dc0 2c 20 7a 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20  , zExplain);.   
11dd0 20 20 20 72 45 73 74 4c 6f 6f 70 20 2a 3d 20 72     rEstLoop *= r
11de0 45 73 74 3b 0a 20 20 20 20 20 20 72 61 77 5f 70  Est;.      raw_p
11df0 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
11e00 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 20 20  .          "    
11e10 20 20 20 20 20 6e 4c 6f 6f 70 3d 25 2d 38 6c 6c       nLoop=%-8ll
11e20 64 20 6e 52 6f 77 3d 25 2d 38 6c 6c 64 20 65 73  d nRow=%-8lld es
11e30 74 52 6f 77 3d 25 2d 38 6c 6c 64 20 65 73 74 52  tRow=%-8lld estR
11e40 6f 77 2f 4c 6f 6f 70 3d 25 2d 38 67 5c 6e 22 2c  ow/Loop=%-8g\n",
11e50 0a 20 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f 70  .          nLoop
11e60 2c 20 6e 56 69 73 69 74 2c 20 28 73 71 6c 69 74  , nVisit, (sqlit
11e70 65 33 5f 69 6e 74 36 34 29 28 72 45 73 74 4c 6f  e3_int64)(rEstLo
11e80 6f 70 2b 30 2e 35 29 2c 20 72 45 73 74 0a 20 20  op+0.5), rEst.  
11e90 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d      );.    }.  }
11ea0 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41  .  raw_printf(pA
11eb0 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d  rg->out, "------
11ec0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11ed0 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 23 65 6e 64 69  -----\n");.#endi
11ee0 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 61 6d  f.}../*.** Param
11ef0 65 74 65 72 20 61 7a 41 72 72 61 79 20 70 6f 69  eter azArray poi
11f00 6e 74 73 20 74 6f 20 61 20 7a 65 72 6f 2d 74 65  nts to a zero-te
11f10 72 6d 69 6e 61 74 65 64 20 61 72 72 61 79 20 6f  rminated array o
11f20 66 20 73 74 72 69 6e 67 73 2e 20 7a 53 74 72 0a  f strings. zStr.
11f30 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73  ** points to a s
11f40 69 6e 67 6c 65 20 6e 75 6c 2d 74 65 72 6d 69 6e  ingle nul-termin
11f50 61 74 65 64 20 73 74 72 69 6e 67 2e 20 52 65 74  ated string. Ret
11f60 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 69 66 20  urn non-zero if 
11f70 7a 53 74 72 0a 2a 2a 20 69 73 20 65 71 75 61 6c  zStr.** is equal
11f80 2c 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 73  , according to s
11f90 74 72 63 6d 70 28 29 2c 20 74 6f 20 61 6e 79 20  trcmp(), to any 
11fa0 6f 66 20 74 68 65 20 73 74 72 69 6e 67 73 20 69  of the strings i
11fb0 6e 20 74 68 65 20 61 72 72 61 79 2e 0a 2a 2a 20  n the array..** 
11fc0 4f 74 68 65 72 77 69 73 65 2c 20 72 65 74 75 72  Otherwise, retur
11fd0 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74 61 74 69  n zero..*/.stati
11fe0 63 20 69 6e 74 20 73 74 72 5f 69 6e 5f 61 72 72  c int str_in_arr
11ff0 61 79 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ay(const char *z
12000 53 74 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  Str, const char 
12010 2a 2a 61 7a 41 72 72 61 79 29 7b 0a 20 20 69 6e  **azArray){.  in
12020 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
12030 61 7a 41 72 72 61 79 5b 69 5d 3b 20 69 2b 2b 29  azArray[i]; i++)
12040 7b 0a 20 20 20 20 69 66 28 20 30 3d 3d 73 74 72  {.    if( 0==str
12050 63 6d 70 28 7a 53 74 72 2c 20 61 7a 41 72 72 61  cmp(zStr, azArra
12060 79 5b 69 5d 29 20 29 20 72 65 74 75 72 6e 20 31  y[i]) ) return 1
12070 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
12080 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 6f  ;.}../*.** If co
12090 6d 70 69 6c 65 64 20 73 74 61 74 65 6d 65 6e 74  mpiled statement
120a0 20 70 53 71 6c 20 61 70 70 65 61 72 73 20 74 6f   pSql appears to
120b0 20 62 65 20 61 6e 20 45 58 50 4c 41 49 4e 20 73   be an EXPLAIN s
120c0 74 61 74 65 6d 65 6e 74 2c 20 61 6c 6c 6f 63 61  tatement, alloca
120d0 74 65 0a 2a 2a 20 61 6e 64 20 70 6f 70 75 6c 61  te.** and popula
120e0 74 65 20 74 68 65 20 53 68 65 6c 6c 53 74 61 74  te the ShellStat
120f0 65 2e 61 69 49 6e 64 65 6e 74 5b 5d 20 61 72 72  e.aiIndent[] arr
12100 61 79 20 77 69 74 68 20 74 68 65 20 6e 75 6d 62  ay with the numb
12110 65 72 20 6f 66 0a 2a 2a 20 73 70 61 63 65 73 20  er of.** spaces 
12120 65 61 63 68 20 6f 70 63 6f 64 65 20 73 68 6f 75  each opcode shou
12130 6c 64 20 62 65 20 69 6e 64 65 6e 74 65 64 20 62  ld be indented b
12140 65 66 6f 72 65 20 69 74 20 69 73 20 6f 75 74 70  efore it is outp
12150 75 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 69 6e  ut..**.** The in
12160 64 65 6e 74 69 6e 67 20 72 75 6c 65 73 20 61 72  denting rules ar
12170 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46  e:.**.**     * F
12180 6f 72 20 65 61 63 68 20 22 4e 65 78 74 22 2c 20  or each "Next", 
12190 22 50 72 65 76 22 2c 20 22 56 4e 65 78 74 22 20  "Prev", "VNext" 
121a0 6f 72 20 22 56 50 72 65 76 22 20 69 6e 73 74 72  or "VPrev" instr
121b0 75 63 74 69 6f 6e 2c 20 69 6e 64 65 6e 74 0a 2a  uction, indent.*
121c0 2a 20 20 20 20 20 20 20 61 6c 6c 20 6f 70 63 6f  *       all opco
121d0 64 65 73 20 74 68 61 74 20 6f 63 63 75 72 20 62  des that occur b
121e0 65 74 77 65 65 6e 20 74 68 65 20 70 32 20 6a 75  etween the p2 ju
121f0 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 61  mp destination a
12200 6e 64 20 74 68 65 20 6f 70 63 6f 64 65 0a 2a 2a  nd the opcode.**
12210 20 20 20 20 20 20 20 69 74 73 65 6c 66 20 62 79         itself by
12220 20 32 20 73 70 61 63 65 73 2e 0a 2a 2a 0a 2a 2a   2 spaces..**.**
12230 20 20 20 20 20 2a 20 46 6f 72 20 65 61 63 68 20       * For each 
12240 22 47 6f 74 6f 22 2c 20 69 66 20 74 68 65 20 6a  "Goto", if the j
12250 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f 6e 20  ump destination 
12260 69 73 20 65 61 72 6c 69 65 72 20 69 6e 20 74 68  is earlier in th
12270 65 20 70 72 6f 67 72 61 6d 0a 2a 2a 20 20 20 20  e program.**    
12280 20 20 20 61 6e 64 20 65 6e 64 73 20 6f 6e 20 6f     and ends on o
12290 6e 65 20 6f 66 3a 0a 2a 2a 20 20 20 20 20 20 20  ne of:.**       
122a0 20 20 20 59 69 65 6c 64 20 20 53 65 65 6b 47 74     Yield  SeekGt
122b0 20 20 53 65 65 6b 4c 74 20 20 52 6f 77 53 65 74    SeekLt  RowSet
122c0 52 65 61 64 20 20 52 65 77 69 6e 64 0a 2a 2a 20  Read  Rewind.** 
122d0 20 20 20 20 20 20 6f 72 20 69 66 20 74 68 65 20        or if the 
122e0 50 31 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  P1 parameter is 
122f0 6f 6e 65 20 69 6e 73 74 65 61 64 20 6f 66 20 7a  one instead of z
12300 65 72 6f 2c 0a 2a 2a 20 20 20 20 20 20 20 74 68  ero,.**       th
12310 65 6e 20 69 6e 64 65 6e 74 20 61 6c 6c 20 6f 70  en indent all op
12320 63 6f 64 65 73 20 62 65 74 77 65 65 6e 20 74 68  codes between th
12330 65 20 65 61 72 6c 69 65 72 20 69 6e 73 74 72 75  e earlier instru
12340 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20 20 20 61  ction.**       a
12350 6e 64 20 22 47 6f 74 6f 22 20 62 79 20 32 20 73  nd "Goto" by 2 s
12360 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  paces..*/.static
12370 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 5f 64 61   void explain_da
12380 74 61 5f 70 72 65 70 61 72 65 28 53 68 65 6c 6c  ta_prepare(Shell
12390 53 74 61 74 65 20 2a 70 2c 20 73 71 6c 69 74 65  State *p, sqlite
123a0 33 5f 73 74 6d 74 20 2a 70 53 71 6c 29 7b 0a 20  3_stmt *pSql){. 
123b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
123c0 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
123d0 20 2f 2a 20 54 68 65 20 74 65 78 74 20 6f 66 20   /* The text of 
123e0 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
123f0 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  t */.  const cha
12400 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20 20  r *z;           
12410 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
12420 6f 20 63 68 65 63 6b 20 69 66 20 74 68 69 73 20  o check if this 
12430 69 73 20 61 6e 20 45 58 50 4c 41 49 4e 20 2a 2f  is an EXPLAIN */
12440 0a 20 20 69 6e 74 20 2a 61 62 59 69 65 6c 64 20  .  int *abYield 
12450 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
12460 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 70     /* True if op
12470 20 69 73 20 61 6e 20 4f 50 5f 59 69 65 6c 64 20   is an OP_Yield 
12480 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20  */.  int nAlloc 
12490 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
124a0 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74 65       /* Allocate
124b0 64 20 73 69 7a 65 20 6f 66 20 70 2d 3e 61 69 49  d size of p->aiI
124c0 6e 64 65 6e 74 5b 5d 2c 20 61 62 59 69 65 6c 64  ndent[], abYield
124d0 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 70 3b 20 20   */.  int iOp;  
124e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124f0 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78 20 6f        /* Index o
12500 66 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e 20 70  f operation in p
12510 2d 3e 61 69 49 6e 64 65 6e 74 5b 5d 20 2a 2f 0a  ->aiIndent[] */.
12520 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  .  const char *a
12530 7a 4e 65 78 74 5b 5d 20 3d 20 7b 20 22 4e 65 78  zNext[] = { "Nex
12540 74 22 2c 20 22 50 72 65 76 22 2c 20 22 56 50 72  t", "Prev", "VPr
12550 65 76 22 2c 20 22 56 4e 65 78 74 22 2c 20 22 53  ev", "VNext", "S
12560 6f 72 74 65 72 4e 65 78 74 22 2c 0a 20 20 20 20  orterNext",.    
12570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12580 20 20 20 20 20 20 20 22 4e 65 78 74 49 66 4f 70         "NextIfOp
12590 65 6e 22 2c 20 22 50 72 65 76 49 66 4f 70 65 6e  en", "PrevIfOpen
125a0 22 2c 20 30 20 7d 3b 0a 20 20 63 6f 6e 73 74 20  ", 0 };.  const 
125b0 63 68 61 72 20 2a 61 7a 59 69 65 6c 64 5b 5d 20  char *azYield[] 
125c0 3d 20 7b 20 22 59 69 65 6c 64 22 2c 20 22 53 65  = { "Yield", "Se
125d0 65 6b 4c 54 22 2c 20 22 53 65 65 6b 47 54 22 2c  ekLT", "SeekGT",
125e0 20 22 52 6f 77 53 65 74 52 65 61 64 22 2c 0a 20   "RowSetRead",. 
125f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12600 20 20 20 20 20 20 20 20 20 20 20 22 52 65 77 69             "Rewi
12610 6e 64 22 2c 20 30 20 7d 3b 0a 20 20 63 6f 6e 73  nd", 0 };.  cons
12620 74 20 63 68 61 72 20 2a 61 7a 47 6f 74 6f 5b 5d  t char *azGoto[]
12630 20 3d 20 7b 20 22 47 6f 74 6f 22 2c 20 30 20 7d   = { "Goto", 0 }
12640 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 66  ;..  /* Try to f
12650 69 67 75 72 65 20 6f 75 74 20 69 66 20 74 68 69  igure out if thi
12660 73 20 69 73 20 72 65 61 6c 6c 79 20 61 6e 20 45  s is really an E
12670 58 50 4c 41 49 4e 20 73 74 61 74 65 6d 65 6e 74  XPLAIN statement
12680 2e 20 49 66 20 74 68 69 73 0a 20 20 2a 2a 20 63  . If this.  ** c
12690 61 6e 6e 6f 74 20 62 65 20 76 65 72 69 66 69 65  annot be verifie
126a0 64 2c 20 72 65 74 75 72 6e 20 65 61 72 6c 79 2e  d, return early.
126b0 20 20 2a 2f 0a 20 20 69 66 28 20 73 71 6c 69 74    */.  if( sqlit
126c0 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
126d0 70 53 71 6c 29 21 3d 38 20 29 7b 0a 20 20 20 20  pSql)!=8 ){.    
126e0 70 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f  p->cMode = p->mo
126f0 64 65 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  de;.    return;.
12700 20 20 7d 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c    }.  zSql = sql
12710 69 74 65 33 5f 73 71 6c 28 70 53 71 6c 29 3b 0a  ite3_sql(pSql);.
12720 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30 20 29 20    if( zSql==0 ) 
12730 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 7a 3d  return;.  for(z=
12740 7a 53 71 6c 3b 20 2a 7a 3d 3d 27 20 27 20 7c 7c  zSql; *z==' ' ||
12750 20 2a 7a 3d 3d 27 5c 74 27 20 7c 7c 20 2a 7a 3d   *z=='\t' || *z=
12760 3d 27 5c 6e 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 66  ='\n' || *z=='\f
12770 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 72 27 3b 20 7a  ' || *z=='\r'; z
12780 2b 2b 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ++);.  if( sqlit
12790 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a 2c 20 22  e3_strnicmp(z, "
127a0 65 78 70 6c 61 69 6e 22 2c 20 37 29 20 29 7b 0a  explain", 7) ){.
127b0 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70      p->cMode = p
127c0 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 72 65 74 75  ->mode;.    retu
127d0 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69  rn;.  }..  for(i
127e0 4f 70 3d 30 3b 20 53 51 4c 49 54 45 5f 52 4f 57  Op=0; SQLITE_ROW
127f0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
12800 53 71 6c 29 3b 20 69 4f 70 2b 2b 29 7b 0a 20 20  Sql); iOp++){.  
12810 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74    int i;.    int
12820 20 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33   iAddr = sqlite3
12830 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c  _column_int(pSql
12840 2c 20 30 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20  , 0);.    const 
12850 63 68 61 72 20 2a 7a 4f 70 20 3d 20 28 63 6f 6e  char *zOp = (con
12860 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
12870 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71  _column_text(pSq
12880 6c 2c 20 31 29 3b 0a 0a 20 20 20 20 2f 2a 20 53  l, 1);..    /* S
12890 65 74 20 70 32 20 74 6f 20 74 68 65 20 50 32 20  et p2 to the P2 
128a0 66 69 65 6c 64 20 6f 66 20 74 68 65 20 63 75 72  field of the cur
128b0 72 65 6e 74 20 6f 70 63 6f 64 65 2e 20 54 68 65  rent opcode. The
128c0 6e 2c 20 61 73 73 75 6d 69 6e 67 20 74 68 61 74  n, assuming that
128d0 0a 20 20 20 20 2a 2a 20 70 32 20 69 73 20 61 6e  .    ** p2 is an
128e0 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 64 64   instruction add
128f0 72 65 73 73 2c 20 73 65 74 20 76 61 72 69 61 62  ress, set variab
12900 6c 65 20 70 32 6f 70 20 74 6f 20 74 68 65 20 69  le p2op to the i
12910 6e 64 65 78 20 6f 66 20 74 68 61 74 0a 20 20 20  ndex of that.   
12920 20 2a 2a 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   ** instruction 
12930 69 6e 20 74 68 65 20 61 69 49 6e 64 65 6e 74 5b  in the aiIndent[
12940 5d 20 61 72 72 61 79 2e 20 70 32 20 61 6e 64 20  ] array. p2 and 
12950 70 32 6f 70 20 6d 61 79 20 62 65 20 64 69 66 66  p2op may be diff
12960 65 72 65 6e 74 20 69 66 0a 20 20 20 20 2a 2a 20  erent if.    ** 
12970 74 68 65 20 63 75 72 72 65 6e 74 20 69 6e 73 74  the current inst
12980 72 75 63 74 69 6f 6e 20 69 73 20 70 61 72 74 20  ruction is part 
12990 6f 66 20 61 20 73 75 62 2d 70 72 6f 67 72 61 6d  of a sub-program
129a0 20 67 65 6e 65 72 61 74 65 64 20 62 79 20 61 6e   generated by an
129b0 0a 20 20 20 20 2a 2a 20 53 51 4c 20 74 72 69 67  .    ** SQL trig
129c0 67 65 72 20 6f 72 20 66 6f 72 65 69 67 6e 20 6b  ger or foreign k
129d0 65 79 2e 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ey.  */.    int 
129e0 70 32 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  p2 = sqlite3_col
129f0 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 33 29  umn_int(pSql, 3)
12a00 3b 0a 20 20 20 20 69 6e 74 20 70 32 6f 70 20 3d  ;.    int p2op =
12a10 20 28 70 32 20 2b 20 28 69 4f 70 2d 69 41 64 64   (p2 + (iOp-iAdd
12a20 72 29 29 3b 0a 0a 20 20 20 20 2f 2a 20 47 72 6f  r));..    /* Gro
12a30 77 20 74 68 65 20 70 2d 3e 61 69 49 6e 64 65 6e  w the p->aiInden
12a40 74 20 61 72 72 61 79 20 61 73 20 72 65 71 75 69  t array as requi
12a50 72 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20 69  red */.    if( i
12a60 4f 70 3e 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  Op>=nAlloc ){.  
12a70 20 20 20 20 69 66 28 20 69 4f 70 3d 3d 30 20 29      if( iOp==0 )
12a80 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 44 6f 20  {.        /* Do 
12a90 66 75 72 74 68 65 72 20 76 65 72 66 69 63 61 74  further verficat
12aa0 69 6f 6e 20 74 68 61 74 20 74 68 69 73 20 69 73  ion that this is
12ab0 20 65 78 70 6c 61 69 6e 20 6f 75 74 70 75 74 2e   explain output.
12ac0 20 20 41 62 6f 72 74 20 69 66 0a 20 20 20 20 20    Abort if.     
12ad0 20 20 20 2a 2a 20 69 74 20 69 73 20 6e 6f 74 20     ** it is not 
12ae0 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 61 74 69  */.        stati
12af0 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 65 78  c const char *ex
12b00 70 6c 61 69 6e 43 6f 6c 73 5b 5d 20 3d 20 7b 0a  plainCols[] = {.
12b10 20 20 20 20 20 20 20 20 20 20 20 22 61 64 64 72             "addr
12b20 22 2c 20 22 6f 70 63 6f 64 65 22 2c 20 22 70 31  ", "opcode", "p1
12b30 22 2c 20 22 70 32 22 2c 20 22 70 33 22 2c 20 22  ", "p2", "p3", "
12b40 70 34 22 2c 20 22 70 35 22 2c 20 22 63 6f 6d 6d  p4", "p5", "comm
12b50 65 6e 74 22 20 7d 3b 0a 20 20 20 20 20 20 20 20  ent" };.        
12b60 69 6e 74 20 6a 6a 3b 0a 20 20 20 20 20 20 20 20  int jj;.        
12b70 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c 41 72 72  for(jj=0; jj<Arr
12b80 61 79 53 69 7a 65 28 65 78 70 6c 61 69 6e 43 6f  aySize(explainCo
12b90 6c 73 29 3b 20 6a 6a 2b 2b 29 7b 0a 20 20 20 20  ls); jj++){.    
12ba0 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
12bb0 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  (sqlite3_column_
12bc0 6e 61 6d 65 28 70 53 71 6c 2c 6a 6a 29 2c 65 78  name(pSql,jj),ex
12bd0 70 6c 61 69 6e 43 6f 6c 73 5b 6a 6a 5d 29 21 3d  plainCols[jj])!=
12be0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
12bf0 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d   p->cMode = p->m
12c00 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ode;.           
12c10 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70   sqlite3_reset(p
12c20 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Sql);.          
12c30 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
12c40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
12c50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 41        }.      nA
12c60 6c 6c 6f 63 20 2b 3d 20 31 30 30 3b 0a 20 20 20  lloc += 100;.   
12c70 20 20 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20 3d     p->aiIndent =
12c80 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72   (int*)sqlite3_r
12c90 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 61 69 49 6e  ealloc64(p->aiIn
12ca0 64 65 6e 74 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a  dent, nAlloc*siz
12cb0 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 20  eof(int));.     
12cc0 20 61 62 59 69 65 6c 64 20 3d 20 28 69 6e 74 2a   abYield = (int*
12cd0 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
12ce0 36 34 28 61 62 59 69 65 6c 64 2c 20 6e 41 6c 6c  64(abYield, nAll
12cf0 6f 63 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b  oc*sizeof(int));
12d00 0a 20 20 20 20 7d 0a 20 20 20 20 61 62 59 69 65  .    }.    abYie
12d10 6c 64 5b 69 4f 70 5d 20 3d 20 73 74 72 5f 69 6e  ld[iOp] = str_in
12d20 5f 61 72 72 61 79 28 7a 4f 70 2c 20 61 7a 59 69  _array(zOp, azYi
12d30 65 6c 64 29 3b 0a 20 20 20 20 70 2d 3e 61 69 49  eld);.    p->aiI
12d40 6e 64 65 6e 74 5b 69 4f 70 5d 20 3d 20 30 3b 0a  ndent[iOp] = 0;.
12d50 20 20 20 20 70 2d 3e 6e 49 6e 64 65 6e 74 20 3d      p->nIndent =
12d60 20 69 4f 70 2b 31 3b 0a 0a 20 20 20 20 69 66 28   iOp+1;..    if(
12d70 20 73 74 72 5f 69 6e 5f 61 72 72 61 79 28 7a 4f   str_in_array(zO
12d80 70 2c 20 61 7a 4e 65 78 74 29 20 29 7b 0a 20 20  p, azNext) ){.  
12d90 20 20 20 20 66 6f 72 28 69 3d 70 32 6f 70 3b 20      for(i=p2op; 
12da0 69 3c 69 4f 70 3b 20 69 2b 2b 29 20 70 2d 3e 61  i<iOp; i++) p->a
12db0 69 49 6e 64 65 6e 74 5b 69 5d 20 2b 3d 20 32 3b  iIndent[i] += 2;
12dc0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
12dd0 74 72 5f 69 6e 5f 61 72 72 61 79 28 7a 4f 70 2c  tr_in_array(zOp,
12de0 20 61 7a 47 6f 74 6f 29 20 26 26 20 70 32 6f 70   azGoto) && p2op
12df0 3c 70 2d 3e 6e 49 6e 64 65 6e 74 0a 20 20 20 20  <p->nIndent.    
12e00 20 26 26 20 28 61 62 59 69 65 6c 64 5b 70 32 6f   && (abYield[p2o
12e10 70 5d 20 7c 7c 20 73 71 6c 69 74 65 33 5f 63 6f  p] || sqlite3_co
12e20 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 32  lumn_int(pSql, 2
12e30 29 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  )).    ){.      
12e40 66 6f 72 28 69 3d 70 32 6f 70 3b 20 69 3c 69 4f  for(i=p2op; i<iO
12e50 70 3b 20 69 2b 2b 29 20 70 2d 3e 61 69 49 6e 64  p; i++) p->aiInd
12e60 65 6e 74 5b 69 5d 20 2b 3d 20 32 3b 0a 20 20 20  ent[i] += 2;.   
12e70 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e 69 49 6e   }.  }..  p->iIn
12e80 64 65 6e 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69  dent = 0;.  sqli
12e90 74 65 33 5f 66 72 65 65 28 61 62 59 69 65 6c 64  te3_free(abYield
12ea0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73  );.  sqlite3_res
12eb0 65 74 28 70 53 71 6c 29 3b 0a 7d 0a 0a 2f 2a 0a  et(pSql);.}../*.
12ec0 2a 2a 20 46 72 65 65 20 74 68 65 20 61 72 72 61  ** Free the arra
12ed0 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 65  y allocated by e
12ee0 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72 65 70  xplain_data_prep
12ef0 61 72 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  are()..*/.static
12f00 20 76 6f 69 64 20 65 78 70 6c 61 69 6e 5f 64 61   void explain_da
12f10 74 61 5f 64 65 6c 65 74 65 28 53 68 65 6c 6c 53  ta_delete(ShellS
12f20 74 61 74 65 20 2a 70 29 7b 0a 20 20 73 71 6c 69  tate *p){.  sqli
12f30 74 65 33 5f 66 72 65 65 28 70 2d 3e 61 69 49 6e  te3_free(p->aiIn
12f40 64 65 6e 74 29 3b 0a 20 20 70 2d 3e 61 69 49 6e  dent);.  p->aiIn
12f50 64 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d 3e 6e  dent = 0;.  p->n
12f60 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20 70 2d  Indent = 0;.  p-
12f70 3e 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 7d 0a  >iIndent = 0;.}.
12f80 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c 65 20 61  ./*.** Disable a
12f90 6e 64 20 72 65 73 74 6f 72 65 20 2e 77 68 65 72  nd restore .wher
12fa0 65 74 72 61 63 65 20 61 6e 64 20 2e 73 65 6c 65  etrace and .sele
12fb0 63 74 74 72 61 63 65 20 73 65 74 74 69 6e 67 73  cttrace settings
12fc0 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ..*/.#if defined
12fd0 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26  (SQLITE_DEBUG) &
12fe0 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
12ff0 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43 54 54 52  _ENABLE_SELECTTR
13000 41 43 45 29 0a 65 78 74 65 72 6e 20 69 6e 74 20  ACE).extern int 
13010 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
13020 63 65 3b 0a 73 74 61 74 69 63 20 69 6e 74 20 73  ce;.static int s
13030 61 76 65 64 53 65 6c 65 63 74 54 72 61 63 65 3b  avedSelectTrace;
13040 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
13050 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
13060 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
13070 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52 45  ITE_ENABLE_WHERE
13080 54 52 41 43 45 29 0a 65 78 74 65 72 6e 20 69 6e  TRACE).extern in
13090 74 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  t sqlite3WhereTr
130a0 61 63 65 3b 0a 73 74 61 74 69 63 20 69 6e 74 20  ace;.static int 
130b0 73 61 76 65 64 57 68 65 72 65 54 72 61 63 65 3b  savedWhereTrace;
130c0 0a 23 65 6e 64 69 66 0a 73 74 61 74 69 63 20 76  .#endif.static v
130d0 6f 69 64 20 64 69 73 61 62 6c 65 5f 64 65 62 75  oid disable_debu
130e0 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73 28 76 6f  g_trace_modes(vo
130f0 69 64 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64  id){.#if defined
13100 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26  (SQLITE_DEBUG) &
13110 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
13120 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43 54 54 52  _ENABLE_SELECTTR
13130 41 43 45 29 0a 20 20 73 61 76 65 64 53 65 6c 65  ACE).  savedSele
13140 63 74 54 72 61 63 65 20 3d 20 73 71 6c 69 74 65  ctTrace = sqlite
13150 33 53 65 6c 65 63 74 54 72 61 63 65 3b 0a 20 20  3SelectTrace;.  
13160 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
13170 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 23  ce = 0;.#endif.#
13180 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
13190 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69  E_DEBUG) && defi
131a0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
131b0 45 5f 57 48 45 52 45 54 52 41 43 45 29 0a 20 20  E_WHERETRACE).  
131c0 73 61 76 65 64 57 68 65 72 65 54 72 61 63 65 20  savedWhereTrace 
131d0 3d 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72  = sqlite3WhereTr
131e0 61 63 65 3b 0a 20 20 73 71 6c 69 74 65 33 57 68  ace;.  sqlite3Wh
131f0 65 72 65 54 72 61 63 65 20 3d 20 30 3b 0a 23 65  ereTrace = 0;.#e
13200 6e 64 69 66 0a 7d 0a 73 74 61 74 69 63 20 76 6f  ndif.}.static vo
13210 69 64 20 72 65 73 74 6f 72 65 5f 64 65 62 75 67  id restore_debug
13220 5f 74 72 61 63 65 5f 6d 6f 64 65 73 28 76 6f 69  _trace_modes(voi
13230 64 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28  d){.#if defined(
13240 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26  SQLITE_DEBUG) &&
13250 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
13260 45 4e 41 42 4c 45 5f 53 45 4c 45 43 54 54 52 41  ENABLE_SELECTTRA
13270 43 45 29 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  CE).  sqlite3Sel
13280 65 63 74 54 72 61 63 65 20 3d 20 73 61 76 65 64  ectTrace = saved
13290 53 65 6c 65 63 74 54 72 61 63 65 3b 0a 23 65 6e  SelectTrace;.#en
132a0 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28  dif.#if defined(
132b0 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26  SQLITE_DEBUG) &&
132c0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
132d0 45 4e 41 42 4c 45 5f 57 48 45 52 45 54 52 41 43  ENABLE_WHERETRAC
132e0 45 29 0a 20 20 73 71 6c 69 74 65 33 57 68 65 72  E).  sqlite3Wher
132f0 65 54 72 61 63 65 20 3d 20 73 61 76 65 64 57 68  eTrace = savedWh
13300 65 72 65 54 72 61 63 65 3b 0a 23 65 6e 64 69 66  ereTrace;.#endif
13310 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 20  .}../*.** Run a 
13320 70 72 65 70 61 72 65 64 20 73 74 61 74 65 6d 65  prepared stateme
13330 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  nt.*/.static voi
13340 64 20 65 78 65 63 5f 70 72 65 70 61 72 65 64 5f  d exec_prepared_
13350 73 74 6d 74 28 0a 20 20 53 68 65 6c 6c 53 74 61  stmt(.  ShellSta
13360 74 65 20 2a 70 41 72 67 2c 20 20 20 20 20 20 20  te *pArg,       
13370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13380 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
13390 74 65 72 20 74 6f 20 53 68 65 6c 6c 53 74 61 74  ter to ShellStat
133a0 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  e */.  sqlite3_s
133b0 74 6d 74 20 2a 70 53 74 6d 74 20 20 20 20 20 20  tmt *pStmt      
133c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
133d0 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74 6d          /* Statm
133e0 65 6e 74 20 74 6f 20 72 75 6e 20 2a 2f 0a 29 7b  ent to run */.){
133f0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a  .  int rc;..  /*
13400 20 70 65 72 66 6f 72 6d 20 74 68 65 20 66 69 72   perform the fir
13410 73 74 20 73 74 65 70 2e 20 20 74 68 69 73 20 77  st step.  this w
13420 69 6c 6c 20 74 65 6c 6c 20 75 73 20 69 66 20 77  ill tell us if w
13430 65 0a 20 20 2a 2a 20 68 61 76 65 20 61 20 72 65  e.  ** have a re
13440 73 75 6c 74 20 73 65 74 20 6f 72 20 6e 6f 74 20  sult set or not 
13450 61 6e 64 20 68 6f 77 20 77 69 64 65 20 69 74 20  and how wide it 
13460 69 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20  is..  */.  rc = 
13470 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
13480 6d 74 29 3b 0a 20 20 2f 2a 20 69 66 20 77 65 20  mt);.  /* if we 
13490 68 61 76 65 20 61 20 72 65 73 75 6c 74 20 73 65  have a result se
134a0 74 2e 2e 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51  t... */.  if( SQ
134b0 4c 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29  LITE_ROW == rc )
134c0 7b 0a 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74  {.    /* allocat
134d0 65 20 73 70 61 63 65 20 66 6f 72 20 63 6f 6c 20  e space for col 
134e0 6e 61 6d 65 20 70 74 72 2c 20 76 61 6c 75 65 20  name ptr, value 
134f0 70 74 72 2c 20 61 6e 64 20 74 79 70 65 20 2a 2f  ptr, and type */
13500 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20  .    int nCol = 
13510 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
13520 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  ount(pStmt);.   
13530 20 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 73   void *pData = s
13540 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28  qlite3_malloc64(
13550 33 2a 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 63 6f  3*nCol*sizeof(co
13560 6e 73 74 20 63 68 61 72 2a 29 20 2b 20 31 29 3b  nst char*) + 1);
13570 0a 20 20 20 20 69 66 28 20 21 70 44 61 74 61 20  .    if( !pData 
13580 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  ){.      rc = SQ
13590 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
135a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61  }else{.      cha
135b0 72 20 2a 2a 61 7a 43 6f 6c 73 20 3d 20 28 63 68  r **azCols = (ch
135c0 61 72 20 2a 2a 29 70 44 61 74 61 3b 20 20 20 20  ar **)pData;    
135d0 20 20 2f 2a 20 4e 61 6d 65 73 20 6f 66 20 72 65    /* Names of re
135e0 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  sult columns */.
135f0 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 56        char **azV
13600 61 6c 73 20 3d 20 26 61 7a 43 6f 6c 73 5b 6e 43  als = &azCols[nC
13610 6f 6c 5d 3b 20 20 20 20 20 20 20 2f 2a 20 52 65  ol];       /* Re
13620 73 75 6c 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  sults */.      i
13630 6e 74 20 2a 61 69 54 79 70 65 73 20 3d 20 28 69  nt *aiTypes = (i
13640 6e 74 20 2a 29 26 61 7a 56 61 6c 73 5b 6e 43 6f  nt *)&azVals[nCo
13650 6c 5d 3b 20 2f 2a 20 52 65 73 75 6c 74 20 74 79  l]; /* Result ty
13660 70 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  pes */.      int
13670 20 69 2c 20 78 3b 0a 20 20 20 20 20 20 61 73 73   i, x;.      ass
13680 65 72 74 28 73 69 7a 65 6f 66 28 69 6e 74 29 20  ert(sizeof(int) 
13690 3c 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 20 2a  <= sizeof(char *
136a0 29 29 3b 0a 20 20 20 20 20 20 2f 2a 20 73 61 76  ));.      /* sav
136b0 65 20 6f 66 66 20 70 74 72 73 20 74 6f 20 63 6f  e off ptrs to co
136c0 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
136d0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
136e0 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
136f0 20 20 20 61 7a 43 6f 6c 73 5b 69 5d 20 3d 20 28     azCols[i] = (
13700 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33 5f 63  char *)sqlite3_c
13710 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74 6d 74  olumn_name(pStmt
13720 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , i);.      }.  
13730 20 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20      do{.        
13740 2f 2a 20 65 78 74 72 61 63 74 20 74 68 65 20 64  /* extract the d
13750 61 74 61 20 61 6e 64 20 64 61 74 61 20 74 79 70  ata and data typ
13760 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f  es */.        fo
13770 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69  r(i=0; i<nCol; i
13780 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  ++){.          a
13790 69 54 79 70 65 73 5b 69 5d 20 3d 20 78 20 3d 20  iTypes[i] = x = 
137a0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
137b0 79 70 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20  ype(pStmt, i);. 
137c0 20 20 20 20 20 20 20 20 20 69 66 28 20 78 3d 3d           if( x==
137d0 53 51 4c 49 54 45 5f 42 4c 4f 42 20 26 26 20 70  SQLITE_BLOB && p
137e0 41 72 67 20 26 26 20 70 41 72 67 2d 3e 63 4d 6f  Arg && pArg->cMo
137f0 64 65 3d 3d 4d 4f 44 45 5f 49 6e 73 65 72 74 20  de==MODE_Insert 
13800 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
13810 7a 56 61 6c 73 5b 69 5d 20 3d 20 22 22 3b 0a 20  zVals[i] = "";. 
13820 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
13830 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 56 61              azVa
13840 6c 73 5b 69 5d 20 3d 20 28 63 68 61 72 2a 29 73  ls[i] = (char*)s
13850 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
13860 78 74 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  xt(pStmt, i);.  
13870 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13880 20 20 20 20 69 66 28 20 21 61 7a 56 61 6c 73 5b      if( !azVals[
13890 69 5d 20 26 26 20 28 61 69 54 79 70 65 73 5b 69  i] && (aiTypes[i
138a0 5d 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20  ]!=SQLITE_NULL) 
138b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
138c0 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d  c = SQLITE_NOMEM
138d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
138e0 65 61 6b 3b 20 2f 2a 20 66 72 6f 6d 20 66 6f 72  eak; /* from for
138f0 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   */.          }.
13900 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64          } /* end
13910 20 66 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 20   for */..       
13920 20 2f 2a 20 69 66 20 64 61 74 61 20 61 6e 64 20   /* if data and 
13930 74 79 70 65 73 20 65 78 74 72 61 63 74 65 64 20  types extracted 
13940 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 2e 2e 20  successfully... 
13950 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 53  */.        if( S
13960 51 4c 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20  QLITE_ROW == rc 
13970 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
13980 63 61 6c 6c 20 74 68 65 20 73 75 70 70 6c 69 65  call the supplie
13990 64 20 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20  d callback with 
139a0 74 68 65 20 72 65 73 75 6c 74 20 72 6f 77 20 64  the result row d
139b0 61 74 61 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ata */.         
139c0 20 69 66 28 20 73 68 65 6c 6c 5f 63 61 6c 6c 62   if( shell_callb
139d0 61 63 6b 28 70 41 72 67 2c 20 6e 43 6f 6c 2c 20  ack(pArg, nCol, 
139e0 61 7a 56 61 6c 73 2c 20 61 7a 43 6f 6c 73 2c 20  azVals, azCols, 
139f0 61 69 54 79 70 65 73 29 20 29 7b 0a 20 20 20 20  aiTypes) ){.    
13a00 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
13a10 49 54 45 5f 41 42 4f 52 54 3b 0a 20 20 20 20 20  ITE_ABORT;.     
13a20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
13a30 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
13a40 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
13a50 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
13a60 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20        }.      } 
13a70 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f  while( SQLITE_RO
13a80 57 20 3d 3d 20 72 63 20 29 3b 0a 20 20 20 20 20  W == rc );.     
13a90 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 44   sqlite3_free(pD
13aa0 61 74 61 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ata);.    }.  }.
13ab0 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  }..#ifndef SQLIT
13ac0 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
13ad0 42 4c 45 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  BLE./*.** This f
13ae0 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65  unction is calle
13af0 64 20 74 6f 20 70 72 6f 63 65 73 73 20 53 51 4c  d to process SQL
13b00 20 69 66 20 74 68 65 20 70 72 65 76 69 6f 75 73   if the previous
13b10 20 73 68 65 6c 6c 20 63 6f 6d 6d 61 6e 64 0a 2a   shell command.*
13b20 2a 20 77 61 73 20 22 2e 65 78 70 65 72 74 22 2e  * was ".expert".
13b30 20 49 74 20 70 61 73 73 65 73 20 74 68 65 20 53   It passes the S
13b40 51 4c 20 69 6e 20 74 68 65 20 73 65 63 6f 6e 64  QL in the second
13b50 20 61 72 67 75 6d 65 6e 74 20 64 69 72 65 63 74   argument direct
13b60 6c 79 20 74 6f 0a 2a 2a 20 74 68 65 20 73 71 6c  ly to.** the sql
13b70 69 74 65 33 65 78 70 65 72 74 20 6f 62 6a 65 63  ite3expert objec
13b80 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63  t..**.** If succ
13b90 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f  essful, SQLITE_O
13ba0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f  K is returned. O
13bb0 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53 51 4c  therwise, an SQL
13bc0 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64  ite error.** cod
13bd0 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c  e. In this case,
13be0 20 28 2a 70 7a 45 72 72 29 20 6d 61 79 20 62 65   (*pzErr) may be
13bf0 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f   set to point to
13c00 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74 61 69   a buffer contai
13c10 6e 69 6e 67 0a 2a 2a 20 61 6e 20 45 6e 67 6c 69  ning.** an Engli
13c20 73 68 20 6c 61 6e 67 75 61 67 65 20 65 72 72 6f  sh language erro
13c30 72 20 6d 65 73 73 61 67 65 2e 20 49 74 20 69 73  r message. It is
13c40 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62 69 6c   the responsibil
13c50 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61  ity of the.** ca
13c60 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75 61 6c  ller to eventual
13c70 6c 79 20 66 72 65 65 20 74 68 69 73 20 62 75 66  ly free this buf
13c80 66 65 72 20 75 73 69 6e 67 20 73 71 6c 69 74 65  fer using sqlite
13c90 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61  3_free()..*/.sta
13ca0 74 69 63 20 69 6e 74 20 65 78 70 65 72 74 48 61  tic int expertHa
13cb0 6e 64 6c 65 53 51 4c 28 0a 20 20 53 68 65 6c 6c  ndleSQL(.  Shell
13cc0 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20 0a  State *pState, .
13cd0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
13ce0 71 6c 2c 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a  ql, .  char **pz
13cf0 45 72 72 0a 29 7b 0a 20 20 61 73 73 65 72 74 28  Err.){.  assert(
13d00 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e   pState->expert.
13d10 70 45 78 70 65 72 74 20 29 3b 0a 20 20 61 73 73  pExpert );.  ass
13d20 65 72 74 28 20 70 7a 45 72 72 3d 3d 30 20 7c 7c  ert( pzErr==0 ||
13d30 20 2a 70 7a 45 72 72 3d 3d 30 20 29 3b 0a 20 20   *pzErr==0 );.  
13d40 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 5f 65  return sqlite3_e
13d50 78 70 65 72 74 5f 73 71 6c 28 70 53 74 61 74 65  xpert_sql(pState
13d60 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74  ->expert.pExpert
13d70 2c 20 7a 53 71 6c 2c 20 70 7a 45 72 72 29 3b 0a  , zSql, pzErr);.
13d80 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75  }../*.** This fu
13d90 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c 65 64  nction is called
13da0 20 65 69 74 68 65 72 20 74 6f 20 73 69 6c 65 6e   either to silen
13db0 74 6c 79 20 63 6c 65 61 6e 20 75 70 20 74 68 65  tly clean up the
13dc0 20 6f 62 6a 65 63 74 0a 2a 2a 20 63 72 65 61 74   object.** creat
13dd0 65 64 20 62 79 20 74 68 65 20 22 2e 65 78 70 65  ed by the ".expe
13de0 72 74 22 20 63 6f 6d 6d 61 6e 64 20 28 69 66 20  rt" command (if 
13df0 62 43 61 6e 63 65 6c 3d 3d 31 29 2c 20 6f 72 20  bCancel==1), or 
13e00 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20 0a 2a  to generate a .*
13e10 2a 20 72 65 70 6f 72 74 20 66 72 6f 6d 20 69 74  * report from it
13e20 20 61 6e 64 20 74 68 65 6e 20 63 6c 65 61 6e 20   and then clean 
13e30 69 74 20 75 70 20 28 69 66 20 62 43 61 6e 63 65  it up (if bCance
13e40 6c 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  l==0)..**.** If 
13e50 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49  successful, SQLI
13e60 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65  TE_OK is returne
13e70 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e  d. Otherwise, an
13e80 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a   SQLite error.**
13e90 20 63 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63   code. In this c
13ea0 61 73 65 2c 20 28 2a 70 7a 45 72 72 29 20 6d 61  ase, (*pzErr) ma
13eb0 79 20 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e  y be set to poin
13ec0 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f  t to a buffer co
13ed0 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 61 6e 20 45  ntaining.** an E
13ee0 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20  nglish language 
13ef0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 49  error message. I
13f00 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73  t is the respons
13f10 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a  ibility of the.*
13f20 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e  * caller to even
13f30 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68 69 73  tually free this
13f40 20 62 75 66 66 65 72 20 75 73 69 6e 67 20 73 71   buffer using sq
13f50 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f  lite3_free()..*/
13f60 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 65  .static int expe
13f70 72 74 46 69 6e 69 73 68 28 0a 20 20 53 68 65 6c  rtFinish(.  Shel
13f80 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c 0a  lState *pState,.
13f90 20 20 69 6e 74 20 62 43 61 6e 63 65 6c 2c 0a 20    int bCancel,. 
13fa0 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b   char **pzErr.){
13fb0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
13fc0 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74 65 33  TE_OK;.  sqlite3
13fd0 65 78 70 65 72 74 20 2a 70 20 3d 20 70 53 74 61  expert *p = pSta
13fe0 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65  te->expert.pExpe
13ff0 72 74 3b 0a 20 20 61 73 73 65 72 74 28 20 70 20  rt;.  assert( p 
14000 29 3b 0a 20 20 61 73 73 65 72 74 28 20 62 43 61  );.  assert( bCa
14010 6e 63 65 6c 20 7c 7c 20 70 7a 45 72 72 3d 3d 30  ncel || pzErr==0
14020 20 7c 7c 20 2a 70 7a 45 72 72 3d 3d 30 20 29 3b   || *pzErr==0 );
14030 0a 20 20 69 66 28 20 62 43 61 6e 63 65 6c 3d 3d  .  if( bCancel==
14040 30 20 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a 6f  0 ){.    FILE *o
14050 75 74 20 3d 20 70 53 74 61 74 65 2d 3e 6f 75 74  ut = pState->out
14060 3b 0a 20 20 20 20 69 6e 74 20 62 56 65 72 62 6f  ;.    int bVerbo
14070 73 65 20 3d 20 70 53 74 61 74 65 2d 3e 65 78 70  se = pState->exp
14080 65 72 74 2e 62 56 65 72 62 6f 73 65 3b 0a 0a 20  ert.bVerbose;.. 
14090 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
140a0 65 78 70 65 72 74 5f 61 6e 61 6c 79 7a 65 28 70  expert_analyze(p
140b0 2c 20 70 7a 45 72 72 29 3b 0a 20 20 20 20 69 66  , pzErr);.    if
140c0 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
140d0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 51 75  ){.      int nQu
140e0 65 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  ery = sqlite3_ex
140f0 70 65 72 74 5f 63 6f 75 6e 74 28 70 29 3b 0a 20  pert_count(p);. 
14100 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20       int i;..   
14110 20 20 20 69 66 28 20 62 56 65 72 62 6f 73 65 20     if( bVerbose 
14120 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
14130 20 63 68 61 72 20 2a 7a 43 61 6e 64 20 3d 20 73   char *zCand = s
14140 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 72 65  qlite3_expert_re
14150 70 6f 72 74 28 70 2c 30 2c 45 58 50 45 52 54 5f  port(p,0,EXPERT_
14160 52 45 50 4f 52 54 5f 43 41 4e 44 49 44 41 54 45  REPORT_CANDIDATE
14170 53 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f  S);.        raw_
14180 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20  printf(out, "-- 
14190 43 61 6e 64 69 64 61 74 65 73 20 2d 2d 2d 2d 2d  Candidates -----
141a0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
141b0 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20  --------\n");.  
141c0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
141d0 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 43  (out, "%s\n", zC
141e0 61 6e 64 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  and);.      }.  
141f0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
14200 51 75 65 72 79 3b 20 69 2b 2b 29 7b 0a 20 20 20  Query; i++){.   
14210 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
14220 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f  *zSql = sqlite3_
14230 65 78 70 65 72 74 5f 72 65 70 6f 72 74 28 70 2c  expert_report(p,
14240 20 69 2c 20 45 58 50 45 52 54 5f 52 45 50 4f 52   i, EXPERT_REPOR
14250 54 5f 53 51 4c 29 3b 0a 20 20 20 20 20 20 20 20  T_SQL);.        
14260 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 78  const char *zIdx
14270 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72   = sqlite3_exper
14280 74 5f 72 65 70 6f 72 74 28 70 2c 20 69 2c 20 45  t_report(p, i, E
14290 58 50 45 52 54 5f 52 45 50 4f 52 54 5f 49 4e 44  XPERT_REPORT_IND
142a0 45 58 45 53 29 3b 0a 20 20 20 20 20 20 20 20 63  EXES);.        c
142b0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 51 50 20  onst char *zEQP 
142c0 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74  = sqlite3_expert
142d0 5f 72 65 70 6f 72 74 28 70 2c 20 69 2c 20 45 58  _report(p, i, EX
142e0 50 45 52 54 5f 52 45 50 4f 52 54 5f 50 4c 41 4e  PERT_REPORT_PLAN
142f0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  );.        if( z
14300 49 64 78 3d 3d 30 20 29 20 7a 49 64 78 20 3d 20  Idx==0 ) zIdx = 
14310 22 28 6e 6f 20 6e 65 77 20 69 6e 64 65 78 65 73  "(no new indexes
14320 29 5c 6e 22 3b 0a 20 20 20 20 20 20 20 20 69 66  )\n";.        if
14330 28 20 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20  ( bVerbose ){.  
14340 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
14350 74 66 28 6f 75 74 2c 20 22 2d 2d 20 51 75 65 72  tf(out, "-- Quer
14360 79 20 25 64 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  y %d -----------
14370 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
14380 2d 2d 2d 2d 2d 5c 6e 22 2c 69 2b 31 29 3b 0a 20  -----\n",i+1);. 
14390 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
143a0 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 5c 6e  ntf(out, "%s\n\n
143b0 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  ", zSql);.      
143c0 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61 77 5f    }.        raw_
143d0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c  printf(out, "%s\
143e0 6e 22 2c 20 7a 49 64 78 29 3b 0a 20 20 20 20 20  n", zIdx);.     
143f0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
14400 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 45 51 50 29  t, "%s\n", zEQP)
14410 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14420 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 65 78    }.  sqlite3_ex
14430 70 65 72 74 5f 64 65 73 74 72 6f 79 28 70 29 3b  pert_destroy(p);
14440 0a 20 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72  .  pState->exper
14450 74 2e 70 45 78 70 65 72 74 20 3d 20 30 3b 0a 20  t.pExpert = 0;. 
14460 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f   return rc;.}../
14470 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
14480 69 6f 6e 20 6f 66 20 22 2e 65 78 70 65 72 74 22  ion of ".expert"
14490 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f   dot command..*/
144a0 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 65  .static int expe
144b0 72 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20 20  rtDotCommand(.  
144c0 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61  ShellState *pSta
144d0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
144e0 2f 2a 20 43 75 72 72 65 6e 74 20 73 68 65 6c 6c  /* Current shell
144f0 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20   tool state */. 
14500 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20   char **azArg,  
14510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14520 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67   /* Array of arg
14530 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f  uments passed to
14540 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a   dot command */.
14550 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20    int nArg      
14560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14570 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
14580 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b  ntries in azArg[
14590 5d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63  ] */.){.  int rc
145a0 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
145b0 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a  char *zErr = 0;.
145c0 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 69    int i;.  int i
145d0 53 61 6d 70 6c 65 20 3d 20 30 3b 0a 0a 20 20 61  Sample = 0;..  a
145e0 73 73 65 72 74 28 20 70 53 74 61 74 65 2d 3e 65  ssert( pState->e
145f0 78 70 65 72 74 2e 70 45 78 70 65 72 74 3d 3d 30  xpert.pExpert==0
14600 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26 70 53   );.  memset(&pS
14610 74 61 74 65 2d 3e 65 78 70 65 72 74 2c 20 30 2c  tate->expert, 0,
14620 20 73 69 7a 65 6f 66 28 45 78 70 65 72 74 49 6e   sizeof(ExpertIn
14630 66 6f 29 29 3b 0a 0a 20 20 66 6f 72 28 69 3d 31  fo));..  for(i=1
14640 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ; rc==SQLITE_OK 
14650 26 26 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  && i<nArg; i++){
14660 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61  .    char *z = a
14670 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 69 6e 74  zArg[i];.    int
14680 20 6e 3b 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d   n;.    if( z[0]
14690 3d 3d 27 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d 27  =='-' && z[1]=='
146a0 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 6e 20  -' ) z++;.    n 
146b0 3d 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20  = strlen30(z);. 
146c0 20 20 20 69 66 28 20 6e 3e 3d 32 20 26 26 20 30     if( n>=2 && 0
146d0 3d 3d 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 76  ==strncmp(z, "-v
146e0 65 72 62 6f 73 65 22 2c 20 6e 29 20 29 7b 0a 20  erbose", n) ){. 
146f0 20 20 20 20 20 70 53 74 61 74 65 2d 3e 65 78 70       pState->exp
14700 65 72 74 2e 62 56 65 72 62 6f 73 65 20 3d 20 31  ert.bVerbose = 1
14710 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65  ;.    }.    else
14720 20 69 66 28 20 6e 3e 3d 32 20 26 26 20 30 3d 3d   if( n>=2 && 0==
14730 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 73 61 6d  strncmp(z, "-sam
14740 70 6c 65 22 2c 20 6e 29 20 29 7b 0a 20 20 20 20  ple", n) ){.    
14750 20 20 69 66 28 20 69 3d 3d 28 6e 41 72 67 2d 31    if( i==(nArg-1
14760 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  ) ){.        raw
14770 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
14780 22 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73  "option requires
14790 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25 73   an argument: %s
147a0 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20  \n", z);.       
147b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
147c0 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OR;.      }else{
147d0 0a 20 20 20 20 20 20 20 20 69 53 61 6d 70 6c 65  .        iSample
147e0 20 3d 20 28 69 6e 74 29 69 6e 74 65 67 65 72 56   = (int)integerV
147f0 61 6c 75 65 28 61 7a 41 72 67 5b 2b 2b 69 5d 29  alue(azArg[++i])
14800 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 53  ;.        if( iS
14810 61 6d 70 6c 65 3c 30 20 7c 7c 20 69 53 61 6d 70  ample<0 || iSamp
14820 6c 65 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20  le>100 ){.      
14830 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
14840 74 64 65 72 72 2c 20 22 76 61 6c 75 65 20 6f 75  tderr, "value ou
14850 74 20 6f 66 20 72 61 6e 67 65 3a 20 25 73 5c 6e  t of range: %s\n
14860 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  ", azArg[i]);.  
14870 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
14880 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
14890 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
148a0 20 7d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20   }.    else{.   
148b0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
148c0 64 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f  derr, "unknown o
148d0 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 7a 29  ption: %s\n", z)
148e0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
148f0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
14900 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
14910 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
14920 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e   pState->expert.
14930 70 45 78 70 65 72 74 20 3d 20 73 71 6c 69 74 65  pExpert = sqlite
14940 33 5f 65 78 70 65 72 74 5f 6e 65 77 28 70 53 74  3_expert_new(pSt
14950 61 74 65 2d 3e 64 62 2c 20 26 7a 45 72 72 29 3b  ate->db, &zErr);
14960 0a 20 20 20 20 69 66 28 20 70 53 74 61 74 65 2d  .    if( pState-
14970 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 3d  >expert.pExpert=
14980 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  =0 ){.      raw_
14990 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
149a0 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 6e  sqlite3_expert_n
149b0 65 77 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29  ew: %s\n", zErr)
149c0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
149d0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
149e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
149f0 74 65 33 5f 65 78 70 65 72 74 5f 63 6f 6e 66 69  te3_expert_confi
14a00 67 28 0a 20 20 20 20 20 20 20 20 20 20 70 53 74  g(.          pSt
14a10 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70  ate->expert.pExp
14a20 65 72 74 2c 20 45 58 50 45 52 54 5f 43 4f 4e 46  ert, EXPERT_CONF
14a30 49 47 5f 53 41 4d 50 4c 45 2c 20 69 53 61 6d 70  IG_SAMPLE, iSamp
14a40 6c 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  le.      );.    
14a50 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
14a60 72 63 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  rc;.}.#endif /* 
14a70 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
14a80 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 20  IT_VIRTUALTABLE 
14a90 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74  */../*.** Execut
14aa0 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72  e a statement or
14ab0 20 73 65 74 20 6f 66 20 73 74 61 74 65 6d 65 6e   set of statemen
14ac0 74 73 2e 20 20 50 72 69 6e 74 0a 2a 2a 20 61 6e  ts.  Print.** an
14ad0 79 20 72 65 73 75 6c 74 20 72 6f 77 73 2f 63 6f  y result rows/co
14ae0 6c 75 6d 6e 73 20 64 65 70 65 6e 64 69 6e 67 20  lumns depending 
14af0 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d  on the current m
14b00 6f 64 65 0a 2a 2a 20 73 65 74 20 76 69 61 20 74  ode.** set via t
14b10 68 65 20 73 75 70 70 6c 69 65 64 20 63 61 6c 6c  he supplied call
14b20 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  back..**.** This
14b30 20 69 73 20 76 65 72 79 20 73 69 6d 69 6c 61 72   is very similar
14b40 20 74 6f 20 53 51 4c 69 74 65 27 73 20 62 75 69   to SQLite's bui
14b50 6c 74 2d 69 6e 20 73 71 6c 69 74 65 33 5f 65 78  lt-in sqlite3_ex
14b60 65 63 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  ec().** function
14b70 20 65 78 63 65 70 74 20 69 74 20 74 61 6b 65 73   except it takes
14b80 20 61 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66   a slightly diff
14b90 65 72 65 6e 74 20 63 61 6c 6c 62 61 63 6b 0a 2a  erent callback.*
14ba0 2a 20 61 6e 64 20 63 61 6c 6c 62 61 63 6b 20 64  * and callback d
14bb0 61 74 61 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f  ata argument..*/
14bc0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c  .static int shel
14bd0 6c 5f 65 78 65 63 28 0a 20 20 53 68 65 6c 6c 53  l_exec(.  ShellS
14be0 74 61 74 65 20 2a 70 41 72 67 2c 20 20 20 20 20  tate *pArg,     
14bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c00 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
14c10 6f 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a  o ShellState */.
14c20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
14c30 71 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ql,             
14c40 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
14c50 51 4c 20 74 6f 20 62 65 20 65 76 61 6c 75 61 74  QL to be evaluat
14c60 65 64 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70  ed */.  char **p
14c70 7a 45 72 72 4d 73 67 20 20 20 20 20 20 20 20 20  zErrMsg         
14c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14c90 20 20 2f 2a 20 45 72 72 6f 72 20 6d 73 67 20 77    /* Error msg w
14ca0 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29  ritten here */.)
14cb0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
14cc0 20 2a 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20   *pStmt = NULL; 
14cd0 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74      /* Statement
14ce0 20 74 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a   to execute. */.
14cf0 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
14d00 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20  E_OK;           
14d10 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65    /* Return Code
14d20 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 3b 0a 20   */.  int rc2;. 
14d30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 65   const char *zLe
14d40 66 74 6f 76 65 72 3b 20 20 20 20 20 20 20 20 20  ftover;         
14d50 20 2f 2a 20 54 61 69 6c 20 6f 66 20 75 6e 70 72   /* Tail of unpr
14d60 6f 63 65 73 73 65 64 20 53 51 4c 20 2a 2f 0a 20  ocessed SQL */. 
14d70 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70   sqlite3 *db = p
14d80 41 72 67 2d 3e 64 62 3b 0a 0a 20 20 69 66 28 20  Arg->db;..  if( 
14d90 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20  pzErrMsg ){.    
14da0 2a 70 7a 45 72 72 4d 73 67 20 3d 20 4e 55 4c 4c  *pzErrMsg = NULL
14db0 3b 0a 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ;.  }..#ifndef S
14dc0 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
14dd0 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20 70 41  ALTABLE.  if( pA
14de0 72 67 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65  rg->expert.pExpe
14df0 72 74 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 65  rt ){.    rc = e
14e00 78 70 65 72 74 48 61 6e 64 6c 65 53 51 4c 28 70  xpertHandleSQL(p
14e10 41 72 67 2c 20 7a 53 71 6c 2c 20 70 7a 45 72 72  Arg, zSql, pzErr
14e20 4d 73 67 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Msg);.    return
14e30 20 65 78 70 65 72 74 46 69 6e 69 73 68 28 70 41   expertFinish(pA
14e40 72 67 2c 20 28 72 63 21 3d 53 51 4c 49 54 45 5f  rg, (rc!=SQLITE_
14e50 4f 4b 29 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a  OK), pzErrMsg);.
14e60 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 77 68    }.#endif..  wh
14e70 69 6c 65 28 20 7a 53 71 6c 5b 30 5d 20 26 26 20  ile( zSql[0] && 
14e80 28 53 51 4c 49 54 45 5f 4f 4b 20 3d 3d 20 72 63  (SQLITE_OK == rc
14e90 29 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  ) ){.    static 
14ea0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 6d  const char *zStm
14eb0 74 53 71 6c 3b 0a 20 20 20 20 72 63 20 3d 20 73  tSql;.    rc = s
14ec0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
14ed0 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  2(db, zSql, -1, 
14ee0 26 70 53 74 6d 74 2c 20 26 7a 4c 65 66 74 6f 76  &pStmt, &zLeftov
14ef0 65 72 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c  er);.    if( SQL
14f00 49 54 45 5f 4f 4b 20 21 3d 20 72 63 20 29 7b 0a  ITE_OK != rc ){.
14f10 20 20 20 20 20 20 69 66 28 20 70 7a 45 72 72 4d        if( pzErrM
14f20 73 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  sg ){.        *p
14f30 7a 45 72 72 4d 73 67 20 3d 20 73 61 76 65 5f 65  zErrMsg = save_e
14f40 72 72 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20 20  rr_msg(db);.    
14f50 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
14f60 20 20 20 20 20 69 66 28 20 21 70 53 74 6d 74 20       if( !pStmt 
14f70 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 74 68  ){.        /* th
14f80 69 73 20 68 61 70 70 65 6e 73 20 66 6f 72 20 61  is happens for a
14f90 20 63 6f 6d 6d 65 6e 74 20 6f 72 20 77 68 69 74   comment or whit
14fa0 65 2d 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 20  e-space */.     
14fb0 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 6f     zSql = zLefto
14fc0 76 65 72 3b 0a 20 20 20 20 20 20 20 20 77 68 69  ver;.        whi
14fd0 6c 65 28 20 49 73 53 70 61 63 65 28 7a 53 71 6c  le( IsSpace(zSql
14fe0 5b 30 5d 29 20 29 20 7a 53 71 6c 2b 2b 3b 0a 20  [0]) ) zSql++;. 
14ff0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
15000 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a  .      }.      z
15010 53 74 6d 74 53 71 6c 20 3d 20 73 71 6c 69 74 65  StmtSql = sqlite
15020 33 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20  3_sql(pStmt);.  
15030 20 20 20 20 69 66 28 20 7a 53 74 6d 74 53 71 6c      if( zStmtSql
15040 3d 3d 30 20 29 20 7a 53 74 6d 74 53 71 6c 20 3d  ==0 ) zStmtSql =
15050 20 22 22 3b 0a 20 20 20 20 20 20 77 68 69 6c 65   "";.      while
15060 28 20 49 73 53 70 61 63 65 28 7a 53 74 6d 74 53  ( IsSpace(zStmtS
15070 71 6c 5b 30 5d 29 20 29 20 7a 53 74 6d 74 53 71  ql[0]) ) zStmtSq
15080 6c 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 73  l++;..      /* s
15090 61 76 65 20 6f 66 66 20 74 68 65 20 70 72 65 70  ave off the prep
150a0 61 72 65 64 20 73 74 61 74 6d 65 6e 74 20 68 61  ared statment ha
150b0 6e 64 6c 65 20 61 6e 64 20 72 65 73 65 74 20 72  ndle and reset r
150c0 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20  ow count */.    
150d0 20 20 69 66 28 20 70 41 72 67 20 29 7b 0a 20 20    if( pArg ){.  
150e0 20 20 20 20 20 20 70 41 72 67 2d 3e 70 53 74 6d        pArg->pStm
150f0 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20 20  t = pStmt;.     
15100 20 20 20 70 41 72 67 2d 3e 63 6e 74 20 3d 20 30     pArg->cnt = 0
15110 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
15120 20 2f 2a 20 65 63 68 6f 20 74 68 65 20 73 71 6c   /* echo the sql
15130 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20 65 63   statement if ec
15140 68 6f 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ho on */.      i
15150 66 28 20 70 41 72 67 20 26 26 20 53 68 65 6c 6c  f( pArg && Shell
15160 48 61 73 46 6c 61 67 28 70 41 72 67 2c 20 53 48  HasFlag(pArg, SH
15170 46 4c 47 5f 45 63 68 6f 29 20 29 7b 0a 20 20 20  FLG_Echo) ){.   
15180 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
15190 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 25 73 5c  (pArg->out, "%s\
151a0 6e 22 2c 20 7a 53 74 6d 74 53 71 6c 20 3f 20 7a  n", zStmtSql ? z
151b0 53 74 6d 74 53 71 6c 20 3a 20 7a 53 71 6c 29 3b  StmtSql : zSql);
151c0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
151d0 2f 2a 20 53 68 6f 77 20 74 68 65 20 45 58 50 4c  /* Show the EXPL
151e0 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 69  AIN QUERY PLAN i
151f0 66 20 2e 65 71 70 20 69 73 20 6f 6e 20 2a 2f 0a  f .eqp is on */.
15200 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20 26        if( pArg &
15210 26 20 70 41 72 67 2d 3e 61 75 74 6f 45 51 50 20  & pArg->autoEQP 
15220 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69  && sqlite3_strli
15230 6b 65 28 22 45 58 50 4c 41 49 4e 25 22 2c 7a 53  ke("EXPLAIN%",zS
15240 74 6d 74 53 71 6c 2c 30 29 21 3d 30 20 29 7b 0a  tmtSql,0)!=0 ){.
15250 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
15260 73 74 6d 74 20 2a 70 45 78 70 6c 61 69 6e 3b 0a  stmt *pExplain;.
15270 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45          char *zE
15280 51 50 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  QP;.        int 
15290 74 72 69 67 67 65 72 45 51 50 20 3d 20 30 3b 0a  triggerEQP = 0;.
152a0 20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 5f          disable_
152b0 64 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65  debug_trace_mode
152c0 73 28 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  s();.        sql
152d0 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 64  ite3_db_config(d
152e0 62 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46  b, SQLITE_DBCONF
152f0 49 47 5f 54 52 49 47 47 45 52 5f 45 51 50 2c 20  IG_TRIGGER_EQP, 
15300 2d 31 2c 20 26 74 72 69 67 67 65 72 45 51 50 29  -1, &triggerEQP)
15310 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41  ;.        if( pA
15320 72 67 2d 3e 61 75 74 6f 45 51 50 3e 3d 41 55 54  rg->autoEQP>=AUT
15330 4f 45 51 50 5f 74 72 69 67 67 65 72 20 29 7b 0a  OEQP_trigger ){.
15340 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
15350 33 5f 64 62 5f 63 6f 6e 66 69 67 28 64 62 2c 20  3_db_config(db, 
15360 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
15370 54 52 49 47 47 45 52 5f 45 51 50 2c 20 31 2c 20  TRIGGER_EQP, 1, 
15380 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  0);.        }.  
15390 20 20 20 20 20 20 7a 45 51 50 20 3d 20 73 71 6c        zEQP = sql
153a0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 45 58  ite3_mprintf("EX
153b0 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
153c0 20 25 73 22 2c 20 7a 53 74 6d 74 53 71 6c 29 3b   %s", zStmtSql);
153d0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
153e0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
153f0 28 64 62 2c 20 7a 45 51 50 2c 20 2d 31 2c 20 26  (db, zEQP, -1, &
15400 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20  pExplain, 0);.  
15410 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
15420 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
15430 20 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69       while( sqli
15440 74 65 33 5f 73 74 65 70 28 70 45 78 70 6c 61 69  te3_step(pExplai
15450 6e 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  n)==SQLITE_ROW )
15460 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 61  {.            ra
15470 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
15480 75 74 2c 22 2d 2d 45 51 50 2d 2d 20 25 64 2c 22  ut,"--EQP-- %d,"
15490 2c 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  ,sqlite3_column_
154a0 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 30 29  int(pExplain, 0)
154b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
154c0 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
154d0 6f 75 74 2c 22 25 64 2c 22 2c 20 73 71 6c 69 74  out,"%d,", sqlit
154e0 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45  e3_column_int(pE
154f0 78 70 6c 61 69 6e 2c 20 31 29 29 3b 0a 20 20 20  xplain, 1));.   
15500 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
15510 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 22 25  ntf(pArg->out,"%
15520 64 2c 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  d,", sqlite3_col
15530 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e  umn_int(pExplain
15540 2c 20 32 29 29 3b 0a 20 20 20 20 20 20 20 20 20  , 2));.         
15550 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
15560 41 72 67 2d 3e 6f 75 74 2c 22 25 73 5c 6e 22 2c  Arg->out,"%s\n",
15570 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
15580 74 65 78 74 28 70 45 78 70 6c 61 69 6e 2c 20 33  text(pExplain, 3
15590 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ));.          }.
155a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
155b0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
155c0 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20  ze(pExplain);.  
155d0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
155e0 65 65 28 7a 45 51 50 29 3b 0a 20 20 20 20 20 20  ee(zEQP);.      
155f0 20 20 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f    if( pArg->auto
15600 45 51 50 3e 3d 41 55 54 4f 45 51 50 5f 66 75 6c  EQP>=AUTOEQP_ful
15610 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  l ){.          /
15620 2a 20 41 6c 73 6f 20 64 6f 20 61 6e 20 45 58 50  * Also do an EXP
15630 4c 41 49 4e 20 66 6f 72 20 22 2e 65 71 70 20 66  LAIN for ".eqp f
15640 75 6c 6c 22 20 6d 6f 64 65 20 2a 2f 0a 20 20 20  ull" mode */.   
15650 20 20 20 20 20 20 20 7a 45 51 50 20 3d 20 73 71         zEQP = sq
15660 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 45  lite3_mprintf("E
15670 58 50 4c 41 49 4e 20 25 73 22 2c 20 7a 53 74 6d  XPLAIN %s", zStm
15680 74 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  tSql);.         
15690 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
156a0 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 45 51  epare_v2(db, zEQ
156b0 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e  P, -1, &pExplain
156c0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
156d0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
156e0 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  K ){.           
156f0 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 4d   pArg->cMode = M
15700 4f 44 45 5f 45 78 70 6c 61 69 6e 3b 0a 20 20 20  ODE_Explain;.   
15710 20 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e           explain
15720 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28 70 41  _data_prepare(pA
15730 72 67 2c 20 70 45 78 70 6c 61 69 6e 29 3b 0a 20  rg, pExplain);. 
15740 20 20 20 20 20 20 20 20 20 20 20 65 78 65 63 5f             exec_
15750 70 72 65 70 61 72 65 64 5f 73 74 6d 74 28 70 41  prepared_stmt(pA
15760 72 67 2c 20 70 45 78 70 6c 61 69 6e 29 3b 0a 20  rg, pExplain);. 
15770 20 20 20 20 20 20 20 20 20 20 20 65 78 70 6c 61             expla
15780 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 70  in_data_delete(p
15790 41 72 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Arg);.          
157a0 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
157b0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78  te3_finalize(pEx
157c0 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20  plain);.        
157d0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
157e0 45 51 50 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  EQP);.        }.
157f0 20 20 20 20 20 20 20 20 69 66 28 20 70 41 72 67          if( pArg
15800 2d 3e 61 75 74 6f 45 51 50 3e 3d 41 55 54 4f 45  ->autoEQP>=AUTOE
15810 51 50 5f 74 72 69 67 67 65 72 20 26 26 20 74 72  QP_trigger && tr
15820 69 67 67 65 72 45 51 50 3d 3d 30 20 29 7b 0a 20  iggerEQP==0 ){. 
15830 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
15840 5f 64 62 5f 63 6f 6e 66 69 67 28 64 62 2c 20 53  _db_config(db, S
15850 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 54  QLITE_DBCONFIG_T
15860 52 49 47 47 45 52 5f 45 51 50 2c 20 30 2c 20 30  RIGGER_EQP, 0, 0
15870 29 3b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  );.          /* 
15880 52 65 70 72 65 70 61 72 65 20 70 53 74 6d 74 20  Reprepare pStmt 
15890 62 65 66 6f 72 65 20 72 65 61 63 74 69 76 69 6e  before reactivin
158a0 67 20 74 72 61 63 65 20 6d 6f 64 65 73 20 2a 2f  g trace modes */
158b0 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
158c0 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
158d0 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  t);.          sq
158e0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
158f0 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  (db, zSql, -1, &
15900 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20  pStmt, 0);.     
15910 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 73     }.        res
15920 74 6f 72 65 5f 64 65 62 75 67 5f 74 72 61 63 65  tore_debug_trace
15930 5f 6d 6f 64 65 73 28 29 3b 0a 20 20 20 20 20 20  _modes();.      
15940 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  }..      if( pAr
15950 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72  g ){.        pAr
15960 67 2d 3e 63 4d 6f 64 65 20 3d 20 70 41 72 67 2d  g->cMode = pArg-
15970 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 69  >mode;.        i
15980 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 78 70  f( pArg->autoExp
15990 6c 61 69 6e 0a 20 20 20 20 20 20 20 20 20 26 26  lain.         &&
159a0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
159b0 63 6f 75 6e 74 28 70 53 74 6d 74 29 3d 3d 38 0a  count(pStmt)==8.
159c0 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
159d0 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 45 58 50  te3_strlike("EXP
159e0 4c 41 49 4e 25 22 2c 20 7a 53 74 6d 74 53 71 6c  LAIN%", zStmtSql
159f0 2c 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 29  ,0)==0.        )
15a00 7b 0a 20 20 20 20 20 20 20 20 20 20 70 41 72 67  {.          pArg
15a10 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45  ->cMode = MODE_E
15a20 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 20 20  xplain;.        
15a30 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  }..        /* If
15a40 20 74 68 65 20 73 68 65 6c 6c 20 69 73 20 63 75   the shell is cu
15a50 72 72 65 6e 74 6c 79 20 69 6e 20 22 2e 65 78 70  rrently in ".exp
15a60 6c 61 69 6e 22 20 6d 6f 64 65 2c 20 67 61 74 68  lain" mode, gath
15a70 65 72 20 74 68 65 20 65 78 74 72 61 0a 20 20 20  er the extra.   
15a80 20 20 20 20 20 2a 2a 20 64 61 74 61 20 72 65 71       ** data req
15a90 75 69 72 65 64 20 74 6f 20 61 64 64 20 69 6e 64  uired to add ind
15aa0 65 6e 74 73 20 74 6f 20 74 68 65 20 6f 75 74 70  ents to the outp
15ab0 75 74 2e 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ut.*/.        if
15ac0 28 20 70 41 72 67 2d 3e 63 4d 6f 64 65 3d 3d 4d  ( pArg->cMode==M
15ad0 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29 7b 0a 20  ODE_Explain ){. 
15ae0 20 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e           explain
15af0 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28 70 41  _data_prepare(pA
15b00 72 67 2c 20 70 53 74 6d 74 29 3b 0a 20 20 20 20  rg, pStmt);.    
15b10 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
15b20 20 20 20 20 20 65 78 65 63 5f 70 72 65 70 61 72       exec_prepar
15b30 65 64 5f 73 74 6d 74 28 70 41 72 67 2c 20 70 53  ed_stmt(pArg, pS
15b40 74 6d 74 29 3b 0a 20 20 20 20 20 20 65 78 70 6c  tmt);.      expl
15b50 61 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28  ain_data_delete(
15b60 70 41 72 67 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  pArg);..      /*
15b70 20 70 72 69 6e 74 20 75 73 61 67 65 20 73 74 61   print usage sta
15b80 74 73 20 69 66 20 73 74 61 74 73 20 6f 6e 20 2a  ts if stats on *
15b90 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67  /.      if( pArg
15ba0 20 26 26 20 70 41 72 67 2d 3e 73 74 61 74 73 4f   && pArg->statsO
15bb0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73  n ){.        dis
15bc0 70 6c 61 79 5f 73 74 61 74 73 28 64 62 2c 20 70  play_stats(db, p
15bd0 41 72 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  Arg, 0);.      }
15be0 0a 0a 20 20 20 20 20 20 2f 2a 20 70 72 69 6e 74  ..      /* print
15bf0 20 6c 6f 6f 70 2d 63 6f 75 6e 74 65 72 73 20 69   loop-counters i
15c00 66 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20  f required */.  
15c10 20 20 20 20 69 66 28 20 70 41 72 67 20 26 26 20      if( pArg && 
15c20 70 41 72 67 2d 3e 73 63 61 6e 73 74 61 74 73 4f  pArg->scanstatsO
15c30 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73  n ){.        dis
15c40 70 6c 61 79 5f 73 63 61 6e 73 74 61 74 73 28 64  play_scanstats(d
15c50 62 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 20 20  b, pArg);.      
15c60 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e 61  }..      /* Fina
15c70 6c 69 7a 65 20 74 68 65 20 73 74 61 74 65 6d 65  lize the stateme
15c80 6e 74 20 6a 75 73 74 20 65 78 65 63 75 74 65 64  nt just executed
15c90 2e 20 49 66 20 74 68 69 73 20 66 61 69 6c 73 2c  . If this fails,
15ca0 20 73 61 76 65 20 61 0a 20 20 20 20 20 20 2a 2a   save a.      **
15cb0 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 72 72   copy of the err
15cc0 6f 72 20 6d 65 73 73 61 67 65 2e 20 4f 74 68 65  or message. Othe
15cd0 72 77 69 73 65 2c 20 73 65 74 20 7a 53 71 6c 20  rwise, set zSql 
15ce0 74 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a  to point to the.
15cf0 20 20 20 20 20 20 2a 2a 20 6e 65 78 74 20 73 74        ** next st
15d00 61 74 65 6d 65 6e 74 20 74 6f 20 65 78 65 63 75  atement to execu
15d10 74 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 32  te. */.      rc2
15d20 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
15d30 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
15d40 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
15d50 5f 4e 4f 4d 45 4d 20 29 20 72 63 20 3d 20 72 63  _NOMEM ) rc = rc
15d60 32 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  2;.      if( rc=
15d70 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
15d80 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65        zSql = zLe
15d90 66 74 6f 76 65 72 3b 0a 20 20 20 20 20 20 20 20  ftover;.        
15da0 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a  while( IsSpace(z
15db0 53 71 6c 5b 30 5d 29 20 29 20 7a 53 71 6c 2b 2b  Sql[0]) ) zSql++
15dc0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
15dd0 28 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  ( pzErrMsg ){.  
15de0 20 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20        *pzErrMsg 
15df0 3d 20 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 64  = save_err_msg(d
15e00 62 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  b);.      }..   
15e10 20 20 20 2f 2a 20 63 6c 65 61 72 20 73 61 76 65     /* clear save
15e20 64 20 73 74 6d 74 20 68 61 6e 64 6c 65 20 2a 2f  d stmt handle */
15e30 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20  .      if( pArg 
15e40 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d  ){.        pArg-
15e50 3e 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 0a 20  >pStmt = NULL;. 
15e60 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
15e70 20 2f 2a 20 65 6e 64 20 77 68 69 6c 65 20 2a 2f   /* end while */
15e80 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
15e90 0a 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20  ../*.** Release 
15ea0 6d 65 6d 6f 72 79 20 70 72 65 76 69 6f 75 73 6c  memory previousl
15eb0 79 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74  y allocated by t
15ec0 61 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 29  ableColumnList()
15ed0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
15ee0 20 66 72 65 65 43 6f 6c 75 6d 6e 4c 69 73 74 28   freeColumnList(
15ef0 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20  char **azCol){. 
15f00 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
15f10 31 3b 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b  1; azCol[i]; i++
15f20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
15f30 72 65 65 28 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20  ree(azCol[i]);. 
15f40 20 7d 0a 20 20 2f 2a 20 61 7a 43 6f 6c 5b 30 5d   }.  /* azCol[0]
15f50 20 69 73 20 61 20 73 74 61 74 69 63 20 73 74 72   is a static str
15f60 69 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ing */.  sqlite3
15f70 5f 66 72 65 65 28 61 7a 43 6f 6c 29 3b 0a 7d 0a  _free(azCol);.}.
15f80 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  ./*.** Return a 
15f90 6c 69 73 74 20 6f 66 20 70 6f 69 6e 74 65 72 73  list of pointers
15fa0 20 74 6f 20 73 74 72 69 6e 67 73 20 77 68 69 63   to strings whic
15fb0 68 20 61 72 65 20 74 68 65 20 6e 61 6d 65 73 20  h are the names 
15fc0 6f 66 20 61 6c 6c 0a 2a 2a 20 63 6f 6c 75 6d 6e  of all.** column
15fd0 73 20 69 6e 20 74 61 62 6c 65 20 7a 54 61 62 2e  s in table zTab.
15fe0 20 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 74 6f     The memory to
15ff0 20 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73 20   hold the names 
16000 69 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a  is dynamically.*
16010 2a 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  * allocated and 
16020 6d 75 73 74 20 62 65 20 72 65 6c 65 61 73 65 64  must be released
16030 20 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75   by the caller u
16040 73 69 6e 67 20 61 20 73 75 62 73 65 71 75 65 6e  sing a subsequen
16050 74 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 72 65  t call.** to fre
16060 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 29 2e 0a 2a  eColumnList()..*
16070 2a 0a 2a 2a 20 54 68 65 20 61 7a 43 6f 6c 5b 30  *.** The azCol[0
16080 5d 20 65 6e 74 72 79 20 69 73 20 75 73 75 61 6c  ] entry is usual
16090 6c 79 20 4e 55 4c 4c 2e 20 20 48 6f 77 65 76 65  ly NULL.  Howeve
160a0 72 2c 20 69 66 20 7a 54 61 62 20 63 6f 6e 74 61  r, if zTab conta
160b0 69 6e 73 20 61 20 72 6f 77 69 64 0a 2a 2a 20 76  ins a rowid.** v
160c0 61 6c 75 65 20 74 68 61 74 20 6e 65 65 64 73 20  alue that needs 
160d0 74 6f 20 62 65 20 70 72 65 73 65 72 76 65 64 2c  to be preserved,
160e0 20 74 68 65 6e 20 61 7a 43 6f 6c 5b 30 5d 20 69   then azCol[0] i
160f0 73 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68  s filled in with
16100 20 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20   the.** name of 
16110 74 68 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e  the rowid column
16120 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73  ..**.** The firs
16130 74 20 72 65 67 75 6c 61 72 20 63 6f 6c 75 6d 6e  t regular column
16140 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 69 73   in the table is
16150 20 61 7a 43 6f 6c 5b 31 5d 2e 20 20 54 68 65 20   azCol[1].  The 
16160 6c 69 73 74 20 69 73 20 74 65 72 6d 69 6e 61 74  list is terminat
16170 65 64 0a 2a 2a 20 62 79 20 61 6e 20 65 6e 74 72  ed.** by an entr
16180 79 20 77 69 74 68 20 61 7a 43 6f 6c 5b 69 5d 3d  y with azCol[i]=
16190 3d 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  =0..*/.static ch
161a0 61 72 20 2a 2a 74 61 62 6c 65 43 6f 6c 75 6d 6e  ar **tableColumn
161b0 4c 69 73 74 28 53 68 65 6c 6c 53 74 61 74 65 20  List(ShellState 
161c0 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *p, const char *
161d0 7a 54 61 62 29 7b 0a 20 20 63 68 61 72 20 2a 2a  zTab){.  char **
161e0 61 7a 43 6f 6c 20 3d 20 30 3b 0a 20 20 73 71 6c  azCol = 0;.  sql
161f0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
16200 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  ;.  char *zSql;.
16210 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 30 3b 0a    int nCol = 0;.
16220 20 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 30    int nAlloc = 0
16230 3b 0a 20 20 69 6e 74 20 6e 50 4b 20 3d 20 30 3b  ;.  int nPK = 0;
16240 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
16250 20 6f 66 20 50 52 49 4d 41 52 59 20 4b 45 59 20   of PRIMARY KEY 
16260 63 6f 6c 75 6d 6e 73 20 73 65 65 6e 20 2a 2f 0a  columns seen */.
16270 20 20 69 6e 74 20 69 73 49 50 4b 20 3d 20 30 3b    int isIPK = 0;
16280 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
16290 6f 6e 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20  one PRIMARY KEY 
162a0 63 6f 6c 75 6d 6e 20 6f 66 20 74 79 70 65 20 49  column of type I
162b0 4e 54 45 47 45 52 20 2a 2f 0a 20 20 69 6e 74 20  NTEGER */.  int 
162c0 70 72 65 73 65 72 76 65 52 6f 77 69 64 20 3d 20  preserveRowid = 
162d0 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20  ShellHasFlag(p, 
162e0 53 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52 6f  SHFLG_PreserveRo
162f0 77 69 64 29 3b 0a 20 20 69 6e 74 20 72 63 3b 0a  wid);.  int rc;.
16300 0a 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  .  zSql = sqlite
16310 33 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d  3_mprintf("PRAGM
16320 41 20 74 61 62 6c 65 5f 69 6e 66 6f 3d 25 51 22  A table_info=%Q"
16330 2c 20 7a 54 61 62 29 3b 0a 20 20 72 63 20 3d 20  , zTab);.  rc = 
16340 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
16350 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  v2(p->db, zSql, 
16360 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
16370 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
16380 53 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 20 29  Sql);.  if( rc )
16390 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 68 69   return 0;.  whi
163a0 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  le( sqlite3_step
163b0 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f  (pStmt)==SQLITE_
163c0 52 4f 57 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ROW ){.    if( n
163d0 43 6f 6c 3e 3d 6e 41 6c 6c 6f 63 2d 32 20 29 7b  Col>=nAlloc-2 ){
163e0 0a 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20 3d 20  .      nAlloc = 
163f0 6e 41 6c 6c 6f 63 2a 32 20 2b 20 6e 43 6f 6c 20  nAlloc*2 + nCol 
16400 2b 20 31 30 3b 0a 20 20 20 20 20 20 61 7a 43 6f  + 10;.      azCo
16410 6c 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  l = sqlite3_real
16420 6c 6f 63 28 61 7a 43 6f 6c 2c 20 6e 41 6c 6c 6f  loc(azCol, nAllo
16430 63 2a 73 69 7a 65 6f 66 28 61 7a 43 6f 6c 5b 30  c*sizeof(azCol[0
16440 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  ]));.      if( a
16450 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zCol==0 ){.     
16460 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
16470 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6f 75  derr, "Error: ou
16480 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b  t of memory\n");
16490 0a 20 20 20 20 20 20 20 20 65 78 69 74 28 31 29  .        exit(1)
164a0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
164b0 20 20 20 20 61 7a 43 6f 6c 5b 2b 2b 6e 43 6f 6c      azCol[++nCol
164c0 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  ] = sqlite3_mpri
164d0 6e 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65  ntf("%s", sqlite
164e0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
164f0 74 6d 74 2c 20 31 29 29 3b 0a 20 20 20 20 69 66  tmt, 1));.    if
16500 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
16510 5f 69 6e 74 28 70 53 74 6d 74 2c 20 35 29 20 29  _int(pStmt, 5) )
16520 7b 0a 20 20 20 20 20 20 6e 50 4b 2b 2b 3b 0a 20  {.      nPK++;. 
16530 20 20 20 20 20 69 66 28 20 6e 50 4b 3d 3d 31 0a       if( nPK==1.
16540 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
16550 33 5f 73 74 72 69 63 6d 70 28 28 63 6f 6e 73 74  3_stricmp((const
16560 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
16570 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
16580 2c 32 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ,2),.           
16590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
165a0 49 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20  INTEGER")==0.   
165b0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73     ){.        is
165c0 49 50 4b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  IPK = 1;.      }
165d0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73  else{.        is
165e0 49 50 4b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  IPK = 0;.      }
165f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c  .    }.  }.  sql
16600 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
16610 74 6d 74 29 3b 0a 20 20 69 66 28 20 61 7a 43 6f  tmt);.  if( azCo
16620 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  l==0 ) return 0;
16630 0a 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 30 3b  .  azCol[0] = 0;
16640 0a 20 20 61 7a 43 6f 6c 5b 6e 43 6f 6c 2b 31 5d  .  azCol[nCol+1]
16650 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20   = 0;..  /* The 
16660 64 65 63 69 73 69 6f 6e 20 6f 66 20 77 68 65 74  decision of whet
16670 68 65 72 20 6f 72 20 6e 6f 74 20 61 20 72 6f 77  her or not a row
16680 69 64 20 72 65 61 6c 6c 79 20 6e 65 65 64 73 20  id really needs 
16690 74 6f 20 62 65 20 70 72 65 73 65 72 76 65 64 0a  to be preserved.
166a0 20 20 2a 2a 20 69 73 20 74 72 69 63 6b 79 2e 20    ** is tricky. 
166b0 20 57 65 20 6e 65 76 65 72 20 6e 65 65 64 20 74   We never need t
166c0 6f 20 70 72 65 73 65 72 76 65 20 61 20 72 6f 77  o preserve a row
166d0 69 64 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54  id for a WITHOUT
166e0 20 52 4f 57 49 44 20 74 61 62 6c 65 0a 20 20 2a   ROWID table.  *
166f0 2a 20 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74  * or a table wit
16700 68 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49  h an INTEGER PRI
16710 4d 41 52 59 20 4b 45 59 2e 20 20 57 65 20 61 72  MARY KEY.  We ar
16720 65 20 75 6e 61 62 6c 65 20 74 6f 20 70 72 65 73  e unable to pres
16730 65 72 76 65 0a 20 20 2a 2a 20 72 6f 77 69 64 73  erve.  ** rowids
16740 20 6f 6e 20 74 61 62 6c 65 73 20 77 68 65 72 65   on tables where
16750 20 74 68 65 20 72 6f 77 69 64 20 69 73 20 69 6e   the rowid is in
16760 61 63 63 65 73 73 69 62 6c 65 20 62 65 63 61 75  accessible becau
16770 73 65 20 74 68 65 72 65 20 61 72 65 20 6f 74 68  se there are oth
16780 65 72 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20  er.  ** columns 
16790 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  in the table nam
167a0 65 64 20 22 72 6f 77 69 64 22 2c 20 22 5f 72 6f  ed "rowid", "_ro
167b0 77 69 64 5f 22 2c 20 61 6e 64 20 22 6f 69 64 22  wid_", and "oid"
167c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 65  ..  */.  if( pre
167d0 73 65 72 76 65 52 6f 77 69 64 20 26 26 20 69 73  serveRowid && is
167e0 49 50 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66  IPK ){.    /* If
167f0 20 61 20 73 69 6e 67 6c 65 20 50 52 49 4d 41 52   a single PRIMAR
16800 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 77 69 74  Y KEY column wit
16810 68 20 74 79 70 65 20 49 4e 54 45 47 45 52 20 77  h type INTEGER w
16820 61 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 69 74  as seen, then it
16830 0a 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65  .    ** might be
16840 20 61 6e 20 61 6c 69 73 65 20 66 6f 72 20 74 68   an alise for th
16850 65 20 52 4f 57 49 44 2e 20 20 42 75 74 20 69 74  e ROWID.  But it
16860 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 61   might also be a
16870 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20   WITHOUT ROWID. 
16880 20 20 20 2a 2a 20 74 61 62 6c 65 20 6f 72 20 61     ** table or a
16890 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
168a0 20 4b 45 59 20 44 45 53 43 20 63 6f 6c 75 6d 6e   KEY DESC column
168b0 2c 20 6e 65 69 74 68 65 72 20 6f 66 20 77 68 69  , neither of whi
168c0 63 68 20 61 72 65 0a 20 20 20 20 2a 2a 20 52 4f  ch are.    ** RO
168d0 57 49 44 20 61 6c 69 61 73 65 73 2e 20 20 54 6f  WID aliases.  To
168e0 20 64 69 73 74 69 6e 67 75 69 73 68 20 74 68 65   distinguish the
168f0 73 65 20 63 61 73 65 73 2c 20 63 68 65 63 6b 20  se cases, check 
16900 74 6f 20 73 65 65 20 69 66 0a 20 20 20 20 2a 2a  to see if.    **
16910 20 74 68 65 72 65 20 69 73 20 61 20 22 70 6b 22   there is a "pk"
16920 20 65 6e 74 72 79 20 69 6e 20 22 50 52 41 47 4d   entry in "PRAGM
16930 41 20 69 6e 64 65 78 5f 6c 69 73 74 22 2e 20 20  A index_list".  
16940 54 68 65 72 65 20 77 69 6c 6c 20 62 65 0a 20 20  There will be.  
16950 20 20 2a 2a 20 6e 6f 20 22 70 6b 22 20 69 6e 64    ** no "pk" ind
16960 65 78 20 69 66 20 74 68 65 20 50 52 49 4d 41 52  ex if the PRIMAR
16970 59 20 4b 45 59 20 72 65 61 6c 6c 79 20 69 73 20  Y KEY really is 
16980 61 6e 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65  an alias for the
16990 20 52 4f 57 49 44 2e 0a 20 20 20 20 2a 2f 0a 20   ROWID..    */. 
169a0 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
169b0 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43  3_mprintf("SELEC
169c0 54 20 31 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f  T 1 FROM pragma_
169d0 69 6e 64 65 78 5f 6c 69 73 74 28 25 51 29 22 0a  index_list(%Q)".
169e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169f0 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45             " WHE
16a00 52 45 20 6f 72 69 67 69 6e 3d 27 70 6b 27 22 2c  RE origin='pk'",
16a10 20 7a 54 61 62 29 3b 0a 20 20 20 20 72 63 20 3d   zTab);.    rc =
16a20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
16a30 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  _v2(p->db, zSql,
16a40 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
16a50 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
16a60 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28  e(zSql);.    if(
16a70 20 72 63 20 29 7b 0a 20 20 20 20 20 20 66 72 65   rc ){.      fre
16a80 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f  eColumnList(azCo
16a90 6c 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  l);.      return
16aa0 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63   0;.    }.    rc
16ab0 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
16ac0 70 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69  pStmt);.    sqli
16ad0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
16ae0 6d 74 29 3b 0a 20 20 20 20 70 72 65 73 65 72 76  mt);.    preserv
16af0 65 52 6f 77 69 64 20 3d 20 72 63 3d 3d 53 51 4c  eRowid = rc==SQL
16b00 49 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 69  ITE_ROW;.  }.  i
16b10 66 28 20 70 72 65 73 65 72 76 65 52 6f 77 69 64  f( preserveRowid
16b20 20 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20   ){.    /* Only 
16b30 70 72 65 73 65 72 76 65 20 74 68 65 20 72 6f 77  preserve the row
16b40 69 64 20 69 66 20 77 65 20 63 61 6e 20 66 69 6e  id if we can fin
16b50 64 20 61 20 6e 61 6d 65 20 74 6f 20 75 73 65 20  d a name to use 
16b60 66 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 72  for the.    ** r
16b70 6f 77 69 64 20 2a 2f 0a 20 20 20 20 73 74 61 74  owid */.    stat
16b80 69 63 20 63 68 61 72 20 2a 61 7a 52 6f 77 69 64  ic char *azRowid
16b90 5b 5d 20 3d 20 7b 20 22 72 6f 77 69 64 22 2c 20  [] = { "rowid", 
16ba0 22 5f 72 6f 77 69 64 5f 22 2c 20 22 6f 69 64 22  "_rowid_", "oid"
16bb0 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   };.    int i, j
16bc0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  ;.    for(j=0; j
16bd0 3c 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  <3; j++){.      
16be0 66 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 43 6f 6c  for(i=1; i<=nCol
16bf0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
16c00 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69  if( sqlite3_stri
16c10 63 6d 70 28 61 7a 52 6f 77 69 64 5b 6a 5d 2c 61  cmp(azRowid[j],a
16c20 7a 43 6f 6c 5b 69 5d 29 3d 3d 30 20 29 20 62 72  zCol[i])==0 ) br
16c30 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
16c40 20 20 20 69 66 28 20 69 3e 6e 43 6f 6c 20 29 7b     if( i>nCol ){
16c50 0a 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74  .        /* At t
16c60 68 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e  his point, we kn
16c70 6f 77 20 74 68 61 74 20 61 7a 52 6f 77 69 64 5b  ow that azRowid[
16c80 6a 5d 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61  j] is not the na
16c90 6d 65 20 6f 66 20 61 6e 79 0a 20 20 20 20 20 20  me of any.      
16ca0 20 20 2a 2a 20 6f 72 64 69 6e 61 72 79 20 63 6f    ** ordinary co
16cb0 6c 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c  lumn in the tabl
16cc0 65 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20  e.  Verify that 
16cd0 61 7a 52 6f 77 69 64 5b 6a 5d 20 69 73 20 61 20  azRowid[j] is a 
16ce0 76 61 6c 69 64 0a 20 20 20 20 20 20 20 20 2a 2a  valid.        **
16cf0 20 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 72 6f   name for the ro
16d00 77 69 64 20 62 65 66 6f 72 65 20 61 64 64 69 6e  wid before addin
16d10 67 20 69 74 20 74 6f 20 61 7a 43 6f 6c 5b 30 5d  g it to azCol[0]
16d20 2e 20 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  .  WITHOUT ROWID
16d30 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  .        ** tabl
16d40 65 73 20 77 69 6c 6c 20 66 61 69 6c 20 74 68 69  es will fail thi
16d50 73 20 6c 61 73 74 20 63 68 65 63 6b 20 2a 2f 0a  s last check */.
16d60 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
16d70 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d  ite3_table_colum
16d80 6e 5f 6d 65 74 61 64 61 74 61 28 70 2d 3e 64 62  n_metadata(p->db
16d90 2c 30 2c 7a 54 61 62 2c 61 7a 52 6f 77 69 64 5b  ,0,zTab,azRowid[
16da0 6a 5d 2c 30 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20  j],0,0,0,0,0);. 
16db0 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53         if( rc==S
16dc0 51 4c 49 54 45 5f 4f 4b 20 29 20 61 7a 43 6f 6c  QLITE_OK ) azCol
16dd0 5b 30 5d 20 3d 20 61 7a 52 6f 77 69 64 5b 6a 5d  [0] = azRowid[j]
16de0 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
16df0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
16e00 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 7a 43 6f   }.  return azCo
16e10 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 67 67  l;.}../*.** Togg
16e20 6c 65 20 74 68 65 20 72 65 76 65 72 73 65 5f 75  le the reverse_u
16e30 6e 6f 72 64 65 72 65 64 5f 73 65 6c 65 63 74 73  nordered_selects
16e40 20 73 65 74 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61   setting..*/.sta
16e50 74 69 63 20 76 6f 69 64 20 74 6f 67 67 6c 65 53  tic void toggleS
16e60 65 6c 65 63 74 4f 72 64 65 72 28 73 71 6c 69 74  electOrder(sqlit
16e70 65 33 20 2a 64 62 29 7b 0a 20 20 73 71 6c 69 74  e3 *db){.  sqlit
16e80 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
16e90 20 30 3b 0a 20 20 69 6e 74 20 69 53 65 74 74 69   0;.  int iSetti
16ea0 6e 67 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a  ng = 0;.  char z
16eb0 53 74 6d 74 5b 31 30 30 5d 3b 0a 20 20 73 71 6c  Stmt[100];.  sql
16ec0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
16ed0 64 62 2c 20 22 50 52 41 47 4d 41 20 72 65 76 65  db, "PRAGMA reve
16ee0 72 73 65 5f 75 6e 6f 72 64 65 72 65 64 5f 73 65  rse_unordered_se
16ef0 6c 65 63 74 73 22 2c 20 2d 31 2c 20 26 70 53 74  lects", -1, &pSt
16f00 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 73 71  mt, 0);.  if( sq
16f10 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
16f20 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
16f30 0a 20 20 20 20 69 53 65 74 74 69 6e 67 20 3d 20  .    iSetting = 
16f40 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
16f50 6e 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  nt(pStmt, 0);.  
16f60 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  }.  sqlite3_fina
16f70 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 73  lize(pStmt);.  s
16f80 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
16f90 73 69 7a 65 6f 66 28 7a 53 74 6d 74 29 2c 20 7a  sizeof(zStmt), z
16fa0 53 74 6d 74 2c 0a 20 20 20 20 20 20 20 22 50 52  Stmt,.       "PR
16fb0 41 47 4d 41 20 72 65 76 65 72 73 65 5f 75 6e 6f  AGMA reverse_uno
16fc0 72 64 65 72 65 64 5f 73 65 6c 65 63 74 73 28 25  rdered_selects(%
16fd0 64 29 22 2c 20 21 69 53 65 74 74 69 6e 67 29 3b  d)", !iSetting);
16fe0 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28  .  sqlite3_exec(
16ff0 64 62 2c 20 7a 53 74 6d 74 2c 20 30 2c 20 30 2c  db, zStmt, 0, 0,
17000 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68   0);.}../*.** Th
17010 69 73 20 69 73 20 61 20 64 69 66 66 65 72 65 6e  is is a differen
17020 74 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  t callback routi
17030 6e 65 20 75 73 65 64 20 66 6f 72 20 64 75 6d 70  ne used for dump
17040 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
17050 2e 0a 2a 2a 20 45 61 63 68 20 72 6f 77 20 72 65  ..** Each row re
17060 63 65 69 76 65 64 20 62 79 20 74 68 69 73 20 63  ceived by this c
17070 61 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73  allback consists
17080 20 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65   of a table name
17090 2c 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74  ,.** the table t
170a0 79 70 65 20 28 22 69 6e 64 65 78 22 20 6f 72 20  ype ("index" or 
170b0 22 74 61 62 6c 65 22 29 20 61 6e 64 20 53 51 4c  "table") and SQL
170c0 20 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74   to create the t
170d0 61 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f  able..** This ro
170e0 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 70 72 69  utine should pri
170f0 6e 74 20 74 65 78 74 20 73 75 66 66 69 63 69 65  nt text sufficie
17100 6e 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 74  nt to recreate t
17110 68 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61  he table..*/.sta
17120 74 69 63 20 69 6e 74 20 64 75 6d 70 5f 63 61 6c  tic int dump_cal
17130 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67  lback(void *pArg
17140 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72  , int nArg, char
17150 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a   **azArg, char *
17160 2a 61 7a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 69  *azNotUsed){.  i
17170 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63  nt rc;.  const c
17180 68 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 63  har *zTable;.  c
17190 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65  onst char *zType
171a0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
171b0 7a 53 71 6c 3b 0a 20 20 53 68 65 6c 6c 53 74 61  zSql;.  ShellSta
171c0 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74  te *p = (ShellSt
171d0 61 74 65 20 2a 29 70 41 72 67 3b 0a 0a 20 20 55  ate *)pArg;..  U
171e0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
171f0 61 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66  azNotUsed);.  if
17200 28 20 6e 41 72 67 21 3d 33 20 7c 7c 20 61 7a 41  ( nArg!=3 || azA
17210 72 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  rg==0 ) return 0
17220 3b 0a 20 20 7a 54 61 62 6c 65 20 3d 20 61 7a 41  ;.  zTable = azA
17230 72 67 5b 30 5d 3b 0a 20 20 7a 54 79 70 65 20 3d  rg[0];.  zType =
17240 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 7a 53 71   azArg[1];.  zSq
17250 6c 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 0a 20  l = azArg[2];.. 
17260 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54 61 62   if( strcmp(zTab
17270 6c 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75  le, "sqlite_sequ
17280 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ence")==0 ){.   
17290 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
172a0 75 74 2c 20 22 44 45 4c 45 54 45 20 46 52 4f 4d  ut, "DELETE FROM
172b0 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
172c0 3b 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ;\n");.  }else i
172d0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  f( sqlite3_strgl
172e0 6f 62 28 22 73 71 6c 69 74 65 5f 73 74 61 74 3f  ob("sqlite_stat?
172f0 22 2c 20 7a 54 61 62 6c 65 29 3d 3d 30 20 29 7b  ", zTable)==0 ){
17300 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
17310 70 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45  p->out, "ANALYZE
17320 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c   sqlite_master;\
17330 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  n");.  }else if(
17340 20 73 74 72 6e 63 6d 70 28 7a 54 61 62 6c 65 2c   strncmp(zTable,
17350 20 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d   "sqlite_", 7)==
17360 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
17370 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  0;.  }else if( s
17380 74 72 6e 63 6d 70 28 7a 53 71 6c 2c 20 22 43 52  trncmp(zSql, "CR
17390 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
173a0 4c 45 22 2c 20 32 30 29 3d 3d 30 20 29 7b 0a 20  LE", 20)==0 ){. 
173b0 20 20 20 63 68 61 72 20 2a 7a 49 6e 73 3b 0a 20     char *zIns;. 
173c0 20 20 20 69 66 28 20 21 70 2d 3e 77 72 69 74 61     if( !p->writa
173d0 62 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  bleSchema ){.   
173e0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
173f0 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 77 72  >out, "PRAGMA wr
17400 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e  itable_schema=ON
17410 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e  ;\n");.      p->
17420 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d  writableSchema =
17430 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 49   1;.    }.    zI
17440 6e 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ns = sqlite3_mpr
17450 69 6e 74 66 28 0a 20 20 20 20 20 20 20 22 49 4e  intf(.       "IN
17460 53 45 52 54 20 49 4e 54 4f 20 73 71 6c 69 74 65  SERT INTO sqlite
17470 5f 6d 61 73 74 65 72 28 74 79 70 65 2c 6e 61 6d  _master(type,nam
17480 65 2c 74 62 6c 5f 6e 61 6d 65 2c 72 6f 6f 74 70  e,tbl_name,rootp
17490 61 67 65 2c 73 71 6c 29 22 0a 20 20 20 20 20 20  age,sql)".      
174a0 20 22 56 41 4c 55 45 53 28 27 74 61 62 6c 65 27   "VALUES('table'
174b0 2c 27 25 71 27 2c 27 25 71 27 2c 30 2c 27 25 71  ,'%q','%q',0,'%q
174c0 27 29 3b 22 2c 0a 20 20 20 20 20 20 20 7a 54 61  ');",.       zTa
174d0 62 6c 65 2c 20 7a 54 61 62 6c 65 2c 20 7a 53 71  ble, zTable, zSq
174e0 6c 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69  l);.    utf8_pri
174f0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c  ntf(p->out, "%s\
17500 6e 22 2c 20 7a 49 6e 73 29 3b 0a 20 20 20 20 73  n", zIns);.    s
17510 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6e 73  qlite3_free(zIns
17520 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
17530 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 72  .  }else{.    pr
17540 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 70 2d  intSchemaLine(p-
17550 3e 6f 75 74 2c 20 7a 53 71 6c 2c 20 22 3b 5c 6e  >out, zSql, ";\n
17560 22 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73  ");.  }..  if( s
17570 74 72 63 6d 70 28 7a 54 79 70 65 2c 20 22 74 61  trcmp(zType, "ta
17580 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ble")==0 ){.    
17590 53 68 65 6c 6c 54 65 78 74 20 73 53 65 6c 65 63  ShellText sSelec
175a0 74 3b 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74  t;.    ShellText
175b0 20 73 54 61 62 6c 65 3b 0a 20 20 20 20 63 68 61   sTable;.    cha
175c0 72 20 2a 2a 61 7a 43 6f 6c 3b 0a 20 20 20 20 69  r **azCol;.    i
175d0 6e 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20 2a  nt i;.    char *
175e0 73 61 76 65 64 44 65 73 74 54 61 62 6c 65 3b 0a  savedDestTable;.
175f0 20 20 20 20 69 6e 74 20 73 61 76 65 64 4d 6f 64      int savedMod
17600 65 3b 0a 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20  e;..    azCol = 
17610 74 61 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28  tableColumnList(
17620 70 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20  p, zTable);.    
17630 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 7b 0a  if( azCol==0 ){.
17640 20 20 20 20 20 20 70 2d 3e 6e 45 72 72 2b 2b 3b        p->nErr++;
17650 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
17660 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41  .    }..    /* A
17670 6c 77 61 79 73 20 71 75 6f 74 65 20 74 68 65 20  lways quote the 
17680 74 61 62 6c 65 20 6e 61 6d 65 2c 20 65 76 65 6e  table name, even
17690 20 69 66 20 69 74 20 61 70 70 65 61 72 73 20 74   if it appears t
176a0 6f 20 62 65 20 70 75 72 65 20 61 73 63 69 69 2c  o be pure ascii,
176b0 0a 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20  .    ** in case 
176c0 69 74 20 69 73 20 61 20 6b 65 79 77 6f 72 64 2e  it is a keyword.
176d0 20 45 78 3a 20 20 49 4e 53 45 52 54 20 49 4e 54   Ex:  INSERT INT
176e0 4f 20 22 74 61 62 6c 65 22 20 2e 2e 2e 20 2a 2f  O "table" ... */
176f0 0a 20 20 20 20 69 6e 69 74 54 65 78 74 28 26 73  .    initText(&s
17700 54 61 62 6c 65 29 3b 0a 20 20 20 20 61 70 70 65  Table);.    appe
17710 6e 64 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20  ndText(&sTable, 
17720 7a 54 61 62 6c 65 2c 20 71 75 6f 74 65 43 68 61  zTable, quoteCha
17730 72 28 7a 54 61 62 6c 65 29 29 3b 0a 20 20 20 20  r(zTable));.    
17740 2f 2a 20 49 66 20 70 72 65 73 65 72 76 69 6e 67  /* If preserving
17750 20 74 68 65 20 72 6f 77 69 64 2c 20 61 64 64 20   the rowid, add 
17760 61 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 61 66  a column list af
17770 74 65 72 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ter the table na
17780 6d 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 74  me..    ** In ot
17790 68 65 72 20 77 6f 72 64 73 3a 20 20 22 49 4e 53  her words:  "INS
177a0 45 52 54 20 49 4e 54 4f 20 74 61 62 28 72 6f 77  ERT INTO tab(row
177b0 69 64 2c 61 2c 62 2c 63 2c 2e 2e 2e 29 20 56 41  id,a,b,c,...) VA
177c0 4c 55 45 53 28 2e 2e 2e 29 22 0a 20 20 20 20 2a  LUES(...)".    *
177d0 2a 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65  * instead of the
177e0 20 75 73 75 61 6c 20 22 49 4e 53 45 52 54 20 49   usual "INSERT I
177f0 4e 54 4f 20 74 61 62 20 56 41 4c 55 45 53 28 2e  NTO tab VALUES(.
17800 2e 2e 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ..)"..    */.   
17810 20 69 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b   if( azCol[0] ){
17820 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
17830 74 28 26 73 54 61 62 6c 65 2c 20 22 28 22 2c 20  t(&sTable, "(", 
17840 30 29 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64  0);.      append
17850 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20 61 7a  Text(&sTable, az
17860 43 6f 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20  Col[0], 0);.    
17870 20 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c    for(i=1; azCol
17880 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
17890 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
178a0 54 61 62 6c 65 2c 20 22 2c 22 2c 20 30 29 3b 0a  Table, ",", 0);.
178b0 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
178c0 78 74 28 26 73 54 61 62 6c 65 2c 20 61 7a 43 6f  xt(&sTable, azCo
178d0 6c 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28  l[i], quoteChar(
178e0 61 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20  azCol[i]));.    
178f0 20 20 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64    }.      append
17900 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20 22 29  Text(&sTable, ")
17910 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ", 0);.    }..  
17920 20 20 2f 2a 20 42 75 69 6c 64 20 61 6e 20 61 70    /* Build an ap
17930 70 72 6f 70 72 69 61 74 65 20 53 45 4c 45 43 54  propriate SELECT
17940 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
17950 20 20 69 6e 69 74 54 65 78 74 28 26 73 53 65 6c    initText(&sSel
17960 65 63 74 29 3b 0a 20 20 20 20 61 70 70 65 6e 64  ect);.    append
17970 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22  Text(&sSelect, "
17980 53 45 4c 45 43 54 20 22 2c 20 30 29 3b 0a 20 20  SELECT ", 0);.  
17990 20 20 69 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29    if( azCol[0] )
179a0 7b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65  {.      appendTe
179b0 78 74 28 26 73 53 65 6c 65 63 74 2c 20 61 7a 43  xt(&sSelect, azC
179c0 6f 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20  ol[0], 0);.     
179d0 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
179e0 6c 65 63 74 2c 20 22 2c 22 2c 20 30 29 3b 0a 20  lect, ",", 0);. 
179f0 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 31     }.    for(i=1
17a00 3b 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29  ; azCol[i]; i++)
17a10 7b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65  {.      appendTe
17a20 78 74 28 26 73 53 65 6c 65 63 74 2c 20 61 7a 43  xt(&sSelect, azC
17a30 6f 6c 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61 72  ol[i], quoteChar
17a40 28 61 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20  (azCol[i]));.   
17a50 20 20 20 69 66 28 20 61 7a 43 6f 6c 5b 69 2b 31     if( azCol[i+1
17a60 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70  ] ){.        app
17a70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
17a80 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20  , ",", 0);.     
17a90 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65   }.    }.    fre
17aa0 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f  eColumnList(azCo
17ab0 6c 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65  l);.    appendTe
17ac0 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 20 46  xt(&sSelect, " F
17ad0 52 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 61  ROM ", 0);.    a
17ae0 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
17af0 63 74 2c 20 7a 54 61 62 6c 65 2c 20 71 75 6f 74  ct, zTable, quot
17b00 65 43 68 61 72 28 7a 54 61 62 6c 65 29 29 3b 0a  eChar(zTable));.
17b10 0a 20 20 20 20 73 61 76 65 64 44 65 73 74 54 61  .    savedDestTa
17b20 62 6c 65 20 3d 20 70 2d 3e 7a 44 65 73 74 54 61  ble = p->zDestTa
17b30 62 6c 65 3b 0a 20 20 20 20 73 61 76 65 64 4d 6f  ble;.    savedMo
17b40 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20  de = p->mode;.  
17b50 20 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20    p->zDestTable 
17b60 3d 20 73 54 61 62 6c 65 2e 7a 3b 0a 20 20 20 20  = sTable.z;.    
17b70 70 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 63 4d 6f  p->mode = p->cMo
17b80 64 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74  de = MODE_Insert
17b90 3b 0a 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c  ;.    rc = shell
17ba0 5f 65 78 65 63 28 70 2c 20 73 53 65 6c 65 63 74  _exec(p, sSelect
17bb0 2e 7a 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  .z, 0);.    if( 
17bc0 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  (rc&0xff)==SQLIT
17bd0 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20 20 20  E_CORRUPT ){.   
17be0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
17bf0 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43  >out, "/****** C
17c00 4f 52 52 55 50 54 49 4f 4e 20 45 52 52 4f 52 20  ORRUPTION ERROR 
17c10 2a 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20  *******/\n");.  
17c20 20 20 20 20 74 6f 67 67 6c 65 53 65 6c 65 63 74      toggleSelect
17c30 4f 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20  Order(p->db);.  
17c40 20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 70      shell_exec(p
17c50 2c 20 73 53 65 6c 65 63 74 2e 7a 2c 20 30 29 3b  , sSelect.z, 0);
17c60 0a 20 20 20 20 20 20 74 6f 67 67 6c 65 53 65 6c  .      toggleSel
17c70 65 63 74 4f 72 64 65 72 28 70 2d 3e 64 62 29 3b  ectOrder(p->db);
17c80 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 44  .    }.    p->zD
17c90 65 73 74 54 61 62 6c 65 20 3d 20 73 61 76 65 64  estTable = saved
17ca0 44 65 73 74 54 61 62 6c 65 3b 0a 20 20 20 20 70  DestTable;.    p
17cb0 2d 3e 6d 6f 64 65 20 3d 20 73 61 76 65 64 4d 6f  ->mode = savedMo
17cc0 64 65 3b 0a 20 20 20 20 66 72 65 65 54 65 78 74  de;.    freeText
17cd0 28 26 73 54 61 62 6c 65 29 3b 0a 20 20 20 20 66  (&sTable);.    f
17ce0 72 65 65 54 65 78 74 28 26 73 53 65 6c 65 63 74  reeText(&sSelect
17cf0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 20  );.    if( rc ) 
17d00 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20  p->nErr++;.  }. 
17d10 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
17d20 0a 2a 2a 20 52 75 6e 20 7a 51 75 65 72 79 2e 20  .** Run zQuery. 
17d30 20 55 73 65 20 64 75 6d 70 5f 63 61 6c 6c 62 61   Use dump_callba
17d40 63 6b 28 29 20 61 73 20 74 68 65 20 63 61 6c 6c  ck() as the call
17d50 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 73 6f 20  back routine so 
17d60 74 68 61 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74  that.** the cont
17d70 65 6e 74 73 20 6f 66 20 74 68 65 20 71 75 65 72  ents of the quer
17d80 79 20 61 72 65 20 6f 75 74 70 75 74 20 61 73 20  y are output as 
17d90 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  SQL statements..
17da0 2a 2a 0a 2a 2a 20 49 66 20 77 65 20 67 65 74 20  **.** If we get 
17db0 61 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  a SQLITE_CORRUPT
17dc0 20 65 72 72 6f 72 2c 20 72 65 72 75 6e 20 74 68   error, rerun th
17dd0 65 20 71 75 65 72 79 20 61 66 74 65 72 20 61 70  e query after ap
17de0 70 65 6e 64 69 6e 67 0a 2a 2a 20 22 4f 52 44 45  pending.** "ORDE
17df0 52 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22  R BY rowid DESC"
17e00 20 74 6f 20 74 68 65 20 65 6e 64 2e 0a 2a 2f 0a   to the end..*/.
17e10 73 74 61 74 69 63 20 69 6e 74 20 72 75 6e 5f 73  static int run_s
17e20 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79  chema_dump_query
17e30 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  (.  ShellState *
17e40 70 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  p,.  const char 
17e50 2a 7a 51 75 65 72 79 0a 29 7b 0a 20 20 69 6e 74  *zQuery.){.  int
17e60 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72   rc;.  char *zEr
17e70 72 20 3d 20 30 3b 0a 20 20 72 63 20 3d 20 73 71  r = 0;.  rc = sq
17e80 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
17e90 2c 20 7a 51 75 65 72 79 2c 20 64 75 6d 70 5f 63  , zQuery, dump_c
17ea0 61 6c 6c 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72  allback, p, &zEr
17eb0 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51  r);.  if( rc==SQ
17ec0 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a  LITE_CORRUPT ){.
17ed0 20 20 20 20 63 68 61 72 20 2a 7a 51 32 3b 0a 20      char *zQ2;. 
17ee0 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72     int len = str
17ef0 6c 65 6e 33 30 28 7a 51 75 65 72 79 29 3b 0a 20  len30(zQuery);. 
17f00 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
17f10 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43  >out, "/****** C
17f20 4f 52 52 55 50 54 49 4f 4e 20 45 52 52 4f 52 20  ORRUPTION ERROR 
17f30 2a 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20  *******/\n");.  
17f40 20 20 69 66 28 20 7a 45 72 72 20 29 7b 0a 20 20    if( zErr ){.  
17f50 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
17f60 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a  p->out, "/******
17f70 20 25 73 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20   %s ******/\n", 
17f80 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 73 71 6c  zErr);.      sql
17f90 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b  ite3_free(zErr);
17fa0 0a 20 20 20 20 20 20 7a 45 72 72 20 3d 20 30 3b  .      zErr = 0;
17fb0 0a 20 20 20 20 7d 0a 20 20 20 20 7a 51 32 20 3d  .    }.    zQ2 =
17fc0 20 6d 61 6c 6c 6f 63 28 20 6c 65 6e 2b 31 30 30   malloc( len+100
17fd0 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 51 32 3d   );.    if( zQ2=
17fe0 3d 30 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a  =0 ) return rc;.
17ff0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
18000 69 6e 74 66 28 6c 65 6e 2b 31 30 30 2c 20 7a 51  intf(len+100, zQ
18010 32 2c 20 22 25 73 20 4f 52 44 45 52 20 42 59 20  2, "%s ORDER BY 
18020 72 6f 77 69 64 20 44 45 53 43 22 2c 20 7a 51 75  rowid DESC", zQu
18030 65 72 79 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  ery);.    rc = s
18040 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
18050 62 2c 20 7a 51 32 2c 20 64 75 6d 70 5f 63 61 6c  b, zQ2, dump_cal
18060 6c 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29  lback, p, &zErr)
18070 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
18080 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
18090 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a  f(p->out, "/****
180a0 2a 2a 20 45 52 52 4f 52 3a 20 25 73 20 2a 2a 2a  ** ERROR: %s ***
180b0 2a 2a 2a 2f 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a  ***/\n", zErr);.
180c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
180d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52   rc = SQLITE_COR
180e0 52 55 50 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20  RUPT;.    }.    
180f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
18100 72 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 51 32  r);.    free(zQ2
18110 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
18120 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 78  rc;.}../*.** Tex
18130 74 20 6f 66 20 61 20 68 65 6c 70 20 6d 65 73 73  t of a help mess
18140 61 67 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  age.*/.static ch
18150 61 72 20 7a 48 65 6c 70 5b 5d 20 3d 0a 23 69 66  ar zHelp[] =.#if
18160 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
18170 48 41 56 45 5f 5a 4c 49 42 29 20 26 26 20 21 64  HAVE_ZLIB) && !d
18180 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
18190 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
181a0 0a 20 20 22 2e 61 72 63 68 69 76 65 20 2e 2e 2e  .  ".archive ...
181b0 20 20 20 20 20 20 20 20 20 20 20 4d 61 6e 61 67             Manag
181c0 65 20 53 51 4c 20 61 72 63 68 69 76 65 73 3a 20  e SQL archives: 
181d0 5c 22 2e 61 72 63 68 69 76 65 20 2d 2d 68 65 6c  \".archive --hel
181e0 70 5c 22 20 66 6f 72 20 64 65 74 61 69 6c 73 5c  p\" for details\
181f0 6e 22 0a 23 65 6e 64 69 66 0a 23 69 66 6e 64 65  n".#endif.#ifnde
18200 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
18210 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 22 2e  THORIZATION.  ".
18220 61 75 74 68 20 4f 4e 7c 4f 46 46 20 20 20 20 20  auth ON|OFF     
18230 20 20 20 20 20 20 53 68 6f 77 20 61 75 74 68 6f        Show autho
18240 72 69 7a 65 72 20 63 61 6c 6c 62 61 63 6b 73 5c  rizer callbacks\
18250 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e 62 61  n".#endif.  ".ba
18260 63 6b 75 70 20 3f 44 42 3f 20 46 49 4c 45 20 20  ckup ?DB? FILE  
18270 20 20 20 20 42 61 63 6b 75 70 20 44 42 20 28 64      Backup DB (d
18280 65 66 61 75 6c 74 20 5c 22 6d 61 69 6e 5c 22 29  efault \"main\")
18290 20 74 6f 20 46 49 4c 45 5c 6e 22 0a 20 20 22 2e   to FILE\n".  ".
182a0 62 61 69 6c 20 6f 6e 7c 6f 66 66 20 20 20 20 20  bail on|off     
182b0 20 20 20 20 20 20 53 74 6f 70 20 61 66 74 65 72        Stop after
182c0 20 68 69 74 74 69 6e 67 20 61 6e 20 65 72 72 6f   hitting an erro
182d0 72 2e 20 20 44 65 66 61 75 6c 74 20 4f 46 46 5c  r.  Default OFF\
182e0 6e 22 0a 20 20 22 2e 62 69 6e 61 72 79 20 6f 6e  n".  ".binary on
182f0 7c 6f 66 66 20 20 20 20 20 20 20 20 20 54 75 72  |off         Tur
18300 6e 20 62 69 6e 61 72 79 20 6f 75 74 70 75 74 20  n binary output 
18310 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 44 65 66 61  on or off.  Defa
18320 75 6c 74 20 4f 46 46 5c 6e 22 0a 20 20 22 2e 63  ult OFF\n".  ".c
18330 64 20 44 49 52 45 43 54 4f 52 59 20 20 20 20 20  d DIRECTORY     
18340 20 20 20 20 20 43 68 61 6e 67 65 20 74 68 65 20       Change the 
18350 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72  working director
18360 79 20 74 6f 20 44 49 52 45 43 54 4f 52 59 5c 6e  y to DIRECTORY\n
18370 22 0a 20 20 22 2e 63 68 61 6e 67 65 73 20 6f 6e  ".  ".changes on
18380 7c 6f 66 66 20 20 20 20 20 20 20 20 53 68 6f 77  |off        Show
18390 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
183a0 63 68 61 6e 67 65 64 20 62 79 20 53 51 4c 5c 6e  changed by SQL\n
183b0 22 0a 20 20 22 2e 63 68 65 63 6b 20 47 4c 4f 42  ".  ".check GLOB
183c0 20 20 20 20 20 20 20 20 20 20 20 20 46 61 69 6c              Fail
183d0 20 69 66 20 6f 75 74 70 75 74 20 73 69 6e 63 65   if output since
183e0 20 2e 74 65 73 74 63 61 73 65 20 64 6f 65 73 20   .testcase does 
183f0 6e 6f 74 20 6d 61 74 63 68 5c 6e 22 0a 20 20 22  not match\n".  "
18400 2e 63 6c 6f 6e 65 20 4e 45 57 44 42 20 20 20 20  .clone NEWDB    
18410 20 20 20 20 20 20 20 43 6c 6f 6e 65 20 64 61 74         Clone dat
18420 61 20 69 6e 74 6f 20 4e 45 57 44 42 20 66 72 6f  a into NEWDB fro
18430 6d 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 64  m the existing d
18440 61 74 61 62 61 73 65 5c 6e 22 0a 20 20 22 2e 64  atabase\n".  ".d
18450 61 74 61 62 61 73 65 73 20 20 20 20 20 20 20 20  atabases        
18460 20 20 20 20 20 4c 69 73 74 20 6e 61 6d 65 73 20       List names 
18470 61 6e 64 20 66 69 6c 65 73 20 6f 66 20 61 74 74  and files of att
18480 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 5c  ached databases\
18490 6e 22 0a 20 20 22 2e 64 62 69 6e 66 6f 20 3f 44  n".  ".dbinfo ?D
184a0 42 3f 20 20 20 20 20 20 20 20 20 20 20 53 68 6f  B?           Sho
184b0 77 20 73 74 61 74 75 73 20 69 6e 66 6f 72 6d 61  w status informa
184c0 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 64  tion about the d
184d0 61 74 61 62 61 73 65 5c 6e 22 0a 20 20 22 2e 64  atabase\n".  ".d
184e0 75 6d 70 20 3f 54 41 42 4c 45 3f 20 2e 2e 2e 20  ump ?TABLE? ... 
184f0 20 20 20 20 20 44 75 6d 70 20 74 68 65 20 64 61       Dump the da
18500 74 61 62 61 73 65 20 69 6e 20 61 6e 20 53 51 4c  tabase in an SQL
18510 20 74 65 78 74 20 66 6f 72 6d 61 74 5c 6e 22 0a   text format\n".
18520 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
18530 20 20 20 20 20 20 20 20 20 20 20 20 49 66 20 54              If T
18540 41 42 4c 45 20 73 70 65 63 69 66 69 65 64 2c 20  ABLE specified, 
18550 6f 6e 6c 79 20 64 75 6d 70 20 74 61 62 6c 65 73  only dump tables
18560 20 6d 61 74 63 68 69 6e 67 5c 6e 22 0a 20 20 22   matching\n".  "
18570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18580 20 20 20 20 20 20 20 20 20 4c 49 4b 45 20 70 61           LIKE pa
18590 74 74 65 72 6e 20 54 41 42 4c 45 2e 5c 6e 22 0a  ttern TABLE.\n".
185a0 20 20 22 2e 65 63 68 6f 20 6f 6e 7c 6f 66 66 20    ".echo on|off 
185b0 20 20 20 20 20 20 20 20 20 20 54 75 72 6e 20 63            Turn c
185c0 6f 6d 6d 61 6e 64 20 65 63 68 6f 20 6f 6e 20 6f  ommand echo on o
185d0 72 20 6f 66 66 5c 6e 22 0a 20 20 22 2e 65 71 70  r off\n".  ".eqp
185e0 20 6f 6e 7c 6f 66 66 7c 66 75 6c 6c 20 20 20 20   on|off|full    
185f0 20 20 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73     Enable or dis
18600 61 62 6c 65 20 61 75 74 6f 6d 61 74 69 63 20 45  able automatic E
18610 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
18620 4e 5c 6e 22 0a 20 20 22 2e 65 78 63 65 6c 20 20  N\n".  ".excel  
18630 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 44                 D
18640 69 73 70 6c 61 79 20 74 68 65 20 6f 75 74 70 75  isplay the outpu
18650 74 20 6f 66 20 6e 65 78 74 20 63 6f 6d 6d 61 6e  t of next comman
18660 64 20 69 6e 20 61 20 73 70 72 65 61 64 73 68 65  d in a spreadshe
18670 65 74 5c 6e 22 0a 20 20 22 2e 65 78 69 74 20 20  et\n".  ".exit  
18680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18690 45 78 69 74 20 74 68 69 73 20 70 72 6f 67 72 61  Exit this progra
186a0 6d 5c 6e 22 0a 20 20 22 2e 65 78 70 65 72 74 20  m\n".  ".expert 
186b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
186c0 58 50 45 52 49 4d 45 4e 54 41 4c 2e 20 53 75 67  XPERIMENTAL. Sug
186d0 67 65 73 74 20 69 6e 64 65 78 65 73 20 66 6f 72  gest indexes for
186e0 20 73 70 65 63 69 66 69 65 64 20 71 75 65 72 69   specified queri
186f0 65 73 5c 6e 22 0a 2f 2a 20 42 65 63 61 75 73 65  es\n"./* Because
18700 20 65 78 70 6c 61 69 6e 20 6d 6f 64 65 20 63 6f   explain mode co
18710 6d 65 73 20 6f 6e 20 61 75 74 6f 6d 61 74 69 63  mes on automatic
18720 61 6c 6c 79 20 6e 6f 77 2c 20 74 68 65 20 22 2e  ally now, the ".
18730 65 78 70 6c 61 69 6e 22 20 6d 6f 64 65 0a 2a 2a  explain" mode.**
18740 20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d   is removed from
18750 20 74 68 65 20 68 65 6c 70 20 73 63 72 65 65 6e   the help screen
18760 2e 20 20 49 74 20 69 73 20 73 74 69 6c 6c 20 73  .  It is still s
18770 75 70 70 6f 72 74 65 64 20 66 6f 72 20 6c 65 67  upported for leg
18780 61 63 79 2c 20 68 6f 77 65 76 65 72 20 2a 2f 0a  acy, however */.
18790 2f 2a 22 2e 65 78 70 6c 61 69 6e 20 3f 6f 6e 7c  /*".explain ?on|
187a0 6f 66 66 7c 61 75 74 6f 3f 20 54 75 72 6e 20 45  off|auto? Turn E
187b0 58 50 4c 41 49 4e 20 6f 75 74 70 75 74 20 6d 6f  XPLAIN output mo
187c0 64 65 20 6f 6e 20 6f 72 20 6f 66 66 20 6f 72 20  de on or off or 
187d0 74 6f 20 61 75 74 6f 6d 61 74 69 63 5c 6e 22 2a  to automatic\n"*
187e0 2f 0a 20 20 22 2e 66 75 6c 6c 73 63 68 65 6d 61  /.  ".fullschema
187f0 20 3f 2d 2d 69 6e 64 65 6e 74 3f 20 53 68 6f 77   ?--indent? Show
18800 20 73 63 68 65 6d 61 20 61 6e 64 20 74 68 65 20   schema and the 
18810 63 6f 6e 74 65 6e 74 20 6f 66 20 73 71 6c 69 74  content of sqlit
18820 65 5f 73 74 61 74 20 74 61 62 6c 65 73 5c 6e 22  e_stat tables\n"
18830 0a 20 20 22 2e 68 65 61 64 65 72 73 20 6f 6e 7c  .  ".headers on|
18840 6f 66 66 20 20 20 20 20 20 20 20 54 75 72 6e 20  off        Turn 
18850 64 69 73 70 6c 61 79 20 6f 66 20 68 65 61 64 65  display of heade
18860 72 73 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a  rs on or off\n".
18870 20 20 22 2e 68 65 6c 70 20 20 20 20 20 20 20 20    ".help        
18880 20 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 74            Show t
18890 68 69 73 20 6d 65 73 73 61 67 65 5c 6e 22 0a 20  his message\n". 
188a0 20 22 2e 69 6d 70 6f 72 74 20 46 49 4c 45 20 54   ".import FILE T
188b0 41 42 4c 45 20 20 20 20 20 49 6d 70 6f 72 74 20  ABLE     Import 
188c0 64 61 74 61 20 66 72 6f 6d 20 46 49 4c 45 20 69  data from FILE i
188d0 6e 74 6f 20 54 41 42 4c 45 5c 6e 22 0a 23 69 66  nto TABLE\n".#if
188e0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
188f0 5f 54 45 53 54 5f 43 4f 4e 54 52 4f 4c 0a 20 20  _TEST_CONTROL.  
18900 22 2e 69 6d 70 6f 73 74 65 72 20 49 4e 44 45 58  ".imposter INDEX
18910 20 54 41 42 4c 45 20 20 43 72 65 61 74 65 20 69   TABLE  Create i
18920 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 54 41  mposter table TA
18930 42 4c 45 20 6f 6e 20 69 6e 64 65 78 20 49 4e 44  BLE on index IND
18940 45 58 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22  EX\n".#endif.  "
18950 2e 69 6e 64 65 78 65 73 20 3f 54 41 42 4c 45 3f  .indexes ?TABLE?
18960 20 20 20 20 20 20 20 53 68 6f 77 20 6e 61 6d 65         Show name
18970 73 20 6f 66 20 61 6c 6c 20 69 6e 64 65 78 65 73  s of all indexes
18980 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20  \n".  "         
18990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189a0 49 66 20 54 41 42 4c 45 20 73 70 65 63 69 66 69  If TABLE specifi
189b0 65 64 2c 20 6f 6e 6c 79 20 73 68 6f 77 20 69 6e  ed, only show in
189c0 64 65 78 65 73 20 66 6f 72 20 74 61 62 6c 65 73  dexes for tables
189d0 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20  \n".  "         
189e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189f0 6d 61 74 63 68 69 6e 67 20 4c 49 4b 45 20 70 61  matching LIKE pa
18a00 74 74 65 72 6e 20 54 41 42 4c 45 2e 5c 6e 22 0a  ttern TABLE.\n".
18a10 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
18a20 41 42 4c 45 5f 49 4f 54 52 41 43 45 0a 20 20 22  ABLE_IOTRACE.  "
18a30 2e 69 6f 74 72 61 63 65 20 46 49 4c 45 20 20 20  .iotrace FILE   
18a40 20 20 20 20 20 20 20 45 6e 61 62 6c 65 20 49 2f         Enable I/
18a50 4f 20 64 69 61 67 6e 6f 73 74 69 63 20 6c 6f 67  O diagnostic log
18a60 67 69 6e 67 20 74 6f 20 46 49 4c 45 5c 6e 22 0a  ging to FILE\n".
18a70 23 65 6e 64 69 66 0a 20 20 22 2e 6c 69 6d 69 74  #endif.  ".limit
18a80 20 3f 4c 49 4d 49 54 3f 20 3f 56 41 4c 3f 20 20   ?LIMIT? ?VAL?  
18a90 20 44 69 73 70 6c 61 79 20 6f 72 20 63 68 61 6e   Display or chan
18aa0 67 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ge the value of 
18ab0 61 6e 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5c  an SQLITE_LIMIT\
18ac0 6e 22 0a 20 20 22 2e 6c 69 6e 74 20 4f 50 54 49  n".  ".lint OPTI
18ad0 4f 4e 53 20 20 20 20 20 20 20 20 20 20 52 65 70  ONS          Rep
18ae0 6f 72 74 20 70 6f 74 65 6e 74 69 61 6c 20 73 63  ort potential sc
18af0 68 65 6d 61 20 69 73 73 75 65 73 2e 20 4f 70 74  hema issues. Opt
18b00 69 6f 6e 73 3a 5c 6e 22 0a 20 20 22 20 20 20 20  ions:\n".  "    
18b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18b20 20 20 20 20 20 66 6b 65 79 2d 69 6e 64 65 78 65       fkey-indexe
18b30 73 20 20 20 20 20 46 69 6e 64 20 6d 69 73 73 69  s     Find missi
18b40 6e 67 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69  ng foreign key i
18b50 6e 64 65 78 65 73 5c 6e 22 0a 23 69 66 6e 64 65  ndexes\n".#ifnde
18b60 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f  f SQLITE_OMIT_LO
18b70 41 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 22  AD_EXTENSION.  "
18b80 2e 6c 6f 61 64 20 46 49 4c 45 20 3f 45 4e 54 52  .load FILE ?ENTR
18b90 59 3f 20 20 20 20 20 4c 6f 61 64 20 61 6e 20 65  Y?     Load an e
18ba0 78 74 65 6e 73 69 6f 6e 20 6c 69 62 72 61 72 79  xtension library
18bb0 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e 6c  \n".#endif.  ".l
18bc0 6f 67 20 46 49 4c 45 7c 6f 66 66 20 20 20 20 20  og FILE|off     
18bd0 20 20 20 20 20 54 75 72 6e 20 6c 6f 67 67 69 6e       Turn loggin
18be0 67 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 46 49  g on or off.  FI
18bf0 4c 45 20 63 61 6e 20 62 65 20 73 74 64 65 72 72  LE can be stderr
18c00 2f 73 74 64 6f 75 74 5c 6e 22 0a 20 20 22 2e 6d  /stdout\n".  ".m
18c10 6f 64 65 20 4d 4f 44 45 20 3f 54 41 42 4c 45 3f  ode MODE ?TABLE?
18c20 20 20 20 20 20 53 65 74 20 6f 75 74 70 75 74 20       Set output 
18c30 6d 6f 64 65 20 77 68 65 72 65 20 4d 4f 44 45 20  mode where MODE 
18c40 69 73 20 6f 6e 65 20 6f 66 3a 5c 6e 22 0a 20 20  is one of:\n".  
18c50 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
18c60 20 20 20 20 20 20 20 20 20 20 61 73 63 69 69 20            ascii 
18c70 20 20 20 43 6f 6c 75 6d 6e 73 2f 72 6f 77 73 20     Columns/rows 
18c80 64 65 6c 69 6d 69 74 65 64 20 62 79 20 30 78 31  delimited by 0x1
18c90 46 20 61 6e 64 20 30 78 31 45 5c 6e 22 0a 20 20  F and 0x1E\n".  
18ca0 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
18cb0 20 20 20 20 20 20 20 20 20 20 63 73 76 20 20 20            csv   
18cc0 20 20 20 43 6f 6d 6d 61 2d 73 65 70 61 72 61 74     Comma-separat
18cd0 65 64 20 76 61 6c 75 65 73 5c 6e 22 0a 20 20 22  ed values\n".  "
18ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18cf0 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20           column 
18d00 20 20 4c 65 66 74 2d 61 6c 69 67 6e 65 64 20 63    Left-aligned c
18d10 6f 6c 75 6d 6e 73 2e 20 20 28 53 65 65 20 2e 77  olumns.  (See .w
18d20 69 64 74 68 29 5c 6e 22 0a 20 20 22 20 20 20 20  idth)\n".  "    
18d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18d40 20 20 20 20 20 68 74 6d 6c 20 20 20 20 20 48 54       html     HT
18d50 4d 4c 20 3c 74 61 62 6c 65 3e 20 63 6f 64 65 5c  ML <table> code\
18d60 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
18d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
18d80 6e 73 65 72 74 20 20 20 53 51 4c 20 69 6e 73 65  nsert   SQL inse
18d90 72 74 20 73 74 61 74 65 6d 65 6e 74 73 20 66 6f  rt statements fo
18da0 72 20 54 41 42 4c 45 5c 6e 22 0a 20 20 22 20 20  r TABLE\n".  "  
18db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18dc0 20 20 20 20 20 20 20 6c 69 6e 65 20 20 20 20 20         line     
18dd0 4f 6e 65 20 76 61 6c 75 65 20 70 65 72 20 6c 69  One value per li
18de0 6e 65 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  ne\n".  "       
18df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e00 20 20 6c 69 73 74 20 20 20 20 20 56 61 6c 75 65    list     Value
18e10 73 20 64 65 6c 69 6d 69 74 65 64 20 62 79 20 5c  s delimited by \
18e20 22 7c 5c 22 5c 6e 22 0a 20 20 22 20 20 20 20 20  "|\"\n".  "     
18e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e40 20 20 20 20 71 75 6f 74 65 20 20 20 20 45 73 63      quote    Esc
18e50 61 70 65 20 61 6e 73 77 65 72 73 20 61 73 20 66  ape answers as f
18e60 6f 72 20 53 51 4c 5c 6e 22 0a 20 20 22 20 20 20  or SQL\n".  "   
18e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18e80 20 20 20 20 20 20 74 61 62 73 20 20 20 20 20 54        tabs     T
18e90 61 62 2d 73 65 70 61 72 61 74 65 64 20 76 61 6c  ab-separated val
18ea0 75 65 73 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  ues\n".  "      
18eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18ec0 20 20 20 74 63 6c 20 20 20 20 20 20 54 43 4c 20     tcl      TCL 
18ed0 6c 69 73 74 20 65 6c 65 6d 65 6e 74 73 5c 6e 22  list elements\n"
18ee0 0a 20 20 22 2e 6e 75 6c 6c 76 61 6c 75 65 20 53  .  ".nullvalue S
18ef0 54 52 49 4e 47 20 20 20 20 20 20 55 73 65 20 53  TRING      Use S
18f00 54 52 49 4e 47 20 69 6e 20 70 6c 61 63 65 20 6f  TRING in place o
18f10 66 20 4e 55 4c 4c 20 76 61 6c 75 65 73 5c 6e 22  f NULL values\n"
18f20 0a 20 20 22 2e 6f 6e 63 65 20 28 2d 65 7c 2d 78  .  ".once (-e|-x
18f30 7c 46 49 4c 45 29 20 20 20 20 20 4f 75 74 70 75  |FILE)     Outpu
18f40 74 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 53  t for the next S
18f50 51 4c 20 63 6f 6d 6d 61 6e 64 20 6f 6e 6c 79 20  QL command only 
18f60 74 6f 20 46 49 4c 45 5c 6e 22 0a 20 20 22 20 20  to FILE\n".  "  
18f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18f80 20 20 20 20 20 20 20 6f 72 20 69 6e 76 6f 6b 65         or invoke
18f90 20 73 79 73 74 65 6d 20 74 65 78 74 20 65 64 69   system text edi
18fa0 74 6f 72 20 28 2d 65 29 20 6f 72 20 73 70 72 65  tor (-e) or spre
18fb0 61 64 73 68 65 65 74 20 28 2d 78 29 5c 6e 22 0a  adsheet (-x)\n".
18fc0 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
18fd0 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 20 74              on t
18fe0 68 65 20 6f 75 74 70 75 74 2e 5c 6e 22 0a 20 20  he output.\n".  
18ff0 22 2e 6f 70 65 6e 20 3f 4f 50 54 49 4f 4e 53 3f  ".open ?OPTIONS?
19000 20 3f 46 49 4c 45 3f 20 43 6c 6f 73 65 20 65 78   ?FILE? Close ex
19010 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  isting database 
19020 61 6e 64 20 72 65 6f 70 65 6e 20 46 49 4c 45 5c  and reopen FILE\
19030 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
19040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
19050 68 65 20 2d 2d 6e 65 77 20 6f 70 74 69 6f 6e 20  he --new option 
19060 73 74 61 72 74 73 20 77 69 74 68 20 61 6e 20 65  starts with an e
19070 6d 70 74 79 20 66 69 6c 65 5c 6e 22 0a 20 20 22  mpty file\n".  "
19080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19090 20 20 20 20 20 20 20 20 20 4f 74 68 65 72 20 6f           Other o
190a0 70 74 69 6f 6e 73 3a 20 2d 2d 72 65 61 64 6f 6e  ptions: --readon
190b0 6c 79 20 2d 2d 61 70 70 65 6e 64 20 2d 2d 7a 69  ly --append --zi
190c0 70 5c 6e 22 0a 20 20 22 2e 6f 75 74 70 75 74 20  p\n".  ".output 
190d0 3f 46 49 4c 45 3f 20 20 20 20 20 20 20 20 20 53  ?FILE?         S
190e0 65 6e 64 20 6f 75 74 70 75 74 20 74 6f 20 46 49  end output to FI
190f0 4c 45 20 6f 72 20 73 74 64 6f 75 74 5c 6e 22 0a  LE or stdout\n".
19100 20 20 22 2e 70 72 69 6e 74 20 53 54 52 49 4e 47    ".print STRING
19110 2e 2e 2e 20 20 20 20 20 20 20 50 72 69 6e 74 20  ...       Print 
19120 6c 69 74 65 72 61 6c 20 53 54 52 49 4e 47 5c 6e  literal STRING\n
19130 22 0a 20 20 22 2e 70 72 6f 6d 70 74 20 4d 41 49  ".  ".prompt MAI
19140 4e 20 43 4f 4e 54 49 4e 55 45 20 20 52 65 70 6c  N CONTINUE  Repl
19150 61 63 65 20 74 68 65 20 73 74 61 6e 64 61 72 64  ace the standard
19160 20 70 72 6f 6d 70 74 73 5c 6e 22 0a 20 20 22 2e   prompts\n".  ".
19170 71 75 69 74 20 20 20 20 20 20 20 20 20 20 20 20  quit            
19180 20 20 20 20 20 20 45 78 69 74 20 74 68 69 73 20        Exit this 
19190 70 72 6f 67 72 61 6d 5c 6e 22 0a 20 20 22 2e 72  program\n".  ".r
191a0 65 61 64 20 46 49 4c 45 4e 41 4d 45 20 20 20 20  ead FILENAME    
191b0 20 20 20 20 20 45 78 65 63 75 74 65 20 53 51 4c       Execute SQL
191c0 20 69 6e 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 0a   in FILENAME\n".
191d0 20 20 22 2e 72 65 73 74 6f 72 65 20 3f 44 42 3f    ".restore ?DB?
191e0 20 46 49 4c 45 20 20 20 20 20 52 65 73 74 6f 72   FILE     Restor
191f0 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 44 42 20  e content of DB 
19200 28 64 65 66 61 75 6c 74 20 5c 22 6d 61 69 6e 5c  (default \"main\
19210 22 29 20 66 72 6f 6d 20 46 49 4c 45 5c 6e 22 0a  ") from FILE\n".
19220 20 20 22 2e 73 61 76 65 20 46 49 4c 45 20 20 20    ".save FILE   
19230 20 20 20 20 20 20 20 20 20 20 57 72 69 74 65 20            Write 
19240 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  in-memory databa
19250 73 65 20 69 6e 74 6f 20 46 49 4c 45 5c 6e 22 0a  se into FILE\n".
19260 20 20 22 2e 73 63 61 6e 73 74 61 74 73 20 6f 6e    ".scanstats on
19270 7c 6f 66 66 20 20 20 20 20 20 54 75 72 6e 20 73  |off      Turn s
19280 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e  qlite3_stmt_scan
19290 73 74 61 74 75 73 28 29 20 6d 65 74 72 69 63 73  status() metrics
192a0 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20   on or off\n".  
192b0 22 2e 73 63 68 65 6d 61 20 3f 50 41 54 54 45 52  ".schema ?PATTER
192c0 4e 3f 20 20 20 20 20 20 53 68 6f 77 20 74 68 65  N?      Show the
192d0 20 43 52 45 41 54 45 20 73 74 61 74 65 6d 65 6e   CREATE statemen
192e0 74 73 20 6d 61 74 63 68 69 6e 67 20 50 41 54 54  ts matching PATT
192f0 45 52 4e 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  ERN\n".  "      
19300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19310 20 20 20 20 41 64 64 20 2d 2d 69 6e 64 65 6e 74      Add --indent
19320 20 66 6f 72 20 70 72 65 74 74 79 2d 70 72 69 6e   for pretty-prin
19330 74 69 6e 67 5c 6e 22 0a 20 20 22 2e 73 65 6c 66  ting\n".  ".self
19340 74 65 73 74 20 3f 2d 2d 69 6e 69 74 3f 20 20 20  test ?--init?   
19350 20 20 52 75 6e 20 74 65 73 74 73 20 64 65 66 69    Run tests defi
19360 6e 65 64 20 69 6e 20 74 68 65 20 53 45 4c 46 54  ned in the SELFT
19370 45 53 54 20 74 61 62 6c 65 5c 6e 22 0a 20 20 22  EST table\n".  "
19380 2e 73 65 70 61 72 61 74 6f 72 20 43 4f 4c 20 3f  .separator COL ?
19390 52 4f 57 3f 20 20 20 43 68 61 6e 67 65 20 74 68  ROW?   Change th
193a0 65 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74  e column separat
193b0 6f 72 20 61 6e 64 20 6f 70 74 69 6f 6e 61 6c 6c  or and optionall
193c0 79 20 74 68 65 20 72 6f 77 5c 6e 22 0a 20 20 22  y the row\n".  "
193d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
193e0 20 20 20 20 20 20 20 20 20 73 65 70 61 72 61 74           separat
193f0 6f 72 20 66 6f 72 20 62 6f 74 68 20 74 68 65 20  or for both the 
19400 6f 75 74 70 75 74 20 6d 6f 64 65 20 61 6e 64 20  output mode and 
19410 2e 69 6d 70 6f 72 74 5c 6e 22 0a 23 69 66 20 64  .import\n".#if d
19420 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
19430 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 20 20  ABLE_SESSION).  
19440 22 2e 73 65 73 73 69 6f 6e 20 43 4d 44 20 2e 2e  ".session CMD ..
19450 2e 20 20 20 20 20 20 20 43 72 65 61 74 65 20 6f  .       Create o
19460 72 20 63 6f 6e 74 72 6f 6c 20 73 65 73 73 69 6f  r control sessio
19470 6e 73 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22  ns\n".#endif.  "
19480 2e 73 68 61 33 73 75 6d 20 3f 4f 50 54 49 4f 4e  .sha3sum ?OPTION
19490 53 2e 2e 2e 3f 20 20 43 6f 6d 70 75 74 65 20 61  S...?  Compute a
194a0 20 53 48 41 33 20 68 61 73 68 20 6f 66 20 64 61   SHA3 hash of da
194b0 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74 5c 6e  tabase content\n
194c0 22 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ".#ifndef SQLITE
194d0 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a 20  _NOHAVE_SYSTEM. 
194e0 20 22 2e 73 68 65 6c 6c 20 43 4d 44 20 41 52 47   ".shell CMD ARG
194f0 53 2e 2e 2e 20 20 20 20 20 52 75 6e 20 43 4d 44  S...     Run CMD
19500 20 41 52 47 53 2e 2e 2e 20 69 6e 20 61 20 73 79   ARGS... in a sy
19510 73 74 65 6d 20 73 68 65 6c 6c 5c 6e 22 0a 23 65  stem shell\n".#e
19520 6e 64 69 66 0a 20 20 22 2e 73 68 6f 77 20 20 20  ndif.  ".show   
19530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
19540 68 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20  how the current 
19550 76 61 6c 75 65 73 20 66 6f 72 20 76 61 72 69 6f  values for vario
19560 75 73 20 73 65 74 74 69 6e 67 73 5c 6e 22 0a 20  us settings\n". 
19570 20 22 2e 73 74 61 74 73 20 3f 6f 6e 7c 6f 66 66   ".stats ?on|off
19580 3f 20 20 20 20 20 20 20 20 53 68 6f 77 20 73 74  ?        Show st
19590 61 74 73 20 6f 72 20 74 75 72 6e 20 73 74 61 74  ats or turn stat
195a0 73 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 23  s on or off\n".#
195b0 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f  ifndef SQLITE_NO
195c0 48 41 56 45 5f 53 59 53 54 45 4d 0a 20 20 22 2e  HAVE_SYSTEM.  ".
195d0 73 79 73 74 65 6d 20 43 4d 44 20 41 52 47 53 2e  system CMD ARGS.
195e0 2e 2e 20 20 20 20 52 75 6e 20 43 4d 44 20 41 52  ..    Run CMD AR
195f0 47 53 2e 2e 2e 20 69 6e 20 61 20 73 79 73 74 65  GS... in a syste
19600 6d 20 73 68 65 6c 6c 5c 6e 22 0a 23 65 6e 64 69  m shell\n".#endi
19610 66 0a 20 20 22 2e 74 61 62 6c 65 73 20 3f 54 41  f.  ".tables ?TA
19620 42 4c 45 3f 20 20 20 20 20 20 20 20 4c 69 73 74  BLE?        List
19630 20 6e 61 6d 65 73 20 6f 66 20 74 61 62 6c 65 73   names of tables
19640 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20  \n".  "         
19650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19660 49 66 20 54 41 42 4c 45 20 73 70 65 63 69 66 69  If TABLE specifi
19670 65 64 2c 20 6f 6e 6c 79 20 6c 69 73 74 20 74 61  ed, only list ta
19680 62 6c 65 73 20 6d 61 74 63 68 69 6e 67 5c 6e 22  bles matching\n"
19690 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
196a0 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 49 4b               LIK
196b0 45 20 70 61 74 74 65 72 6e 20 54 41 42 4c 45 2e  E pattern TABLE.
196c0 5c 6e 22 0a 20 20 22 2e 74 65 73 74 63 61 73 65  \n".  ".testcase
196d0 20 4e 41 4d 45 20 20 20 20 20 20 20 20 20 42 65   NAME         Be
196e0 67 69 6e 20 72 65 64 69 72 65 63 74 69 6e 67 20  gin redirecting 
196f0 6f 75 74 70 75 74 20 74 6f 20 27 74 65 73 74 63  output to 'testc
19700 61 73 65 2d 6f 75 74 2e 74 78 74 27 5c 6e 22 0a  ase-out.txt'\n".
19710 20 20 22 2e 74 69 6d 65 6f 75 74 20 4d 53 20 20    ".timeout MS  
19720 20 20 20 20 20 20 20 20 20 20 54 72 79 20 6f 70            Try op
19730 65 6e 69 6e 67 20 6c 6f 63 6b 65 64 20 74 61 62  ening locked tab
19740 6c 65 73 20 66 6f 72 20 4d 53 20 6d 69 6c 6c 69  les for MS milli
19750 73 65 63 6f 6e 64 73 5c 6e 22 0a 20 20 22 2e 74  seconds\n".  ".t
19760 69 6d 65 72 20 6f 6e 7c 6f 66 66 20 20 20 20 20  imer on|off     
19770 20 20 20 20 20 54 75 72 6e 20 53 51 4c 20 74 69       Turn SQL ti
19780 6d 65 72 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22  mer on or off\n"
19790 0a 20 20 22 2e 74 72 61 63 65 20 46 49 4c 45 7c  .  ".trace FILE|
197a0 6f 66 66 20 20 20 20 20 20 20 20 4f 75 74 70 75  off        Outpu
197b0 74 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65  t each SQL state
197c0 6d 65 6e 74 20 61 73 20 69 74 20 69 73 20 72 75  ment as it is ru
197d0 6e 5c 6e 22 0a 20 20 22 2e 76 66 73 69 6e 66 6f  n\n".  ".vfsinfo
197e0 20 3f 41 55 58 3f 20 20 20 20 20 20 20 20 20 49   ?AUX?         I
197f0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
19800 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 56   the top-level V
19810 46 53 5c 6e 22 0a 20 20 22 2e 76 66 73 6c 69 73  FS\n".  ".vfslis
19820 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
19830 4c 69 73 74 20 61 6c 6c 20 61 76 61 69 6c 61 62  List all availab
19840 6c 65 20 56 46 53 65 73 5c 6e 22 0a 20 20 22 2e  le VFSes\n".  ".
19850 76 66 73 6e 61 6d 65 20 3f 41 55 58 3f 20 20 20  vfsname ?AUX?   
19860 20 20 20 20 20 20 50 72 69 6e 74 20 74 68 65 20        Print the 
19870 6e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20  name of the VFS 
19880 73 74 61 63 6b 5c 6e 22 0a 20 20 22 2e 77 69 64  stack\n".  ".wid
19890 74 68 20 4e 55 4d 31 20 4e 55 4d 32 20 2e 2e 2e  th NUM1 NUM2 ...
198a0 20 20 20 53 65 74 20 63 6f 6c 75 6d 6e 20 77 69     Set column wi
198b0 64 74 68 73 20 66 6f 72 20 5c 22 63 6f 6c 75 6d  dths for \"colum
198c0 6e 5c 22 20 6d 6f 64 65 5c 6e 22 0a 20 20 22 20  n\" mode\n".  " 
198d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
198e0 20 20 20 20 20 20 20 20 4e 65 67 61 74 69 76 65          Negative
198f0 20 76 61 6c 75 65 73 20 72 69 67 68 74 2d 6a 75   values right-ju
19900 73 74 69 66 79 5c 6e 22 0a 3b 0a 0a 23 69 66 20  stify\n".;..#if 
19910 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
19920 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 2f  NABLE_SESSION)./
19930 2a 0a 2a 2a 20 50 72 69 6e 74 20 68 65 6c 70 20  *.** Print help 
19940 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
19950 74 68 65 20 22 2e 73 65 73 73 69 6f 6e 73 22 20  the ".sessions" 
19960 63 6f 6d 6d 61 6e 64 0a 2a 2f 0a 76 6f 69 64 20  command.*/.void 
19970 73 65 73 73 69 6f 6e 5f 68 65 6c 70 28 53 68 65  session_help(She
19980 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 72  llState *p){.  r
19990 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
199a0 2c 0a 20 20 20 20 22 2e 73 65 73 73 69 6f 6e 20  ,.    ".session 
199b0 3f 4e 41 4d 45 3f 20 53 55 42 43 4f 4d 4d 41 4e  ?NAME? SUBCOMMAN
199c0 44 20 3f 41 52 47 53 2e 2e 2e 3f 5c 6e 22 0a 20  D ?ARGS...?\n". 
199d0 20 20 20 22 49 66 20 3f 4e 41 4d 45 3f 20 69 73     "If ?NAME? is
199e0 20 6f 6d 69 74 74 65 64 2c 20 74 68 65 20 66 69   omitted, the fi
199f0 72 73 74 20 64 65 66 69 6e 65 64 20 73 65 73 73  rst defined sess
19a00 69 6f 6e 20 69 73 20 75 73 65 64 2e 5c 6e 22 0a  ion is used.\n".
19a10 20 20 20 20 22 53 75 62 63 6f 6d 6d 61 6e 64 73      "Subcommands
19a20 3a 5c 6e 22 0a 20 20 20 20 22 20 20 20 61 74 74  :\n".    "   att
19a30 61 63 68 20 54 41 42 4c 45 20 20 20 20 20 20 20  ach TABLE       
19a40 20 20 20 20 20 20 41 74 74 61 63 68 20 54 41 42        Attach TAB
19a50 4c 45 5c 6e 22 0a 20 20 20 20 22 20 20 20 63 68  LE\n".    "   ch
19a60 61 6e 67 65 73 65 74 20 46 49 4c 45 20 20 20 20  angeset FILE    
19a70 20 20 20 20 20 20 20 57 72 69 74 65 20 61 20 63         Write a c
19a80 68 61 6e 67 65 73 65 74 20 69 6e 74 6f 20 46 49  hangeset into FI
19a90 4c 45 5c 6e 22 0a 20 20 20 20 22 20 20 20 63 6c  LE\n".    "   cl
19aa0 6f 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ose             
19ab0 20 20 20 20 20 20 20 43 6c 6f 73 65 20 6f 6e 65         Close one
19ac0 20 73 65 73 73 69 6f 6e 5c 6e 22 0a 20 20 20 20   session\n".    
19ad0 22 20 20 20 65 6e 61 62 6c 65 20 3f 42 4f 4f 4c  "   enable ?BOOL
19ae0 45 41 4e 3f 20 20 20 20 20 20 20 20 20 53 65 74  EAN?         Set
19af0 20 6f 72 20 71 75 65 72 79 20 74 68 65 20 65 6e   or query the en
19b00 61 62 6c 65 20 62 69 74 5c 6e 22 0a 20 20 20 20  able bit\n".    
19b10 22 20 20 20 66 69 6c 74 65 72 20 47 4c 4f 42 2e  "   filter GLOB.
19b20 2e 2e 20 20 20 20 20 20 20 20 20 20 20 52 65 6a  ..           Rej
19b30 65 63 74 20 74 61 62 6c 65 73 20 6d 61 74 63 68  ect tables match
19b40 69 6e 67 20 47 4c 4f 42 73 5c 6e 22 0a 20 20 20  ing GLOBs\n".   
19b50 20 22 20 20 20 69 6e 64 69 72 65 63 74 20 3f 42   "   indirect ?B
19b60 4f 4f 4c 45 41 4e 3f 20 20 20 20 20 20 20 4d 61  OOLEAN?       Ma
19b70 72 6b 20 6f 72 20 71 75 65 72 79 20 74 68 65 20  rk or query the 
19b80 69 6e 64 69 72 65 63 74 20 73 74 61 74 75 73 5c  indirect status\
19b90 6e 22 0a 20 20 20 20 22 20 20 20 69 73 65 6d 70  n".    "   isemp
19ba0 74 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ty              
19bb0 20 20 20 20 51 75 65 72 79 20 77 68 65 74 68 65      Query whethe
19bc0 72 20 74 68 65 20 73 65 73 73 69 6f 6e 20 69 73  r the session is
19bd0 20 65 6d 70 74 79 5c 6e 22 0a 20 20 20 20 22 20   empty\n".    " 
19be0 20 20 6c 69 73 74 20 20 20 20 20 20 20 20 20 20    list          
19bf0 20 20 20 20 20 20 20 20 20 20 20 4c 69 73 74 20             List 
19c00 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 73  currently open s
19c10 65 73 73 69 6f 6e 20 6e 61 6d 65 73 5c 6e 22 0a  ession names\n".
19c20 20 20 20 20 22 20 20 20 6f 70 65 6e 20 44 42 20      "   open DB 
19c30 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20 20 20  NAME            
19c40 20 4f 70 65 6e 20 61 20 6e 65 77 20 73 65 73 73   Open a new sess
19c50 69 6f 6e 20 6f 6e 20 44 42 5c 6e 22 0a 20 20 20  ion on DB\n".   
19c60 20 22 20 20 20 70 61 74 63 68 73 65 74 20 46 49   "   patchset FI
19c70 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 57 72  LE            Wr
19c80 69 74 65 20 61 20 70 61 74 63 68 73 65 74 20 69  ite a patchset i
19c90 6e 74 6f 20 46 49 4c 45 5c 6e 22 0a 20 20 29 3b  nto FILE\n".  );
19ca0 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 20 46  .}.#endif.../* F
19cb0 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
19cc0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70   */.static int p
19cd0 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 53 68 65  rocess_input(She
19ce0 6c 6c 53 74 61 74 65 20 2a 70 2c 20 46 49 4c 45  llState *p, FILE
19cf0 20 2a 69 6e 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65   *in);../*.** Re
19d00 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ad the content o
19d10 66 20 66 69 6c 65 20 7a 4e 61 6d 65 20 69 6e 74  f file zName int
19d20 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
19d30 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
19d40 61 6c 6c 6f 63 36 34 28 29 0a 2a 2a 20 61 6e 64  alloc64().** and
19d50 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
19d60 72 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 2e  r to the buffer.
19d70 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   The caller is r
19d80 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66  esponsible for f
19d90 72 65 65 69 6e 67 0a 2a 2a 20 74 68 65 20 6d 65  reeing.** the me
19da0 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  mory..**.** If p
19db0 61 72 61 6d 65 74 65 72 20 70 6e 42 79 74 65 20  arameter pnByte 
19dc0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 28 2a 70  is not NULL, (*p
19dd0 6e 42 79 74 65 29 20 69 73 20 73 65 74 20 74 6f  nByte) is set to
19de0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
19df0 79 74 65 73 0a 2a 2a 20 72 65 61 64 2e 0a 2a 2a  ytes.** read..**
19e00 0a 2a 2a 20 46 6f 72 20 63 6f 6e 76 65 6e 69 65  .** For convenie
19e10 6e 63 65 2c 20 61 20 6e 75 6c 2d 74 65 72 6d 69  nce, a nul-termi
19e20 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20 61 6c  nator byte is al
19e30 77 61 79 73 20 61 70 70 65 6e 64 65 64 20 74 6f  ways appended to
19e40 20 74 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a   the data read.*
19e50 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * from the file 
19e60 62 65 66 6f 72 65 20 74 68 65 20 62 75 66 66 65  before the buffe
19e70 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54  r is returned. T
19e80 68 69 73 20 62 79 74 65 20 69 73 20 6e 6f 74 20  his byte is not 
19e90 69 6e 63 6c 75 64 65 64 20 69 6e 0a 2a 2a 20 74  included in.** t
19ea0 68 65 20 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f  he final value o
19eb0 66 20 28 2a 70 6e 42 79 74 65 29 2c 20 69 66 20  f (*pnByte), if 
19ec0 61 70 70 6c 69 63 61 62 6c 65 2e 0a 2a 2a 0a 2a  applicable..**.*
19ed0 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  * NULL is return
19ee0 65 64 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20  ed if any error 
19ef0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 20  is encountered. 
19f00 54 68 65 20 66 69 6e 61 6c 20 76 61 6c 75 65 20  The final value 
19f10 6f 66 20 2a 70 6e 42 79 74 65 0a 2a 2a 20 69 73  of *pnByte.** is
19f20 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68   undefined in th
19f30 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  is case..*/.stat
19f40 69 63 20 63 68 61 72 20 2a 72 65 61 64 46 69 6c  ic char *readFil
19f50 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  e(const char *zN
19f60 61 6d 65 2c 20 69 6e 74 20 2a 70 6e 42 79 74 65  ame, int *pnByte
19f70 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 20 3d 20  ){.  FILE *in = 
19f80 66 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 22 72 62  fopen(zName, "rb
19f90 22 29 3b 0a 20 20 6c 6f 6e 67 20 6e 49 6e 3b 0a  ");.  long nIn;.
19fa0 20 20 73 69 7a 65 5f 74 20 6e 52 65 61 64 3b 0a    size_t nRead;.
19fb0 20 20 63 68 61 72 20 2a 70 42 75 66 3b 0a 20 20    char *pBuf;.  
19fc0 69 66 28 20 69 6e 3d 3d 30 20 29 20 72 65 74 75  if( in==0 ) retu
19fd0 72 6e 20 30 3b 0a 20 20 66 73 65 65 6b 28 69 6e  rn 0;.  fseek(in
19fe0 2c 20 30 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a  , 0, SEEK_END);.
19ff0 20 20 6e 49 6e 20 3d 20 66 74 65 6c 6c 28 69 6e    nIn = ftell(in
1a000 29 3b 0a 20 20 72 65 77 69 6e 64 28 69 6e 29 3b  );.  rewind(in);
1a010 0a 20 20 70 42 75 66 20 3d 20 73 71 6c 69 74 65  .  pBuf = sqlite
1a020 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e 49 6e 2b  3_malloc64( nIn+
1a030 31 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66 3d  1 );.  if( pBuf=
1a040 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
1a050 20 6e 52 65 61 64 20 3d 20 66 72 65 61 64 28 70   nRead = fread(p
1a060 42 75 66 2c 20 6e 49 6e 2c 20 31 2c 20 69 6e 29  Buf, nIn, 1, in)
1a070 3b 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a  ;.  fclose(in);.
1a080 20 20 69 66 28 20 6e 52 65 61 64 21 3d 31 20 29    if( nRead!=1 )
1a090 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
1a0a0 65 65 28 70 42 75 66 29 3b 0a 20 20 20 20 72 65  ee(pBuf);.    re
1a0b0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 42  turn 0;.  }.  pB
1a0c0 75 66 5b 6e 49 6e 5d 20 3d 20 30 3b 0a 20 20 69  uf[nIn] = 0;.  i
1a0d0 66 28 20 70 6e 42 79 74 65 20 29 20 2a 70 6e 42  f( pnByte ) *pnB
1a0e0 79 74 65 20 3d 20 6e 49 6e 3b 0a 20 20 72 65 74  yte = nIn;.  ret
1a0f0 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 23 69 66  urn pBuf;.}..#if
1a100 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1a110 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a  ENABLE_SESSION).
1a120 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 73 69  /*.** Close a si
1a130 6e 67 6c 65 20 4f 70 65 6e 53 65 73 73 69 6f 6e  ngle OpenSession
1a140 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 6c 65   object and rele
1a150 61 73 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 61  ase all of its a
1a160 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 72 65 73  ssociated.** res
1a170 6f 75 72 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ources..*/.stati
1a180 63 20 76 6f 69 64 20 73 65 73 73 69 6f 6e 5f 63  c void session_c
1a190 6c 6f 73 65 28 4f 70 65 6e 53 65 73 73 69 6f 6e  lose(OpenSession
1a1a0 20 2a 70 53 65 73 73 69 6f 6e 29 7b 0a 20 20 69   *pSession){.  i
1a1b0 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 73  nt i;.  sqlite3s
1a1c0 65 73 73 69 6f 6e 5f 64 65 6c 65 74 65 28 70 53  ession_delete(pS
1a1d0 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20 20 73 71  ession->p);.  sq
1a1e0 6c 69 74 65 33 5f 66 72 65 65 28 70 53 65 73 73  lite3_free(pSess
1a1f0 69 6f 6e 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 66  ion->zName);.  f
1a200 6f 72 28 69 3d 30 3b 20 69 3c 70 53 65 73 73 69  or(i=0; i<pSessi
1a210 6f 6e 2d 3e 6e 46 69 6c 74 65 72 3b 20 69 2b 2b  on->nFilter; i++
1a220 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
1a230 72 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a  ree(pSession->az
1a240 46 69 6c 74 65 72 5b 69 5d 29 3b 0a 20 20 7d 0a  Filter[i]);.  }.
1a250 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
1a260 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65  Session->azFilte
1a270 72 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 53 65  r);.  memset(pSe
1a280 73 73 69 6f 6e 2c 20 30 2c 20 73 69 7a 65 6f 66  ssion, 0, sizeof
1a290 28 4f 70 65 6e 53 65 73 73 69 6f 6e 29 29 3b 0a  (OpenSession));.
1a2a0 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
1a2b0 43 6c 6f 73 65 20 61 6c 6c 20 4f 70 65 6e 53 65  Close all OpenSe
1a2c0 73 73 69 6f 6e 20 6f 62 6a 65 63 74 73 20 61 6e  ssion objects an
1a2d0 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 61 73  d release all as
1a2e0 73 6f 63 69 61 74 65 64 20 72 65 73 6f 75 72 63  sociated resourc
1a2f0 65 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  es..*/.#if defin
1a300 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
1a310 5f 53 45 53 53 49 4f 4e 29 0a 73 74 61 74 69 63  _SESSION).static
1a320 20 76 6f 69 64 20 73 65 73 73 69 6f 6e 5f 63 6c   void session_cl
1a330 6f 73 65 5f 61 6c 6c 28 53 68 65 6c 6c 53 74 61  ose_all(ShellSta
1a340 74 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  te *p){.  int i;
1a350 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
1a360 3e 6e 53 65 73 73 69 6f 6e 3b 20 69 2b 2b 29 7b  >nSession; i++){
1a370 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 63 6c 6f  .    session_clo
1a380 73 65 28 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b  se(&p->aSession[
1a390 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 53  i]);.  }.  p->nS
1a3a0 65 73 73 69 6f 6e 20 3d 20 30 3b 0a 7d 0a 23 65  ession = 0;.}.#e
1a3b0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 65 73  lse.# define ses
1a3c0 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c 6c 28 58  sion_close_all(X
1a3d0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
1a3e0 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
1a3f0 66 20 74 68 65 20 78 46 69 6c 74 65 72 20 66 75  f the xFilter fu
1a400 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6e 20 6f 70  nction for an op
1a410 65 6e 20 73 65 73 73 69 6f 6e 2e 20 20 4f 6d 69  en session.  Omi
1a420 74 0a 2a 2a 20 61 6e 79 20 74 61 62 6c 65 73 20  t.** any tables 
1a430 6e 61 6d 65 64 20 62 79 20 22 2e 73 65 73 73 69  named by ".sessi
1a440 6f 6e 20 66 69 6c 74 65 72 22 20 62 75 74 20 6c  on filter" but l
1a450 65 74 20 61 6c 6c 20 6f 74 68 65 72 20 74 61 62  et all other tab
1a460 6c 65 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 23  le through..*/.#
1a470 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
1a480 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e  E_ENABLE_SESSION
1a490 29 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 73  ).static int ses
1a4a0 73 69 6f 6e 5f 66 69 6c 74 65 72 28 76 6f 69 64  sion_filter(void
1a4b0 20 2a 70 43 74 78 2c 20 63 6f 6e 73 74 20 63 68   *pCtx, const ch
1a4c0 61 72 20 2a 7a 54 61 62 29 7b 0a 20 20 4f 70 65  ar *zTab){.  Ope
1a4d0 6e 53 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69  nSession *pSessi
1a4e0 6f 6e 20 3d 20 28 4f 70 65 6e 53 65 73 73 69 6f  on = (OpenSessio
1a4f0 6e 2a 29 70 43 74 78 3b 0a 20 20 69 6e 74 20 69  n*)pCtx;.  int i
1a500 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
1a510 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72  Session->nFilter
1a520 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
1a530 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28  sqlite3_strglob(
1a540 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74  pSession->azFilt
1a550 65 72 5b 69 5d 2c 20 7a 54 61 62 29 3d 3d 30 20  er[i], zTab)==0 
1a560 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
1a570 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
1a580 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20  ndif../*.** Try 
1a590 74 6f 20 64 65 64 75 63 65 20 74 68 65 20 74 79  to deduce the ty
1a5a0 70 65 20 6f 66 20 66 69 6c 65 20 66 6f 72 20 7a  pe of file for z
1a5b0 4e 61 6d 65 20 62 61 73 65 64 20 6f 6e 20 69 74  Name based on it
1a5c0 73 20 63 6f 6e 74 65 6e 74 2e 20 20 52 65 74 75  s content.  Retu
1a5d0 72 6e 0a 2a 2a 20 6f 6e 65 20 6f 66 20 74 68 65  rn.** one of the
1a5e0 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 2a 20 63 6f   SHELL_OPEN_* co
1a5f0 6e 73 74 61 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49  nstants..**.** I
1a600 66 20 74 68 65 20 66 69 6c 65 20 64 6f 65 73 20  f the file does 
1a610 6e 6f 74 20 65 78 69 73 74 20 6f 72 20 69 73 20  not exist or is 
1a620 65 6d 70 74 79 20 62 75 74 20 69 74 73 20 6e 61  empty but its na
1a630 6d 65 20 6c 6f 6f 6b 73 20 6c 69 6b 65 20 61 20  me looks like a 
1a640 5a 49 50 0a 2a 2a 20 61 72 63 68 69 76 65 20 61  ZIP.** archive a
1a650 6e 64 20 74 68 65 20 64 66 6c 74 5a 69 70 20 66  nd the dfltZip f
1a660 6c 61 67 20 69 73 20 74 72 75 65 2c 20 74 68 65  lag is true, the
1a670 6e 20 61 73 73 75 6d 65 20 69 74 20 69 73 20 61  n assume it is a
1a680 20 5a 49 50 20 61 72 63 68 69 76 65 2e 0a 2a 2a   ZIP archive..**
1a690 20 4f 74 68 65 72 77 69 73 65 2c 20 61 73 73 75   Otherwise, assu
1a6a0 6d 65 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 64  me an ordinary d
1a6b0 61 74 61 62 61 73 65 20 72 65 67 61 72 64 6c 65  atabase regardle
1a6c0 73 73 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61  ss of the filena
1a6d0 6d 65 20 69 66 0a 2a 2a 20 74 68 65 20 74 79 70  me if.** the typ
1a6e0 65 20 63 61 6e 6e 6f 74 20 62 65 20 64 65 74 65  e cannot be dete
1a6f0 72 6d 69 6e 65 64 20 66 72 6f 6d 20 63 6f 6e 74  rmined from cont
1a700 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ent..*/.static i
1a710 6e 74 20 64 65 64 75 63 65 44 61 74 61 62 61 73  nt deduceDatabas
1a720 65 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72  eType(const char
1a730 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 64 66 6c   *zName, int dfl
1a740 74 5a 69 70 29 7b 0a 20 20 46 49 4c 45 20 2a 66  tZip){.  FILE *f
1a750 20 3d 20 66 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20   = fopen(zName, 
1a760 22 72 62 22 29 3b 0a 20 20 73 69 7a 65 5f 74 20  "rb");.  size_t 
1a770 6e 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 48  n;.  int rc = SH
1a780 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43 3b  ELL_OPEN_UNSPEC;
1a790 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30  .  char zBuf[100
1a7a0 5d 3b 0a 20 20 69 66 28 20 66 3d 3d 30 20 29 7b  ];.  if( f==0 ){
1a7b0 0a 20 20 20 20 69 66 28 20 64 66 6c 74 5a 69 70  .    if( dfltZip
1a7c0 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6c   && sqlite3_strl
1a7d0 69 6b 65 28 22 25 2e 7a 69 70 22 2c 7a 4e 61 6d  ike("%.zip",zNam
1a7e0 65 2c 30 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  e,0)==0 ) return
1a7f0 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46   SHELL_OPEN_ZIPF
1a800 49 4c 45 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  ILE;.    return 
1a810 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52 4d 41  SHELL_OPEN_NORMA
1a820 4c 3b 0a 20 20 7d 0a 20 20 66 73 65 65 6b 28 66  L;.  }.  fseek(f
1a830 2c 20 2d 32 35 2c 20 53 45 45 4b 5f 45 4e 44 29  , -25, SEEK_END)
1a840 3b 0a 20 20 6e 20 3d 20 66 72 65 61 64 28 7a 42  ;.  n = fread(zB
1a850 75 66 2c 20 32 35 2c 20 31 2c 20 66 29 3b 0a 20  uf, 25, 1, f);. 
1a860 20 69 66 28 20 6e 3d 3d 31 20 26 26 20 6d 65 6d   if( n==1 && mem
1a870 63 6d 70 28 7a 42 75 66 2c 20 22 53 74 61 72 74  cmp(zBuf, "Start
1a880 2d 4f 66 2d 53 51 4c 69 74 65 33 2d 22 2c 20 31  -Of-SQLite3-", 1
1a890 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  7)==0 ){.    rc 
1a8a0 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50  = SHELL_OPEN_APP
1a8b0 45 4e 44 56 46 53 3b 0a 20 20 7d 65 6c 73 65 7b  ENDVFS;.  }else{
1a8c0 0a 20 20 20 20 66 73 65 65 6b 28 66 2c 20 2d 32  .    fseek(f, -2
1a8d0 32 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20  2, SEEK_END);.  
1a8e0 20 20 6e 20 3d 20 66 72 65 61 64 28 7a 42 75 66    n = fread(zBuf
1a8f0 2c 20 32 32 2c 20 31 2c 20 66 29 3b 0a 20 20 20  , 22, 1, f);.   
1a900 20 69 66 28 20 6e 3d 3d 31 20 26 26 20 7a 42 75   if( n==1 && zBu
1a910 66 5b 30 5d 3d 3d 30 78 35 30 20 26 26 20 7a 42  f[0]==0x50 && zB
1a920 75 66 5b 31 5d 3d 3d 30 78 34 62 20 26 26 20 7a  uf[1]==0x4b && z
1a930 42 75 66 5b 32 5d 3d 3d 30 78 30 35 0a 20 20 20  Buf[2]==0x05.   
1a940 20 20 20 20 26 26 20 7a 42 75 66 5b 33 5d 3d 3d      && zBuf[3]==
1a950 30 78 30 36 20 29 7b 0a 20 20 20 20 20 20 72 63  0x06 ){.      rc
1a960 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49   = SHELL_OPEN_ZI
1a970 50 46 49 4c 45 3b 0a 20 20 20 20 7d 65 6c 73 65  PFILE;.    }else
1a980 20 69 66 28 20 6e 3d 3d 30 20 26 26 20 64 66 6c   if( n==0 && dfl
1a990 74 5a 69 70 20 26 26 20 73 71 6c 69 74 65 33 5f  tZip && sqlite3_
1a9a0 73 74 72 6c 69 6b 65 28 22 25 2e 7a 69 70 22 2c  strlike("%.zip",
1a9b0 7a 4e 61 6d 65 2c 30 29 3d 3d 30 20 29 7b 0a 20  zName,0)==0 ){. 
1a9c0 20 20 20 20 20 72 65 74 75 72 6e 20 53 48 45 4c       return SHEL
1a9d0 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49 4c 45 3b 0a  L_OPEN_ZIPFILE;.
1a9e0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 63 6c 6f      }.  }.  fclo
1a9f0 73 65 28 66 29 3b 0a 20 20 72 65 74 75 72 6e 20  se(f);.  return 
1aa00 72 63 3b 20 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d  rc;  .}../*.** M
1aa10 61 6b 65 20 73 75 72 65 20 74 68 65 20 64 61 74  ake sure the dat
1aa20 61 62 61 73 65 20 69 73 20 6f 70 65 6e 2e 20 20  abase is open.  
1aa30 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74 68  If it is not, th
1aa40 65 6e 20 6f 70 65 6e 20 69 74 2e 20 20 49 66 0a  en open it.  If.
1aa50 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ** the database 
1aa60 66 61 69 6c 73 20 74 6f 20 6f 70 65 6e 2c 20 70  fails to open, p
1aa70 72 69 6e 74 20 61 6e 20 65 72 72 6f 72 20 6d 65  rint an error me
1aa80 73 73 61 67 65 20 61 6e 64 20 65 78 69 74 2e 0a  ssage and exit..
1aa90 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f  */.static void o
1aaa0 70 65 6e 5f 64 62 28 53 68 65 6c 6c 53 74 61 74  pen_db(ShellStat
1aab0 65 20 2a 70 2c 20 69 6e 74 20 6b 65 65 70 41 6c  e *p, int keepAl
1aac0 69 76 65 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64  ive){.  if( p->d
1aad0 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  b==0 ){.    sqli
1aae0 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29  te3_initialize()
1aaf0 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65  ;.    if( p->ope
1ab00 6e 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45  nMode==SHELL_OPE
1ab10 4e 5f 55 4e 53 50 45 43 20 26 26 20 61 63 63 65  N_UNSPEC && acce
1ab20 73 73 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d  ss(p->zDbFilenam
1ab30 65 2c 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  e,0)==0 ){.     
1ab40 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20 28   p->openMode = (
1ab50 75 38 29 64 65 64 75 63 65 44 61 74 61 62 61 73  u8)deduceDatabas
1ab60 65 54 79 70 65 28 70 2d 3e 7a 44 62 46 69 6c 65  eType(p->zDbFile
1ab70 6e 61 6d 65 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  name, 0);.    }.
1ab80 20 20 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f      switch( p->o
1ab90 70 65 6e 4d 6f 64 65 20 29 7b 0a 20 20 20 20 20  penMode ){.     
1aba0 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e   case SHELL_OPEN
1abb0 5f 41 50 50 45 4e 44 56 46 53 3a 20 7b 0a 20 20  _APPENDVFS: {.  
1abc0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70        sqlite3_op
1abd0 65 6e 5f 76 32 28 70 2d 3e 7a 44 62 46 69 6c 65  en_v2(p->zDbFile
1abe0 6e 61 6d 65 2c 20 26 70 2d 3e 64 62 2c 20 0a 20  name, &p->db, . 
1abf0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
1ac00 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
1ac10 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
1ac20 54 45 2c 20 22 61 70 6e 64 76 66 73 22 29 3b 0a  TE, "apndvfs");.
1ac30 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1ac40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63 61 73       }.      cas
1ac50 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50  e SHELL_OPEN_ZIP
1ac60 46 49 4c 45 3a 20 7b 0a 20 20 20 20 20 20 20 20  FILE: {.        
1ac70 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 22 3a 6d  sqlite3_open(":m
1ac80 65 6d 6f 72 79 3a 22 2c 20 26 70 2d 3e 64 62 29  emory:", &p->db)
1ac90 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1aca0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 63  .      }.      c
1acb0 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 52  ase SHELL_OPEN_R
1acc0 45 41 44 4f 4e 4c 59 3a 20 7b 0a 20 20 20 20 20  EADONLY: {.     
1acd0 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 5f     sqlite3_open_
1ace0 76 32 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d  v2(p->zDbFilenam
1acf0 65 2c 20 26 70 2d 3e 64 62 2c 20 53 51 4c 49 54  e, &p->db, SQLIT
1ad00 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 2c  E_OPEN_READONLY,
1ad10 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65   0);.        bre
1ad20 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
1ad30 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45    case SHELL_OPE
1ad40 4e 5f 55 4e 53 50 45 43 3a 0a 20 20 20 20 20 20  N_UNSPEC:.      
1ad50 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  case SHELL_OPEN_
1ad60 4e 4f 52 4d 41 4c 3a 20 7b 0a 20 20 20 20 20 20  NORMAL: {.      
1ad70 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 70    sqlite3_open(p
1ad80 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 26  ->zDbFilename, &
1ad90 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20  p->db);.        
1ada0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1adb0 20 20 20 7d 0a 20 20 20 20 67 6c 6f 62 61 6c 44     }.    globalD
1adc0 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20 69  b = p->db;.    i
1add0 66 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20 53  f( p->db==0 || S
1ade0 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74 65  QLITE_OK!=sqlite
1adf0 33 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29  3_errcode(p->db)
1ae00 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
1ae10 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72  rintf(stderr,"Er
1ae20 72 6f 72 3a 20 75 6e 61 62 6c 65 20 74 6f 20 6f  ror: unable to o
1ae30 70 65 6e 20 64 61 74 61 62 61 73 65 20 5c 22 25  pen database \"%
1ae40 73 5c 22 3a 20 25 73 5c 6e 22 2c 0a 20 20 20 20  s\": %s\n",.    
1ae50 20 20 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65        p->zDbFile
1ae60 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 5f 65 72  name, sqlite3_er
1ae70 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20  rmsg(p->db));.  
1ae80 20 20 20 20 69 66 28 20 6b 65 65 70 41 6c 69 76      if( keepAliv
1ae90 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20 20  e ) return;.    
1aea0 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d    exit(1);.    }
1aeb0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1aec0 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
1aed0 49 4f 4e 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ION.    sqlite3_
1aee0 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74 65  enable_load_exte
1aef0 6e 73 69 6f 6e 28 70 2d 3e 64 62 2c 20 31 29 3b  nsion(p->db, 1);
1af00 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69  .#endif.    sqli
1af10 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e 69 74 28  te3_fileio_init(
1af20 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  p->db, 0, 0);.  
1af30 20 20 73 71 6c 69 74 65 33 5f 73 68 61 74 68 72    sqlite3_shathr
1af40 65 65 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30  ee_init(p->db, 0
1af50 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
1af60 33 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 69 6e 69  3_completion_ini
1af70 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a  t(p->db, 0, 0);.
1af80 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48 41  #ifdef SQLITE_HA
1af90 56 45 5f 5a 4c 49 42 0a 20 20 20 20 73 71 6c 69  VE_ZLIB.    sqli
1afa0 74 65 33 5f 7a 69 70 66 69 6c 65 5f 69 6e 69 74  te3_zipfile_init
1afb0 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  (p->db, 0, 0);. 
1afc0 20 20 20 73 71 6c 69 74 65 33 5f 73 71 6c 61 72     sqlite3_sqlar
1afd0 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20  _init(p->db, 0, 
1afe0 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73  0);.#endif.    s
1aff0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
1b000 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22 73  nction(p->db, "s
1b010 68 65 6c 6c 5f 61 64 64 5f 73 63 68 65 6d 61 22  hell_add_schema"
1b020 2c 20 33 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 3, SQLITE_UTF8
1b030 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , 0,.           
1b040 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b050 20 73 68 65 6c 6c 41 64 64 53 63 68 65 6d 61 4e   shellAddSchemaN
1b060 61 6d 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ame, 0, 0);.    
1b070 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
1b080 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22  unction(p->db, "
1b090 73 68 65 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68  shell_module_sch
1b0a0 65 6d 61 22 2c 20 31 2c 20 53 51 4c 49 54 45 5f  ema", 1, SQLITE_
1b0b0 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20  UTF8, 0,.       
1b0c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b0d0 20 20 20 20 20 73 68 65 6c 6c 4d 6f 64 75 6c 65       shellModule
1b0e0 53 63 68 65 6d 61 2c 20 30 2c 20 30 29 3b 0a 20  Schema, 0, 0);. 
1b0f0 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
1b100 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62  e_function(p->db
1b110 2c 20 22 73 68 65 6c 6c 5f 70 75 74 73 6e 6c 22  , "shell_putsnl"
1b120 2c 20 31 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 1, SQLITE_UTF8
1b130 2c 20 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  , p,.           
1b140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b150 20 73 68 65 6c 6c 50 75 74 73 46 75 6e 63 2c 20   shellPutsFunc, 
1b160 30 2c 20 30 29 3b 0a 23 69 66 6e 64 65 66 20 53  0, 0);.#ifndef S
1b170 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59 53  QLITE_NOHAVE_SYS
1b180 54 45 4d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  TEM.    sqlite3_
1b190 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
1b1a0 70 2d 3e 64 62 2c 20 22 65 64 69 74 22 2c 20 31  p->db, "edit", 1
1b1b0 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
1b1c0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1b1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 64                ed
1b1e0 69 74 46 75 6e 63 2c 20 30 2c 20 30 29 3b 0a 20  itFunc, 0, 0);. 
1b1f0 20 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74     sqlite3_creat
1b200 65 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62  e_function(p->db
1b210 2c 20 22 65 64 69 74 22 2c 20 32 2c 20 53 51 4c  , "edit", 2, SQL
1b220 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20  ITE_UTF8, 0,.   
1b230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b240 20 20 20 20 20 20 20 20 20 65 64 69 74 46 75 6e           editFun
1b250 63 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66  c, 0, 0);.#endif
1b260 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e  .    if( p->open
1b270 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e  Mode==SHELL_OPEN
1b280 5f 5a 49 50 46 49 4c 45 20 29 7b 0a 20 20 20 20  _ZIPFILE ){.    
1b290 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73    char *zSql = s
1b2a0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
1b2b0 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
1b2c0 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 7a   VIRTUAL TABLE z
1b2d0 69 70 20 55 53 49 4e 47 20 7a 69 70 66 69 6c 65  ip USING zipfile
1b2e0 28 25 51 29 3b 22 2c 20 70 2d 3e 7a 44 62 46 69  (%Q);", p->zDbFi
1b2f0 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  lename);.      s
1b300 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
1b310 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30  b, zSql, 0, 0, 0
1b320 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
1b330 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
1b340 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 48 41   }.  }.}..#if HA
1b350 56 45 5f 52 45 41 44 4c 49 4e 45 20 7c 7c 20 48  VE_READLINE || H
1b360 41 56 45 5f 45 44 49 54 4c 49 4e 45 0a 2f 2a 0a  AVE_EDITLINE./*.
1b370 2a 2a 20 52 65 61 64 6c 69 6e 65 20 63 6f 6d 70  ** Readline comp
1b380 6c 65 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 73  letion callbacks
1b390 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
1b3a0 2a 72 65 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65  *readline_comple
1b3b0 74 69 6f 6e 5f 67 65 6e 65 72 61 74 6f 72 28 63  tion_generator(c
1b3c0 6f 6e 73 74 20 63 68 61 72 20 2a 74 65 78 74 2c  onst char *text,
1b3d0 20 69 6e 74 20 73 74 61 74 65 29 7b 0a 20 20 73   int state){.  s
1b3e0 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 74  tatic sqlite3_st
1b3f0 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
1b400 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 20 20 69   char *zRet;.  i
1b410 66 28 20 73 74 61 74 65 3d 3d 30 20 29 7b 0a 20  f( state==0 ){. 
1b420 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20     char *zSql;. 
1b430 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
1b440 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
1b450 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
1b460 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 44  printf("SELECT D
1b470 49 53 54 49 4e 43 54 20 63 61 6e 64 69 64 61 74  ISTINCT candidat
1b480 65 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  e COLLATE nocase
1b490 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
1b4a0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
1b4b0 46 52 4f 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e 28  FROM completion(
1b4c0 25 51 29 20 4f 52 44 45 52 20 42 59 20 31 22 2c  %Q) ORDER BY 1",
1b4d0 20 74 65 78 74 29 3b 0a 20 20 20 20 73 71 6c 69   text);.    sqli
1b4e0 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 67  te3_prepare_v2(g
1b4f0 6c 6f 62 61 6c 44 62 2c 20 7a 53 71 6c 2c 20 2d  lobalDb, zSql, -
1b500 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
1b510 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
1b520 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28  zSql);.  }.  if(
1b530 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
1b540 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
1b550 20 29 7b 0a 20 20 20 20 7a 52 65 74 20 3d 20 73   ){.    zRet = s
1b560 74 72 64 75 70 28 28 63 6f 6e 73 74 20 63 68 61  trdup((const cha
1b570 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
1b580 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29  n_text(pStmt, 0)
1b590 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
1b5a0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
1b5b0 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 53 74  (pStmt);.    pSt
1b5c0 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7a 52 65 74  mt = 0;.    zRet
1b5d0 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
1b5e0 72 6e 20 7a 52 65 74 3b 0a 7d 0a 73 74 61 74 69  rn zRet;.}.stati
1b5f0 63 20 63 68 61 72 20 2a 2a 72 65 61 64 6c 69 6e  c char **readlin
1b600 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 28 63 6f 6e  e_completion(con
1b610 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 2c 20  st char *zText, 
1b620 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20  int iStart, int 
1b630 69 45 6e 64 29 7b 0a 20 20 72 6c 5f 61 74 74 65  iEnd){.  rl_atte
1b640 6d 70 74 65 64 5f 63 6f 6d 70 6c 65 74 69 6f 6e  mpted_completion
1b650 5f 6f 76 65 72 20 3d 20 31 3b 0a 20 20 72 65 74  _over = 1;.  ret
1b660 75 72 6e 20 72 6c 5f 63 6f 6d 70 6c 65 74 69 6f  urn rl_completio
1b670 6e 5f 6d 61 74 63 68 65 73 28 7a 54 65 78 74 2c  n_matches(zText,
1b680 20 72 65 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65   readline_comple
1b690 74 69 6f 6e 5f 67 65 6e 65 72 61 74 6f 72 29 3b  tion_generator);
1b6a0 0a 7d 0a 0a 23 65 6c 69 66 20 48 41 56 45 5f 4c  .}..#elif HAVE_L
1b6b0 49 4e 45 4e 4f 49 53 45 0a 2f 2a 0a 2a 2a 20 4c  INENOISE./*.** L
1b6c0 69 6e 65 6e 6f 69 73 65 20 63 6f 6d 70 6c 65 74  inenoise complet
1b6d0 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 0a 2a 2f 0a  ion callback.*/.
1b6e0 73 74 61 74 69 63 20 76 6f 69 64 20 6c 69 6e 65  static void line
1b6f0 6e 6f 69 73 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e  noise_completion
1b700 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69  (const char *zLi
1b710 6e 65 2c 20 6c 69 6e 65 6e 6f 69 73 65 43 6f 6d  ne, linenoiseCom
1b720 70 6c 65 74 69 6f 6e 73 20 2a 6c 63 29 7b 0a 20  pletions *lc){. 
1b730 20 69 6e 74 20 6e 4c 69 6e 65 20 3d 20 73 74 72   int nLine = str
1b740 6c 65 6e 33 30 28 7a 4c 69 6e 65 29 3b 0a 20 20  len30(zLine);.  
1b750 69 6e 74 20 69 2c 20 69 53 74 61 72 74 3b 0a 20  int i, iStart;. 
1b760 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1b770 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  Stmt = 0;.  char
1b780 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20 7a   *zSql;.  char z
1b790 42 75 66 5b 31 30 30 30 5d 3b 0a 0a 20 20 69 66  Buf[1000];..  if
1b7a0 28 20 6e 4c 69 6e 65 3e 73 69 7a 65 6f 66 28 7a  ( nLine>sizeof(z
1b7b0 42 75 66 29 2d 33 30 20 29 20 72 65 74 75 72 6e  Buf)-30 ) return
1b7c0 3b 0a 20 20 69 66 28 20 7a 4c 69 6e 65 5b 30 5d  ;.  if( zLine[0]
1b7d0 3d 3d 27 2e 27 20 29 20 72 65 74 75 72 6e 3b 0a  =='.' ) return;.
1b7e0 20 20 66 6f 72 28 69 3d 6e 4c 69 6e 65 2d 31 3b    for(i=nLine-1;
1b7f0 20 69 3e 3d 30 20 26 26 20 28 69 73 61 6c 6e 75   i>=0 && (isalnu
1b800 6d 28 7a 4c 69 6e 65 5b 69 5d 29 20 7c 7c 20 7a  m(zLine[i]) || z
1b810 4c 69 6e 65 5b 69 5d 3d 3d 27 5f 27 29 3b 20 69  Line[i]=='_'); i
1b820 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3d 3d 6e  --){}.  if( i==n
1b830 4c 69 6e 65 2d 31 20 29 20 72 65 74 75 72 6e 3b  Line-1 ) return;
1b840 0a 20 20 69 53 74 61 72 74 20 3d 20 69 2b 31 3b  .  iStart = i+1;
1b850 0a 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20  .  memcpy(zBuf, 
1b860 7a 4c 69 6e 65 2c 20 69 53 74 61 72 74 29 3b 0a  zLine, iStart);.
1b870 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
1b880 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
1b890 20 44 49 53 54 49 4e 43 54 20 63 61 6e 64 69 64   DISTINCT candid
1b8a0 61 74 65 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61  ate COLLATE noca
1b8b0 73 65 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  se".            
1b8c0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
1b8d0 46 52 4f 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e 28  FROM completion(
1b8e0 25 51 2c 25 51 29 20 4f 52 44 45 52 20 42 59 20  %Q,%Q) ORDER BY 
1b8f0 31 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  1",.            
1b900 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 4c               &zL
1b910 69 6e 65 5b 69 53 74 61 72 74 5d 2c 20 7a 4c 69  ine[iStart], zLi
1b920 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70  ne);.  sqlite3_p
1b930 72 65 70 61 72 65 5f 76 32 28 67 6c 6f 62 61 6c  repare_v2(global
1b940 44 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  Db, zSql, -1, &p
1b950 53 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69  Stmt, 0);.  sqli
1b960 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
1b970 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 67    sqlite3_exec(g
1b980 6c 6f 62 61 6c 44 62 2c 20 22 50 52 41 47 4d 41  lobalDb, "PRAGMA
1b990 20 70 61 67 65 5f 63 6f 75 6e 74 22 2c 20 30 2c   page_count", 0,
1b9a0 20 30 2c 20 30 29 3b 20 2f 2a 20 4c 6f 61 64 20   0, 0); /* Load 
1b9b0 74 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20  the schema */.  
1b9c0 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73  while( sqlite3_s
1b9d0 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
1b9e0 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f  TE_ROW ){.    co
1b9f0 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 70 6c  nst char *zCompl
1ba00 65 74 69 6f 6e 20 3d 20 28 63 6f 6e 73 74 20 63  etion = (const c
1ba10 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
1ba20 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
1ba30 30 29 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6d  0);.    int nCom
1ba40 70 6c 65 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65  pletion = sqlite
1ba50 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
1ba60 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  Stmt, 0);.    if
1ba70 28 20 69 53 74 61 72 74 2b 6e 43 6f 6d 70 6c 65  ( iStart+nComple
1ba80 74 69 6f 6e 20 3c 20 73 69 7a 65 6f 66 28 7a 42  tion < sizeof(zB
1ba90 75 66 29 2d 31 20 29 7b 0a 20 20 20 20 20 20 6d  uf)-1 ){.      m
1baa0 65 6d 63 70 79 28 7a 42 75 66 2b 69 53 74 61 72  emcpy(zBuf+iStar
1bab0 74 2c 20 7a 43 6f 6d 70 6c 65 74 69 6f 6e 2c 20  t, zCompletion, 
1bac0 6e 43 6f 6d 70 6c 65 74 69 6f 6e 2b 31 29 3b 0a  nCompletion+1);.
1bad0 20 20 20 20 20 20 6c 69 6e 65 6e 6f 69 73 65 41        linenoiseA
1bae0 64 64 43 6f 6d 70 6c 65 74 69 6f 6e 28 6c 63 2c  ddCompletion(lc,
1baf0 20 7a 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20   zBuf);.    }.  
1bb00 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  }.  sqlite3_fina
1bb10 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 7d 0a 23  lize(pStmt);.}.#
1bb20 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  endif../*.** Do 
1bb30 43 2d 6c 61 6e 67 75 61 67 65 20 73 74 79 6c 65  C-language style
1bb40 20 64 65 71 75 6f 74 69 6e 67 2e 0a 2a 2a 0a 2a   dequoting..**.*
1bb50 2a 20 20 20 20 5c 61 20 20 20 20 2d 3e 20 61 6c  *    \a    -> al
1bb60 61 72 6d 0a 2a 2a 20 20 20 20 5c 62 20 20 20 20  arm.**    \b    
1bb70 2d 3e 20 62 61 63 6b 73 70 61 63 65 0a 2a 2a 20  -> backspace.** 
1bb80 20 20 20 5c 74 20 20 20 20 2d 3e 20 74 61 62 0a     \t    -> tab.
1bb90 2a 2a 20 20 20 20 5c 6e 20 20 20 20 2d 3e 20 6e  **    \n    -> n
1bba0 65 77 6c 69 6e 65 0a 2a 2a 20 20 20 20 5c 76 20  ewline.**    \v 
1bbb0 20 20 20 2d 3e 20 76 65 72 74 69 63 61 6c 20 74     -> vertical t
1bbc0 61 62 0a 2a 2a 20 20 20 20 5c 66 20 20 20 20 2d  ab.**    \f    -
1bbd0 3e 20 66 6f 72 6d 20 66 65 65 64 0a 2a 2a 20 20  > form feed.**  
1bbe0 20 20 5c 72 20 20 20 20 2d 3e 20 63 61 72 72 69    \r    -> carri
1bbf0 61 67 65 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20  age return.**   
1bc00 20 5c 73 20 20 20 20 2d 3e 20 73 70 61 63 65 0a   \s    -> space.
1bc10 2a 2a 20 20 20 20 5c 22 20 20 20 20 2d 3e 20 22  **    \"    -> "
1bc20 0a 2a 2a 20 20 20 20 5c 27 20 20 20 20 2d 3e 20  .**    \'    -> 
1bc30 27 0a 2a 2a 20 20 20 20 5c 5c 20 20 20 20 2d 3e  '.**    \\    ->
1bc40 20 62 61 63 6b 73 6c 61 73 68 0a 2a 2a 20 20 20   backslash.**   
1bc50 20 5c 4e 4e 4e 20 20 2d 3e 20 61 73 63 69 69 20   \NNN  -> ascii 
1bc60 63 68 61 72 61 63 74 65 72 20 4e 4e 4e 20 69 6e  character NNN in
1bc70 20 6f 63 74 61 6c 0a 2a 2f 0a 73 74 61 74 69 63   octal.*/.static
1bc80 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 5f 62 61   void resolve_ba
1bc90 63 6b 73 6c 61 73 68 65 73 28 63 68 61 72 20 2a  ckslashes(char *
1bca0 7a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  z){.  int i, j;.
1bcb0 20 20 63 68 61 72 20 63 3b 0a 20 20 77 68 69 6c    char c;.  whil
1bcc0 65 28 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 5c 5c  e( *z && *z!='\\
1bcd0 27 20 29 20 7a 2b 2b 3b 0a 20 20 66 6f 72 28 69  ' ) z++;.  for(i
1bce0 3d 6a 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29  =j=0; (c = z[i])
1bcf0 21 3d 30 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a  !=0; i++, j++){.
1bd00 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20      if( c=='\\' 
1bd10 26 26 20 7a 5b 69 2b 31 5d 21 3d 30 20 29 7b 0a  && z[i+1]!=0 ){.
1bd20 20 20 20 20 20 20 63 20 3d 20 7a 5b 2b 2b 69 5d        c = z[++i]
1bd30 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  ;.      if( c=='
1bd40 61 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  a' ){.        c 
1bd50 3d 20 27 5c 61 27 3b 0a 20 20 20 20 20 20 7d 65  = '\a';.      }e
1bd60 6c 73 65 20 69 66 28 20 63 3d 3d 27 62 27 20 29  lse if( c=='b' )
1bd70 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c  {.        c = '\
1bd80 62 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  b';.      }else 
1bd90 69 66 28 20 63 3d 3d 27 74 27 20 29 7b 0a 20 20  if( c=='t' ){.  
1bda0 20 20 20 20 20 20 63 20 3d 20 27 5c 74 27 3b 0a        c = '\t';.
1bdb0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1bdc0 63 3d 3d 27 6e 27 20 29 7b 0a 20 20 20 20 20 20  c=='n' ){.      
1bdd0 20 20 63 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20    c = '\n';.    
1bde0 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
1bdf0 76 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  v' ){.        c 
1be00 3d 20 27 5c 76 27 3b 0a 20 20 20 20 20 20 7d 65  = '\v';.      }e
1be10 6c 73 65 20 69 66 28 20 63 3d 3d 27 66 27 20 29  lse if( c=='f' )
1be20 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c  {.        c = '\
1be30 66 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  f';.      }else 
1be40 69 66 28 20 63 3d 3d 27 72 27 20 29 7b 0a 20 20  if( c=='r' ){.  
1be50 20 20 20 20 20 20 63 20 3d 20 27 5c 72 27 3b 0a        c = '\r';.
1be60 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1be70 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20  c=='"' ){.      
1be80 20 20 63 20 3d 20 27 22 27 3b 0a 20 20 20 20 20    c = '"';.     
1be90 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c   }else if( c=='\
1bea0 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  '' ){.        c 
1beb0 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 7d 65  = '\'';.      }e
1bec0 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20  lse if( c=='\\' 
1bed0 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27  ){.        c = '
1bee0 5c 5c 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  \\';.      }else
1bef0 20 69 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63   if( c>='0' && c
1bf00 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20 20 20  <='7' ){.       
1bf10 20 63 20 2d 3d 20 27 30 27 3b 0a 20 20 20 20 20   c -= '0';.     
1bf20 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27     if( z[i+1]>='
1bf30 30 27 20 26 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37  0' && z[i+1]<='7
1bf40 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ' ){.          i
1bf50 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20  ++;.          c 
1bf60 3d 20 28 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20  = (c<<3) + z[i] 
1bf70 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 20  - '0';.         
1bf80 20 69 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27   if( z[i+1]>='0'
1bf90 20 26 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20   && z[i+1]<='7' 
1bfa0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
1bfb0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
1bfc0 63 20 3d 20 28 63 3c 3c 33 29 20 2b 20 7a 5b 69  c = (c<<3) + z[i
1bfd0 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20  ] - '0';.       
1bfe0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
1bff0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1c000 20 7a 5b 6a 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20   z[j] = c;.  }. 
1c010 20 69 66 28 20 6a 3c 69 20 29 20 7a 5b 6a 5d 20   if( j<i ) z[j] 
1c020 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e  = 0;.}../*.** In
1c030 74 65 72 70 72 65 74 20 7a 41 72 67 20 61 73 20  terpret zArg as 
1c040 65 69 74 68 65 72 20 61 6e 20 69 6e 74 65 67 65  either an intege
1c050 72 20 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 76  r or a boolean v
1c060 61 6c 75 65 2e 20 20 52 65 74 75 72 6e 20 31 20  alue.  Return 1 
1c070 6f 72 20 30 0a 2a 2a 20 66 6f 72 20 54 52 55 45  or 0.** for TRUE
1c080 20 61 6e 64 20 46 41 4c 53 45 2e 20 20 52 65 74   and FALSE.  Ret
1c090 75 72 6e 20 74 68 65 20 69 6e 74 65 67 65 72 20  urn the integer 
1c0a0 76 61 6c 75 65 20 69 66 20 61 70 70 72 6f 70 72  value if appropr
1c0b0 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  iate..*/.static 
1c0c0 69 6e 74 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  int booleanValue
1c0d0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72  (const char *zAr
1c0e0 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  g){.  int i;.  i
1c0f0 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 30 27 20  f( zArg[0]=='0' 
1c100 26 26 20 7a 41 72 67 5b 31 5d 3d 3d 27 78 27 20  && zArg[1]=='x' 
1c110 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 32 3b 20  ){.    for(i=2; 
1c120 68 65 78 44 69 67 69 74 56 61 6c 75 65 28 7a 41  hexDigitValue(zA
1c130 72 67 5b 69 5d 29 3e 3d 30 3b 20 69 2b 2b 29 7b  rg[i])>=0; i++){
1c140 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66  }.  }else{.    f
1c150 6f 72 28 69 3d 30 3b 20 7a 41 72 67 5b 69 5d 3e  or(i=0; zArg[i]>
1c160 3d 27 30 27 20 26 26 20 7a 41 72 67 5b 69 5d 3c  ='0' && zArg[i]<
1c170 3d 27 39 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7d  ='9'; i++){}.  }
1c180 0a 20 20 69 66 28 20 69 3e 30 20 26 26 20 7a 41  .  if( i>0 && zA
1c190 72 67 5b 69 5d 3d 3d 30 20 29 20 72 65 74 75 72  rg[i]==0 ) retur
1c1a0 6e 20 28 69 6e 74 29 28 69 6e 74 65 67 65 72 56  n (int)(integerV
1c1b0 61 6c 75 65 28 7a 41 72 67 29 20 26 20 30 78 66  alue(zArg) & 0xf
1c1c0 66 66 66 66 66 66 66 29 3b 0a 20 20 69 66 28 20  fffffff);.  if( 
1c1d0 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
1c1e0 7a 41 72 67 2c 20 22 6f 6e 22 29 3d 3d 30 20 7c  zArg, "on")==0 |
1c1f0 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  | sqlite3_stricm
1c200 70 28 7a 41 72 67 2c 22 79 65 73 22 29 3d 3d 30  p(zArg,"yes")==0
1c210 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
1c220 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  ;.  }.  if( sqli
1c230 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67  te3_stricmp(zArg
1c240 2c 20 22 6f 66 66 22 29 3d 3d 30 20 7c 7c 20 73  , "off")==0 || s
1c250 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
1c260 41 72 67 2c 22 6e 6f 22 29 3d 3d 30 20 29 7b 0a  Arg,"no")==0 ){.
1c270 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1c280 7d 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28  }.  utf8_printf(
1c290 73 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a 20  stderr, "ERROR: 
1c2a0 4e 6f 74 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61  Not a boolean va
1c2b0 6c 75 65 3a 20 5c 22 25 73 5c 22 2e 20 41 73 73  lue: \"%s\". Ass
1c2c0 75 6d 69 6e 67 20 5c 22 6e 6f 5c 22 2e 5c 6e 22  uming \"no\".\n"
1c2d0 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 41 72 67  ,.          zArg
1c2e0 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
1c2f0 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72 20 63  ../*.** Set or c
1c300 6c 65 61 72 20 61 20 73 68 65 6c 6c 20 66 6c 61  lear a shell fla
1c310 67 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 61  g according to a
1c320 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 0a   boolean value..
1c330 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
1c340 65 74 4f 72 43 6c 65 61 72 46 6c 61 67 28 53 68  etOrClearFlag(Sh
1c350 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 75 6e 73  ellState *p, uns
1c360 69 67 6e 65 64 20 6d 46 6c 61 67 2c 20 63 6f 6e  igned mFlag, con
1c370 73 74 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a  st char *zArg){.
1c380 20 20 69 66 28 20 62 6f 6f 6c 65 61 6e 56 61 6c    if( booleanVal
1c390 75 65 28 7a 41 72 67 29 20 29 7b 0a 20 20 20 20  ue(zArg) ){.    
1c3a0 53 68 65 6c 6c 53 65 74 46 6c 61 67 28 70 2c 20  ShellSetFlag(p, 
1c3b0 6d 46 6c 61 67 29 3b 0a 20 20 7d 65 6c 73 65 7b  mFlag);.  }else{
1c3c0 0a 20 20 20 20 53 68 65 6c 6c 43 6c 65 61 72 46  .    ShellClearF
1c3d0 6c 61 67 28 70 2c 20 6d 46 6c 61 67 29 3b 0a 20  lag(p, mFlag);. 
1c3e0 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73   }.}../*.** Clos
1c3f0 65 20 61 6e 20 6f 75 74 70 75 74 20 66 69 6c 65  e an output file
1c400 2c 20 61 73 73 75 6d 69 6e 67 20 69 74 20 69 73  , assuming it is
1c410 20 6e 6f 74 20 73 74 64 65 72 72 20 6f 72 20 73   not stderr or s
1c420 74 64 6f 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20  tdout.*/.static 
1c430 76 6f 69 64 20 6f 75 74 70 75 74 5f 66 69 6c 65  void output_file
1c440 5f 63 6c 6f 73 65 28 46 49 4c 45 20 2a 66 29 7b  _close(FILE *f){
1c450 0a 20 20 69 66 28 20 66 20 26 26 20 66 21 3d 73  .  if( f && f!=s
1c460 74 64 6f 75 74 20 26 26 20 66 21 3d 73 74 64 65  tdout && f!=stde
1c470 72 72 20 29 20 66 63 6c 6f 73 65 28 66 29 3b 0a  rr ) fclose(f);.
1c480 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
1c490 6f 70 65 6e 20 61 6e 20 6f 75 74 70 75 74 20 66  open an output f
1c4a0 69 6c 65 2e 20 20 20 54 68 65 20 6e 61 6d 65 73  ile.   The names
1c4b0 20 22 73 74 64 6f 75 74 22 20 61 6e 64 20 22 73   "stdout" and "s
1c4c0 74 64 65 72 72 22 20 61 72 65 0a 2a 2a 20 72 65  tderr" are.** re
1c4d0 63 6f 67 6e 69 7a 65 64 20 61 6e 64 20 64 6f 20  cognized and do 
1c4e0 74 68 65 20 72 69 67 68 74 20 74 68 69 6e 67 2e  the right thing.
1c4f0 20 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e    NULL is return
1c500 65 64 20 69 66 20 74 68 65 20 6f 75 74 70 75 74  ed if the output
1c510 0a 2a 2a 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  .** filename is 
1c520 22 6f 66 66 22 2e 0a 2a 2f 0a 73 74 61 74 69 63  "off"..*/.static
1c530 20 46 49 4c 45 20 2a 6f 75 74 70 75 74 5f 66 69   FILE *output_fi
1c540 6c 65 5f 6f 70 65 6e 28 63 6f 6e 73 74 20 63 68  le_open(const ch
1c550 61 72 20 2a 7a 46 69 6c 65 2c 20 69 6e 74 20 62  ar *zFile, int b
1c560 54 65 78 74 4d 6f 64 65 29 7b 0a 20 20 46 49 4c  TextMode){.  FIL
1c570 45 20 2a 66 3b 0a 20 20 69 66 28 20 73 74 72 63  E *f;.  if( strc
1c580 6d 70 28 7a 46 69 6c 65 2c 22 73 74 64 6f 75 74  mp(zFile,"stdout
1c590 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d  ")==0 ){.    f =
1c5a0 20 73 74 64 6f 75 74 3b 0a 20 20 7d 65 6c 73 65   stdout;.  }else
1c5b0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c   if( strcmp(zFil
1c5c0 65 2c 20 22 73 74 64 65 72 72 22 29 3d 3d 30 20  e, "stderr")==0 
1c5d0 29 7b 0a 20 20 20 20 66 20 3d 20 73 74 64 65 72  ){.    f = stder
1c5e0 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  r;.  }else if( s
1c5f0 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22 6f 66  trcmp(zFile, "of
1c600 66 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20  f")==0 ){.    f 
1c610 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 0;.  }else{.  
1c620 20 20 66 20 3d 20 66 6f 70 65 6e 28 7a 46 69 6c    f = fopen(zFil
1c630 65 2c 20 62 54 65 78 74 4d 6f 64 65 20 3f 20 22  e, bTextMode ? "
1c640 77 22 20 3a 20 22 77 62 22 29 3b 0a 20 20 20 20  w" : "wb");.    
1c650 69 66 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20 20  if( f==0 ){.    
1c660 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
1c670 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61  derr, "Error: ca
1c680 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22  nnot open \"%s\"
1c690 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20  \n", zFile);.   
1c6a0 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1c6b0 66 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e  f;.}..#if !defin
1c6c0 65 64 28 53 51 4c 49 54 45 5f 55 4e 54 45 53 54  ed(SQLITE_UNTEST
1c6d0 41 42 4c 45 29 0a 23 69 66 20 21 64 65 66 69 6e  ABLE).#if !defin
1c6e0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
1c6f0 52 41 43 45 29 20 26 26 20 21 64 65 66 69 6e 65  RACE) && !define
1c700 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c  d(SQLITE_OMIT_FL
1c710 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 2f 2a  OATING_POINT)./*
1c720 0a 2a 2a 20 41 20 72 6f 75 74 69 6e 65 20 66 6f  .** A routine fo
1c730 72 20 68 61 6e 64 6c 69 6e 67 20 6f 75 74 70 75  r handling outpu
1c740 74 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 74  t from sqlite3_t
1c750 72 61 63 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69  race()..*/.stati
1c760 63 20 69 6e 74 20 73 71 6c 5f 74 72 61 63 65 5f  c int sql_trace_
1c770 63 61 6c 6c 62 61 63 6b 28 0a 20 20 75 6e 73 69  callback(.  unsi
1c780 67 6e 65 64 20 6d 54 79 70 65 2c 0a 20 20 76 6f  gned mType,.  vo
1c790 69 64 20 2a 70 41 72 67 2c 0a 20 20 76 6f 69 64  id *pArg,.  void
1c7a0 20 2a 70 50 2c 0a 20 20 76 6f 69 64 20 2a 70 58   *pP,.  void *pX
1c7b0 0a 29 7b 0a 20 20 46 49 4c 45 20 2a 66 20 3d 20  .){.  FILE *f = 
1c7c0 28 46 49 4c 45 2a 29 70 41 72 67 3b 0a 20 20 55  (FILE*)pArg;.  U
1c7d0 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
1c7e0 6d 54 79 70 65 29 3b 0a 20 20 55 4e 55 53 45 44  mType);.  UNUSED
1c7f0 5f 50 41 52 41 4d 45 54 45 52 28 70 50 29 3b 0a  _PARAMETER(pP);.
1c800 20 20 69 66 28 20 66 20 29 7b 0a 20 20 20 20 63    if( f ){.    c
1c810 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 28  onst char *z = (
1c820 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 58 3b 0a  const char*)pX;.
1c830 20 20 20 20 69 6e 74 20 69 20 3d 20 73 74 72 6c      int i = strl
1c840 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 77 68 69  en30(z);.    whi
1c850 6c 65 28 20 69 3e 30 20 26 26 20 7a 5b 69 2d 31  le( i>0 && z[i-1
1c860 5d 3d 3d 27 3b 27 20 29 7b 20 69 2d 2d 3b 20 7d  ]==';' ){ i--; }
1c870 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
1c880 28 66 2c 20 22 25 2e 2a 73 3b 5c 6e 22 2c 20 69  (f, "%.*s;\n", i
1c890 2c 20 7a 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  , z);.  }.  retu
1c8a0 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 23  rn 0;.}.#endif.#
1c8b0 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e  endif../*.** A n
1c8c0 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 74 68 61  o-op routine tha
1c8d0 74 20 72 75 6e 73 20 77 69 74 68 20 74 68 65 20  t runs with the 
1c8e0 22 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20 64 6f  ".breakpoint" do
1c8f0 63 2d 63 6f 6d 6d 61 6e 64 2e 20 20 54 68 69 73  c-command.  This
1c900 20 69 73 0a 2a 2a 20 61 20 75 73 65 66 75 6c 20   is.** a useful 
1c910 73 70 6f 74 20 74 6f 20 73 65 74 20 61 20 64 65  spot to set a de
1c920 62 75 67 67 65 72 20 62 72 65 61 6b 70 6f 69 6e  bugger breakpoin
1c930 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  t..*/.static voi
1c940 64 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e  d test_breakpoin
1c950 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74 69  t(void){.  stati
1c960 63 20 69 6e 74 20 6e 43 61 6c 6c 20 3d 20 30 3b  c int nCall = 0;
1c970 0a 20 20 6e 43 61 6c 6c 2b 2b 3b 0a 7d 0a 0a 2f  .  nCall++;.}../
1c980 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20 75  *.** An object u
1c990 73 65 64 20 74 6f 20 72 65 61 64 20 61 20 43 53  sed to read a CS
1c9a0 56 20 61 6e 64 20 6f 74 68 65 72 20 66 69 6c 65  V and other file
1c9b0 73 20 66 6f 72 20 69 6d 70 6f 72 74 2e 0a 2a 2f  s for import..*/
1c9c0 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
1c9d0 49 6d 70 6f 72 74 43 74 78 20 49 6d 70 6f 72 74  ImportCtx Import
1c9e0 43 74 78 3b 0a 73 74 72 75 63 74 20 49 6d 70 6f  Ctx;.struct Impo
1c9f0 72 74 43 74 78 20 7b 0a 20 20 63 6f 6e 73 74 20  rtCtx {.  const 
1ca00 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 2f 2a  char *zFile;  /*
1ca10 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e 70   Name of the inp
1ca20 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 46 49 4c  ut file */.  FIL
1ca30 45 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20 20  E *in;          
1ca40 20 2f 2a 20 52 65 61 64 20 74 68 65 20 43 53 56   /* Read the CSV
1ca50 20 74 65 78 74 20 66 72 6f 6d 20 74 68 69 73 20   text from this 
1ca60 69 6e 70 75 74 20 73 74 72 65 61 6d 20 2a 2f 0a  input stream */.
1ca70 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20    char *z;      
1ca80 20 20 20 20 20 20 2f 2a 20 41 63 63 75 6d 75 6c        /* Accumul
1ca90 61 74 65 64 20 74 65 78 74 20 66 6f 72 20 61 20  ated text for a 
1caa0 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  field */.  int n
1cab0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
1cac0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
1cad0 73 20 69 6e 20 7a 20 2a 2f 0a 20 20 69 6e 74 20  s in z */.  int 
1cae0 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20 20  nAlloc;         
1caf0 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61 74  /* Space allocat
1cb00 65 64 20 66 6f 72 20 7a 5b 5d 20 2a 2f 0a 20 20  ed for z[] */.  
1cb10 69 6e 74 20 6e 4c 69 6e 65 3b 20 20 20 20 20 20  int nLine;      
1cb20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c      /* Current l
1cb30 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  ine number */.  
1cb40 69 6e 74 20 62 4e 6f 74 46 69 72 73 74 3b 20 20  int bNotFirst;  
1cb50 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f      /* True if o
1cb60 6e 65 20 6f 72 20 6d 6f 72 65 20 62 79 74 65 73  ne or more bytes
1cb70 20 61 6c 72 65 61 64 79 20 72 65 61 64 20 2a 2f   already read */
1cb80 0a 20 20 69 6e 74 20 63 54 65 72 6d 3b 20 20 20  .  int cTerm;   
1cb90 20 20 20 20 20 20 20 2f 2a 20 43 68 61 72 61 63         /* Charac
1cba0 74 65 72 20 74 68 61 74 20 74 65 72 6d 69 6e 61  ter that termina
1cbb0 74 65 64 20 74 68 65 20 6d 6f 73 74 20 72 65 63  ted the most rec
1cbc0 65 6e 74 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69  ent field */.  i
1cbd0 6e 74 20 63 43 6f 6c 53 65 70 3b 20 20 20 20 20  nt cColSep;     
1cbe0 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e     /* The column
1cbf0 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72 61   separator chara
1cc00 63 74 65 72 2e 20 20 28 55 73 75 61 6c 6c 79 20  cter.  (Usually 
1cc10 22 2c 22 29 20 2a 2f 0a 20 20 69 6e 74 20 63 52  ",") */.  int cR
1cc20 6f 77 53 65 70 3b 20 20 20 20 20 20 20 20 2f 2a  owSep;        /*
1cc30 20 54 68 65 20 72 6f 77 20 73 65 70 61 72 61 74   The row separat
1cc40 6f 72 20 63 68 61 72 61 63 74 65 72 2e 20 20 28  or character.  (
1cc50 55 73 75 61 6c 6c 79 20 22 5c 6e 22 29 20 2a 2f  Usually "\n") */
1cc60 0a 7d 3b 0a 0a 2f 2a 20 41 70 70 65 6e 64 20 61  .};../* Append a
1cc70 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f 20   single byte to 
1cc80 7a 5b 5d 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f  z[] */.static vo
1cc90 69 64 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64  id import_append
1cca0 5f 63 68 61 72 28 49 6d 70 6f 72 74 43 74 78 20  _char(ImportCtx 
1ccb0 2a 70 2c 20 69 6e 74 20 63 29 7b 0a 20 20 69 66  *p, int c){.  if
1ccc0 28 20 70 2d 3e 6e 2b 31 3e 3d 70 2d 3e 6e 41 6c  ( p->n+1>=p->nAl
1ccd0 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 41  loc ){.    p->nA
1cce0 6c 6c 6f 63 20 2b 3d 20 70 2d 3e 6e 41 6c 6c 6f  lloc += p->nAllo
1ccf0 63 20 2b 20 31 30 30 3b 0a 20 20 20 20 70 2d 3e  c + 100;.    p->
1cd00 7a 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  z = sqlite3_real
1cd10 6c 6f 63 36 34 28 70 2d 3e 7a 2c 20 70 2d 3e 6e  loc64(p->z, p->n
1cd20 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28 20  Alloc);.    if( 
1cd30 70 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20  p->z==0 ){.     
1cd40 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
1cd50 72 72 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f  rr, "out of memo
1cd60 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65 78  ry\n");.      ex
1cd70 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  it(1);.    }.  }
1cd80 0a 20 20 70 2d 3e 7a 5b 70 2d 3e 6e 2b 2b 5d 20  .  p->z[p->n++] 
1cd90 3d 20 28 63 68 61 72 29 63 3b 0a 7d 0a 0a 2f 2a  = (char)c;.}../*
1cda0 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 66   Read a single f
1cdb0 69 65 6c 64 20 6f 66 20 43 53 56 20 74 65 78 74  ield of CSV text
1cdc0 2e 20 20 43 6f 6d 70 61 74 69 62 6c 65 20 77 69  .  Compatible wi
1cdd0 74 68 20 72 66 63 34 31 38 30 20 61 6e 64 20 65  th rfc4180 and e
1cde0 78 74 65 6e 64 65 64 0a 2a 2a 20 77 69 74 68 20  xtended.** with 
1cdf0 74 68 65 20 6f 70 74 69 6f 6e 20 6f 66 20 68 61  the option of ha
1ce00 76 69 6e 67 20 61 20 73 65 70 61 72 61 74 6f 72  ving a separator
1ce10 20 6f 74 68 65 72 20 74 68 61 6e 20 22 2c 22 2e   other than ",".
1ce20 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 20 49 6e 70 75  .**.**   +  Inpu
1ce30 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20 70 2d 3e  t comes from p->
1ce40 69 6e 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72  in..**   +  Stor
1ce50 65 20 72 65 73 75 6c 74 73 20 69 6e 20 70 2d 3e  e results in p->
1ce60 7a 20 6f 66 20 6c 65 6e 67 74 68 20 70 2d 3e 6e  z of length p->n
1ce70 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64  .  Space to hold
1ce80 20 70 2d 3e 7a 20 63 6f 6d 65 73 0a 2a 2a 20 20   p->z comes.**  
1ce90 20 20 20 20 66 72 6f 6d 20 73 71 6c 69 74 65 33      from sqlite3
1cea0 5f 6d 61 6c 6c 6f 63 36 34 28 29 2e 0a 2a 2a 20  _malloc64()..** 
1ceb0 20 20 2b 20 20 55 73 65 20 70 2d 3e 63 53 65 70    +  Use p->cSep
1cec0 20 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 73   as the column s
1ced0 65 70 61 72 61 74 6f 72 2e 20 20 54 68 65 20 64  eparator.  The d
1cee0 65 66 61 75 6c 74 20 69 73 20 22 2c 22 2e 0a 2a  efault is ","..*
1cef0 2a 20 20 20 2b 20 20 55 73 65 20 70 2d 3e 72 53  *   +  Use p->rS
1cf00 65 70 20 61 73 20 74 68 65 20 72 6f 77 20 73 65  ep as the row se
1cf10 70 61 72 61 74 6f 72 2e 20 20 54 68 65 20 64 65  parator.  The de
1cf20 66 61 75 6c 74 20 69 73 20 22 5c 6e 22 2e 0a 2a  fault is "\n"..*
1cf30 2a 20 20 20 2b 20 20 4b 65 65 70 20 74 72 61 63  *   +  Keep trac
1cf40 6b 20 6f 66 20 74 68 65 20 6c 69 6e 65 20 6e 75  k of the line nu
1cf50 6d 62 65 72 20 69 6e 20 70 2d 3e 6e 4c 69 6e 65  mber in p->nLine
1cf60 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65 20  ..**   +  Store 
1cf70 74 68 65 20 63 68 61 72 61 63 74 65 72 20 74 68  the character th
1cf80 61 74 20 74 65 72 6d 69 6e 61 74 65 73 20 74 68  at terminates th
1cf90 65 20 66 69 65 6c 64 20 69 6e 20 70 2d 3e 63 54  e field in p->cT
1cfa0 65 72 6d 2e 20 20 53 74 6f 72 65 0a 2a 2a 20 20  erm.  Store.**  
1cfb0 20 20 20 20 45 4f 46 20 6f 6e 20 65 6e 64 2d 6f      EOF on end-o
1cfc0 66 2d 66 69 6c 65 2e 0a 2a 2a 20 20 20 2b 20 20  f-file..**   +  
1cfd0 52 65 70 6f 72 74 20 73 79 6e 74 61 78 20 65 72  Report syntax er
1cfe0 72 6f 72 73 20 6f 6e 20 73 74 64 65 72 72 0a 2a  rors on stderr.*
1cff0 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 53  /.static char *S
1d000 51 4c 49 54 45 5f 43 44 45 43 4c 20 63 73 76 5f  QLITE_CDECL csv_
1d010 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 28 49  read_one_field(I
1d020 6d 70 6f 72 74 43 74 78 20 2a 70 29 7b 0a 20 20  mportCtx *p){.  
1d030 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 63 53 65  int c;.  int cSe
1d040 70 20 3d 20 70 2d 3e 63 43 6f 6c 53 65 70 3b 0a  p = p->cColSep;.
1d050 20 20 69 6e 74 20 72 53 65 70 20 3d 20 70 2d 3e    int rSep = p->
1d060 63 52 6f 77 53 65 70 3b 0a 20 20 70 2d 3e 6e 20  cRowSep;.  p->n 
1d070 3d 20 30 3b 0a 20 20 63 20 3d 20 66 67 65 74 63  = 0;.  c = fgetc
1d080 28 70 2d 3e 69 6e 29 3b 0a 20 20 69 66 28 20 63  (p->in);.  if( c
1d090 3d 3d 45 4f 46 20 7c 7c 20 73 65 65 6e 49 6e 74  ==EOF || seenInt
1d0a0 65 72 72 75 70 74 20 29 7b 0a 20 20 20 20 70 2d  errupt ){.    p-
1d0b0 3e 63 54 65 72 6d 20 3d 20 45 4f 46 3b 0a 20 20  >cTerm = EOF;.  
1d0c0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
1d0d0 20 20 69 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a    if( c=='"' ){.
1d0e0 20 20 20 20 69 6e 74 20 70 63 2c 20 70 70 63 3b      int pc, ppc;
1d0f0 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 4c 69  .    int startLi
1d100 6e 65 20 3d 20 70 2d 3e 6e 4c 69 6e 65 3b 0a 20  ne = p->nLine;. 
1d110 20 20 20 69 6e 74 20 63 51 75 6f 74 65 20 3d 20     int cQuote = 
1d120 63 3b 0a 20 20 20 20 70 63 20 3d 20 70 70 63 20  c;.    pc = ppc 
1d130 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  = 0;.    while( 
1d140 31 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20 66  1 ){.      c = f
1d150 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20  getc(p->in);.   
1d160 20 20 20 69 66 28 20 63 3d 3d 72 53 65 70 20 29     if( c==rSep )
1d170 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20   p->nLine++;.   
1d180 20 20 20 69 66 28 20 63 3d 3d 63 51 75 6f 74 65     if( c==cQuote
1d190 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
1d1a0 70 63 3d 3d 63 51 75 6f 74 65 20 29 7b 0a 20 20  pc==cQuote ){.  
1d1b0 20 20 20 20 20 20 20 20 70 63 20 3d 20 30 3b 0a          pc = 0;.
1d1c0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e            contin
1d1d0 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
1d1e0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1d1f0 28 63 3d 3d 63 53 65 70 20 26 26 20 70 63 3d 3d  (c==cSep && pc==
1d200 63 51 75 6f 74 65 29 0a 20 20 20 20 20 20 20 7c  cQuote).       |
1d210 7c 20 28 63 3d 3d 72 53 65 70 20 26 26 20 70 63  | (c==rSep && pc
1d220 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20 20 20 20  ==cQuote).      
1d230 20 7c 7c 20 28 63 3d 3d 72 53 65 70 20 26 26 20   || (c==rSep && 
1d240 70 63 3d 3d 27 5c 72 27 20 26 26 20 70 70 63 3d  pc=='\r' && ppc=
1d250 3d 63 51 75 6f 74 65 29 0a 20 20 20 20 20 20 20  =cQuote).       
1d260 7c 7c 20 28 63 3d 3d 45 4f 46 20 26 26 20 70 63  || (c==EOF && pc
1d270 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20 20 20 20  ==cQuote).      
1d280 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 20 70  ){.        do{ p
1d290 2d 3e 6e 2d 2d 3b 20 7d 77 68 69 6c 65 28 20 70  ->n--; }while( p
1d2a0 2d 3e 7a 5b 70 2d 3e 6e 5d 21 3d 63 51 75 6f 74  ->z[p->n]!=cQuot
1d2b0 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  e );.        p->
1d2c0 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20 20 20 20  cTerm = c;.     
1d2d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
1d2e0 7d 0a 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d  }.      if( pc==
1d2f0 63 51 75 6f 74 65 20 26 26 20 63 21 3d 27 5c 72  cQuote && c!='\r
1d300 27 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  ' ){.        utf
1d310 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
1d320 20 22 25 73 3a 25 64 3a 20 75 6e 65 73 63 61 70   "%s:%d: unescap
1d330 65 64 20 25 63 20 63 68 61 72 61 63 74 65 72 5c  ed %c character\
1d340 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1d350 20 20 20 20 70 2d 3e 7a 46 69 6c 65 2c 20 70 2d      p->zFile, p-
1d360 3e 6e 4c 69 6e 65 2c 20 63 51 75 6f 74 65 29 3b  >nLine, cQuote);
1d370 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1d380 66 28 20 63 3d 3d 45 4f 46 20 29 7b 0a 20 20 20  f( c==EOF ){.   
1d390 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
1d3a0 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a  (stderr, "%s:%d:
1d3b0 20 75 6e 74 65 72 6d 69 6e 61 74 65 64 20 25 63   unterminated %c
1d3c0 2d 71 75 6f 74 65 64 20 66 69 65 6c 64 5c 6e 22  -quoted field\n"
1d3d0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1d3e0 20 20 70 2d 3e 7a 46 69 6c 65 2c 20 73 74 61 72    p->zFile, star
1d3f0 74 4c 69 6e 65 2c 20 63 51 75 6f 74 65 29 3b 0a  tLine, cQuote);.
1d400 20 20 20 20 20 20 20 20 70 2d 3e 63 54 65 72 6d          p->cTerm
1d410 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 62 72   = c;.        br
1d420 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
1d430 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64     import_append
1d440 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20  _char(p, c);.   
1d450 20 20 20 70 70 63 20 3d 20 70 63 3b 0a 20 20 20     ppc = pc;.   
1d460 20 20 20 70 63 20 3d 20 63 3b 0a 20 20 20 20 7d     pc = c;.    }
1d470 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a  .  }else{.    /*
1d480 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65 20   If this is the 
1d490 66 69 72 73 74 20 66 69 65 6c 64 20 62 65 69 6e  first field bein
1d4a0 67 20 70 61 72 73 65 64 20 61 6e 64 20 69 74 20  g parsed and it 
1d4b0 62 65 67 69 6e 73 20 77 69 74 68 20 74 68 65 0a  begins with the.
1d4c0 20 20 20 20 2a 2a 20 55 54 46 2d 38 20 42 4f 4d      ** UTF-8 BOM
1d4d0 20 20 28 30 78 45 46 20 42 42 20 42 46 29 20 74    (0xEF BB BF) t
1d4e0 68 65 6e 20 73 6b 69 70 20 74 68 65 20 42 4f 4d  hen skip the BOM
1d4f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 63 26 30   */.    if( (c&0
1d500 78 66 66 29 3d 3d 30 78 65 66 20 26 26 20 70 2d  xff)==0xef && p-
1d510 3e 62 4e 6f 74 46 69 72 73 74 3d 3d 30 20 29 7b  >bNotFirst==0 ){
1d520 0a 20 20 20 20 20 20 69 6d 70 6f 72 74 5f 61 70  .      import_ap
1d530 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b  pend_char(p, c);
1d540 0a 20 20 20 20 20 20 63 20 3d 20 66 67 65 74 63  .      c = fgetc
1d550 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 69  (p->in);.      i
1d560 66 28 20 28 63 26 30 78 66 66 29 3d 3d 30 78 62  f( (c&0xff)==0xb
1d570 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6d 70  b ){.        imp
1d580 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28  ort_append_char(
1d590 70 2c 20 63 29 3b 0a 20 20 20 20 20 20 20 20 63  p, c);.        c
1d5a0 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b   = fgetc(p->in);
1d5b0 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 63 26  .        if( (c&
1d5c0 30 78 66 66 29 3d 3d 30 78 62 66 20 29 7b 0a 20  0xff)==0xbf ){. 
1d5d0 20 20 20 20 20 20 20 20 20 70 2d 3e 62 4e 6f 74           p->bNot
1d5e0 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20 20  First = 1;.     
1d5f0 20 20 20 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20       p->n = 0;. 
1d600 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
1d610 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65  csv_read_one_fie
1d620 6c 64 28 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  ld(p);.        }
1d630 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d640 20 20 20 77 68 69 6c 65 28 20 63 21 3d 45 4f 46     while( c!=EOF
1d650 20 26 26 20 63 21 3d 63 53 65 70 20 26 26 20 63   && c!=cSep && c
1d660 21 3d 72 53 65 70 20 29 7b 0a 20 20 20 20 20 20  !=rSep ){.      
1d670 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68  import_append_ch
1d680 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20 20  ar(p, c);.      
1d690 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29  c = fgetc(p->in)
1d6a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
1d6b0 63 3d 3d 72 53 65 70 20 29 7b 0a 20 20 20 20 20  c==rSep ){.     
1d6c0 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20   p->nLine++;.   
1d6d0 20 20 20 69 66 28 20 70 2d 3e 6e 3e 30 20 26 26     if( p->n>0 &&
1d6e0 20 70 2d 3e 7a 5b 70 2d 3e 6e 2d 31 5d 3d 3d 27   p->z[p->n-1]=='
1d6f0 5c 72 27 20 29 20 70 2d 3e 6e 2d 2d 3b 0a 20 20  \r' ) p->n--;.  
1d700 20 20 7d 0a 20 20 20 20 70 2d 3e 63 54 65 72 6d    }.    p->cTerm
1d710 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = c;.  }.  if( 
1d720 70 2d 3e 7a 20 29 20 70 2d 3e 7a 5b 70 2d 3e 6e  p->z ) p->z[p->n
1d730 5d 20 3d 20 30 3b 0a 20 20 70 2d 3e 62 4e 6f 74  ] = 0;.  p->bNot
1d740 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 72 65 74  First = 1;.  ret
1d750 75 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a 2f 2a 20  urn p->z;.}../* 
1d760 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 66 69  Read a single fi
1d770 65 6c 64 20 6f 66 20 41 53 43 49 49 20 64 65 6c  eld of ASCII del
1d780 69 6d 69 74 65 64 20 74 65 78 74 2e 0a 2a 2a 0a  imited text..**.
1d790 2a 2a 20 20 20 2b 20 20 49 6e 70 75 74 20 63 6f  **   +  Input co
1d7a0 6d 65 73 20 66 72 6f 6d 20 70 2d 3e 69 6e 2e 0a  mes from p->in..
1d7b0 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65 20 72 65  **   +  Store re
1d7c0 73 75 6c 74 73 20 69 6e 20 70 2d 3e 7a 20 6f 66  sults in p->z of
1d7d0 20 6c 65 6e 67 74 68 20 70 2d 3e 6e 2e 20 20 53   length p->n.  S
1d7e0 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 70 2d 3e  pace to hold p->
1d7f0 7a 20 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20  z comes.**      
1d800 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
1d810 6c 6f 63 36 34 28 29 2e 0a 2a 2a 20 20 20 2b 20  loc64()..**   + 
1d820 20 55 73 65 20 70 2d 3e 63 53 65 70 20 61 73 20   Use p->cSep as 
1d830 74 68 65 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72  the column separ
1d840 61 74 6f 72 2e 20 20 54 68 65 20 64 65 66 61 75  ator.  The defau
1d850 6c 74 20 69 73 20 22 5c 78 31 46 22 2e 0a 2a 2a  lt is "\x1F"..**
1d860 20 20 20 2b 20 20 55 73 65 20 70 2d 3e 72 53 65     +  Use p->rSe
1d870 70 20 61 73 20 74 68 65 20 72 6f 77 20 73 65 70  p as the row sep
1d880 61 72 61 74 6f 72 2e 20 20 54 68 65 20 64 65 66  arator.  The def
1d890 61 75 6c 74 20 69 73 20 22 5c 78 31 45 22 2e 0a  ault is "\x1E"..
1d8a0 2a 2a 20 20 20 2b 20 20 4b 65 65 70 20 74 72 61  **   +  Keep tra
1d8b0 63 6b 20 6f 66 20 74 68 65 20 72 6f 77 20 6e 75  ck of the row nu
1d8c0 6d 62 65 72 20 69 6e 20 70 2d 3e 6e 4c 69 6e 65  mber in p->nLine
1d8d0 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65 20  ..**   +  Store 
1d8e0 74 68 65 20 63 68 61 72 61 63 74 65 72 20 74 68  the character th
1d8f0 61 74 20 74 65 72 6d 69 6e 61 74 65 73 20 74 68  at terminates th
1d900 65 20 66 69 65 6c 64 20 69 6e 20 70 2d 3e 63 54  e field in p->cT
1d910 65 72 6d 2e 20 20 53 74 6f 72 65 0a 2a 2a 20 20  erm.  Store.**  
1d920 20 20 20 20 45 4f 46 20 6f 6e 20 65 6e 64 2d 6f      EOF on end-o
1d930 66 2d 66 69 6c 65 2e 0a 2a 2a 20 20 20 2b 20 20  f-file..**   +  
1d940 52 65 70 6f 72 74 20 73 79 6e 74 61 78 20 65 72  Report syntax er
1d950 72 6f 72 73 20 6f 6e 20 73 74 64 65 72 72 0a 2a  rors on stderr.*
1d960 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 53  /.static char *S
1d970 51 4c 49 54 45 5f 43 44 45 43 4c 20 61 73 63 69  QLITE_CDECL asci
1d980 69 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64  i_read_one_field
1d990 28 49 6d 70 6f 72 74 43 74 78 20 2a 70 29 7b 0a  (ImportCtx *p){.
1d9a0 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 63    int c;.  int c
1d9b0 53 65 70 20 3d 20 70 2d 3e 63 43 6f 6c 53 65 70  Sep = p->cColSep
1d9c0 3b 0a 20 20 69 6e 74 20 72 53 65 70 20 3d 20 70  ;.  int rSep = p
1d9d0 2d 3e 63 52 6f 77 53 65 70 3b 0a 20 20 70 2d 3e  ->cRowSep;.  p->
1d9e0 6e 20 3d 20 30 3b 0a 20 20 63 20 3d 20 66 67 65  n = 0;.  c = fge
1d9f0 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 69 66 28  tc(p->in);.  if(
1da00 20 63 3d 3d 45 4f 46 20 7c 7c 20 73 65 65 6e 49   c==EOF || seenI
1da10 6e 74 65 72 72 75 70 74 20 29 7b 0a 20 20 20 20  nterrupt ){.    
1da20 70 2d 3e 63 54 65 72 6d 20 3d 20 45 4f 46 3b 0a  p->cTerm = EOF;.
1da30 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1da40 7d 0a 20 20 77 68 69 6c 65 28 20 63 21 3d 45 4f  }.  while( c!=EO
1da50 46 20 26 26 20 63 21 3d 63 53 65 70 20 26 26 20  F && c!=cSep && 
1da60 63 21 3d 72 53 65 70 20 29 7b 0a 20 20 20 20 69  c!=rSep ){.    i
1da70 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61  mport_append_cha
1da80 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 63 20 3d  r(p, c);.    c =
1da90 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20   fgetc(p->in);. 
1daa0 20 7d 0a 20 20 69 66 28 20 63 3d 3d 72 53 65 70   }.  if( c==rSep
1dab0 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 69 6e 65   ){.    p->nLine
1dac0 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 54 65  ++;.  }.  p->cTe
1dad0 72 6d 20 3d 20 63 3b 0a 20 20 69 66 28 20 70 2d  rm = c;.  if( p-
1dae0 3e 7a 20 29 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20  >z ) p->z[p->n] 
1daf0 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d  = 0;.  return p-
1db00 3e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79  >z;.}../*.** Try
1db10 20 74 6f 20 74 72 61 6e 73 66 65 72 20 64 61 74   to transfer dat
1db20 61 20 66 6f 72 20 74 61 62 6c 65 20 7a 54 61 62  a for table zTab
1db30 6c 65 2e 20 20 49 66 20 61 6e 20 65 72 72 6f 72  le.  If an error
1db40 20 69 73 20 73 65 65 6e 20 77 68 69 6c 65 0a 2a   is seen while.*
1db50 2a 20 6d 6f 76 69 6e 67 20 66 6f 72 77 61 72 64  * moving forward
1db60 2c 20 74 72 79 20 74 6f 20 67 6f 20 62 61 63 6b  , try to go back
1db70 77 61 72 64 73 2e 20 20 54 68 65 20 62 61 63 6b  wards.  The back
1db80 77 61 72 64 73 20 6d 6f 76 65 6d 65 6e 74 20 77  wards movement w
1db90 6f 6e 27 74 0a 2a 2a 20 77 6f 72 6b 20 66 6f 72  on't.** work for
1dba0 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
1dbb0 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ables..*/.static
1dbc0 20 76 6f 69 64 20 74 72 79 54 6f 43 6c 6f 6e 65   void tryToClone
1dbd0 44 61 74 61 28 0a 20 20 53 68 65 6c 6c 53 74 61  Data(.  ShellSta
1dbe0 74 65 20 2a 70 2c 0a 20 20 73 71 6c 69 74 65 33  te *p,.  sqlite3
1dbf0 20 2a 6e 65 77 44 62 2c 0a 20 20 63 6f 6e 73 74   *newDb,.  const
1dc00 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 0a 29 7b   char *zTable.){
1dc10 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
1dc20 2a 70 51 75 65 72 79 20 3d 20 30 3b 0a 20 20 73  *pQuery = 0;.  s
1dc30 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49 6e  qlite3_stmt *pIn
1dc40 73 65 72 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  sert = 0;.  char
1dc50 20 2a 7a 51 75 65 72 79 20 3d 20 30 3b 0a 20 20   *zQuery = 0;.  
1dc60 63 68 61 72 20 2a 7a 49 6e 73 65 72 74 20 3d 20  char *zInsert = 
1dc70 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69  0;.  int rc;.  i
1dc80 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 69 6e  nt i, j, n;.  in
1dc90 74 20 6e 54 61 62 6c 65 20 3d 20 73 74 72 6c 65  t nTable = strle
1dca0 6e 33 30 28 7a 54 61 62 6c 65 29 3b 0a 20 20 69  n30(zTable);.  i
1dcb0 6e 74 20 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nt k = 0;.  int 
1dcc0 63 6e 74 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74  cnt = 0;.  const
1dcd0 20 69 6e 74 20 73 70 69 6e 52 61 74 65 20 3d 20   int spinRate = 
1dce0 31 30 30 30 30 3b 0a 0a 20 20 7a 51 75 65 72 79  10000;..  zQuery
1dcf0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1dd00 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  tf("SELECT * FRO
1dd10 4d 20 5c 22 25 77 5c 22 22 2c 20 7a 54 61 62 6c  M \"%w\"", zTabl
1dd20 65 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  e);.  rc = sqlit
1dd30 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
1dd40 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c  >db, zQuery, -1,
1dd50 20 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20   &pQuery, 0);.  
1dd60 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74  if( rc ){.    ut
1dd70 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
1dd80 2c 20 22 45 72 72 6f 72 20 25 64 3a 20 25 73 20  , "Error %d: %s 
1dd90 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20  on [%s]\n",.    
1dda0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1ddb0 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65  extended_errcode
1ddc0 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65 33  (p->db), sqlite3
1ddd0 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c 0a  _errmsg(p->db),.
1dde0 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75 65              zQue
1ddf0 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  ry);.    goto en
1de00 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20 20 7d  d_data_xfer;.  }
1de10 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63  .  n = sqlite3_c
1de20 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 51 75 65  olumn_count(pQue
1de30 72 79 29 3b 0a 20 20 7a 49 6e 73 65 72 74 20 3d  ry);.  zInsert =
1de40 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
1de50 34 28 32 30 30 20 2b 20 6e 54 61 62 6c 65 20 2b  4(200 + nTable +
1de60 20 6e 2a 33 29 3b 0a 20 20 69 66 28 20 7a 49 6e   n*3);.  if( zIn
1de70 73 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  sert==0 ){.    r
1de80 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
1de90 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  , "out of memory
1dea0 5c 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  \n");.    goto e
1deb0 6e 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20 20  nd_data_xfer;.  
1dec0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  }.  sqlite3_snpr
1ded0 69 6e 74 66 28 32 30 30 2b 6e 54 61 62 6c 65 2c  intf(200+nTable,
1dee0 7a 49 6e 73 65 72 74 2c 0a 20 20 20 20 20 20 20  zInsert,.       
1def0 20 20 20 20 20 20 20 20 20 20 20 20 22 49 4e 53              "INS
1df00 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e  ERT OR IGNORE IN
1df10 54 4f 20 5c 22 25 73 5c 22 20 56 41 4c 55 45 53  TO \"%s\" VALUES
1df20 28 3f 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20  (?", zTable);.  
1df30 69 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 49 6e  i = strlen30(zIn
1df40 73 65 72 74 29 3b 0a 20 20 66 6f 72 28 6a 3d 31  sert);.  for(j=1
1df50 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29 7b 0a 20 20 20  ; j<n; j++){.   
1df60 20 6d 65 6d 63 70 79 28 7a 49 6e 73 65 72 74 2b   memcpy(zInsert+
1df70 69 2c 20 22 2c 3f 22 2c 20 32 29 3b 0a 20 20 20  i, ",?", 2);.   
1df80 20 69 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20 6d   i += 2;.  }.  m
1df90 65 6d 63 70 79 28 7a 49 6e 73 65 72 74 2b 69 2c  emcpy(zInsert+i,
1dfa0 20 22 29 3b 22 2c 20 33 29 3b 0a 20 20 72 63 20   ");", 3);.  rc 
1dfb0 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
1dfc0 65 5f 76 32 28 6e 65 77 44 62 2c 20 7a 49 6e 73  e_v2(newDb, zIns
1dfd0 65 72 74 2c 20 2d 31 2c 20 26 70 49 6e 73 65 72  ert, -1, &pInser
1dfe0 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20  t, 0);.  if( rc 
1dff0 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
1e000 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
1e010 72 20 25 64 3a 20 25 73 20 6f 6e 20 5b 25 73 5d  r %d: %s on [%s]
1e020 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1e030 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
1e040 64 5f 65 72 72 63 6f 64 65 28 6e 65 77 44 62 29  d_errcode(newDb)
1e050 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
1e060 28 6e 65 77 44 62 29 2c 0a 20 20 20 20 20 20 20  (newDb),.       
1e070 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20       zQuery);.  
1e080 20 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74 61 5f    goto end_data_
1e090 78 66 65 72 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  xfer;.  }.  for(
1e0a0 6b 3d 30 3b 20 6b 3c 32 3b 20 6b 2b 2b 29 7b 0a  k=0; k<2; k++){.
1e0b0 20 20 20 20 77 68 69 6c 65 28 20 28 72 63 20 3d      while( (rc =
1e0c0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 51   sqlite3_step(pQ
1e0d0 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f 52  uery))==SQLITE_R
1e0e0 4f 57 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  OW ){.      for(
1e0f0 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  i=0; i<n; i++){.
1e100 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28 20          switch( 
1e110 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
1e120 79 70 65 28 70 51 75 65 72 79 2c 20 69 29 20 29  ype(pQuery, i) )
1e130 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73 65  {.          case
1e140 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b 0a   SQLITE_NULL: {.
1e150 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1e160 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70 49  te3_bind_null(pI
1e170 6e 73 65 72 74 2c 20 69 2b 31 29 3b 0a 20 20 20  nsert, i+1);.   
1e180 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1e190 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1e1a0 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
1e1b0 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  E_INTEGER: {.   
1e1c0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1e1d0 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 49 6e 73  _bind_int64(pIns
1e1e0 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65  ert, i+1, sqlite
1e1f0 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28 70  3_column_int64(p
1e200 51 75 65 72 79 2c 69 29 29 3b 0a 20 20 20 20 20  Query,i));.     
1e210 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1e220 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1e230 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1e240 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20 20  FLOAT: {.       
1e250 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
1e260 64 5f 64 6f 75 62 6c 65 28 70 49 6e 73 65 72 74  d_double(pInsert
1e270 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63  , i+1, sqlite3_c
1e280 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 51 75  olumn_double(pQu
1e290 65 72 79 2c 69 29 29 3b 0a 20 20 20 20 20 20 20  ery,i));.       
1e2a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e2b0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1e2c0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
1e2d0 58 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  XT: {.          
1e2e0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
1e2f0 65 78 74 28 70 49 6e 73 65 72 74 2c 20 69 2b 31  ext(pInsert, i+1
1e300 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1e310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1e320 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
1e330 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
1e340 70 51 75 65 72 79 2c 69 29 2c 0a 20 20 20 20 20  pQuery,i),.     
1e350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e360 20 20 20 20 20 20 20 20 2d 31 2c 20 53 51 4c 49          -1, SQLI
1e370 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
1e380 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1e390 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e3a0 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
1e3b0 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 20  _BLOB: {.       
1e3c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
1e3d0 64 5f 62 6c 6f 62 28 70 49 6e 73 65 72 74 2c 20  d_blob(pInsert, 
1e3e0 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  i+1, sqlite3_col
1e3f0 75 6d 6e 5f 62 6c 6f 62 28 70 51 75 65 72 79 2c  umn_blob(pQuery,
1e400 69 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  i),.            
1e410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e420 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e430 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
1e440 79 74 65 73 28 70 51 75 65 72 79 2c 69 29 2c 0a  ytes(pQuery,i),.
1e450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e460 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e470 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
1e480 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20  TE_STATIC);.    
1e490 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1e4a0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1e4b0 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20     }.      } /* 
1e4c0 45 6e 64 20 66 6f 72 20 2a 2f 0a 20 20 20 20 20  End for */.     
1e4d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
1e4e0 65 70 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 20  ep(pInsert);.   
1e4f0 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
1e500 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c 49  E_OK && rc!=SQLI
1e510 54 45 5f 52 4f 57 20 26 26 20 72 63 21 3d 53 51  TE_ROW && rc!=SQ
1e520 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
1e530 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
1e540 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 20  (stderr, "Error 
1e550 25 64 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74  %d: %s\n", sqlit
1e560 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63  e3_extended_errc
1e570 6f 64 65 28 6e 65 77 44 62 29 2c 0a 20 20 20 20  ode(newDb),.    
1e580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e590 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d      sqlite3_errm
1e5a0 73 67 28 6e 65 77 44 62 29 29 3b 0a 20 20 20 20  sg(newDb));.    
1e5b0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1e5c0 33 5f 72 65 73 65 74 28 70 49 6e 73 65 72 74 29  3_reset(pInsert)
1e5d0 3b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20  ;.      cnt++;. 
1e5e0 20 20 20 20 20 69 66 28 20 28 63 6e 74 25 73 70       if( (cnt%sp
1e5f0 69 6e 52 61 74 65 29 3d 3d 30 20 29 7b 0a 20 20  inRate)==0 ){.  
1e600 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 63        printf("%c
1e610 5c 62 22 2c 20 22 7c 2f 2d 5c 5c 22 5b 28 63 6e  \b", "|/-\\"[(cn
1e620 74 2f 73 70 69 6e 52 61 74 65 29 25 34 5d 29 3b  t/spinRate)%4]);
1e630 0a 20 20 20 20 20 20 20 20 66 66 6c 75 73 68 28  .        fflush(
1e640 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20 7d  stdout);.      }
1e650 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 77 68  .    } /* End wh
1e660 69 6c 65 20 2a 2f 0a 20 20 20 20 69 66 28 20 72  ile */.    if( r
1e670 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
1e680 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 71 6c 69   break;.    sqli
1e690 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75  te3_finalize(pQu
1e6a0 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ery);.    sqlite
1e6b0 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b 0a  3_free(zQuery);.
1e6c0 20 20 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c      zQuery = sql
1e6d0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
1e6e0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77  LECT * FROM \"%w
1e6f0 5c 22 20 4f 52 44 45 52 20 42 59 20 72 6f 77 69  \" ORDER BY rowi
1e700 64 20 44 45 53 43 3b 22 2c 0a 20 20 20 20 20 20  d DESC;",.      
1e710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e720 20 20 20 20 20 20 20 7a 54 61 62 6c 65 29 3b 0a         zTable);.
1e730 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1e740 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
1e750 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20 26  b, zQuery, -1, &
1e760 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20  pQuery, 0);.    
1e770 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
1e780 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
1e790 72 72 2c 20 22 57 61 72 6e 69 6e 67 3a 20 63 61  rr, "Warning: ca
1e7a0 6e 6e 6f 74 20 73 74 65 70 20 5c 22 25 73 5c 22  nnot step \"%s\"
1e7b0 20 62 61 63 6b 77 61 72 64 73 22 2c 20 7a 54 61   backwards", zTa
1e7c0 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ble);.      brea
1e7d0 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20  k;.    }.  } /* 
1e7e0 45 6e 64 20 66 6f 72 28 6b 3d 30 2e 2e 2e 29 20  End for(k=0...) 
1e7f0 2a 2f 0a 0a 65 6e 64 5f 64 61 74 61 5f 78 66 65  */..end_data_xfe
1e800 72 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  r:.  sqlite3_fin
1e810 61 6c 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20  alize(pQuery);. 
1e820 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
1e830 65 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 73 71  e(pInsert);.  sq
1e840 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72  lite3_free(zQuer
1e850 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  y);.  sqlite3_fr
1e860 65 65 28 7a 49 6e 73 65 72 74 29 3b 0a 7d 0a 0a  ee(zInsert);.}..
1e870 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 74 72  ./*.** Try to tr
1e880 61 6e 73 66 65 72 20 61 6c 6c 20 72 6f 77 73 20  ansfer all rows 
1e890 6f 66 20 74 68 65 20 73 63 68 65 6d 61 20 74 68  of the schema th
1e8a0 61 74 20 6d 61 74 63 68 20 7a 57 68 65 72 65 2e  at match zWhere.
1e8b0 20 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 72 6f    For.** each ro
1e8c0 77 2c 20 69 6e 76 6f 6b 65 20 78 46 6f 72 45 61  w, invoke xForEa
1e8d0 63 68 28 29 20 6f 6e 20 74 68 65 20 6f 62 6a 65  ch() on the obje
1e8e0 63 74 20 64 65 66 69 6e 65 64 20 62 79 20 74 68  ct defined by th
1e8f0 61 74 20 72 6f 77 2e 0a 2a 2a 20 49 66 20 61 6e  at row..** If an
1e900 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e   error is encoun
1e910 74 65 72 65 64 20 77 68 69 6c 65 20 6d 6f 76 69  tered while movi
1e920 6e 67 20 66 6f 72 77 61 72 64 20 74 68 72 6f 75  ng forward throu
1e930 67 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74 65  gh the.** sqlite
1e940 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2c 20 74  _master table, t
1e950 72 79 20 61 67 61 69 6e 20 6d 6f 76 69 6e 67 20  ry again moving 
1e960 62 61 63 6b 77 61 72 64 73 2e 0a 2a 2f 0a 73 74  backwards..*/.st
1e970 61 74 69 63 20 76 6f 69 64 20 74 72 79 54 6f 43  atic void tryToC
1e980 6c 6f 6e 65 53 63 68 65 6d 61 28 0a 20 20 53 68  loneSchema(.  Sh
1e990 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20 20 73  ellState *p,.  s
1e9a0 71 6c 69 74 65 33 20 2a 6e 65 77 44 62 2c 0a 20  qlite3 *newDb,. 
1e9b0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57 68   const char *zWh
1e9c0 65 72 65 2c 0a 20 20 76 6f 69 64 20 28 2a 78 46  ere,.  void (*xF
1e9d0 6f 72 45 61 63 68 29 28 53 68 65 6c 6c 53 74 61  orEach)(ShellSta
1e9e0 74 65 2a 2c 73 71 6c 69 74 65 33 2a 2c 63 6f 6e  te*,sqlite3*,con
1e9f0 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a 20 20 73  st char*).){.  s
1ea00 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 51 75  qlite3_stmt *pQu
1ea10 65 72 79 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  ery = 0;.  char 
1ea20 2a 7a 51 75 65 72 79 20 3d 20 30 3b 0a 20 20 69  *zQuery = 0;.  i
1ea30 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 75  nt rc;.  const u
1ea40 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 4e  nsigned char *zN
1ea50 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 75 6e 73  ame;.  const uns
1ea60 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 53 71 6c  igned char *zSql
1ea70 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73  ;.  char *zErrMs
1ea80 67 20 3d 20 30 3b 0a 0a 20 20 7a 51 75 65 72 79  g = 0;..  zQuery
1ea90 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1eaa0 74 66 28 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c  tf("SELECT name,
1eab0 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65   sql FROM sqlite
1eac0 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20 20  _master".       
1ead0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eae0 20 20 20 20 22 20 57 48 45 52 45 20 25 73 22 2c      " WHERE %s",
1eaf0 20 7a 57 68 65 72 65 29 3b 0a 20 20 72 63 20 3d   zWhere);.  rc =
1eb00 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
1eb10 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72  _v2(p->db, zQuer
1eb20 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79 2c 20  y, -1, &pQuery, 
1eb30 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b 0a  0);.  if( rc ){.
1eb40 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
1eb50 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
1eb60 28 25 64 29 20 25 73 20 6f 6e 20 5b 25 73 5d 5c  (%d) %s on [%s]\
1eb70 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1eb80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1eb90 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65  extended_errcode
1eba0 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65 33  (p->db), sqlite3
1ebb0 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c 0a  _errmsg(p->db),.
1ebc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ebd0 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20 20      zQuery);.   
1ebe0 20 67 6f 74 6f 20 65 6e 64 5f 73 63 68 65 6d 61   goto end_schema
1ebf0 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20 77 68 69  _xfer;.  }.  whi
1ec00 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65  le( (rc = sqlite
1ec10 33 5f 73 74 65 70 28 70 51 75 65 72 79 29 29 3d  3_step(pQuery))=
1ec20 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
1ec30 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74     zName = sqlit
1ec40 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
1ec50 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20 7a  Query, 0);.    z
1ec60 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  Sql = sqlite3_co
1ec70 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72 79  lumn_text(pQuery
1ec80 2c 20 31 29 3b 0a 20 20 20 20 70 72 69 6e 74 66  , 1);.    printf
1ec90 28 22 25 73 2e 2e 2e 20 22 2c 20 7a 4e 61 6d 65  ("%s... ", zName
1eca0 29 3b 20 66 66 6c 75 73 68 28 73 74 64 6f 75 74  ); fflush(stdout
1ecb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65  );.    sqlite3_e
1ecc0 78 65 63 28 6e 65 77 44 62 2c 20 28 63 6f 6e 73  xec(newDb, (cons
1ecd0 74 20 63 68 61 72 2a 29 7a 53 71 6c 2c 20 30 2c  t char*)zSql, 0,
1ece0 20 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20   0, &zErrMsg);. 
1ecf0 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29     if( zErrMsg )
1ed00 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
1ed10 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
1ed20 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a 20 5b 25 73  or: %s\nSQL: [%s
1ed30 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 2c 20 7a  ]\n", zErrMsg, z
1ed40 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Sql);.      sqli
1ed50 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67  te3_free(zErrMsg
1ed60 29 3b 0a 20 20 20 20 20 20 7a 45 72 72 4d 73 67  );.      zErrMsg
1ed70 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
1ed80 69 66 28 20 78 46 6f 72 45 61 63 68 20 29 7b 0a  if( xForEach ){.
1ed90 20 20 20 20 20 20 78 46 6f 72 45 61 63 68 28 70        xForEach(p
1eda0 2c 20 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74 20  , newDb, (const 
1edb0 63 68 61 72 2a 29 7a 4e 61 6d 65 29 3b 0a 20 20  char*)zName);.  
1edc0 20 20 7d 0a 20 20 20 20 70 72 69 6e 74 66 28 22    }.    printf("
1edd0 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20 7d 0a 20 20  done\n");.  }.  
1ede0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 44  if( rc!=SQLITE_D
1edf0 4f 4e 45 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ONE ){.    sqlit
1ee00 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75 65  e3_finalize(pQue
1ee10 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ry);.    sqlite3
1ee20 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b 0a 20  _free(zQuery);. 
1ee30 20 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c 69     zQuery = sqli
1ee40 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
1ee50 45 43 54 20 6e 61 6d 65 2c 20 73 71 6c 20 46 52  ECT name, sql FR
1ee60 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
1ee70 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
1ee80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
1ee90 20 57 48 45 52 45 20 25 73 20 4f 52 44 45 52 20   WHERE %s ORDER 
1eea0 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 2c 20  BY rowid DESC", 
1eeb0 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 72 63 20  zWhere);.    rc 
1eec0 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
1eed0 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65  e_v2(p->db, zQue
1eee0 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79 2c  ry, -1, &pQuery,
1eef0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20   0);.    if( rc 
1ef00 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
1ef10 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
1ef20 72 6f 72 3a 20 28 25 64 29 20 25 73 20 6f 6e 20  ror: (%d) %s on 
1ef30 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20  [%s]\n",.       
1ef40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
1ef50 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f  qlite3_extended_
1ef60 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c 20  errcode(p->db), 
1ef70 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
1ef80 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20 20 20  ->db),.         
1ef90 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75               zQu
1efa0 65 72 79 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f  ery);.      goto
1efb0 20 65 6e 64 5f 73 63 68 65 6d 61 5f 78 66 65 72   end_schema_xfer
1efc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
1efd0 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  e( (rc = sqlite3
1efe0 5f 73 74 65 70 28 70 51 75 65 72 79 29 29 3d 3d  _step(pQuery))==
1eff0 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
1f000 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
1f010 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
1f020 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20  pQuery, 0);.    
1f030 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
1f040 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75  _column_text(pQu
1f050 65 72 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 70  ery, 1);.      p
1f060 72 69 6e 74 66 28 22 25 73 2e 2e 2e 20 22 2c 20  rintf("%s... ", 
1f070 7a 4e 61 6d 65 29 3b 20 66 66 6c 75 73 68 28 73  zName); fflush(s
1f080 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20 73 71  tdout);.      sq
1f090 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44 62  lite3_exec(newDb
1f0a0 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a  , (const char*)z
1f0b0 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72 72  Sql, 0, 0, &zErr
1f0c0 4d 73 67 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Msg);.      if( 
1f0d0 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
1f0e0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
1f0f0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25  tderr, "Error: %
1f100 73 5c 6e 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22 2c  s\nSQL: [%s]\n",
1f110 20 7a 45 72 72 4d 73 67 2c 20 7a 53 71 6c 29 3b   zErrMsg, zSql);
1f120 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
1f130 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
1f140 20 20 20 20 20 20 20 20 7a 45 72 72 4d 73 67 20          zErrMsg 
1f150 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 0;.      }.   
1f160 20 20 20 69 66 28 20 78 46 6f 72 45 61 63 68 20     if( xForEach 
1f170 29 7b 0a 20 20 20 20 20 20 20 20 78 46 6f 72 45  ){.        xForE
1f180 61 63 68 28 70 2c 20 6e 65 77 44 62 2c 20 28 63  ach(p, newDb, (c
1f190 6f 6e 73 74 20 63 68 61 72 2a 29 7a 4e 61 6d 65  onst char*)zName
1f1a0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1f1b0 20 70 72 69 6e 74 66 28 22 64 6f 6e 65 5c 6e 22   printf("done\n"
1f1c0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 65 6e 64  );.    }.  }.end
1f1d0 5f 73 63 68 65 6d 61 5f 78 66 65 72 3a 0a 20 20  _schema_xfer:.  
1f1e0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
1f1f0 28 70 51 75 65 72 79 29 3b 0a 20 20 73 71 6c 69  (pQuery);.  sqli
1f200 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29  te3_free(zQuery)
1f210 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e 20  ;.}../*.** Open 
1f220 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20 66  a new database f
1f230 69 6c 65 20 6e 61 6d 65 64 20 22 7a 4e 65 77 44  ile named "zNewD
1f240 62 22 2e 20 20 54 72 79 20 74 6f 20 72 65 63 6f  b".  Try to reco
1f250 76 65 72 20 61 73 20 6d 75 63 68 20 69 6e 66 6f  ver as much info
1f260 72 6d 61 74 69 6f 6e 0a 2a 2a 20 61 73 20 70 6f  rmation.** as po
1f270 73 73 69 62 6c 65 20 6f 75 74 20 6f 66 20 74 68  ssible out of th
1f280 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65 20  e main database 
1f290 28 77 68 69 63 68 20 6d 69 67 68 74 20 62 65 20  (which might be 
1f2a0 63 6f 72 72 75 70 74 29 20 61 6e 64 20 77 72 69  corrupt) and wri
1f2b0 74 65 20 69 74 0a 2a 2a 20 69 6e 74 6f 20 7a 4e  te it.** into zN
1f2c0 65 77 44 62 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ewDb..*/.static 
1f2d0 76 6f 69 64 20 74 72 79 54 6f 43 6c 6f 6e 65 28  void tryToClone(
1f2e0 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63  ShellState *p, c
1f2f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 77 44  onst char *zNewD
1f300 62 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  b){.  int rc;.  
1f310 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62 20 3d  sqlite3 *newDb =
1f320 20 30 3b 0a 20 20 69 66 28 20 61 63 63 65 73 73   0;.  if( access
1f330 28 7a 4e 65 77 44 62 2c 30 29 3d 3d 30 20 29 7b  (zNewDb,0)==0 ){
1f340 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
1f350 28 73 74 64 65 72 72 2c 20 22 46 69 6c 65 20 5c  (stderr, "File \
1f360 22 25 73 5c 22 20 61 6c 72 65 61 64 79 20 65 78  "%s\" already ex
1f370 69 73 74 73 2e 5c 6e 22 2c 20 7a 4e 65 77 44 62  ists.\n", zNewDb
1f380 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
1f390 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
1f3a0 33 5f 6f 70 65 6e 28 7a 4e 65 77 44 62 2c 20 26  3_open(zNewDb, &
1f3b0 6e 65 77 44 62 29 3b 0a 20 20 69 66 28 20 72 63  newDb);.  if( rc
1f3c0 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
1f3d0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 43 61 6e  ntf(stderr, "Can
1f3e0 6e 6f 74 20 63 72 65 61 74 65 20 6f 75 74 70 75  not create outpu
1f3f0 74 20 64 61 74 61 62 61 73 65 3a 20 25 73 5c 6e  t database: %s\n
1f400 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ",.            s
1f410 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 6e 65  qlite3_errmsg(ne
1f420 77 44 62 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  wDb));.  }else{.
1f430 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
1f440 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20  (p->db, "PRAGMA 
1f450 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d  writable_schema=
1f460 4f 4e 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  ON;", 0, 0, 0);.
1f470 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63      sqlite3_exec
1f480 28 6e 65 77 44 62 2c 20 22 42 45 47 49 4e 20 45  (newDb, "BEGIN E
1f490 58 43 4c 55 53 49 56 45 3b 22 2c 20 30 2c 20 30  XCLUSIVE;", 0, 0
1f4a0 2c 20 30 29 3b 0a 20 20 20 20 74 72 79 54 6f 43  , 0);.    tryToC
1f4b0 6c 6f 6e 65 53 63 68 65 6d 61 28 70 2c 20 6e 65  loneSchema(p, ne
1f4c0 77 44 62 2c 20 22 74 79 70 65 3d 27 74 61 62 6c  wDb, "type='tabl
1f4d0 65 27 22 2c 20 74 72 79 54 6f 43 6c 6f 6e 65 44  e'", tryToCloneD
1f4e0 61 74 61 29 3b 0a 20 20 20 20 74 72 79 54 6f 43  ata);.    tryToC
1f4f0 6c 6f 6e 65 53 63 68 65 6d 61 28 70 2c 20 6e 65  loneSchema(p, ne
1f500 77 44 62 2c 20 22 74 79 70 65 21 3d 27 74 61 62  wDb, "type!='tab
1f510 6c 65 27 22 2c 20 30 29 3b 0a 20 20 20 20 73 71  le'", 0);.    sq
1f520 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44 62  lite3_exec(newDb
1f530 2c 20 22 43 4f 4d 4d 49 54 3b 22 2c 20 30 2c 20  , "COMMIT;", 0, 
1f540 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
1f550 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22  e3_exec(p->db, "
1f560 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f  PRAGMA writable_
1f570 73 63 68 65 6d 61 3d 4f 46 46 3b 22 2c 20 30 2c  schema=OFF;", 0,
1f580 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71   0, 0);.  }.  sq
1f590 6c 69 74 65 33 5f 63 6c 6f 73 65 28 6e 65 77 44  lite3_close(newD
1f5a0 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 61  b);.}../*.** Cha
1f5b0 6e 67 65 20 74 68 65 20 6f 75 74 70 75 74 20 66  nge the output f
1f5c0 69 6c 65 20 62 61 63 6b 20 74 6f 20 73 74 64 6f  ile back to stdo
1f5d0 75 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ut..**.** If the
1f5e0 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 66 6c   p->doXdgOpen fl
1f5f0 61 67 20 69 73 20 73 65 74 2c 20 74 68 61 74 20  ag is set, that 
1f600 6d 65 61 6e 73 20 74 68 65 20 6f 75 74 70 75 74  means the output
1f610 20 77 61 73 20 62 65 69 6e 67 0a 2a 2a 20 72 65   was being.** re
1f620 64 69 72 65 63 74 65 64 20 74 6f 20 61 20 74 65  directed to a te
1f630 6d 70 6f 72 61 72 79 20 66 69 6c 65 20 6e 61 6d  mporary file nam
1f640 65 64 20 62 79 20 70 2d 3e 7a 54 65 6d 70 46 69  ed by p->zTempFi
1f650 6c 65 2e 20 20 49 6e 20 74 68 61 74 20 63 61 73  le.  In that cas
1f660 65 2c 0a 2a 2a 20 6c 61 75 6e 63 68 20 73 74 61  e,.** launch sta
1f670 72 74 2f 6f 70 65 6e 2f 78 64 67 2d 6f 70 65 6e  rt/open/xdg-open
1f680 20 6f 6e 20 74 68 61 74 20 74 65 6d 70 6f 72 61   on that tempora
1f690 72 79 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  ry file..*/.stat
1f6a0 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 72  ic void output_r
1f6b0 65 73 65 74 28 53 68 65 6c 6c 53 74 61 74 65 20  eset(ShellState 
1f6c0 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 6f 75  *p){.  if( p->ou
1f6d0 74 66 69 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b  tfile[0]=='|' ){
1f6e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
1f6f0 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20 20 20 20 70  OMIT_POPEN.    p
1f700 63 6c 6f 73 65 28 70 2d 3e 6f 75 74 29 3b 0a 23  close(p->out);.#
1f710 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20  endif.  }else{. 
1f720 20 20 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63     output_file_c
1f730 6c 6f 73 65 28 70 2d 3e 6f 75 74 29 3b 0a 23 69  lose(p->out);.#i
1f740 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48  fndef SQLITE_NOH
1f750 41 56 45 5f 53 59 53 54 45 4d 0a 20 20 20 20 69  AVE_SYSTEM.    i
1f760 66 28 20 70 2d 3e 64 6f 58 64 67 4f 70 65 6e 20  f( p->doXdgOpen 
1f770 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  ){.      const c
1f780 68 61 72 20 2a 7a 58 64 67 4f 70 65 6e 43 6d 64  har *zXdgOpenCmd
1f790 20 3d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f   =.#if defined(_
1f7a0 57 49 4e 33 32 29 0a 20 20 20 20 20 20 22 73 74  WIN32).      "st
1f7b0 61 72 74 22 3b 0a 23 65 6c 69 66 20 64 65 66 69  art";.#elif defi
1f7c0 6e 65 64 28 5f 5f 41 50 50 4c 45 5f 5f 29 0a 20  ned(__APPLE__). 
1f7d0 20 20 20 20 20 22 6f 70 65 6e 22 3b 0a 23 65 6c       "open";.#el
1f7e0 73 65 0a 20 20 20 20 20 20 22 78 64 67 2d 6f 70  se.      "xdg-op
1f7f0 65 6e 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  en";.#endif.    
1f800 20 20 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20    char *zCmd;.  
1f810 20 20 20 20 7a 43 6d 64 20 3d 20 73 71 6c 69 74      zCmd = sqlit
1f820 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 20 25  e3_mprintf("%s %
1f830 73 22 2c 20 7a 58 64 67 4f 70 65 6e 43 6d 64 2c  s", zXdgOpenCmd,
1f840 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 3b 0a   p->zTempFile);.
1f850 20 20 20 20 20 20 69 66 28 20 73 79 73 74 65 6d        if( system
1f860 28 7a 43 6d 64 29 20 29 7b 0a 20 20 20 20 20 20  (zCmd) ){.      
1f870 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
1f880 64 65 72 72 2c 20 22 46 61 69 6c 65 64 3a 20 5b  derr, "Failed: [
1f890 25 73 5d 5c 6e 22 2c 20 7a 43 6d 64 29 3b 0a 20  %s]\n", zCmd);. 
1f8a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1f8b0 69 74 65 33 5f 66 72 65 65 28 7a 43 6d 64 29 3b  ite3_free(zCmd);
1f8c0 0a 20 20 20 20 20 20 6f 75 74 70 75 74 4d 6f 64  .      outputMod
1f8d0 65 50 6f 70 28 70 29 3b 0a 20 20 20 20 20 20 70  ePop(p);.      p
1f8e0 2d 3e 64 6f 58 64 67 4f 70 65 6e 20 3d 20 30 3b  ->doXdgOpen = 0;
1f8f0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
1f900 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
1f910 5f 4e 4f 48 41 56 45 5f 53 59 53 54 45 4d 29 20  _NOHAVE_SYSTEM) 
1f920 2a 2f 0a 20 20 7d 0a 20 20 70 2d 3e 6f 75 74 66  */.  }.  p->outf
1f930 69 6c 65 5b 30 5d 20 3d 20 30 3b 0a 20 20 70 2d  ile[0] = 0;.  p-
1f940 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 7d  >out = stdout;.}
1f950 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 61 6e 20 53  ../*.** Run an S
1f960 51 4c 20 63 6f 6d 6d 61 6e 64 20 61 6e 64 20 72  QL command and r
1f970 65 74 75 72 6e 20 74 68 65 20 73 69 6e 67 6c 65  eturn the single
1f980 20 69 6e 74 65 67 65 72 20 72 65 73 75 6c 74 2e   integer result.
1f990 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64  .*/.static int d
1f9a0 62 5f 69 6e 74 28 53 68 65 6c 6c 53 74 61 74 65  b_int(ShellState
1f9b0 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
1f9c0 2a 7a 53 71 6c 29 7b 0a 20 20 73 71 6c 69 74 65  *zSql){.  sqlite
1f9d0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20  3_stmt *pStmt;. 
1f9e0 20 69 6e 74 20 72 65 73 20 3d 20 30 3b 0a 20 20   int res = 0;.  
1f9f0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
1fa00 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  v2(p->db, zSql, 
1fa10 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
1fa20 20 20 69 66 28 20 70 53 74 6d 74 20 26 26 20 73    if( pStmt && s
1fa30 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
1fa40 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
1fa50 7b 0a 20 20 20 20 72 65 73 20 3d 20 73 71 6c 69  {.    res = sqli
1fa60 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
1fa70 53 74 6d 74 2c 30 29 3b 0a 20 20 7d 0a 20 20 73  Stmt,0);.  }.  s
1fa80 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
1fa90 70 53 74 6d 74 29 3b 0a 20 20 72 65 74 75 72 6e  pStmt);.  return
1faa0 20 72 65 73 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43   res;.}../*.** C
1fab0 6f 6e 76 65 72 74 20 61 20 32 2d 62 79 74 65 20  onvert a 2-byte 
1fac0 6f 72 20 34 2d 62 79 74 65 20 62 69 67 2d 65 6e  or 4-byte big-en
1fad0 64 69 61 6e 20 69 6e 74 65 67 65 72 20 69 6e 74  dian integer int
1fae0 6f 20 61 20 6e 61 74 69 76 65 20 69 6e 74 65 67  o a native integ
1faf0 65 72 0a 2a 2f 0a 73 74 61 74 69 63 20 75 6e 73  er.*/.static uns
1fb00 69 67 6e 65 64 20 69 6e 74 20 67 65 74 32 62 79  igned int get2by
1fb10 74 65 49 6e 74 28 75 6e 73 69 67 6e 65 64 20 63  teInt(unsigned c
1fb20 68 61 72 20 2a 61 29 7b 0a 20 20 72 65 74 75 72  har *a){.  retur
1fb30 6e 20 28 61 5b 30 5d 3c 3c 38 29 20 2b 20 61 5b  n (a[0]<<8) + a[
1fb40 31 5d 3b 0a 7d 0a 73 74 61 74 69 63 20 75 6e 73  1];.}.static uns
1fb50 69 67 6e 65 64 20 69 6e 74 20 67 65 74 34 62 79  igned int get4by
1fb60 74 65 49 6e 74 28 75 6e 73 69 67 6e 65 64 20 63  teInt(unsigned c
1fb70 68 61 72 20 2a 61 29 7b 0a 20 20 72 65 74 75 72  har *a){.  retur
1fb80 6e 20 28 61 5b 30 5d 3c 3c 32 34 29 20 2b 20 28  n (a[0]<<24) + (
1fb90 61 5b 31 5d 3c 3c 31 36 29 20 2b 20 28 61 5b 32  a[1]<<16) + (a[2
1fba0 5d 3c 3c 38 29 20 2b 20 61 5b 33 5d 3b 0a 7d 0a  ]<<8) + a[3];.}.
1fbb0 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
1fbc0 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 22 2e 69  ation of the ".i
1fbd0 6e 66 6f 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2a  nfo" command..**
1fbe0 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 6f 6e 20  .** Return 1 on 
1fbf0 65 72 72 6f 72 2c 20 32 20 74 6f 20 65 78 69 74  error, 2 to exit
1fc00 2c 20 61 6e 64 20 30 20 6f 74 68 65 72 77 69 73  , and 0 otherwis
1fc10 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
1fc20 20 73 68 65 6c 6c 5f 64 62 69 6e 66 6f 5f 63 6f   shell_dbinfo_co
1fc30 6d 6d 61 6e 64 28 53 68 65 6c 6c 53 74 61 74 65  mmand(ShellState
1fc40 20 2a 70 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63   *p, int nArg, c
1fc50 68 61 72 20 2a 2a 61 7a 41 72 67 29 7b 0a 20 20  har **azArg){.  
1fc60 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
1fc70 75 63 74 20 7b 20 63 6f 6e 73 74 20 63 68 61 72  uct { const char
1fc80 20 2a 7a 4e 61 6d 65 3b 20 69 6e 74 20 6f 66 73   *zName; int ofs
1fc90 74 3b 20 7d 20 61 46 69 65 6c 64 5b 5d 20 3d 20  t; } aField[] = 
1fca0 7b 0a 20 20 20 20 20 7b 20 22 66 69 6c 65 20 63  {.     { "file c
1fcb0 68 61 6e 67 65 20 63 6f 75 6e 74 65 72 3a 22 2c  hange counter:",
1fcc0 20 20 32 34 20 20 7d 2c 0a 20 20 20 20 20 7b 20    24  },.     { 
1fcd0 22 64 61 74 61 62 61 73 65 20 70 61 67 65 20 63  "database page c
1fce0 6f 75 6e 74 3a 22 2c 20 20 32 38 20 20 7d 2c 0a  ount:",  28  },.
1fcf0 20 20 20 20 20 7b 20 22 66 72 65 65 6c 69 73 74       { "freelist
1fd00 20 70 61 67 65 20 63 6f 75 6e 74 3a 22 2c 20 20   page count:",  
1fd10 33 36 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  36  },.     { "s
1fd20 63 68 65 6d 61 20 63 6f 6f 6b 69 65 3a 22 2c 20  chema cookie:", 
1fd30 20 20 20 20 20 20 20 34 30 20 20 7d 2c 0a 20 20         40  },.  
1fd40 20 20 20 7b 20 22 73 63 68 65 6d 61 20 66 6f 72     { "schema for
1fd50 6d 61 74 3a 22 2c 20 20 20 20 20 20 20 20 34 34  mat:",        44
1fd60 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 64 65 66    },.     { "def
1fd70 61 75 6c 74 20 63 61 63 68 65 20 73 69 7a 65 3a  ault cache size:
1fd80 22 2c 20 20 20 34 38 20 20 7d 2c 0a 20 20 20 20  ",   48  },.    
1fd90 20 7b 20 22 61 75 74 6f 76 61 63 75 75 6d 20 74   { "autovacuum t
1fda0 6f 70 20 72 6f 6f 74 3a 22 2c 20 20 35 32 20 20  op root:",  52  
1fdb0 7d 2c 0a 20 20 20 20 20 7b 20 22 69 6e 63 72 65  },.     { "incre
1fdc0 6d 65 6e 74 61 6c 20 76 61 63 75 75 6d 3a 22 2c  mental vacuum:",
1fdd0 20 20 20 36 34 20 20 7d 2c 0a 20 20 20 20 20 7b     64  },.     {
1fde0 20 22 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 3a   "text encoding:
1fdf0 22 2c 20 20 20 20 20 20 20 20 35 36 20 20 7d 2c  ",        56  },
1fe00 0a 20 20 20 20 20 7b 20 22 75 73 65 72 20 76 65  .     { "user ve
1fe10 72 73 69 6f 6e 3a 22 2c 20 20 20 20 20 20 20 20  rsion:",        
1fe20 20 36 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   60  },.     { "
1fe30 61 70 70 6c 69 63 61 74 69 6f 6e 20 69 64 3a 22  application id:"
1fe40 2c 20 20 20 20 20 20 20 36 38 20 20 7d 2c 0a 20  ,       68  },. 
1fe50 20 20 20 20 7b 20 22 73 6f 66 74 77 61 72 65 20      { "software 
1fe60 76 65 72 73 69 6f 6e 3a 22 2c 20 20 20 20 20 39  version:",     9
1fe70 36 20 20 7d 2c 0a 20 20 7d 3b 0a 20 20 73 74 61  6  },.  };.  sta
1fe80 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
1fe90 20 7b 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a   { const char *z
1fea0 4e 61 6d 65 3b 20 63 6f 6e 73 74 20 63 68 61 72  Name; const char
1feb0 20 2a 7a 53 71 6c 3b 20 7d 20 61 51 75 65 72 79   *zSql; } aQuery
1fec0 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22 6e  [] = {.     { "n
1fed0 75 6d 62 65 72 20 6f 66 20 74 61 62 6c 65 73 3a  umber of tables:
1fee0 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43  ",.       "SELEC
1fef0 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
1ff00 25 73 20 57 48 45 52 45 20 74 79 70 65 3d 27 74  %s WHERE type='t
1ff10 61 62 6c 65 27 22 20 7d 2c 0a 20 20 20 20 20 7b  able'" },.     {
1ff20 20 22 6e 75 6d 62 65 72 20 6f 66 20 69 6e 64 65   "number of inde
1ff30 78 65 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 53  xes:",.       "S
1ff40 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
1ff50 52 4f 4d 20 25 73 20 57 48 45 52 45 20 74 79 70  ROM %s WHERE typ
1ff60 65 3d 27 69 6e 64 65 78 27 22 20 7d 2c 0a 20 20  e='index'" },.  
1ff70 20 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20     { "number of 
1ff80 74 72 69 67 67 65 72 73 3a 22 2c 0a 20 20 20 20  triggers:",.    
1ff90 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74     "SELECT count
1ffa0 28 2a 29 20 46 52 4f 4d 20 25 73 20 57 48 45 52  (*) FROM %s WHER
1ffb0 45 20 74 79 70 65 3d 27 74 72 69 67 67 65 72 27  E type='trigger'
1ffc0 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6e 75 6d  " },.     { "num
1ffd0 62 65 72 20 6f 66 20 76 69 65 77 73 3a 22 2c 0a  ber of views:",.
1ffe0 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63         "SELECT c
1fff0 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20  ount(*) FROM %s 
20000 57 48 45 52 45 20 74 79 70 65 3d 27 76 69 65 77  WHERE type='view
20010 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63  '" },.     { "sc
20020 68 65 6d 61 20 73 69 7a 65 3a 22 2c 0a 20 20 20  hema size:",.   
20030 20 20 20 20 22 53 45 4c 45 43 54 20 74 6f 74 61      "SELECT tota
20040 6c 28 6c 65 6e 67 74 68 28 73 71 6c 29 29 20 46  l(length(sql)) F
20050 52 4f 4d 20 25 73 22 20 7d 2c 0a 20 20 7d 3b 0a  ROM %s" },.  };.
20060 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20    int i;.  char 
20070 2a 7a 53 63 68 65 6d 61 54 61 62 3b 0a 20 20 63  *zSchemaTab;.  c
20080 68 61 72 20 2a 7a 44 62 20 3d 20 6e 41 72 67 3e  har *zDb = nArg>
20090 3d 32 20 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20  =2 ? azArg[1] : 
200a0 22 6d 61 69 6e 22 3b 0a 20 20 73 71 6c 69 74 65  "main";.  sqlite
200b0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
200c0 30 3b 0a 20 20 75 6e 73 69 67 6e 65 64 20 63 68  0;.  unsigned ch
200d0 61 72 20 61 48 64 72 5b 31 30 30 5d 3b 0a 20 20  ar aHdr[100];.  
200e0 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
200f0 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 20   if( p->db==0 ) 
20100 72 65 74 75 72 6e 20 31 3b 0a 20 20 73 71 6c 69  return 1;.  sqli
20110 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
20120 2d 3e 64 62 2c 22 53 45 4c 45 43 54 20 64 61 74  ->db,"SELECT dat
20130 61 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 64 62  a FROM sqlite_db
20140 70 61 67 65 28 3f 31 29 20 57 48 45 52 45 20 70  page(?1) WHERE p
20150 67 6e 6f 3d 31 22 2c 0a 20 20 20 20 20 20 20 20  gno=1",.        
20160 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c               -1,
20170 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 73   &pStmt, 0);.  s
20180 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
20190 28 70 53 74 6d 74 2c 20 31 2c 20 7a 44 62 2c 20  (pStmt, 1, zDb, 
201a0 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
201b0 43 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  C);.  if( sqlite
201c0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53  3_step(pStmt)==S
201d0 51 4c 49 54 45 5f 52 4f 57 0a 20 20 20 26 26 20  QLITE_ROW.   && 
201e0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
201f0 79 74 65 73 28 70 53 74 6d 74 2c 30 29 3e 31 30  ytes(pStmt,0)>10
20200 30 0a 20 20 29 7b 0a 20 20 20 20 6d 65 6d 63 70  0.  ){.    memcp
20210 79 28 61 48 64 72 2c 20 73 71 6c 69 74 65 33 5f  y(aHdr, sqlite3_
20220 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 53 74 6d  column_blob(pStm
20230 74 2c 30 29 2c 20 31 30 30 29 3b 0a 20 20 20 20  t,0), 100);.    
20240 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
20250 28 70 53 74 6d 74 29 3b 0a 20 20 7d 65 6c 73 65  (pStmt);.  }else
20260 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  {.    raw_printf
20270 28 73 74 64 65 72 72 2c 20 22 75 6e 61 62 6c 65  (stderr, "unable
20280 20 74 6f 20 72 65 61 64 20 64 61 74 61 62 61 73   to read databas
20290 65 20 68 65 61 64 65 72 5c 6e 22 29 3b 0a 20 20  e header\n");.  
202a0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
202b0 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 72  ze(pStmt);.    r
202c0 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 69  eturn 1;.  }.  i
202d0 20 3d 20 67 65 74 32 62 79 74 65 49 6e 74 28 61   = get2byteInt(a
202e0 48 64 72 2b 31 36 29 3b 0a 20 20 69 66 28 20 69  Hdr+16);.  if( i
202f0 3d 3d 31 20 29 20 69 20 3d 20 36 35 35 33 36 3b  ==1 ) i = 65536;
20300 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70  .  utf8_printf(p
20310 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64  ->out, "%-20s %d
20320 5c 6e 22 2c 20 22 64 61 74 61 62 61 73 65 20 70  \n", "database p
20330 61 67 65 20 73 69 7a 65 3a 22 2c 20 69 29 3b 0a  age size:", i);.
20340 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
20350 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64 5c  >out, "%-20s %d\
20360 6e 22 2c 20 22 77 72 69 74 65 20 66 6f 72 6d 61  n", "write forma
20370 74 3a 22 2c 20 61 48 64 72 5b 31 38 5d 29 3b 0a  t:", aHdr[18]);.
20380 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
20390 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64 5c  >out, "%-20s %d\
203a0 6e 22 2c 20 22 72 65 61 64 20 66 6f 72 6d 61 74  n", "read format
203b0 3a 22 2c 20 61 48 64 72 5b 31 39 5d 29 3b 0a 20  :", aHdr[19]);. 
203c0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
203d0 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e  out, "%-20s %d\n
203e0 22 2c 20 22 72 65 73 65 72 76 65 64 20 62 79 74  ", "reserved byt
203f0 65 73 3a 22 2c 20 61 48 64 72 5b 32 30 5d 29 3b  es:", aHdr[20]);
20400 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72  .  for(i=0; i<Ar
20410 72 61 79 53 69 7a 65 28 61 46 69 65 6c 64 29 3b  raySize(aField);
20420 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6f   i++){.    int o
20430 66 73 74 20 3d 20 61 46 69 65 6c 64 5b 69 5d 2e  fst = aField[i].
20440 6f 66 73 74 3b 0a 20 20 20 20 75 6e 73 69 67 6e  ofst;.    unsign
20450 65 64 20 69 6e 74 20 76 61 6c 20 3d 20 67 65 74  ed int val = get
20460 34 62 79 74 65 49 6e 74 28 61 48 64 72 20 2b 20  4byteInt(aHdr + 
20470 6f 66 73 74 29 3b 0a 20 20 20 20 75 74 66 38 5f  ofst);.    utf8_
20480 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
20490 25 2d 32 30 73 20 25 75 22 2c 20 61 46 69 65 6c  %-20s %u", aFiel
204a0 64 5b 69 5d 2e 7a 4e 61 6d 65 2c 20 76 61 6c 29  d[i].zName, val)
204b0 3b 0a 20 20 20 20 73 77 69 74 63 68 28 20 6f 66  ;.    switch( of
204c0 73 74 20 29 7b 0a 20 20 20 20 20 20 63 61 73 65  st ){.      case
204d0 20 35 36 3a 20 7b 0a 20 20 20 20 20 20 20 20 69   56: {.        i
204e0 66 28 20 76 61 6c 3d 3d 31 20 29 20 72 61 77 5f  f( val==1 ) raw_
204f0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
20500 20 28 75 74 66 38 29 22 29 3b 0a 20 20 20 20 20   (utf8)");.     
20510 20 20 20 69 66 28 20 76 61 6c 3d 3d 32 20 29 20     if( val==2 ) 
20520 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
20530 74 2c 20 22 20 28 75 74 66 31 36 6c 65 29 22 29  t, " (utf16le)")
20540 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 76 61  ;.        if( va
20550 6c 3d 3d 33 20 29 20 72 61 77 5f 70 72 69 6e 74  l==3 ) raw_print
20560 66 28 70 2d 3e 6f 75 74 2c 20 22 20 28 75 74 66  f(p->out, " (utf
20570 31 36 62 65 29 22 29 3b 0a 20 20 20 20 20 20 7d  16be)");.      }
20580 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70  .    }.    raw_p
20590 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c  rintf(p->out, "\
205a0 6e 22 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 7a  n");.  }.  if( z
205b0 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 7a 53 63  Db==0 ){.    zSc
205c0 68 65 6d 61 54 61 62 20 3d 20 73 71 6c 69 74 65  hemaTab = sqlite
205d0 33 5f 6d 70 72 69 6e 74 66 28 22 6d 61 69 6e 2e  3_mprintf("main.
205e0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 29 3b  sqlite_master");
205f0 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72  .  }else if( str
20600 63 6d 70 28 7a 44 62 2c 22 74 65 6d 70 22 29 3d  cmp(zDb,"temp")=
20610 3d 30 20 29 7b 0a 20 20 20 20 7a 53 63 68 65 6d  =0 ){.    zSchem
20620 61 54 61 62 20 3d 20 73 71 6c 69 74 65 33 5f 6d  aTab = sqlite3_m
20630 70 72 69 6e 74 66 28 22 25 73 22 2c 20 22 73 71  printf("%s", "sq
20640 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
20650 22 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ");.  }else{.   
20660 20 7a 53 63 68 65 6d 61 54 61 62 20 3d 20 73 71   zSchemaTab = sq
20670 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 5c  lite3_mprintf("\
20680 22 25 77 5c 22 2e 73 71 6c 69 74 65 5f 6d 61 73  "%w\".sqlite_mas
20690 74 65 72 22 2c 20 7a 44 62 29 3b 0a 20 20 7d 0a  ter", zDb);.  }.
206a0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
206b0 61 79 53 69 7a 65 28 61 51 75 65 72 79 29 3b 20  aySize(aQuery); 
206c0 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  i++){.    char *
206d0 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
206e0 70 72 69 6e 74 66 28 61 51 75 65 72 79 5b 69 5d  printf(aQuery[i]
206f0 2e 7a 53 71 6c 2c 20 7a 53 63 68 65 6d 61 54 61  .zSql, zSchemaTa
20700 62 29 3b 0a 20 20 20 20 69 6e 74 20 76 61 6c 20  b);.    int val 
20710 3d 20 64 62 5f 69 6e 74 28 70 2c 20 7a 53 71 6c  = db_int(p, zSql
20720 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
20730 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 75  ree(zSql);.    u
20740 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
20750 74 2c 20 22 25 2d 32 30 73 20 25 64 5c 6e 22 2c  t, "%-20s %d\n",
20760 20 61 51 75 65 72 79 5b 69 5d 2e 7a 4e 61 6d 65   aQuery[i].zName
20770 2c 20 76 61 6c 29 3b 0a 20 20 7d 0a 20 20 73 71  , val);.  }.  sq
20780 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 63 68 65  lite3_free(zSche
20790 6d 61 54 61 62 29 3b 0a 20 20 72 65 74 75 72 6e  maTab);.  return
207a0 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69   0;.}../*.** Pri
207b0 6e 74 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  nt the current s
207c0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 29 20  qlite3_errmsg() 
207d0 76 61 6c 75 65 20 74 6f 20 73 74 64 65 72 72 20  value to stderr 
207e0 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 0a 2a 2f  and return 1..*/
207f0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c  .static int shel
20800 6c 44 61 74 61 62 61 73 65 45 72 72 6f 72 28 73  lDatabaseError(s
20810 71 6c 69 74 65 33 20 2a 64 62 29 7b 0a 20 20 63  qlite3 *db){.  c
20820 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 20  onst char *zErr 
20830 3d 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  = sqlite3_errmsg
20840 28 64 62 29 3b 0a 20 20 75 74 66 38 5f 70 72 69  (db);.  utf8_pri
20850 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
20860 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29  or: %s\n", zErr)
20870 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a  ;.  return 1;.}.
20880 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 6e 20  ./*.** Print an 
20890 6f 75 74 2d 6f 66 2d 6d 65 6d 6f 72 79 20 6d 65  out-of-memory me
208a0 73 73 61 67 65 20 74 6f 20 73 74 64 65 72 72 20  ssage to stderr 
208b0 61 6e 64 20 72 65 74 75 72 6e 20 31 2e 0a 2a 2f  and return 1..*/
208c0 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c  .static int shel
208d0 6c 4e 6f 6d 65 6d 45 72 72 6f 72 28 76 6f 69 64  lNomemError(void
208e0 29 7b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28  ){.  raw_printf(
208f0 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
20900 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22  out of memory\n"
20910 29 3b 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d  );.  return 1;.}
20920 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
20930 74 68 65 20 70 61 74 74 65 72 6e 20 69 6e 20 7a  the pattern in z
20940 47 6c 6f 62 5b 5d 20 61 67 61 69 6e 73 74 20 74  Glob[] against t
20950 68 65 20 74 65 78 74 20 69 6e 20 7a 5b 5d 2e 20  he text in z[]. 
20960 20 52 65 74 75 72 6e 20 54 52 55 45 0a 2a 2a 20   Return TRUE.** 
20970 69 66 20 74 68 65 79 20 6d 61 74 63 68 20 61 6e  if they match an
20980 64 20 46 41 4c 53 45 20 28 30 29 20 69 66 20 74  d FALSE (0) if t
20990 68 65 79 20 64 6f 20 6e 6f 74 20 6d 61 74 63 68  hey do not match
209a0 2e 0a 2a 2a 0a 2a 2a 20 47 6c 6f 62 62 69 6e 67  ..**.** Globbing
209b0 20 72 75 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20   rules:.**.**   
209c0 20 20 20 27 2a 27 20 20 20 20 20 20 20 4d 61 74     '*'       Mat
209d0 63 68 65 73 20 61 6e 79 20 73 65 71 75 65 6e 63  ches any sequenc
209e0 65 20 6f 66 20 7a 65 72 6f 20 6f 72 20 6d 6f 72  e of zero or mor
209f0 65 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a  e characters..**
20a00 0a 2a 2a 20 20 20 20 20 20 27 3f 27 20 20 20 20  .**      '?'    
20a10 20 20 20 4d 61 74 63 68 65 73 20 65 78 61 63 74     Matches exact
20a20 6c 79 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72  ly one character
20a30 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b 2e 2e 2e  ..**.**     [...
20a40 5d 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 6f  ]      Matches o
20a50 6e 65 20 63 68 61 72 61 63 74 65 72 20 66 72 6f  ne character fro
20a60 6d 20 74 68 65 20 65 6e 63 6c 6f 73 65 64 20 6c  m the enclosed l
20a70 69 73 74 20 6f 66 0a 2a 2a 20 20 20 20 20 20 20  ist of.**       
20a80 20 20 20 20 20 20 20 20 20 63 68 61 72 61 63 74           charact
20a90 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 5b  ers..**.**     [
20aa0 5e 2e 2e 2e 5d 20 20 20 20 20 4d 61 74 63 68 65  ^...]     Matche
20ab0 73 20 6f 6e 65 20 63 68 61 72 61 63 74 65 72 20  s one character 
20ac0 6e 6f 74 20 69 6e 20 74 68 65 20 65 6e 63 6c 6f  not in the enclo
20ad0 73 65 64 20 6c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  sed list..**.** 
20ae0 20 20 20 20 20 27 23 27 20 20 20 20 20 20 20 4d       '#'       M
20af0 61 74 63 68 65 73 20 61 6e 79 20 73 65 71 75 65  atches any seque
20b00 6e 63 65 20 6f 66 20 6f 6e 65 20 6f 72 20 6d 6f  nce of one or mo
20b10 72 65 20 64 69 67 69 74 73 20 77 69 74 68 20 61  re digits with a
20b20 6e 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  n.**            
20b30 20 20 20 20 6f 70 74 69 6f 6e 61 6c 20 2b 20 6f      optional + o
20b40 72 20 2d 20 73 69 67 6e 20 69 6e 20 66 72 6f 6e  r - sign in fron
20b50 74 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 20 27  t.**.**      ' '
20b60 20 20 20 20 20 20 20 41 6e 79 20 73 70 61 6e 20         Any span 
20b70 6f 66 20 77 68 69 74 65 73 70 61 63 65 20 6d 61  of whitespace ma
20b80 74 63 68 65 73 20 61 6e 79 20 6f 74 68 65 72 20  tches any other 
20b90 73 70 61 6e 20 6f 66 0a 2a 2a 20 20 20 20 20 20  span of.**      
20ba0 20 20 20 20 20 20 20 20 20 20 77 68 69 74 65 73            whites
20bb0 70 61 63 65 2e 0a 2a 2a 0a 2a 2a 20 45 78 74 72  pace..**.** Extr
20bc0 61 20 77 68 69 74 65 73 70 61 63 65 20 61 74 20  a whitespace at 
20bd0 74 68 65 20 65 6e 64 20 6f 66 20 7a 5b 5d 20 69  the end of z[] i
20be0 73 20 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 73 74  s ignored..*/.st
20bf0 61 74 69 63 20 69 6e 74 20 74 65 73 74 63 61 73  atic int testcas
20c00 65 5f 67 6c 6f 62 28 63 6f 6e 73 74 20 63 68 61  e_glob(const cha
20c10 72 20 2a 7a 47 6c 6f 62 2c 20 63 6f 6e 73 74 20  r *zGlob, const 
20c20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
20c30 63 2c 20 63 32 3b 0a 20 20 69 6e 74 20 69 6e 76  c, c2;.  int inv
20c40 65 72 74 3b 0a 20 20 69 6e 74 20 73 65 65 6e 3b  ert;.  int seen;
20c50 0a 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20  ..  while( (c = 
20c60 28 2a 28 7a 47 6c 6f 62 2b 2b 29 29 29 21 3d 30  (*(zGlob++)))!=0
20c70 20 29 7b 0a 20 20 20 20 69 66 28 20 49 73 53 70   ){.    if( IsSp
20c80 61 63 65 28 63 29 20 29 7b 0a 20 20 20 20 20 20  ace(c) ){.      
20c90 69 66 28 20 21 49 73 53 70 61 63 65 28 2a 7a 29  if( !IsSpace(*z)
20ca0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
20cb0 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63     while( IsSpac
20cc0 65 28 2a 7a 47 6c 6f 62 29 20 29 20 7a 47 6c 6f  e(*zGlob) ) zGlo
20cd0 62 2b 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  b++;.      while
20ce0 28 20 49 73 53 70 61 63 65 28 2a 7a 29 20 29 20  ( IsSpace(*z) ) 
20cf0 7a 2b 2b 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  z++;.    }else i
20d00 66 28 20 63 3d 3d 27 2a 27 20 29 7b 0a 20 20 20  f( c=='*' ){.   
20d10 20 20 20 77 68 69 6c 65 28 20 28 63 3d 28 2a 28     while( (c=(*(
20d20 7a 47 6c 6f 62 2b 2b 29 29 29 20 3d 3d 20 27 2a  zGlob++))) == '*
20d30 27 20 7c 7c 20 63 3d 3d 27 3f 27 20 29 7b 0a 20  ' || c=='?' ){. 
20d40 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 3f         if( c=='?
20d50 27 20 26 26 20 28 2a 28 7a 2b 2b 29 29 3d 3d 30  ' && (*(z++))==0
20d60 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
20d70 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
20d80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==0 ){.        r
20d90 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
20da0 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b 27 20  else if( c=='[' 
20db0 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
20dc0 28 20 2a 7a 20 26 26 20 74 65 73 74 63 61 73 65  ( *z && testcase
20dd0 5f 67 6c 6f 62 28 7a 47 6c 6f 62 2d 31 2c 7a 29  _glob(zGlob-1,z)
20de0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
20df0 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a   z++;.        }.
20e00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 28          return (
20e10 2a 7a 29 21 3d 30 3b 0a 20 20 20 20 20 20 7d 0a  *z)!=0;.      }.
20e20 20 20 20 20 20 20 77 68 69 6c 65 28 20 28 63 32        while( (c2
20e30 20 3d 20 28 2a 28 7a 2b 2b 29 29 29 21 3d 30 20   = (*(z++)))!=0 
20e40 29 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  ){.        while
20e50 28 20 63 32 21 3d 63 20 29 7b 0a 20 20 20 20 20  ( c2!=c ){.     
20e60 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 2b 2b 29       c2 = *(z++)
20e70 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
20e80 63 32 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  c2==0 ) return 0
20e90 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
20ea0 20 20 20 20 69 66 28 20 74 65 73 74 63 61 73 65      if( testcase
20eb0 5f 67 6c 6f 62 28 7a 47 6c 6f 62 2c 7a 29 20 29  _glob(zGlob,z) )
20ec0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
20ed0 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
20ee0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
20ef0 20 63 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 20   c=='?' ){.     
20f00 20 69 66 28 20 28 2a 28 7a 2b 2b 29 29 3d 3d 30   if( (*(z++))==0
20f10 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
20f20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b   }else if( c=='[
20f30 27 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 70  ' ){.      int p
20f40 72 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20  rior_c = 0;.    
20f50 20 20 73 65 65 6e 20 3d 20 30 3b 0a 20 20 20 20    seen = 0;.    
20f60 20 20 69 6e 76 65 72 74 20 3d 20 30 3b 0a 20 20    invert = 0;.  
20f70 20 20 20 20 63 20 3d 20 2a 28 7a 2b 2b 29 3b 0a      c = *(z++);.
20f80 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29        if( c==0 )
20f90 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
20fa0 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29   c2 = *(zGlob++)
20fb0 3b 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d  ;.      if( c2==
20fc0 27 5e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  '^' ){.        i
20fd0 6e 76 65 72 74 20 3d 20 31 3b 0a 20 20 20 20 20  nvert = 1;.     
20fe0 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b     c2 = *(zGlob+
20ff0 2b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  +);.      }.    
21000 20 20 69 66 28 20 63 32 3d 3d 27 5d 27 20 29 7b    if( c2==']' ){
21010 0a 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d  .        if( c==
21020 27 5d 27 20 29 20 73 65 65 6e 20 3d 20 31 3b 0a  ']' ) seen = 1;.
21030 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a          c2 = *(z
21040 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d  Glob++);.      }
21050 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 63 32  .      while( c2
21060 20 26 26 20 63 32 21 3d 27 5d 27 20 29 7b 0a 20   && c2!=']' ){. 
21070 20 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d 27         if( c2=='
21080 2d 27 20 26 26 20 7a 47 6c 6f 62 5b 30 5d 21 3d  -' && zGlob[0]!=
21090 27 5d 27 20 26 26 20 7a 47 6c 6f 62 5b 30 5d 21  ']' && zGlob[0]!
210a0 3d 30 20 26 26 20 70 72 69 6f 72 5f 63 3e 30 20  =0 && prior_c>0 
210b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 32 20  ){.          c2 
210c0 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20  = *(zGlob++);.  
210d0 20 20 20 20 20 20 20 20 69 66 28 20 63 3e 3d 70          if( c>=p
210e0 72 69 6f 72 5f 63 20 26 26 20 63 3c 3d 63 32 20  rior_c && c<=c2 
210f0 29 20 73 65 65 6e 20 3d 20 31 3b 0a 20 20 20 20  ) seen = 1;.    
21100 20 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d 20        prior_c = 
21110 30 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  0;.        }else
21120 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
21130 63 3d 3d 63 32 20 29 7b 0a 20 20 20 20 20 20 20  c==c2 ){.       
21140 20 20 20 20 20 73 65 65 6e 20 3d 20 31 3b 0a 20       seen = 1;. 
21150 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
21160 20 20 20 20 20 70 72 69 6f 72 5f 63 20 3d 20 63       prior_c = c
21170 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  2;.        }.   
21180 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f       c2 = *(zGlo
21190 62 2b 2b 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  b++);.      }.  
211a0 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20 7c 7c      if( c2==0 ||
211b0 20 28 73 65 65 6e 20 5e 20 69 6e 76 65 72 74 29   (seen ^ invert)
211c0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
211d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d      }else if( c=
211e0 3d 27 23 27 20 29 7b 0a 20 20 20 20 20 20 69 66  ='#' ){.      if
211f0 28 20 28 7a 5b 30 5d 3d 3d 27 2d 27 20 7c 7c 20  ( (z[0]=='-' || 
21200 7a 5b 30 5d 3d 3d 27 2b 27 29 20 26 26 20 49 73  z[0]=='+') && Is
21210 44 69 67 69 74 28 7a 5b 31 5d 29 20 29 20 7a 2b  Digit(z[1]) ) z+
21220 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 21 49 73  +;.      if( !Is
21230 44 69 67 69 74 28 7a 5b 30 5d 29 20 29 20 72 65  Digit(z[0]) ) re
21240 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7a 2b  turn 0;.      z+
21250 2b 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  +;.      while( 
21260 49 73 44 69 67 69 74 28 7a 5b 30 5d 29 20 29 7b  IsDigit(z[0]) ){
21270 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 7d 65 6c 73   z++; }.    }els
21280 65 7b 0a 20 20 20 20 20 20 69 66 28 20 63 21 3d  e{.      if( c!=
21290 28 2a 28 7a 2b 2b 29 29 20 29 20 72 65 74 75 72  (*(z++)) ) retur
212a0 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  n 0;.    }.  }. 
212b0 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28   while( IsSpace(
212c0 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20  *z) ){ z++; }.  
212d0 72 65 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a  return *z==0;.}.
212e0 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65 20  ../*.** Compare 
212f0 74 68 65 20 73 74 72 69 6e 67 20 61 73 20 61 20  the string as a 
21300 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 6f 70 74  command-line opt
21310 69 6f 6e 20 77 69 74 68 20 65 69 74 68 65 72 20  ion with either 
21320 6f 6e 65 20 6f 72 20 74 77 6f 0a 2a 2a 20 69 6e  one or two.** in
21330 69 74 69 61 6c 20 22 2d 22 20 63 68 61 72 61 63  itial "-" charac
21340 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ters..*/.static 
21350 69 6e 74 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28  int optionMatch(
21360 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 72  const char *zStr
21370 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f  , const char *zO
21380 70 74 29 7b 0a 20 20 69 66 28 20 7a 53 74 72 5b  pt){.  if( zStr[
21390 30 5d 21 3d 27 2d 27 20 29 20 72 65 74 75 72 6e  0]!='-' ) return
213a0 20 30 3b 0a 20 20 7a 53 74 72 2b 2b 3b 0a 20 20   0;.  zStr++;.  
213b0 69 66 28 20 7a 53 74 72 5b 30 5d 3d 3d 27 2d 27  if( zStr[0]=='-'
213c0 20 29 20 7a 53 74 72 2b 2b 3b 0a 20 20 72 65 74   ) zStr++;.  ret
213d0 75 72 6e 20 73 74 72 63 6d 70 28 7a 53 74 72 2c  urn strcmp(zStr,
213e0 20 7a 4f 70 74 29 3d 3d 30 3b 0a 7d 0a 0a 2f 2a   zOpt)==0;.}../*
213f0 0a 2a 2a 20 44 65 6c 65 74 65 20 61 20 66 69 6c  .** Delete a fil
21400 65 2e 0a 2a 2f 0a 69 6e 74 20 73 68 65 6c 6c 44  e..*/.int shellD
21410 65 6c 65 74 65 46 69 6c 65 28 63 6f 6e 73 74 20  eleteFile(const 
21420 63 68 61 72 20 2a 7a 46 69 6c 65 6e 61 6d 65 29  char *zFilename)
21430 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 23 69 66 64  {.  int rc;.#ifd
21440 65 66 20 5f 57 49 4e 33 32 0a 20 20 77 63 68 61  ef _WIN32.  wcha
21450 72 5f 74 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33  r_t *z = sqlite3
21460 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 75  _win32_utf8_to_u
21470 6e 69 63 6f 64 65 28 7a 46 69 6c 65 6e 61 6d 65  nicode(zFilename
21480 29 3b 0a 20 20 72 63 20 3d 20 5f 77 75 6e 6c 69  );.  rc = _wunli
21490 6e 6b 28 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33  nk(z);.  sqlite3
214a0 5f 66 72 65 65 28 7a 29 3b 0a 23 65 6c 73 65 0a  _free(z);.#else.
214b0 20 20 72 63 20 3d 20 75 6e 6c 69 6e 6b 28 7a 46    rc = unlink(zF
214c0 69 6c 65 6e 61 6d 65 29 3b 0a 23 65 6e 64 69 66  ilename);.#endif
214d0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
214e0 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 64 65  ./*.** Try to de
214f0 6c 65 74 65 20 74 68 65 20 74 65 6d 70 6f 72 61  lete the tempora
21500 72 79 20 66 69 6c 65 20 28 69 66 20 74 68 65 72  ry file (if ther
21510 65 20 69 73 20 6f 6e 65 29 20 61 6e 64 20 66 72  e is one) and fr
21520 65 65 20 74 68 65 0a 2a 2a 20 6d 65 6d 6f 72 79  ee the.** memory
21530 20 75 73 65 64 20 74 6f 20 68 6f 6c 64 20 74 68   used to hold th
21540 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 65  e name of the te
21550 6d 70 20 66 69 6c 65 2e 0a 2a 2f 0a 73 74 61 74  mp file..*/.stat
21560 69 63 20 76 6f 69 64 20 63 6c 65 61 72 54 65 6d  ic void clearTem
21570 70 46 69 6c 65 28 53 68 65 6c 6c 53 74 61 74 65  pFile(ShellState
21580 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 2d 3e 7a   *p){.  if( p->z
21590 54 65 6d 70 46 69 6c 65 3d 3d 30 20 29 20 72 65  TempFile==0 ) re
215a0 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 64  turn;.  if( p->d
215b0 6f 58 64 67 4f 70 65 6e 20 29 20 72 65 74 75 72  oXdgOpen ) retur
215c0 6e 3b 0a 20 20 69 66 28 20 73 68 65 6c 6c 44 65  n;.  if( shellDe
215d0 6c 65 74 65 46 69 6c 65 28 70 2d 3e 7a 54 65 6d  leteFile(p->zTem
215e0 70 46 69 6c 65 29 20 29 20 72 65 74 75 72 6e 3b  pFile) ) return;
215f0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
21600 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 3b 0a 20  p->zTempFile);. 
21610 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 20 3d 20   p->zTempFile = 
21620 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65 61  0;.}../*.** Crea
21630 74 65 20 61 20 6e 65 77 20 74 65 6d 70 20 66 69  te a new temp fi
21640 6c 65 20 6e 61 6d 65 20 77 69 74 68 20 74 68 65  le name with the
21650 20 67 69 76 65 6e 20 73 75 66 66 69 78 2e 0a 2a   given suffix..*
21660 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e 65  /.static void ne
21670 77 54 65 6d 70 46 69 6c 65 28 53 68 65 6c 6c 53  wTempFile(ShellS
21680 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  tate *p, const c
21690 68 61 72 20 2a 7a 53 75 66 66 69 78 29 7b 0a 20  har *zSuffix){. 
216a0 20 63 6c 65 61 72 54 65 6d 70 46 69 6c 65 28 70   clearTempFile(p
216b0 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65  );.  sqlite3_fre
216c0 65 28 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29 3b  e(p->zTempFile);
216d0 0a 20 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 20  .  p->zTempFile 
216e0 3d 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62  = 0;.  if( p->db
216f0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
21700 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e  file_control(p->
21710 64 62 2c 20 30 2c 20 53 51 4c 49 54 45 5f 46 43  db, 0, SQLITE_FC
21720 4e 54 4c 5f 54 45 4d 50 46 49 4c 45 4e 41 4d 45  NTL_TEMPFILENAME
21730 2c 20 26 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 29  , &p->zTempFile)
21740 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 7a  ;.  }.  if( p->z
21750 54 65 6d 70 46 69 6c 65 3d 3d 30 20 29 7b 0a 20  TempFile==0 ){. 
21760 20 20 20 73 71 6c 69 74 65 33 5f 75 69 6e 74 36     sqlite3_uint6
21770 34 20 72 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  4 r;.    sqlite3
21780 5f 72 61 6e 64 6f 6d 6e 65 73 73 28 73 69 7a 65  _randomness(size
21790 6f 66 28 72 29 2c 20 26 72 29 3b 0a 20 20 20 20  of(r), &r);.    
217a0 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 20 3d 20 73  p->zTempFile = s
217b0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
217c0 74 65 6d 70 25 6c 6c 78 2e 25 73 22 2c 20 72 2c  temp%llx.%s", r,
217d0 20 7a 53 75 66 66 69 78 29 3b 0a 20 20 7d 65 6c   zSuffix);.  }el
217e0 73 65 7b 0a 20 20 20 20 70 2d 3e 7a 54 65 6d 70  se{.    p->zTemp
217f0 46 69 6c 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  File = sqlite3_m
21800 70 72 69 6e 74 66 28 22 25 7a 2e 25 73 22 2c 20  printf("%z.%s", 
21810 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 2c 20 7a 53  p->zTempFile, zS
21820 75 66 66 69 78 29 3b 0a 20 20 7d 0a 20 20 69 66  uffix);.  }.  if
21830 28 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 3d 3d  ( p->zTempFile==
21840 30 20 29 7b 0a 20 20 20 20 72 61 77 5f 70 72 69  0 ){.    raw_pri
21850 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6f 75 74  ntf(stderr, "out
21860 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a   of memory\n");.
21870 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
21880 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69  .}.../*.** The i
21890 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
218a0 20 53 51 4c 20 73 63 61 6c 61 72 20 66 75 6e 63   SQL scalar func
218b0 74 69 6f 6e 20 66 6b 65 79 5f 63 6f 6c 6c 61 74  tion fkey_collat
218c0 65 5f 63 6c 61 75 73 65 28 29 2c 20 75 73 65 64  e_clause(), used
218d0 0a 2a 2a 20 62 79 20 74 68 65 20 22 2e 6c 69 6e  .** by the ".lin
218e0 74 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 22 20  t fkey-indexes" 
218f0 63 6f 6d 6d 61 6e 64 2e 20 54 68 69 73 20 73 63  command. This sc
21900 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e 20 69 73  alar function is
21910 20 61 6c 77 61 79 73 0a 2a 2a 20 63 61 6c 6c 65   always.** calle
21920 64 20 77 69 74 68 20 66 6f 75 72 20 61 72 67 75  d with four argu
21930 6d 65 6e 74 73 20 2d 20 74 68 65 20 70 61 72 65  ments - the pare
21940 6e 74 20 74 61 62 6c 65 20 6e 61 6d 65 2c 20 74  nt table name, t
21950 68 65 20 70 61 72 65 6e 74 20 63 6f 6c 75 6d 6e  he parent column
21960 20 6e 61 6d 65 2c 0a 2a 2a 20 74 68 65 20 63 68   name,.** the ch
21970 69 6c 64 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  ild table name a
21980 6e 64 20 74 68 65 20 63 68 69 6c 64 20 63 6f 6c  nd the child col
21990 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2a 0a 2a 2a 20  umn name..**.** 
219a0 20 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63    fkey_collate_c
219b0 6c 61 75 73 65 28 27 70 61 72 65 6e 74 2d 74 61  lause('parent-ta
219c0 62 27 2c 20 27 70 61 72 65 6e 74 2d 63 6f 6c 27  b', 'parent-col'
219d0 2c 20 27 63 68 69 6c 64 2d 74 61 62 27 2c 20 27  , 'child-tab', '
219e0 63 68 69 6c 64 2d 63 6f 6c 27 29 0a 2a 2a 0a 2a  child-col').**.*
219f0 2a 20 49 66 20 65 69 74 68 65 72 20 6f 66 20 74  * If either of t
21a00 68 65 20 6e 61 6d 65 64 20 74 61 62 6c 65 73 20  he named tables 
21a10 6f 72 20 63 6f 6c 75 6d 6e 73 20 64 6f 20 6e 6f  or columns do no
21a20 74 20 65 78 69 73 74 2c 20 74 68 69 73 20 66 75  t exist, this fu
21a30 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 74 75 72 6e  nction.** return
21a40 73 20 61 6e 20 65 6d 70 74 79 20 73 74 72 69 6e  s an empty strin
21a50 67 2e 20 41 6e 20 65 6d 70 74 79 20 73 74 72 69  g. An empty stri
21a60 6e 67 20 69 73 20 61 6c 73 6f 20 72 65 74 75 72  ng is also retur
21a70 6e 65 64 20 69 66 20 62 6f 74 68 20 74 61 62 6c  ned if both tabl
21a80 65 73 0a 2a 2a 20 61 6e 64 20 63 6f 6c 75 6d 6e  es.** and column
21a90 73 20 65 78 69 73 74 20 62 75 74 20 68 61 76 65  s exist but have
21aa0 20 74 68 65 20 73 61 6d 65 20 64 65 66 61 75 6c   the same defaul
21ab0 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75  t collation sequ
21ac0 65 6e 63 65 2e 20 4f 72 2c 0a 2a 2a 20 69 66 20  ence. Or,.** if 
21ad0 62 6f 74 68 20 65 78 69 73 74 20 62 75 74 20 74  both exist but t
21ae0 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61  he default colla
21af0 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 73 20 61  tion sequences a
21b00 72 65 20 64 69 66 66 65 72 65 6e 74 2c 20 74 68  re different, th
21b10 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 72  is.** function r
21b20 65 74 75 72 6e 73 20 74 68 65 20 73 74 72 69 6e  eturns the strin
21b30 67 20 22 20 43 4f 4c 4c 41 54 45 20 3c 70 61 72  g " COLLATE <par
21b40 65 6e 74 2d 63 6f 6c 6c 61 74 69 6f 6e 3e 22 2c  ent-collation>",
21b50 20 77 68 65 72 65 0a 2a 2a 20 3c 70 61 72 65 6e   where.** <paren
21b60 74 2d 63 6f 6c 6c 61 74 69 6f 6e 3e 20 69 73 20  t-collation> is 
21b70 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c  the default coll
21b80 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 6f  ation sequence o
21b90 66 20 74 68 65 20 70 61 72 65 6e 74 20 63 6f 6c  f the parent col
21ba0 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  umn..*/.static v
21bb0 6f 69 64 20 73 68 65 6c 6c 46 6b 65 79 43 6f 6c  oid shellFkeyCol
21bc0 6c 61 74 65 43 6c 61 75 73 65 28 0a 20 20 73 71  lateClause(.  sq
21bd0 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70  lite3_context *p
21be0 43 74 78 2c 0a 20 20 69 6e 74 20 6e 56 61 6c 2c  Ctx,.  int nVal,
21bf0 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  .  sqlite3_value
21c00 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 73 71   **apVal.){.  sq
21c10 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69  lite3 *db = sqli
21c20 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68  te3_context_db_h
21c30 61 6e 64 6c 65 28 70 43 74 78 29 3b 0a 20 20 63  andle(pCtx);.  c
21c40 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72 65  onst char *zPare
21c50 6e 74 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  nt;.  const char
21c60 20 2a 7a 50 61 72 65 6e 74 43 6f 6c 3b 0a 20 20   *zParentCol;.  
21c70 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 72  const char *zPar
21c80 65 6e 74 53 65 71 3b 0a 20 20 63 6f 6e 73 74 20  entSeq;.  const 
21c90 63 68 61 72 20 2a 7a 43 68 69 6c 64 3b 0a 20 20  char *zChild;.  
21ca0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 69  const char *zChi
21cb0 6c 64 43 6f 6c 3b 0a 20 20 63 6f 6e 73 74 20 63  ldCol;.  const c
21cc0 68 61 72 20 2a 7a 43 68 69 6c 64 53 65 71 20 3d  har *zChildSeq =
21cd0 20 30 3b 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69   0;  /* Initiali
21ce0 7a 65 20 74 6f 20 61 76 6f 69 64 20 66 61 6c 73  ze to avoid fals
21cf0 65 2d 70 6f 73 69 74 69 76 65 20 77 61 72 6e 69  e-positive warni
21d00 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a  ng */.  int rc;.
21d10 0a 20 20 61 73 73 65 72 74 28 20 6e 56 61 6c 3d  .  assert( nVal=
21d20 3d 34 20 29 3b 0a 20 20 7a 50 61 72 65 6e 74 20  =4 );.  zParent 
21d30 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
21d40 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
21d50 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 7a  t(apVal[0]);.  z
21d60 50 61 72 65 6e 74 43 6f 6c 20 3d 20 28 63 6f 6e  ParentCol = (con
21d70 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
21d80 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61  _value_text(apVa
21d90 6c 5b 31 5d 29 3b 0a 20 20 7a 43 68 69 6c 64 20  l[1]);.  zChild 
21da0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
21db0 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78  qlite3_value_tex
21dc0 74 28 61 70 56 61 6c 5b 32 5d 29 3b 0a 20 20 7a  t(apVal[2]);.  z
21dd0 43 68 69 6c 64 43 6f 6c 20 3d 20 28 63 6f 6e 73  ChildCol = (cons
21de0 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
21df0 76 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c  value_text(apVal
21e00 5b 33 5d 29 3b 0a 0a 20 20 73 71 6c 69 74 65 33  [3]);..  sqlite3
21e10 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74  _result_text(pCt
21e20 78 2c 20 22 22 2c 20 2d 31 2c 20 53 51 4c 49 54  x, "", -1, SQLIT
21e30 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 72 63 20  E_STATIC);.  rc 
21e40 3d 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f  = sqlite3_table_
21e50 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28  column_metadata(
21e60 0a 20 20 20 20 20 20 64 62 2c 20 22 6d 61 69 6e  .      db, "main
21e70 22 2c 20 7a 50 61 72 65 6e 74 2c 20 7a 50 61 72  ", zParent, zPar
21e80 65 6e 74 43 6f 6c 2c 20 30 2c 20 26 7a 50 61 72  entCol, 0, &zPar
21e90 65 6e 74 53 65 71 2c 20 30 2c 20 30 2c 20 30 0a  entSeq, 0, 0, 0.
21ea0 20 20 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53    );.  if( rc==S
21eb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21ec0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61 62  rc = sqlite3_tab
21ed0 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
21ee0 74 61 28 0a 20 20 20 20 20 20 20 20 64 62 2c 20  ta(.        db, 
21ef0 22 6d 61 69 6e 22 2c 20 7a 43 68 69 6c 64 2c 20  "main", zChild, 
21f00 7a 43 68 69 6c 64 43 6f 6c 2c 20 30 2c 20 26 7a  zChildCol, 0, &z
21f10 43 68 69 6c 64 53 65 71 2c 20 30 2c 20 30 2c 20  ChildSeq, 0, 0, 
21f20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a 0a 20 20  0.    );.  }..  
21f30 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
21f40 4b 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72  K && sqlite3_str
21f50 69 63 6d 70 28 7a 50 61 72 65 6e 74 53 65 71 2c  icmp(zParentSeq,
21f60 20 7a 43 68 69 6c 64 53 65 71 29 20 29 7b 0a 20   zChildSeq) ){. 
21f70 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c     char *z = sql
21f80 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 20 43  ite3_mprintf(" C
21f90 4f 4c 4c 41 54 45 20 25 73 22 2c 20 7a 50 61 72  OLLATE %s", zPar
21fa0 65 6e 74 53 65 71 29 3b 0a 20 20 20 20 73 71 6c  entSeq);.    sql
21fb0 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
21fc0 28 70 43 74 78 2c 20 7a 2c 20 2d 31 2c 20 53 51  (pCtx, z, -1, SQ
21fd0 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b  LITE_TRANSIENT);
21fe0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65  .    sqlite3_fre
21ff0 65 28 7a 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a  e(z);.  }.}.../*
22000 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65 6d 65 6e  .** The implemen
22010 74 61 74 69 6f 6e 20 6f 66 20 64 6f 74 2d 63 6f  tation of dot-co
22020 6d 6d 61 6e 64 20 22 2e 6c 69 6e 74 20 66 6b 65  mmand ".lint fke
22030 79 2d 69 6e 64 65 78 65 73 22 2e 0a 2a 2f 0a 73  y-indexes"..*/.s
22040 74 61 74 69 63 20 69 6e 74 20 6c 69 6e 74 46 6b  tatic int lintFk
22050 65 79 49 6e 64 65 78 65 73 28 0a 20 20 53 68 65  eyIndexes(.  She
22060 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c  llState *pState,
22070 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
22080 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f  Current shell to
22090 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 63 68  ol state */.  ch
220a0 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20  ar **azArg,     
220b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
220c0 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65   Array of argume
220d0 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 64 6f  nts passed to do
220e0 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  t command */.  i
220f0 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20 20 20  nt nArg         
22100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
22110 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
22120 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a  ies in azArg[] *
22130 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  /.){.  sqlite3 *
22140 64 62 20 3d 20 70 53 74 61 74 65 2d 3e 64 62 3b  db = pState->db;
22150 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
22160 73 65 20 68 61 6e 64 6c 65 20 74 6f 20 71 75 65  se handle to que
22170 72 79 20 22 6d 61 69 6e 22 20 64 62 20 6f 66 20  ry "main" db of 
22180 2a 2f 0a 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d  */.  FILE *out =
22190 20 70 53 74 61 74 65 2d 3e 6f 75 74 3b 20 20 20   pState->out;   
221a0 20 20 20 20 20 2f 2a 20 53 74 72 65 61 6d 20 74       /* Stream t
221b0 6f 20 77 72 69 74 65 20 6e 6f 6e 2d 65 72 72 6f  o write non-erro
221c0 72 20 6f 75 74 70 75 74 20 74 6f 20 2a 2f 0a 20  r output to */. 
221d0 20 69 6e 74 20 62 56 65 72 62 6f 73 65 20 3d 20   int bVerbose = 
221e0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
221f0 20 2f 2a 20 49 66 20 2d 76 65 72 62 6f 73 65 20   /* If -verbose 
22200 69 73 20 70 72 65 73 65 6e 74 20 2a 2f 0a 20 20  is present */.  
22210 69 6e 74 20 62 47 72 6f 75 70 42 79 50 61 72 65  int bGroupByPare
22220 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nt = 0;         
22230 2f 2a 20 49 66 20 2d 67 72 6f 75 70 62 79 70 61  /* If -groupbypa
22240 72 65 6e 74 20 69 73 20 70 72 65 73 65 6e 74 20  rent is present 
22250 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
22260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22270 20 20 20 20 20 2f 2a 20 54 6f 20 69 74 65 72 61       /* To itera
22280 74 65 20 74 68 72 6f 75 67 68 20 61 7a 41 72 67  te through azArg
22290 5b 5d 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  [] */.  const ch
222a0 61 72 20 2a 7a 49 6e 64 65 6e 74 20 3d 20 22 22  ar *zIndent = ""
222b0 3b 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d  ;       /* How m
222c0 75 63 68 20 74 6f 20 69 6e 64 65 6e 74 20 43 52  uch to indent CR
222d0 45 41 54 45 20 49 4e 44 45 58 20 62 79 20 2a 2f  EATE INDEX by */
222e0 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
222f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22300 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64     /* Return cod
22310 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73  e */.  sqlite3_s
22320 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30 3b 20 20  tmt *pSql = 0;  
22330 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 69 6c         /* Compil
22340 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 53 51  ed version of SQ
22350 4c 20 73 74 61 74 65 6d 65 6e 74 20 62 65 6c 6f  L statement belo
22360 77 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  w */..  /*.  ** 
22370 54 68 69 73 20 53 45 4c 45 43 54 20 73 74 61 74  This SELECT stat
22380 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 6f 6e  ement returns on
22390 65 20 72 6f 77 20 66 6f 72 20 65 61 63 68 20 66  e row for each f
223a0 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
223b0 72 61 69 6e 74 0a 20 20 2a 2a 20 69 6e 20 74 68  raint.  ** in th
223c0 65 20 73 63 68 65 6d 61 20 6f 66 20 74 68 65 20  e schema of the 
223d0 6d 61 69 6e 20 64 61 74 61 62 61 73 65 2e 20 54  main database. T
223e0 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73  he column values
223f0 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20   are:.  **.  ** 
22400 30 2e 20 54 68 65 20 74 65 78 74 20 6f 66 20 61  0. The text of a
22410 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  n SQL statement 
22420 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 20 20 2a 2a  similar to:.  **
22430 0a 20 20 2a 2a 20 20 20 20 20 20 22 45 58 50 4c  .  **      "EXPL
22440 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 53  AIN QUERY PLAN S
22450 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 63 68 69  ELECT 1 FROM chi
22460 6c 64 5f 74 61 62 6c 65 20 57 48 45 52 45 20 63  ld_table WHERE c
22470 68 69 6c 64 5f 6b 65 79 3d 3f 22 0a 20 20 2a 2a  hild_key=?".  **
22480 0a 20 20 2a 2a 20 20 20 20 54 68 69 73 20 53 45  .  **    This SE
22490 4c 45 43 54 20 69 73 20 73 69 6d 69 6c 61 72 20  LECT is similar 
224a0 74 6f 20 74 68 65 20 6f 6e 65 20 74 68 61 74 20  to the one that 
224b0 74 68 65 20 66 6f 72 65 69 67 6e 20 6b 65 79 73  the foreign keys
224c0 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a   implementation.
224d0 20 20 2a 2a 20 20 20 20 6e 65 65 64 73 20 74 6f    **    needs to
224e0 20 72 75 6e 20 69 6e 74 65 72 6e 61 6c 6c 79 20   run internally 
224f0 6f 6e 20 63 68 69 6c 64 20 74 61 62 6c 65 73 2e  on child tables.
22500 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
22510 69 6e 64 65 78 20 74 68 61 74 20 63 61 6e 0a 20  index that can. 
22520 20 2a 2a 20 20 20 20 62 65 20 75 73 65 64 20 74   **    be used t
22530 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 69 73 20  o optimize this 
22540 71 75 65 72 79 2c 20 74 68 65 6e 20 69 74 20 63  query, then it c
22550 61 6e 20 61 6c 73 6f 20 62 65 20 75 73 65 64 20  an also be used 
22560 62 79 20 74 68 65 20 46 4b 0a 20 20 2a 2a 20 20  by the FK.  **  
22570 20 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e    implementation
22580 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 44 45 4c   to optimize DEL
22590 45 54 45 20 6f 72 20 55 50 44 41 54 45 20 73 74  ETE or UPDATE st
225a0 61 74 65 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20  atements on the 
225b0 70 61 72 65 6e 74 0a 20 20 2a 2a 20 20 20 20 74  parent.  **    t
225c0 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  able..  **.  ** 
225d0 31 2e 20 41 20 47 4c 4f 42 20 70 61 74 74 65 72  1. A GLOB patter
225e0 6e 20 73 75 69 74 61 62 6c 65 20 66 6f 72 20 73  n suitable for s
225f0 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 29  qlite3_strglob()
22600 2e 20 49 66 20 74 68 65 20 70 6c 61 6e 20 6f 75  . If the plan ou
22610 74 70 75 74 20 62 79 0a 20 20 2a 2a 20 20 20 20  tput by.  **    
22620 74 68 65 20 45 58 50 4c 41 49 4e 20 51 55 45 52  the EXPLAIN QUER
22630 59 20 50 4c 41 4e 20 63 6f 6d 6d 61 6e 64 20 6d  Y PLAN command m
22640 61 74 63 68 65 73 20 74 68 69 73 20 70 61 74 74  atches this patt
22650 65 72 6e 2c 20 74 68 65 6e 20 74 68 65 20 73 63  ern, then the sc
22660 68 65 6d 61 0a 20 20 2a 2a 20 20 20 20 63 6f 6e  hema.  **    con
22670 74 61 69 6e 73 20 61 6e 20 69 6e 64 65 78 20 74  tains an index t
22680 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64 20  hat can be used 
22690 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68 65 20  to optimize the 
226a0 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  query..  **.  **
226b0 20 32 2e 20 48 75 6d 61 6e 20 72 65 61 64 61 62   2. Human readab
226c0 6c 65 20 74 65 78 74 20 74 68 61 74 20 64 65 73  le text that des
226d0 63 72 69 62 65 73 20 74 68 65 20 63 68 69 6c 64  cribes the child
226e0 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
226f0 6e 73 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20  ns. e.g..  **.  
22700 2a 2a 20 20 20 20 20 20 20 22 63 68 69 6c 64 5f  **       "child_
22710 74 61 62 6c 65 28 63 68 69 6c 64 5f 6b 65 79 31  table(child_key1
22720 2c 20 63 68 69 6c 64 5f 6b 65 79 32 29 22 0a 20  , child_key2)". 
22730 20 2a 2a 0a 20 20 2a 2a 20 33 2e 20 48 75 6d 61   **.  ** 3. Huma
22740 6e 20 72 65 61 64 61 62 6c 65 20 74 65 78 74 20  n readable text 
22750 74 68 61 74 20 64 65 73 63 72 69 62 65 73 20 74  that describes t
22760 68 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20  he parent table 
22770 61 6e 64 20 63 6f 6c 75 6d 6e 73 2e 20 65 2e 67  and columns. e.g
22780 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  ..  **.  **     
22790 20 20 22 70 61 72 65 6e 74 5f 74 61 62 6c 65 28    "parent_table(
227a0 70 61 72 65 6e 74 5f 6b 65 79 31 2c 20 70 61 72  parent_key1, par
227b0 65 6e 74 5f 6b 65 79 32 29 22 0a 20 20 2a 2a 0a  ent_key2)".  **.
227c0 20 20 2a 2a 20 34 2e 20 41 20 66 75 6c 6c 20 43    ** 4. A full C
227d0 52 45 41 54 45 20 49 4e 44 45 58 20 73 74 61 74  REATE INDEX stat
227e0 65 6d 65 6e 74 20 66 6f 72 20 61 6e 20 69 6e 64  ement for an ind
227f0 65 78 20 74 68 61 74 20 63 6f 75 6c 64 20 62 65  ex that could be
22800 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a 20 20 20   used to.  **   
22810 20 6f 70 74 69 6d 69 7a 65 20 44 45 4c 45 54 45   optimize DELETE
22820 20 6f 72 20 55 50 44 41 54 45 20 73 74 61 74 65   or UPDATE state
22830 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20 70 61 72  ments on the par
22840 65 6e 74 20 74 61 62 6c 65 2e 20 65 2e 67 2e 0a  ent table. e.g..
22850 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20    **.  **       
22860 22 43 52 45 41 54 45 20 49 4e 44 45 58 20 63 68  "CREATE INDEX ch
22870 69 6c 64 5f 74 61 62 6c 65 5f 63 68 69 6c 64 5f  ild_table_child_
22880 6b 65 79 20 4f 4e 20 63 68 69 6c 64 5f 74 61 62  key ON child_tab
22890 6c 65 28 63 68 69 6c 64 5f 6b 65 79 29 22 0a 20  le(child_key)". 
228a0 20 2a 2a 0a 20 20 2a 2a 20 35 2e 20 54 68 65 20   **.  ** 5. The 
228b0 6e 61 6d 65 20 6f 66 20 74 68 65 20 70 61 72 65  name of the pare
228c0 6e 74 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20  nt table..  **. 
228d0 20 2a 2a 20 54 68 65 73 65 20 73 69 78 20 76 61   ** These six va
228e0 6c 75 65 73 20 61 72 65 20 75 73 65 64 20 62 79  lues are used by
228f0 20 74 68 65 20 43 20 6c 6f 67 69 63 20 62 65 6c   the C logic bel
22900 6f 77 20 74 6f 20 67 65 6e 65 72 61 74 65 20 74  ow to generate t
22910 68 65 20 72 65 70 6f 72 74 2e 0a 20 20 2a 2f 0a  he report..  */.
22920 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
22930 71 6c 20 3d 0a 20 20 22 53 45 4c 45 43 54 20 22  ql =.  "SELECT "
22940 0a 20 20 20 20 22 20 20 20 20 20 27 45 58 50 4c  .    "     'EXPL
22950 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 53  AIN QUERY PLAN S
22960 45 4c 45 43 54 20 31 20 46 52 4f 4d 20 27 20 7c  ELECT 1 FROM ' |
22970 7c 20 71 75 6f 74 65 28 73 2e 6e 61 6d 65 29 20  | quote(s.name) 
22980 7c 7c 20 27 20 57 48 45 52 45 20 27 22 0a 20 20  || ' WHERE '".  
22990 20 20 22 20 20 7c 7c 20 67 72 6f 75 70 5f 63 6f    "  || group_co
229a0 6e 63 61 74 28 71 75 6f 74 65 28 73 2e 6e 61 6d  ncat(quote(s.nam
229b0 65 29 20 7c 7c 20 27 2e 27 20 7c 7c 20 71 75 6f  e) || '.' || quo
229c0 74 65 28 66 2e 5b 66 72 6f 6d 5d 29 20 7c 7c 20  te(f.[from]) || 
229d0 27 3d 3f 27 20 22 0a 20 20 20 20 22 20 20 7c 7c  '=?' ".    "  ||
229e0 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c   fkey_collate_cl
229f0 61 75 73 65 28 22 0a 20 20 20 20 22 20 20 20 20  ause(".    "    
22a00 20 20 20 66 2e 5b 74 61 62 6c 65 5d 2c 20 43 4f     f.[table], CO
22a10 41 4c 45 53 43 45 28 66 2e 5b 74 6f 5d 2c 20 70  ALESCE(f.[to], p
22a20 2e 5b 6e 61 6d 65 5d 29 2c 20 73 2e 6e 61 6d 65  .[name]), s.name
22a30 2c 20 66 2e 5b 66 72 6f 6d 5d 29 2c 27 20 41 4e  , f.[from]),' AN
22a40 44 20 27 29 22 0a 20 20 20 20 22 2c 20 22 0a 20  D ')".    ", ". 
22a50 20 20 20 22 20 20 20 20 20 27 53 45 41 52 43 48     "     'SEARCH
22a60 20 54 41 42 4c 45 20 27 20 7c 7c 20 73 2e 6e 61   TABLE ' || s.na
22a70 6d 65 20 7c 7c 20 27 20 55 53 49 4e 47 20 43 4f  me || ' USING CO
22a80 56 45 52 49 4e 47 20 49 4e 44 45 58 2a 28 27 22  VERING INDEX*('"
22a90 0a 20 20 20 20 22 20 20 7c 7c 20 67 72 6f 75 70  .    "  || group
22aa0 5f 63 6f 6e 63 61 74 28 27 2a 3d 3f 27 2c 20 27  _concat('*=?', '
22ab0 20 41 4e 44 20 27 29 20 7c 7c 20 27 29 27 22 0a   AND ') || ')'".
22ac0 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20 20      ", ".    "  
22ad0 20 20 20 73 2e 6e 61 6d 65 20 20 7c 7c 20 27 28     s.name  || '(
22ae0 27 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61  ' || group_conca
22af0 74 28 66 2e 5b 66 72 6f 6d 5d 2c 20 20 27 2c 20  t(f.[from],  ', 
22b00 27 29 20 7c 7c 20 27 29 27 22 0a 20 20 20 20 22  ') || ')'".    "
22b10 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20 66 2e  , ".    "     f.
22b20 5b 74 61 62 6c 65 5d 20 7c 7c 20 27 28 27 20 7c  [table] || '(' |
22b30 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 43  | group_concat(C
22b40 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f 5d 2c 20  OALESCE(f.[to], 
22b50 70 2e 5b 6e 61 6d 65 5d 29 29 20 7c 7c 20 27 29  p.[name])) || ')
22b60 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20  '".    ", ".    
22b70 22 20 20 20 20 20 27 43 52 45 41 54 45 20 49 4e  "     'CREATE IN
22b80 44 45 58 20 27 20 7c 7c 20 71 75 6f 74 65 28 73  DEX ' || quote(s
22b90 2e 6e 61 6d 65 20 7c 7c 27 5f 27 7c 7c 20 67 72  .name ||'_'|| gr
22ba0 6f 75 70 5f 63 6f 6e 63 61 74 28 66 2e 5b 66 72  oup_concat(f.[fr
22bb0 6f 6d 5d 2c 20 27 5f 27 29 29 22 0a 20 20 20 20  om], '_'))".    
22bc0 22 20 20 7c 7c 20 27 20 4f 4e 20 27 20 7c 7c 20  "  || ' ON ' || 
22bd0 71 75 6f 74 65 28 73 2e 6e 61 6d 65 29 20 7c 7c  quote(s.name) ||
22be0 20 27 28 27 22 0a 20 20 20 20 22 20 20 7c 7c 20   '('".    "  || 
22bf0 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 71 75 6f  group_concat(quo
22c00 74 65 28 66 2e 5b 66 72 6f 6d 5d 29 20 7c 7c 22  te(f.[from]) ||"
22c10 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 66 6b  .    "        fk
22c20 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73  ey_collate_claus
22c30 65 28 22 0a 20 20 20 20 22 20 20 20 20 20 20 20  e(".    "       
22c40 20 20 20 66 2e 5b 74 61 62 6c 65 5d 2c 20 43 4f     f.[table], CO
22c50 41 4c 45 53 43 45 28 66 2e 5b 74 6f 5d 2c 20 70  ALESCE(f.[to], p
22c60 2e 5b 6e 61 6d 65 5d 29 2c 20 73 2e 6e 61 6d 65  .[name]), s.name
22c70 2c 20 66 2e 5b 66 72 6f 6d 5d 29 2c 20 27 2c 20  , f.[from]), ', 
22c80 27 29 22 0a 20 20 20 20 22 20 20 7c 7c 20 27 29  ')".    "  || ')
22c90 3b 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20  ;'".    ", ".   
22ca0 20 22 20 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d   "     f.[table]
22cb0 20 22 0a 20 20 20 20 22 46 52 4f 4d 20 73 71 6c   ".    "FROM sql
22cc0 69 74 65 5f 6d 61 73 74 65 72 20 41 53 20 73 2c  ite_master AS s,
22cd0 20 70 72 61 67 6d 61 5f 66 6f 72 65 69 67 6e 5f   pragma_foreign_
22ce0 6b 65 79 5f 6c 69 73 74 28 73 2e 6e 61 6d 65 29  key_list(s.name)
22cf0 20 41 53 20 66 20 22 0a 20 20 20 20 22 4c 45 46   AS f ".    "LEF
22d00 54 20 4a 4f 49 4e 20 70 72 61 67 6d 61 5f 74 61  T JOIN pragma_ta
22d10 62 6c 65 5f 69 6e 66 6f 20 41 53 20 70 20 4f 4e  ble_info AS p ON
22d20 20 28 70 6b 2d 31 3d 73 65 71 20 41 4e 44 20 70   (pk-1=seq AND p
22d30 2e 61 72 67 3d 66 2e 5b 74 61 62 6c 65 5d 29 20  .arg=f.[table]) 
22d40 22 0a 20 20 20 20 22 47 52 4f 55 50 20 42 59 20  ".    "GROUP BY 
22d50 73 2e 6e 61 6d 65 2c 20 66 2e 69 64 20 22 0a 20  s.name, f.id ". 
22d60 20 20 20 22 4f 52 44 45 52 20 42 59 20 28 43 41     "ORDER BY (CA
22d70 53 45 20 57 48 45 4e 20 3f 20 54 48 45 4e 20 66  SE WHEN ? THEN f
22d80 2e 5b 74 61 62 6c 65 5d 20 45 4c 53 45 20 73 2e  .[table] ELSE s.
22d90 6e 61 6d 65 20 45 4e 44 29 22 0a 20 20 3b 0a 20  name END)".  ;. 
22da0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47 6c   const char *zGl
22db0 6f 62 49 50 4b 20 3d 20 22 53 45 41 52 43 48 20  obIPK = "SEARCH 
22dc0 54 41 42 4c 45 20 2a 20 55 53 49 4e 47 20 49 4e  TABLE * USING IN
22dd0 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
22de0 59 20 28 72 6f 77 69 64 3d 3f 29 22 3b 0a 0a 20  Y (rowid=?)";.. 
22df0 20 66 6f 72 28 69 3d 32 3b 20 69 3c 6e 41 72 67   for(i=2; i<nArg
22e00 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  ; i++){.    int 
22e10 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 41  n = strlen30(azA
22e20 72 67 5b 69 5d 29 3b 0a 20 20 20 20 69 66 28 20  rg[i]);.    if( 
22e30 6e 3e 31 20 26 26 20 73 71 6c 69 74 65 33 5f 73  n>1 && sqlite3_s
22e40 74 72 6e 69 63 6d 70 28 22 2d 76 65 72 62 6f 73  trnicmp("-verbos
22e50 65 22 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 6e 29  e", azArg[i], n)
22e60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 62 56 65  ==0 ){.      bVe
22e70 72 62 6f 73 65 20 3d 20 31 3b 0a 20 20 20 20 7d  rbose = 1;.    }
22e80 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 6e 3e  .    else if( n>
22e90 31 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72  1 && sqlite3_str
22ea0 6e 69 63 6d 70 28 22 2d 67 72 6f 75 70 62 79 70  nicmp("-groupbyp
22eb0 61 72 65 6e 74 22 2c 20 61 7a 41 72 67 5b 69 5d  arent", azArg[i]
22ec0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , n)==0 ){.     
22ed0 20 62 47 72 6f 75 70 42 79 50 61 72 65 6e 74 20   bGroupByParent 
22ee0 3d 20 31 3b 0a 20 20 20 20 20 20 7a 49 6e 64 65  = 1;.      zInde
22ef0 6e 74 20 3d 20 22 20 20 20 20 22 3b 0a 20 20 20  nt = "    ";.   
22f00 20 7d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20   }.    else{.   
22f10 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
22f20 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 25 73  derr, "Usage: %s
22f30 20 25 73 20 3f 2d 76 65 72 62 6f 73 65 3f 20 3f   %s ?-verbose? ?
22f40 2d 67 72 6f 75 70 62 79 70 61 72 65 6e 74 3f 5c  -groupbyparent?\
22f50 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 61 7a  n",.          az
22f60 41 72 67 5b 30 5d 2c 20 61 7a 41 72 67 5b 31 5d  Arg[0], azArg[1]
22f70 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
22f80 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
22f90 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  ROR;.    }.  }..
22fa0 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 74 68    /* Register th
22fb0 65 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63  e fkey_collate_c
22fc0 6c 61 75 73 65 28 29 20 53 51 4c 20 66 75 6e 63  lause() SQL func
22fd0 74 69 6f 6e 20 2a 2f 0a 20 20 72 63 20 3d 20 73  tion */.  rc = s
22fe0 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75  qlite3_create_fu
22ff0 6e 63 74 69 6f 6e 28 64 62 2c 20 22 66 6b 65 79  nction(db, "fkey
23000 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 22  _collate_clause"
23010 2c 20 34 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  , 4, SQLITE_UTF8
23020 2c 0a 20 20 20 20 20 20 30 2c 20 73 68 65 6c 6c  ,.      0, shell
23030 46 6b 65 79 43 6f 6c 6c 61 74 65 43 6c 61 75 73  FkeyCollateClaus
23040 65 2c 20 30 2c 20 30 0a 20 20 29 3b 0a 0a 0a 20  e, 0, 0.  );... 
23050 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
23060 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 73  OK ){.    rc = s
23070 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
23080 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  2(db, zSql, -1, 
23090 26 70 53 71 6c 2c 20 30 29 3b 0a 20 20 7d 0a 20  &pSql, 0);.  }. 
230a0 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
230b0 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  OK ){.    sqlite
230c0 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53 71 6c 2c  3_bind_int(pSql,
230d0 20 31 2c 20 62 47 72 6f 75 70 42 79 50 61 72 65   1, bGroupByPare
230e0 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20  nt);.  }..  if( 
230f0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
23100 0a 20 20 20 20 69 6e 74 20 72 63 32 3b 0a 20 20  .    int rc2;.  
23110 20 20 63 68 61 72 20 2a 7a 50 72 65 76 20 3d 20    char *zPrev = 
23120 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 53 51  0;.    while( SQ
23130 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65  LITE_ROW==sqlite
23140 33 5f 73 74 65 70 28 70 53 71 6c 29 20 29 7b 0a  3_step(pSql) ){.
23150 20 20 20 20 20 20 69 6e 74 20 72 65 73 20 3d 20        int res = 
23160 2d 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  -1;.      sqlite
23170 33 5f 73 74 6d 74 20 2a 70 45 78 70 6c 61 69 6e  3_stmt *pExplain
23180 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 6f 6e 73   = 0;.      cons
23190 74 20 63 68 61 72 20 2a 7a 45 51 50 20 3d 20 28  t char *zEQP = (
231a0 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
231b0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
231c0 70 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20  pSql, 0);.      
231d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f  const char *zGlo
231e0 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  b = (const char*
231f0 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
23200 74 65 78 74 28 70 53 71 6c 2c 20 31 29 3b 0a 20  text(pSql, 1);. 
23210 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
23220 2a 7a 46 72 6f 6d 20 3d 20 28 63 6f 6e 73 74 20  *zFrom = (const 
23230 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
23240 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20  lumn_text(pSql, 
23250 32 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  2);.      const 
23260 63 68 61 72 20 2a 7a 54 61 72 67 65 74 20 3d 20  char *zTarget = 
23270 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
23280 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
23290 28 70 53 71 6c 2c 20 33 29 3b 0a 20 20 20 20 20  (pSql, 3);.     
232a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 49   const char *zCI
232b0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
232c0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
232d0 65 78 74 28 70 53 71 6c 2c 20 34 29 3b 0a 20 20  ext(pSql, 4);.  
232e0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
232f0 7a 50 61 72 65 6e 74 20 3d 20 28 63 6f 6e 73 74  zParent = (const
23300 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
23310 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
23320 20 35 29 3b 0a 0a 20 20 20 20 20 20 72 63 20 3d   5);..      rc =
23330 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
23340 5f 76 32 28 64 62 2c 20 7a 45 51 50 2c 20 2d 31  _v2(db, zEQP, -1
23350 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b  , &pExplain, 0);
23360 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53  .      if( rc!=S
23370 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b  QLITE_OK ) break
23380 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ;.      if( SQLI
23390 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
233a0 73 74 65 70 28 70 45 78 70 6c 61 69 6e 29 20 29  step(pExplain) )
233b0 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
233c0 63 68 61 72 20 2a 7a 50 6c 61 6e 20 3d 20 28 63  char *zPlan = (c
233d0 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
233e0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
233f0 45 78 70 6c 61 69 6e 2c 20 33 29 3b 0a 20 20 20  Explain, 3);.   
23400 20 20 20 20 20 72 65 73 20 3d 20 28 0a 20 20 20       res = (.   
23410 20 20 20 20 20 20 20 20 20 20 20 30 3d 3d 73 71             0==sq
23420 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 7a 47  lite3_strglob(zG
23430 6c 6f 62 2c 20 7a 50 6c 61 6e 29 0a 20 20 20 20  lob, zPlan).    
23440 20 20 20 20 20 20 20 7c 7c 20 30 3d 3d 73 71 6c         || 0==sql
23450 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 7a 47 6c  ite3_strglob(zGl
23460 6f 62 49 50 4b 2c 20 7a 50 6c 61 6e 29 0a 20 20  obIPK, zPlan).  
23470 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 7d        );.      }
23480 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
23490 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78  te3_finalize(pEx
234a0 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 69 66  plain);.      if
234b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
234c0 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20  ) break;..      
234d0 69 66 28 20 72 65 73 3c 30 20 29 7b 0a 20 20 20  if( res<0 ){.   
234e0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
234f0 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
23500 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f 72 22 29  internal error")
23510 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
23520 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
23530 20 20 20 20 20 20 69 66 28 20 62 47 72 6f 75 70        if( bGroup
23540 42 79 50 61 72 65 6e 74 0a 20 20 20 20 20 20 20  ByParent.       
23550 20 26 26 20 28 62 56 65 72 62 6f 73 65 20 7c 7c   && (bVerbose ||
23560 20 72 65 73 3d 3d 30 29 0a 20 20 20 20 20 20 20   res==0).       
23570 20 26 26 20 28 7a 50 72 65 76 3d 3d 30 20 7c 7c   && (zPrev==0 ||
23580 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
23590 28 7a 50 61 72 65 6e 74 2c 20 7a 50 72 65 76 29  (zParent, zPrev)
235a0 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
235b0 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
235c0 66 28 6f 75 74 2c 20 22 2d 2d 20 50 61 72 65 6e  f(out, "-- Paren
235d0 74 20 74 61 62 6c 65 20 25 73 5c 6e 22 2c 20 7a  t table %s\n", z
235e0 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20 20 20  Parent);.       
235f0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
23600 7a 50 72 65 76 29 3b 0a 20 20 20 20 20 20 20 20  zPrev);.        
23610 20 20 7a 50 72 65 76 20 3d 20 73 71 6c 69 74 65    zPrev = sqlite
23620 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
23630 7a 50 61 72 65 6e 74 29 3b 0a 20 20 20 20 20 20  zParent);.      
23640 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 28    }..        if(
23650 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20 20 20 20   res==0 ){.     
23660 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
23670 6f 75 74 2c 20 22 25 73 25 73 20 2d 2d 3e 20 25  out, "%s%s --> %
23680 73 5c 6e 22 2c 20 7a 49 6e 64 65 6e 74 2c 20 7a  s\n", zIndent, z
23690 43 49 2c 20 7a 54 61 72 67 65 74 29 3b 0a 20 20  CI, zTarget);.  
236a0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
236b0 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20  bVerbose ){.    
236c0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
236d0 28 6f 75 74 2c 20 22 25 73 2f 2a 20 6e 6f 20 65  (out, "%s/* no e
236e0 78 74 72 61 20 69 6e 64 65 78 65 73 20 72 65 71  xtra indexes req
236f0 75 69 72 65 64 20 66 6f 72 20 25 73 20 2d 3e 20  uired for %s -> 
23700 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20 20 20 20 20  %s */\n",.      
23710 20 20 20 20 20 20 20 20 7a 49 6e 64 65 6e 74 2c          zIndent,
23720 20 7a 46 72 6f 6d 2c 20 7a 54 61 72 67 65 74 0a   zFrom, zTarget.
23730 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
23740 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
23750 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
23760 5f 66 72 65 65 28 7a 50 72 65 76 29 3b 0a 0a 20  _free(zPrev);.. 
23770 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
23780 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 61  E_OK ){.      ra
23790 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
237a0 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33   "%s\n", sqlite3
237b0 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
237c0 20 20 7d 0a 0a 20 20 20 20 72 63 32 20 3d 20 73    }..    rc2 = s
237d0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
237e0 70 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  pSql);.    if( r
237f0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
23800 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29  rc2!=SQLITE_OK )
23810 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 72 63 32  {.      rc = rc2
23820 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  ;.      raw_prin
23830 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 5c 6e  tf(stderr, "%s\n
23840 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ", sqlite3_errms
23850 67 28 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20 20  g(db));.    }.  
23860 7d 65 6c 73 65 7b 0a 20 20 20 20 72 61 77 5f 70  }else{.    raw_p
23870 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25  rintf(stderr, "%
23880 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  s\n", sqlite3_er
23890 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 7d 0a 0a  rmsg(db));.  }..
238a0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
238b0 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
238c0 74 69 6f 6e 20 6f 66 20 22 2e 6c 69 6e 74 22 20  tion of ".lint" 
238d0 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  dot command..*/.
238e0 73 74 61 74 69 63 20 69 6e 74 20 6c 69 6e 74 44  static int lintD
238f0 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 53 68 65  otCommand(.  She
23900 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c  llState *pState,
23910 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
23920 43 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f  Current shell to
23930 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 63 68  ol state */.  ch
23940 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20  ar **azArg,     
23950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
23960 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65   Array of argume
23970 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 64 6f  nts passed to do
23980 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  t command */.  i
23990 6e 74 20 6e 41 72 67 20 20 20 20 20 20 20 20 20  nt nArg         
239a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
239b0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
239c0 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a  ies in azArg[] *
239d0 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  /.){.  int n;.  
239e0 6e 20 3d 20 28 6e 41 72 67 3e 3d 32 20 3f 20 73  n = (nArg>=2 ? s
239f0 74 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 31 5d  trlen30(azArg[1]
23a00 29 20 3a 20 30 29 3b 0a 20 20 69 66 28 20 6e 3c  ) : 0);.  if( n<
23a10 31 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72  1 || sqlite3_str
23a20 6e 69 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 20  nicmp(azArg[1], 
23a30 22 66 6b 65 79 2d 69 6e 64 65 78 65 73 22 2c 20  "fkey-indexes", 
23a40 6e 29 20 29 20 67 6f 74 6f 20 75 73 61 67 65 3b  n) ) goto usage;
23a50 0a 20 20 72 65 74 75 72 6e 20 6c 69 6e 74 46 6b  .  return lintFk
23a60 65 79 49 6e 64 65 78 65 73 28 70 53 74 61 74 65  eyIndexes(pState
23a70 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b 0a  , azArg, nArg);.
23a80 0a 20 75 73 61 67 65 3a 0a 20 20 72 61 77 5f 70  . usage:.  raw_p
23a90 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
23aa0 73 61 67 65 20 25 73 20 73 75 62 2d 63 6f 6d 6d  sage %s sub-comm
23ab0 61 6e 64 20 3f 73 77 69 74 63 68 65 73 2e 2e 2e  and ?switches...
23ac0 3f 5c 6e 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b  ?\n", azArg[0]);
23ad0 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74  .  raw_printf(st
23ae0 64 65 72 72 2c 20 22 57 68 65 72 65 20 73 75 62  derr, "Where sub
23af0 2d 63 6f 6d 6d 61 6e 64 73 20 61 72 65 3a 5c 6e  -commands are:\n
23b00 22 29 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66  ");.  raw_printf
23b10 28 73 74 64 65 72 72 2c 20 22 20 20 20 20 66 6b  (stderr, "    fk
23b20 65 79 2d 69 6e 64 65 78 65 73 5c 6e 22 29 3b 0a  ey-indexes\n");.
23b30 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
23b40 45 52 52 4f 52 3b 0a 7d 0a 0a 23 69 66 20 21 64  ERROR;.}..#if !d
23b50 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
23b60 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45 29  IT_VIRTUALTABLE)
23b70 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
23b80 54 45 5f 48 41 56 45 5f 5a 4c 49 42 29 0a 2f 2a  TE_HAVE_ZLIB)./*
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 2a  ****************
23bb0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23bc0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23bd0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
23be0 0a 2a 2a 20 54 68 65 20 22 2e 61 72 63 68 69 76  .** The ".archiv
23bf0 65 22 20 6f 72 20 22 2e 61 72 22 20 63 6f 6d 6d  e" or ".ar" comm
23c00 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  and..*/.static v
23c10 6f 69 64 20 73 68 65 6c 6c 50 72 65 70 61 72 65  oid shellPrepare
23c20 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c  (.  sqlite3 *db,
23c30 20 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20   .  int *pRc, . 
23c40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
23c50 6c 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  l, .  sqlite3_st
23c60 6d 74 20 2a 2a 70 70 53 74 6d 74 0a 29 7b 0a 20  mt **ppStmt.){. 
23c70 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20   *ppStmt = 0;.  
23c80 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45  if( *pRc==SQLITE
23c90 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72  _OK ){.    int r
23ca0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
23cb0 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c  are_v2(db, zSql,
23cc0 20 2d 31 2c 20 70 70 53 74 6d 74 2c 20 30 29 3b   -1, ppStmt, 0);
23cd0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
23ce0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23cf0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
23d00 72 2c 20 22 73 71 6c 20 65 72 72 6f 72 3a 20 25  r, "sql error: %
23d10 73 20 28 25 64 29 5c 6e 22 2c 20 0a 20 20 20 20  s (%d)\n", .    
23d20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72        sqlite3_er
23d30 72 6d 73 67 28 64 62 29 2c 20 73 71 6c 69 74 65  rmsg(db), sqlite
23d40 33 5f 65 72 72 63 6f 64 65 28 64 62 29 0a 20 20  3_errcode(db).  
23d50 20 20 20 20 29 3b 0a 20 20 20 20 20 20 2a 70 52      );.      *pR
23d60 63 20 3d 20 72 63 3b 0a 20 20 20 20 7d 0a 20 20  c = rc;.    }.  
23d70 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64  }.}..static void
23d80 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72 69   shellPreparePri
23d90 6e 74 66 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ntf(.  sqlite3 *
23da0 64 62 2c 20 0a 20 20 69 6e 74 20 2a 70 52 63 2c  db, .  int *pRc,
23db0 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74   .  sqlite3_stmt
23dc0 20 2a 2a 70 70 53 74 6d 74 2c 0a 20 20 63 6f 6e   **ppStmt,.  con
23dd0 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 0a  st char *zFmt, .
23de0 20 20 2e 2e 2e 0a 29 7b 0a 20 20 2a 70 70 53 74    ....){.  *ppSt
23df0 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70  mt = 0;.  if( *p
23e00 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  Rc==SQLITE_OK ){
23e10 0a 20 20 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  .    va_list ap;
23e20 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  .    char *z;.  
23e30 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a    va_start(ap, z
23e40 46 6d 74 29 3b 0a 20 20 20 20 7a 20 3d 20 73 71  Fmt);.    z = sq
23e50 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a  lite3_vmprintf(z
23e60 46 6d 74 2c 20 61 70 29 3b 0a 20 20 20 20 69 66  Fmt, ap);.    if
23e70 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( z==0 ){.      
23e80 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  *pRc = SQLITE_NO
23e90 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  MEM;.    }else{.
23ea0 20 20 20 20 20 20 73 68 65 6c 6c 50 72 65 70 61        shellPrepa
23eb0 72 65 28 64 62 2c 20 70 52 63 2c 20 7a 2c 20 70  re(db, pRc, z, p
23ec0 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 73 71  pStmt);.      sq
23ed0 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
23ee0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74     }.  }.}..stat
23ef0 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 46 69 6e  ic void shellFin
23f00 61 6c 69 7a 65 28 0a 20 20 69 6e 74 20 2a 70 52  alize(.  int *pR
23f10 63 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  c, .  sqlite3_st
23f20 6d 74 20 2a 70 53 74 6d 74 0a 29 7b 0a 20 20 69  mt *pStmt.){.  i
23f30 66 28 20 70 53 74 6d 74 20 29 7b 0a 20 20 20 20  f( pStmt ){.    
23f40 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71  sqlite3 *db = sq
23f50 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65 28  lite3_db_handle(
23f60 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 6e 74 20  pStmt);.    int 
23f70 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e  rc = sqlite3_fin
23f80 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
23f90 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49    if( *pRc==SQLI
23fa0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69  TE_OK ){.      i
23fb0 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
23fc0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
23fd0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
23fe0 53 51 4c 20 65 72 72 6f 72 3a 20 25 73 5c 6e 22  SQL error: %s\n"
23ff0 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
24000 28 64 62 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (db));.      }. 
24010 20 20 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a       *pRc = rc;.
24020 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61      }.  }.}..sta
24030 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 52 65  tic void shellRe
24040 73 65 74 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c  set(.  int *pRc,
24050 20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74   .  sqlite3_stmt
24060 20 2a 70 53 74 6d 74 0a 29 7b 0a 20 20 69 6e 74   *pStmt.){.  int
24070 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 72 65   rc = sqlite3_re
24080 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20 69 66  set(pStmt);.  if
24090 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRc==SQLITE_O
240a0 4b 20 29 7b 0a 20 20 20 20 69 66 28 20 72 63 21  K ){.    if( rc!
240b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
240c0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
240d0 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e  = sqlite3_db_han
240e0 64 6c 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  dle(pStmt);.    
240f0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
24100 65 72 72 2c 20 22 53 51 4c 20 65 72 72 6f 72 3a  err, "SQL error:
24110 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f   %s\n", sqlite3_
24120 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20  errmsg(db));.   
24130 20 7d 0a 20 20 20 20 2a 70 52 63 20 3d 20 72 63   }.    *pRc = rc
24140 3b 0a 20 20 7d 0a 7d 0a 2f 2a 0a 2a 2a 20 53 74  ;.  }.}./*.** St
24150 72 75 63 74 75 72 65 20 72 65 70 72 65 73 65 6e  ructure represen
24160 74 69 6e 67 20 61 20 73 69 6e 67 6c 65 20 22 2e  ting a single ".
24170 61 72 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  ar" command..*/.
24180 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 41  typedef struct A
24190 72 43 6f 6d 6d 61 6e 64 20 41 72 43 6f 6d 6d 61  rCommand ArComma
241a0 6e 64 3b 0a 73 74 72 75 63 74 20 41 72 43 6f 6d  nd;.struct ArCom
241b0 6d 61 6e 64 20 7b 0a 20 20 75 38 20 65 43 6d 64  mand {.  u8 eCmd
241c0 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
241d0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 41           /* An A
241e0 52 5f 43 4d 44 5f 2a 20 76 61 6c 75 65 20 2a 2f  R_CMD_* value */
241f0 0a 20 20 75 38 20 62 56 65 72 62 6f 73 65 3b 20  .  u8 bVerbose; 
24200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24210 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 2d 2d     /* True if --
24220 76 65 72 62 6f 73 65 20 2a 2f 0a 20 20 75 38 20  verbose */.  u8 
24230 62 5a 69 70 3b 20 20 20 20 20 20 20 20 20 20 20  bZip;           
24240 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24250 54 72 75 65 20 69 66 20 74 68 65 20 61 72 63 68  True if the arch
24260 69 76 65 20 69 73 20 61 20 5a 49 50 20 2a 2f 0a  ive is a ZIP */.
24270 20 20 75 38 20 62 44 72 79 52 75 6e 3b 20 20 20    u8 bDryRun;   
24280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24290 20 20 2f 2a 20 54 72 75 65 20 69 66 20 2d 2d 64    /* True if --d
242a0 72 79 2d 72 75 6e 20 2a 2f 0a 20 20 75 38 20 62  ry-run */.  u8 b
242b0 41 70 70 65 6e 64 3b 20 20 20 20 20 20 20 20 20  Append;         
242c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
242d0 72 75 65 20 69 66 20 2d 2d 61 70 70 65 6e 64 20  rue if --append 
242e0 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 3b 20 20  */.  int nArg;  
242f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24300 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
24310 66 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  f command argume
24320 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  nts */.  char *z
24330 53 72 63 54 61 62 6c 65 3b 20 20 20 20 20 20 20  SrcTable;       
24340 20 20 20 20 20 20 20 20 20 2f 2a 20 22 73 71 6c           /* "sql
24350 61 72 22 2c 20 22 7a 69 70 66 69 6c 65 28 24 66  ar", "zipfile($f
24360 69 6c 65 29 22 20 6f 72 20 22 7a 69 70 22 20 2a  ile)" or "zip" *
24370 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
24380 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  zFile;          
24390 20 20 20 20 2f 2a 20 2d 2d 66 69 6c 65 20 61 72      /* --file ar
243a0 67 75 6d 65 6e 74 2c 20 6f 72 20 4e 55 4c 4c 20  gument, or NULL 
243b0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
243c0 2a 7a 44 69 72 3b 20 20 20 20 20 20 20 20 20 20  *zDir;          
243d0 20 20 20 20 20 2f 2a 20 2d 2d 64 69 72 65 63 74       /* --direct
243e0 6f 72 79 20 61 72 67 75 6d 65 6e 74 2c 20 6f 72  ory argument, or
243f0 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 68 61 72 20   NULL */.  char 
24400 2a 2a 61 7a 41 72 67 3b 20 20 20 20 20 20 20 20  **azArg;        
24410 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
24420 72 61 79 20 6f 66 20 63 6f 6d 6d 61 6e 64 20 61  ray of command a
24430 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 53 68  rguments */.  Sh
24440 65 6c 6c 53 74 61 74 65 20 2a 70 3b 20 20 20 20  ellState *p;    
24450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24460 20 53 68 65 6c 6c 20 73 74 61 74 65 20 2a 2f 0a   Shell state */.
24470 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
24480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24490 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f    /* Database co
244a0 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 61 72 63  ntaining the arc
244b0 68 69 76 65 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a  hive */.};../*.*
244c0 2a 20 50 72 69 6e 74 20 61 20 75 73 61 67 65 20  * Print a usage 
244d0 6d 65 73 73 61 67 65 20 66 6f 72 20 74 68 65 20  message for the 
244e0 2e 61 72 20 63 6f 6d 6d 61 6e 64 20 74 6f 20 73  .ar command to s
244f0 74 64 65 72 72 20 61 6e 64 20 72 65 74 75 72 6e  tderr and return
24500 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a   SQLITE_ERROR..*
24510 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 55  /.static int arU
24520 73 61 67 65 28 46 49 4c 45 20 2a 66 29 7b 0a 20  sage(FILE *f){. 
24530 20 72 61 77 5f 70 72 69 6e 74 66 28 66 2c 0a 22   raw_printf(f,."
24540 5c 6e 22 0a 22 55 73 61 67 65 3a 20 2e 61 72 20  \n"."Usage: .ar 
24550 5b 4f 50 54 49 4f 4e 2e 2e 2e 5d 20 5b 46 49 4c  [OPTION...] [FIL
24560 45 2e 2e 2e 5d 5c 6e 22 0a 22 54 68 65 20 2e 61  E...]\n"."The .a
24570 72 20 63 6f 6d 6d 61 6e 64 20 6d 61 6e 61 67 65  r command manage
24580 73 20 73 71 6c 61 72 20 61 72 63 68 69 76 65 73  s sqlar archives
24590 2e 5c 6e 22 0a 22 5c 6e 22 0a 22 45 78 61 6d 70  .\n"."\n"."Examp
245a0 6c 65 73 3a 5c 6e 22 0a 22 20 20 2e 61 72 20 2d  les:\n"."  .ar -
245b0 63 66 20 61 72 63 68 69 76 65 2e 73 61 72 20 66  cf archive.sar f
245c0 6f 6f 20 62 61 72 20 20 20 20 23 20 43 72 65 61  oo bar    # Crea
245d0 74 65 20 61 72 63 68 69 76 65 2e 73 61 72 20 66  te archive.sar f
245e0 72 6f 6d 20 66 69 6c 65 73 20 66 6f 6f 20 61 6e  rom files foo an
245f0 64 20 62 61 72 5c 6e 22 0a 22 20 20 2e 61 72 20  d bar\n"."  .ar 
24600 2d 74 66 20 61 72 63 68 69 76 65 2e 73 61 72 20  -tf archive.sar 
24610 20 20 20 20 20 20 20 20 20 20 20 23 20 4c 69 73             # Lis
24620 74 20 6d 65 6d 62 65 72 73 20 6f 66 20 61 72 63  t members of arc
24630 68 69 76 65 2e 73 61 72 5c 6e 22 0a 22 20 20 2e  hive.sar\n"."  .
24640 61 72 20 2d 78 76 66 20 61 72 63 68 69 76 65 2e  ar -xvf archive.
24650 73 61 72 20 20 20 20 20 20 20 20 20 20 20 23 20  sar           # 
24660 56 65 72 62 6f 73 65 6c 79 20 65 78 74 72 61 63  Verbosely extrac
24670 74 20 66 69 6c 65 73 20 66 72 6f 6d 20 61 72 63  t files from arc
24680 68 69 76 65 2e 73 61 72 5c 6e 22 0a 22 5c 6e 22  hive.sar\n"."\n"
24690 0a 22 45 61 63 68 20 63 6f 6d 6d 61 6e 64 20 6c  ."Each command l
246a0 69 6e 65 20 6d 75 73 74 20 66 65 61 74 75 72 65  ine must feature
246b0 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 6f 6d   exactly one com
246c0 6d 61 6e 64 20 6f 70 74 69 6f 6e 3a 5c 6e 22 0a  mand option:\n".
246d0 22 20 20 2d 63 2c 20 2d 2d 63 72 65 61 74 65 20  "  -c, --create 
246e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43 72                Cr
246f0 65 61 74 65 20 61 20 6e 65 77 20 61 72 63 68 69  eate a new archi
24700 76 65 5c 6e 22 0a 22 20 20 2d 75 2c 20 2d 2d 75  ve\n"."  -u, --u
24710 70 64 61 74 65 20 20 20 20 20 20 20 20 20 20 20  pdate           
24720 20 20 20 20 55 70 64 61 74 65 20 6f 72 20 61 64      Update or ad
24730 64 20 66 69 6c 65 73 20 74 6f 20 61 6e 20 65 78  d files to an ex
24740 69 73 74 69 6e 67 20 61 72 63 68 69 76 65 5c 6e  isting archive\n
24750 22 0a 22 20 20 2d 74 2c 20 2d 2d 6c 69 73 74 20  "."  -t, --list 
24760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24770 4c 69 73 74 20 63 6f 6e 74 65 6e 74 73 20 6f 66  List contents of
24780 20 61 72 63 68 69 76 65 5c 6e 22 0a 22 20 20 2d   archive\n"."  -
24790 78 2c 20 2d 2d 65 78 74 72 61 63 74 20 20 20 20  x, --extract    
247a0 20 20 20 20 20 20 20 20 20 20 45 78 74 72 61 63            Extrac
247b0 74 20 66 69 6c 65 73 20 66 72 6f 6d 20 61 72 63  t files from arc
247c0 68 69 76 65 5c 6e 22 0a 22 5c 6e 22 0a 22 41 6e  hive\n"."\n"."An
247d0 64 20 7a 65 72 6f 20 6f 72 20 6d 6f 72 65 20 6f  d zero or more o
247e0 70 74 69 6f 6e 61 6c 20 6f 70 74 69 6f 6e 73 3a  ptional options:
247f0 5c 6e 22 0a 22 20 20 2d 76 2c 20 2d 2d 76 65 72  \n"."  -v, --ver
24800 62 6f 73 65 20 20 20 20 20 20 20 20 20 20 20 20  bose            
24810 20 20 50 72 69 6e 74 20 65 61 63 68 20 66 69 6c    Print each fil
24820 65 6e 61 6d 65 20 61 73 20 69 74 20 69 73 20 70  ename as it is p
24830 72 6f 63 65 73 73 65 64 5c 6e 22 0a 22 20 20 2d  rocessed\n"."  -
24840 66 20 46 49 4c 45 2c 20 2d 2d 66 69 6c 65 20 46  f FILE, --file F
24850 49 4c 45 20 20 20 20 20 20 20 4f 70 65 72 61 74  ILE       Operat
24860 65 20 6f 6e 20 61 72 63 68 69 76 65 20 46 49 4c  e on archive FIL
24870 45 20 28 64 65 66 61 75 6c 74 20 69 73 20 63 75  E (default is cu
24880 72 72 65 6e 74 20 64 62 29 5c 6e 22 0a 22 20 20  rrent db)\n"."  
24890 2d 61 20 46 49 4c 45 2c 20 2d 2d 61 70 70 65 6e  -a FILE, --appen
248a0 64 20 46 49 4c 45 20 20 20 20 20 4f 70 65 72 61  d FILE     Opera
248b0 74 65 20 6f 6e 20 46 49 4c 45 20 6f 70 65 6e 65  te on FILE opene
248c0 64 20 75 73 69 6e 67 20 74 68 65 20 61 70 6e 64  d using the apnd
248d0 76 66 73 20 56 46 53 5c 6e 22 0a 22 20 20 2d 43  vfs VFS\n"."  -C
248e0 20 44 49 52 2c 20 2d 2d 64 69 72 65 63 74 6f 72   DIR, --director
248f0 79 20 44 49 52 20 20 20 20 43 68 61 6e 67 65 20  y DIR    Change 
24900 74 6f 20 64 69 72 65 63 74 6f 72 79 20 44 49 52  to directory DIR
24910 20 74 6f 20 72 65 61 64 2f 65 78 74 72 61 63 74   to read/extract
24920 20 66 69 6c 65 73 5c 6e 22 0a 22 20 20 2d 6e 2c   files\n"."  -n,
24930 20 2d 2d 64 72 79 72 75 6e 20 20 20 20 20 20 20   --dryrun       
24940 20 20 20 20 20 20 20 20 53 68 6f 77 20 74 68 65          Show the
24950 20 53 51 4c 20 74 68 61 74 20 77 6f 75 6c 64 20   SQL that would 
24960 68 61 76 65 20 6f 63 63 75 72 72 65 64 5c 6e 22  have occurred\n"
24970 0a 22 5c 6e 22 0a 22 53 65 65 20 61 6c 73 6f 3a  ."\n"."See also:
24980 20 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f   http://sqlite.o
24990 72 67 2f 63 6c 69 2e 68 74 6d 6c 23 73 71 6c 61  rg/cli.html#sqla
249a0 72 5f 61 72 63 68 69 76 65 5f 73 75 70 70 6f 72  r_archive_suppor
249b0 74 5c 6e 22 0a 22 5c 6e 22 0a 29 3b 0a 20 20 72  t\n"."\n".);.  r
249c0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
249d0 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69  OR;.}../*.** Pri
249e0 6e 74 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  nt an error mess
249f0 61 67 65 20 66 6f 72 20 74 68 65 20 2e 61 72 20  age for the .ar 
24a00 63 6f 6d 6d 61 6e 64 20 74 6f 20 73 74 64 65 72  command to stder
24a10 72 20 61 6e 64 20 72 65 74 75 72 6e 20 0a 2a 2a  r and return .**
24a20 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a   SQLITE_ERROR..*
24a30 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 45  /.static int arE
24a40 72 72 6f 72 4d 73 67 28 63 6f 6e 73 74 20 63 68  rrorMsg(const ch
24a50 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a  ar *zFmt, ...){.
24a60 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
24a70 63 68 61 72 20 2a 7a 3b 0a 20 20 76 61 5f 73 74  char *z;.  va_st
24a80 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20  art(ap, zFmt);. 
24a90 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70   z = sqlite3_vmp
24aa0 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b  rintf(zFmt, ap);
24ab0 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
24ac0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
24ad0 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 20 28  rr, "Error: %s (
24ae0 74 72 79 20 5c 22 2e 61 72 20 2d 2d 68 65 6c 70  try \".ar --help
24af0 5c 22 29 5c 6e 22 2c 20 7a 29 3b 0a 20 20 73 71  \")\n", z);.  sq
24b00 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
24b10 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
24b20 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56  RROR;.}../*.** V
24b30 61 6c 75 65 73 20 66 6f 72 20 41 72 43 6f 6d 6d  alues for ArComm
24b40 61 6e 64 2e 65 43 6d 64 2e 0a 2a 2f 0a 23 64 65  and.eCmd..*/.#de
24b50 66 69 6e 65 20 41 52 5f 43 4d 44 5f 43 52 45 41  fine AR_CMD_CREA
24b60 54 45 20 20 20 20 20 20 20 31 0a 23 64 65 66 69  TE       1.#defi
24b70 6e 65 20 41 52 5f 43 4d 44 5f 45 58 54 52 41 43  ne AR_CMD_EXTRAC
24b80 54 20 20 20 20 20 20 32 0a 23 64 65 66 69 6e 65  T      2.#define
24b90 20 41 52 5f 43 4d 44 5f 4c 49 53 54 20 20 20 20   AR_CMD_LIST    
24ba0 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 41       3.#define A
24bb0 52 5f 43 4d 44 5f 55 50 44 41 54 45 20 20 20 20  R_CMD_UPDATE    
24bc0 20 20 20 34 0a 23 64 65 66 69 6e 65 20 41 52 5f     4.#define AR_
24bd0 43 4d 44 5f 48 45 4c 50 20 20 20 20 20 20 20 20  CMD_HELP        
24be0 20 35 0a 0a 2f 2a 0a 2a 2a 20 4f 74 68 65 72 20   5../*.** Other 
24bf0 28 6e 6f 6e 2d 63 6f 6d 6d 61 6e 64 29 20 73 77  (non-command) sw
24c00 69 74 63 68 65 73 2e 0a 2a 2f 0a 23 64 65 66 69  itches..*/.#defi
24c10 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 56 45 52  ne AR_SWITCH_VER
24c20 42 4f 53 45 20 20 20 20 20 36 0a 23 64 65 66 69  BOSE     6.#defi
24c30 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 46 49 4c  ne AR_SWITCH_FIL
24c40 45 20 20 20 20 20 20 20 20 37 0a 23 64 65 66 69  E        7.#defi
24c50 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 44 49 52  ne AR_SWITCH_DIR
24c60 45 43 54 4f 52 59 20 20 20 38 0a 23 64 65 66 69  ECTORY   8.#defi
24c70 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 41 50 50  ne AR_SWITCH_APP
24c80 45 4e 44 20 20 20 20 20 20 39 0a 23 64 65 66 69  END      9.#defi
24c90 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 44 52 59  ne AR_SWITCH_DRY
24ca0 52 55 4e 20 20 20 20 20 31 30 0a 0a 73 74 61 74  RUN     10..stat
24cb0 69 63 20 69 6e 74 20 61 72 50 72 6f 63 65 73 73  ic int arProcess
24cc0 53 77 69 74 63 68 28 41 72 43 6f 6d 6d 61 6e 64  Switch(ArCommand
24cd0 20 2a 70 41 72 2c 20 69 6e 74 20 65 53 77 69 74   *pAr, int eSwit
24ce0 63 68 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ch, const char *
24cf0 7a 41 72 67 29 7b 0a 20 20 73 77 69 74 63 68 28  zArg){.  switch(
24d00 20 65 53 77 69 74 63 68 20 29 7b 0a 20 20 20 20   eSwitch ){.    
24d10 63 61 73 65 20 41 52 5f 43 4d 44 5f 43 52 45 41  case AR_CMD_CREA
24d20 54 45 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f  TE:.    case AR_
24d30 43 4d 44 5f 45 58 54 52 41 43 54 3a 0a 20 20 20  CMD_EXTRACT:.   
24d40 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 4c 49 53   case AR_CMD_LIS
24d50 54 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43  T:.    case AR_C
24d60 4d 44 5f 55 50 44 41 54 45 3a 0a 20 20 20 20 63  MD_UPDATE:.    c
24d70 61 73 65 20 41 52 5f 43 4d 44 5f 48 45 4c 50 3a  ase AR_CMD_HELP:
24d80 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 2d 3e  .      if( pAr->
24d90 65 43 6d 64 20 29 7b 0a 20 20 20 20 20 20 20 20  eCmd ){.        
24da0 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73  return arErrorMs
24db0 67 28 22 6d 75 6c 74 69 70 6c 65 20 63 6f 6d 6d  g("multiple comm
24dc0 61 6e 64 20 6f 70 74 69 6f 6e 73 22 29 3b 0a 20  and options");. 
24dd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41 72       }.      pAr
24de0 2d 3e 65 43 6d 64 20 3d 20 65 53 77 69 74 63 68  ->eCmd = eSwitch
24df0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a  ;.      break;..
24e00 20 20 20 20 63 61 73 65 20 41 52 5f 53 57 49 54      case AR_SWIT
24e10 43 48 5f 44 52 59 52 55 4e 3a 0a 20 20 20 20 20  CH_DRYRUN:.     
24e20 20 70 41 72 2d 3e 62 44 72 79 52 75 6e 20 3d 20   pAr->bDryRun = 
24e30 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
24e40 20 20 20 20 63 61 73 65 20 41 52 5f 53 57 49 54      case AR_SWIT
24e50 43 48 5f 56 45 52 42 4f 53 45 3a 0a 20 20 20 20  CH_VERBOSE:.    
24e60 20 20 70 41 72 2d 3e 62 56 65 72 62 6f 73 65 20    pAr->bVerbose 
24e70 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = 1;.      break
24e80 3b 0a 20 20 20 20 63 61 73 65 20 41 52 5f 53 57  ;.    case AR_SW
24e90 49 54 43 48 5f 41 50 50 45 4e 44 3a 0a 20 20 20  ITCH_APPEND:.   
24ea0 20 20 20 70 41 72 2d 3e 62 41 70 70 65 6e 64 20     pAr->bAppend 
24eb0 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61  = 1;.      /* Fa
24ec0 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 2d 2d 66  ll thru into --f
24ed0 69 6c 65 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  ile */.    case 
24ee0 41 52 5f 53 57 49 54 43 48 5f 46 49 4c 45 3a 0a  AR_SWITCH_FILE:.
24ef0 20 20 20 20 20 20 70 41 72 2d 3e 7a 46 69 6c 65        pAr->zFile
24f00 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 20 20 62   = zArg;.      b
24f10 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41  reak;.    case A
24f20 52 5f 53 57 49 54 43 48 5f 44 49 52 45 43 54 4f  R_SWITCH_DIRECTO
24f30 52 59 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 7a  RY:.      pAr->z
24f40 44 69 72 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20  Dir = zArg;.    
24f50 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20    break;.  }..  
24f60 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
24f70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65  ;.}../*.** Parse
24f80 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
24f90 65 20 66 6f 72 20 61 6e 20 22 2e 61 72 22 20 63  e for an ".ar" c
24fa0 6f 6d 6d 61 6e 64 2e 20 54 68 65 20 72 65 73 75  ommand. The resu
24fb0 6c 74 73 20 61 72 65 20 77 72 69 74 74 65 6e 20  lts are written 
24fc0 69 6e 74 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72  into.** structur
24fd0 65 20 28 2a 70 41 72 29 2e 20 53 51 4c 49 54 45  e (*pAr). SQLITE
24fe0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20  _OK is returned 
24ff0 69 66 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c  if the command l
25000 69 6e 65 20 69 73 20 70 61 72 73 65 64 0a 2a 2a  ine is parsed.**
25010 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f   successfully, o
25020 74 68 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f  therwise an erro
25030 72 20 6d 65 73 73 61 67 65 20 69 73 20 77 72 69  r message is wri
25040 74 74 65 6e 20 74 6f 20 73 74 64 65 72 72 20 61  tten to stderr a
25050 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52  nd .** SQLITE_ER
25060 52 4f 52 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f  ROR returned..*/
25070 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 50 61  .static int arPa
25080 72 73 65 43 6f 6d 6d 61 6e 64 28 0a 20 20 63 68  rseCommand(.  ch
25090 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20  ar **azArg,     
250a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
250b0 20 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65   Array of argume
250c0 6e 74 73 20 70 61 73 73 65 64 20 74 6f 20 64 6f  nts passed to do
250d0 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69  t command */.  i
250e0 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20  nt nArg,        
250f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25100 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72  * Number of entr
25110 69 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a  ies in azArg[] *
25120 2f 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a 70  /.  ArCommand *p
25130 41 72 20 20 20 20 20 20 20 20 20 20 20 20 20 20  Ar              
25140 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20      /* Populate 
25150 74 68 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29  this object */.)
25160 7b 0a 20 20 73 74 72 75 63 74 20 41 72 53 77 69  {.  struct ArSwi
25170 74 63 68 20 7b 0a 20 20 20 20 63 6f 6e 73 74 20  tch {.    const 
25180 63 68 61 72 20 2a 7a 4c 6f 6e 67 3b 0a 20 20 20  char *zLong;.   
25190 20 63 68 61 72 20 63 53 68 6f 72 74 3b 0a 20 20   char cShort;.  
251a0 20 20 75 38 20 65 53 77 69 74 63 68 3b 0a 20 20    u8 eSwitch;.  
251b0 20 20 75 38 20 62 41 72 67 3b 0a 20 20 7d 20 61    u8 bArg;.  } a
251c0 53 77 69 74 63 68 5b 5d 20 3d 20 7b 0a 20 20 20  Switch[] = {.   
251d0 20 7b 20 22 63 72 65 61 74 65 22 2c 20 20 20 20   { "create",    
251e0 27 63 27 2c 20 41 52 5f 43 4d 44 5f 43 52 45 41  'c', AR_CMD_CREA
251f0 54 45 2c 20 20 20 20 20 20 20 30 20 7d 2c 0a 20  TE,       0 },. 
25200 20 20 20 7b 20 22 65 78 74 72 61 63 74 22 2c 20     { "extract", 
25210 20 20 27 78 27 2c 20 41 52 5f 43 4d 44 5f 45 58    'x', AR_CMD_EX
25220 54 52 41 43 54 2c 20 20 20 20 20 20 30 20 7d 2c  TRACT,      0 },
25230 0a 20 20 20 20 7b 20 22 6c 69 73 74 22 2c 20 20  .    { "list",  
25240 20 20 20 20 27 74 27 2c 20 41 52 5f 43 4d 44 5f      't', AR_CMD_
25250 4c 49 53 54 2c 20 20 20 20 20 20 20 20 20 30 20  LIST,         0 
25260 7d 2c 0a 20 20 20 20 7b 20 22 75 70 64 61 74 65  },.    { "update
25270 22 2c 20 20 20 20 27 75 27 2c 20 41 52 5f 43 4d  ",    'u', AR_CM
25280 44 5f 55 50 44 41 54 45 2c 20 20 20 20 20 20 20  D_UPDATE,       
25290 30 20 7d 2c 0a 20 20 20 20 7b 20 22 68 65 6c 70  0 },.    { "help
252a0 22 2c 20 20 20 20 20 20 27 68 27 2c 20 41 52 5f  ",      'h', AR_
252b0 43 4d 44 5f 48 45 4c 50 2c 20 20 20 20 20 20 20  CMD_HELP,       
252c0 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22 76 65    0 },.    { "ve
252d0 72 62 6f 73 65 22 2c 20 20 20 27 76 27 2c 20 41  rbose",   'v', A
252e0 52 5f 53 57 49 54 43 48 5f 56 45 52 42 4f 53 45  R_SWITCH_VERBOSE
252f0 2c 20 20 20 30 20 7d 2c 0a 20 20 20 20 7b 20 22  ,   0 },.    { "
25300 66 69 6c 65 22 2c 20 20 20 20 20 20 27 66 27 2c  file",      'f',
25310 20 41 52 5f 53 57 49 54 43 48 5f 46 49 4c 45 2c   AR_SWITCH_FILE,
25320 20 20 20 20 20 20 31 20 7d 2c 0a 20 20 20 20 7b        1 },.    {
25330 20 22 61 70 70 65 6e 64 22 2c 20 20 20 20 27 61   "append",    'a
25340 27 2c 20 41 52 5f 53 57 49 54 43 48 5f 41 50 50  ', AR_SWITCH_APP
25350 45 4e 44 2c 20 20 20 20 31 20 7d 2c 0a 20 20 20  END,    1 },.   
25360 20 7b 20 22 64 69 72 65 63 74 6f 72 79 22 2c 20   { "directory", 
25370 27 43 27 2c 20 41 52 5f 53 57 49 54 43 48 5f 44  'C', AR_SWITCH_D
25380 49 52 45 43 54 4f 52 59 2c 20 31 20 7d 2c 0a 20  IRECTORY, 1 },. 
25390 20 20 20 7b 20 22 64 72 79 72 75 6e 22 2c 20 20     { "dryrun",  
253a0 20 20 27 6e 27 2c 20 41 52 5f 53 57 49 54 43 48    'n', AR_SWITCH
253b0 5f 44 52 59 52 55 4e 2c 20 20 20 20 30 20 7d 2c  _DRYRUN,    0 },
253c0 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 6e 53 77 69  .  };.  int nSwi
253d0 74 63 68 20 3d 20 73 69 7a 65 6f 66 28 61 53 77  tch = sizeof(aSw
253e0 69 74 63 68 29 20 2f 20 73 69 7a 65 6f 66 28 73  itch) / sizeof(s
253f0 74 72 75 63 74 20 41 72 53 77 69 74 63 68 29 3b  truct ArSwitch);
25400 0a 20 20 73 74 72 75 63 74 20 41 72 53 77 69 74  .  struct ArSwit
25410 63 68 20 2a 70 45 6e 64 20 3d 20 26 61 53 77 69  ch *pEnd = &aSwi
25420 74 63 68 5b 6e 53 77 69 74 63 68 5d 3b 0a 0a 20  tch[nSwitch];.. 
25430 20 69 66 28 20 6e 41 72 67 3c 3d 31 20 29 7b 0a   if( nArg<=1 ){.
25440 20 20 20 20 72 65 74 75 72 6e 20 61 72 55 73 61      return arUsa
25450 67 65 28 73 74 64 65 72 72 29 3b 0a 20 20 7d 65  ge(stderr);.  }e
25460 6c 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  lse{.    char *z
25470 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20   = azArg[1];.   
25480 20 6d 65 6d 73 65 74 28 70 41 72 2c 20 30 2c 20   memset(pAr, 0, 
25490 73 69 7a 65 6f 66 28 41 72 43 6f 6d 6d 61 6e 64  sizeof(ArCommand
254a0 29 29 3b 0a 0a 20 20 20 20 69 66 28 20 7a 5b 30  ));..    if( z[0
254b0 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20  ]!='-' ){.      
254c0 2f 2a 20 54 72 61 64 69 74 69 6f 6e 61 6c 20 73  /* Traditional s
254d0 74 79 6c 65 20 5b 74 61 72 5d 20 69 6e 76 6f 63  tyle [tar] invoc
254e0 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ation */.      i
254f0 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt i;.      int 
25500 69 41 72 67 20 3d 20 32 3b 0a 20 20 20 20 20 20  iArg = 2;.      
25510 66 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69  for(i=0; z[i]; i
25520 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ++){.        con
25530 73 74 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20  st char *zArg = 
25540 30 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63  0;.        struc
25550 74 20 41 72 53 77 69 74 63 68 20 2a 70 4f 70 74  t ArSwitch *pOpt
25560 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 4f  ;.        for(pO
25570 70 74 3d 26 61 53 77 69 74 63 68 5b 30 5d 3b 20  pt=&aSwitch[0]; 
25580 70 4f 70 74 3c 70 45 6e 64 3b 20 70 4f 70 74 2b  pOpt<pEnd; pOpt+
25590 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
255a0 28 20 7a 5b 69 5d 3d 3d 70 4f 70 74 2d 3e 63 53  ( z[i]==pOpt->cS
255b0 68 6f 72 74 20 29 20 62 72 65 61 6b 3b 0a 20 20  hort ) break;.  
255c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
255d0 69 66 28 20 70 4f 70 74 3d 3d 70 45 6e 64 20 29  if( pOpt==pEnd )
255e0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  {.          retu
255f0 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 22 75  rn arErrorMsg("u
25600 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74 69  nrecognized opti
25610 6f 6e 3a 20 25 63 22 2c 20 7a 5b 69 5d 29 3b 0a  on: %c", z[i]);.
25620 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25630 20 20 69 66 28 20 70 4f 70 74 2d 3e 62 41 72 67    if( pOpt->bArg
25640 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
25650 28 20 69 41 72 67 3e 3d 6e 41 72 67 20 29 7b 0a  ( iArg>=nArg ){.
25660 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
25670 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 22 6f  rn arErrorMsg("o
25680 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61  ption requires a
25690 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25 63 22 2c  n argument: %c",
256a0 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  z[i]);.         
256b0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 41 72   }.          zAr
256c0 67 20 3d 20 61 7a 41 72 67 5b 69 41 72 67 2b 2b  g = azArg[iArg++
256d0 5d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ];.        }.   
256e0 20 20 20 20 20 69 66 28 20 61 72 50 72 6f 63 65       if( arProce
256f0 73 73 53 77 69 74 63 68 28 70 41 72 2c 20 70 4f  ssSwitch(pAr, pO
25700 70 74 2d 3e 65 53 77 69 74 63 68 2c 20 7a 41 72  pt->eSwitch, zAr
25710 67 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  g) ) return SQLI
25720 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
25730 7d 0a 20 20 20 20 20 20 70 41 72 2d 3e 6e 41 72  }.      pAr->nAr
25740 67 20 3d 20 6e 41 72 67 2d 69 41 72 67 3b 0a 20  g = nArg-iArg;. 
25750 20 20 20 20 20 69 66 28 20 70 41 72 2d 3e 6e 41       if( pAr->nA
25760 72 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  rg>0 ){.        
25770 70 41 72 2d 3e 61 7a 41 72 67 20 3d 20 26 61 7a  pAr->azArg = &az
25780 41 72 67 5b 69 41 72 67 5d 3b 0a 20 20 20 20 20  Arg[iArg];.     
25790 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
257a0 20 20 20 20 2f 2a 20 4e 6f 6e 2d 74 72 61 64 69      /* Non-tradi
257b0 74 69 6f 6e 61 6c 20 69 6e 76 6f 63 61 74 69 6f  tional invocatio
257c0 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  n */.      int i
257d0 41 72 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  Arg;.      for(i
257e0 41 72 67 3d 31 3b 20 69 41 72 67 3c 6e 41 72 67  Arg=1; iArg<nArg
257f0 3b 20 69 41 72 67 2b 2b 29 7b 0a 20 20 20 20 20  ; iArg++){.     
25800 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20     int n;.      
25810 20 20 7a 20 3d 20 61 7a 41 72 67 5b 69 41 72 67    z = azArg[iArg
25820 5d 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ];.        if( z
25830 5b 30 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20  [0]!='-' ){.    
25840 20 20 20 20 20 20 2f 2a 20 41 6c 6c 20 72 65 6d        /* All rem
25850 61 69 6e 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 6c  aining command l
25860 69 6e 65 20 77 6f 72 64 73 20 61 72 65 20 63 6f  ine words are co
25870 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 2e  mmand arguments.
25880 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 41   */.          pA
25890 72 2d 3e 61 7a 41 72 67 20 3d 20 26 61 7a 41 72  r->azArg = &azAr
258a0 67 5b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20  g[iArg];.       
258b0 20 20 20 70 41 72 2d 3e 6e 41 72 67 20 3d 20 6e     pAr->nArg = n
258c0 41 72 67 2d 69 41 72 67 3b 0a 20 20 20 20 20 20  Arg-iArg;.      
258d0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
258e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 20 3d     }.        n =
258f0 20 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 0a 20   strlen30(z);.. 
25900 20 20 20 20 20 20 20 69 66 28 20 7a 5b 31 5d 21         if( z[1]!
25910 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='-' ){.        
25920 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
25930 20 20 20 2f 2a 20 4f 6e 65 20 6f 72 20 6d 6f 72     /* One or mor
25940 65 20 73 68 6f 72 74 20 6f 70 74 69 6f 6e 73 20  e short options 
25950 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72  */.          for
25960 28 69 3d 31 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=1; i<n; i++){
25970 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
25980 73 74 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20  st char *zArg = 
25990 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  0;.            s
259a0 74 72 75 63 74 20 41 72 53 77 69 74 63 68 20 2a  truct ArSwitch *
259b0 70 4f 70 74 3b 0a 20 20 20 20 20 20 20 20 20 20  pOpt;.          
259c0 20 20 66 6f 72 28 70 4f 70 74 3d 26 61 53 77 69    for(pOpt=&aSwi
259d0 74 63 68 5b 30 5d 3b 20 70 4f 70 74 3c 70 45 6e  tch[0]; pOpt<pEn
259e0 64 3b 20 70 4f 70 74 2b 2b 29 7b 0a 20 20 20 20  d; pOpt++){.    
259f0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b            if( z[
25a00 69 5d 3d 3d 70 4f 70 74 2d 3e 63 53 68 6f 72 74  i]==pOpt->cShort
25a10 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
25a20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25a30 20 20 20 20 69 66 28 20 70 4f 70 74 3d 3d 70 45      if( pOpt==pE
25a40 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nd ){.          
25a50 20 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72      return arErr
25a60 6f 72 4d 73 67 28 22 75 6e 72 65 63 6f 67 6e 69  orMsg("unrecogni
25a70 7a 65 64 20 6f 70 74 69 6f 6e 3a 20 25 63 5c 6e  zed option: %c\n
25a80 22 2c 20 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20  ", z[i]);.      
25a90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25aa0 20 20 20 20 69 66 28 20 70 4f 70 74 2d 3e 62 41      if( pOpt->bA
25ab0 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rg ){.          
25ac0 20 20 20 20 69 66 28 20 69 3c 28 6e 2d 31 29 20      if( i<(n-1) 
25ad0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
25ae0 20 20 20 7a 41 72 67 20 3d 20 26 7a 5b 69 2b 31     zArg = &z[i+1
25af0 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
25b00 20 20 20 69 20 3d 20 6e 3b 0a 20 20 20 20 20 20     i = n;.      
25b10 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
25b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
25b30 66 28 20 69 41 72 67 3e 3d 28 6e 41 72 67 2d 31  f( iArg>=(nArg-1
25b40 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
25b50 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72         return ar
25b60 45 72 72 6f 72 4d 73 67 28 22 6f 70 74 69 6f 6e  ErrorMsg("option
25b70 20 72 65 71 75 69 72 65 73 20 61 6e 20 61 72 67   requires an arg
25b80 75 6d 65 6e 74 3a 20 25 63 5c 6e 22 2c 7a 5b 69  ument: %c\n",z[i
25b90 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
25ba0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
25bb0 20 20 20 20 20 20 7a 41 72 67 20 3d 20 61 7a 41        zArg = azA
25bc0 72 67 5b 2b 2b 69 41 72 67 5d 3b 0a 20 20 20 20  rg[++iArg];.    
25bd0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
25be0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
25bf0 20 20 20 20 20 20 69 66 28 20 61 72 50 72 6f 63        if( arProc
25c00 65 73 73 53 77 69 74 63 68 28 70 41 72 2c 20 70  essSwitch(pAr, p
25c10 4f 70 74 2d 3e 65 53 77 69 74 63 68 2c 20 7a 41  Opt->eSwitch, zA
25c20 72 67 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c  rg) ) return SQL
25c30 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
25c40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
25c50 65 6c 73 65 20 69 66 28 20 7a 5b 32 5d 3d 3d 27  else if( z[2]=='
25c60 5c 30 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  \0' ){.         
25c70 20 2f 2a 20 41 20 2d 2d 20 6f 70 74 69 6f 6e 2c   /* A -- option,
25c80 20 69 6e 64 69 63 61 74 69 6e 67 20 74 68 61 74   indicating that
25c90 20 61 6c 6c 20 72 65 6d 61 69 6e 69 6e 67 20 63   all remaining c
25ca0 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 77 6f 72 64  ommand line word
25cb0 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61  s.          ** a
25cc0 72 65 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  re command argum
25cd0 65 6e 74 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ents.  */.      
25ce0 20 20 20 20 70 41 72 2d 3e 61 7a 41 72 67 20 3d      pAr->azArg =
25cf0 20 26 61 7a 41 72 67 5b 69 41 72 67 2b 31 5d 3b   &azArg[iArg+1];
25d00 0a 20 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e  .          pAr->
25d10 6e 41 72 67 20 3d 20 6e 41 72 67 2d 69 41 72 67  nArg = nArg-iArg
25d20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  -1;.          br
25d30 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  eak;.        }el
25d40 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  se{.          /*
25d50 20 41 20 6c 6f 6e 67 20 6f 70 74 69 6f 6e 20 2a   A long option *
25d60 2f 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  /.          cons
25d70 74 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 30  t char *zArg = 0
25d80 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
25d90 20 41 72 67 75 6d 65 6e 74 20 66 6f 72 20 6f 70   Argument for op
25da0 74 69 6f 6e 2c 20 69 66 20 61 6e 79 20 2a 2f 0a  tion, if any */.
25db0 20 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74            struct
25dc0 20 41 72 53 77 69 74 63 68 20 2a 70 4d 61 74 63   ArSwitch *pMatc
25dd0 68 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4d  h = 0;      /* M
25de0 61 74 63 68 69 6e 67 20 6f 70 74 69 6f 6e 20 2a  atching option *
25df0 2f 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 75  /.          stru
25e00 63 74 20 41 72 53 77 69 74 63 68 20 2a 70 4f 70  ct ArSwitch *pOp
25e10 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t;            /*
25e20 20 49 74 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20   Iterator */.   
25e30 20 20 20 20 20 20 20 66 6f 72 28 70 4f 70 74 3d         for(pOpt=
25e40 26 61 53 77 69 74 63 68 5b 30 5d 3b 20 70 4f 70  &aSwitch[0]; pOp
25e50 74 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b  t<pEnd; pOpt++){
25e60 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
25e70 73 74 20 63 68 61 72 20 2a 7a 4c 6f 6e 67 20 3d  st char *zLong =
25e80 20 70 4f 70 74 2d 3e 7a 4c 6f 6e 67 3b 0a 20 20   pOpt->zLong;.  
25e90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 6e            if( (n
25ea0 2d 32 29 3c 3d 73 74 72 6c 65 6e 33 30 28 7a 4c  -2)<=strlen30(zL
25eb0 6f 6e 67 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  ong) && 0==memcm
25ec0 70 28 26 7a 5b 32 5d 2c 20 7a 4c 6f 6e 67 2c 20  p(&z[2], zLong, 
25ed0 6e 2d 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  n-2) ){.        
25ee0 20 20 20 20 20 20 69 66 28 20 70 4d 61 74 63 68        if( pMatch
25ef0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
25f00 20 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72      return arErr
25f10 6f 72 4d 73 67 28 22 61 6d 62 69 67 75 6f 75 73  orMsg("ambiguous
25f20 20 6f 70 74 69 6f 6e 3a 20 25 73 22 2c 7a 29 3b   option: %s",z);
25f30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
25f40 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
25f50 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70        pMatch = p
25f60 4f 70 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Opt;.           
25f70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
25f80 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a   }.          }..
25f90 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4d            if( pM
25fa0 61 74 63 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20  atch==0 ){.     
25fb0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72         return ar
25fc0 45 72 72 6f 72 4d 73 67 28 22 75 6e 72 65 63 6f  ErrorMsg("unreco
25fd0 67 6e 69 7a 65 64 20 6f 70 74 69 6f 6e 3a 20 25  gnized option: %
25fe0 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20  s", z);.        
25ff0 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
26000 28 20 70 4d 61 74 63 68 2d 3e 62 41 72 67 20 29  ( pMatch->bArg )
26010 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
26020 28 20 69 41 72 67 3e 3d 28 6e 41 72 67 2d 31 29  ( iArg>=(nArg-1)
26030 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
26040 20 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72    return arError
26050 4d 73 67 28 22 6f 70 74 69 6f 6e 20 72 65 71 75  Msg("option requ
26060 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  ires an argument
26070 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20  : %s", z);.     
26080 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
26090 20 20 20 20 20 7a 41 72 67 20 3d 20 61 7a 41 72       zArg = azAr
260a0 67 5b 2b 2b 69 41 72 67 5d 3b 0a 20 20 20 20 20  g[++iArg];.     
260b0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
260c0 20 69 66 28 20 61 72 50 72 6f 63 65 73 73 53 77   if( arProcessSw
260d0 69 74 63 68 28 70 41 72 2c 20 70 4d 61 74 63 68  itch(pAr, pMatch
260e0 2d 3e 65 53 77 69 74 63 68 2c 20 7a 41 72 67 29  ->eSwitch, zArg)
260f0 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
26100 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
26110 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
26120 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
26130 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
26140 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
26150 61 73 73 75 6d 65 73 20 74 68 61 74 20 61 6c 6c  assumes that all
26160 20 61 72 67 75 6d 65 6e 74 73 20 77 69 74 68 69   arguments withi
26170 6e 20 74 68 65 20 41 72 43 6f 6d 6d 61 6e 64 2e  n the ArCommand.
26180 61 7a 41 72 67 5b 5d 0a 2a 2a 20 61 72 72 61 79  azArg[].** array
26190 20 72 65 66 65 72 20 74 6f 20 61 72 63 68 69 76   refer to archiv
261a0 65 20 6d 65 6d 62 65 72 73 2c 20 61 73 20 66 6f  e members, as fo
261b0 72 20 74 68 65 20 2d 2d 65 78 74 72 61 63 74 20  r the --extract 
261c0 6f 72 20 2d 2d 6c 69 73 74 20 63 6f 6d 6d 61 6e  or --list comman
261d0 64 73 2e 20 0a 2a 2a 20 49 74 20 63 68 65 63 6b  ds. .** It check
261e0 73 20 74 68 61 74 20 65 61 63 68 20 6f 66 20 74  s that each of t
261f0 68 65 6d 20 61 72 65 20 70 72 65 73 65 6e 74 2e  hem are present.
26200 20 49 66 20 61 6e 79 20 73 70 65 63 69 66 69 65   If any specifie
26210 64 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a  d file is not.**
26220 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
26230 61 72 63 68 69 76 65 2c 20 61 6e 20 65 72 72 6f  archive, an erro
26240 72 20 69 73 20 70 72 69 6e 74 65 64 20 74 6f 20  r is printed to 
26250 73 74 64 65 72 72 20 61 6e 64 20 61 6e 20 65 72  stderr and an er
26260 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 72 65 74 75  ror.** code retu
26270 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
26280 20 69 66 20 61 6c 6c 20 73 70 65 63 69 66 69 65   if all specifie
26290 64 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  d arguments are 
262a0 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68  present in.** th
262b0 65 20 61 72 63 68 69 76 65 2c 20 53 51 4c 49 54  e archive, SQLIT
262c0 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
262d0 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
262e0 63 74 69 6f 6e 20 73 74 72 69 70 73 20 61 6e 79  ction strips any
262f0 20 74 72 61 69 6c 69 6e 67 20 27 2f 27 20 63 68   trailing '/' ch
26300 61 72 61 63 74 65 72 73 20 66 72 6f 6d 20 65 61  aracters from ea
26310 63 68 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20  ch argument..** 
26320 54 68 69 73 20 69 73 20 63 6f 6e 73 69 73 74 65  This is consiste
26330 6e 74 20 77 69 74 68 20 74 68 65 20 77 61 79 20  nt with the way 
26340 74 68 65 20 5b 74 61 72 5d 20 63 6f 6d 6d 61 6e  the [tar] comman
26350 64 20 73 65 65 6d 73 20 74 6f 20 77 6f 72 6b 20  d seems to work 
26360 6f 6e 0a 2a 2a 20 4c 69 6e 75 78 2e 0a 2a 2f 0a  on.** Linux..*/.
26370 73 74 61 74 69 63 20 69 6e 74 20 61 72 43 68 65  static int arChe
26380 63 6b 45 6e 74 72 69 65 73 28 41 72 43 6f 6d 6d  ckEntries(ArComm
26390 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20 69 6e 74  and *pAr){.  int
263a0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
263b0 0a 20 20 69 66 28 20 70 41 72 2d 3e 6e 41 72 67  .  if( pAr->nArg
263c0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a   ){.    int i, j
263d0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74  ;.    sqlite3_st
263e0 6d 74 20 2a 70 54 65 73 74 20 3d 20 30 3b 0a 0a  mt *pTest = 0;..
263f0 20 20 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65      shellPrepare
26400 50 72 69 6e 74 66 28 70 41 72 2d 3e 64 62 2c 20  Printf(pAr->db, 
26410 26 72 63 2c 20 26 70 54 65 73 74 2c 0a 20 20 20  &rc, &pTest,.   
26420 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d       "SELECT nam
26430 65 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20  e FROM %s WHERE 
26440 6e 61 6d 65 3d 24 6e 61 6d 65 22 2c 20 0a 20 20  name=$name", .  
26450 20 20 20 20 20 20 70 41 72 2d 3e 7a 53 72 63 54        pAr->zSrcT
26460 61 62 6c 65 0a 20 20 20 20 29 3b 0a 20 20 20 20  able.    );.    
26470 6a 20 3d 20 73 71 6c 69 74 65 33 5f 62 69 6e 64  j = sqlite3_bind
26480 5f 70 61 72 61 6d 65 74 65 72 5f 69 6e 64 65 78  _parameter_index
26490 28 70 54 65 73 74 2c 20 22 24 6e 61 6d 65 22 29  (pTest, "$name")
264a0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
264b0 3c 70 41 72 2d 3e 6e 41 72 67 20 26 26 20 72 63  <pAr->nArg && rc
264c0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b  ==SQLITE_OK; i++
264d0 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
264e0 20 3d 20 70 41 72 2d 3e 61 7a 41 72 67 5b 69 5d   = pAr->azArg[i]
264f0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  ;.      int n = 
26500 73 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20  strlen30(z);.   
26510 20 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3b 0a     int bOk = 0;.
26520 20 20 20 20 20 20 77 68 69 6c 65 28 20 6e 3e 30        while( n>0
26530 20 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20   && z[n-1]=='/' 
26540 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 5b 6e  ) n--;.      z[n
26550 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20  ] = '\0';.      
26560 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
26570 74 28 70 54 65 73 74 2c 20 6a 2c 20 7a 2c 20 2d  t(pTest, j, z, -
26580 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43  1, SQLITE_STATIC
26590 29 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c  );.      if( SQL
265a0 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
265b0 5f 73 74 65 70 28 70 54 65 73 74 29 20 29 7b 0a  _step(pTest) ){.
265c0 20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b          bOk = 1;
265d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
265e0 68 65 6c 6c 52 65 73 65 74 28 26 72 63 2c 20 70  hellReset(&rc, p
265f0 54 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Test);.      if(
26600 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26   rc==SQLITE_OK &
26610 26 20 62 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20 20  & bOk==0 ){.    
26620 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
26630 73 74 64 65 72 72 2c 20 22 6e 6f 74 20 66 6f 75  stderr, "not fou
26640 6e 64 20 69 6e 20 61 72 63 68 69 76 65 3a 20 25  nd in archive: %
26650 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20  s\n", z);.      
26660 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
26670 52 4f 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ROR;.      }.   
26680 20 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61   }.    shellFina
26690 6c 69 7a 65 28 26 72 63 2c 20 70 54 65 73 74 29  lize(&rc, pTest)
266a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
266b0 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 6d  c;.}../*.** Form
266c0 61 74 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  at a WHERE claus
266d0 65 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  e that can be us
266e0 65 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 22  ed against the "
266f0 73 71 6c 61 72 22 20 74 61 62 6c 65 20 74 6f 0a  sqlar" table to.
26700 2a 2a 20 69 64 65 6e 74 69 66 79 20 61 6c 6c 20  ** identify all 
26710 61 72 63 68 69 76 65 20 6d 65 6d 62 65 72 73 20  archive members 
26720 74 68 61 74 20 6d 61 74 63 68 20 74 68 65 20 63  that match the c
26730 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73  ommand arguments
26740 20 68 65 6c 64 0a 2a 2a 20 69 6e 20 28 2a 70 41   held.** in (*pA
26750 72 29 2e 20 4c 65 61 76 65 20 74 68 69 73 20 57  r). Leave this W
26760 48 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 28  HERE clause in (
26770 2a 70 7a 57 68 65 72 65 29 20 62 65 66 6f 72 65  *pzWhere) before
26780 20 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 54   returning..** T
26790 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73  he caller is res
267a0 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 76 65  ponsible for eve
267b0 6e 74 75 61 6c 6c 79 20 63 61 6c 6c 69 6e 67 20  ntually calling 
267c0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 6f  sqlite3_free() o
267d0 6e 0a 2a 2a 20 61 6e 79 20 6e 6f 6e 2d 4e 55 4c  n.** any non-NUL
267e0 4c 20 28 2a 70 7a 57 68 65 72 65 29 20 76 61 6c  L (*pzWhere) val
267f0 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ue..*/.static vo
26800 69 64 20 61 72 57 68 65 72 65 43 6c 61 75 73 65  id arWhereClause
26810 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20  (.  int *pRc, . 
26820 20 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c   ArCommand *pAr,
26830 20 0a 20 20 63 68 61 72 20 2a 2a 70 7a 57 68 65   .  char **pzWhe
26840 72 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  re              
26850 20 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20      /* OUT: New 
26860 57 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a  WHERE clause */.
26870 29 7b 0a 20 20 63 68 61 72 20 2a 7a 57 68 65 72  ){.  char *zWher
26880 65 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52  e = 0;.  if( *pR
26890 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
268a0 20 20 20 20 69 66 28 20 70 41 72 2d 3e 6e 41 72      if( pAr->nAr
268b0 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 57  g==0 ){.      zW
268c0 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  here = sqlite3_m
268d0 70 72 69 6e 74 66 28 22 31 22 29 3b 0a 20 20 20  printf("1");.   
268e0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e   }else{.      in
268f0 74 20 69 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  t i;.      const
26900 20 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 22   char *zSep = ""
26910 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
26920 20 69 3c 70 41 72 2d 3e 6e 41 72 67 3b 20 69 2b   i<pAr->nArg; i+
26930 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  +){.        cons
26940 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 41 72 2d  t char *z = pAr-
26950 3e 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20  >azArg[i];.     
26960 20 20 20 7a 57 68 65 72 65 20 3d 20 73 71 6c 69     zWhere = sqli
26970 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
26980 20 20 20 20 20 20 20 22 25 7a 25 73 20 6e 61 6d         "%z%s nam
26990 65 20 3d 20 27 25 71 27 20 4f 52 20 73 75 62 73  e = '%q' OR subs
269a0 74 72 28 6e 61 6d 65 2c 31 2c 25 64 29 20 3d 20  tr(name,1,%d) = 
269b0 27 25 71 2f 27 22 2c 20 0a 20 20 20 20 20 20 20  '%q/'", .       
269c0 20 20 20 7a 57 68 65 72 65 2c 20 7a 53 65 70 2c     zWhere, zSep,
269d0 20 7a 2c 20 73 74 72 6c 65 6e 33 30 28 7a 29 2b   z, strlen30(z)+
269e0 31 2c 20 7a 0a 20 20 20 20 20 20 20 20 29 3b 0a  1, z.        );.
269f0 20 20 20 20 20 20 20 20 69 66 28 20 7a 57 68 65          if( zWhe
26a00 72 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  re==0 ){.       
26a10 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
26a20 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20  _NOMEM;.        
26a30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
26a40 20 7d 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20   }.        zSep 
26a50 3d 20 22 20 4f 52 20 22 3b 0a 20 20 20 20 20 20  = " OR ";.      
26a60 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70  }.    }.  }.  *p
26a70 7a 57 68 65 72 65 20 3d 20 7a 57 68 65 72 65 3b  zWhere = zWhere;
26a80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
26a90 65 6e 74 61 74 69 6f 6e 20 6f 66 20 2e 61 72 20  entation of .ar 
26aa0 22 6c 69 73 54 22 20 63 6f 6d 6d 61 6e 64 2e 20  "lisT" command. 
26ab0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
26ac0 72 4c 69 73 74 43 6f 6d 6d 61 6e 64 28 41 72 43  rListCommand(ArC
26ad0 6f 6d 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20  ommand *pAr){.  
26ae0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
26af0 20 3d 20 22 53 45 4c 45 43 54 20 25 73 20 46 52   = "SELECT %s FR
26b00 4f 4d 20 25 73 20 57 48 45 52 45 20 25 73 22 3b  OM %s WHERE %s";
26b10 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
26b20 61 7a 43 6f 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20  azCols[] = {.   
26b30 20 22 6e 61 6d 65 22 2c 0a 20 20 20 20 22 6c 73   "name",.    "ls
26b40 6d 6f 64 65 28 6d 6f 64 65 29 2c 20 73 7a 2c 20  mode(mode), sz, 
26b50 64 61 74 65 74 69 6d 65 28 6d 74 69 6d 65 2c 20  datetime(mtime, 
26b60 27 75 6e 69 78 65 70 6f 63 68 27 29 2c 20 6e 61  'unixepoch'), na
26b70 6d 65 22 0a 20 20 7d 3b 0a 0a 20 20 63 68 61 72  me".  };..  char
26b80 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b 0a 20 20   *zWhere = 0;.  
26b90 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
26ba0 71 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ql = 0;.  int rc
26bb0 3b 0a 0a 20 20 72 63 20 3d 20 61 72 43 68 65 63  ;..  rc = arChec
26bc0 6b 45 6e 74 72 69 65 73 28 70 41 72 29 3b 0a 20  kEntries(pAr);. 
26bd0 20 61 72 57 68 65 72 65 43 6c 61 75 73 65 28 26   arWhereClause(&
26be0 72 63 2c 20 70 41 72 2c 20 26 7a 57 68 65 72 65  rc, pAr, &zWhere
26bf0 29 3b 0a 0a 20 20 73 68 65 6c 6c 50 72 65 70 61  );..  shellPrepa
26c00 72 65 50 72 69 6e 74 66 28 70 41 72 2d 3e 64 62  rePrintf(pAr->db
26c10 2c 20 26 72 63 2c 20 26 70 53 71 6c 2c 20 7a 53  , &rc, &pSql, zS
26c20 71 6c 2c 20 61 7a 43 6f 6c 73 5b 70 41 72 2d 3e  ql, azCols[pAr->
26c30 62 56 65 72 62 6f 73 65 5d 2c 0a 20 20 20 20 20  bVerbose],.     
26c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26c50 70 41 72 2d 3e 7a 53 72 63 54 61 62 6c 65 2c 20  pAr->zSrcTable, 
26c60 7a 57 68 65 72 65 29 3b 0a 20 20 69 66 28 20 70  zWhere);.  if( p
26c70 41 72 2d 3e 62 44 72 79 52 75 6e 20 29 7b 0a 20  Ar->bDryRun ){. 
26c80 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
26c90 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c  Ar->p->out, "%s\
26ca0 6e 22 2c 20 73 71 6c 69 74 65 33 5f 73 71 6c 28  n", sqlite3_sql(
26cb0 70 53 71 6c 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  pSql));.  }else{
26cc0 0a 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d  .    while( rc==
26cd0 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c  SQLITE_OK && SQL
26ce0 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33  ITE_ROW==sqlite3
26cf0 5f 73 74 65 70 28 70 53 71 6c 29 20 29 7b 0a 20  _step(pSql) ){. 
26d00 20 20 20 20 20 69 66 28 20 70 41 72 2d 3e 62 56       if( pAr->bV
26d10 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20  erbose ){.      
26d20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41    utf8_printf(pA
26d30 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 20 25  r->p->out, "%s %
26d40 20 31 30 64 20 20 25 73 20 20 25 73 5c 6e 22 2c   10d  %s  %s\n",
26d50 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
26d60 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
26d70 28 70 53 71 6c 2c 20 30 29 2c 0a 20 20 20 20 20  (pSql, 0),.     
26d80 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
26d90 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20  olumn_int(pSql, 
26da0 31 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  1), .           
26db0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
26dc0 74 65 78 74 28 70 53 71 6c 2c 20 32 29 2c 0a 20  text(pSql, 2),. 
26dd0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
26de0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
26df0 53 71 6c 2c 20 33 29 0a 20 20 20 20 20 20 20 20  Sql, 3).        
26e00 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
26e10 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
26e20 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75 74 2c  ntf(pAr->p->out,
26e30 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33   "%s\n", sqlite3
26e40 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71  _column_text(pSq
26e50 6c 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 7d 0a  l, 0));.      }.
26e60 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 68 65 6c      }.  }.  shel
26e70 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70  lFinalize(&rc, p
26e80 53 71 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  Sql);.  return r
26e90 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  c;.}.../*.** Imp
26ea0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 2e  lementation of .
26eb0 61 72 20 22 65 58 74 72 61 63 74 22 20 63 6f 6d  ar "eXtract" com
26ec0 6d 61 6e 64 2e 20 0a 2a 2f 0a 73 74 61 74 69 63  mand. .*/.static
26ed0 20 69 6e 74 20 61 72 45 78 74 72 61 63 74 43 6f   int arExtractCo
26ee0 6d 6d 61 6e 64 28 41 72 43 6f 6d 6d 61 6e 64 20  mmand(ArCommand 
26ef0 2a 70 41 72 29 7b 0a 20 20 63 6f 6e 73 74 20 63  *pAr){.  const c
26f00 68 61 72 20 2a 7a 53 71 6c 31 20 3d 20 0a 20 20  har *zSql1 = .  
26f10 20 20 22 53 45 4c 45 43 54 20 22 0a 20 20 20 20    "SELECT ".    
26f20 22 20 28 24 64 69 72 20 7c 7c 20 6e 61 6d 65 29  " ($dir || name)
26f30 2c 22 0a 20 20 20 20 22 20 77 72 69 74 65 66 69  ,".    " writefi
26f40 6c 65 28 28 24 64 69 72 20 7c 7c 20 6e 61 6d 65  le(($dir || name
26f50 29 2c 20 25 73 2c 20 6d 6f 64 65 2c 20 6d 74 69  ), %s, mode, mti
26f60 6d 65 29 20 22 0a 20 20 20 20 22 46 52 4f 4d 20  me) ".    "FROM 
26f70 25 73 20 57 48 45 52 45 20 28 25 73 29 20 41 4e  %s WHERE (%s) AN
26f80 44 20 28 64 61 74 61 20 49 53 20 4e 55 4c 4c 20  D (data IS NULL 
26f90 4f 52 20 24 64 69 72 4f 6e 6c 79 20 3d 20 30 29  OR $dirOnly = 0)
26fa0 22 3b 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ";..  const char
26fb0 20 2a 61 7a 45 78 74 72 61 41 72 67 5b 5d 20 3d   *azExtraArg[] =
26fc0 20 7b 20 0a 20 20 20 20 22 73 71 6c 61 72 5f 75   { .    "sqlar_u
26fd0 6e 63 6f 6d 70 72 65 73 73 28 64 61 74 61 2c 20  ncompress(data, 
26fe0 73 7a 29 22 2c 0a 20 20 20 20 22 64 61 74 61 22  sz)",.    "data"
26ff0 0a 20 20 7d 3b 0a 0a 20 20 73 71 6c 69 74 65 33  .  };..  sqlite3
27000 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30 3b  _stmt *pSql = 0;
27010 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
27020 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a  TE_OK;.  char *z
27030 44 69 72 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  Dir = 0;.  char 
27040 2a 7a 57 68 65 72 65 20 3d 20 30 3b 0a 20 20 69  *zWhere = 0;.  i
27050 6e 74 20 69 2c 20 6a 3b 0a 0a 20 20 2f 2a 20 49  nt i, j;..  /* I
27060 66 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  f arguments are 
27070 73 70 65 63 69 66 69 65 64 2c 20 63 68 65 63 6b  specified, check
27080 20 74 68 61 74 20 74 68 65 79 20 61 63 74 75 61   that they actua
27090 6c 6c 79 20 65 78 69 73 74 20 77 69 74 68 69 6e  lly exist within
270a0 0a 20 20 2a 2a 20 74 68 65 20 61 72 63 68 69 76  .  ** the archiv
270b0 65 20 62 65 66 6f 72 65 20 70 72 6f 63 65 65 64  e before proceed
270c0 69 6e 67 2e 20 41 6e 64 20 66 6f 72 6d 75 6c 61  ing. And formula
270d0 74 65 20 61 20 57 48 45 52 45 20 63 6c 61 75 73  te a WHERE claus
270e0 65 20 74 6f 0a 20 20 2a 2a 20 6d 61 74 63 68 20  e to.  ** match 
270f0 74 68 65 6d 2e 20 20 2a 2f 0a 20 20 72 63 20 3d  them.  */.  rc =
27100 20 61 72 43 68 65 63 6b 45 6e 74 72 69 65 73 28   arCheckEntries(
27110 70 41 72 29 3b 0a 20 20 61 72 57 68 65 72 65 43  pAr);.  arWhereC
27120 6c 61 75 73 65 28 26 72 63 2c 20 70 41 72 2c 20  lause(&rc, pAr, 
27130 26 7a 57 68 65 72 65 29 3b 0a 0a 20 20 69 66 28  &zWhere);..  if(
27140 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
27150 7b 0a 20 20 20 20 69 66 28 20 70 41 72 2d 3e 7a  {.    if( pAr->z
27160 44 69 72 20 29 7b 0a 20 20 20 20 20 20 7a 44 69  Dir ){.      zDi
27170 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  r = sqlite3_mpri
27180 6e 74 66 28 22 25 73 2f 22 2c 20 70 41 72 2d 3e  ntf("%s/", pAr->
27190 7a 44 69 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  zDir);.    }else
271a0 7b 0a 20 20 20 20 20 20 7a 44 69 72 20 3d 20 73  {.      zDir = s
271b0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
271c0 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ");.    }.    if
271d0 28 20 7a 44 69 72 3d 3d 30 20 29 20 72 63 20 3d  ( zDir==0 ) rc =
271e0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
271f0 20 7d 0a 0a 20 20 73 68 65 6c 6c 50 72 65 70 61   }..  shellPrepa
27200 72 65 50 72 69 6e 74 66 28 70 41 72 2d 3e 64 62  rePrintf(pAr->db
27210 2c 20 26 72 63 2c 20 26 70 53 71 6c 2c 20 7a 53  , &rc, &pSql, zS
27220 71 6c 31 2c 20 0a 20 20 20 20 20 20 61 7a 45 78  ql1, .      azEx
27230 74 72 61 41 72 67 5b 70 41 72 2d 3e 62 5a 69 70  traArg[pAr->bZip
27240 5d 2c 20 70 41 72 2d 3e 7a 53 72 63 54 61 62 6c  ], pAr->zSrcTabl
27250 65 2c 20 7a 57 68 65 72 65 0a 20 20 29 3b 0a 0a  e, zWhere.  );..
27260 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
27270 5f 4f 4b 20 29 7b 0a 20 20 20 20 6a 20 3d 20 73  _OK ){.    j = s
27280 71 6c 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61  qlite3_bind_para
27290 6d 65 74 65 72 5f 69 6e 64 65 78 28 70 53 71 6c  meter_index(pSql
272a0 2c 20 22 24 64 69 72 22 29 3b 0a 20 20 20 20 73  , "$dir");.    s
272b0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
272c0 28 70 53 71 6c 2c 20 6a 2c 20 7a 44 69 72 2c 20  (pSql, j, zDir, 
272d0 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
272e0 43 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 75 6e 20  C);..    /* Run 
272f0 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
27300 6d 65 6e 74 20 74 77 69 63 65 2e 20 54 68 65 20  ment twice. The 
27310 66 69 72 73 74 20 74 69 6d 65 2c 20 77 72 69 74  first time, writ
27320 65 66 69 6c 65 28 29 20 69 73 20 63 61 6c 6c 65  efile() is calle
27330 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61 6c 6c  d.    ** for all
27340 20 61 72 63 68 69 76 65 20 6d 65 6d 62 65 72 73   archive members
27350 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
27360 65 78 74 72 61 63 74 65 64 2e 20 54 68 65 20 73  extracted. The s
27370 65 63 6f 6e 64 20 74 69 6d 65 2c 0a 20 20 20 20  econd time,.    
27380 2a 2a 20 6f 6e 6c 79 20 66 6f 72 20 74 68 65 20  ** only for the 
27390 64 69 72 65 63 74 6f 72 69 65 73 2e 20 54 68 69  directories. Thi
273a0 73 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65  s is because the
273b0 20 74 69 6d 65 73 74 61 6d 70 73 20 66 6f 72 0a   timestamps for.
273c0 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64      ** extracted
273d0 20 64 69 72 65 63 74 6f 72 69 65 73 20 6d 75 73   directories mus
273e0 74 20 62 65 20 72 65 73 65 74 20 61 66 74 65 72  t be reset after
273f0 20 74 68 65 79 20 61 72 65 20 70 6f 70 75 6c 61   they are popula
27400 74 65 64 20 28 61 73 0a 20 20 20 20 2a 2a 20 70  ted (as.    ** p
27410 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 6d 20 63  opulating them c
27420 68 61 6e 67 65 73 20 74 68 65 20 74 69 6d 65 73  hanges the times
27430 74 61 6d 70 29 2e 20 20 2a 2f 0a 20 20 20 20 66  tamp).  */.    f
27440 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b  or(i=0; i<2; i++
27450 29 7b 0a 20 20 20 20 20 20 6a 20 3d 20 73 71 6c  ){.      j = sql
27460 69 74 65 33 5f 62 69 6e 64 5f 70 61 72 61 6d 65  ite3_bind_parame
27470 74 65 72 5f 69 6e 64 65 78 28 70 53 71 6c 2c 20  ter_index(pSql, 
27480 22 24 64 69 72 4f 6e 6c 79 22 29 3b 0a 20 20 20  "$dirOnly");.   
27490 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
274a0 69 6e 74 28 70 53 71 6c 2c 20 6a 2c 20 69 29 3b  int(pSql, j, i);
274b0 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 2d 3e  .      if( pAr->
274c0 62 44 72 79 52 75 6e 20 29 7b 0a 20 20 20 20 20  bDryRun ){.     
274d0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
274e0 41 72 2d 3e 70 2d 3e 6f 75 74 2c 20 22 25 73 5c  Ar->p->out, "%s\
274f0 6e 22 2c 20 73 71 6c 69 74 65 33 5f 73 71 6c 28  n", sqlite3_sql(
27500 70 53 71 6c 29 29 3b 0a 20 20 20 20 20 20 7d 65  pSql));.      }e
27510 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 77 68 69  lse{.        whi
27520 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
27530 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d  K && SQLITE_ROW=
27540 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
27550 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ql) ){.         
27560 20 69 66 28 20 69 3d 3d 30 20 26 26 20 70 41 72   if( i==0 && pAr
27570 2d 3e 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20  ->bVerbose ){.  
27580 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
27590 72 69 6e 74 66 28 70 41 72 2d 3e 70 2d 3e 6f 75  rintf(pAr->p->ou
275a0 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74  t, "%s\n", sqlit
275b0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
275c0 53 71 6c 2c 20 30 29 29 3b 0a 20 20 20 20 20 20  Sql, 0));.      
275d0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
275e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 68        }.      sh
275f0 65 6c 6c 52 65 73 65 74 28 26 72 63 2c 20 70 53  ellReset(&rc, pS
27600 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ql);.    }.    s
27610 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63  hellFinalize(&rc
27620 2c 20 70 53 71 6c 29 3b 0a 20 20 7d 0a 0a 20 20  , pSql);.  }..  
27630 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 44 69  sqlite3_free(zDi
27640 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  r);.  sqlite3_fr
27650 65 65 28 7a 57 68 65 72 65 29 3b 0a 20 20 72 65  ee(zWhere);.  re
27660 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
27670 2a 20 52 75 6e 20 74 68 65 20 53 51 4c 20 73 74  * Run the SQL st
27680 61 74 65 6d 65 6e 74 20 69 6e 20 7a 53 71 6c 2e  atement in zSql.
27690 20 20 4f 72 20 69 66 20 64 6f 69 6e 67 20 61 20    Or if doing a 
276a0 2d 2d 64 72 79 72 75 6e 2c 20 6d 65 72 65 6c 79  --dryrun, merely
276b0 20 70 72 69 6e 74 20 69 74 20 6f 75 74 2e 0a 2a   print it out..*
276c0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 45  /.static int arE
276d0 78 65 63 53 71 6c 28 41 72 43 6f 6d 6d 61 6e 64  xecSql(ArCommand
276e0 20 2a 70 41 72 2c 20 63 6f 6e 73 74 20 63 68 61   *pAr, const cha
276f0 72 20 2a 7a 53 71 6c 29 7b 0a 20 20 69 6e 74 20  r *zSql){.  int 
27700 72 63 3b 0a 20 20 69 66 28 20 70 41 72 2d 3e 62  rc;.  if( pAr->b
27710 44 72 79 52 75 6e 20 29 7b 0a 20 20 20 20 75 74  DryRun ){.    ut
27720 66 38 5f 70 72 69 6e 74 66 28 70 41 72 2d 3e 70  f8_printf(pAr->p
27730 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a  ->out, "%s\n", z
27740 53 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 53  Sql);.    rc = S
27750 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 7d 65 6c 73  QLITE_OK;.  }els
27760 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72  e{.    char *zEr
27770 72 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20  r = 0;.    rc = 
27780 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 41 72  sqlite3_exec(pAr
27790 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30  ->db, zSql, 0, 0
277a0 2c 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 69 66  , &zErr);.    if
277b0 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20 20  ( zErr ){.      
277c0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 6f  utf8_printf(stdo
277d0 75 74 2c 20 22 45 52 52 4f 52 3a 20 25 73 5c 6e  ut, "ERROR: %s\n
277e0 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 20 20  ", zErr);.      
277f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
27800 72 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  r);.    }.  }.  
27810 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
27820 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
27830 69 6f 6e 20 6f 66 20 2e 61 72 20 22 63 72 65 61  ion of .ar "crea
27840 74 65 22 20 61 6e 64 20 22 75 70 64 61 74 65 22  te" and "update"
27850 20 63 6f 6d 6d 61 6e 64 73 2e 0a 2a 2a 0a 2a 2a   commands..**.**
27860 20 43 72 65 61 74 65 20 74 68 65 20 22 73 71 6c   Create the "sql
27870 61 72 22 20 74 61 62 6c 65 20 69 6e 20 74 68 65  ar" table in the
27880 20 64 61 74 61 62 61 73 65 20 69 66 20 69 74 20   database if it 
27890 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61 64 79  does not already
278a0 20 65 78 69 73 74 2e 0a 2a 2a 20 54 68 65 6e 20   exist..** Then 
278b0 61 64 64 20 65 61 63 68 20 66 69 6c 65 20 69 6e  add each file in
278c0 20 74 68 65 20 61 7a 46 69 6c 65 5b 5d 20 61 72   the azFile[] ar
278d0 72 61 79 20 74 6f 20 74 68 65 20 61 72 63 68 69  ray to the archi
278e0 76 65 2e 20 44 69 72 65 63 74 6f 72 69 65 73 0a  ve. Directories.
278f0 2a 2a 20 61 72 65 20 61 64 64 65 64 20 72 65 63  ** are added rec
27900 75 72 73 69 76 65 6c 79 2e 20 49 66 20 61 72 67  ursively. If arg
27910 75 6d 65 6e 74 20 62 56 65 72 62 6f 73 65 20 69  ument bVerbose i
27920 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20 6d 65  s non-zero, a me
27930 73 73 61 67 65 20 69 73 0a 2a 2a 20 70 72 69 6e  ssage is.** prin
27940 74 65 64 20 6f 6e 20 73 74 64 6f 75 74 20 66 6f  ted on stdout fo
27950 72 20 65 61 63 68 20 66 69 6c 65 20 61 72 63 68  r each file arch
27960 69 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20  ived..**.** The 
27970 63 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64 20 69  create command i
27980 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 75 70  s the same as up
27990 64 61 74 65 2c 20 65 78 63 65 70 74 20 74 68 61  date, except tha
279a0 74 20 69 74 20 64 72 6f 70 73 0a 2a 2a 20 61 6e  t it drops.** an
279b0 79 20 65 78 69 73 74 69 6e 67 20 22 73 71 6c 61  y existing "sqla
279c0 72 22 20 74 61 62 6c 65 20 62 65 66 6f 72 65 20  r" table before 
279d0 62 65 67 69 6e 6e 69 6e 67 2e 0a 2a 2f 0a 73 74  beginning..*/.st
279e0 61 74 69 63 20 69 6e 74 20 61 72 43 72 65 61 74  atic int arCreat
279f0 65 4f 72 55 70 64 61 74 65 43 6f 6d 6d 61 6e 64  eOrUpdateCommand
27a00 28 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a 70  (.  ArCommand *p
27a10 41 72 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  Ar,             
27a20 20 20 20 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 61      /* Command a
27a30 72 67 75 6d 65 6e 74 73 20 61 6e 64 20 6f 70 74  rguments and opt
27a40 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 62 55  ions */.  int bU
27a50 70 64 61 74 65 20 20 20 20 20 20 20 20 20 20 20  pdate           
27a60 20 20 20 20 20 20 20 20 20 20 2f 2a 20 74 72 75            /* tru
27a70 65 20 66 6f 72 20 61 20 2d 2d 63 72 65 61 74 65  e for a --create
27a80 2e 20 20 66 61 6c 73 65 20 66 6f 72 20 2d 2d 75  .  false for --u
27a90 70 64 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 63 6f  pdate */.){.  co
27aa0 6e 73 74 20 63 68 61 72 20 2a 7a 43 72 65 61 74  nst char *zCreat
27ab0 65 20 3d 20 0a 20 20 20 20 20 20 22 43 52 45 41  e = .      "CREA
27ac0 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20  TE TABLE IF NOT 
27ad0 45 58 49 53 54 53 20 73 71 6c 61 72 28 5c 6e 22  EXISTS sqlar(\n"
27ae0 0a 20 20 20 20 20 20 22 20 20 6e 61 6d 65 20 54  .      "  name T
27af0 45 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  EXT PRIMARY KEY,
27b00 20 20 2d 2d 20 6e 61 6d 65 20 6f 66 20 74 68 65    -- name of the
27b10 20 66 69 6c 65 5c 6e 22 0a 20 20 20 20 20 20 22   file\n".      "
27b20 20 20 6d 6f 64 65 20 49 4e 54 2c 20 20 20 20 20    mode INT,     
27b30 20 20 20 20 20 20 20 20 20 20 2d 2d 20 61 63 63            -- acc
27b40 65 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 5c  ess permissions\
27b50 6e 22 0a 20 20 20 20 20 20 22 20 20 6d 74 69 6d  n".      "  mtim
27b60 65 20 49 4e 54 2c 20 20 20 20 20 20 20 20 20 20  e INT,          
27b70 20 20 20 20 2d 2d 20 6c 61 73 74 20 6d 6f 64 69      -- last modi
27b80 66 69 63 61 74 69 6f 6e 20 74 69 6d 65 5c 6e 22  fication time\n"
27b90 0a 20 20 20 20 20 20 22 20 20 73 7a 20 49 4e 54  .      "  sz INT
27ba0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
27bb0 20 20 2d 2d 20 6f 72 69 67 69 6e 61 6c 20 66 69    -- original fi
27bc0 6c 65 20 73 69 7a 65 5c 6e 22 0a 20 20 20 20 20  le size\n".     
27bd0 20 22 20 20 64 61 74 61 20 42 4c 4f 42 20 20 20   "  data BLOB   
27be0 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 63              -- c
27bf0 6f 6d 70 72 65 73 73 65 64 20 63 6f 6e 74 65 6e  ompressed conten
27c00 74 5c 6e 22 0a 20 20 20 20 20 20 22 29 22 3b 0a  t\n".      ")";.
27c10 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
27c20 72 6f 70 20 3d 20 22 44 52 4f 50 20 54 41 42 4c  rop = "DROP TABL
27c30 45 20 49 46 20 45 58 49 53 54 53 20 73 71 6c 61  E IF EXISTS sqla
27c40 72 22 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  r";.  const char
27c50 20 2a 7a 49 6e 73 65 72 74 46 6d 74 5b 32 5d 20   *zInsertFmt[2] 
27c60 3d 20 7b 0a 20 20 20 20 20 22 52 45 50 4c 41 43  = {.     "REPLAC
27c70 45 20 49 4e 54 4f 20 25 73 28 6e 61 6d 65 2c 6d  E INTO %s(name,m
27c80 6f 64 65 2c 6d 74 69 6d 65 2c 73 7a 2c 64 61 74  ode,mtime,sz,dat
27c90 61 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 53 45  a)\n".     "  SE
27ca0 4c 45 43 54 5c 6e 22 0a 20 20 20 20 20 22 20 20  LECT\n".     "  
27cb0 20 20 25 73 2c 5c 6e 22 0a 20 20 20 20 20 22 20    %s,\n".     " 
27cc0 20 20 20 6d 6f 64 65 2c 5c 6e 22 0a 20 20 20 20     mode,\n".    
27cd0 20 22 20 20 20 20 6d 74 69 6d 65 2c 5c 6e 22 0a   "    mtime,\n".
27ce0 20 20 20 20 20 22 20 20 20 20 43 41 53 45 20 73       "    CASE s
27cf0 75 62 73 74 72 28 6c 73 6d 6f 64 65 28 6d 6f 64  ubstr(lsmode(mod
27d00 65 29 2c 31 2c 31 29 5c 6e 22 0a 20 20 20 20 20  e),1,1)\n".     
27d10 22 20 20 20 20 20 20 57 48 45 4e 20 27 2d 27 20  "      WHEN '-' 
27d20 54 48 45 4e 20 6c 65 6e 67 74 68 28 64 61 74 61  THEN length(data
27d30 29 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 20  )\n".     "     
27d40 20 57 48 45 4e 20 27 64 27 20 54 48 45 4e 20 30   WHEN 'd' THEN 0
27d50 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 20 20  \n".     "      
27d60 45 4c 53 45 20 2d 31 20 45 4e 44 2c 5c 6e 22 0a  ELSE -1 END,\n".
27d70 20 20 20 20 20 22 20 20 20 20 73 71 6c 61 72 5f       "    sqlar_
27d80 63 6f 6d 70 72 65 73 73 28 64 61 74 61 29 5c 6e  compress(data)\n
27d90 22 0a 20 20 20 20 20 22 20 20 46 52 4f 4d 20 66  ".     "  FROM f
27da0 73 64 69 72 28 25 51 2c 25 51 29 5c 6e 22 0a 20  sdir(%Q,%Q)\n". 
27db0 20 20 20 20 22 20 20 57 48 45 52 45 20 6c 73 6d      "  WHERE lsm
27dc0 6f 64 65 28 6d 6f 64 65 29 20 4e 4f 54 20 4c 49  ode(mode) NOT LI
27dd0 4b 45 20 27 3f 25 25 27 3b 22 2c 0a 20 20 20 20  KE '?%%';",.    
27de0 20 22 52 45 50 4c 41 43 45 20 49 4e 54 4f 20 25   "REPLACE INTO %
27df0 73 28 6e 61 6d 65 2c 6d 6f 64 65 2c 6d 74 69 6d  s(name,mode,mtim
27e00 65 2c 64 61 74 61 29 5c 6e 22 0a 20 20 20 20 20  e,data)\n".     
27e10 22 20 20 53 45 4c 45 43 54 5c 6e 22 0a 20 20 20  "  SELECT\n".   
27e20 20 20 22 20 20 20 20 25 73 2c 5c 6e 22 0a 20 20    "    %s,\n".  
27e30 20 20 20 22 20 20 20 20 6d 6f 64 65 2c 5c 6e 22     "    mode,\n"
27e40 0a 20 20 20 20 20 22 20 20 20 20 6d 74 69 6d 65  .     "    mtime
27e50 2c 5c 6e 22 0a 20 20 20 20 20 22 20 20 20 20 64  ,\n".     "    d
27e60 61 74 61 5c 6e 22 0a 20 20 20 20 20 22 20 20 46  ata\n".     "  F
27e70 52 4f 4d 20 66 73 64 69 72 28 25 51 2c 25 51 29  ROM fsdir(%Q,%Q)
27e80 5c 6e 22 0a 20 20 20 20 20 22 20 20 57 48 45 52  \n".     "  WHER
27e90 45 20 6c 73 6d 6f 64 65 28 6d 6f 64 65 29 20 4e  E lsmode(mode) N
27ea0 4f 54 20 4c 49 4b 45 20 27 3f 25 25 27 3b 22 0a  OT LIKE '?%%';".
27eb0 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 20 20 20    };.  int i;   
27ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27ed0 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 69 74         /* For it
27ee0 65 72 61 74 69 6e 67 20 74 68 72 6f 75 67 68 20  erating through 
27ef0 61 7a 46 69 6c 65 5b 5d 20 2a 2f 0a 20 20 69 6e  azFile[] */.  in
27f00 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20 20  t rc;           
27f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
27f20 20 52 65 74 75 72 6e 20 63 6f 64 65 20 2a 2f 0a   Return code */.
27f30 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
27f40 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ab = 0;         
27f50 20 20 2f 2a 20 53 51 4c 20 74 61 62 6c 65 20 69    /* SQL table i
27f60 6e 74 6f 20 77 68 69 63 68 20 74 6f 20 69 6e 73  nto which to ins
27f70 65 72 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a  ert */.  char *z
27f80 53 71 6c 3b 0a 20 20 63 68 61 72 20 7a 54 65 6d  Sql;.  char zTem
27f90 70 5b 35 30 5d 3b 0a 0a 20 20 61 72 45 78 65 63  p[50];..  arExec
27fa0 53 71 6c 28 70 41 72 2c 20 22 50 52 41 47 4d 41  Sql(pAr, "PRAGMA
27fb0 20 70 61 67 65 5f 73 69 7a 65 3d 35 31 32 22 29   page_size=512")
27fc0 3b 0a 20 20 72 63 20 3d 20 61 72 45 78 65 63 53  ;.  rc = arExecS
27fd0 71 6c 28 70 41 72 2c 20 22 53 41 56 45 50 4f 49  ql(pAr, "SAVEPOI
27fe0 4e 54 20 61 72 3b 22 29 3b 0a 20 20 69 66 28 20  NT ar;");.  if( 
27ff0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20  rc!=SQLITE_OK ) 
28000 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7a 54 65  return rc;.  zTe
28010 6d 70 5b 30 5d 20 3d 20 30 3b 20 0a 20 20 69 66  mp[0] = 0; .  if
28020 28 20 70 41 72 2d 3e 62 5a 69 70 20 29 7b 0a 20  ( pAr->bZip ){. 
28030 20 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65     /* Initialize
28040 20 74 68 65 20 7a 69 70 66 69 6c 65 20 76 69 72   the zipfile vir
28050 74 75 61 6c 20 74 61 62 6c 65 2c 20 69 66 20 6e  tual table, if n
28060 65 63 65 73 73 61 72 79 20 2a 2f 0a 20 20 20 20  ecessary */.    
28070 69 66 28 20 70 41 72 2d 3e 7a 46 69 6c 65 20 29  if( pAr->zFile )
28080 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
28090 75 69 6e 74 36 34 20 72 3b 0a 20 20 20 20 20 20  uint64 r;.      
280a0 73 71 6c 69 74 65 33 5f 72 61 6e 64 6f 6d 6e 65  sqlite3_randomne
280b0 73 73 28 73 69 7a 65 6f 66 28 72 29 2c 26 72 29  ss(sizeof(r),&r)
280c0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
280d0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
280e0 7a 54 65 6d 70 29 2c 7a 54 65 6d 70 2c 22 7a 69  zTemp),zTemp,"zi
280f0 70 25 30 31 36 6c 6c 78 22 2c 72 29 3b 0a 20 20  p%016llx",r);.  
28100 20 20 20 20 7a 54 61 62 20 3d 20 7a 54 65 6d 70      zTab = zTemp
28110 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73  ;.      zSql = s
28120 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
28130 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
28140 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74   VIRTUAL TABLE t
28150 65 6d 70 2e 25 73 20 55 53 49 4e 47 20 7a 69 70  emp.%s USING zip
28160 66 69 6c 65 28 25 51 29 22 2c 0a 20 20 20 20 20  file(%Q)",.     
28170 20 20 20 20 7a 54 61 62 2c 20 70 41 72 2d 3e 7a      zTab, pAr->z
28180 46 69 6c 65 0a 20 20 20 20 20 20 29 3b 0a 20 20  File.      );.  
28190 20 20 20 20 72 63 20 3d 20 61 72 45 78 65 63 53      rc = arExecS
281a0 71 6c 28 70 41 72 2c 20 7a 53 71 6c 29 3b 0a 20  ql(pAr, zSql);. 
281b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
281c0 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c  e(zSql);.    }el
281d0 73 65 7b 0a 20 20 20 20 20 20 7a 54 61 62 20 3d  se{.      zTab =
281e0 20 22 7a 69 70 22 3b 0a 20 20 20 20 7d 0a 20 20   "zip";.    }.  
281f0 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 6e  }else{.    /* In
28200 69 74 69 61 6c 69 7a 65 20 74 68 65 20 74 61 62  itialize the tab
28210 6c 65 20 66 6f 72 20 61 6e 20 53 51 4c 41 52 20  le for an SQLAR 
28220 2a 2f 0a 20 20 20 20 7a 54 61 62 20 3d 20 22 73  */.    zTab = "s
28230 71 6c 61 72 22 3b 0a 20 20 20 20 69 66 28 20 62  qlar";.    if( b
28240 55 70 64 61 74 65 3d 3d 30 20 29 7b 0a 20 20 20  Update==0 ){.   
28250 20 20 20 72 63 20 3d 20 61 72 45 78 65 63 53 71     rc = arExecSq
28260 6c 28 70 41 72 2c 20 7a 44 72 6f 70 29 3b 0a 20  l(pAr, zDrop);. 
28270 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
28280 49 54 45 5f 4f 4b 20 29 20 67 6f 74 6f 20 65 6e  ITE_OK ) goto en
28290 64 5f 61 72 5f 74 72 61 6e 73 61 63 74 69 6f 6e  d_ar_transaction
282a0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d  ;.    }.    rc =
282b0 20 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20   arExecSql(pAr, 
282c0 7a 43 72 65 61 74 65 29 3b 0a 20 20 7d 0a 20 20  zCreate);.  }.  
282d0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 72 2d 3e  for(i=0; i<pAr->
282e0 6e 41 72 67 20 26 26 20 72 63 3d 3d 53 51 4c 49  nArg && rc==SQLI
282f0 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20  TE_OK; i++){.   
28300 20 63 68 61 72 20 2a 7a 53 71 6c 32 20 3d 20 73   char *zSql2 = s
28310 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 7a  qlite3_mprintf(z
28320 49 6e 73 65 72 74 46 6d 74 5b 70 41 72 2d 3e 62  InsertFmt[pAr->b
28330 5a 69 70 5d 2c 20 7a 54 61 62 2c 0a 20 20 20 20  Zip], zTab,.    
28340 20 20 20 20 70 41 72 2d 3e 62 56 65 72 62 6f 73      pAr->bVerbos
28350 65 20 3f 20 22 73 68 65 6c 6c 5f 70 75 74 73 6e  e ? "shell_putsn
28360 6c 28 6e 61 6d 65 29 22 20 3a 20 22 6e 61 6d 65  l(name)" : "name
28370 22 2c 0a 20 20 20 20 20 20 20 20 70 41 72 2d 3e  ",.        pAr->
28380 61 7a 41 72 67 5b 69 5d 2c 20 70 41 72 2d 3e 7a  azArg[i], pAr->z
28390 44 69 72 29 3b 0a 20 20 20 20 72 63 20 3d 20 61  Dir);.    rc = a
283a0 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20 7a 53  rExecSql(pAr, zS
283b0 71 6c 32 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ql2);.    sqlite
283c0 33 5f 66 72 65 65 28 7a 53 71 6c 32 29 3b 0a 20  3_free(zSql2);. 
283d0 20 7d 0a 65 6e 64 5f 61 72 5f 74 72 61 6e 73 61   }.end_ar_transa
283e0 63 74 69 6f 6e 3a 0a 20 20 69 66 28 20 72 63 21  ction:.  if( rc!
283f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
28400 20 20 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c    arExecSql(pAr,
28410 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20 61 72   "ROLLBACK TO ar
28420 3b 20 52 45 4c 45 41 53 45 20 61 72 3b 22 29 3b  ; RELEASE ar;");
28430 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 63  .  }else{.    rc
28440 20 3d 20 61 72 45 78 65 63 53 71 6c 28 70 41 72   = arExecSql(pAr
28450 2c 20 22 52 45 4c 45 41 53 45 20 61 72 3b 22 29  , "RELEASE ar;")
28460 3b 0a 20 20 20 20 69 66 28 20 70 41 72 2d 3e 62  ;.    if( pAr->b
28470 5a 69 70 20 26 26 20 70 41 72 2d 3e 7a 46 69 6c  Zip && pAr->zFil
28480 65 20 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20  e ){.      zSql 
28490 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
284a0 66 28 22 44 52 4f 50 20 54 41 42 4c 45 20 25 73  f("DROP TABLE %s
284b0 22 2c 20 7a 54 65 6d 70 29 3b 0a 20 20 20 20 20  ", zTemp);.     
284c0 20 61 72 45 78 65 63 53 71 6c 28 70 41 72 2c 20   arExecSql(pAr, 
284d0 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  zSql);.      sql
284e0 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
284f0 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
28500 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
28510 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
28520 6f 66 20 22 2e 61 72 22 20 64 6f 74 20 63 6f 6d  of ".ar" dot com
28530 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mand..*/.static 
28540 69 6e 74 20 61 72 44 6f 74 43 6f 6d 6d 61 6e 64  int arDotCommand
28550 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  (.  ShellState *
28560 70 53 74 61 74 65 2c 20 20 20 20 20 20 20 20 20  pState,         
28570 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73      /* Current s
28580 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20  hell tool state 
28590 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72  */.  char **azAr
285a0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
285b0 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
285c0 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65   arguments passe
285d0 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64  d to dot command
285e0 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20 20   */.  int nArg  
285f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28600 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
28610 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a  of entries in az
28620 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 41 72  Arg[] */.){.  Ar
28630 43 6f 6d 6d 61 6e 64 20 63 6d 64 3b 0a 20 20 69  Command cmd;.  i
28640 6e 74 20 72 63 3b 0a 20 20 6d 65 6d 73 65 74 28  nt rc;.  memset(
28650 26 63 6d 64 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &cmd, 0, sizeof(
28660 63 6d 64 29 29 3b 0a 20 20 72 63 20 3d 20 61 72  cmd));.  rc = ar
28670 50 61 72 73 65 43 6f 6d 6d 61 6e 64 28 61 7a 41  ParseCommand(azA
28680 72 67 2c 20 6e 41 72 67 2c 20 26 63 6d 64 29 3b  rg, nArg, &cmd);
28690 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
286a0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
286b0 65 44 62 54 79 70 65 20 3d 20 53 48 45 4c 4c 5f  eDbType = SHELL_
286c0 4f 50 45 4e 5f 55 4e 53 50 45 43 3b 0a 20 20 20  OPEN_UNSPEC;.   
286d0 20 63 6d 64 2e 70 20 3d 20 70 53 74 61 74 65 3b   cmd.p = pState;
286e0 0a 20 20 20 20 63 6d 64 2e 64 62 20 3d 20 70 53  .    cmd.db = pS
286f0 74 61 74 65 2d 3e 64 62 3b 0a 20 20 20 20 69 66  tate->db;.    if
28700 28 20 63 6d 64 2e 7a 46 69 6c 65 20 29 7b 0a 20  ( cmd.zFile ){. 
28710 20 20 20 20 20 65 44 62 54 79 70 65 20 3d 20 64       eDbType = d
28720 65 64 75 63 65 44 61 74 61 62 61 73 65 54 79 70  educeDatabaseTyp
28730 65 28 63 6d 64 2e 7a 46 69 6c 65 2c 20 31 29 3b  e(cmd.zFile, 1);
28740 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
28750 20 20 65 44 62 54 79 70 65 20 3d 20 70 53 74 61    eDbType = pSta
28760 74 65 2d 3e 6f 70 65 6e 4d 6f 64 65 3b 0a 20 20  te->openMode;.  
28770 20 20 7d 0a 20 20 20 20 69 66 28 20 65 44 62 54    }.    if( eDbT
28780 79 70 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f  ype==SHELL_OPEN_
28790 5a 49 50 46 49 4c 45 20 29 7b 0a 20 20 20 20 20  ZIPFILE ){.     
287a0 20 69 66 28 20 63 6d 64 2e 65 43 6d 64 3d 3d 41   if( cmd.eCmd==A
287b0 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 20 7c 7c  R_CMD_EXTRACT ||
287c0 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d   cmd.eCmd==AR_CM
287d0 44 5f 4c 49 53 54 20 29 7b 0a 20 20 20 20 20 20  D_LIST ){.      
287e0 20 20 69 66 28 20 63 6d 64 2e 7a 46 69 6c 65 3d    if( cmd.zFile=
287f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
28800 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65 20 3d 20  cmd.zSrcTable = 
28810 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
28820 22 7a 69 70 22 29 3b 0a 20 20 20 20 20 20 20 20  "zip");.        
28830 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
28840 20 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65 20 3d   cmd.zSrcTable =
28850 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
28860 28 22 7a 69 70 66 69 6c 65 28 25 51 29 22 2c 20  ("zipfile(%Q)", 
28870 63 6d 64 2e 7a 46 69 6c 65 29 3b 0a 20 20 20 20  cmd.zFile);.    
28880 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
28890 20 20 20 20 63 6d 64 2e 62 5a 69 70 20 3d 20 31      cmd.bZip = 1
288a0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
288b0 63 6d 64 2e 7a 46 69 6c 65 20 29 7b 0a 20 20 20  cmd.zFile ){.   
288c0 20 20 20 69 6e 74 20 66 6c 61 67 73 3b 0a 20 20     int flags;.  
288d0 20 20 20 20 69 66 28 20 63 6d 64 2e 62 41 70 70      if( cmd.bApp
288e0 65 6e 64 20 29 20 65 44 62 54 79 70 65 20 3d 20  end ) eDbType = 
288f0 53 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e  SHELL_OPEN_APPEN
28900 44 56 46 53 3b 0a 20 20 20 20 20 20 69 66 28 20  DVFS;.      if( 
28910 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44  cmd.eCmd==AR_CMD
28920 5f 43 52 45 41 54 45 20 7c 7c 20 63 6d 64 2e 65  _CREATE || cmd.e
28930 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 55 50 44 41  Cmd==AR_CMD_UPDA
28940 54 45 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c  TE ){.        fl
28950 61 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45  ags = SQLITE_OPE
28960 4e 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49  N_READWRITE|SQLI
28970 54 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a  TE_OPEN_CREATE;.
28980 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
28990 20 20 20 20 20 66 6c 61 67 73 20 3d 20 53 51 4c       flags = SQL
289a0 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c  ITE_OPEN_READONL
289b0 59 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  Y;.      }.     
289c0 20 63 6d 64 2e 64 62 20 3d 20 30 3b 0a 20 20 20   cmd.db = 0;.   
289d0 20 20 20 69 66 28 20 63 6d 64 2e 62 44 72 79 52     if( cmd.bDryR
289e0 75 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  un ){.        ut
289f0 66 38 5f 70 72 69 6e 74 66 28 70 53 74 61 74 65  f8_printf(pState
28a00 2d 3e 6f 75 74 2c 20 22 2d 2d 20 6f 70 65 6e 20  ->out, "-- open 
28a10 64 61 74 61 62 61 73 65 20 27 25 73 27 25 73 5c  database '%s'%s\
28a20 6e 22 2c 20 63 6d 64 2e 7a 46 69 6c 65 2c 0a 20  n", cmd.zFile,. 
28a30 20 20 20 20 20 20 20 20 20 20 20 20 65 44 62 54              eDbT
28a40 79 70 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f  ype==SHELL_OPEN_
28a50 41 50 50 45 4e 44 56 46 53 20 3f 20 22 20 75 73  APPENDVFS ? " us
28a60 69 6e 67 20 27 61 70 6e 64 76 66 73 27 22 20 3a  ing 'apndvfs'" :
28a70 20 22 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   "");.      }.  
28a80 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
28a90 5f 6f 70 65 6e 5f 76 32 28 63 6d 64 2e 7a 46 69  _open_v2(cmd.zFi
28aa0 6c 65 2c 20 26 63 6d 64 2e 64 62 2c 20 66 6c 61  le, &cmd.db, fla
28ab0 67 73 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  gs, .           
28ac0 20 20 65 44 62 54 79 70 65 3d 3d 53 48 45 4c 4c    eDbType==SHELL
28ad0 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 20  _OPEN_APPENDVFS 
28ae0 3f 20 22 61 70 6e 64 76 66 73 22 20 3a 20 30 29  ? "apndvfs" : 0)
28af0 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 21 3d  ;.      if( rc!=
28b00 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
28b10 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
28b20 28 73 74 64 65 72 72 2c 20 22 63 61 6e 6e 6f 74  (stderr, "cannot
28b30 20 6f 70 65 6e 20 66 69 6c 65 3a 20 25 73 20 28   open file: %s (
28b40 25 73 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20  %s)\n", .       
28b50 20 20 20 20 20 63 6d 64 2e 7a 46 69 6c 65 2c 20       cmd.zFile, 
28b60 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 63  sqlite3_errmsg(c
28b70 6d 64 2e 64 62 29 0a 20 20 20 20 20 20 20 20 29  md.db).        )
28b80 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 65  ;.        goto e
28b90 6e 64 5f 61 72 5f 63 6f 6d 6d 61 6e 64 3b 0a 20  nd_ar_command;. 
28ba0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
28bb0 69 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e 69 74  ite3_fileio_init
28bc0 28 63 6d 64 2e 64 62 2c 20 30 2c 20 30 29 3b 0a  (cmd.db, 0, 0);.
28bd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 71        sqlite3_sq
28be0 6c 61 72 5f 69 6e 69 74 28 63 6d 64 2e 64 62 2c  lar_init(cmd.db,
28bf0 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
28c00 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66 75 6e  lite3_create_fun
28c10 63 74 69 6f 6e 28 63 6d 64 2e 64 62 2c 20 22 73  ction(cmd.db, "s
28c20 68 65 6c 6c 5f 70 75 74 73 6e 6c 22 2c 20 31 2c  hell_putsnl", 1,
28c30 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 63 6d   SQLITE_UTF8, cm
28c40 64 2e 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  d.p,.           
28c50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28c60 20 20 20 73 68 65 6c 6c 50 75 74 73 46 75 6e 63     shellPutsFunc
28c70 2c 20 30 2c 20 30 29 3b 0a 0a 20 20 20 20 7d 0a  , 0, 0);..    }.
28c80 20 20 20 20 69 66 28 20 63 6d 64 2e 7a 53 72 63      if( cmd.zSrc
28c90 54 61 62 6c 65 3d 3d 30 20 26 26 20 63 6d 64 2e  Table==0 && cmd.
28ca0 62 5a 69 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  bZip==0 ){.     
28cb0 20 69 66 28 20 63 6d 64 2e 65 43 6d 64 21 3d 41   if( cmd.eCmd!=A
28cc0 52 5f 43 4d 44 5f 43 52 45 41 54 45 0a 20 20 20  R_CMD_CREATE.   
28cd0 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 74      && sqlite3_t
28ce0 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61  able_column_meta
28cf0 64 61 74 61 28 63 6d 64 2e 64 62 2c 30 2c 22 73  data(cmd.db,0,"s
28d00 71 6c 61 72 22 2c 22 6e 61 6d 65 22 2c 30 2c 30  qlar","name",0,0
28d10 2c 30 2c 30 2c 30 29 0a 20 20 20 20 20 20 29 7b  ,0,0,0).      ){
28d20 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
28d30 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 64 61  intf(stderr, "da
28d40 74 61 62 61 73 65 20 64 6f 65 73 20 6e 6f 74 20  tabase does not 
28d50 63 6f 6e 74 61 69 6e 20 61 6e 20 27 73 71 6c 61  contain an 'sqla
28d60 72 27 20 74 61 62 6c 65 5c 6e 22 29 3b 0a 20 20  r' table\n");.  
28d70 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54        rc = SQLIT
28d80 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20  E_ERROR;.       
28d90 20 67 6f 74 6f 20 65 6e 64 5f 61 72 5f 63 6f 6d   goto end_ar_com
28da0 6d 61 6e 64 3b 0a 20 20 20 20 20 20 7d 0a 20 20  mand;.      }.  
28db0 20 20 20 20 63 6d 64 2e 7a 53 72 63 54 61 62 6c      cmd.zSrcTabl
28dc0 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
28dd0 6e 74 66 28 22 73 71 6c 61 72 22 29 3b 0a 20 20  ntf("sqlar");.  
28de0 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 28    }..    switch(
28df0 20 63 6d 64 2e 65 43 6d 64 20 29 7b 0a 20 20 20   cmd.eCmd ){.   
28e00 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 43     case AR_CMD_C
28e10 52 45 41 54 45 3a 0a 20 20 20 20 20 20 20 20 72  REATE:.        r
28e20 63 20 3d 20 61 72 43 72 65 61 74 65 4f 72 55 70  c = arCreateOrUp
28e30 64 61 74 65 43 6f 6d 6d 61 6e 64 28 26 63 6d 64  dateCommand(&cmd
28e40 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72  , 0);.        br
28e50 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65  eak;..      case
28e60 20 41 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 3a   AR_CMD_EXTRACT:
28e70 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 72  .        rc = ar
28e80 45 78 74 72 61 63 74 43 6f 6d 6d 61 6e 64 28 26  ExtractCommand(&
28e90 63 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72  cmd);.        br
28ea0 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65  eak;..      case
28eb0 20 41 52 5f 43 4d 44 5f 4c 49 53 54 3a 0a 20 20   AR_CMD_LIST:.  
28ec0 20 20 20 20 20 20 72 63 20 3d 20 61 72 4c 69 73        rc = arLis
28ed0 74 43 6f 6d 6d 61 6e 64 28 26 63 6d 64 29 3b 0a  tCommand(&cmd);.
28ee0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
28ef0 20 20 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d        case AR_CM
28f00 44 5f 48 45 4c 50 3a 0a 20 20 20 20 20 20 20 20  D_HELP:.        
28f10 61 72 55 73 61 67 65 28 70 53 74 61 74 65 2d 3e  arUsage(pState->
28f20 6f 75 74 29 3b 0a 20 20 20 20 20 20 20 20 62 72  out);.        br
28f30 65 61 6b 3b 0a 0a 20 20 20 20 20 20 64 65 66 61  eak;..      defa
28f40 75 6c 74 3a 0a 20 20 20 20 20 20 20 20 61 73 73  ult:.        ass
28f50 65 72 74 28 20 63 6d 64 2e 65 43 6d 64 3d 3d 41  ert( cmd.eCmd==A
28f60 52 5f 43 4d 44 5f 55 50 44 41 54 45 20 29 3b 0a  R_CMD_UPDATE );.
28f70 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 72 43          rc = arC
28f80 72 65 61 74 65 4f 72 55 70 64 61 74 65 43 6f 6d  reateOrUpdateCom
28f90 6d 61 6e 64 28 26 63 6d 64 2c 20 31 29 3b 0a 20  mand(&cmd, 1);. 
28fa0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
28fb0 20 20 7d 0a 20 20 7d 0a 65 6e 64 5f 61 72 5f 63    }.  }.end_ar_c
28fc0 6f 6d 6d 61 6e 64 3a 0a 20 20 69 66 28 20 63 6d  ommand:.  if( cm
28fd0 64 2e 64 62 21 3d 70 53 74 61 74 65 2d 3e 64 62  d.db!=pState->db
28fe0 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
28ff0 63 6c 6f 73 65 28 63 6d 64 2e 64 62 29 3b 0a 20  close(cmd.db);. 
29000 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
29010 65 28 63 6d 64 2e 7a 53 72 63 54 61 62 6c 65 29  e(cmd.zSrcTable)
29020 3b 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  ;..  return rc;.
29030 7d 0a 2f 2a 20 45 6e 64 20 6f 66 20 74 68 65 20  }./* End of the 
29040 22 2e 61 72 63 68 69 76 65 22 20 6f 72 20 22 2e  ".archive" or ".
29050 61 72 22 20 63 6f 6d 6d 61 6e 64 20 6c 6f 67 69  ar" command logi
29060 63 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  c.**************
29070 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29080 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
29090 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
290a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
290b0 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20  ****/.#endif /* 
290c0 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
290d0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
290e0 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  E) && defined(SQ
290f0 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 29 20  LITE_HAVE_ZLIB) 
29100 2a 2f 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e  */.../*.** If an
29110 20 69 6e 70 75 74 20 6c 69 6e 65 20 62 65 67 69   input line begi
29120 6e 73 20 77 69 74 68 20 22 2e 22 20 74 68 65 6e  ns with "." then
29130 20 69 6e 76 6f 6b 65 20 74 68 69 73 20 72 6f 75   invoke this rou
29140 74 69 6e 65 20 74 6f 0a 2a 2a 20 70 72 6f 63 65  tine to.** proce
29150 73 73 20 74 68 61 74 20 6c 69 6e 65 2e 0a 2a 2a  ss that line..**
29160 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20 6f 6e 20  .** Return 1 on 
29170 65 72 72 6f 72 2c 20 32 20 74 6f 20 65 78 69 74  error, 2 to exit
29180 2c 20 61 6e 64 20 30 20 6f 74 68 65 72 77 69 73  , and 0 otherwis
29190 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
291a0 20 64 6f 5f 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64   do_meta_command
291b0 28 63 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 53 68  (char *zLine, Sh
291c0 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20  ellState *p){.  
291d0 69 6e 74 20 68 20 3d 20 31 3b 0a 20 20 69 6e 74  int h = 1;.  int
291e0 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20 69 6e 74   nArg = 0;.  int
291f0 20 6e 2c 20 63 3b 0a 20 20 69 6e 74 20 72 63 20   n, c;.  int rc 
29200 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 61 7a 41  = 0;.  char *azA
29210 72 67 5b 35 30 5d 3b 0a 0a 23 69 66 6e 64 65 66  rg[50];..#ifndef
29220 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52   SQLITE_OMIT_VIR
29230 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28 20  TUALTABLE.  if( 
29240 70 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72  p->expert.pExper
29250 74 20 29 7b 0a 20 20 20 20 65 78 70 65 72 74 46  t ){.    expertF
29260 69 6e 69 73 68 28 70 2c 20 31 2c 20 30 29 3b 0a  inish(p, 1, 0);.
29270 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a    }.#endif..  /*
29280 20 50 61 72 73 65 20 74 68 65 20 69 6e 70 75 74   Parse the input
29290 20 6c 69 6e 65 20 69 6e 74 6f 20 74 6f 6b 65 6e   line into token
292a0 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c 65 28  s..  */.  while(
292b0 20 7a 4c 69 6e 65 5b 68 5d 20 26 26 20 6e 41 72   zLine[h] && nAr
292c0 67 3c 41 72 72 61 79 53 69 7a 65 28 61 7a 41 72  g<ArraySize(azAr
292d0 67 29 20 29 7b 0a 20 20 20 20 77 68 69 6c 65 28  g) ){.    while(
292e0 20 49 73 53 70 61 63 65 28 7a 4c 69 6e 65 5b 68   IsSpace(zLine[h
292f0 5d 29 20 29 7b 20 68 2b 2b 3b 20 7d 0a 20 20 20  ]) ){ h++; }.   
29300 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 30   if( zLine[h]==0
29310 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 69 66   ) break;.    if
29320 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 5c 27 27  ( zLine[h]=='\''
29330 20 7c 7c 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 22   || zLine[h]=='"
29340 27 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  ' ){.      int d
29350 65 6c 69 6d 20 3d 20 7a 4c 69 6e 65 5b 68 2b 2b  elim = zLine[h++
29360 5d 3b 0a 20 20 20 20 20 20 61 7a 41 72 67 5b 6e  ];.      azArg[n
29370 41 72 67 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b  Arg++] = &zLine[
29380 68 5d 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  h];.      while(
29390 20 7a 4c 69 6e 65 5b 68 5d 20 26 26 20 7a 4c 69   zLine[h] && zLi
293a0 6e 65 5b 68 5d 21 3d 64 65 6c 69 6d 20 29 7b 0a  ne[h]!=delim ){.
293b0 20 20 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e          if( zLin
293c0 65 5b 68 5d 3d 3d 27 5c 5c 27 20 26 26 20 64 65  e[h]=='\\' && de
293d0 6c 69 6d 3d 3d 27 22 27 20 26 26 20 7a 4c 69 6e  lim=='"' && zLin
293e0 65 5b 68 2b 31 5d 21 3d 30 20 29 20 68 2b 2b 3b  e[h+1]!=0 ) h++;
293f0 0a 20 20 20 20 20 20 20 20 68 2b 2b 3b 0a 20 20  .        h++;.  
29400 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
29410 7a 4c 69 6e 65 5b 68 5d 3d 3d 64 65 6c 69 6d 20  zLine[h]==delim 
29420 29 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6e 65  ){.        zLine
29430 5b 68 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20  [h++] = 0;.     
29440 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64 65 6c   }.      if( del
29450 69 6d 3d 3d 27 22 27 20 29 20 72 65 73 6f 6c 76  im=='"' ) resolv
29460 65 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 61 7a  e_backslashes(az
29470 41 72 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20 20  Arg[nArg-1]);.  
29480 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61    }else{.      a
29490 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26  zArg[nArg++] = &
294a0 7a 4c 69 6e 65 5b 68 5d 3b 0a 20 20 20 20 20 20  zLine[h];.      
294b0 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20  while( zLine[h] 
294c0 26 26 20 21 49 73 53 70 61 63 65 28 7a 4c 69 6e  && !IsSpace(zLin
294d0 65 5b 68 5d 29 20 29 7b 20 68 2b 2b 3b 20 7d 0a  e[h]) ){ h++; }.
294e0 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b        if( zLine[
294f0 68 5d 20 29 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 20  h] ) zLine[h++] 
29500 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 73 6f 6c  = 0;.      resol
29510 76 65 5f 62 61 63 6b 73 6c 61 73 68 65 73 28 61  ve_backslashes(a
29520 7a 41 72 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20  zArg[nArg-1]);. 
29530 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50     }.  }..  /* P
29540 72 6f 63 65 73 73 20 74 68 65 20 69 6e 70 75 74  rocess the input
29550 20 6c 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20 69 66   line..  */.  if
29560 28 20 6e 41 72 67 3d 3d 30 20 29 20 72 65 74 75  ( nArg==0 ) retu
29570 72 6e 20 30 3b 20 2f 2a 20 6e 6f 20 74 6f 6b 65  rn 0; /* no toke
29580 6e 73 2c 20 6e 6f 20 65 72 72 6f 72 20 2a 2f 0a  ns, no error */.
29590 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61    n = strlen30(a
295a0 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 63 20 3d 20  zArg[0]);.  c = 
295b0 61 7a 41 72 67 5b 30 5d 5b 30 5d 3b 0a 20 20 63  azArg[0][0];.  c
295c0 6c 65 61 72 54 65 6d 70 46 69 6c 65 28 70 29 3b  learTempFile(p);
295d0 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
295e0 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
295f0 49 4f 4e 0a 20 20 69 66 28 20 63 3d 3d 27 61 27  ION.  if( c=='a'
29600 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
29610 67 5b 30 5d 2c 20 22 61 75 74 68 22 2c 20 6e 29  g[0], "auth", n)
29620 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
29630 41 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg!=2 ){.      
29640 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
29650 72 2c 20 22 55 73 61 67 65 3a 20 2e 61 75 74 68  r, "Usage: .auth
29660 20 4f 4e 7c 4f 46 46 5c 6e 22 29 3b 0a 20 20 20   ON|OFF\n");.   
29670 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
29680 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
29690 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20  nd_exit;.    }. 
296a0 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
296b0 3b 0a 20 20 20 20 69 66 28 20 62 6f 6f 6c 65 61  ;.    if( boolea
296c0 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29  nValue(azArg[1])
296d0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
296e0 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72  3_set_authorizer
296f0 28 70 2d 3e 64 62 2c 20 73 68 65 6c 6c 41 75 74  (p->db, shellAut
29700 68 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65  h, p);.    }else
29710 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
29720 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70  set_authorizer(p
29730 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->db, 0, 0);.   
29740 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69   }.  }else.#endi
29750 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
29760 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
29770 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66  UALTABLE) && def
29780 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45  ined(SQLITE_HAVE
29790 5f 5a 4c 49 42 29 0a 20 20 69 66 28 20 63 3d 3d  _ZLIB).  if( c==
297a0 27 61 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'a' && strncmp(a
297b0 7a 41 72 67 5b 30 5d 2c 20 22 61 72 63 68 69 76  zArg[0], "archiv
297c0 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  e", n)==0 ){.   
297d0 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
297e0 20 20 20 20 72 63 20 3d 20 61 72 44 6f 74 43 6f      rc = arDotCo
297f0 6d 6d 61 6e 64 28 70 2c 20 61 7a 41 72 67 2c 20  mmand(p, azArg, 
29800 6e 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  nArg);.  }else.#
29810 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 28 63 3d  endif..  if( (c=
29820 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20 26 26 20  ='b' && n>=3 && 
29830 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
29840 2c 20 22 62 61 63 6b 75 70 22 2c 20 6e 29 3d 3d  , "backup", n)==
29850 30 29 0a 20 20 20 7c 7c 20 28 63 3d 3d 27 73 27  0).   || (c=='s'
29860 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
29870 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73  cmp(azArg[0], "s
29880 61 76 65 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 29  ave", n)==0).  )
29890 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
298a0 20 2a 7a 44 65 73 74 46 69 6c 65 20 3d 20 30 3b   *zDestFile = 0;
298b0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
298c0 2a 7a 44 62 20 3d 20 30 3b 0a 20 20 20 20 73 71  *zDb = 0;.    sq
298d0 6c 69 74 65 33 20 2a 70 44 65 73 74 3b 0a 20 20  lite3 *pDest;.  
298e0 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
298f0 20 2a 70 42 61 63 6b 75 70 3b 0a 20 20 20 20 69   *pBackup;.    i
29900 6e 74 20 6a 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  nt j;.    for(j=
29910 31 3b 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 29 7b  1; j<nArg; j++){
29920 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
29930 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b  r *z = azArg[j];
29940 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d  .      if( z[0]=
29950 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='-' ){.        
29960 77 68 69 6c 65 28 20 7a 5b 30 5d 3d 3d 27 2d 27  while( z[0]=='-'
29970 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20   ) z++;.        
29980 2f 2a 20 4e 6f 20 6f 70 74 69 6f 6e 73 20 74 6f  /* No options to
29990 20 70 72 6f 63 65 73 73 20 61 74 20 74 68 69 73   process at this
299a0 20 74 69 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   time */.       
299b0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66   {.          utf
299c0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
299d0 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e   "unknown option
299e0 3a 20 25 73 5c 6e 22 2c 20 61 7a 41 72 67 5b 6a  : %s\n", azArg[j
299f0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  ]);.          re
29a00 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
29a10 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
29a20 28 20 7a 44 65 73 74 46 69 6c 65 3d 3d 30 20 29  ( zDestFile==0 )
29a30 7b 0a 20 20 20 20 20 20 20 20 7a 44 65 73 74 46  {.        zDestF
29a40 69 6c 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a  ile = azArg[j];.
29a50 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
29a60 7a 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  zDb==0 ){.      
29a70 20 20 7a 44 62 20 3d 20 7a 44 65 73 74 46 69 6c    zDb = zDestFil
29a80 65 3b 0a 20 20 20 20 20 20 20 20 7a 44 65 73 74  e;.        zDest
29a90 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b  File = azArg[j];
29aa0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
29ab0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
29ac0 28 73 74 64 65 72 72 2c 20 22 74 6f 6f 20 6d 61  (stderr, "too ma
29ad0 6e 79 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  ny arguments to 
29ae0 2e 62 61 63 6b 75 70 5c 6e 22 29 3b 0a 20 20 20  .backup\n");.   
29af0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
29b00 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
29b10 20 69 66 28 20 7a 44 65 73 74 46 69 6c 65 3d 3d   if( zDestFile==
29b20 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  0 ){.      raw_p
29b30 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6d  rintf(stderr, "m
29b40 69 73 73 69 6e 67 20 46 49 4c 45 4e 41 4d 45 20  issing FILENAME 
29b50 61 72 67 75 6d 65 6e 74 20 6f 6e 20 2e 62 61 63  argument on .bac
29b60 6b 75 70 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  kup\n");.      r
29b70 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
29b80 20 20 20 69 66 28 20 7a 44 62 3d 3d 30 20 29 20     if( zDb==0 ) 
29b90 7a 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20  zDb = "main";.  
29ba0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f    rc = sqlite3_o
29bb0 70 65 6e 28 7a 44 65 73 74 46 69 6c 65 2c 20 26  pen(zDestFile, &
29bc0 70 44 65 73 74 29 3b 0a 20 20 20 20 69 66 28 20  pDest);.    if( 
29bd0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
29be0 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
29bf0 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
29c00 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c  r: cannot open \
29c10 22 25 73 5c 22 5c 6e 22 2c 20 7a 44 65 73 74 46  "%s\"\n", zDestF
29c20 69 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ile);.      sqli
29c30 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29  te3_close(pDest)
29c40 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
29c50 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e  ;.    }.    open
29c60 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 70  _db(p, 0);.    p
29c70 42 61 63 6b 75 70 20 3d 20 73 71 6c 69 74 65 33  Backup = sqlite3
29c80 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28 70 44 65  _backup_init(pDe
29c90 73 74 2c 20 22 6d 61 69 6e 22 2c 20 70 2d 3e 64  st, "main", p->d
29ca0 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28  b, zDb);.    if(
29cb0 20 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20   pBackup==0 ){. 
29cc0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
29cd0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
29ce0 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f   %s\n", sqlite3_
29cf0 65 72 72 6d 73 67 28 70 44 65 73 74 29 29 3b 0a  errmsg(pDest));.
29d00 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c        sqlite3_cl
29d10 6f 73 65 28 70 44 65 73 74 29 3b 0a 20 20 20 20  ose(pDest);.    
29d20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
29d30 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 20 28 72  }.    while(  (r
29d40 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  c = sqlite3_back
29d50 75 70 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c  up_step(pBackup,
29d60 31 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  100))==SQLITE_OK
29d70 20 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74 65 33   ){}.    sqlite3
29d80 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70  _backup_finish(p
29d90 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28  Backup);.    if(
29da0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
29db0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30   ){.      rc = 0
29dc0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
29dd0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
29de0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25  tderr, "Error: %
29df0 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  s\n", sqlite3_er
29e00 72 6d 73 67 28 70 44 65 73 74 29 29 3b 0a 20 20  rmsg(pDest));.  
29e10 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
29e20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c  }.    sqlite3_cl
29e30 6f 73 65 28 70 44 65 73 74 29 3b 0a 20 20 7d 65  ose(pDest);.  }e
29e40 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 62  lse..  if( c=='b
29e50 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72  ' && n>=3 && str
29e60 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
29e70 62 61 69 6c 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  bail", n)==0 ){.
29e80 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
29e90 29 7b 0a 20 20 20 20 20 20 62 61 69 6c 5f 6f 6e  ){.      bail_on
29ea0 5f 65 72 72 6f 72 20 3d 20 62 6f 6f 6c 65 61 6e  _error = boolean
29eb0 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b  Value(azArg[1]);
29ec0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
29ed0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
29ee0 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 62 61  err, "Usage: .ba
29ef0 69 6c 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20  il on|off\n");. 
29f00 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
29f10 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
29f20 28 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33  ( c=='b' && n>=3
29f30 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
29f40 67 5b 30 5d 2c 20 22 62 69 6e 61 72 79 22 2c 20  g[0], "binary", 
29f50 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  n)==0 ){.    if(
29f60 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
29f70 20 20 69 66 28 20 62 6f 6f 6c 65 61 6e 56 61 6c    if( booleanVal
29f80 75 65 28 61 7a 41 72 67 5b 31 5d 29 20 29 7b 0a  ue(azArg[1]) ){.
29f90 20 20 20 20 20 20 20 20 73 65 74 42 69 6e 61 72          setBinar
29fa0 79 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29  yMode(p->out, 1)
29fb0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
29fc0 20 20 20 20 20 20 20 73 65 74 54 65 78 74 4d 6f         setTextMo
29fd0 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20  de(p->out, 1);. 
29fe0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
29ff0 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2a000 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
2a010 65 3a 20 2e 62 69 6e 61 72 79 20 6f 6e 7c 6f 66  e: .binary on|of
2a020 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  f\n");.      rc 
2a030 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
2a040 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63 27  se..  if( c=='c'
2a050 20 26 26 20 73 74 72 63 6d 70 28 61 7a 41 72 67   && strcmp(azArg
2a060 5b 30 5d 2c 22 63 64 22 29 3d 3d 30 20 29 7b 0a  [0],"cd")==0 ){.
2a070 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
2a080 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  ){.#if defined(_
2a090 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65  WIN32) || define
2a0a0 64 28 57 49 4e 33 32 29 0a 20 20 20 20 20 20 77  d(WIN32).      w
2a0b0 63 68 61 72 5f 74 20 2a 7a 20 3d 20 73 71 6c 69  char_t *z = sqli
2a0c0 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74  te3_win32_utf8_t
2a0d0 6f 5f 75 6e 69 63 6f 64 65 28 61 7a 41 72 67 5b  o_unicode(azArg[
2a0e0 31 5d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  1]);.      rc = 
2a0f0 21 53 65 74 43 75 72 72 65 6e 74 44 69 72 65 63  !SetCurrentDirec
2a100 74 6f 72 79 57 28 7a 29 3b 0a 20 20 20 20 20 20  toryW(z);.      
2a110 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
2a120 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20  .#else.      rc 
2a130 3d 20 63 68 64 69 72 28 61 7a 41 72 67 5b 31 5d  = chdir(azArg[1]
2a140 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
2a150 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2a160 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2a170 64 65 72 72 2c 20 22 43 61 6e 6e 6f 74 20 63 68  derr, "Cannot ch
2a180 61 6e 67 65 20 74 6f 20 64 69 72 65 63 74 6f 72  ange to director
2a190 79 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41  y \"%s\"\n", azA
2a1a0 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[1]);.        
2a1b0 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  rc = 1;.      }.
2a1c0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a1d0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2a1e0 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 63 64 20  rr, "Usage: .cd 
2a1f0 44 49 52 45 43 54 4f 52 59 5c 6e 22 29 3b 0a 20  DIRECTORY\n");. 
2a200 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
2a210 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a   }.  }else..  /*
2a220 20 54 68 65 20 75 6e 64 6f 63 75 6d 65 6e 74 65   The undocumente
2a230 64 20 22 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20  d ".breakpoint" 
2a240 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20 61  command causes a
2a250 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 6e 6f 2d   call to the no-
2a260 6f 70 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20  op.  ** routine 
2a270 6e 61 6d 65 64 20 74 65 73 74 5f 62 72 65 61 6b  named test_break
2a280 70 6f 69 6e 74 28 29 2e 0a 20 20 2a 2f 0a 20 20  point()..  */.  
2a290 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e  if( c=='b' && n>
2a2a0 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =3 && strncmp(az
2a2b0 41 72 67 5b 30 5d 2c 20 22 62 72 65 61 6b 70 6f  Arg[0], "breakpo
2a2c0 69 6e 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  int", n)==0 ){. 
2a2d0 20 20 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69     test_breakpoi
2a2e0 6e 74 28 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  nt();.  }else.. 
2a2f0 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20 6e   if( c=='c' && n
2a300 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
2a310 7a 41 72 67 5b 30 5d 2c 20 22 63 68 61 6e 67 65  zArg[0], "change
2a320 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  s", n)==0 ){.   
2a330 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a   if( nArg==2 ){.
2a340 20 20 20 20 20 20 73 65 74 4f 72 43 6c 65 61 72        setOrClear
2a350 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 43 6f  Flag(p, SHFLG_Co
2a360 75 6e 74 43 68 61 6e 67 65 73 2c 20 61 7a 41 72  untChanges, azAr
2a370 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  g[1]);.    }else
2a380 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2a390 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
2a3a0 65 3a 20 2e 63 68 61 6e 67 65 73 20 6f 6e 7c 6f  e: .changes on|o
2a3b0 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  ff\n");.      rc
2a3c0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
2a3d0 6c 73 65 0a 0a 20 20 2f 2a 20 43 61 6e 63 65 6c  lse..  /* Cancel
2a3e0 20 6f 75 74 70 75 74 20 72 65 64 69 72 65 63 74   output redirect
2a3f0 69 6f 6e 2c 20 69 66 20 69 74 20 69 73 20 63 75  ion, if it is cu
2a400 72 72 65 6e 74 6c 79 20 73 65 74 20 28 62 79 20  rrently set (by 
2a410 2e 74 65 73 74 63 61 73 65 29 0a 20 20 2a 2a 20  .testcase).  ** 
2a420 54 68 65 6e 20 72 65 61 64 20 74 68 65 20 63 6f  Then read the co
2a430 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 74 65 73  ntent of the tes
2a440 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 20 66 69  tcase-out.txt fi
2a450 6c 65 20 61 6e 64 20 63 6f 6d 70 61 72 65 20 61  le and compare a
2a460 67 61 69 6e 73 74 0a 20 20 2a 2a 20 61 7a 41 72  gainst.  ** azAr
2a470 67 5b 31 5d 2e 20 20 49 66 20 74 68 65 72 65 20  g[1].  If there 
2a480 61 72 65 20 64 69 66 66 65 72 65 6e 63 65 73 2c  are differences,
2a490 20 72 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72   report an error
2a4a0 20 61 6e 64 20 65 78 69 74 2e 0a 20 20 2a 2f 0a   and exit..  */.
2a4b0 20 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20    if( c=='c' && 
2a4c0 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=3 && strncmp(
2a4d0 61 7a 41 72 67 5b 30 5d 2c 20 22 63 68 65 63 6b  azArg[0], "check
2a4e0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
2a4f0 63 68 61 72 20 2a 7a 52 65 73 20 3d 20 30 3b 0a  char *zRes = 0;.
2a500 20 20 20 20 6f 75 74 70 75 74 5f 72 65 73 65 74      output_reset
2a510 28 70 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72  (p);.    if( nAr
2a520 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 61  g!=2 ){.      ra
2a530 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2a540 20 22 55 73 61 67 65 3a 20 2e 63 68 65 63 6b 20   "Usage: .check 
2a550 47 4c 4f 42 2d 50 41 54 54 45 52 4e 5c 6e 22 29  GLOB-PATTERN\n")
2a560 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 32 3b 0a  ;.      rc = 2;.
2a570 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 7a      }else if( (z
2a580 52 65 73 20 3d 20 72 65 61 64 46 69 6c 65 28 22  Res = readFile("
2a590 74 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74  testcase-out.txt
2a5a0 22 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20  ", 0))==0 ){.   
2a5b0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2a5c0 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61  derr, "Error: ca
2a5d0 6e 6e 6f 74 20 72 65 61 64 20 27 74 65 73 74 63  nnot read 'testc
2a5e0 61 73 65 2d 6f 75 74 2e 74 78 74 27 5c 6e 22 29  ase-out.txt'\n")
2a5f0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 32 3b 0a  ;.      rc = 2;.
2a600 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 74 65      }else if( te
2a610 73 74 63 61 73 65 5f 67 6c 6f 62 28 61 7a 41 72  stcase_glob(azAr
2a620 67 5b 31 5d 2c 7a 52 65 73 29 3d 3d 30 20 29 7b  g[1],zRes)==0 ){
2a630 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
2a640 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20  tf(stderr,.     
2a650 20 20 20 20 20 20 20 20 20 20 20 20 22 74 65 73              "tes
2a660 74 63 61 73 65 2d 25 73 20 46 41 49 4c 45 44 5c  tcase-%s FAILED\
2a670 6e 20 45 78 70 65 63 74 65 64 3a 20 5b 25 73 5d  n Expected: [%s]
2a680 5c 6e 20 20 20 20 20 20 47 6f 74 3a 20 5b 25 73  \n      Got: [%s
2a690 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ]\n",.          
2a6a0 20 20 20 20 20 20 20 70 2d 3e 7a 54 65 73 74 63         p->zTestc
2a6b0 61 73 65 2c 20 61 7a 41 72 67 5b 31 5d 2c 20 7a  ase, azArg[1], z
2a6c0 52 65 73 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  Res);.      rc =
2a6d0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
2a6e0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2a6f0 28 73 74 64 6f 75 74 2c 20 22 74 65 73 74 63 61  (stdout, "testca
2a700 73 65 2d 25 73 20 6f 6b 5c 6e 22 2c 20 70 2d 3e  se-%s ok\n", p->
2a710 7a 54 65 73 74 63 61 73 65 29 3b 0a 20 20 20 20  zTestcase);.    
2a720 20 20 70 2d 3e 6e 43 68 65 63 6b 2b 2b 3b 0a 20    p->nCheck++;. 
2a730 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2a740 5f 66 72 65 65 28 7a 52 65 73 29 3b 0a 20 20 7d  _free(zRes);.  }
2a750 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
2a760 63 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  c' && strncmp(az
2a770 41 72 67 5b 30 5d 2c 20 22 63 6c 6f 6e 65 22 2c  Arg[0], "clone",
2a780 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   n)==0 ){.    if
2a790 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20  ( nArg==2 ){.   
2a7a0 20 20 20 74 72 79 54 6f 43 6c 6f 6e 65 28 70 2c     tryToClone(p,
2a7b0 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
2a7c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
2a7d0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2a7e0 22 55 73 61 67 65 3a 20 2e 63 6c 6f 6e 65 20 46  "Usage: .clone F
2a7f0 49 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20 20  ILENAME\n");.   
2a800 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
2a810 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
2a820 63 3d 3d 27 64 27 20 26 26 20 6e 3e 31 20 26 26  c=='d' && n>1 &&
2a830 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2a840 5d 2c 20 22 64 61 74 61 62 61 73 65 73 22 2c 20  ], "databases", 
2a850 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65  n)==0 ){.    She
2a860 6c 6c 53 74 61 74 65 20 64 61 74 61 3b 0a 20 20  llState data;.  
2a870 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
2a880 3d 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62  = 0;.    open_db
2a890 28 70 2c 20 30 29 3b 0a 20 20 20 20 6d 65 6d 63  (p, 0);.    memc
2a8a0 70 79 28 26 64 61 74 61 2c 20 70 2c 20 73 69 7a  py(&data, p, siz
2a8b0 65 6f 66 28 64 61 74 61 29 29 3b 0a 20 20 20 20  eof(data));.    
2a8c0 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65 72 20  data.showHeader 
2a8d0 3d 20 30 3b 0a 20 20 20 20 64 61 74 61 2e 63 4d  = 0;.    data.cM
2a8e0 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20  ode = data.mode 
2a8f0 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20  = MODE_List;.   
2a900 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2a910 66 28 73 69 7a 65 6f 66 28 64 61 74 61 2e 63 6f  f(sizeof(data.co
2a920 6c 53 65 70 61 72 61 74 6f 72 29 2c 64 61 74 61  lSeparator),data
2a930 2e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 22 3a  .colSeparator,":
2a940 20 22 29 3b 0a 20 20 20 20 64 61 74 61 2e 63 6e   ");.    data.cn
2a950 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  t = 0;.    sqlit
2a960 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22  e3_exec(p->db, "
2a970 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 66 69 6c  SELECT name, fil
2a980 65 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 64 61  e FROM pragma_da
2a990 74 61 62 61 73 65 5f 6c 69 73 74 22 2c 0a 20 20  tabase_list",.  
2a9a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
2a9b0 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20  allback, &data, 
2a9c0 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69  &zErrMsg);.    i
2a9d0 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  f( zErrMsg ){.  
2a9e0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2a9f0 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25  stderr,"Error: %
2aa00 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  s\n", zErrMsg);.
2aa10 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2aa20 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
2aa30 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
2aa40 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
2aa50 63 3d 3d 27 64 27 20 26 26 20 73 74 72 6e 63 6d  c=='d' && strncm
2aa60 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64 62 69  p(azArg[0], "dbi
2aa70 6e 66 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  nfo", n)==0 ){. 
2aa80 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f 64 62     rc = shell_db
2aa90 69 6e 66 6f 5f 63 6f 6d 6d 61 6e 64 28 70 2c 20  info_command(p, 
2aaa0 6e 41 72 67 2c 20 61 7a 41 72 67 29 3b 0a 20 20  nArg, azArg);.  
2aab0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
2aac0 27 64 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'd' && strncmp(a
2aad0 7a 41 72 67 5b 30 5d 2c 20 22 64 75 6d 70 22 2c  zArg[0], "dump",
2aae0 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f   n)==0 ){.    co
2aaf0 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69 6b 65 20  nst char *zLike 
2ab00 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  = 0;.    int i;.
2ab10 20 20 20 20 69 6e 74 20 73 61 76 65 64 53 68 6f      int savedSho
2ab20 77 48 65 61 64 65 72 20 3d 20 70 2d 3e 73 68 6f  wHeader = p->sho
2ab30 77 48 65 61 64 65 72 3b 0a 20 20 20 20 53 68 65  wHeader;.    She
2ab40 6c 6c 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 53  llClearFlag(p, S
2ab50 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52 6f 77  HFLG_PreserveRow
2ab60 69 64 7c 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65  id|SHFLG_Newline
2ab70 73 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b  s);.    for(i=1;
2ab80 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
2ab90 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b 69       if( azArg[i
2aba0 5d 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  ][0]=='-' ){.   
2abb0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2abc0 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 2b 31 3b  *z = azArg[i]+1;
2abd0 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 30  .        if( z[0
2abe0 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20  ]=='-' ) z++;.  
2abf0 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
2ac00 28 7a 2c 22 70 72 65 73 65 72 76 65 2d 72 6f 77  (z,"preserve-row
2ac10 69 64 73 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64  ids")==0 ){.#ifd
2ac20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
2ac30 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
2ac40 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2ac50 28 73 74 64 65 72 72 2c 20 22 54 68 65 20 2d 2d  (stderr, "The --
2ac60 70 72 65 73 65 72 76 65 2d 72 6f 77 69 64 73 20  preserve-rowids 
2ac70 6f 70 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f  option is not co
2ac80 6d 70 61 74 69 62 6c 65 22 0a 20 20 20 20 20 20  mpatible".      
2ac90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aca0 20 20 20 20 20 20 20 22 20 77 69 74 68 20 53 51         " with SQ
2acb0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
2acc0 4c 54 41 42 4c 45 5c 6e 22 29 3b 0a 20 20 20 20  LTABLE\n");.    
2acd0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
2ace0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74          goto met
2acf0 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
2ad00 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20  #else.          
2ad10 53 68 65 6c 6c 53 65 74 46 6c 61 67 28 70 2c 20  ShellSetFlag(p, 
2ad20 53 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52 6f  SHFLG_PreserveRo
2ad30 77 69 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  wid);.#endif.   
2ad40 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20       }else.     
2ad50 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c     if( strcmp(z,
2ad60 22 6e 65 77 6c 69 6e 65 73 22 29 3d 3d 30 20 29  "newlines")==0 )
2ad70 7b 0a 20 20 20 20 20 20 20 20 20 20 53 68 65 6c  {.          Shel
2ad80 6c 53 65 74 46 6c 61 67 28 70 2c 20 53 48 46 4c  lSetFlag(p, SHFL
2ad90 47 5f 4e 65 77 6c 69 6e 65 73 29 3b 0a 20 20 20  G_Newlines);.   
2ada0 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20       }else.     
2adb0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72     {.          r
2adc0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
2add0 2c 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f  , "Unknown optio
2ade0 6e 20 5c 22 25 73 5c 22 20 6f 6e 20 5c 22 2e 64  n \"%s\" on \".d
2adf0 75 6d 70 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b  ump\"\n", azArg[
2ae00 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  i]);.          r
2ae10 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
2ae20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
2ae30 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  nd_exit;.       
2ae40 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
2ae50 66 28 20 7a 4c 69 6b 65 20 29 7b 0a 20 20 20 20  f( zLike ){.    
2ae60 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2ae70 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
2ae80 64 75 6d 70 20 3f 2d 2d 70 72 65 73 65 72 76 65  dump ?--preserve
2ae90 2d 72 6f 77 69 64 73 3f 20 22 0a 20 20 20 20 20  -rowids? ".     
2aea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aeb0 20 20 20 20 20 20 22 3f 2d 2d 6e 65 77 6c 69 6e        "?--newlin
2aec0 65 73 3f 20 3f 4c 49 4b 45 2d 50 41 54 54 45 52  es? ?LIKE-PATTER
2aed0 4e 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  N?\n");.        
2aee0 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
2aef0 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
2af00 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 65  d_exit;.      }e
2af10 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69  lse{.        zLi
2af20 6b 65 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20  ke = azArg[i];. 
2af30 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2af40 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
2af50 20 20 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79      /* When play
2af60 69 6e 67 20 62 61 63 6b 20 61 20 22 64 75 6d 70  ing back a "dump
2af70 22 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6d  ", the content m
2af80 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 61  ight appear in a
2af90 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 77  n order.    ** w
2afa0 68 69 63 68 20 63 61 75 73 65 73 20 69 6d 6d 65  hich causes imme
2afb0 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65  diate foreign ke
2afc0 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f  y constraints to
2afd0 20 62 65 20 76 69 6f 6c 61 74 65 64 2e 0a 20 20   be violated..  
2afe0 20 20 2a 2a 20 53 6f 20 64 69 73 61 62 6c 65 20    ** So disable 
2aff0 66 6f 72 65 69 67 6e 2d 6b 65 79 20 63 6f 6e 73  foreign-key cons
2b000 74 72 61 69 6e 74 20 65 6e 66 6f 72 63 65 6d 65  traint enforceme
2b010 6e 74 20 74 6f 20 70 72 65 76 65 6e 74 20 70 72  nt to prevent pr
2b020 6f 62 6c 65 6d 73 2e 20 2a 2f 0a 20 20 20 20 72  oblems. */.    r
2b030 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
2b040 2c 20 22 50 52 41 47 4d 41 20 66 6f 72 65 69 67  , "PRAGMA foreig
2b050 6e 5f 6b 65 79 73 3d 4f 46 46 3b 5c 6e 22 29 3b  n_keys=OFF;\n");
2b060 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
2b070 70 2d 3e 6f 75 74 2c 20 22 42 45 47 49 4e 20 54  p->out, "BEGIN T
2b080 52 41 4e 53 41 43 54 49 4f 4e 3b 5c 6e 22 29 3b  RANSACTION;\n");
2b090 0a 20 20 20 20 70 2d 3e 77 72 69 74 61 62 6c 65  .    p->writable
2b0a0 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20  Schema = 0;.    
2b0b0 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20  p->showHeader = 
2b0c0 30 3b 0a 20 20 20 20 2f 2a 20 53 65 74 20 77 72  0;.    /* Set wr
2b0d0 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e  itable_schema=ON
2b0e0 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20   since doing so 
2b0f0 66 6f 72 63 65 73 20 53 51 4c 69 74 65 20 74 6f  forces SQLite to
2b100 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 20 20   initialize.    
2b110 2a 2a 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68  ** as much of th
2b120 65 20 73 63 68 65 6d 61 20 61 73 20 69 74 20 63  e schema as it c
2b130 61 6e 20 65 76 65 6e 20 69 66 20 74 68 65 20 73  an even if the s
2b140 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
2b150 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 72  le is.    ** cor
2b160 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  rupt. */.    sql
2b170 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
2b180 20 22 53 41 56 45 50 4f 49 4e 54 20 64 75 6d 70   "SAVEPOINT dump
2b190 3b 20 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c  ; PRAGMA writabl
2b1a0 65 5f 73 63 68 65 6d 61 3d 4f 4e 22 2c 20 30 2c  e_schema=ON", 0,
2b1b0 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 6e   0, 0);.    p->n
2b1c0 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Err = 0;.    if(
2b1d0 20 7a 4c 69 6b 65 3d 3d 30 20 29 7b 0a 20 20 20   zLike==0 ){.   
2b1e0 20 20 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75     run_schema_du
2b1f0 6d 70 5f 71 75 65 72 79 28 70 2c 0a 20 20 20 20  mp_query(p,.    
2b200 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65      "SELECT name
2b210 2c 20 74 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d  , type, sql FROM
2b220 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22   sqlite_master "
2b230 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20  .        "WHERE 
2b240 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44  sql NOT NULL AND
2b250 20 74 79 70 65 3d 3d 27 74 61 62 6c 65 27 20 41   type=='table' A
2b260 4e 44 20 6e 61 6d 65 21 3d 27 73 71 6c 69 74 65  ND name!='sqlite
2b270 5f 73 65 71 75 65 6e 63 65 27 22 0a 20 20 20 20  _sequence'".    
2b280 20 20 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 73    );.      run_s
2b290 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79  chema_dump_query
2b2a0 28 70 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c  (p,.        "SEL
2b2b0 45 43 54 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20  ECT name, type, 
2b2c0 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  sql FROM sqlite_
2b2d0 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 20  master ".       
2b2e0 20 22 57 48 45 52 45 20 6e 61 6d 65 3d 3d 27 73   "WHERE name=='s
2b2f0 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 27 22  qlite_sequence'"
2b300 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
2b310 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71  run_table_dump_q
2b320 75 65 72 79 28 70 2c 0a 20 20 20 20 20 20 20 20  uery(p,.        
2b330 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d  "SELECT sql FROM
2b340 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22   sqlite_master "
2b350 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20  .        "WHERE 
2b360 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44  sql NOT NULL AND
2b370 20 74 79 70 65 20 49 4e 20 28 27 69 6e 64 65 78   type IN ('index
2b380 27 2c 27 74 72 69 67 67 65 72 27 2c 27 76 69 65  ','trigger','vie
2b390 77 27 29 22 2c 20 30 0a 20 20 20 20 20 20 29 3b  w')", 0.      );
2b3a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2b3b0 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
2b3c0 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
2b3d0 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
2b3e0 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65      "SELECT name
2b3f0 2c 20 74 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d  , type, sql FROM
2b400 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22   sqlite_master "
2b410 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20  .        "WHERE 
2b420 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 25 51  tbl_name LIKE %Q
2b430 20 41 4e 44 20 74 79 70 65 3d 3d 27 74 61 62 6c   AND type=='tabl
2b440 65 27 22 0a 20 20 20 20 20 20 20 20 22 20 20 41  e'".        "  A
2b450 4e 44 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22  ND sql NOT NULL"
2b460 2c 20 7a 4c 69 6b 65 29 3b 0a 20 20 20 20 20 20  , zLike);.      
2b470 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f  run_schema_dump_
2b480 71 75 65 72 79 28 70 2c 7a 53 71 6c 29 3b 0a 20  query(p,zSql);. 
2b490 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
2b4a0 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 7a  e(zSql);.      z
2b4b0 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
2b4c0 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22  rintf(.        "
2b4d0 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20  SELECT sql FROM 
2b4e0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a  sqlite_master ".
2b4f0 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20 73          "WHERE s
2b500 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22 0a 20 20 20  ql NOT NULL".   
2b510 20 20 20 20 20 22 20 20 41 4e 44 20 74 79 70 65       "  AND type
2b520 20 49 4e 20 28 27 69 6e 64 65 78 27 2c 27 74 72   IN ('index','tr
2b530 69 67 67 65 72 27 2c 27 76 69 65 77 27 29 22 0a  igger','view')".
2b540 20 20 20 20 20 20 20 20 22 20 20 41 4e 44 20 74          "  AND t
2b550 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 25 51 22  bl_name LIKE %Q"
2b560 2c 20 7a 4c 69 6b 65 29 3b 0a 20 20 20 20 20 20  , zLike);.      
2b570 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71  run_table_dump_q
2b580 75 65 72 79 28 70 2c 20 7a 53 71 6c 2c 20 30 29  uery(p, zSql, 0)
2b590 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2b5a0 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
2b5b0 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 77 72 69  }.    if( p->wri
2b5c0 74 61 62 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20  tableSchema ){. 
2b5d0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2b5e0 70 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20  p->out, "PRAGMA 
2b5f0 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d  writable_schema=
2b600 4f 46 46 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20  OFF;\n");.      
2b610 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d  p->writableSchem
2b620 61 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  a = 0;.    }.   
2b630 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
2b640 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 77 72 69  >db, "PRAGMA wri
2b650 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46  table_schema=OFF
2b660 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ;", 0, 0, 0);.  
2b670 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70    sqlite3_exec(p
2b680 2d 3e 64 62 2c 20 22 52 45 4c 45 41 53 45 20 64  ->db, "RELEASE d
2b690 75 6d 70 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b  ump;", 0, 0, 0);
2b6a0 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
2b6b0 70 2d 3e 6f 75 74 2c 20 70 2d 3e 6e 45 72 72 20  p->out, p->nErr 
2b6c0 3f 20 22 52 4f 4c 4c 42 41 43 4b 3b 20 2d 2d 20  ? "ROLLBACK; -- 
2b6d0 64 75 65 20 74 6f 20 65 72 72 6f 72 73 5c 6e 22  due to errors\n"
2b6e0 20 3a 20 22 43 4f 4d 4d 49 54 3b 5c 6e 22 29 3b   : "COMMIT;\n");
2b6f0 0a 20 20 20 20 70 2d 3e 73 68 6f 77 48 65 61 64  .    p->showHead
2b700 65 72 20 3d 20 73 61 76 65 64 53 68 6f 77 48 65  er = savedShowHe
2b710 61 64 65 72 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  ader;.  }else.. 
2b720 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73   if( c=='e' && s
2b730 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2b740 20 22 65 63 68 6f 22 2c 20 6e 29 3d 3d 30 20 29   "echo", n)==0 )
2b750 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  {.    if( nArg==
2b760 32 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4f 72  2 ){.      setOr
2b770 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 53 48 46  ClearFlag(p, SHF
2b780 4c 47 5f 45 63 68 6f 2c 20 61 7a 41 72 67 5b 31  LG_Echo, azArg[1
2b790 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
2b7a0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2b7b0 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
2b7c0 2e 65 63 68 6f 20 6f 6e 7c 6f 66 66 5c 6e 22 29  .echo on|off\n")
2b7d0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
2b7e0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
2b7f0 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73   if( c=='e' && s
2b800 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2b810 20 22 65 71 70 22 2c 20 6e 29 3d 3d 30 20 29 7b   "eqp", n)==0 ){
2b820 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32  .    if( nArg==2
2b830 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74   ){.      if( st
2b840 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 66  rcmp(azArg[1],"f
2b850 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ull")==0 ){.    
2b860 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50 20 3d      p->autoEQP =
2b870 20 41 55 54 4f 45 51 50 5f 66 75 6c 6c 3b 0a 20   AUTOEQP_full;. 
2b880 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
2b890 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  trcmp(azArg[1],"
2b8a0 74 72 69 67 67 65 72 22 29 3d 3d 30 20 29 7b 0a  trigger")==0 ){.
2b8b0 20 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45          p->autoE
2b8c0 51 50 20 3d 20 41 55 54 4f 45 51 50 5f 74 72 69  QP = AUTOEQP_tri
2b8d0 67 67 65 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73  gger;.      }els
2b8e0 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 75  e{.        p->au
2b8f0 74 6f 45 51 50 20 3d 20 28 75 38 29 62 6f 6f 6c  toEQP = (u8)bool
2b900 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31  eanValue(azArg[1
2b910 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ]);.      }.    
2b920 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
2b930 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2b940 22 55 73 61 67 65 3a 20 2e 65 71 70 20 6f 66 66  "Usage: .eqp off
2b950 7c 6f 6e 7c 74 72 69 67 67 65 72 7c 66 75 6c 6c  |on|trigger|full
2b960 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
2b970 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
2b980 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20  e..  if( c=='e' 
2b990 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2b9a0 5b 30 5d 2c 20 22 65 78 69 74 22 2c 20 6e 29 3d  [0], "exit", n)=
2b9b0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
2b9c0 72 67 3e 31 20 26 26 20 28 72 63 20 3d 20 28 69  rg>1 && (rc = (i
2b9d0 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28  nt)integerValue(
2b9e0 61 7a 41 72 67 5b 31 5d 29 29 21 3d 30 20 29 20  azArg[1]))!=0 ) 
2b9f0 65 78 69 74 28 72 63 29 3b 0a 20 20 20 20 72 63  exit(rc);.    rc
2ba00 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20   = 2;.  }else.. 
2ba10 20 2f 2a 20 54 68 65 20 22 2e 65 78 70 6c 61 69   /* The ".explai
2ba20 6e 22 20 63 6f 6d 6d 61 6e 64 20 69 73 20 61 75  n" command is au
2ba30 74 6f 6d 61 74 69 63 20 6e 6f 77 2e 20 20 49 74  tomatic now.  It
2ba40 20 69 73 20 6c 61 72 67 65 6c 79 20 70 6f 69 6e   is largely poin
2ba50 74 6c 65 73 73 2e 20 20 49 74 0a 20 20 2a 2a 20  tless.  It.  ** 
2ba60 72 65 74 61 69 6e 65 64 20 70 75 72 65 6c 79 20  retained purely 
2ba70 66 6f 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f  for backwards co
2ba80 6d 70 61 74 69 62 69 6c 69 74 79 20 2a 2f 0a 20  mpatibility */. 
2ba90 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73   if( c=='e' && s
2baa0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2bab0 20 22 65 78 70 6c 61 69 6e 22 2c 20 6e 29 3d 3d   "explain", n)==
2bac0 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 76 61 6c  0 ){.    int val
2bad0 20 3d 20 31 3b 0a 20 20 20 20 69 66 28 20 6e 41   = 1;.    if( nA
2bae0 72 67 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 69  rg>=2 ){.      i
2baf0 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b  f( strcmp(azArg[
2bb00 31 5d 2c 22 61 75 74 6f 22 29 3d 3d 30 20 29 7b  1],"auto")==0 ){
2bb10 0a 20 20 20 20 20 20 20 20 76 61 6c 20 3d 20 39  .        val = 9
2bb20 39 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  9;.      }else{.
2bb30 20 20 20 20 20 20 20 20 76 61 6c 20 3d 20 20 62          val =  b
2bb40 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72  ooleanValue(azAr
2bb50 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  g[1]);.      }. 
2bb60 20 20 20 7d 0a 20 20 20 20 69 66 28 20 76 61 6c     }.    if( val
2bb70 3d 3d 31 20 26 26 20 70 2d 3e 6d 6f 64 65 21 3d  ==1 && p->mode!=
2bb80 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29 7b 0a  MODE_Explain ){.
2bb90 20 20 20 20 20 20 70 2d 3e 6e 6f 72 6d 61 6c 4d        p->normalM
2bba0 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20  ode = p->mode;. 
2bbb0 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d       p->mode = M
2bbc0 4f 44 45 5f 45 78 70 6c 61 69 6e 3b 0a 20 20 20  ODE_Explain;.   
2bbd0 20 20 20 70 2d 3e 61 75 74 6f 45 78 70 6c 61 69     p->autoExplai
2bbe0 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  n = 0;.    }else
2bbf0 20 69 66 28 20 76 61 6c 3d 3d 30 20 29 7b 0a 20   if( val==0 ){. 
2bc00 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 6f 64 65       if( p->mode
2bc10 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29  ==MODE_Explain )
2bc20 20 70 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 6e 6f   p->mode = p->no
2bc30 72 6d 61 6c 4d 6f 64 65 3b 0a 20 20 20 20 20 20  rmalMode;.      
2bc40 70 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20 3d  p->autoExplain =
2bc50 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
2bc60 28 20 76 61 6c 3d 3d 39 39 20 29 7b 0a 20 20 20  ( val==99 ){.   
2bc70 20 20 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d     if( p->mode==
2bc80 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29 20 70  MODE_Explain ) p
2bc90 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 6e 6f 72 6d  ->mode = p->norm
2bca0 61 6c 4d 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d  alMode;.      p-
2bcb0 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20 3d 20 31  >autoExplain = 1
2bcc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
2bcd0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2bce0 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c  OMIT_VIRTUALTABL
2bcf0 45 0a 20 20 69 66 28 20 63 3d 3d 27 65 27 20 26  E.  if( c=='e' &
2bd00 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2bd10 30 5d 2c 20 22 65 78 70 65 72 74 22 2c 20 6e 29  0], "expert", n)
2bd20 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f  ==0 ){.    open_
2bd30 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 65 78  db(p, 0);.    ex
2bd40 70 65 72 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 70  pertDotCommand(p
2bd50 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b 0a  , azArg, nArg);.
2bd60 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a    }else.#endif..
2bd70 20 20 69 66 28 20 63 3d 3d 27 66 27 20 26 26 20    if( c=='f' && 
2bd80 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2bd90 2c 20 22 66 75 6c 6c 73 63 68 65 6d 61 22 2c 20  , "fullschema", 
2bda0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65  n)==0 ){.    She
2bdb0 6c 6c 53 74 61 74 65 20 64 61 74 61 3b 0a 20 20  llState data;.  
2bdc0 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
2bdd0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 64 6f 53  = 0;.    int doS
2bde0 74 61 74 73 20 3d 20 30 3b 0a 20 20 20 20 6d 65  tats = 0;.    me
2bdf0 6d 63 70 79 28 26 64 61 74 61 2c 20 70 2c 20 73  mcpy(&data, p, s
2be00 69 7a 65 6f 66 28 64 61 74 61 29 29 3b 0a 20 20  izeof(data));.  
2be10 20 20 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65    data.showHeade
2be20 72 20 3d 20 30 3b 0a 20 20 20 20 64 61 74 61 2e  r = 0;.    data.
2be30 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64  cMode = data.mod
2be40 65 20 3d 20 4d 4f 44 45 5f 53 65 6d 69 3b 0a 20  e = MODE_Semi;. 
2be50 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 26     if( nArg==2 &
2be60 26 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 61 7a  & optionMatch(az
2be70 41 72 67 5b 31 5d 2c 20 22 69 6e 64 65 6e 74 22  Arg[1], "indent"
2be80 29 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e  ) ){.      data.
2be90 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64  cMode = data.mod
2bea0 65 20 3d 20 4d 4f 44 45 5f 50 72 65 74 74 79 3b  e = MODE_Pretty;
2beb0 0a 20 20 20 20 20 20 6e 41 72 67 20 3d 20 31 3b  .      nArg = 1;
2bec0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
2bed0 41 72 67 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  Arg!=1 ){.      
2bee0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2bef0 72 2c 20 22 55 73 61 67 65 3a 20 2e 66 75 6c 6c  r, "Usage: .full
2bf00 73 63 68 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e 74  schema ?--indent
2bf10 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  ?\n");.      rc 
2bf20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 1;.      goto 
2bf30 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
2bf40 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65  t;.    }.    ope
2bf50 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20  n_db(p, 0);.    
2bf60 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
2bf70 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  c(p->db,.       
2bf80 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d  "SELECT sql FROM
2bf90 22 0a 20 20 20 20 20 20 20 22 20 20 28 53 45 4c  ".       "  (SEL
2bfa0 45 43 54 20 73 71 6c 20 73 71 6c 2c 20 74 79 70  ECT sql sql, typ
2bfb0 65 20 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65  e type, tbl_name
2bfc0 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 20   tbl_name, name 
2bfd0 6e 61 6d 65 2c 20 72 6f 77 69 64 20 78 22 0a 20  name, rowid x". 
2bfe0 20 20 20 20 20 20 22 20 20 20 20 20 46 52 4f 4d        "     FROM
2bff0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 55   sqlite_master U
2c000 4e 49 4f 4e 20 41 4c 4c 22 0a 20 20 20 20 20 20  NION ALL".      
2c010 20 22 20 20 20 53 45 4c 45 43 54 20 73 71 6c 2c   "   SELECT sql,
2c020 20 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65 2c   type, tbl_name,
2c030 20 6e 61 6d 65 2c 20 72 6f 77 69 64 20 46 52 4f   name, rowid FRO
2c040 4d 20 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61  M sqlite_temp_ma
2c050 73 74 65 72 29 20 22 0a 20 20 20 20 20 20 20 22  ster) ".       "
2c060 57 48 45 52 45 20 74 79 70 65 21 3d 27 6d 65 74  WHERE type!='met
2c070 61 27 20 41 4e 44 20 73 71 6c 20 4e 4f 54 4e 55  a' AND sql NOTNU
2c080 4c 4c 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20  LL AND name NOT 
2c090 4c 49 4b 45 20 27 73 71 6c 69 74 65 5f 25 27 20  LIKE 'sqlite_%' 
2c0a0 22 0a 20 20 20 20 20 20 20 22 4f 52 44 45 52 20  ".       "ORDER 
2c0b0 42 59 20 72 6f 77 69 64 22 2c 0a 20 20 20 20 20  BY rowid",.     
2c0c0 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74    callback, &dat
2c0d0 61 2c 20 26 7a 45 72 72 4d 73 67 0a 20 20 20 20  a, &zErrMsg.    
2c0e0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
2c0f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2c100 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
2c110 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 72 63 20  pStmt;.      rc 
2c120 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
2c130 65 5f 76 32 28 70 2d 3e 64 62 2c 0a 20 20 20 20  e_v2(p->db,.    
2c140 20 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45             "SELE
2c150 43 54 20 72 6f 77 69 64 20 46 52 4f 4d 20 73 71  CT rowid FROM sq
2c160 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20  lite_master".   
2c170 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48              " WH
2c180 45 52 45 20 6e 61 6d 65 20 47 4c 4f 42 20 27 73  ERE name GLOB 's
2c190 71 6c 69 74 65 5f 73 74 61 74 5b 31 33 34 5d 27  qlite_stat[134]'
2c1a0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2c1b0 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29    -1, &pStmt, 0)
2c1c0 3b 0a 20 20 20 20 20 20 64 6f 53 74 61 74 73 20  ;.      doStats 
2c1d0 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
2c1e0 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Stmt)==SQLITE_RO
2c1f0 57 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  W;.      sqlite3
2c200 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
2c210 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2c220 64 6f 53 74 61 74 73 3d 3d 30 20 29 7b 0a 20 20  doStats==0 ){.  
2c230 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
2c240 2d 3e 6f 75 74 2c 20 22 2f 2a 20 4e 6f 20 53 54  ->out, "/* No ST
2c250 41 54 20 74 61 62 6c 65 73 20 61 76 61 69 6c 61  AT tables availa
2c260 62 6c 65 20 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20  ble */\n");.    
2c270 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
2c280 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
2c290 22 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f  "ANALYZE sqlite_
2c2a0 6d 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20 20 20  master;\n");.   
2c2b0 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
2c2c0 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20 27  p->db, "SELECT '
2c2d0 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d  ANALYZE sqlite_m
2c2e0 61 73 74 65 72 27 22 2c 0a 20 20 20 20 20 20 20  aster'",.       
2c2f0 20 20 20 20 20 20 20 20 20 20 20 20 63 61 6c 6c              call
2c300 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45  back, &data, &zE
2c310 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 64 61  rrMsg);.      da
2c320 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e  ta.cMode = data.
2c330 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65  mode = MODE_Inse
2c340 72 74 3b 0a 20 20 20 20 20 20 64 61 74 61 2e 7a  rt;.      data.z
2c350 44 65 73 74 54 61 62 6c 65 20 3d 20 22 73 71 6c  DestTable = "sql
2c360 69 74 65 5f 73 74 61 74 31 22 3b 0a 20 20 20 20  ite_stat1";.    
2c370 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2c 20    shell_exec(p, 
2c380 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 73  "SELECT * FROM s
2c390 71 6c 69 74 65 5f 73 74 61 74 31 22 2c 20 26 7a  qlite_stat1", &z
2c3a0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 64  ErrMsg);.      d
2c3b0 61 74 61 2e 7a 44 65 73 74 54 61 62 6c 65 20 3d  ata.zDestTable =
2c3c0 20 22 73 71 6c 69 74 65 5f 73 74 61 74 33 22 3b   "sqlite_stat3";
2c3d0 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f 65 78 65  .      shell_exe
2c3e0 63 28 70 2c 20 22 53 45 4c 45 43 54 20 2a 20 46  c(p, "SELECT * F
2c3f0 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61 74 33  ROM sqlite_stat3
2c400 22 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ", &zErrMsg);.  
2c410 20 20 20 20 64 61 74 61 2e 7a 44 65 73 74 54 61      data.zDestTa
2c420 62 6c 65 20 3d 20 22 73 71 6c 69 74 65 5f 73 74  ble = "sqlite_st
2c430 61 74 34 22 3b 0a 20 20 20 20 20 20 73 68 65 6c  at4";.      shel
2c440 6c 5f 65 78 65 63 28 70 2c 20 22 53 45 4c 45 43  l_exec(p, "SELEC
2c450 54 20 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  T * FROM sqlite_
2c460 73 74 61 74 34 22 2c 20 26 7a 45 72 72 4d 73 67  stat4", &zErrMsg
2c470 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  );.      raw_pri
2c480 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 41 4e 41  ntf(p->out, "ANA
2c490 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73 74  LYZE sqlite_mast
2c4a0 65 72 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20  er;\n");.    }. 
2c4b0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
2c4c0 3d 27 68 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='h' && strncmp(
2c4d0 61 7a 41 72 67 5b 30 5d 2c 20 22 68 65 61 64 65  azArg[0], "heade
2c4e0 72 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  rs", n)==0 ){.  
2c4f0 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b    if( nArg==2 ){
2c500 0a 20 20 20 20 20 20 70 2d 3e 73 68 6f 77 48 65  .      p->showHe
2c510 61 64 65 72 20 3d 20 62 6f 6f 6c 65 61 6e 56 61  ader = booleanVa
2c520 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  lue(azArg[1]);. 
2c530 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c540 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2c550 72 2c 20 22 55 73 61 67 65 3a 20 2e 68 65 61 64  r, "Usage: .head
2c560 65 72 73 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a  ers on|off\n");.
2c570 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
2c580 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
2c590 66 28 20 63 3d 3d 27 68 27 20 26 26 20 73 74 72  f( c=='h' && str
2c5a0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2c5b0 68 65 6c 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  help", n)==0 ){.
2c5c0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2c5d0 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 48  p->out, "%s", zH
2c5e0 65 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  elp);.  }else.. 
2c5f0 20 69 66 28 20 63 3d 3d 27 69 27 20 26 26 20 73   if( c=='i' && s
2c600 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2c610 20 22 69 6d 70 6f 72 74 22 2c 20 6e 29 3d 3d 30   "import", n)==0
2c620 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54   ){.    char *zT
2c630 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  able;           
2c640 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61      /* Insert da
2c650 74 61 20 69 6e 74 6f 20 74 68 69 73 20 74 61 62  ta into this tab
2c660 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  le */.    char *
2c670 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  zFile;          
2c680 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
2c690 20 66 69 6c 65 20 74 6f 20 65 78 74 72 61 20 63   file to extra c
2c6a0 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 2a 2f 0a 20  ontent from */. 
2c6b0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
2c6c0 2a 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20 2f  *pStmt = NULL; /
2c6d0 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  * A statement */
2c6e0 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  .    int nCol;  
2c6f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c700 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
2c710 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62  lumns in the tab
2c720 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42  le */.    int nB
2c730 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
2c740 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2c750 6f 66 20 62 79 74 65 73 20 69 6e 20 61 6e 20 53  of bytes in an S
2c760 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20  QL string */.   
2c770 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
2c780 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
2c790 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
2c7a0 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 43 6f 6d  .    int needCom
2c7b0 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  mit;            
2c7c0 20 2f 2a 20 54 72 75 65 20 74 6f 20 43 4f 4d 4d   /* True to COMM
2c7d0 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 61  IT or ROLLBACK a
2c7e0 74 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74  t end */.    int
2c7f0 20 6e 53 65 70 3b 20 20 20 20 20 20 20 20 20 20   nSep;          
2c800 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
2c810 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 70  er of bytes in p
2c820 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b 5d  ->colSeparator[]
2c830 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   */.    char *zS
2c840 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ql;             
2c850 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73 74      /* An SQL st
2c860 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 49  atement */.    I
2c870 6d 70 6f 72 74 43 74 78 20 73 43 74 78 3b 20 20  mportCtx sCtx;  
2c880 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
2c890 61 64 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ader context */.
2c8a0 20 20 20 20 63 68 61 72 20 2a 28 53 51 4c 49 54      char *(SQLIT
2c8b0 45 5f 43 44 45 43 4c 20 2a 78 52 65 61 64 29 28  E_CDECL *xRead)(
2c8c0 49 6d 70 6f 72 74 43 74 78 2a 29 3b 20 2f 2a 20  ImportCtx*); /* 
2c8d0 46 75 6e 63 20 74 6f 20 72 65 61 64 20 6f 6e 65  Func to read one
2c8e0 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 69 6e   value */.    in
2c8f0 74 20 28 53 51 4c 49 54 45 5f 43 44 45 43 4c 20  t (SQLITE_CDECL 
2c900 2a 78 43 6c 6f 73 65 72 29 28 46 49 4c 45 2a 29  *xCloser)(FILE*)
2c910 3b 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 20 74  ;      /* Func t
2c920 6f 20 63 6c 6f 73 65 20 66 69 6c 65 20 2a 2f 0a  o close file */.
2c930 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 33  .    if( nArg!=3
2c940 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
2c950 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
2c960 61 67 65 3a 20 2e 69 6d 70 6f 72 74 20 46 49 4c  age: .import FIL
2c970 45 20 54 41 42 4c 45 5c 6e 22 29 3b 0a 20 20 20  E TABLE\n");.   
2c980 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
2c990 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d  mand_exit;.    }
2c9a0 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 61 7a 41  .    zFile = azA
2c9b0 72 67 5b 31 5d 3b 0a 20 20 20 20 7a 54 61 62 6c  rg[1];.    zTabl
2c9c0 65 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 20 20  e = azArg[2];.  
2c9d0 20 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20    seenInterrupt 
2c9e0 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  = 0;.    memset(
2c9f0 26 73 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66  &sCtx, 0, sizeof
2ca00 28 73 43 74 78 29 29 3b 0a 20 20 20 20 6f 70 65  (sCtx));.    ope
2ca10 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20  n_db(p, 0);.    
2ca20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28  nSep = strlen30(
2ca30 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
2ca40 3b 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d  ;.    if( nSep==
2ca50 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  0 ){.      raw_p
2ca60 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20  rintf(stderr,.  
2ca70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2ca80 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20  Error: non-null 
2ca90 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72  column separator
2caa0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 69 6d   required for im
2cab0 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20  port\n");.      
2cac0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
2cad0 20 20 20 20 69 66 28 20 6e 53 65 70 3e 31 20 29      if( nSep>1 )
2cae0 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2caf0 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
2cb00 72 3a 20 6d 75 6c 74 69 2d 63 68 61 72 61 63 74  r: multi-charact
2cb10 65 72 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61  er column separa
2cb20 74 6f 72 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  tors not allowed
2cb30 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
2cb40 20 20 20 20 20 20 20 20 22 20 66 6f 72 20 69 6d          " for im
2cb50 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20  port\n");.      
2cb60 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
2cb70 20 20 20 20 6e 53 65 70 20 3d 20 73 74 72 6c 65      nSep = strle
2cb80 6e 33 30 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  n30(p->rowSepara
2cb90 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 53  tor);.    if( nS
2cba0 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ep==0 ){.      r
2cbb0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
2cbc0 2c 20 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75  , "Error: non-nu
2cbd0 6c 6c 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72  ll row separator
2cbe0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 69 6d   required for im
2cbf0 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20  port\n");.      
2cc00 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
2cc10 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 32 20      if( nSep==2 
2cc20 26 26 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45  && p->mode==MODE
2cc30 5f 43 73 76 20 26 26 20 73 74 72 63 6d 70 28 70  _Csv && strcmp(p
2cc40 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20  ->rowSeparator, 
2cc50 53 45 50 5f 43 72 4c 66 29 3d 3d 30 20 29 7b 0a  SEP_CrLf)==0 ){.
2cc60 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 69 6d        /* When im
2cc70 70 6f 72 74 69 6e 67 20 43 53 56 20 28 6f 6e 6c  porting CSV (onl
2cc80 79 29 2c 20 69 66 20 74 68 65 20 72 6f 77 20 73  y), if the row s
2cc90 65 70 61 72 61 74 6f 72 20 69 73 20 73 65 74 20  eparator is set 
2cca0 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
2ccb0 64 65 66 61 75 6c 74 20 6f 75 74 70 75 74 20 72  default output r
2ccc0 6f 77 20 73 65 70 61 72 61 74 6f 72 2c 20 63 68  ow separator, ch
2ccd0 61 6e 67 65 20 69 74 20 74 6f 20 74 68 65 20 64  ange it to the d
2cce0 65 66 61 75 6c 74 20 69 6e 70 75 74 0a 20 20 20  efault input.   
2ccf0 20 20 20 2a 2a 20 72 6f 77 20 73 65 70 61 72 61     ** row separa
2cd00 74 6f 72 2e 20 20 54 68 69 73 20 61 76 6f 69 64  tor.  This avoid
2cd10 73 20 68 61 76 69 6e 67 20 74 6f 20 6d 61 69 6e  s having to main
2cd20 74 61 69 6e 20 64 69 66 66 65 72 65 6e 74 20 69  tain different i
2cd30 6e 70 75 74 0a 20 20 20 20 20 20 2a 2a 20 61 6e  nput.      ** an
2cd40 64 20 6f 75 74 70 75 74 20 72 6f 77 20 73 65 70  d output row sep
2cd50 61 72 61 74 6f 72 73 2e 20 2a 2f 0a 20 20 20 20  arators. */.    
2cd60 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2cd70 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77  tf(sizeof(p->row
2cd80 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72  Separator), p->r
2cd90 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50  owSeparator, SEP
2cda0 5f 52 6f 77 29 3b 0a 20 20 20 20 20 20 6e 53 65  _Row);.      nSe
2cdb0 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e  p = strlen30(p->
2cdc0 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  rowSeparator);. 
2cdd0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 53 65     }.    if( nSe
2cde0 70 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 61 77  p>1 ){.      raw
2cdf0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2ce00 22 45 72 72 6f 72 3a 20 6d 75 6c 74 69 2d 63 68  "Error: multi-ch
2ce10 61 72 61 63 74 65 72 20 72 6f 77 20 73 65 70 61  aracter row sepa
2ce20 72 61 74 6f 72 73 20 6e 6f 74 20 61 6c 6c 6f 77  rators not allow
2ce30 65 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed".            
2ce40 20 20 20 20 20 20 20 20 20 20 22 20 66 6f 72 20            " for 
2ce50 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20  import\n");.    
2ce60 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2ce70 7d 0a 20 20 20 20 73 43 74 78 2e 7a 46 69 6c 65  }.    sCtx.zFile
2ce80 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 20 20 73 43   = zFile;.    sC
2ce90 74 78 2e 6e 4c 69 6e 65 20 3d 20 31 3b 0a 20 20  tx.nLine = 1;.  
2cea0 20 20 69 66 28 20 73 43 74 78 2e 7a 46 69 6c 65    if( sCtx.zFile
2ceb0 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69 66 64  [0]=='|' ){.#ifd
2cec0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
2ced0 4f 50 45 4e 0a 20 20 20 20 20 20 72 61 77 5f 70  OPEN.      raw_p
2cee0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
2cef0 72 72 6f 72 3a 20 70 69 70 65 73 20 61 72 65 20  rror: pipes are 
2cf00 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 69 6e  not supported in
2cf10 20 74 68 69 73 20 4f 53 5c 6e 22 29 3b 0a 20 20   this OS\n");.  
2cf20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65      return 1;.#e
2cf30 6c 73 65 0a 20 20 20 20 20 20 73 43 74 78 2e 69  lse.      sCtx.i
2cf40 6e 20 3d 20 70 6f 70 65 6e 28 73 43 74 78 2e 7a  n = popen(sCtx.z
2cf50 46 69 6c 65 2b 31 2c 20 22 72 22 29 3b 0a 20 20  File+1, "r");.  
2cf60 20 20 20 20 73 43 74 78 2e 7a 46 69 6c 65 20 3d      sCtx.zFile =
2cf70 20 22 3c 70 69 70 65 3e 22 3b 0a 20 20 20 20 20   "<pipe>";.     
2cf80 20 78 43 6c 6f 73 65 72 20 3d 20 70 63 6c 6f 73   xCloser = pclos
2cf90 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  e;.#endif.    }e
2cfa0 6c 73 65 7b 0a 20 20 20 20 20 20 73 43 74 78 2e  lse{.      sCtx.
2cfb0 69 6e 20 3d 20 66 6f 70 65 6e 28 73 43 74 78 2e  in = fopen(sCtx.
2cfc0 7a 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20  zFile, "rb");.  
2cfd0 20 20 20 20 78 43 6c 6f 73 65 72 20 3d 20 66 63      xCloser = fc
2cfe0 6c 6f 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  lose;.    }.    
2cff0 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44  if( p->mode==MOD
2d000 45 5f 41 73 63 69 69 20 29 7b 0a 20 20 20 20 20  E_Ascii ){.     
2d010 20 78 52 65 61 64 20 3d 20 61 73 63 69 69 5f 72   xRead = ascii_r
2d020 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 3b 0a 20  ead_one_field;. 
2d030 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d040 78 52 65 61 64 20 3d 20 63 73 76 5f 72 65 61 64  xRead = csv_read
2d050 5f 6f 6e 65 5f 66 69 65 6c 64 3b 0a 20 20 20 20  _one_field;.    
2d060 7d 0a 20 20 20 20 69 66 28 20 73 43 74 78 2e 69  }.    if( sCtx.i
2d070 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74  n==0 ){.      ut
2d080 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2d090 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74  , "Error: cannot
2d0a0 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c   open \"%s\"\n",
2d0b0 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 72   zFile);.      r
2d0c0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
2d0d0 20 20 20 73 43 74 78 2e 63 43 6f 6c 53 65 70 20     sCtx.cColSep 
2d0e0 3d 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  = p->colSeparato
2d0f0 72 5b 30 5d 3b 0a 20 20 20 20 73 43 74 78 2e 63  r[0];.    sCtx.c
2d100 52 6f 77 53 65 70 20 3d 20 70 2d 3e 72 6f 77 53  RowSep = p->rowS
2d110 65 70 61 72 61 74 6f 72 5b 30 5d 3b 0a 20 20 20  eparator[0];.   
2d120 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
2d130 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
2d140 2a 20 46 52 4f 4d 20 25 73 22 2c 20 7a 54 61 62  * FROM %s", zTab
2d150 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71  le);.    if( zSq
2d160 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61  l==0 ){.      ra
2d170 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2d180 20 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20   "Error: out of 
2d190 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20  memory\n");.    
2d1a0 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69    xCloser(sCtx.i
2d1b0 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  n);.      return
2d1c0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42   1;.    }.    nB
2d1d0 79 74 65 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  yte = strlen30(z
2d1e0 53 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  Sql);.    rc = s
2d1f0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
2d200 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  2(p->db, zSql, -
2d210 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
2d220 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64     import_append
2d230 5f 63 68 61 72 28 26 73 43 74 78 2c 20 30 29 3b  _char(&sCtx, 0);
2d240 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65      /* To ensure
2d250 20 73 43 74 78 2e 7a 20 69 73 20 61 6c 6c 6f 63   sCtx.z is alloc
2d260 61 74 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20  ated */.    if( 
2d270 72 63 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  rc && sqlite3_st
2d280 72 67 6c 6f 62 28 22 6e 6f 20 73 75 63 68 20 74  rglob("no such t
2d290 61 62 6c 65 3a 20 2a 22 2c 20 73 71 6c 69 74 65  able: *", sqlite
2d2a0 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29  3_errmsg(p->db))
2d2b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ==0 ){.      cha
2d2c0 72 20 2a 7a 43 72 65 61 74 65 20 3d 20 73 71 6c  r *zCreate = sql
2d2d0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 43 52  ite3_mprintf("CR
2d2e0 45 41 54 45 20 54 41 42 4c 45 20 25 73 22 2c 20  EATE TABLE %s", 
2d2f0 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 63  zTable);.      c
2d300 68 61 72 20 63 53 65 70 20 3d 20 27 28 27 3b 0a  har cSep = '(';.
2d310 20 20 20 20 20 20 77 68 69 6c 65 28 20 78 52 65        while( xRe
2d320 61 64 28 26 73 43 74 78 29 20 29 7b 0a 20 20 20  ad(&sCtx) ){.   
2d330 20 20 20 20 20 7a 43 72 65 61 74 65 20 3d 20 73       zCreate = s
2d340 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
2d350 25 7a 25 63 5c 6e 20 20 5c 22 25 77 5c 22 20 54  %z%c\n  \"%w\" T
2d360 45 58 54 22 2c 20 7a 43 72 65 61 74 65 2c 20 63  EXT", zCreate, c
2d370 53 65 70 2c 20 73 43 74 78 2e 7a 29 3b 0a 20 20  Sep, sCtx.z);.  
2d380 20 20 20 20 20 20 63 53 65 70 20 3d 20 27 2c 27        cSep = ','
2d390 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 43  ;.        if( sC
2d3a0 74 78 2e 63 54 65 72 6d 21 3d 73 43 74 78 2e 63  tx.cTerm!=sCtx.c
2d3b0 43 6f 6c 53 65 70 20 29 20 62 72 65 61 6b 3b 0a  ColSep ) break;.
2d3c0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
2d3d0 28 20 63 53 65 70 3d 3d 27 28 27 20 29 7b 0a 20  ( cSep=='(' ){. 
2d3e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2d3f0 72 65 65 28 7a 43 72 65 61 74 65 29 3b 0a 20 20  ree(zCreate);.  
2d400 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2d410 65 65 28 73 43 74 78 2e 7a 29 3b 0a 20 20 20 20  ee(sCtx.z);.    
2d420 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78      xCloser(sCtx
2d430 2e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 75 74  .in);.        ut
2d440 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2d450 2c 22 25 73 3a 20 65 6d 70 74 79 20 66 69 6c 65  ,"%s: empty file
2d460 5c 6e 22 2c 20 73 43 74 78 2e 7a 46 69 6c 65 29  \n", sCtx.zFile)
2d470 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
2d480 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
2d490 20 20 7a 43 72 65 61 74 65 20 3d 20 73 71 6c 69    zCreate = sqli
2d4a0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 5c  te3_mprintf("%z\
2d4b0 6e 29 22 2c 20 7a 43 72 65 61 74 65 29 3b 0a 20  n)", zCreate);. 
2d4c0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2d4d0 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 43  3_exec(p->db, zC
2d4e0 72 65 61 74 65 2c 20 30 2c 20 30 2c 20 30 29 3b  reate, 0, 0, 0);
2d4f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
2d500 72 65 65 28 7a 43 72 65 61 74 65 29 3b 0a 20 20  ree(zCreate);.  
2d510 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2d520 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2d530 66 28 73 74 64 65 72 72 2c 20 22 43 52 45 41 54  f(stderr, "CREAT
2d540 45 20 54 41 42 4c 45 20 25 73 28 2e 2e 2e 29 20  E TABLE %s(...) 
2d550 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22 2c 20 7a  failed: %s\n", z
2d560 54 61 62 6c 65 2c 0a 20 20 20 20 20 20 20 20 20  Table,.         
2d570 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
2d580 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
2d590 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2d5a0 72 65 65 28 73 43 74 78 2e 7a 29 3b 0a 20 20 20  ree(sCtx.z);.   
2d5b0 20 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74       xCloser(sCt
2d5c0 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 72  x.in);.        r
2d5d0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
2d5e0 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
2d5f0 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
2d600 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
2d610 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
2d620 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
2d630 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66  ee(zSql);.    if
2d640 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66  ( rc ){.      if
2d650 20 28 70 53 74 6d 74 29 20 73 71 6c 69 74 65 33   (pStmt) sqlite3
2d660 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
2d670 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  ;.      utf8_pri
2d680 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f  ntf(stderr,"Erro
2d690 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  r: %s\n", sqlite
2d6a0 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29  3_errmsg(p->db))
2d6b0 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28  ;.      xCloser(
2d6c0 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20  sCtx.in);.      
2d6d0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
2d6e0 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74      nCol = sqlit
2d6f0 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
2d700 70 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69  pStmt);.    sqli
2d710 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
2d720 6d 74 29 3b 0a 20 20 20 20 70 53 74 6d 74 20 3d  mt);.    pStmt =
2d730 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c   0;.    if( nCol
2d740 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
2d750 2f 2a 20 6e 6f 20 63 6f 6c 75 6d 6e 73 2c 20 6e  /* no columns, n
2d760 6f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 7a  o error */.    z
2d770 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Sql = sqlite3_ma
2d780 6c 6c 6f 63 36 34 28 20 6e 42 79 74 65 2a 32 20  lloc64( nByte*2 
2d790 2b 20 32 30 20 2b 20 6e 43 6f 6c 2a 32 20 29 3b  + 20 + nCol*2 );
2d7a0 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  .    if( zSql==0
2d7b0 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
2d7c0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
2d7d0 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f  ror: out of memo
2d7e0 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 78 43  ry\n");.      xC
2d7f0 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a  loser(sCtx.in);.
2d800 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2d810 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
2d820 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 79 74 65  3_snprintf(nByte
2d830 2b 32 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53 45  +20, zSql, "INSE
2d840 52 54 20 49 4e 54 4f 20 5c 22 25 77 5c 22 20 56  RT INTO \"%w\" V
2d850 41 4c 55 45 53 28 3f 22 2c 20 7a 54 61 62 6c 65  ALUES(?", zTable
2d860 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c 65  );.    j = strle
2d870 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20 66  n30(zSql);.    f
2d880 6f 72 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=1; i<nCol; 
2d890 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c  i++){.      zSql
2d8a0 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20  [j++] = ',';.   
2d8b0 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27     zSql[j++] = '
2d8c0 3f 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53  ?';.    }.    zS
2d8d0 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20  ql[j++] = ')';. 
2d8e0 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a     zSql[j] = 0;.
2d8f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2d900 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
2d910 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
2d920 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  tmt, 0);.    sql
2d930 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
2d940 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
2d950 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2d960 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
2d970 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f   %s\n", sqlite3_
2d980 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a  errmsg(p->db));.
2d990 20 20 20 20 20 20 69 66 20 28 70 53 74 6d 74 29        if (pStmt)
2d9a0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
2d9b0 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
2d9c0 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29  xCloser(sCtx.in)
2d9d0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
2d9e0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 65 65 64  ;.    }.    need
2d9f0 43 6f 6d 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  Commit = sqlite3
2da00 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28  _get_autocommit(
2da10 70 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66 28 20  p->db);.    if( 
2da20 6e 65 65 64 43 6f 6d 6d 69 74 20 29 20 73 71 6c  needCommit ) sql
2da30 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
2da40 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20   "BEGIN", 0, 0, 
2da50 30 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20  0);.    do{.    
2da60 20 20 69 6e 74 20 73 74 61 72 74 4c 69 6e 65 20    int startLine 
2da70 3d 20 73 43 74 78 2e 6e 4c 69 6e 65 3b 0a 20 20  = sCtx.nLine;.  
2da80 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
2da90 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
2daa0 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 78 52 65     char *z = xRe
2dab0 61 64 28 26 73 43 74 78 29 3b 0a 20 20 20 20 20  ad(&sCtx);.     
2dac0 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 20 2a 2a     /*.        **
2dad0 20 44 69 64 20 77 65 20 72 65 61 63 68 20 65 6e   Did we reach en
2dae0 64 2d 6f 66 2d 66 69 6c 65 20 62 65 66 6f 72 65  d-of-file before
2daf0 20 66 69 6e 64 69 6e 67 20 61 6e 79 20 63 6f 6c   finding any col
2db00 75 6d 6e 73 3f 0a 20 20 20 20 20 20 20 20 2a 2a  umns?.        **
2db10 20 49 66 20 73 6f 2c 20 73 74 6f 70 20 69 6e 73   If so, stop ins
2db20 74 65 61 64 20 6f 66 20 4e 55 4c 4c 20 66 69 6c  tead of NULL fil
2db30 6c 69 6e 67 20 74 68 65 20 72 65 6d 61 69 6e 69  ling the remaini
2db40 6e 67 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20  ng columns..    
2db50 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
2db60 66 28 20 7a 3d 3d 30 20 26 26 20 69 3d 3d 30 20  f( z==0 && i==0 
2db70 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
2db80 20 2f 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 44   /*.        ** D
2db90 69 64 20 77 65 20 72 65 61 63 68 20 65 6e 64 2d  id we reach end-
2dba0 6f 66 2d 66 69 6c 65 20 4f 52 20 65 6e 64 2d 6f  of-file OR end-o
2dbb0 66 2d 6c 69 6e 65 20 62 65 66 6f 72 65 20 66 69  f-line before fi
2dbc0 6e 64 69 6e 67 20 61 6e 79 0a 20 20 20 20 20 20  nding any.      
2dbd0 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20    ** columns in 
2dbe0 41 53 43 49 49 20 6d 6f 64 65 3f 20 20 49 66 20  ASCII mode?  If 
2dbf0 73 6f 2c 20 73 74 6f 70 20 69 6e 73 74 65 61 64  so, stop instead
2dc00 20 6f 66 20 4e 55 4c 4c 20 66 69 6c 6c 69 6e 67   of NULL filling
2dc10 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
2dc20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e  remaining column
2dc30 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
2dc40 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 6f 64        if( p->mod
2dc50 65 3d 3d 4d 4f 44 45 5f 41 73 63 69 69 20 26 26  e==MODE_Ascii &&
2dc60 20 28 7a 3d 3d 30 20 7c 7c 20 7a 5b 30 5d 3d 3d   (z==0 || z[0]==
2dc70 30 29 20 26 26 20 69 3d 3d 30 20 29 20 62 72 65  0) && i==0 ) bre
2dc80 61 6b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ak;.        sqli
2dc90 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
2dca0 74 6d 74 2c 20 69 2b 31 2c 20 7a 2c 20 2d 31 2c  tmt, i+1, z, -1,
2dcb0 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
2dcc0 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  T);.        if( 
2dcd0 69 3c 6e 43 6f 6c 2d 31 20 26 26 20 73 43 74 78  i<nCol-1 && sCtx
2dce0 2e 63 54 65 72 6d 21 3d 73 43 74 78 2e 63 43 6f  .cTerm!=sCtx.cCo
2dcf0 6c 53 65 70 20 29 7b 0a 20 20 20 20 20 20 20 20  lSep ){.        
2dd00 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2dd10 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 65 78  derr, "%s:%d: ex
2dd20 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e  pected %d column
2dd30 73 20 62 75 74 20 66 6f 75 6e 64 20 25 64 20 2d  s but found %d -
2dd40 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
2dd50 20 20 20 20 20 20 20 20 20 20 20 20 20 22 66 69               "fi
2dd60 6c 6c 69 6e 67 20 74 68 65 20 72 65 73 74 20 77  lling the rest w
2dd70 69 74 68 20 4e 55 4c 4c 5c 6e 22 2c 0a 20 20 20  ith NULL\n",.   
2dd80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd90 20 20 20 20 20 20 20 73 43 74 78 2e 7a 46 69 6c         sCtx.zFil
2dda0 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c 20 6e 43  e, startLine, nC
2ddb0 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20  ol, i+1);.      
2ddc0 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20      i += 2;.    
2ddd0 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3c 3d        while( i<=
2dde0 6e 43 6f 6c 20 29 7b 20 73 71 6c 69 74 65 33 5f  nCol ){ sqlite3_
2ddf0 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c  bind_null(pStmt,
2de00 20 69 29 3b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20   i); i++; }.    
2de10 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2de20 20 20 20 20 69 66 28 20 73 43 74 78 2e 63 54 65      if( sCtx.cTe
2de30 72 6d 3d 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70  rm==sCtx.cColSep
2de40 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a   ){.        do{.
2de50 20 20 20 20 20 20 20 20 20 20 78 52 65 61 64 28            xRead(
2de60 26 73 43 74 78 29 3b 0a 20 20 20 20 20 20 20 20  &sCtx);.        
2de70 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d    i++;.        }
2de80 77 68 69 6c 65 28 20 73 43 74 78 2e 63 54 65 72  while( sCtx.cTer
2de90 6d 3d 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70 20  m==sCtx.cColSep 
2dea0 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  );.        utf8_
2deb0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2dec0 25 73 3a 25 64 3a 20 65 78 70 65 63 74 65 64 20  %s:%d: expected 
2ded0 25 64 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 66  %d columns but f
2dee0 6f 75 6e 64 20 25 64 20 2d 20 22 0a 20 20 20 20  ound %d - ".    
2def0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df00 20 20 20 20 22 65 78 74 72 61 73 20 69 67 6e 6f      "extras igno
2df10 72 65 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  red\n",.        
2df20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2df30 73 43 74 78 2e 7a 46 69 6c 65 2c 20 73 74 61 72  sCtx.zFile, star
2df40 74 4c 69 6e 65 2c 20 6e 43 6f 6c 2c 20 69 29 3b  tLine, nCol, i);
2df50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2df60 66 28 20 69 3e 3d 6e 43 6f 6c 20 29 7b 0a 20 20  f( i>=nCol ){.  
2df70 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
2df80 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ep(pStmt);.     
2df90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
2dfa0 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
2dfb0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
2dfc0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2dfd0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2dfe0 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a  (stderr, "%s:%d:
2dff0 20 49 4e 53 45 52 54 20 66 61 69 6c 65 64 3a 20   INSERT failed: 
2e000 25 73 5c 6e 22 2c 20 73 43 74 78 2e 7a 46 69 6c  %s\n", sCtx.zFil
2e010 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
2e020 20 20 20 20 20 20 20 20 20 73 74 61 72 74 4c 69           startLi
2e030 6e 65 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  ne, sqlite3_errm
2e040 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  sg(p->db));.    
2e050 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2e060 20 20 7d 77 68 69 6c 65 28 20 73 43 74 78 2e 63    }while( sCtx.c
2e070 54 65 72 6d 21 3d 45 4f 46 20 29 3b 0a 0a 20 20  Term!=EOF );..  
2e080 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69    xCloser(sCtx.i
2e090 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  n);.    sqlite3_
2e0a0 66 72 65 65 28 73 43 74 78 2e 7a 29 3b 0a 20 20  free(sCtx.z);.  
2e0b0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
2e0c0 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69  ze(pStmt);.    i
2e0d0 66 28 20 6e 65 65 64 43 6f 6d 6d 69 74 20 29 20  f( needCommit ) 
2e0e0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
2e0f0 64 62 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c  db, "COMMIT", 0,
2e100 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 0a   0, 0);.  }else.
2e110 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2e120 55 4e 54 45 53 54 41 42 4c 45 0a 20 20 69 66 28  UNTESTABLE.  if(
2e130 20 63 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63   c=='i' && strnc
2e140 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6d  mp(azArg[0], "im
2e150 70 6f 73 74 65 72 22 2c 20 6e 29 3d 3d 30 20 29  poster", n)==0 )
2e160 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c  {.    char *zSql
2e170 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c  ;.    char *zCol
2e180 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 73 71  list = 0;.    sq
2e190 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
2e1a0 74 3b 0a 20 20 20 20 69 6e 74 20 74 6e 75 6d 20  t;.    int tnum 
2e1b0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  = 0;.    int i;.
2e1c0 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 33 20      if( nArg!=3 
2e1d0 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
2e1e0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
2e1f0 61 67 65 3a 20 2e 69 6d 70 6f 73 74 65 72 20 49  age: .imposter I
2e200 4e 44 45 58 20 49 4d 50 4f 53 54 45 52 5c 6e 22  NDEX IMPOSTER\n"
2e210 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
2e220 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61  .      goto meta
2e230 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
2e240 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62     }.    open_db
2e250 28 70 2c 20 30 29 3b 0a 20 20 20 20 7a 53 71 6c  (p, 0);.    zSql
2e260 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2e270 74 66 28 22 53 45 4c 45 43 54 20 72 6f 6f 74 70  tf("SELECT rootp
2e280 61 67 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  age FROM sqlite_
2e290 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20 20 20  master".        
2e2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e2b0 20 20 20 22 20 57 48 45 52 45 20 6e 61 6d 65 3d     " WHERE name=
2e2c0 27 25 71 27 20 41 4e 44 20 74 79 70 65 3d 27 69  '%q' AND type='i
2e2d0 6e 64 65 78 27 22 2c 20 61 7a 41 72 67 5b 31 5d  ndex'", azArg[1]
2e2e0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 70  );.    sqlite3_p
2e2f0 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
2e300 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
2e310 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
2e320 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
2e330 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
2e340 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
2e350 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
2e360 74 6e 75 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63  tnum = sqlite3_c
2e370 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
2e380 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   0);.    }.    s
2e390 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
2e3a0 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20  pStmt);.    if( 
2e3b0 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tnum==0 ){.     
2e3c0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2e3d0 65 72 72 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e  err, "no such in
2e3e0 64 65 78 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  dex: \"%s\"\n", 
2e3f0 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20  azArg[1]);.     
2e400 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67   rc = 1;.      g
2e410 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
2e420 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
2e430 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
2e440 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20  mprintf("PRAGMA 
2e450 69 6e 64 65 78 5f 78 69 6e 66 6f 3d 27 25 71 27  index_xinfo='%q'
2e460 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ", azArg[1]);.  
2e470 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
2e480 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
2e490 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
2e4a0 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
2e4b0 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
2e4c0 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20 77 68     i = 0;.    wh
2e4d0 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65  ile( sqlite3_ste
2e4e0 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
2e4f0 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 63 68  _ROW ){.      ch
2e500 61 72 20 7a 4c 61 62 65 6c 5b 32 30 5d 3b 0a 20  ar zLabel[20];. 
2e510 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2e520 2a 7a 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63  *zCol = (const c
2e530 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
2e540 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 32  umn_text(pStmt,2
2e550 29 3b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  );.      i++;.  
2e560 20 20 20 20 69 66 28 20 7a 43 6f 6c 3d 3d 30 20      if( zCol==0 
2e570 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
2e580 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
2e590 74 28 70 53 74 6d 74 2c 31 29 3d 3d 2d 31 20 29  t(pStmt,1)==-1 )
2e5a0 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c  {.          zCol
2e5b0 20 3d 20 22 5f 52 4f 57 49 44 5f 22 3b 0a 20 20   = "_ROWID_";.  
2e5c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2e5d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
2e5e0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
2e5f0 4c 61 62 65 6c 29 2c 7a 4c 61 62 65 6c 2c 22 65  Label),zLabel,"e
2e600 78 70 72 25 64 22 2c 69 29 3b 0a 20 20 20 20 20  xpr%d",i);.     
2e610 20 20 20 20 20 7a 43 6f 6c 20 3d 20 7a 4c 61 62       zCol = zLab
2e620 65 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  el;.        }.  
2e630 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2e640 7a 43 6f 6c 6c 69 73 74 3d 3d 30 20 29 7b 0a 20  zCollist==0 ){. 
2e650 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 20         zCollist 
2e660 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2e670 66 28 22 5c 22 25 77 5c 22 22 2c 20 7a 43 6f 6c  f("\"%w\"", zCol
2e680 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2e690 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74          zCollist
2e6a0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2e6b0 74 66 28 22 25 7a 2c 5c 22 25 77 5c 22 22 2c 20  tf("%z,\"%w\"", 
2e6c0 7a 43 6f 6c 6c 69 73 74 2c 20 7a 43 6f 6c 29 3b  zCollist, zCol);
2e6d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2e6e0 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
2e6f0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
2e700 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
2e710 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
2e720 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
2e730 5c 22 25 77 5c 22 28 25 73 2c 50 52 49 4d 41 52  \"%w\"(%s,PRIMAR
2e740 59 20 4b 45 59 28 25 73 29 29 57 49 54 48 4f 55  Y KEY(%s))WITHOU
2e750 54 20 52 4f 57 49 44 22 2c 0a 20 20 20 20 20 20  T ROWID",.      
2e760 20 20 20 20 61 7a 41 72 67 5b 32 5d 2c 20 7a 43      azArg[2], zC
2e770 6f 6c 6c 69 73 74 2c 20 7a 43 6f 6c 6c 69 73 74  ollist, zCollist
2e780 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
2e790 72 65 65 28 7a 43 6f 6c 6c 69 73 74 29 3b 0a 20  ree(zCollist);. 
2e7a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
2e7b0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
2e7c0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50  ITE_TESTCTRL_IMP
2e7d0 4f 53 54 45 52 2c 20 70 2d 3e 64 62 2c 20 22 6d  OSTER, p->db, "m
2e7e0 61 69 6e 22 2c 20 31 2c 20 74 6e 75 6d 29 3b 0a  ain", 1, tnum);.
2e7f0 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
2e800 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
2e810 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
2e820 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c  (p->db, zSql, 0,
2e830 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
2e840 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
2e850 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
2e860 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e  RL_IMPOSTER, p->
2e870 64 62 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20 30  db, "main", 0, 0
2e880 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
2e890 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
2e8a0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2e8b0 45 72 72 6f 72 20 69 6e 20 5b 25 73 5d 3a 20 25  Error in [%s]: %
2e8c0 73 5c 6e 22 2c 20 7a 53 71 6c 2c 20 73 71 6c 69  s\n", zSql, sqli
2e8d0 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
2e8e0 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
2e8f0 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
2e900 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 25 73  intf(stdout, "%s
2e910 3b 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20  ;\n", zSql);.   
2e920 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2e930 73 74 64 6f 75 74 2c 0a 20 20 20 20 20 20 20 20  stdout,.        
2e940 20 20 20 22 57 41 52 4e 49 4e 47 3a 20 77 72 69     "WARNING: wri
2e950 74 69 6e 67 20 74 6f 20 61 6e 20 69 6d 70 6f 73  ting to an impos
2e960 74 65 72 20 74 61 62 6c 65 20 77 69 6c 6c 20 63  ter table will c
2e970 6f 72 72 75 70 74 20 74 68 65 20 69 6e 64 65 78  orrupt the index
2e980 21 5c 6e 22 0a 20 20 20 20 20 20 20 20 29 3b 0a  !\n".        );.
2e990 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2e9a0 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
2e9b0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 51 4c  ntf(stderr, "SQL
2e9c0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50  ITE_TESTCTRL_IMP
2e9d0 4f 53 54 45 52 20 72 65 74 75 72 6e 73 20 25 64  OSTER returns %d
2e9e0 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  \n", rc);.      
2e9f0 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
2ea00 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2ea10 53 71 6c 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  Sql);.  }else.#e
2ea20 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
2ea30 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 53  (SQLITE_OMIT_TES
2ea40 54 5f 43 4f 4e 54 52 4f 4c 29 20 2a 2f 0a 0a 23  T_CONTROL) */..#
2ea50 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
2ea60 42 4c 45 5f 49 4f 54 52 41 43 45 0a 20 20 69 66  BLE_IOTRACE.  if
2ea70 28 20 63 3d 3d 27 69 27 20 26 26 20 73 74 72 6e  ( c=='i' && strn
2ea80 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69  cmp(azArg[0], "i
2ea90 6f 74 72 61 63 65 22 2c 20 6e 29 3d 3d 30 20 29  otrace", n)==0 )
2eaa0 7b 0a 20 20 20 20 53 51 4c 49 54 45 5f 41 50 49  {.    SQLITE_API
2eab0 20 65 78 74 65 72 6e 20 76 6f 69 64 20 28 53 51   extern void (SQ
2eac0 4c 49 54 45 5f 43 44 45 43 4c 20 2a 73 71 6c 69  LITE_CDECL *sqli
2ead0 74 65 33 49 6f 54 72 61 63 65 29 28 63 6f 6e 73  te3IoTrace)(cons
2eae0 74 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 3b 0a 20  t char*, ...);. 
2eaf0 20 20 20 69 66 28 20 69 6f 74 72 61 63 65 20 26     if( iotrace &
2eb00 26 20 69 6f 74 72 61 63 65 21 3d 73 74 64 6f 75  & iotrace!=stdou
2eb10 74 20 29 20 66 63 6c 6f 73 65 28 69 6f 74 72 61  t ) fclose(iotra
2eb20 63 65 29 3b 0a 20 20 20 20 69 6f 74 72 61 63 65  ce);.    iotrace
2eb30 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 41   = 0;.    if( nA
2eb40 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 73 71  rg<2 ){.      sq
2eb50 6c 69 74 65 33 49 6f 54 72 61 63 65 20 3d 20 30  lite3IoTrace = 0
2eb60 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2eb70 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  strcmp(azArg[1],
2eb80 20 22 2d 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20   "-")==0 ){.    
2eb90 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65    sqlite3IoTrace
2eba0 20 3d 20 69 6f 74 72 61 63 65 50 72 69 6e 74 66   = iotracePrintf
2ebb0 3b 0a 20 20 20 20 20 20 69 6f 74 72 61 63 65 20  ;.      iotrace 
2ebc0 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20 20 7d 65  = stdout;.    }e
2ebd0 6c 73 65 7b 0a 20 20 20 20 20 20 69 6f 74 72 61  lse{.      iotra
2ebe0 63 65 20 3d 20 66 6f 70 65 6e 28 61 7a 41 72 67  ce = fopen(azArg
2ebf0 5b 31 5d 2c 20 22 77 22 29 3b 0a 20 20 20 20 20  [1], "w");.     
2ec00 20 69 66 28 20 69 6f 74 72 61 63 65 3d 3d 30 20   if( iotrace==0 
2ec10 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
2ec20 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2ec30 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70  Error: cannot op
2ec40 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a  en \"%s\"\n", az
2ec50 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[1]);.       
2ec60 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 20   sqlite3IoTrace 
2ec70 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
2ec80 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
2ec90 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2eca0 33 49 6f 54 72 61 63 65 20 3d 20 69 6f 74 72 61  3IoTrace = iotra
2ecb0 63 65 50 72 69 6e 74 66 3b 0a 20 20 20 20 20 20  cePrintf;.      
2ecc0 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  }.    }.  }else.
2ecd0 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 3d  #endif..  if( c=
2ece0 3d 27 6c 27 20 26 26 20 6e 3e 3d 35 20 26 26 20  ='l' && n>=5 && 
2ecf0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2ed00 2c 20 22 6c 69 6d 69 74 73 22 2c 20 6e 29 3d 3d  , "limits", n)==
2ed10 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  0 ){.    static 
2ed20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
2ed30 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2ed40 20 2a 7a 4c 69 6d 69 74 4e 61 6d 65 3b 20 20 20   *zLimitName;   
2ed50 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 6c 69 6d  /* Name of a lim
2ed60 69 74 20 2a 2f 0a 20 20 20 20 20 20 20 69 6e 74  it */.       int
2ed70 20 6c 69 6d 69 74 43 6f 64 65 3b 20 20 20 20 20   limitCode;     
2ed80 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65         /* Intege
2ed90 72 20 63 6f 64 65 20 66 6f 72 20 74 68 61 74 20  r code for that 
2eda0 6c 69 6d 69 74 20 2a 2f 0a 20 20 20 20 7d 20 61  limit */.    } a
2edb0 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20 20 20  Limit[] = {.    
2edc0 20 20 7b 20 22 6c 65 6e 67 74 68 22 2c 20 20 20    { "length",   
2edd0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
2ede0 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48  ITE_LIMIT_LENGTH
2edf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ee00 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
2ee10 73 71 6c 5f 6c 65 6e 67 74 68 22 2c 20 20 20 20  sql_length",    
2ee20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
2ee30 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 20  IMIT_SQL_LENGTH 
2ee40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2ee50 2c 0a 20 20 20 20 20 20 7b 20 22 63 6f 6c 75 6d  ,.      { "colum
2ee60 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  n",             
2ee70 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
2ee80 43 4f 4c 55 4d 4e 20 20 20 20 20 20 20 20 20 20  COLUMN          
2ee90 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2eea0 20 20 20 7b 20 22 65 78 70 72 5f 64 65 70 74 68     { "expr_depth
2eeb0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 53 51  ",            SQ
2eec0 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f  LITE_LIMIT_EXPR_
2eed0 44 45 50 54 48 20 20 20 20 20 20 20 20 20 20 20  DEPTH           
2eee0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
2eef0 22 63 6f 6d 70 6f 75 6e 64 5f 73 65 6c 65 63 74  "compound_select
2ef00 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ",       SQLITE_
2ef10 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  LIMIT_COMPOUND_S
2ef20 45 4c 45 43 54 20 20 20 20 20 20 20 20 20 20 20  ELECT           
2ef30 7d 2c 0a 20 20 20 20 20 20 7b 20 22 76 64 62 65  },.      { "vdbe
2ef40 5f 6f 70 22 2c 20 20 20 20 20 20 20 20 20 20 20  _op",           
2ef50 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
2ef60 5f 56 44 42 45 5f 4f 50 20 20 20 20 20 20 20 20  _VDBE_OP        
2ef70 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2ef80 20 20 20 20 7b 20 22 66 75 6e 63 74 69 6f 6e 5f      { "function_
2ef90 61 72 67 22 2c 20 20 20 20 20 20 20 20 20 20 53  arg",          S
2efa0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43  QLITE_LIMIT_FUNC
2efb0 54 49 4f 4e 5f 41 52 47 20 20 20 20 20 20 20 20  TION_ARG        
2efc0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
2efd0 20 22 61 74 74 61 63 68 65 64 22 2c 20 20 20 20   "attached",    
2efe0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
2eff0 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44 20  _LIMIT_ATTACHED 
2f000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f010 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 6c 69 6b   },.      { "lik
2f020 65 5f 70 61 74 74 65 72 6e 5f 6c 65 6e 67 74 68  e_pattern_length
2f030 22 2c 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49  ",   SQLITE_LIMI
2f040 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  T_LIKE_PATTERN_L
2f050 45 4e 47 54 48 20 20 20 20 20 20 20 7d 2c 0a 20  ENGTH       },. 
2f060 20 20 20 20 20 7b 20 22 76 61 72 69 61 62 6c 65       { "variable
2f070 5f 6e 75 6d 62 65 72 22 2c 20 20 20 20 20 20 20  _number",       
2f080 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
2f090 49 41 42 4c 45 5f 4e 55 4d 42 45 52 20 20 20 20  IABLE_NUMBER    
2f0a0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
2f0b0 7b 20 22 74 72 69 67 67 65 72 5f 64 65 70 74 68  { "trigger_depth
2f0c0 22 2c 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  ",         SQLIT
2f0d0 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f  E_LIMIT_TRIGGER_
2f0e0 44 45 50 54 48 20 20 20 20 20 20 20 20 20 20 20  DEPTH           
2f0f0 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 77 6f    },.      { "wo
2f100 72 6b 65 72 5f 74 68 72 65 61 64 73 22 2c 20 20  rker_threads",  
2f110 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
2f120 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  IT_WORKER_THREAD
2f130 53 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  S            },.
2f140 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69      };.    int i
2f150 2c 20 6e 32 3b 0a 20 20 20 20 6f 70 65 6e 5f 64  , n2;.    open_d
2f160 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  b(p, 0);.    if(
2f170 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20 20   nArg==1 ){.    
2f180 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
2f190 61 79 53 69 7a 65 28 61 4c 69 6d 69 74 29 3b 20  aySize(aLimit); 
2f1a0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 72  i++){.        pr
2f1b0 69 6e 74 66 28 22 25 32 30 73 20 25 64 5c 6e 22  intf("%20s %d\n"
2f1c0 2c 20 61 4c 69 6d 69 74 5b 69 5d 2e 7a 4c 69 6d  , aLimit[i].zLim
2f1d0 69 74 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  itName,.        
2f1e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
2f1f0 69 6d 69 74 28 70 2d 3e 64 62 2c 20 61 4c 69 6d  imit(p->db, aLim
2f200 69 74 5b 69 5d 2e 6c 69 6d 69 74 43 6f 64 65 2c  it[i].limitCode,
2f210 20 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20   -1));.      }. 
2f220 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 41 72     }else if( nAr
2f230 67 3e 33 20 29 7b 0a 20 20 20 20 20 20 72 61 77  g>3 ){.      raw
2f240 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2f250 22 55 73 61 67 65 3a 20 2e 6c 69 6d 69 74 20 4e  "Usage: .limit N
2f260 41 4d 45 20 3f 4e 45 57 2d 56 41 4c 55 45 3f 5c  AME ?NEW-VALUE?\
2f270 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
2f280 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  1;.      goto me
2f290 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
2f2a0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2f2b0 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 2d    int iLimit = -
2f2c0 31 3b 0a 20 20 20 20 20 20 6e 32 20 3d 20 73 74  1;.      n2 = st
2f2d0 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 31 5d 29  rlen30(azArg[1])
2f2e0 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
2f2f0 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 4c 69   i<ArraySize(aLi
2f300 6d 69 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mit); i++){.    
2f310 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
2f320 73 74 72 6e 69 63 6d 70 28 61 4c 69 6d 69 74 5b  strnicmp(aLimit[
2f330 69 5d 2e 7a 4c 69 6d 69 74 4e 61 6d 65 2c 20 61  i].zLimitName, a
2f340 7a 41 72 67 5b 31 5d 2c 20 6e 32 29 3d 3d 30 20  zArg[1], n2)==0 
2f350 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
2f360 20 69 4c 69 6d 69 74 3c 30 20 29 7b 0a 20 20 20   iLimit<0 ){.   
2f370 20 20 20 20 20 20 20 20 20 69 4c 69 6d 69 74 20           iLimit 
2f380 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = i;.          }
2f390 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
2f3a0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2f3b0 64 65 72 72 2c 20 22 61 6d 62 69 67 75 6f 75 73  derr, "ambiguous
2f3c0 20 6c 69 6d 69 74 3a 20 5c 22 25 73 5c 22 5c 6e   limit: \"%s\"\n
2f3d0 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ", azArg[1]);.  
2f3e0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
2f3f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
2f400 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
2f410 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20  exit;.          
2f420 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2f430 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 4c    }.      if( iL
2f440 69 6d 69 74 3c 30 20 29 7b 0a 20 20 20 20 20 20  imit<0 ){.      
2f450 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2f460 64 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6c  derr, "unknown l
2f470 69 6d 69 74 3a 20 5c 22 25 73 5c 22 5c 6e 22 0a  imit: \"%s\"\n".
2f480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f490 20 20 20 20 20 20 20 20 22 65 6e 74 65 72 20 5c          "enter \
2f4a0 22 2e 6c 69 6d 69 74 73 5c 22 20 77 69 74 68 20  ".limits\" with 
2f4b0 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72  no arguments for
2f4c0 20 61 20 6c 69 73 74 2e 5c 6e 22 2c 0a 20 20 20   a list.\n",.   
2f4d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f4e0 20 20 20 20 20 20 61 7a 41 72 67 5b 31 5d 29 3b        azArg[1]);
2f4f0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
2f500 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  .        goto me
2f510 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
2f520 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2f530 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20 20  f( nArg==3 ){.  
2f540 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 69        sqlite3_li
2f550 6d 69 74 28 70 2d 3e 64 62 2c 20 61 4c 69 6d 69  mit(p->db, aLimi
2f560 74 5b 69 4c 69 6d 69 74 5d 2e 6c 69 6d 69 74 43  t[iLimit].limitC
2f570 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ode,.           
2f580 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
2f590 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41  integerValue(azA
2f5a0 72 67 5b 32 5d 29 29 3b 0a 20 20 20 20 20 20 7d  rg[2]));.      }
2f5b0 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25  .      printf("%
2f5c0 32 30 73 20 25 64 5c 6e 22 2c 20 61 4c 69 6d 69  20s %d\n", aLimi
2f5d0 74 5b 69 4c 69 6d 69 74 5d 2e 7a 4c 69 6d 69 74  t[iLimit].zLimit
2f5e0 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
2f5f0 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74     sqlite3_limit
2f600 28 70 2d 3e 64 62 2c 20 61 4c 69 6d 69 74 5b 69  (p->db, aLimit[i
2f610 4c 69 6d 69 74 5d 2e 6c 69 6d 69 74 43 6f 64 65  Limit].limitCode
2f620 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20 20  , -1));.    }.  
2f630 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
2f640 27 6c 27 20 26 26 20 6e 3e 32 20 26 26 20 73 74  'l' && n>2 && st
2f650 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2f660 22 6c 69 6e 74 22 2c 20 6e 29 3d 3d 30 20 29 7b  "lint", n)==0 ){
2f670 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
2f680 30 29 3b 0a 20 20 20 20 6c 69 6e 74 44 6f 74 43  0);.    lintDotC
2f690 6f 6d 6d 61 6e 64 28 70 2c 20 61 7a 41 72 67 2c  ommand(p, azArg,
2f6a0 20 6e 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a   nArg);.  }else.
2f6b0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
2f6c0 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
2f6d0 49 4f 4e 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27  ION.  if( c=='l'
2f6e0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2f6f0 67 5b 30 5d 2c 20 22 6c 6f 61 64 22 2c 20 6e 29  g[0], "load", n)
2f700 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ==0 ){.    const
2f710 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 2a 7a   char *zFile, *z
2f720 50 72 6f 63 3b 0a 20 20 20 20 63 68 61 72 20 2a  Proc;.    char *
2f730 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
2f740 20 69 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20   if( nArg<2 ){. 
2f750 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2f760 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
2f770 2e 6c 6f 61 64 20 46 49 4c 45 20 3f 45 4e 54 52  .load FILE ?ENTR
2f780 59 50 4f 49 4e 54 3f 5c 6e 22 29 3b 0a 20 20 20  YPOINT?\n");.   
2f790 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
2f7a0 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
2f7b0 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20  nd_exit;.    }. 
2f7c0 20 20 20 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67     zFile = azArg
2f7d0 5b 31 5d 3b 0a 20 20 20 20 7a 50 72 6f 63 20 3d  [1];.    zProc =
2f7e0 20 6e 41 72 67 3e 3d 33 20 3f 20 61 7a 41 72 67   nArg>=3 ? azArg
2f7f0 5b 32 5d 20 3a 20 30 3b 0a 20 20 20 20 6f 70 65  [2] : 0;.    ope
2f800 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20  n_db(p, 0);.    
2f810 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6c 6f 61  rc = sqlite3_loa
2f820 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70 2d 3e 64  d_extension(p->d
2f830 62 2c 20 7a 46 69 6c 65 2c 20 7a 50 72 6f 63 2c  b, zFile, zProc,
2f840 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20   &zErrMsg);.    
2f850 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2f860 4b 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  K ){.      utf8_
2f870 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2f880 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45  Error: %s\n", zE
2f890 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71  rrMsg);.      sq
2f8a0 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
2f8b0 73 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  sg);.      rc = 
2f8c0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
2f8d0 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63  .#endif..  if( c
2f8e0 3d 3d 27 6c 27 20 26 26 20 73 74 72 6e 63 6d 70  =='l' && strncmp
2f8f0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 6f 67 22  (azArg[0], "log"
2f900 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
2f910 66 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20  f( nArg!=2 ){.  
2f920 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2f930 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
2f940 6c 6f 67 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 29  log FILENAME\n")
2f950 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
2f960 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2f970 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
2f980 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20  le = azArg[1];. 
2f990 20 20 20 20 20 6f 75 74 70 75 74 5f 66 69 6c 65       output_file
2f9a0 5f 63 6c 6f 73 65 28 70 2d 3e 70 4c 6f 67 29 3b  _close(p->pLog);
2f9b0 0a 20 20 20 20 20 20 70 2d 3e 70 4c 6f 67 20 3d  .      p->pLog =
2f9c0 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65   output_file_ope
2f9d0 6e 28 7a 46 69 6c 65 2c 20 30 29 3b 0a 20 20 20  n(zFile, 0);.   
2f9e0 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
2f9f0 28 20 63 3d 3d 27 6d 27 20 26 26 20 73 74 72 6e  ( c=='m' && strn
2fa00 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6d  cmp(azArg[0], "m
2fa10 6f 64 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ode", n)==0 ){. 
2fa20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2fa30 4d 6f 64 65 20 3d 20 6e 41 72 67 3e 3d 32 20 3f  Mode = nArg>=2 ?
2fa40 20 61 7a 41 72 67 5b 31 5d 20 3a 20 22 22 3b 0a   azArg[1] : "";.
2fa50 20 20 20 20 69 6e 74 20 6e 32 20 3d 20 73 74 72      int n2 = str
2fa60 6c 65 6e 33 30 28 7a 4d 6f 64 65 29 3b 0a 20 20  len30(zMode);.  
2fa70 20 20 69 6e 74 20 63 32 20 3d 20 7a 4d 6f 64 65    int c2 = zMode
2fa80 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 63 32 3d  [0];.    if( c2=
2fa90 3d 27 6c 27 20 26 26 20 6e 32 3e 32 20 26 26 20  ='l' && n2>2 && 
2faa0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d  strncmp(azArg[1]
2fab0 2c 22 6c 69 6e 65 73 22 2c 6e 32 29 3d 3d 30 20  ,"lines",n2)==0 
2fac0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  ){.      p->mode
2fad0 20 3d 20 4d 4f 44 45 5f 4c 69 6e 65 3b 0a 20 20   = MODE_Line;.  
2fae0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2faf0 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72  intf(sizeof(p->r
2fb00 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d  owSeparator), p-
2fb10 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53  >rowSeparator, S
2fb20 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c  EP_Row);.    }el
2fb30 73 65 20 69 66 28 20 63 32 3d 3d 27 63 27 20 26  se if( c2=='c' &
2fb40 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2fb50 31 5d 2c 22 63 6f 6c 75 6d 6e 73 22 2c 6e 32 29  1],"columns",n2)
2fb60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
2fb70 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43 6f 6c 75  mode = MODE_Colu
2fb80 6d 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  mn;.      sqlite
2fb90 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
2fba0 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  f(p->rowSeparato
2fbb0 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  r), p->rowSepara
2fbc0 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20  tor, SEP_Row);. 
2fbd0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d     }else if( c2=
2fbe0 3d 27 6c 27 20 26 26 20 6e 32 3e 32 20 26 26 20  ='l' && n2>2 && 
2fbf0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d  strncmp(azArg[1]
2fc00 2c 22 6c 69 73 74 22 2c 6e 32 29 3d 3d 30 20 29  ,"list",n2)==0 )
2fc10 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20  {.      p->mode 
2fc20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20  = MODE_List;.   
2fc30 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2fc40 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f  ntf(sizeof(p->co
2fc50 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e  lSeparator), p->
2fc60 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 53 45  colSeparator, SE
2fc70 50 5f 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  P_Column);.     
2fc80 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2fc90 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53  f(sizeof(p->rowS
2fca0 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f  eparator), p->ro
2fcb0 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f  wSeparator, SEP_
2fcc0 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Row);.    }else 
2fcd0 69 66 28 20 63 32 3d 3d 27 68 27 20 26 26 20 73  if( c2=='h' && s
2fce0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  trncmp(azArg[1],
2fcf0 22 68 74 6d 6c 22 2c 6e 32 29 3d 3d 30 20 29 7b  "html",n2)==0 ){
2fd00 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d  .      p->mode =
2fd10 20 4d 4f 44 45 5f 48 74 6d 6c 3b 0a 20 20 20 20   MODE_Html;.    
2fd20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 74  }else if( c2=='t
2fd30 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
2fd40 72 67 5b 31 5d 2c 22 74 63 6c 22 2c 6e 32 29 3d  rg[1],"tcl",n2)=
2fd50 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d  =0 ){.      p->m
2fd60 6f 64 65 20 3d 20 4d 4f 44 45 5f 54 63 6c 3b 0a  ode = MODE_Tcl;.
2fd70 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
2fd80 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
2fd90 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20  >colSeparator), 
2fda0 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c  p->colSeparator,
2fdb0 20 53 45 50 5f 53 70 61 63 65 29 3b 0a 20 20 20   SEP_Space);.   
2fdc0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2fdd0 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f  ntf(sizeof(p->ro
2fde0 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e  wSeparator), p->
2fdf0 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45  rowSeparator, SE
2fe00 50 5f 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73  P_Row);.    }els
2fe10 65 20 69 66 28 20 63 32 3d 3d 27 63 27 20 26 26  e if( c2=='c' &&
2fe20 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31   strncmp(azArg[1
2fe30 5d 2c 22 63 73 76 22 2c 6e 32 29 3d 3d 30 20 29  ],"csv",n2)==0 )
2fe40 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20  {.      p->mode 
2fe50 3d 20 4d 4f 44 45 5f 43 73 76 3b 0a 20 20 20 20  = MODE_Csv;.    
2fe60 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2fe70 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c  tf(sizeof(p->col
2fe80 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63  Separator), p->c
2fe90 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50  olSeparator, SEP
2fea0 5f 43 6f 6d 6d 61 29 3b 0a 20 20 20 20 20 20 73  _Comma);.      s
2feb0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2fec0 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70  sizeof(p->rowSep
2fed0 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53  arator), p->rowS
2fee0 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 43 72  eparator, SEP_Cr
2fef0 4c 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  Lf);.    }else i
2ff00 66 28 20 63 32 3d 3d 27 74 27 20 26 26 20 73 74  f( c2=='t' && st
2ff10 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  rncmp(azArg[1],"
2ff20 74 61 62 73 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a  tabs",n2)==0 ){.
2ff30 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20        p->mode = 
2ff40 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 20  MODE_List;.     
2ff50 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2ff60 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53  f(sizeof(p->colS
2ff70 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f  eparator), p->co
2ff80 6c 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f  lSeparator, SEP_
2ff90 54 61 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Tab);.    }else 
2ffa0 69 66 28 20 63 32 3d 3d 27 69 27 20 26 26 20 73  if( c2=='i' && s
2ffb0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  trncmp(azArg[1],
2ffc0 22 69 6e 73 65 72 74 22 2c 6e 32 29 3d 3d 30 20  "insert",n2)==0 
2ffd0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  ){.      p->mode
2ffe0 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b 0a   = MODE_Insert;.
2fff0 20 20 20 20 20 20 73 65 74 5f 74 61 62 6c 65 5f        set_table_
30000 6e 61 6d 65 28 70 2c 20 6e 41 72 67 3e 3d 33 20  name(p, nArg>=3 
30010 3f 20 61 7a 41 72 67 5b 32 5d 20 3a 20 22 74 61  ? azArg[2] : "ta
30020 62 6c 65 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ble");.    }else
30030 20 69 66 28 20 63 32 3d 3d 27 71 27 20 26 26 20   if( c2=='q' && 
30040 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d  strncmp(azArg[1]
30050 2c 22 71 75 6f 74 65 22 2c 6e 32 29 3d 3d 30 20  ,"quote",n2)==0 
30060 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  ){.      p->mode
30070 20 3d 20 4d 4f 44 45 5f 51 75 6f 74 65 3b 0a 20   = MODE_Quote;. 
30080 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d     }else if( c2=
30090 3d 27 61 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='a' && strncmp(
300a0 61 7a 41 72 67 5b 31 5d 2c 22 61 73 63 69 69 22  azArg[1],"ascii"
300b0 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,n2)==0 ){.     
300c0 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
300d0 41 73 63 69 69 3b 0a 20 20 20 20 20 20 73 71 6c  Ascii;.      sql
300e0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
300f0 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72  zeof(p->colSepar
30100 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70  ator), p->colSep
30110 61 72 61 74 6f 72 2c 20 53 45 50 5f 55 6e 69 74  arator, SEP_Unit
30120 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
30130 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
30140 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72  (p->rowSeparator
30150 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ), p->rowSeparat
30160 6f 72 2c 20 53 45 50 5f 52 65 63 6f 72 64 29 3b  or, SEP_Record);
30170 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  .    }else if( n
30180 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Arg==1 ){.      
30190 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
301a0 74 2c 20 22 63 75 72 72 65 6e 74 20 6f 75 74 70  t, "current outp
301b0 75 74 20 6d 6f 64 65 3a 20 25 73 5c 6e 22 2c 20  ut mode: %s\n", 
301c0 6d 6f 64 65 44 65 73 63 72 5b 70 2d 3e 6d 6f 64  modeDescr[p->mod
301d0 65 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  e]);.    }else{.
301e0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
301f0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
30200 20 6d 6f 64 65 20 73 68 6f 75 6c 64 20 62 65 20   mode should be 
30210 6f 6e 65 20 6f 66 3a 20 22 0a 20 20 20 20 20 20  one of: ".      
30220 20 20 20 22 61 73 63 69 69 20 63 6f 6c 75 6d 6e     "ascii column
30230 20 63 73 76 20 68 74 6d 6c 20 69 6e 73 65 72 74   csv html insert
30240 20 6c 69 6e 65 20 6c 69 73 74 20 71 75 6f 74 65   line list quote
30250 20 74 61 62 73 20 74 63 6c 5c 6e 22 29 3b 0a 20   tabs tcl\n");. 
30260 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
30270 20 7d 0a 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20   }.    p->cMode 
30280 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 7d 65 6c  = p->mode;.  }el
30290 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6e 27  se..  if( c=='n'
302a0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
302b0 67 5b 30 5d 2c 20 22 6e 75 6c 6c 76 61 6c 75 65  g[0], "nullvalue
302c0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
302d0 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20  if( nArg==2 ){. 
302e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
302f0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
30300 6e 75 6c 6c 56 61 6c 75 65 29 2c 20 70 2d 3e 6e  nullValue), p->n
30310 75 6c 6c 56 61 6c 75 65 2c 0a 20 20 20 20 20 20  ullValue,.      
30320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30330 20 22 25 2e 2a 73 22 2c 20 28 69 6e 74 29 41 72   "%.*s", (int)Ar
30340 72 61 79 53 69 7a 65 28 70 2d 3e 6e 75 6c 6c 56  raySize(p->nullV
30350 61 6c 75 65 29 2d 31 2c 20 61 7a 41 72 67 5b 31  alue)-1, azArg[1
30360 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
30370 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
30380 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
30390 2e 6e 75 6c 6c 76 61 6c 75 65 20 53 54 52 49 4e  .nullvalue STRIN
303a0 47 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  G\n");.      rc 
303b0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
303c0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6f 27  se..  if( c=='o'
303d0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
303e0 67 5b 30 5d 2c 20 22 6f 70 65 6e 22 2c 20 6e 29  g[0], "open", n)
303f0 3d 3d 30 20 26 26 20 6e 3e 3d 32 20 29 7b 0a 20  ==0 && n>=2 ){. 
30400 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 46 69 6c     char *zNewFil
30410 65 6e 61 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65 20  ename;  /* Name 
30420 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
30430 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
30440 20 20 20 20 69 6e 74 20 69 4e 61 6d 65 20 3d 20      int iName = 
30450 31 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65  1;       /* Inde
30460 78 20 69 6e 20 61 7a 41 72 67 5b 5d 20 6f 66 20  x in azArg[] of 
30470 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a  the filename */.
30480 20 20 20 20 69 6e 74 20 6e 65 77 46 6c 61 67 20      int newFlag 
30490 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65  = 0;     /* True
304a0 20 74 6f 20 64 65 6c 65 74 65 20 66 69 6c 65 20   to delete file 
304b0 62 65 66 6f 72 65 20 6f 70 65 6e 69 6e 67 20 2a  before opening *
304c0 2f 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20 74  /.    /* Close t
304d0 68 65 20 65 78 69 73 74 69 6e 67 20 64 61 74 61  he existing data
304e0 62 61 73 65 20 2a 2f 0a 20 20 20 20 73 65 73 73  base */.    sess
304f0 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c 6c 28 70 29  ion_close_all(p)
30500 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c  ;.    sqlite3_cl
30510 6f 73 65 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20  ose(p->db);.    
30520 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 20 20 70  p->db = 0;.    p
30530 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d 20  ->zDbFilename = 
30540 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  0;.    sqlite3_f
30550 72 65 65 28 70 2d 3e 7a 46 72 65 65 4f 6e 43 6c  ree(p->zFreeOnCl
30560 6f 73 65 29 3b 0a 20 20 20 20 70 2d 3e 7a 46 72  ose);.    p->zFr
30570 65 65 4f 6e 43 6c 6f 73 65 20 3d 20 30 3b 0a 20  eeOnClose = 0;. 
30580 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d     p->openMode =
30590 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50   SHELL_OPEN_UNSP
305a0 45 43 3b 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b  EC;.    /* Check
305b0 20 66 6f 72 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e   for command-lin
305c0 65 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  e arguments */. 
305d0 20 20 20 66 6f 72 28 69 4e 61 6d 65 3d 31 3b 20     for(iName=1; 
305e0 69 4e 61 6d 65 3c 6e 41 72 67 20 26 26 20 61 7a  iName<nArg && az
305f0 41 72 67 5b 69 4e 61 6d 65 5d 5b 30 5d 3d 3d 27  Arg[iName][0]=='
30600 2d 27 3b 20 69 4e 61 6d 65 2b 2b 29 7b 0a 20 20  -'; iName++){.  
30610 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
30620 7a 20 3d 20 61 7a 41 72 67 5b 69 4e 61 6d 65 5d  z = azArg[iName]
30630 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 74 69  ;.      if( opti
30640 6f 6e 4d 61 74 63 68 28 7a 2c 22 6e 65 77 22 29  onMatch(z,"new")
30650 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 46   ){.        newF
30660 6c 61 67 20 3d 20 31 3b 0a 23 69 66 64 65 66 20  lag = 1;.#ifdef 
30670 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42  SQLITE_HAVE_ZLIB
30680 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
30690 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 7a 2c 20   optionMatch(z, 
306a0 22 7a 69 70 22 29 20 29 7b 0a 20 20 20 20 20 20  "zip") ){.      
306b0 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20    p->openMode = 
306c0 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49  SHELL_OPEN_ZIPFI
306d0 4c 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20  LE;.#endif.     
306e0 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 74 69 6f   }else if( optio
306f0 6e 4d 61 74 63 68 28 7a 2c 20 22 61 70 70 65 6e  nMatch(z, "appen
30700 64 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 70  d") ){.        p
30710 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20 53 48 45  ->openMode = SHE
30720 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46  LL_OPEN_APPENDVF
30730 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  S;.      }else i
30740 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 7a  f( optionMatch(z
30750 2c 20 22 72 65 61 64 6f 6e 6c 79 22 29 20 29 7b  , "readonly") ){
30760 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 70 65 6e  .        p->open
30770 4d 6f 64 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45  Mode = SHELL_OPE
30780 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20 20 20  N_READONLY;.    
30790 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 30 5d    }else if( z[0]
307a0 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20  =='-' ){.       
307b0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
307c0 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70  err, "unknown op
307d0 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b  tion: %s\n", z);
307e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
307f0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  .        goto me
30800 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
30810 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
30820 20 20 20 2f 2a 20 49 66 20 61 20 66 69 6c 65 6e     /* If a filen
30830 61 6d 65 20 69 73 20 73 70 65 63 69 66 69 65 64  ame is specified
30840 2c 20 74 72 79 20 74 6f 20 6f 70 65 6e 20 69 74  , try to open it
30850 20 66 69 72 73 74 20 2a 2f 0a 20 20 20 20 7a 4e   first */.    zN
30860 65 77 46 69 6c 65 6e 61 6d 65 20 3d 20 6e 41 72  ewFilename = nAr
30870 67 3e 69 4e 61 6d 65 20 3f 20 73 71 6c 69 74 65  g>iName ? sqlite
30880 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20  3_mprintf("%s", 
30890 61 7a 41 72 67 5b 69 4e 61 6d 65 5d 29 20 3a 20  azArg[iName]) : 
308a0 30 3b 0a 20 20 20 20 69 66 28 20 7a 4e 65 77 46  0;.    if( zNewF
308b0 69 6c 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ilename ){.     
308c0 20 69 66 28 20 6e 65 77 46 6c 61 67 20 29 20 73   if( newFlag ) s
308d0 68 65 6c 6c 44 65 6c 65 74 65 46 69 6c 65 28 7a  hellDeleteFile(z
308e0 4e 65 77 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  NewFilename);.  
308f0 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61      p->zDbFilena
30900 6d 65 20 3d 20 7a 4e 65 77 46 69 6c 65 6e 61 6d  me = zNewFilenam
30910 65 3b 0a 20 20 20 20 20 20 6f 70 65 6e 5f 64 62  e;.      open_db
30920 28 70 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66  (p, 1);.      if
30930 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20  ( p->db==0 ){.  
30940 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
30950 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
30960 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 27 25  : cannot open '%
30970 73 27 5c 6e 22 2c 20 7a 4e 65 77 46 69 6c 65 6e  s'\n", zNewFilen
30980 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71  ame);.        sq
30990 6c 69 74 65 33 5f 66 72 65 65 28 7a 4e 65 77 46  lite3_free(zNewF
309a0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ilename);.      
309b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70  }else{.        p
309c0 2d 3e 7a 46 72 65 65 4f 6e 43 6c 6f 73 65 20 3d  ->zFreeOnClose =
309d0 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 3b 0a 20   zNewFilename;. 
309e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
309f0 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b   if( p->db==0 ){
30a00 0a 20 20 20 20 20 20 2f 2a 20 41 73 20 61 20 66  .      /* As a f
30a10 61 6c 6c 2d 62 61 63 6b 20 6f 70 65 6e 20 61 20  all-back open a 
30a20 54 45 4d 50 20 64 61 74 61 62 61 73 65 20 2a 2f  TEMP database */
30a30 0a 20 20 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c  .      p->zDbFil
30a40 65 6e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20  ename = 0;.     
30a50 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
30a60 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
30a70 20 69 66 28 20 28 63 3d 3d 27 6f 27 0a 20 20 20   if( (c=='o'.   
30a80 20 20 20 20 20 26 26 20 28 73 74 72 6e 63 6d 70       && (strncmp
30a90 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f 75 74 70  (azArg[0], "outp
30aa0 75 74 22 2c 20 6e 29 3d 3d 30 7c 7c 73 74 72 6e  ut", n)==0||strn
30ab0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f  cmp(azArg[0], "o
30ac0 6e 63 65 22 2c 20 6e 29 3d 3d 30 29 29 0a 20 20  nce", n)==0)).  
30ad0 20 7c 7c 20 28 63 3d 3d 27 65 27 20 26 26 20 6e   || (c=='e' && n
30ae0 3d 3d 35 20 26 26 20 73 74 72 63 6d 70 28 61 7a  ==5 && strcmp(az
30af0 41 72 67 5b 30 5d 2c 22 65 78 63 65 6c 22 29 3d  Arg[0],"excel")=
30b00 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e  =0).  ){.    con
30b10 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d  st char *zFile =
30b20 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72 67   nArg>=2 ? azArg
30b30 5b 31 5d 20 3a 20 22 73 74 64 6f 75 74 22 3b 0a  [1] : "stdout";.
30b40 20 20 20 20 69 6e 74 20 62 54 78 74 4d 6f 64 65      int bTxtMode
30b50 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 61 7a   = 0;.    if( az
30b60 41 72 67 5b 30 5d 5b 30 5d 3d 3d 27 65 27 20 29  Arg[0][0]=='e' )
30b70 7b 0a 20 20 20 20 20 20 2f 2a 20 54 72 61 6e 73  {.      /* Trans
30b80 66 6f 72 6d 20 74 68 65 20 22 2e 65 78 63 65 6c  form the ".excel
30b90 22 20 63 6f 6d 6d 61 6e 64 20 69 6e 74 6f 20 22  " command into "
30ba0 2e 6f 6e 63 65 20 2d 78 22 20 2a 2f 0a 20 20 20  .once -x" */.   
30bb0 20 20 20 6e 41 72 67 20 3d 20 32 3b 0a 20 20 20     nArg = 2;.   
30bc0 20 20 20 61 7a 41 72 67 5b 30 5d 20 3d 20 22 6f     azArg[0] = "o
30bd0 6e 63 65 22 3b 0a 20 20 20 20 20 20 7a 46 69 6c  nce";.      zFil
30be0 65 20 3d 20 61 7a 41 72 67 5b 31 5d 20 3d 20 22  e = azArg[1] = "
30bf0 2d 78 22 3b 0a 20 20 20 20 20 20 6e 20 3d 20 34  -x";.      n = 4
30c00 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
30c10 6e 41 72 67 3e 32 20 29 7b 0a 20 20 20 20 20 20  nArg>2 ){.      
30c20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
30c30 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 25 73 20  rr, "Usage: .%s 
30c40 5b 2d 65 7c 2d 78 7c 46 49 4c 45 5d 5c 6e 22 2c  [-e|-x|FILE]\n",
30c50 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20   azArg[0]);.    
30c60 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
30c70 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
30c80 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20  d_exit;.    }.  
30c90 20 20 69 66 28 20 6e 3e 31 20 26 26 20 73 74 72    if( n>1 && str
30ca0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
30cb0 6f 6e 63 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  once", n)==0 ){.
30cc0 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32        if( nArg<2
30cd0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
30ce0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
30cf0 55 73 61 67 65 3a 20 2e 6f 6e 63 65 20 28 2d 65  Usage: .once (-e
30d00 7c 2d 78 7c 46 49 4c 45 29 5c 6e 22 29 3b 0a 20  |-x|FILE)\n");. 
30d10 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
30d20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61         goto meta
30d30 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
30d40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
30d50 6f 75 74 43 6f 75 6e 74 20 3d 20 32 3b 0a 20 20  outCount = 2;.  
30d60 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
30d70 2d 3e 6f 75 74 43 6f 75 6e 74 20 3d 20 30 3b 0a  ->outCount = 0;.
30d80 20 20 20 20 7d 0a 20 20 20 20 6f 75 74 70 75 74      }.    output
30d90 5f 72 65 73 65 74 28 70 29 3b 0a 20 20 20 20 69  _reset(p);.    i
30da0 66 28 20 7a 46 69 6c 65 5b 30 5d 3d 3d 27 2d 27  f( zFile[0]=='-'
30db0 20 26 26 20 7a 46 69 6c 65 5b 31 5d 3d 3d 27 2d   && zFile[1]=='-
30dc0 27 20 29 20 7a 46 69 6c 65 2b 2b 3b 0a 23 69 66  ' ) zFile++;.#if
30dd0 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e 4f 48 41  ndef SQLITE_NOHA
30de0 56 45 5f 53 59 53 54 45 4d 0a 20 20 20 20 69 66  VE_SYSTEM.    if
30df0 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20  ( strcmp(zFile, 
30e00 22 2d 65 22 29 3d 3d 30 20 7c 7c 20 73 74 72 63  "-e")==0 || strc
30e10 6d 70 28 7a 46 69 6c 65 2c 20 22 2d 78 22 29 3d  mp(zFile, "-x")=
30e20 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 64  =0 ){.      p->d
30e30 6f 58 64 67 4f 70 65 6e 20 3d 20 31 3b 0a 20 20  oXdgOpen = 1;.  
30e40 20 20 20 20 6f 75 74 70 75 74 4d 6f 64 65 50 75      outputModePu
30e50 73 68 28 70 29 3b 0a 20 20 20 20 20 20 69 66 28  sh(p);.      if(
30e60 20 7a 46 69 6c 65 5b 31 5d 3d 3d 27 78 27 20 29   zFile[1]=='x' )
30e70 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 54 65 6d  {.        newTem
30e80 70 46 69 6c 65 28 70 2c 20 22 63 73 76 22 29 3b  pFile(p, "csv");
30e90 0a 20 20 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  .        p->mode
30ea0 20 3d 20 4d 4f 44 45 5f 43 73 76 3b 0a 20 20 20   = MODE_Csv;.   
30eb0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
30ec0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
30ed0 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70  colSeparator), p
30ee0 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20  ->colSeparator, 
30ef0 53 45 50 5f 43 6f 6d 6d 61 29 3b 0a 20 20 20 20  SEP_Comma);.    
30f00 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
30f10 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72  intf(sizeof(p->r
30f20 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d  owSeparator), p-
30f30 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53  >rowSeparator, S
30f40 45 50 5f 43 72 4c 66 29 3b 0a 20 20 20 20 20 20  EP_CrLf);.      
30f50 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6e  }else{.        n
30f60 65 77 54 65 6d 70 46 69 6c 65 28 70 2c 20 22 74  ewTempFile(p, "t
30f70 78 74 22 29 3b 0a 20 20 20 20 20 20 20 20 62 54  xt");.        bT
30f80 78 74 4d 6f 64 65 20 3d 20 31 3b 0a 20 20 20 20  xtMode = 1;.    
30f90 20 20 7d 0a 20 20 20 20 20 20 7a 46 69 6c 65 20    }.      zFile 
30fa0 3d 20 70 2d 3e 7a 54 65 6d 70 46 69 6c 65 3b 0a  = p->zTempFile;.
30fb0 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20      }.#endif /* 
30fc0 53 51 4c 49 54 45 5f 4e 4f 48 41 56 45 5f 53 59  SQLITE_NOHAVE_SY
30fd0 53 54 45 4d 20 2a 2f 0a 20 20 20 20 69 66 28 20  STEM */.    if( 
30fe0 7a 46 69 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b  zFile[0]=='|' ){
30ff0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
31000 4d 49 54 5f 50 4f 50 45 4e 0a 20 20 20 20 20 20  MIT_POPEN.      
31010 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
31020 72 2c 20 22 45 72 72 6f 72 3a 20 70 69 70 65 73  r, "Error: pipes
31030 20 61 72 65 20 6e 6f 74 20 73 75 70 70 6f 72 74   are not support
31040 65 64 20 69 6e 20 74 68 69 73 20 4f 53 5c 6e 22  ed in this OS\n"
31050 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
31060 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20  .      p->out = 
31070 73 74 64 6f 75 74 3b 0a 23 65 6c 73 65 0a 20 20  stdout;.#else.  
31080 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 70 6f 70      p->out = pop
31090 65 6e 28 7a 46 69 6c 65 20 2b 20 31 2c 20 22 77  en(zFile + 1, "w
310a0 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  ");.      if( p-
310b0 3e 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >out==0 ){.     
310c0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
310d0 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 63 61  tderr,"Error: ca
310e0 6e 6e 6f 74 20 6f 70 65 6e 20 70 69 70 65 20 5c  nnot open pipe \
310f0 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 20  "%s\"\n", zFile 
31100 2b 20 31 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  + 1);.        p-
31110 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20  >out = stdout;. 
31120 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
31130 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
31140 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
31150 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 6f  intf(sizeof(p->o
31160 75 74 66 69 6c 65 29 2c 20 70 2d 3e 6f 75 74 66  utfile), p->outf
31170 69 6c 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65  ile, "%s", zFile
31180 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  );.      }.#endi
31190 66 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  f.    }else{.   
311a0 20 20 20 70 2d 3e 6f 75 74 20 3d 20 6f 75 74 70     p->out = outp
311b0 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28 7a 46 69  ut_file_open(zFi
311c0 6c 65 2c 20 62 54 78 74 4d 6f 64 65 29 3b 0a 20  le, bTxtMode);. 
311d0 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 75 74 3d       if( p->out=
311e0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  =0 ){.        if
311f0 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 22  ( strcmp(zFile,"
31200 6f 66 66 22 29 21 3d 30 20 29 7b 0a 20 20 20 20  off")!=0 ){.    
31210 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
31220 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
31230 20 63 61 6e 6e 6f 74 20 77 72 69 74 65 20 74 6f   cannot write to
31240 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c   \"%s\"\n", zFil
31250 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
31260 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 73        p->out = s
31270 74 64 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 72  tdout;.        r
31280 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 20 65  c = 1;.      } e
31290 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 71  lse {.        sq
312a0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
312b0 69 7a 65 6f 66 28 70 2d 3e 6f 75 74 66 69 6c 65  izeof(p->outfile
312c0 29 2c 20 70 2d 3e 6f 75 74 66 69 6c 65 2c 20 22  ), p->outfile, "
312d0 25 73 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20  %s", zFile);.   
312e0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
312f0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 70 27  se..  if( c=='p'
31300 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
31310 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 70  cmp(azArg[0], "p
31320 72 69 6e 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  rint", n)==0 ){.
31330 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
31340 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20  or(i=1; i<nArg; 
31350 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
31360 69 3e 31 20 29 20 72 61 77 5f 70 72 69 6e 74 66  i>1 ) raw_printf
31370 28 70 2d 3e 6f 75 74 2c 20 22 20 22 29 3b 0a 20  (p->out, " ");. 
31380 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
31390 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 61  (p->out, "%s", a
313a0 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a  zArg[i]);.    }.
313b0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
313c0 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20  ->out, "\n");.  
313d0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
313e0 27 70 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'p' && strncmp(a
313f0 7a 41 72 67 5b 30 5d 2c 20 22 70 72 6f 6d 70 74  zArg[0], "prompt
31400 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
31410 69 66 28 20 6e 41 72 67 20 3e 3d 20 32 29 20 7b  if( nArg >= 2) {
31420 0a 20 20 20 20 20 20 73 74 72 6e 63 70 79 28 6d  .      strncpy(m
31430 61 69 6e 50 72 6f 6d 70 74 2c 61 7a 41 72 67 5b  ainPrompt,azArg[
31440 31 5d 2c 28 69 6e 74 29 41 72 72 61 79 53 69 7a  1],(int)ArraySiz
31450 65 28 6d 61 69 6e 50 72 6f 6d 70 74 29 2d 31 29  e(mainPrompt)-1)
31460 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
31470 6e 41 72 67 20 3e 3d 20 33 29 20 7b 0a 20 20 20  nArg >= 3) {.   
31480 20 20 20 73 74 72 6e 63 70 79 28 63 6f 6e 74 69     strncpy(conti
31490 6e 75 65 50 72 6f 6d 70 74 2c 61 7a 41 72 67 5b  nuePrompt,azArg[
314a0 32 5d 2c 28 69 6e 74 29 41 72 72 61 79 53 69 7a  2],(int)ArraySiz
314b0 65 28 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74  e(continuePrompt
314c0 29 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  )-1);.    }.  }e
314d0 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 71  lse..  if( c=='q
314e0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
314f0 72 67 5b 30 5d 2c 20 22 71 75 69 74 22 2c 20 6e  rg[0], "quit", n
31500 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d  )==0 ){.    rc =
31510 20 32 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69   2;.  }else..  i
31520 66 28 20 63 3d 3d 27 72 27 20 26 26 20 6e 3e 3d  f( c=='r' && n>=
31530 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  3 && strncmp(azA
31540 72 67 5b 30 5d 2c 20 22 72 65 61 64 22 2c 20 6e  rg[0], "read", n
31550 29 3d 3d 30 20 29 7b 0a 20 20 20 20 46 49 4c 45  )==0 ){.    FILE
31560 20 2a 61 6c 74 3b 0a 20 20 20 20 69 66 28 20 6e   *alt;.    if( n
31570 41 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg!=2 ){.      
31580 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
31590 72 2c 20 22 55 73 61 67 65 3a 20 2e 72 65 61 64  r, "Usage: .read
315a0 20 46 49 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20   FILE\n");.     
315b0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67   rc = 1;.      g
315c0 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
315d0 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
315e0 20 61 6c 74 20 3d 20 66 6f 70 65 6e 28 61 7a 41   alt = fopen(azA
315f0 72 67 5b 31 5d 2c 20 22 72 62 22 29 3b 0a 20 20  rg[1], "rb");.  
31600 20 20 69 66 28 20 61 6c 74 3d 3d 30 20 29 7b 0a    if( alt==0 ){.
31610 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
31620 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
31630 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25   cannot open \"%
31640 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d  s\"\n", azArg[1]
31650 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
31660 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
31670 20 20 72 63 20 3d 20 70 72 6f 63 65 73 73 5f 69    rc = process_i
31680 6e 70 75 74 28 70 2c 20 61 6c 74 29 3b 0a 20 20  nput(p, alt);.  
31690 20 20 20 20 66 63 6c 6f 73 65 28 61 6c 74 29 3b      fclose(alt);
316a0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
316b0 20 20 69 66 28 20 63 3d 3d 27 72 27 20 26 26 20    if( c=='r' && 
316c0 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=3 && strncmp(
316d0 61 7a 41 72 67 5b 30 5d 2c 20 22 72 65 73 74 6f  azArg[0], "resto
316e0 72 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  re", n)==0 ){.  
316f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
31700 72 63 46 69 6c 65 3b 0a 20 20 20 20 63 6f 6e 73  rcFile;.    cons
31710 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 20  t char *zDb;.   
31720 20 73 71 6c 69 74 65 33 20 2a 70 53 72 63 3b 0a   sqlite3 *pSrc;.
31730 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b      sqlite3_back
31740 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a 20 20 20  up *pBackup;.   
31750 20 69 6e 74 20 6e 54 69 6d 65 6f 75 74 20 3d 20   int nTimeout = 
31760 30 3b 0a 0a 20 20 20 20 69 66 28 20 6e 41 72 67  0;..    if( nArg
31770 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 7a 53 72  ==2 ){.      zSr
31780 63 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d  cFile = azArg[1]
31790 3b 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 22 6d  ;.      zDb = "m
317a0 61 69 6e 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ain";.    }else 
317b0 69 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20  if( nArg==3 ){. 
317c0 20 20 20 20 20 7a 53 72 63 46 69 6c 65 20 3d 20       zSrcFile = 
317d0 61 7a 41 72 67 5b 32 5d 3b 0a 20 20 20 20 20 20  azArg[2];.      
317e0 7a 44 62 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a  zDb = azArg[1];.
317f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
31800 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
31810 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 72 65 73  rr, "Usage: .res
31820 74 6f 72 65 20 3f 44 42 3f 20 46 49 4c 45 5c 6e  tore ?DB? FILE\n
31830 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
31840 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74  ;.      goto met
31850 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
31860 20 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73      }.    rc = s
31870 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 53 72 63  qlite3_open(zSrc
31880 46 69 6c 65 2c 20 26 70 53 72 63 29 3b 0a 20 20  File, &pSrc);.  
31890 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
318a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 74 66  _OK ){.      utf
318b0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
318c0 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20   "Error: cannot 
318d0 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  open \"%s\"\n", 
318e0 7a 53 72 63 46 69 6c 65 29 3b 0a 20 20 20 20 20  zSrcFile);.     
318f0 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
31900 53 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75  Src);.      retu
31910 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
31920 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
31930 20 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71 6c     pBackup = sql
31940 69 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74  ite3_backup_init
31950 28 70 2d 3e 64 62 2c 20 7a 44 62 2c 20 70 53 72  (p->db, zDb, pSr
31960 63 2c 20 22 6d 61 69 6e 22 29 3b 0a 20 20 20 20  c, "main");.    
31970 69 66 28 20 70 42 61 63 6b 75 70 3d 3d 30 20 29  if( pBackup==0 )
31980 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
31990 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
319a0 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74  or: %s\n", sqlit
319b0 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
319c0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
319d0 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20  _close(pSrc);.  
319e0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
319f0 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 28    }.    while( (
31a00 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63  rc = sqlite3_bac
31a10 6b 75 70 5f 73 74 65 70 28 70 42 61 63 6b 75 70  kup_step(pBackup
31a20 2c 31 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f  ,100))==SQLITE_O
31a30 4b 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 72  K.          || r
31a40 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 20  c==SQLITE_BUSY  
31a50 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d  ){.      if( rc=
31a60 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a  =SQLITE_BUSY ){.
31a70 20 20 20 20 20 20 20 20 69 66 28 20 6e 54 69 6d          if( nTim
31a80 65 6f 75 74 2b 2b 20 3e 3d 20 33 20 29 20 62 72  eout++ >= 3 ) br
31a90 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  eak;.        sql
31aa0 69 74 65 33 5f 73 6c 65 65 70 28 31 30 30 29 3b  ite3_sleep(100);
31ab0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
31ac0 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75     sqlite3_backu
31ad0 70 5f 66 69 6e 69 73 68 28 70 42 61 63 6b 75 70  p_finish(pBackup
31ae0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
31af0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
31b00 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
31b10 7d 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51  }else if( rc==SQ
31b20 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20 72 63 3d  LITE_BUSY || rc=
31b30 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 29  =SQLITE_LOCKED )
31b40 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
31b50 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
31b60 72 3a 20 73 6f 75 72 63 65 20 64 61 74 61 62 61  r: source databa
31b70 73 65 20 69 73 20 62 75 73 79 5c 6e 22 29 3b 0a  se is busy\n");.
31b80 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
31b90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
31ba0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
31bb0 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  r, "Error: %s\n"
31bc0 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
31bd0 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20  (p->db));.      
31be0 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
31bf0 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28    sqlite3_close(
31c00 70 53 72 63 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  pSrc);.  }else..
31c10 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20    if( c=='s' && 
31c20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
31c30 2c 20 22 73 63 61 6e 73 74 61 74 73 22 2c 20 6e  , "scanstats", n
31c40 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
31c50 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20  nArg==2 ){.     
31c60 20 70 2d 3e 73 63 61 6e 73 74 61 74 73 4f 6e 20   p->scanstatsOn 
31c70 3d 20 28 75 38 29 62 6f 6f 6c 65 61 6e 56 61 6c  = (u8)booleanVal
31c80 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 23 69  ue(azArg[1]);.#i
31c90 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  fndef SQLITE_ENA
31ca0 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41  BLE_STMT_SCANSTA
31cb0 54 55 53 0a 20 20 20 20 20 20 72 61 77 5f 70 72  TUS.      raw_pr
31cc0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 57 61  intf(stderr, "Wa
31cd0 72 6e 69 6e 67 3a 20 2e 73 63 61 6e 73 74 61 74  rning: .scanstat
31ce0 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  s not available 
31cf0 69 6e 20 74 68 69 73 20 62 75 69 6c 64 2e 5c 6e  in this build.\n
31d00 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  ");.#endif.    }
31d10 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
31d20 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
31d30 55 73 61 67 65 3a 20 2e 73 63 61 6e 73 74 61 74  Usage: .scanstat
31d40 73 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20  s on|off\n");.  
31d50 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
31d60 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
31d70 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72 6e 63   c=='s' && strnc
31d80 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 63  mp(azArg[0], "sc
31d90 68 65 6d 61 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  hema", n)==0 ){.
31da0 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73 53      ShellText sS
31db0 65 6c 65 63 74 3b 0a 20 20 20 20 53 68 65 6c 6c  elect;.    Shell
31dc0 53 74 61 74 65 20 64 61 74 61 3b 0a 20 20 20 20  State data;.    
31dd0 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
31de0 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
31df0 72 20 2a 7a 44 69 76 20 3d 20 22 28 22 3b 0a 20  r *zDiv = "(";. 
31e00 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
31e10 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Name = 0;.    in
31e20 74 20 69 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20  t iSchema = 0;. 
31e30 20 20 20 69 6e 74 20 62 44 65 62 75 67 20 3d 20     int bDebug = 
31e40 30 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 0a  0;.    int ii;..
31e50 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
31e60 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  );.    memcpy(&d
31e70 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64  ata, p, sizeof(d
31e80 61 74 61 29 29 3b 0a 20 20 20 20 64 61 74 61 2e  ata));.    data.
31e90 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a  showHeader = 0;.
31ea0 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d      data.cMode =
31eb0 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44   data.mode = MOD
31ec0 45 5f 53 65 6d 69 3b 0a 20 20 20 20 69 6e 69 74  E_Semi;.    init
31ed0 54 65 78 74 28 26 73 53 65 6c 65 63 74 29 3b 0a  Text(&sSelect);.
31ee0 20 20 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69      for(ii=1; ii
31ef0 3c 6e 41 72 67 3b 20 69 69 2b 2b 29 7b 0a 20 20  <nArg; ii++){.  
31f00 20 20 20 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61      if( optionMa
31f10 74 63 68 28 61 7a 41 72 67 5b 69 69 5d 2c 22 69  tch(azArg[ii],"i
31f20 6e 64 65 6e 74 22 29 20 29 7b 0a 20 20 20 20 20  ndent") ){.     
31f30 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20     data.cMode = 
31f40 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45  data.mode = MODE
31f50 5f 50 72 65 74 74 79 3b 0a 20 20 20 20 20 20 7d  _Pretty;.      }
31f60 65 6c 73 65 20 69 66 28 20 6f 70 74 69 6f 6e 4d  else if( optionM
31f70 61 74 63 68 28 61 7a 41 72 67 5b 69 69 5d 2c 22  atch(azArg[ii],"
31f80 64 65 62 75 67 22 29 20 29 7b 0a 20 20 20 20 20  debug") ){.     
31f90 20 20 20 62 44 65 62 75 67 20 3d 20 31 3b 0a 20     bDebug = 1;. 
31fa0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a       }else if( z
31fb0 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
31fc0 20 20 20 7a 4e 61 6d 65 20 3d 20 61 7a 41 72 67     zName = azArg
31fd0 5b 69 69 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  [ii];.      }els
31fe0 65 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  e{.        raw_p
31ff0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
32000 73 61 67 65 3a 20 2e 73 63 68 65 6d 61 20 3f 2d  sage: .schema ?-
32010 2d 69 6e 64 65 6e 74 3f 20 3f 4c 49 4b 45 2d 50  -indent? ?LIKE-P
32020 41 54 54 45 52 4e 3f 5c 6e 22 29 3b 0a 20 20 20  ATTERN?\n");.   
32030 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
32040 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
32050 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
32060 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
32070 66 28 20 7a 4e 61 6d 65 21 3d 30 20 29 7b 0a 20  f( zName!=0 ){. 
32080 20 20 20 20 20 69 6e 74 20 69 73 4d 61 73 74 65       int isMaste
32090 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 72 6c  r = sqlite3_strl
320a0 69 6b 65 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  ike(zName, "sqli
320b0 74 65 5f 6d 61 73 74 65 72 22 2c 20 27 5c 5c 27  te_master", '\\'
320c0 29 3d 3d 30 3b 0a 20 20 20 20 20 20 69 66 28 20  )==0;.      if( 
320d0 69 73 4d 61 73 74 65 72 20 7c 7c 20 73 71 6c 69  isMaster || sqli
320e0 74 65 33 5f 73 74 72 6c 69 6b 65 28 7a 4e 61 6d  te3_strlike(zNam
320f0 65 2c 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d  e,"sqlite_temp_m
32100 61 73 74 65 72 22 2c 20 27 5c 5c 27 29 3d 3d 30  aster", '\\')==0
32110 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
32120 20 2a 6e 65 77 5f 61 72 67 76 5b 32 5d 2c 20 2a   *new_argv[2], *
32130 6e 65 77 5f 63 6f 6c 76 5b 32 5d 3b 0a 20 20 20  new_colv[2];.   
32140 20 20 20 20 20 6e 65 77 5f 61 72 67 76 5b 30 5d       new_argv[0]
32150 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
32160 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  tf(.            
32170 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
32180 45 20 54 41 42 4c 45 20 25 73 20 28 5c 6e 22 0a  E TABLE %s (\n".
32190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
321a0 20 20 20 20 20 20 22 20 20 74 79 70 65 20 74 65        "  type te
321b0 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  xt,\n".         
321c0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
321d0 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20  name text,\n".  
321e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
321f0 20 20 20 20 22 20 20 74 62 6c 5f 6e 61 6d 65 20      "  tbl_name 
32200 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20  text,\n".       
32210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
32220 20 20 72 6f 6f 74 70 61 67 65 20 69 6e 74 65 67    rootpage integ
32230 65 72 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  er,\n".         
32240 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
32250 73 71 6c 20 74 65 78 74 5c 6e 22 0a 20 20 20 20  sql text\n".    
32260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32270 20 20 22 29 22 2c 20 69 73 4d 61 73 74 65 72 20    ")", isMaster 
32280 3f 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  ? "sqlite_master
32290 22 20 3a 20 22 73 71 6c 69 74 65 5f 74 65 6d 70  " : "sqlite_temp
322a0 5f 6d 61 73 74 65 72 22 29 3b 0a 20 20 20 20 20  _master");.     
322b0 20 20 20 6e 65 77 5f 61 72 67 76 5b 31 5d 20 3d     new_argv[1] =
322c0 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f   0;.        new_
322d0 63 6f 6c 76 5b 30 5d 20 3d 20 22 73 71 6c 22 3b  colv[0] = "sql";
322e0 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 63 6f 6c  .        new_col
322f0 76 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  v[1] = 0;.      
32300 20 20 63 61 6c 6c 62 61 63 6b 28 26 64 61 74 61    callback(&data
32310 2c 20 31 2c 20 6e 65 77 5f 61 72 67 76 2c 20 6e  , 1, new_argv, n
32320 65 77 5f 63 6f 6c 76 29 3b 0a 20 20 20 20 20 20  ew_colv);.      
32330 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 6e    sqlite3_free(n
32340 65 77 5f 61 72 67 76 5b 30 5d 29 3b 0a 20 20 20  ew_argv[0]);.   
32350 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
32360 66 28 20 7a 44 69 76 20 29 7b 0a 20 20 20 20 20  f( zDiv ){.     
32370 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
32380 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  Stmt = 0;.      
32390 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
323a0 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 22  pare_v2(p->db, "
323b0 53 45 4c 45 43 54 20 6e 61 6d 65 20 46 52 4f 4d  SELECT name FROM
323c0 20 70 72 61 67 6d 61 5f 64 61 74 61 62 61 73 65   pragma_database
323d0 5f 6c 69 73 74 22 2c 0a 20 20 20 20 20 20 20 20  _list",.        
323e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
323f0 20 20 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74        -1, &pStmt
32400 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
32410 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  rc ){.        ut
32420 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
32430 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  , "Error: %s\n",
32440 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
32450 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 20  p->db));.       
32460 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
32470 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
32480 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
32490 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
324a0 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  and_exit;.      
324b0 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65  }.      appendTe
324c0 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 53 45  xt(&sSelect, "SE
324d0 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 22 2c 20  LECT sql FROM", 
324e0 30 29 3b 0a 20 20 20 20 20 20 69 53 63 68 65 6d  0);.      iSchem
324f0 61 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68 69  a = 0;.      whi
32500 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70  le( sqlite3_step
32510 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f  (pStmt)==SQLITE_
32520 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ROW ){.        c
32530 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
32540 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
32550 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
32560 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  t(pStmt, 0);.   
32570 20 20 20 20 20 63 68 61 72 20 7a 53 63 4e 75 6d       char zScNum
32580 5b 33 30 5d 3b 0a 20 20 20 20 20 20 20 20 73 71  [30];.        sq
32590 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
325a0 69 7a 65 6f 66 28 7a 53 63 4e 75 6d 29 2c 20 7a  izeof(zScNum), z
325b0 53 63 4e 75 6d 2c 20 22 25 64 22 2c 20 2b 2b 69  ScNum, "%d", ++i
325c0 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
325d0 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
325e0 6c 65 63 74 2c 20 7a 44 69 76 2c 20 30 29 3b 0a  lect, zDiv, 0);.
325f0 20 20 20 20 20 20 20 20 7a 44 69 76 20 3d 20 22          zDiv = "
32600 20 55 4e 49 4f 4e 20 41 4c 4c 20 22 3b 0a 20 20   UNION ALL ";.  
32610 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
32620 28 26 73 53 65 6c 65 63 74 2c 20 22 53 45 4c 45  (&sSelect, "SELE
32630 43 54 20 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68  CT shell_add_sch
32640 65 6d 61 28 73 71 6c 2c 22 2c 20 30 29 3b 0a 20  ema(sql,", 0);. 
32650 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
32660 65 33 5f 73 74 72 69 63 6d 70 28 7a 44 62 2c 20  e3_stricmp(zDb, 
32670 22 6d 61 69 6e 22 29 21 3d 30 20 29 7b 0a 20 20  "main")!=0 ){.  
32680 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
32690 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 44 62  xt(&sSelect, zDb
326a0 2c 20 27 22 27 29 3b 0a 20 20 20 20 20 20 20 20  , '"');.        
326b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
326c0 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
326d0 6c 65 63 74 2c 20 22 4e 55 4c 4c 22 2c 20 30 29  lect, "NULL", 0)
326e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
326f0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
32700 73 53 65 6c 65 63 74 2c 20 22 2c 6e 61 6d 65 29  sSelect, ",name)
32710 20 41 53 20 73 71 6c 2c 20 74 79 70 65 2c 20 74   AS sql, type, t
32720 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20 72  bl_name, name, r
32730 6f 77 69 64 2c 22 2c 20 30 29 3b 0a 20 20 20 20  owid,", 0);.    
32740 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
32750 73 53 65 6c 65 63 74 2c 20 7a 53 63 4e 75 6d 2c  sSelect, zScNum,
32760 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70   0);.        app
32770 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
32780 2c 20 22 20 41 53 20 73 6e 75 6d 2c 20 22 2c 20  , " AS snum, ", 
32790 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65  0);.        appe
327a0 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
327b0 20 7a 44 62 2c 20 27 5c 27 27 29 3b 0a 20 20 20   zDb, '\'');.   
327c0 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
327d0 26 73 53 65 6c 65 63 74 2c 20 22 20 41 53 20 73  &sSelect, " AS s
327e0 6e 61 6d 65 20 46 52 4f 4d 20 22 2c 20 30 29 3b  name FROM ", 0);
327f0 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
32800 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 44  ext(&sSelect, zD
32810 62 2c 20 27 22 27 29 3b 0a 20 20 20 20 20 20 20  b, '"');.       
32820 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
32830 6c 65 63 74 2c 20 22 2e 73 71 6c 69 74 65 5f 6d  lect, ".sqlite_m
32840 61 73 74 65 72 22 2c 20 30 29 3b 0a 20 20 20 20  aster", 0);.    
32850 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
32860 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
32870 29 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  );.#ifdef SQLITE
32880 5f 49 4e 54 52 4f 53 50 45 43 54 49 4f 4e 5f 50  _INTROSPECTION_P
32890 52 41 47 4d 41 53 0a 20 20 20 20 20 20 69 66 28  RAGMAS.      if(
328a0 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20   zName ){.      
328b0 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
328c0 65 6c 65 63 74 2c 0a 20 20 20 20 20 20 20 20 20  elect,.         
328d0 20 20 22 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45    " UNION ALL SE
328e0 4c 45 43 54 20 73 68 65 6c 6c 5f 6d 6f 64 75 6c  LECT shell_modul
328f0 65 5f 73 63 68 65 6d 61 28 6e 61 6d 65 29 2c 22  e_schema(name),"
32900 0a 20 20 20 20 20 20 20 20 20 20 20 22 20 27 74  .           " 't
32910 61 62 6c 65 27 2c 20 6e 61 6d 65 2c 20 6e 61 6d  able', name, nam
32920 65 2c 20 6e 61 6d 65 2c 20 39 65 2b 39 39 2c 20  e, name, 9e+99, 
32930 27 6d 61 69 6e 27 20 46 52 4f 4d 20 70 72 61 67  'main' FROM prag
32940 6d 61 5f 6d 6f 64 75 6c 65 5f 6c 69 73 74 22 2c  ma_module_list",
32950 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e   0);.      }.#en
32960 64 69 66 0a 20 20 20 20 20 20 61 70 70 65 6e 64  dif.      append
32970 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22  Text(&sSelect, "
32980 29 20 57 48 45 52 45 20 22 2c 20 30 29 3b 0a 20  ) WHERE ", 0);. 
32990 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20 29       if( zName )
329a0 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
329b0 7a 51 61 72 67 20 3d 20 73 71 6c 69 74 65 33 5f  zQarg = sqlite3_
329c0 6d 70 72 69 6e 74 66 28 22 25 51 22 2c 20 7a 4e  mprintf("%Q", zN
329d0 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 6e  ame);.        in
329e0 74 20 62 47 6c 6f 62 20 3d 20 73 74 72 63 68 72  t bGlob = strchr
329f0 28 7a 4e 61 6d 65 2c 20 27 2a 27 29 20 21 3d 20  (zName, '*') != 
32a00 30 20 7c 7c 20 73 74 72 63 68 72 28 7a 4e 61 6d  0 || strchr(zNam
32a10 65 2c 20 27 3f 27 29 20 21 3d 20 30 20 7c 7c 0a  e, '?') != 0 ||.
32a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32a30 20 20 20 20 73 74 72 63 68 72 28 7a 4e 61 6d 65      strchr(zName
32a40 2c 20 27 5b 27 29 20 21 3d 20 30 3b 0a 20 20 20  , '[') != 0;.   
32a50 20 20 20 20 20 69 66 28 20 73 74 72 63 68 72 28       if( strchr(
32a60 7a 4e 61 6d 65 2c 20 27 2e 27 29 20 29 7b 0a 20  zName, '.') ){. 
32a70 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54           appendT
32a80 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 6c  ext(&sSelect, "l
32a90 6f 77 65 72 28 70 72 69 6e 74 66 28 27 25 73 2e  ower(printf('%s.
32aa0 25 73 27 2c 73 6e 61 6d 65 2c 74 62 6c 5f 6e 61  %s',sname,tbl_na
32ab0 6d 65 29 29 22 2c 20 30 29 3b 0a 20 20 20 20 20  me))", 0);.     
32ac0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
32ad0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
32ae0 73 53 65 6c 65 63 74 2c 20 22 6c 6f 77 65 72 28  sSelect, "lower(
32af0 74 62 6c 5f 6e 61 6d 65 29 22 2c 20 30 29 3b 0a  tbl_name)", 0);.
32b00 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
32b10 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
32b20 65 6c 65 63 74 2c 20 62 47 6c 6f 62 20 3f 20 22  elect, bGlob ? "
32b30 20 47 4c 4f 42 20 22 20 3a 20 22 20 4c 49 4b 45   GLOB " : " LIKE
32b40 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   ", 0);.        
32b50 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
32b60 65 63 74 2c 20 7a 51 61 72 67 2c 20 30 29 3b 0a  ect, zQarg, 0);.
32b70 20 20 20 20 20 20 20 20 69 66 28 20 21 62 47 6c          if( !bGl
32b80 6f 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ob ){.          
32b90 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
32ba0 65 63 74 2c 20 22 20 45 53 43 41 50 45 20 27 5c  ect, " ESCAPE '\
32bb0 5c 27 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  \' ", 0);.      
32bc0 20 20 7d 0a 20 20 20 20 20 20 20 20 61 70 70 65    }.        appe
32bd0 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
32be0 20 22 20 41 4e 44 20 22 2c 20 30 29 3b 0a 20 20   " AND ", 0);.  
32bf0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
32c00 65 65 28 7a 51 61 72 67 29 3b 0a 20 20 20 20 20  ee(zQarg);.     
32c10 20 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54   }.      appendT
32c20 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 74  ext(&sSelect, "t
32c30 79 70 65 21 3d 27 6d 65 74 61 27 20 41 4e 44 20  ype!='meta' AND 
32c40 73 71 6c 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 22  sql IS NOT NULL"
32c50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32c60 20 20 20 20 20 20 20 20 20 20 20 20 22 20 4f 52              " OR
32c70 44 45 52 20 42 59 20 73 6e 75 6d 2c 20 72 6f 77  DER BY snum, row
32c80 69 64 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  id", 0);.      i
32c90 66 28 20 62 44 65 62 75 67 20 29 7b 0a 20 20 20  f( bDebug ){.   
32ca0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
32cb0 28 70 2d 3e 6f 75 74 2c 20 22 53 51 4c 3a 20 25  (p->out, "SQL: %
32cc0 73 3b 5c 6e 22 2c 20 73 53 65 6c 65 63 74 2e 7a  s;\n", sSelect.z
32cd0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
32ce0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
32cf0 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
32d00 20 73 53 65 6c 65 63 74 2e 7a 2c 20 63 61 6c 6c   sSelect.z, call
32d10 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45  back, &data, &zE
32d20 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 7d 0a  rrMsg);.      }.
32d30 20 20 20 20 20 20 66 72 65 65 54 65 78 74 28 26        freeText(&
32d40 73 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 7d 0a  sSelect);.    }.
32d50 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20      if( zErrMsg 
32d60 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
32d70 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72  intf(stderr,"Err
32d80 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 4d  or: %s\n", zErrM
32d90 73 67 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  sg);.      sqlit
32da0 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
32db0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
32dc0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
32dd0 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b   != SQLITE_OK ){
32de0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
32df0 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a  f(stderr,"Error:
32e00 20 71 75 65 72 79 69 6e 67 20 73 63 68 65 6d 61   querying schema
32e10 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 5c 6e 22 29   information\n")
32e20 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
32e30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
32e40 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20   rc = 0;.    }. 
32e50 20 7d 65 6c 73 65 0a 0a 23 69 66 20 64 65 66 69   }else..#if defi
32e60 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
32e70 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
32e80 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43  ITE_ENABLE_SELEC
32e90 54 54 52 41 43 45 29 0a 20 20 69 66 28 20 63 3d  TTRACE).  if( c=
32ea0 3d 27 73 27 20 26 26 20 6e 3d 3d 31 31 20 26 26  ='s' && n==11 &&
32eb0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
32ec0 5d 2c 20 22 73 65 6c 65 63 74 74 72 61 63 65 22  ], "selecttrace"
32ed0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  , n)==0 ){.    s
32ee0 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63  qlite3SelectTrac
32ef0 65 20 3d 20 28 69 6e 74 29 69 6e 74 65 67 65 72  e = (int)integer
32f00 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b  Value(azArg[1]);
32f10 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
32f20 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
32f30 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49  ITE_ENABLE_SESSI
32f40 4f 4e 29 0a 20 20 69 66 28 20 63 3d 3d 27 73 27  ON).  if( c=='s'
32f50 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
32f60 67 5b 30 5d 2c 22 73 65 73 73 69 6f 6e 22 2c 6e  g[0],"session",n
32f70 29 3d 3d 30 20 26 26 20 6e 3e 3d 33 20 29 7b 0a  )==0 && n>=3 ){.
32f80 20 20 20 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20      OpenSession 
32f90 2a 70 53 65 73 73 69 6f 6e 20 3d 20 26 70 2d 3e  *pSession = &p->
32fa0 61 53 65 73 73 69 6f 6e 5b 30 5d 3b 0a 20 20 20  aSession[0];.   
32fb0 20 63 68 61 72 20 2a 2a 61 7a 43 6d 64 20 3d 20   char **azCmd = 
32fc0 26 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 69  &azArg[1];.    i
32fd0 6e 74 20 69 53 65 73 20 3d 20 30 3b 0a 20 20 20  nt iSes = 0;.   
32fe0 20 69 6e 74 20 6e 43 6d 64 20 3d 20 6e 41 72 67   int nCmd = nArg
32ff0 20 2d 20 31 3b 0a 20 20 20 20 69 6e 74 20 69 3b   - 1;.    int i;
33000 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3c 3d 31  .    if( nArg<=1
33010 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f   ) goto session_
33020 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20  syntax_error;.  
33030 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
33040 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 3d 33  .    if( nArg>=3
33050 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 53   ){.      for(iS
33060 65 73 3d 30 3b 20 69 53 65 73 3c 70 2d 3e 6e 53  es=0; iSes<p->nS
33070 65 73 73 69 6f 6e 3b 20 69 53 65 73 2b 2b 29 7b  ession; iSes++){
33080 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72  .        if( str
33090 63 6d 70 28 70 2d 3e 61 53 65 73 73 69 6f 6e 5b  cmp(p->aSession[
330a0 69 53 65 73 5d 2e 7a 4e 61 6d 65 2c 20 61 7a 41  iSes].zName, azA
330b0 72 67 5b 31 5d 29 3d 3d 30 20 29 20 62 72 65 61  rg[1])==0 ) brea
330c0 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
330d0 20 69 66 28 20 69 53 65 73 3c 70 2d 3e 6e 53 65   if( iSes<p->nSe
330e0 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20  ssion ){.       
330f0 20 70 53 65 73 73 69 6f 6e 20 3d 20 26 70 2d 3e   pSession = &p->
33100 61 53 65 73 73 69 6f 6e 5b 69 53 65 73 5d 3b 0a  aSession[iSes];.
33110 20 20 20 20 20 20 20 20 61 7a 43 6d 64 2b 2b 3b          azCmd++;
33120 0a 20 20 20 20 20 20 20 20 6e 43 6d 64 2d 2d 3b  .        nCmd--;
33130 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
33140 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e 20 3d        pSession =
33150 20 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 30 5d   &p->aSession[0]
33160 3b 0a 20 20 20 20 20 20 20 20 69 53 65 73 20 3d  ;.        iSes =
33170 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
33180 7d 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69  }..    /* .sessi
33190 6f 6e 20 61 74 74 61 63 68 20 54 41 42 4c 45 0a  on attach TABLE.
331a0 20 20 20 20 2a 2a 20 49 6e 76 6f 6b 65 20 74 68      ** Invoke th
331b0 65 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e  e sqlite3session
331c0 5f 61 74 74 61 63 68 28 29 20 69 6e 74 65 72 66  _attach() interf
331d0 61 63 65 20 74 6f 20 61 74 74 61 63 68 20 61 20  ace to attach a 
331e0 70 61 72 74 69 63 75 6c 61 72 0a 20 20 20 20 2a  particular.    *
331f0 2a 20 74 61 62 6c 65 20 73 6f 20 74 68 61 74 20  * table so that 
33200 69 74 20 69 73 20 6e 65 76 65 72 20 66 69 6c 74  it is never filt
33210 65 72 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ered..    */.   
33220 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d   if( strcmp(azCm
33230 64 5b 30 5d 2c 22 61 74 74 61 63 68 22 29 3d 3d  d[0],"attach")==
33240 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  0 ){.      if( n
33250 43 6d 64 21 3d 32 20 29 20 67 6f 74 6f 20 73 65  Cmd!=2 ) goto se
33260 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72  ssion_syntax_err
33270 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53  or;.      if( pS
33280 65 73 73 69 6f 6e 2d 3e 70 3d 3d 30 20 29 7b 0a  ession->p==0 ){.
33290 20 20 20 20 20 20 20 20 73 65 73 73 69 6f 6e 5f          session_
332a0 6e 6f 74 5f 6f 70 65 6e 3a 0a 20 20 20 20 20 20  not_open:.      
332b0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
332c0 65 72 72 2c 20 22 45 52 52 4f 52 3a 20 4e 6f 20  err, "ERROR: No 
332d0 73 65 73 73 69 6f 6e 73 20 61 72 65 20 6f 70 65  sessions are ope
332e0 6e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 7d 65 6c  n\n");.      }el
332f0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  se{.        rc =
33300 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f   sqlite3session_
33310 61 74 74 61 63 68 28 70 53 65 73 73 69 6f 6e 2d  attach(pSession-
33320 3e 70 2c 20 61 7a 43 6d 64 5b 31 5d 29 3b 0a 20  >p, azCmd[1]);. 
33330 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
33340 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
33350 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
33360 52 52 4f 52 3a 20 73 71 6c 69 74 65 33 73 65 73  RROR: sqlite3ses
33370 73 69 6f 6e 5f 61 74 74 61 63 68 28 29 20 72 65  sion_attach() re
33380 74 75 72 6e 73 20 25 64 5c 6e 22 2c 20 72 63 29  turns %d\n", rc)
33390 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
333a0 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
333b0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a      }.    }else.
333c0 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e  .    /* .session
333d0 20 63 68 61 6e 67 65 73 65 74 20 46 49 4c 45 0a   changeset FILE.
333e0 20 20 20 20 2a 2a 20 2e 73 65 73 73 69 6f 6e 20      ** .session 
333f0 70 61 74 63 68 73 65 74 20 46 49 4c 45 0a 20 20  patchset FILE.  
33400 20 20 2a 2a 20 57 72 69 74 65 20 61 20 63 68 61    ** Write a cha
33410 6e 67 65 73 65 74 20 6f 72 20 70 61 74 63 68 73  ngeset or patchs
33420 65 74 20 69 6e 74 6f 20 61 20 66 69 6c 65 2e 20  et into a file. 
33430 20 54 68 65 20 66 69 6c 65 20 69 73 20 6f 76 65   The file is ove
33440 72 77 72 69 74 74 65 6e 2e 0a 20 20 20 20 2a 2f  rwritten..    */
33450 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
33460 61 7a 43 6d 64 5b 30 5d 2c 22 63 68 61 6e 67 65  azCmd[0],"change
33470 73 65 74 22 29 3d 3d 30 20 7c 7c 20 73 74 72 63  set")==0 || strc
33480 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 70 61 74  mp(azCmd[0],"pat
33490 63 68 73 65 74 22 29 3d 3d 30 20 29 7b 0a 20 20  chset")==0 ){.  
334a0 20 20 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20      FILE *out = 
334b0 30 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6d  0;.      if( nCm
334c0 64 21 3d 32 20 29 20 67 6f 74 6f 20 73 65 73 73  d!=2 ) goto sess
334d0 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72  ion_syntax_error
334e0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 53 65 73  ;.      if( pSes
334f0 73 69 6f 6e 2d 3e 70 3d 3d 30 20 29 20 67 6f 74  sion->p==0 ) got
33500 6f 20 73 65 73 73 69 6f 6e 5f 6e 6f 74 5f 6f 70  o session_not_op
33510 65 6e 3b 0a 20 20 20 20 20 20 6f 75 74 20 3d 20  en;.      out = 
33520 66 6f 70 65 6e 28 61 7a 43 6d 64 5b 31 5d 2c 20  fopen(azCmd[1], 
33530 22 77 62 22 29 3b 0a 20 20 20 20 20 20 69 66 28  "wb");.      if(
33540 20 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20   out==0 ){.     
33550 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
33560 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a 20 63  tderr, "ERROR: c
33570 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c  annot open \"%s\
33580 22 20 66 6f 72 20 77 72 69 74 69 6e 67 5c 6e 22  " for writing\n"
33590 2c 20 61 7a 43 6d 64 5b 31 5d 29 3b 0a 20 20 20  , azCmd[1]);.   
335a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
335b0 20 20 69 6e 74 20 73 7a 43 68 6e 67 3b 0a 20 20    int szChng;.  
335c0 20 20 20 20 20 20 76 6f 69 64 20 2a 70 43 68 6e        void *pChn
335d0 67 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  g;.        if( a
335e0 7a 43 6d 64 5b 30 5d 5b 30 5d 3d 3d 27 63 27 20  zCmd[0][0]=='c' 
335f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  ){.          rc 
33600 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e  = sqlite3session
33610 5f 63 68 61 6e 67 65 73 65 74 28 70 53 65 73 73  _changeset(pSess
33620 69 6f 6e 2d 3e 70 2c 20 26 73 7a 43 68 6e 67 2c  ion->p, &szChng,
33630 20 26 70 43 68 6e 67 29 3b 0a 20 20 20 20 20 20   &pChng);.      
33640 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
33650 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 73     rc = sqlite3s
33660 65 73 73 69 6f 6e 5f 70 61 74 63 68 73 65 74 28  ession_patchset(
33670 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 26 73 7a  pSession->p, &sz
33680 43 68 6e 67 2c 20 26 70 43 68 6e 67 29 3b 0a 20  Chng, &pChng);. 
33690 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
336a0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
336b0 20 20 20 20 20 70 72 69 6e 74 66 28 22 45 72 72       printf("Err
336c0 6f 72 3a 20 65 72 72 6f 72 20 63 6f 64 65 20 25  or: error code %
336d0 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20 20  d\n", rc);.     
336e0 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20       rc = 0;.   
336f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
33700 66 28 20 70 43 68 6e 67 0a 20 20 20 20 20 20 20  f( pChng.       
33710 20 20 20 26 26 20 66 77 72 69 74 65 28 70 43 68     && fwrite(pCh
33720 6e 67 2c 20 73 7a 43 68 6e 67 2c 20 31 2c 20 6f  ng, szChng, 1, o
33730 75 74 29 21 3d 31 20 29 7b 0a 20 20 20 20 20 20  ut)!=1 ){.      
33740 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
33750 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a 20 46  tderr, "ERROR: F
33760 61 69 6c 65 64 20 74 6f 20 77 72 69 74 65 20 65  ailed to write e
33770 6e 74 69 72 65 20 25 64 2d 62 79 74 65 20 6f 75  ntire %d-byte ou
33780 74 70 75 74 5c 6e 22 2c 0a 20 20 20 20 20 20 20  tput\n",.       
33790 20 20 20 20 20 20 20 20 20 20 20 73 7a 43 68 6e             szChn
337a0 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  g);.        }.  
337b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
337c0 65 65 28 70 43 68 6e 67 29 3b 0a 20 20 20 20 20  ee(pChng);.     
337d0 20 20 20 66 63 6c 6f 73 65 28 6f 75 74 29 3b 0a     fclose(out);.
337e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
337f0 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69  e..    /* .sessi
33800 6f 6e 20 63 6c 6f 73 65 0a 20 20 20 20 2a 2a 20  on close.    ** 
33810 43 6c 6f 73 65 20 74 68 65 20 69 64 65 6e 74 69  Close the identi
33820 66 69 65 64 20 73 65 73 73 69 6f 6e 0a 20 20 20  fied session.   
33830 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63   */.    if( strc
33840 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22 63 6c  mp(azCmd[0], "cl
33850 6f 73 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ose")==0 ){.    
33860 20 20 69 66 28 20 6e 43 6d 64 21 3d 31 20 29 20    if( nCmd!=1 ) 
33870 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e  goto session_syn
33880 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  tax_error;.     
33890 20 69 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e   if( p->nSession
338a0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65 73 73   ){.        sess
338b0 69 6f 6e 5f 63 6c 6f 73 65 28 70 53 65 73 73 69  ion_close(pSessi
338c0 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e  on);.        p->
338d0 61 53 65 73 73 69 6f 6e 5b 69 53 65 73 5d 20 3d  aSession[iSes] =
338e0 20 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 2d 2d 70   p->aSession[--p
338f0 2d 3e 6e 53 65 73 73 69 6f 6e 5d 3b 0a 20 20 20  ->nSession];.   
33900 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a     }.    }else..
33910 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20      /* .session 
33920 65 6e 61 62 6c 65 20 3f 42 4f 4f 4c 45 41 4e 3f  enable ?BOOLEAN?
33930 0a 20 20 20 20 2a 2a 20 51 75 65 72 79 20 6f 72  .    ** Query or
33940 20 73 65 74 20 74 68 65 20 65 6e 61 62 6c 65 20   set the enable 
33950 66 6c 61 67 0a 20 20 20 20 2a 2f 0a 20 20 20 20  flag.    */.    
33960 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64  if( strcmp(azCmd
33970 5b 30 5d 2c 20 22 65 6e 61 62 6c 65 22 29 3d 3d  [0], "enable")==
33980 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
33990 69 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6d  i;.      if( nCm
339a0 64 3e 32 20 29 20 67 6f 74 6f 20 73 65 73 73 69  d>2 ) goto sessi
339b0 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b  on_syntax_error;
339c0 0a 20 20 20 20 20 20 69 69 20 3d 20 6e 43 6d 64  .      ii = nCmd
339d0 3d 3d 31 20 3f 20 2d 31 20 3a 20 62 6f 6f 6c 65  ==1 ? -1 : boole
339e0 61 6e 56 61 6c 75 65 28 61 7a 43 6d 64 5b 31 5d  anValue(azCmd[1]
339f0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
33a00 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20  nSession ){.    
33a10 20 20 20 20 69 69 20 3d 20 73 71 6c 69 74 65 33      ii = sqlite3
33a20 73 65 73 73 69 6f 6e 5f 65 6e 61 62 6c 65 28 70  session_enable(p
33a30 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 69 69 29 3b  Session->p, ii);
33a40 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
33a50 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 73 65  intf(p->out, "se
33a60 73 73 69 6f 6e 20 25 73 20 65 6e 61 62 6c 65 20  ssion %s enable 
33a70 66 6c 61 67 20 3d 20 25 64 5c 6e 22 2c 0a 20 20  flag = %d\n",.  
33a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33a90 20 20 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d    pSession->zNam
33aa0 65 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 7d 0a  e, ii);.      }.
33ab0 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f      }else..    /
33ac0 2a 20 2e 73 65 73 73 69 6f 6e 20 66 69 6c 74 65  * .session filte
33ad0 72 20 47 4c 4f 42 20 2e 2e 2e 2e 0a 20 20 20 20  r GLOB .....    
33ae0 2a 2a 20 53 65 74 20 61 20 6c 69 73 74 20 6f 66  ** Set a list of
33af0 20 47 4c 4f 42 20 70 61 74 74 65 72 6e 73 20 6f   GLOB patterns o
33b00 66 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 74 6f  f table names to
33b10 20 62 65 20 65 78 63 6c 75 64 65 64 2e 0a 20 20   be excluded..  
33b20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72    */.    if( str
33b30 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22 66  cmp(azCmd[0], "f
33b40 69 6c 74 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20  ilter")==0 ){.  
33b50 20 20 20 20 69 6e 74 20 69 69 2c 20 6e 42 79 74      int ii, nByt
33b60 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6d  e;.      if( nCm
33b70 64 3c 32 20 29 20 67 6f 74 6f 20 73 65 73 73 69  d<2 ) goto sessi
33b80 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b  on_syntax_error;
33b90 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53  .      if( p->nS
33ba0 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  ession ){.      
33bb0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 70    for(ii=0; ii<p
33bc0 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72  Session->nFilter
33bd0 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ; ii++){.       
33be0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
33bf0 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74  pSession->azFilt
33c00 65 72 5b 69 69 5d 29 3b 0a 20 20 20 20 20 20 20  er[ii]);.       
33c10 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
33c20 65 33 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e  e3_free(pSession
33c30 2d 3e 61 7a 46 69 6c 74 65 72 29 3b 0a 20 20 20  ->azFilter);.   
33c40 20 20 20 20 20 6e 42 79 74 65 20 3d 20 73 69 7a       nByte = siz
33c50 65 6f 66 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a  eof(pSession->az
33c60 46 69 6c 74 65 72 5b 30 5d 29 2a 28 6e 43 6d 64  Filter[0])*(nCmd
33c70 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 70 53 65  -1);.        pSe
33c80 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 20  ssion->azFilter 
33c90 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
33ca0 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 20 20 20  ( nByte );.     
33cb0 20 20 20 69 66 28 20 70 53 65 73 73 69 6f 6e 2d     if( pSession-
33cc0 3e 61 7a 46 69 6c 74 65 72 3d 3d 30 20 29 7b 0a  >azFilter==0 ){.
33cd0 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
33ce0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
33cf0 72 6f 72 3a 20 6f 75 74 20 6f 72 20 6d 65 6d 6f  ror: out or memo
33d00 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  ry\n");.        
33d10 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20    exit(1);.     
33d20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72     }.        for
33d30 28 69 69 3d 31 3b 20 69 69 3c 6e 43 6d 64 3b 20  (ii=1; ii<nCmd; 
33d40 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ii++){.         
33d50 20 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c   pSession->azFil
33d60 74 65 72 5b 69 69 2d 31 5d 20 3d 20 73 71 6c 69  ter[ii-1] = sqli
33d70 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
33d80 2c 20 61 7a 43 6d 64 5b 69 69 5d 29 3b 0a 20 20  , azCmd[ii]);.  
33d90 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
33da0 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65  pSession->nFilte
33db0 72 20 3d 20 69 69 2d 31 3b 0a 20 20 20 20 20 20  r = ii-1;.      
33dc0 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20  }.    }else..   
33dd0 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 69 6e 64   /* .session ind
33de0 69 72 65 63 74 20 3f 42 4f 4f 4c 45 41 4e 3f 0a  irect ?BOOLEAN?.
33df0 20 20 20 20 2a 2a 20 51 75 65 72 79 20 6f 72 20      ** Query or 
33e00 73 65 74 20 74 68 65 20 69 6e 64 69 72 65 63 74  set the indirect
33e10 20 66 6c 61 67 0a 20 20 20 20 2a 2f 0a 20 20 20   flag.    */.   
33e20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d   if( strcmp(azCm
33e30 64 5b 30 5d 2c 20 22 69 6e 64 69 72 65 63 74 22  d[0], "indirect"
33e40 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  )==0 ){.      in
33e50 74 20 69 69 3b 0a 20 20 20 20 20 20 69 66 28 20  t ii;.      if( 
33e60 6e 43 6d 64 3e 32 20 29 20 67 6f 74 6f 20 73 65  nCmd>2 ) goto se
33e70 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72  ssion_syntax_err
33e80 6f 72 3b 0a 20 20 20 20 20 20 69 69 20 3d 20 6e  or;.      ii = n
33e90 43 6d 64 3d 3d 31 20 3f 20 2d 31 20 3a 20 62 6f  Cmd==1 ? -1 : bo
33ea0 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 43 6d 64  oleanValue(azCmd
33eb0 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [1]);.      if( 
33ec0 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20  p->nSession ){. 
33ed0 20 20 20 20 20 20 20 69 69 20 3d 20 73 71 6c 69         ii = sqli
33ee0 74 65 33 73 65 73 73 69 6f 6e 5f 69 6e 64 69 72  te3session_indir
33ef0 65 63 74 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c  ect(pSession->p,
33f00 20 69 69 29 3b 0a 20 20 20 20 20 20 20 20 75 74   ii);.        ut
33f10 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
33f20 2c 20 22 73 65 73 73 69 6f 6e 20 25 73 20 69 6e  , "session %s in
33f30 64 69 72 65 63 74 20 66 6c 61 67 20 3d 20 25 64  direct flag = %d
33f40 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
33f50 20 20 20 20 20 20 20 20 20 70 53 65 73 73 69 6f           pSessio
33f60 6e 2d 3e 7a 4e 61 6d 65 2c 20 69 69 29 3b 0a 20  n->zName, ii);. 
33f70 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
33f80 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f  ..    /* .sessio
33f90 6e 20 69 73 65 6d 70 74 79 0a 20 20 20 20 2a 2a  n isempty.    **
33fa0 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20 74 68   Determine if th
33fb0 65 20 73 65 73 73 69 6f 6e 20 69 73 20 65 6d 70  e session is emp
33fc0 74 79 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  ty.    */.    if
33fd0 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30  ( strcmp(azCmd[0
33fe0 5d 2c 20 22 69 73 65 6d 70 74 79 22 29 3d 3d 30  ], "isempty")==0
33ff0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69   ){.      int ii
34000 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6d 64  ;.      if( nCmd
34010 21 3d 31 20 29 20 67 6f 74 6f 20 73 65 73 73 69  !=1 ) goto sessi
34020 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b  on_syntax_error;
34030 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53  .      if( p->nS
34040 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  ession ){.      
34050 20 20 69 69 20 3d 20 73 71 6c 69 74 65 33 73 65    ii = sqlite3se
34060 73 73 69 6f 6e 5f 69 73 65 6d 70 74 79 28 70 53  ssion_isempty(pS
34070 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20 20 20 20  ession->p);.    
34080 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
34090 70 2d 3e 6f 75 74 2c 20 22 73 65 73 73 69 6f 6e  p->out, "session
340a0 20 25 73 20 69 73 65 6d 70 74 79 20 66 6c 61 67   %s isempty flag
340b0 20 3d 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20   = %d\n",.      
340c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
340d0 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 2c 20 69  ession->zName, i
340e0 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
340f0 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73  }else..    /* .s
34100 65 73 73 69 6f 6e 20 6c 69 73 74 0a 20 20 20 20  ession list.    
34110 2a 2a 20 4c 69 73 74 20 61 6c 6c 20 63 75 72 72  ** List all curr
34120 65 6e 74 6c 79 20 6f 70 65 6e 20 73 65 73 73 69  ently open sessi
34130 6f 6e 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ons.    */.    i
34140 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b  f( strcmp(azCmd[
34150 30 5d 2c 22 6c 69 73 74 22 29 3d 3d 30 20 29 7b  0],"list")==0 ){
34160 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
34170 69 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b 20 69  i<p->nSession; i
34180 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  ++){.        utf
34190 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
341a0 20 22 25 64 20 25 73 5c 6e 22 2c 20 69 2c 20 70   "%d %s\n", i, p
341b0 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 5d 2e 7a 4e  ->aSession[i].zN
341c0 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
341d0 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20    }else..    /* 
341e0 2e 73 65 73 73 69 6f 6e 20 6f 70 65 6e 20 44 42  .session open DB
341f0 20 4e 41 4d 45 0a 20 20 20 20 2a 2a 20 4f 70 65   NAME.    ** Ope
34200 6e 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20  n a new session 
34210 63 61 6c 6c 65 64 20 4e 41 4d 45 20 6f 6e 20 74  called NAME on t
34220 68 65 20 61 74 74 61 63 68 65 64 20 64 61 74 61  he attached data
34230 62 61 73 65 20 44 42 2e 0a 20 20 20 20 2a 2a 20  base DB..    ** 
34240 44 42 20 69 73 20 6e 6f 72 6d 61 6c 6c 79 20 22  DB is normally "
34250 6d 61 69 6e 22 2e 0a 20 20 20 20 2a 2f 0a 20 20  main"..    */.  
34260 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43    if( strcmp(azC
34270 6d 64 5b 30 5d 2c 22 6f 70 65 6e 22 29 3d 3d 30  md[0],"open")==0
34280 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a   ){.      char *
34290 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 66 28  zName;.      if(
342a0 20 6e 43 6d 64 21 3d 33 20 29 20 67 6f 74 6f 20   nCmd!=3 ) goto 
342b0 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65  session_syntax_e
342c0 72 72 6f 72 3b 0a 20 20 20 20 20 20 7a 4e 61 6d  rror;.      zNam
342d0 65 20 3d 20 61 7a 43 6d 64 5b 32 5d 3b 0a 20 20  e = azCmd[2];.  
342e0 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b 30 5d      if( zName[0]
342f0 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 73 73 69  ==0 ) goto sessi
34300 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b  on_syntax_error;
34310 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
34320 69 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b 20 69  i<p->nSession; i
34330 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
34340 20 73 74 72 63 6d 70 28 70 2d 3e 61 53 65 73 73   strcmp(p->aSess
34350 69 6f 6e 5b 69 5d 2e 7a 4e 61 6d 65 2c 7a 4e 61  ion[i].zName,zNa
34360 6d 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  me)==0 ){.      
34370 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
34380 73 74 64 65 72 72 2c 20 22 53 65 73 73 69 6f 6e  stderr, "Session
34390 20 5c 22 25 73 5c 22 20 61 6c 72 65 61 64 79 20   \"%s\" already 
343a0 65 78 69 73 74 73 5c 6e 22 2c 20 7a 4e 61 6d 65  exists\n", zName
343b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
343c0 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
343d0 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  xit;.        }. 
343e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
343f0 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 3e 3d 41 72   p->nSession>=Ar
34400 72 61 79 53 69 7a 65 28 70 2d 3e 61 53 65 73 73  raySize(p->aSess
34410 69 6f 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ion) ){.        
34420 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
34430 72 2c 20 22 4d 61 78 69 6d 75 6d 20 6f 66 20 25  r, "Maximum of %
34440 64 20 73 65 73 73 69 6f 6e 73 5c 6e 22 2c 20 41  d sessions\n", A
34450 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 53 65 73  rraySize(p->aSes
34460 73 69 6f 6e 29 29 3b 0a 20 20 20 20 20 20 20 20  sion));.        
34470 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
34480 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a  d_exit;.      }.
34490 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e 20 3d        pSession =
344a0 20 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 70 2d   &p->aSession[p-
344b0 3e 6e 53 65 73 73 69 6f 6e 5d 3b 0a 20 20 20 20  >nSession];.    
344c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 73 65    rc = sqlite3se
344d0 73 73 69 6f 6e 5f 63 72 65 61 74 65 28 70 2d 3e  ssion_create(p->
344e0 64 62 2c 20 61 7a 43 6d 64 5b 31 5d 2c 20 26 70  db, azCmd[1], &p
344f0 53 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20 20 20  Session->p);.   
34500 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
34510 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
34520 73 74 64 65 72 72 2c 20 22 43 61 6e 6e 6f 74 20  stderr, "Cannot 
34530 6f 70 65 6e 20 73 65 73 73 69 6f 6e 3a 20 65 72  open session: er
34540 72 6f 72 20 63 6f 64 65 3d 25 64 5c 6e 22 2c 20  ror code=%d\n", 
34550 72 63 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  rc);.        rc 
34560 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 0;.        got
34570 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
34580 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xit;.      }.   
34590 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69     pSession->nFi
345a0 6c 74 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  lter = 0;.      
345b0 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 74  sqlite3session_t
345c0 61 62 6c 65 5f 66 69 6c 74 65 72 28 70 53 65 73  able_filter(pSes
345d0 73 69 6f 6e 2d 3e 70 2c 20 73 65 73 73 69 6f 6e  sion->p, session
345e0 5f 66 69 6c 74 65 72 2c 20 70 53 65 73 73 69 6f  _filter, pSessio
345f0 6e 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e 53 65  n);.      p->nSe
34600 73 73 69 6f 6e 2b 2b 3b 0a 20 20 20 20 20 20 70  ssion++;.      p
34610 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 20 3d  Session->zName =
34620 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
34630 28 22 25 73 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ("%s", zName);. 
34640 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 2f 2a 20     }else.    /* 
34650 49 66 20 6e 6f 20 63 6f 6d 6d 61 6e 64 20 6e 61  If no command na
34660 6d 65 20 6d 61 74 63 68 65 73 2c 20 73 68 6f 77  me matches, show
34670 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f 72 20   a syntax error 
34680 2a 2f 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 73  */.    session_s
34690 79 6e 74 61 78 5f 65 72 72 6f 72 3a 0a 20 20 20  yntax_error:.   
346a0 20 73 65 73 73 69 6f 6e 5f 68 65 6c 70 28 70 29   session_help(p)
346b0 3b 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  ;.  }else.#endif
346c0 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ..#ifdef SQLITE_
346d0 44 45 42 55 47 0a 20 20 2f 2a 20 55 6e 64 6f 63  DEBUG.  /* Undoc
346e0 75 6d 65 6e 74 65 64 20 63 6f 6d 6d 61 6e 64 73  umented commands
346f0 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 20 74 65   for internal te
34700 73 74 69 6e 67 2e 20 20 53 75 62 6a 65 63 74 20  sting.  Subject 
34710 74 6f 20 63 68 61 6e 67 65 0a 20 20 2a 2a 20 77  to change.  ** w
34720 69 74 68 6f 75 74 20 6e 6f 74 69 63 65 2e 20 2a  ithout notice. *
34730 2f 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26  /.  if( c=='s' &
34740 26 20 6e 3e 3d 31 30 20 26 26 20 73 74 72 6e 63  & n>=10 && strnc
34750 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 65  mp(azArg[0], "se
34760 6c 66 74 65 73 74 2d 22 2c 20 39 29 3d 3d 30 20  lftest-", 9)==0 
34770 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63  ){.    if( strnc
34780 6d 70 28 61 7a 41 72 67 5b 30 5d 2b 39 2c 20 22  mp(azArg[0]+9, "
34790 62 6f 6f 6c 65 61 6e 22 2c 20 6e 2d 39 29 3d 3d  boolean", n-9)==
347a0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
347b0 2c 20 76 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  , v;.      for(i
347c0 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =1; i<nArg; i++)
347d0 7b 0a 20 20 20 20 20 20 20 20 76 20 3d 20 62 6f  {.        v = bo
347e0 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67  oleanValue(azArg
347f0 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 75 74  [i]);.        ut
34800 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
34810 2c 20 22 25 73 3a 20 25 64 20 30 78 25 78 5c 6e  , "%s: %d 0x%x\n
34820 22 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 76 2c 20  ", azArg[i], v, 
34830 76 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  v);.      }.    
34840 7d 0a 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d  }.    if( strncm
34850 70 28 61 7a 41 72 67 5b 30 5d 2b 39 2c 20 22 69  p(azArg[0]+9, "i
34860 6e 74 65 67 65 72 22 2c 20 6e 2d 39 29 3d 3d 30  nteger", n-9)==0
34870 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
34880 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 76   sqlite3_int64 v
34890 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b  ;.      for(i=1;
348a0 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
348b0 20 20 20 20 20 20 20 63 68 61 72 20 7a 42 75 66         char zBuf
348c0 5b 32 30 30 5d 3b 0a 20 20 20 20 20 20 20 20 76  [200];.        v
348d0 20 3d 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28   = integerValue(
348e0 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20  azArg[i]);.     
348f0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
34900 6e 74 66 28 73 69 7a 65 6f 66 28 7a 42 75 66 29  ntf(sizeof(zBuf)
34910 2c 7a 42 75 66 2c 22 25 73 3a 20 25 6c 6c 64 20  ,zBuf,"%s: %lld 
34920 30 78 25 6c 6c 78 5c 6e 22 2c 20 61 7a 41 72 67  0x%llx\n", azArg
34930 5b 69 5d 2c 76 2c 76 29 3b 0a 20 20 20 20 20 20  [i],v,v);.      
34940 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
34950 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 42 75 66  >out, "%s", zBuf
34960 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
34970 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
34980 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26  .  if( c=='s' &&
34990 20 6e 3e 3d 34 20 26 26 20 73 74 72 6e 63 6d 70   n>=4 && strncmp
349a0 28 61 7a 41 72 67 5b 30 5d 2c 22 73 65 6c 66 74  (azArg[0],"selft
349b0 65 73 74 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20  est",n)==0 ){.  
349c0 20 20 69 6e 74 20 62 49 73 49 6e 69 74 20 3d 20    int bIsInit = 
349d0 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72  0;         /* Tr
349e0 75 65 20 74 6f 20 69 6e 69 74 69 61 6c 69 7a 65  ue to initialize
349f0 20 74 68 65 20 53 45 4c 46 54 45 53 54 20 74 61   the SELFTEST ta
34a00 62 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62  ble */.    int b
34a10 56 65 72 62 6f 73 65 20 3d 20 30 3b 20 20 20 20  Verbose = 0;    
34a20 20 20 20 20 2f 2a 20 56 65 72 62 6f 73 65 20 6f      /* Verbose o
34a30 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 69 6e 74  utput */.    int
34a40 20 62 53 65 6c 66 74 65 73 74 45 78 69 73 74 73   bSelftestExists
34a50 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ;     /* True if
34a60 20 53 45 4c 46 54 45 53 54 20 61 6c 72 65 61 64   SELFTEST alread
34a70 79 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  y exists */.    
34a80 69 6e 74 20 69 2c 20 6b 3b 20 20 20 20 20 20 20  int i, k;       
34a90 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
34aa0 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 20   counters */.   
34ab0 20 69 6e 74 20 6e 54 65 73 74 20 3d 20 30 3b 20   int nTest = 0; 
34ac0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
34ad0 62 65 72 20 6f 66 20 74 65 73 74 73 20 72 75 6e  ber of tests run
34ae0 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 45 72  s */.    int nEr
34af0 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  r = 0;          
34b00 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
34b10 72 72 6f 72 73 20 73 65 65 6e 20 2a 2f 0a 20 20  rrors seen */.  
34b20 20 20 53 68 65 6c 6c 54 65 78 74 20 73 74 72 3b    ShellText str;
34b30 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
34b40 73 77 65 72 20 66 6f 72 20 61 20 71 75 65 72 79  swer for a query
34b50 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
34b60 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
34b70 20 2f 2a 20 51 75 65 72 79 20 61 67 61 69 6e 73   /* Query agains
34b80 74 20 74 68 65 20 53 45 4c 46 54 45 53 54 20 74  t the SELFTEST t
34b90 61 62 6c 65 20 2a 2f 0a 0a 20 20 20 20 6f 70 65  able */..    ope
34ba0 6e 5f 64 62 28 70 2c 30 29 3b 0a 20 20 20 20 66  n_db(p,0);.    f
34bb0 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20  or(i=1; i<nArg; 
34bc0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  i++){.      cons
34bd0 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a 41 72  t char *z = azAr
34be0 67 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  g[i];.      if( 
34bf0 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 7a 5b 31  z[0]=='-' && z[1
34c00 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20  ]=='-' ) z++;.  
34c10 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
34c20 2c 22 2d 69 6e 69 74 22 29 3d 3d 30 20 29 7b 0a  ,"-init")==0 ){.
34c30 20 20 20 20 20 20 20 20 62 49 73 49 6e 69 74 20          bIsInit 
34c40 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
34c50 0a 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d  .      if( strcm
34c60 70 28 7a 2c 22 2d 76 22 29 3d 3d 30 20 29 7b 0a  p(z,"-v")==0 ){.
34c70 20 20 20 20 20 20 20 20 62 56 65 72 62 6f 73 65          bVerbose
34c80 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a  ++;.      }else.
34c90 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
34ca0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
34cb0 72 72 2c 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70 74  rr, "Unknown opt
34cc0 69 6f 6e 20 5c 22 25 73 5c 22 20 6f 6e 20 5c 22  ion \"%s\" on \"
34cd0 25 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20  %s\"\n",.       
34ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 41               azA
34cf0 72 67 5b 69 5d 2c 20 61 7a 41 72 67 5b 30 5d 29  rg[i], azArg[0])
34d00 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  ;.        raw_pr
34d10 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 68  intf(stderr, "Sh
34d20 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 20  ould be one of: 
34d30 2d 2d 69 6e 69 74 20 2d 76 5c 6e 22 29 3b 0a 20  --init -v\n");. 
34d40 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
34d50 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61         goto meta
34d60 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
34d70 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
34d80 20 69 66 28 20 73 71 6c 69 74 65 33 5f 74 61 62   if( sqlite3_tab
34d90 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
34da0 74 61 28 70 2d 3e 64 62 2c 22 6d 61 69 6e 22 2c  ta(p->db,"main",
34db0 22 73 65 6c 66 74 65 73 74 22 2c 30 2c 30 2c 30  "selftest",0,0,0
34dc0 2c 30 2c 30 2c 30 29 0a 20 20 20 20 20 20 20 20  ,0,0,0).        
34dd0 20 20 20 21 3d 20 53 51 4c 49 54 45 5f 4f 4b 20     != SQLITE_OK 
34de0 29 7b 0a 20 20 20 20 20 20 62 53 65 6c 66 74 65  ){.      bSelfte
34df0 73 74 45 78 69 73 74 73 20 3d 20 30 3b 0a 20 20  stExists = 0;.  
34e00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 62    }else{.      b
34e10 53 65 6c 66 74 65 73 74 45 78 69 73 74 73 20 3d  SelftestExists =
34e20 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
34e30 28 20 62 49 73 49 6e 69 74 20 29 7b 0a 20 20 20  ( bIsInit ){.   
34e40 20 20 20 63 72 65 61 74 65 53 65 6c 66 74 65 73     createSelftes
34e50 74 54 61 62 6c 65 28 70 29 3b 0a 20 20 20 20 20  tTable(p);.     
34e60 20 62 53 65 6c 66 74 65 73 74 45 78 69 73 74 73   bSelftestExists
34e70 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
34e80 69 6e 69 74 54 65 78 74 28 26 73 74 72 29 3b 0a  initText(&str);.
34e90 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
34ea0 73 74 72 2c 20 22 78 22 2c 20 30 29 3b 0a 20 20  str, "x", 0);.  
34eb0 20 20 66 6f 72 28 6b 3d 62 53 65 6c 66 74 65 73    for(k=bSelftes
34ec0 74 45 78 69 73 74 73 3b 20 6b 3e 3d 30 3b 20 6b  tExists; k>=0; k
34ed0 2d 2d 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6b  --){.      if( k
34ee0 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ==1 ){.        r
34ef0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
34f00 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 0a 20 20  are_v2(p->db,.  
34f10 20 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43            "SELEC
34f20 54 20 74 6e 6f 2c 6f 70 2c 63 6d 64 2c 61 6e 73  T tno,op,cmd,ans
34f30 20 46 52 4f 4d 20 73 65 6c 66 74 65 73 74 20 4f   FROM selftest O
34f40 52 44 45 52 20 42 59 20 74 6e 6f 22 2c 0a 20 20  RDER BY tno",.  
34f50 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 26 70            -1, &p
34f60 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Stmt, 0);.      
34f70 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
34f80 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
34f90 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 0a 20 20  are_v2(p->db,.  
34fa0 20 20 20 20 20 20 20 20 22 56 41 4c 55 45 53 28          "VALUES(
34fb0 30 2c 27 6d 65 6d 6f 27 2c 27 4d 69 73 73 69 6e  0,'memo','Missin
34fc0 67 20 53 45 4c 46 54 45 53 54 20 74 61 62 6c 65  g SELFTEST table
34fd0 20 2d 20 64 65 66 61 75 6c 74 20 63 68 65 63 6b   - default check
34fe0 73 20 6f 6e 6c 79 27 2c 27 27 29 2c 22 0a 20 20  s only',''),".  
34ff0 20 20 20 20 20 20 20 20 22 20 20 20 20 20 20 28          "      (
35000 31 2c 27 72 75 6e 27 2c 27 50 52 41 47 4d 41 20  1,'run','PRAGMA 
35010 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b 27  integrity_check'
35020 2c 27 6f 6b 27 29 22 2c 0a 20 20 20 20 20 20 20  ,'ok')",.       
35030 20 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30     -1, &pStmt, 0
35040 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
35050 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
35060 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
35070 64 65 72 72 2c 20 22 45 72 72 6f 72 20 71 75 65  derr, "Error que
35080 72 79 69 6e 67 20 74 68 65 20 73 65 6c 66 74 65  rying the selfte
35090 73 74 20 74 61 62 6c 65 5c 6e 22 29 3b 0a 20 20  st table\n");.  
350a0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
350b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
350c0 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
350d0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61         goto meta
350e0 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
350f0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
35100 28 69 3d 31 3b 20 73 71 6c 69 74 65 33 5f 73 74  (i=1; sqlite3_st
35110 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
35120 45 5f 52 4f 57 3b 20 69 2b 2b 29 7b 0a 20 20 20  E_ROW; i++){.   
35130 20 20 20 20 20 69 6e 74 20 74 6e 6f 20 3d 20 73       int tno = s
35140 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
35150 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  t(pStmt, 0);.   
35160 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
35170 2a 7a 4f 70 20 3d 20 28 63 6f 6e 73 74 20 63 68  *zOp = (const ch
35180 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
35190 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31  mn_text(pStmt, 1
351a0 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  );.        const
351b0 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 28 63   char *zSql = (c
351c0 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
351d0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
351e0 53 74 6d 74 2c 20 32 29 3b 0a 20 20 20 20 20 20  Stmt, 2);.      
351f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
35200 6e 73 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ns = (const char
35210 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
35220 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 33 29 3b  _text(pStmt, 3);
35230 0a 0a 20 20 20 20 20 20 20 20 6b 20 3d 20 30 3b  ..        k = 0;
35240 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 56 65  .        if( bVe
35250 72 62 6f 73 65 3e 30 20 29 7b 0a 20 20 20 20 20  rbose>0 ){.     
35260 20 20 20 20 20 63 68 61 72 20 2a 7a 51 75 6f 74       char *zQuot
35270 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
35280 6e 74 66 28 22 25 71 22 2c 20 7a 53 71 6c 29 3b  ntf("%q", zSql);
35290 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74  .          print
352a0 66 28 22 25 64 3a 20 25 73 20 25 73 5c 6e 22 2c  f("%d: %s %s\n",
352b0 20 74 6e 6f 2c 20 7a 4f 70 2c 20 7a 53 71 6c 29   tno, zOp, zSql)
352c0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
352d0 74 65 33 5f 66 72 65 65 28 7a 51 75 6f 74 65 29  te3_free(zQuote)
352e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
352f0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
35300 4f 70 2c 22 6d 65 6d 6f 22 29 3d 3d 30 20 29 7b  Op,"memo")==0 ){
35310 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
35320 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
35330 25 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20  %s\n", zSql);.  
35340 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20        }else.    
35350 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a      if( strcmp(z
35360 4f 70 2c 22 72 75 6e 22 29 3d 3d 30 20 29 7b 0a  Op,"run")==0 ){.
35370 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
35380 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
35390 20 20 20 20 20 20 20 73 74 72 2e 6e 20 3d 20 30         str.n = 0
353a0 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72 2e  ;.          str.
353b0 7a 5b 30 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  z[0] = 0;.      
353c0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
353d0 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 53 71  _exec(p->db, zSq
353e0 6c 2c 20 63 61 70 74 75 72 65 4f 75 74 70 75 74  l, captureOutput
353f0 43 61 6c 6c 62 61 63 6b 2c 20 26 73 74 72 2c 20  Callback, &str, 
35400 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  &zErrMsg);.     
35410 20 20 20 20 20 6e 54 65 73 74 2b 2b 3b 0a 20 20       nTest++;.  
35420 20 20 20 20 20 20 20 20 69 66 28 20 62 56 65 72          if( bVer
35430 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  bose ){.        
35440 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
35450 70 2d 3e 6f 75 74 2c 20 22 52 65 73 75 6c 74 3a  p->out, "Result:
35460 20 25 73 5c 6e 22 2c 20 73 74 72 2e 7a 29 3b 0a   %s\n", str.z);.
35470 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
35480 20 20 20 20 20 20 69 66 28 20 72 63 20 7c 7c 20        if( rc || 
35490 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20  zErrMsg ){.     
354a0 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20         nErr++;. 
354b0 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20             rc = 
354c0 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  1;.            u
354d0 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
354e0 74 2c 20 22 25 64 3a 20 65 72 72 6f 72 2d 63 6f  t, "%d: error-co
354f0 64 65 2d 25 64 3a 20 25 73 5c 6e 22 2c 20 74 6e  de-%d: %s\n", tn
35500 6f 2c 20 72 63 2c 20 7a 45 72 72 4d 73 67 29 3b  o, rc, zErrMsg);
35510 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
35520 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73  ite3_free(zErrMs
35530 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  g);.          }e
35540 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
35550 41 6e 73 2c 73 74 72 2e 7a 29 21 3d 30 20 29 7b  Ans,str.z)!=0 ){
35560 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 45 72  .            nEr
35570 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r++;.           
35580 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
35590 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
355a0 28 70 2d 3e 6f 75 74 2c 20 22 25 64 3a 20 45 78  (p->out, "%d: Ex
355b0 70 65 63 74 65 64 3a 20 5b 25 73 5d 5c 6e 22 2c  pected: [%s]\n",
355c0 20 74 6e 6f 2c 20 7a 41 6e 73 29 3b 0a 20 20 20   tno, zAns);.   
355d0 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
355e0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64  intf(p->out, "%d
355f0 3a 20 20 20 20 20 20 47 6f 74 3a 20 5b 25 73 5d  :      Got: [%s]
35600 5c 6e 22 2c 20 74 6e 6f 2c 20 73 74 72 2e 7a 29  \n", tno, str.z)
35610 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
35620 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20        }else.    
35630 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20      {.          
35640 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
35650 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rr,.            
35660 22 55 6e 6b 6e 6f 77 6e 20 6f 70 65 72 61 74 69  "Unknown operati
35670 6f 6e 20 5c 22 25 73 5c 22 20 6f 6e 20 73 65 6c  on \"%s\" on sel
35680 66 74 65 73 74 20 6c 69 6e 65 20 25 64 5c 6e 22  ftest line %d\n"
35690 2c 20 7a 4f 70 2c 20 74 6e 6f 29 3b 0a 20 20 20  , zOp, tno);.   
356a0 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
356b0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
356c0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
356d0 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 6f 76  } /* End loop ov
356e0 65 72 20 72 6f 77 73 20 6f 66 20 63 6f 6e 74 65  er rows of conte
356f0 6e 74 20 66 72 6f 6d 20 53 45 4c 46 54 45 53 54  nt from SELFTEST
35700 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
35710 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
35720 29 3b 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20  );.    } /* End 
35730 6c 6f 6f 70 20 6f 76 65 72 20 6b 20 2a 2f 0a 20  loop over k */. 
35740 20 20 20 66 72 65 65 54 65 78 74 28 26 73 74 72     freeText(&str
35750 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  );.    utf8_prin
35760 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 20 65  tf(p->out, "%d e
35770 72 72 6f 72 73 20 6f 75 74 20 6f 66 20 25 64 20  rrors out of %d 
35780 74 65 73 74 73 5c 6e 22 2c 20 6e 45 72 72 2c 20  tests\n", nErr, 
35790 6e 54 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a  nTest);.  }else.
357a0 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26  .  if( c=='s' &&
357b0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
357c0 5d 2c 20 22 73 65 70 61 72 61 74 6f 72 22 2c 20  ], "separator", 
357d0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  n)==0 ){.    if(
357e0 20 6e 41 72 67 3c 32 20 7c 7c 20 6e 41 72 67 3e   nArg<2 || nArg>
357f0 33 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  3 ){.      raw_p
35800 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
35810 73 61 67 65 3a 20 2e 73 65 70 61 72 61 74 6f 72  sage: .separator
35820 20 43 4f 4c 20 3f 52 4f 57 3f 5c 6e 22 29 3b 0a   COL ?ROW?\n");.
35830 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
35840 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41 72 67    }.    if( nArg
35850 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  >=2 ){.      sql
35860 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
35870 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72  zeof(p->colSepar
35880 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70  ator), p->colSep
35890 61 72 61 74 6f 72 2c 0a 20 20 20 20 20 20 20 20  arator,.        
358a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
358b0 25 2e 2a 73 22 2c 20 28 69 6e 74 29 41 72 72 61  %.*s", (int)Arra
358c0 79 53 69 7a 65 28 70 2d 3e 63 6f 6c 53 65 70 61  ySize(p->colSepa
358d0 72 61 74 6f 72 29 2d 31 2c 20 61 7a 41 72 67 5b  rator)-1, azArg[
358e0 31 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  1]);.    }.    i
358f0 66 28 20 6e 41 72 67 3e 3d 33 20 29 7b 0a 20 20  f( nArg>=3 ){.  
35900 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
35910 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72  intf(sizeof(p->r
35920 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d  owSeparator), p-
35930 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 0a 20  >rowSeparator,. 
35940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35950 20 20 20 20 20 20 22 25 2e 2a 73 22 2c 20 28 69        "%.*s", (i
35960 6e 74 29 41 72 72 61 79 53 69 7a 65 28 70 2d 3e  nt)ArraySize(p->
35970 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2d 31 2c  rowSeparator)-1,
35980 20 61 7a 41 72 67 5b 32 5d 29 3b 0a 20 20 20 20   azArg[2]);.    
35990 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
359a0 20 63 3d 3d 27 73 27 20 26 26 20 6e 3e 3d 34 20   c=='s' && n>=4 
359b0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
359c0 5b 30 5d 2c 22 73 68 61 33 73 75 6d 22 2c 6e 29  [0],"sha3sum",n)
359d0 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ==0 ){.    const
359e0 20 63 68 61 72 20 2a 7a 4c 69 6b 65 20 3d 20 30   char *zLike = 0
359f0 3b 20 20 20 2f 2a 20 57 68 69 63 68 20 74 61 62  ;   /* Which tab
35a00 6c 65 20 74 6f 20 63 68 65 63 6b 73 75 6d 2e 20  le to checksum. 
35a10 30 20 6d 65 61 6e 73 20 65 76 65 72 79 74 68 69  0 means everythi
35a20 6e 67 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b  ng */.    int i;
35a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35a40 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
35a50 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 53  er */.    int bS
35a60 63 68 65 6d 61 20 3d 20 30 3b 20 20 20 20 20 20  chema = 0;      
35a70 20 20 20 2f 2a 20 41 6c 73 6f 20 68 61 73 68 20     /* Also hash 
35a80 74 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20  the schema */.  
35a90 20 20 69 6e 74 20 62 53 65 70 61 72 61 74 65 20    int bSeparate 
35aa0 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 48 61  = 0;       /* Ha
35ab0 73 68 20 65 61 63 68 20 74 61 62 6c 65 20 73 65  sh each table se
35ac0 70 61 72 61 74 65 6c 79 20 2a 2f 0a 20 20 20 20  parately */.    
35ad0 69 6e 74 20 69 53 69 7a 65 20 3d 20 32 32 34 3b  int iSize = 224;
35ae0 20 20 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68           /* Hash
35af0 20 61 6c 67 6f 72 69 74 68 6d 20 74 6f 20 75 73   algorithm to us
35b00 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 44 65  e */.    int bDe
35b10 62 75 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  bug = 0;        
35b20 20 20 2f 2a 20 4f 6e 6c 79 20 73 68 6f 77 20 74    /* Only show t
35b30 68 65 20 71 75 65 72 79 20 74 68 61 74 20 77 6f  he query that wo
35b40 75 6c 64 20 68 61 76 65 20 72 75 6e 20 2a 2f 0a  uld have run */.
35b50 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
35b60 20 2a 70 53 74 6d 74 3b 20 20 20 20 20 2f 2a 20   *pStmt;     /* 
35b70 46 6f 72 20 71 75 65 72 79 69 6e 67 20 74 61 62  For querying tab
35b80 6c 65 73 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20  les names */.   
35b90 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20   char *zSql;    
35ba0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c            /* SQL
35bb0 20 74 6f 20 62 65 20 72 75 6e 20 2a 2f 0a 20 20   to be run */.  
35bc0 20 20 63 68 61 72 20 2a 7a 53 65 70 3b 20 20 20    char *zSep;   
35bd0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 65             /* Se
35be0 70 61 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 53  parator */.    S
35bf0 68 65 6c 6c 54 65 78 74 20 73 53 71 6c 3b 20 20  hellText sSql;  
35c00 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 70 6c          /* Compl
35c10 65 74 65 20 53 51 4c 20 66 6f 72 20 74 68 65 20  ete SQL for the 
35c20 71 75 65 72 79 20 74 6f 20 72 75 6e 20 74 68 65  query to run the
35c30 20 68 61 73 68 20 2a 2f 0a 20 20 20 20 53 68 65   hash */.    She
35c40 6c 6c 54 65 78 74 20 73 51 75 65 72 79 3b 20 20  llText sQuery;  
35c50 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20        /* Set of 
35c60 71 75 65 72 69 65 73 20 75 73 65 64 20 74 6f 20  queries used to 
35c70 72 65 61 64 20 61 6c 6c 20 63 6f 6e 74 65 6e 74  read all content
35c80 20 2a 2f 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28   */.    open_db(
35c90 70 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 69  p, 0);.    for(i
35ca0 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =1; i<nArg; i++)
35cb0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
35cc0 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d  ar *z = azArg[i]
35cd0 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d  ;.      if( z[0]
35ce0 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20  =='-' ){.       
35cf0 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 66   z++;.        if
35d00 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a 2b  ( z[0]=='-' ) z+
35d10 2b 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  +;.        if( s
35d20 74 72 63 6d 70 28 7a 2c 22 73 63 68 65 6d 61 22  trcmp(z,"schema"
35d30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
35d40 20 20 62 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20    bSchema = 1;. 
35d50 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20         }else.   
35d60 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
35d70 7a 2c 22 73 68 61 33 2d 32 32 34 22 29 3d 3d 30  z,"sha3-224")==0
35d80 20 7c 7c 20 73 74 72 63 6d 70 28 7a 2c 22 73 68   || strcmp(z,"sh
35d90 61 33 2d 32 35 36 22 29 3d 3d 30 0a 20 20 20 20  a3-256")==0.    
35da0 20 20 20 20 20 7c 7c 20 73 74 72 63 6d 70 28 7a       || strcmp(z
35db0 2c 22 73 68 61 33 2d 33 38 34 22 29 3d 3d 30 20  ,"sha3-384")==0 
35dc0 7c 7c 20 73 74 72 63 6d 70 28 7a 2c 22 73 68 61  || strcmp(z,"sha
35dd0 33 2d 35 31 32 22 29 3d 3d 30 0a 20 20 20 20 20  3-512")==0.     
35de0 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
35df0 69 53 69 7a 65 20 3d 20 61 74 6f 69 28 26 7a 5b  iSize = atoi(&z[
35e00 35 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  5]);.        }el
35e10 73 65 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  se.        if( s
35e20 74 72 63 6d 70 28 7a 2c 22 64 65 62 75 67 22 29  trcmp(z,"debug")
35e30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
35e40 20 62 44 65 62 75 67 20 3d 20 31 3b 0a 20 20 20   bDebug = 1;.   
35e50 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20       }else.     
35e60 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 75     {.          u
35e70 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
35e80 72 2c 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70 74 69  r, "Unknown opti
35e90 6f 6e 20 5c 22 25 73 5c 22 20 6f 6e 20 5c 22 25  on \"%s\" on \"%
35ea0 73 5c 22 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  s\"\n",.        
35eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a                az
35ec0 41 72 67 5b 69 5d 2c 20 61 7a 41 72 67 5b 30 5d  Arg[i], azArg[0]
35ed0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  );.          raw
35ee0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
35ef0 22 53 68 6f 75 6c 64 20 62 65 20 6f 6e 65 20 6f  "Should be one o
35f00 66 3a 20 2d 2d 73 63 68 65 6d 61 22 0a 20 20 20  f: --schema".   
35f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35f20 20 20 20 20 20 20 20 20 20 20 22 20 2d 2d 73 68            " --sh
35f30 61 33 2d 32 32 34 20 2d 2d 73 68 61 33 2d 32 35  a3-224 --sha3-25
35f40 35 20 2d 2d 73 68 61 33 2d 33 38 34 20 2d 2d 73  5 --sha3-384 --s
35f50 68 61 33 2d 35 31 32 5c 6e 22 29 3b 0a 20 20 20  ha3-512\n");.   
35f60 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
35f70 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65           goto me
35f80 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
35f90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
35fa0 20 7d 65 6c 73 65 20 69 66 28 20 7a 4c 69 6b 65   }else if( zLike
35fb0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
35fc0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
35fd0 55 73 61 67 65 3a 20 2e 73 68 61 33 73 75 6d 20  Usage: .sha3sum 
35fe0 3f 4f 50 54 49 4f 4e 53 3f 20 3f 4c 49 4b 45 2d  ?OPTIONS? ?LIKE-
35ff0 50 41 54 54 45 52 4e 3f 5c 6e 22 29 3b 0a 20 20  PATTERN?\n");.  
36000 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
36010 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
36020 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
36030 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36040 20 20 20 7a 4c 69 6b 65 20 3d 20 7a 3b 0a 20 20     zLike = z;.  
36050 20 20 20 20 20 20 62 53 65 70 61 72 61 74 65 20        bSeparate 
36060 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 1;.        if(
36070 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65   sqlite3_strlike
36080 28 22 73 71 6c 69 74 65 5c 5c 5f 25 22 2c 20 7a  ("sqlite\\_%", z
36090 4c 69 6b 65 2c 20 27 5c 5c 27 29 3d 3d 30 20 29  Like, '\\')==0 )
360a0 20 62 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20   bSchema = 1;.  
360b0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
360c0 69 66 28 20 62 53 63 68 65 6d 61 20 29 7b 0a 20  if( bSchema ){. 
360d0 20 20 20 20 20 7a 53 71 6c 20 3d 20 22 53 45 4c       zSql = "SEL
360e0 45 43 54 20 6c 6f 77 65 72 28 6e 61 6d 65 29 20  ECT lower(name) 
360f0 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
36100 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  er".            
36110 20 22 20 57 48 45 52 45 20 74 79 70 65 3d 27 74   " WHERE type='t
36120 61 62 6c 65 27 20 41 4e 44 20 63 6f 61 6c 65 73  able' AND coales
36130 63 65 28 72 6f 6f 74 70 61 67 65 2c 30 29 3e 31  ce(rootpage,0)>1
36140 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ".             "
36150 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43   UNION ALL SELEC
36160 54 20 27 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  T 'sqlite_master
36170 27 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  '".             
36180 22 20 4f 52 44 45 52 20 42 59 20 31 20 63 6f 6c  " ORDER BY 1 col
36190 6c 61 74 65 20 6e 6f 63 61 73 65 22 3b 0a 20 20  late nocase";.  
361a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
361b0 53 71 6c 20 3d 20 22 53 45 4c 45 43 54 20 6c 6f  Sql = "SELECT lo
361c0 77 65 72 28 6e 61 6d 65 29 20 46 52 4f 4d 20 73  wer(name) FROM s
361d0 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20  qlite_master".  
361e0 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45             " WHE
361f0 52 45 20 74 79 70 65 3d 27 74 61 62 6c 65 27 20  RE type='table' 
36200 41 4e 44 20 63 6f 61 6c 65 73 63 65 28 72 6f 6f  AND coalesce(roo
36210 74 70 61 67 65 2c 30 29 3e 31 22 0a 20 20 20 20  tpage,0)>1".    
36220 20 20 20 20 20 20 20 20 20 22 20 41 4e 44 20 6e           " AND n
36230 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27 73 71  ame NOT LIKE 'sq
36240 6c 69 74 65 5f 25 27 22 0a 20 20 20 20 20 20 20  lite_%'".       
36250 20 20 20 20 20 20 22 20 4f 52 44 45 52 20 42 59        " ORDER BY
36260 20 31 20 63 6f 6c 6c 61 74 65 20 6e 6f 63 61 73   1 collate nocas
36270 65 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71  e";.    }.    sq
36280 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
36290 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  (p->db, zSql, -1
362a0 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
362b0 20 20 69 6e 69 74 54 65 78 74 28 26 73 51 75 65    initText(&sQue
362c0 72 79 29 3b 0a 20 20 20 20 69 6e 69 74 54 65 78  ry);.    initTex
362d0 74 28 26 73 53 71 6c 29 3b 0a 20 20 20 20 61 70  t(&sSql);.    ap
362e0 70 65 6e 64 54 65 78 74 28 26 73 53 71 6c 2c 20  pendText(&sSql, 
362f0 22 57 49 54 48 20 5b 73 68 61 33 73 75 6d 24 71  "WITH [sha3sum$q
36300 75 65 72 79 5d 28 61 2c 62 29 20 41 53 28 22 2c  uery](a,b) AS(",
36310 30 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20 22  0);.    zSep = "
36320 56 41 4c 55 45 53 28 22 3b 0a 20 20 20 20 77 68  VALUES(";.    wh
36330 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d  ile( SQLITE_ROW=
36340 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
36350 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 63 6f  tmt) ){.      co
36360 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20 3d  nst char *zTab =
36370 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
36380 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
36390 74 28 70 53 74 6d 74 2c 30 29 3b 0a 20 20 20 20  t(pStmt,0);.    
363a0 20 20 69 66 28 20 7a 4c 69 6b 65 20 26 26 20 73    if( zLike && s
363b0 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 7a  qlite3_strlike(z
363c0 4c 69 6b 65 2c 20 7a 54 61 62 2c 20 30 29 21 3d  Like, zTab, 0)!=
363d0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
363e0 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28      if( strncmp(
363f0 7a 54 61 62 2c 20 22 73 71 6c 69 74 65 5f 22 2c  zTab, "sqlite_",
36400 37 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  7)!=0 ){.       
36410 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 51 75   appendText(&sQu
36420 65 72 79 2c 22 53 45 4c 45 43 54 20 2a 20 46 52  ery,"SELECT * FR
36430 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  OM ", 0);.      
36440 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 51    appendText(&sQ
36450 75 65 72 79 2c 7a 54 61 62 2c 27 22 27 29 3b 0a  uery,zTab,'"');.
36460 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
36470 78 74 28 26 73 51 75 65 72 79 2c 22 20 4e 4f 54  xt(&sQuery," NOT
36480 20 49 4e 44 45 58 45 44 3b 22 2c 20 30 29 3b 0a   INDEXED;", 0);.
36490 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
364a0 73 74 72 63 6d 70 28 7a 54 61 62 2c 20 22 73 71  strcmp(zTab, "sq
364b0 6c 69 74 65 5f 6d 61 73 74 65 72 22 29 3d 3d 30  lite_master")==0
364c0 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65   ){.        appe
364d0 6e 64 54 65 78 74 28 26 73 51 75 65 72 79 2c 22  ndText(&sQuery,"
364e0 53 45 4c 45 43 54 20 74 79 70 65 2c 6e 61 6d 65  SELECT type,name
364f0 2c 74 62 6c 5f 6e 61 6d 65 2c 73 71 6c 20 46 52  ,tbl_name,sql FR
36500 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
36510 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
36520 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 4f               " O
36530 52 44 45 52 20 42 59 20 6e 61 6d 65 3b 22 2c 20  RDER BY name;", 
36540 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  0);.      }else 
36550 69 66 28 20 73 74 72 63 6d 70 28 7a 54 61 62 2c  if( strcmp(zTab,
36560 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63   "sqlite_sequenc
36570 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
36580 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 51    appendText(&sQ
36590 75 65 72 79 2c 22 53 45 4c 45 43 54 20 6e 61 6d  uery,"SELECT nam
365a0 65 2c 73 65 71 20 46 52 4f 4d 20 73 71 6c 69 74  e,seq FROM sqlit
365b0 65 5f 73 65 71 75 65 6e 63 65 22 0a 20 20 20 20  e_sequence".    
365c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
365d0 20 20 20 20 20 20 20 22 20 4f 52 44 45 52 20 42         " ORDER B
365e0 59 20 6e 61 6d 65 3b 22 2c 20 30 29 3b 0a 20 20  Y name;", 0);.  
365f0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
36600 72 63 6d 70 28 7a 54 61 62 2c 20 22 73 71 6c 69  rcmp(zTab, "sqli
36610 74 65 5f 73 74 61 74 31 22 29 3d 3d 30 20 29 7b  te_stat1")==0 ){
36620 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
36630 65 78 74 28 26 73 51 75 65 72 79 2c 22 53 45 4c  ext(&sQuery,"SEL
36640 45 43 54 20 74 62 6c 2c 69 64 78 2c 73 74 61 74  ECT tbl,idx,stat
36650 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61   FROM sqlite_sta
36660 74 31 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  t1".            
36670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
36680 20 4f 52 44 45 52 20 42 59 20 74 62 6c 2c 69 64   ORDER BY tbl,id
36690 78 3b 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  x;", 0);.      }
366a0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
366b0 7a 54 61 62 2c 20 22 73 71 6c 69 74 65 5f 73 74  zTab, "sqlite_st
366c0 61 74 33 22 29 3d 3d 30 0a 20 20 20 20 20 20 20  at3")==0.       
366d0 20 20 20 20 20 20 7c 7c 20 73 74 72 63 6d 70 28        || strcmp(
366e0 7a 54 61 62 2c 20 22 73 71 6c 69 74 65 5f 73 74  zTab, "sqlite_st
366f0 61 74 34 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  at4")==0 ){.    
36700 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
36710 73 51 75 65 72 79 2c 20 22 53 45 4c 45 43 54 20  sQuery, "SELECT 
36720 2a 20 46 52 4f 4d 20 22 2c 20 30 29 3b 0a 20 20  * FROM ", 0);.  
36730 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
36740 28 26 73 51 75 65 72 79 2c 20 7a 54 61 62 2c 20  (&sQuery, zTab, 
36750 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65  0);.        appe
36760 6e 64 54 65 78 74 28 26 73 51 75 65 72 79 2c 20  ndText(&sQuery, 
36770 22 20 4f 52 44 45 52 20 42 59 20 74 62 6c 2c 20  " ORDER BY tbl, 
36780 69 64 78 2c 20 72 6f 77 69 64 3b 5c 6e 22 2c 20  idx, rowid;\n", 
36790 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
367a0 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
367b0 71 6c 2c 20 7a 53 65 70 2c 20 30 29 3b 0a 20 20  ql, zSep, 0);.  
367c0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
367d0 73 53 71 6c 2c 20 73 51 75 65 72 79 2e 7a 2c 20  sSql, sQuery.z, 
367e0 27 5c 27 27 29 3b 0a 20 20 20 20 20 20 73 51 75  '\'');.      sQu
367f0 65 72 79 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20  ery.n = 0;.     
36800 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 71   appendText(&sSq
36810 6c 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20  l, ",", 0);.    
36820 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
36830 71 6c 2c 20 7a 54 61 62 2c 20 27 5c 27 27 29 3b  ql, zTab, '\'');
36840 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22 29  .      zSep = ")
36850 2c 28 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ,(";.    }.    s
36860 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
36870 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20  pStmt);.    if( 
36880 62 53 65 70 61 72 61 74 65 20 29 7b 0a 20 20 20  bSeparate ){.   
36890 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
368a0 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
368b0 20 20 20 20 20 22 25 73 29 29 22 0a 20 20 20 20       "%s))".    
368c0 20 20 20 20 20 20 22 20 53 45 4c 45 43 54 20 6c        " SELECT l
368d0 6f 77 65 72 28 68 65 78 28 73 68 61 33 5f 71 75  ower(hex(sha3_qu
368e0 65 72 79 28 61 2c 25 64 29 29 29 20 41 53 20 68  ery(a,%d))) AS h
368f0 61 73 68 2c 20 62 20 41 53 20 6c 61 62 65 6c 22  ash, b AS label"
36900 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 20 46  .          "   F
36910 52 4f 4d 20 5b 73 68 61 33 73 75 6d 24 71 75 65  ROM [sha3sum$que
36920 72 79 5d 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ry]",.          
36930 73 53 71 6c 2e 7a 2c 20 69 53 69 7a 65 29 3b 0a  sSql.z, iSize);.
36940 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36950 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
36960 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
36970 20 20 20 22 25 73 29 29 22 0a 20 20 20 20 20 20     "%s))".      
36980 20 20 20 20 22 20 53 45 4c 45 43 54 20 6c 6f 77      " SELECT low
36990 65 72 28 68 65 78 28 73 68 61 33 5f 71 75 65 72  er(hex(sha3_quer
369a0 79 28 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 61  y(group_concat(a
369b0 2c 27 27 29 2c 25 64 29 29 29 20 41 53 20 68 61  ,''),%d))) AS ha
369c0 73 68 22 0a 20 20 20 20 20 20 20 20 20 20 22 20  sh".          " 
369d0 20 20 46 52 4f 4d 20 5b 73 68 61 33 73 75 6d 24    FROM [sha3sum$
369e0 71 75 65 72 79 5d 22 2c 0a 20 20 20 20 20 20 20  query]",.       
369f0 20 20 20 73 53 71 6c 2e 7a 2c 20 69 53 69 7a 65     sSql.z, iSize
36a00 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65  );.    }.    fre
36a10 65 54 65 78 74 28 26 73 51 75 65 72 79 29 3b 0a  eText(&sQuery);.
36a20 20 20 20 20 66 72 65 65 54 65 78 74 28 26 73 53      freeText(&sS
36a30 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 62 44 65  ql);.    if( bDe
36a40 62 75 67 20 29 7b 0a 20 20 20 20 20 20 75 74 66  bug ){.      utf
36a50 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
36a60 20 22 25 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a   "%s\n", zSql);.
36a70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
36a80 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2c 20 7a   shell_exec(p, z
36a90 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  Sql, 0);.    }. 
36aa0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
36ab0 7a 53 71 6c 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  zSql);.  }else..
36ac0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4e  #ifndef SQLITE_N
36ad0 4f 48 41 56 45 5f 53 59 53 54 45 4d 0a 20 20 69  OHAVE_SYSTEM.  i
36ae0 66 28 20 63 3d 3d 27 73 27 0a 20 20 20 26 26 20  f( c=='s'.   && 
36af0 28 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30  (strncmp(azArg[0
36b00 5d 2c 20 22 73 68 65 6c 6c 22 2c 20 6e 29 3d 3d  ], "shell", n)==
36b10 30 20 7c 7c 20 73 74 72 6e 63 6d 70 28 61 7a 41  0 || strncmp(azA
36b20 72 67 5b 30 5d 2c 22 73 79 73 74 65 6d 22 2c 6e  rg[0],"system",n
36b30 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 63  )==0).  ){.    c
36b40 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20 20 20 69  har *zCmd;.    i
36b50 6e 74 20 69 2c 20 78 3b 0a 20 20 20 20 69 66 28  nt i, x;.    if(
36b60 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20   nArg<2 ){.     
36b70 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
36b80 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73 79 73  rr, "Usage: .sys
36b90 74 65 6d 20 43 4f 4d 4d 41 4e 44 5c 6e 22 29 3b  tem COMMAND\n");
36ba0 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
36bb0 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
36bc0 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
36bd0 20 7d 0a 20 20 20 20 7a 43 6d 64 20 3d 20 73 71   }.    zCmd = sq
36be0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 73 74  lite3_mprintf(st
36bf0 72 63 68 72 28 61 7a 41 72 67 5b 31 5d 2c 27 20  rchr(azArg[1],' 
36c00 27 29 3d 3d 30 3f 22 25 73 22 3a 22 5c 22 25 73  ')==0?"%s":"\"%s
36c10 5c 22 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  \"", azArg[1]);.
36c20 20 20 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 6e      for(i=2; i<n
36c30 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
36c40 20 7a 43 6d 64 20 3d 20 73 71 6c 69 74 65 33 5f   zCmd = sqlite3_
36c50 6d 70 72 69 6e 74 66 28 73 74 72 63 68 72 28 61  mprintf(strchr(a
36c60 7a 41 72 67 5b 69 5d 2c 27 20 27 29 3d 3d 30 3f  zArg[i],' ')==0?
36c70 22 25 7a 20 25 73 22 3a 22 25 7a 20 5c 22 25 73  "%z %s":"%z \"%s
36c80 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \"",.           
36c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36ca0 20 20 7a 43 6d 64 2c 20 61 7a 41 72 67 5b 69 5d    zCmd, azArg[i]
36cb0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 78 20 3d  );.    }.    x =
36cc0 20 73 79 73 74 65 6d 28 7a 43 6d 64 29 3b 0a 20   system(zCmd);. 
36cd0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
36ce0 7a 43 6d 64 29 3b 0a 20 20 20 20 69 66 28 20 78  zCmd);.    if( x
36cf0 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74   ) raw_printf(st
36d00 64 65 72 72 2c 20 22 53 79 73 74 65 6d 20 63 6f  derr, "System co
36d10 6d 6d 61 6e 64 20 72 65 74 75 72 6e 73 20 25 64  mmand returns %d
36d20 5c 6e 22 2c 20 78 29 3b 0a 20 20 7d 65 6c 73 65  \n", x);.  }else
36d30 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69  .#endif /* !defi
36d40 6e 65 64 28 53 51 4c 49 54 45 5f 4e 4f 48 41 56  ned(SQLITE_NOHAV
36d50 45 5f 53 59 53 54 45 4d 29 20 2a 2f 0a 0a 20 20  E_SYSTEM) */..  
36d60 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20 73 74  if( c=='s' && st
36d70 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
36d80 22 73 68 6f 77 22 2c 20 6e 29 3d 3d 30 20 29 7b  "show", n)==0 ){
36d90 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
36da0 74 20 63 68 61 72 20 2a 61 7a 42 6f 6f 6c 5b 5d  t char *azBool[]
36db0 20 3d 20 7b 20 22 6f 66 66 22 2c 20 22 6f 6e 22   = { "off", "on"
36dc0 2c 20 22 74 72 69 67 67 65 72 22 2c 20 22 66 75  , "trigger", "fu
36dd0 6c 6c 22 7d 3b 0a 20 20 20 20 69 6e 74 20 69 3b  ll"};.    int i;
36de0 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 31  .    if( nArg!=1
36df0 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
36e00 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
36e10 61 67 65 3a 20 2e 73 68 6f 77 5c 6e 22 29 3b 0a  age: .show\n");.
36e20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
36e30 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
36e40 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
36e50 7d 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  }.    utf8_print
36e60 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31 32 2e 31  f(p->out, "%12.1
36e70 32 73 3a 20 25 73 5c 6e 22 2c 22 65 63 68 6f 22  2s: %s\n","echo"
36e80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
36e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36ea0 20 20 20 20 61 7a 42 6f 6f 6c 5b 53 68 65 6c 6c      azBool[Shell
36eb0 48 61 73 46 6c 61 67 28 70 2c 20 53 48 46 4c 47  HasFlag(p, SHFLG
36ec0 5f 45 63 68 6f 29 5d 29 3b 0a 20 20 20 20 75 74  _Echo)]);.    ut
36ed0 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
36ee0 2c 20 22 25 31 32 2e 31 32 73 3a 20 25 73 5c 6e  , "%12.12s: %s\n
36ef0 22 2c 22 65 71 70 22 2c 20 61 7a 42 6f 6f 6c 5b  ","eqp", azBool[
36f00 70 2d 3e 61 75 74 6f 45 51 50 26 33 5d 29 3b 0a  p->autoEQP&3]);.
36f10 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
36f20 70 2d 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32 73  p->out, "%12.12s
36f30 3a 20 25 73 5c 6e 22 2c 22 65 78 70 6c 61 69 6e  : %s\n","explain
36f40 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 6d  ",.         p->m
36f50 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69  ode==MODE_Explai
36f60 6e 20 3f 20 22 6f 6e 22 20 3a 20 70 2d 3e 61 75  n ? "on" : p->au
36f70 74 6f 45 78 70 6c 61 69 6e 20 3f 20 22 61 75 74  toExplain ? "aut
36f80 6f 22 20 3a 20 22 6f 66 66 22 29 3b 0a 20 20 20  o" : "off");.   
36f90 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
36fa0 6f 75 74 2c 22 25 31 32 2e 31 32 73 3a 20 25 73  out,"%12.12s: %s
36fb0 5c 6e 22 2c 22 68 65 61 64 65 72 73 22 2c 20 61  \n","headers", a
36fc0 7a 42 6f 6f 6c 5b 70 2d 3e 73 68 6f 77 48 65 61  zBool[p->showHea
36fd0 64 65 72 21 3d 30 5d 29 3b 0a 20 20 20 20 75 74  der!=0]);.    ut
36fe0 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
36ff0 2c 20 22 25 31 32 2e 31 32 73 3a 20 25 73 5c 6e  , "%12.12s: %s\n
37000 22 2c 22 6d 6f 64 65 22 2c 20 6d 6f 64 65 44 65  ","mode", modeDe
37010 73 63 72 5b 70 2d 3e 6d 6f 64 65 5d 29 3b 0a 20  scr[p->mode]);. 
37020 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
37030 2d 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32 73 3a  ->out, "%12.12s:
37040 20 22 2c 20 22 6e 75 6c 6c 76 61 6c 75 65 22 29   ", "nullvalue")
37050 3b 0a 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63  ;.      output_c
37060 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
37070 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20  p->nullValue);. 
37080 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
37090 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  p->out, "\n");. 
370a0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
370b0 2d 3e 6f 75 74 2c 22 25 31 32 2e 31 32 73 3a 20  ->out,"%12.12s: 
370c0 25 73 5c 6e 22 2c 22 6f 75 74 70 75 74 22 2c 0a  %s\n","output",.
370d0 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 6c              strl
370e0 65 6e 33 30 28 70 2d 3e 6f 75 74 66 69 6c 65 29  en30(p->outfile)
370f0 20 3f 20 70 2d 3e 6f 75 74 66 69 6c 65 20 3a 20   ? p->outfile : 
37100 22 73 74 64 6f 75 74 22 29 3b 0a 20 20 20 20 75  "stdout");.    u
37110 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
37120 74 2c 22 25 31 32 2e 31 32 73 3a 20 22 2c 20 22  t,"%12.12s: ", "
37130 63 6f 6c 73 65 70 61 72 61 74 6f 72 22 29 3b 0a  colseparator");.
37140 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73        output_c_s
37150 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 70 2d  tring(p->out, p-
37160 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a  >colSeparator);.
37170 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
37180 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  (p->out, "\n");.
37190 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
371a0 70 2d 3e 6f 75 74 2c 22 25 31 32 2e 31 32 73 3a  p->out,"%12.12s:
371b0 20 22 2c 20 22 72 6f 77 73 65 70 61 72 61 74 6f   ", "rowseparato
371c0 72 22 29 3b 0a 20 20 20 20 20 20 6f 75 74 70 75  r");.      outpu
371d0 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75  t_c_string(p->ou
371e0 74 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  t, p->rowSeparat
371f0 6f 72 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70  or);.      raw_p
37200 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c  rintf(p->out, "\
37210 6e 22 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72  n");.    utf8_pr
37220 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31  intf(p->out, "%1
37230 32 2e 31 32 73 3a 20 25 73 5c 6e 22 2c 22 73 74  2.12s: %s\n","st
37240 61 74 73 22 2c 20 61 7a 42 6f 6f 6c 5b 70 2d 3e  ats", azBool[p->
37250 73 74 61 74 73 4f 6e 21 3d 30 5d 29 3b 0a 20 20  statsOn!=0]);.  
37260 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
37270 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32 73 3a 20  >out, "%12.12s: 
37280 22 2c 20 22 77 69 64 74 68 22 29 3b 0a 20 20 20  ", "width");.   
37290 20 66 6f 72 20 28 69 3d 30 3b 69 3c 28 69 6e 74   for (i=0;i<(int
372a0 29 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f  )ArraySize(p->co
372b0 6c 57 69 64 74 68 29 20 26 26 20 70 2d 3e 63 6f  lWidth) && p->co
372c0 6c 57 69 64 74 68 5b 69 5d 20 21 3d 20 30 3b 69  lWidth[i] != 0;i
372d0 2b 2b 29 20 7b 0a 20 20 20 20 20 20 72 61 77 5f  ++) {.      raw_
372e0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
372f0 25 64 20 22 2c 20 70 2d 3e 63 6f 6c 57 69 64 74  %d ", p->colWidt
37300 68 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  h[i]);.    }.   
37310 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
37320 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 75  ut, "\n");.    u
37330 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
37340 74 2c 20 22 25 31 32 2e 31 32 73 3a 20 25 73 5c  t, "%12.12s: %s\
37350 6e 22 2c 20 22 66 69 6c 65 6e 61 6d 65 22 2c 0a  n", "filename",.
37360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37370 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3f  p->zDbFilename ?
37380 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20   p->zDbFilename 
37390 3a 20 22 22 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  : "");.  }else..
373a0 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20    if( c=='s' && 
373b0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
373c0 2c 20 22 73 74 61 74 73 22 2c 20 6e 29 3d 3d 30  , "stats", n)==0
373d0 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
373e0 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==2 ){.      p->
373f0 73 74 61 74 73 4f 6e 20 3d 20 28 75 38 29 62 6f  statsOn = (u8)bo
37400 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67  oleanValue(azArg
37410 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  [1]);.    }else 
37420 69 66 28 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20  if( nArg==1 ){. 
37430 20 20 20 20 20 64 69 73 70 6c 61 79 5f 73 74 61       display_sta
37440 74 73 28 70 2d 3e 64 62 2c 20 70 2c 20 30 29 3b  ts(p->db, p, 0);
37450 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
37460 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
37470 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73 74  err, "Usage: .st
37480 61 74 73 20 3f 6f 6e 7c 6f 66 66 3f 5c 6e 22 29  ats ?on|off?\n")
37490 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
374a0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
374b0 20 69 66 28 20 28 63 3d 3d 27 74 27 20 26 26 20   if( (c=='t' && 
374c0 6e 3e 31 20 26 26 20 73 74 72 6e 63 6d 70 28 61  n>1 && strncmp(a
374d0 7a 41 72 67 5b 30 5d 2c 20 22 74 61 62 6c 65 73  zArg[0], "tables
374e0 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 20 7c 7c 20  ", n)==0).   || 
374f0 28 63 3d 3d 27 69 27 20 26 26 20 28 73 74 72 6e  (c=='i' && (strn
37500 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69  cmp(azArg[0], "i
37510 6e 64 69 63 65 73 22 2c 20 6e 29 3d 3d 30 0a 20  ndices", n)==0. 
37520 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37530 7c 7c 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  || strncmp(azArg
37540 5b 30 5d 2c 20 22 69 6e 64 65 78 65 73 22 2c 20  [0], "indexes", 
37550 6e 29 3d 3d 30 29 20 29 0a 20 20 29 7b 0a 20 20  n)==0) ).  ){.  
37560 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
37570 70 53 74 6d 74 3b 0a 20 20 20 20 63 68 61 72 20  pStmt;.    char 
37580 2a 2a 61 7a 52 65 73 75 6c 74 3b 0a 20 20 20 20  **azResult;.    
37590 69 6e 74 20 6e 52 6f 77 2c 20 6e 41 6c 6c 6f 63  int nRow, nAlloc
375a0 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  ;.    int ii;.  
375b0 20 20 53 68 65 6c 6c 54 65 78 74 20 73 3b 0a 20    ShellText s;. 
375c0 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 29 3b     initText(&s);
375d0 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
375e0 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  0);.    rc = sql
375f0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
37600 70 2d 3