/ Hex Artifact Content
Login

Artifact 2aa65d155202d1caf457cb7112ec47d1aded1bc54b20e7f8f7cf81ca1dbb43bf:


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 5f 48  efined(__MINGW_H
0870: 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 75 6e 69  ).# include <uni
0880: 73 74 64 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65  std.h>.# include
0890: 20 3c 64 69 72 65 6e 74 2e 68 3e 0a 23 20 69 66   <dirent.h>.# if
08a0: 20 64 65 66 69 6e 65 64 28 5f 5f 4d 49 4e 47 57   defined(__MINGW
08b0: 5f 48 29 0a 23 20 20 64 65 66 69 6e 65 20 44 49  _H).#  define DI
08c0: 52 45 4e 54 20 64 69 72 65 6e 74 0a 23 20 20 69  RENT dirent.#  i
08d0: 66 6e 64 65 66 20 53 5f 49 53 4c 4e 4b 0a 23 20  fndef S_ISLNK.# 
08e0: 20 20 64 65 66 69 6e 65 20 53 5f 49 53 4c 4e 4b    define S_ISLNK
08f0: 28 6d 6f 64 65 29 20 28 30 29 0a 23 20 20 65 6e  (mode) (0).#  en
0900: 64 69 66 0a 23 20 65 6e 64 69 66 0a 23 65 6e 64  dif.# endif.#end
0910: 69 66 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  if.#include <sys
0920: 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e 63 6c 75  /types.h>.#inclu
0930: 64 65 20 3c 73 79 73 2f 73 74 61 74 2e 68 3e 0a  de <sys/stat.h>.
0940: 0a 23 69 66 20 48 41 56 45 5f 52 45 41 44 4c 49  .#if HAVE_READLI
0950: 4e 45 0a 23 20 69 6e 63 6c 75 64 65 20 3c 72 65  NE.# include <re
0960: 61 64 6c 69 6e 65 2f 72 65 61 64 6c 69 6e 65 2e  adline/readline.
0970: 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 72 65  h>.# include <re
0980: 61 64 6c 69 6e 65 2f 68 69 73 74 6f 72 79 2e 68  adline/history.h
0990: 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 48 41  >.#endif..#if HA
09a0: 56 45 5f 45 44 49 54 4c 49 4e 45 0a 23 20 69 6e  VE_EDITLINE.# in
09b0: 63 6c 75 64 65 20 3c 65 64 69 74 6c 69 6e 65 2f  clude <editline/
09c0: 72 65 61 64 6c 69 6e 65 2e 68 3e 0a 23 65 6e 64  readline.h>.#end
09d0: 69 66 0a 0a 23 69 66 20 48 41 56 45 5f 45 44 49  if..#if HAVE_EDI
09e0: 54 4c 49 4e 45 20 7c 7c 20 48 41 56 45 5f 52 45  TLINE || HAVE_RE
09f0: 41 44 4c 49 4e 45 0a 0a 23 20 64 65 66 69 6e 65  ADLINE..# define
0a00: 20 73 68 65 6c 6c 5f 61 64 64 5f 68 69 73 74 6f   shell_add_histo
0a10: 72 79 28 58 29 20 61 64 64 5f 68 69 73 74 6f 72  ry(X) add_histor
0a20: 79 28 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68  y(X).# define sh
0a30: 65 6c 6c 5f 72 65 61 64 5f 68 69 73 74 6f 72 79  ell_read_history
0a40: 28 58 29 20 72 65 61 64 5f 68 69 73 74 6f 72 79  (X) read_history
0a50: 28 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65  (X).# define she
0a60: 6c 6c 5f 77 72 69 74 65 5f 68 69 73 74 6f 72 79  ll_write_history
0a70: 28 58 29 20 77 72 69 74 65 5f 68 69 73 74 6f 72  (X) write_histor
0a80: 79 28 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68  y(X).# define sh
0a90: 65 6c 6c 5f 73 74 69 66 6c 65 5f 68 69 73 74 6f  ell_stifle_histo
0aa0: 72 79 28 58 29 20 73 74 69 66 6c 65 5f 68 69 73  ry(X) stifle_his
0ab0: 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e 65  tory(X).# define
0ac0: 20 73 68 65 6c 6c 5f 72 65 61 64 6c 69 6e 65 28   shell_readline(
0ad0: 58 29 20 72 65 61 64 6c 69 6e 65 28 58 29 0a 0a  X) readline(X)..
0ae0: 23 65 6c 69 66 20 48 41 56 45 5f 4c 49 4e 45 4e  #elif HAVE_LINEN
0af0: 4f 49 53 45 0a 0a 23 20 69 6e 63 6c 75 64 65 20  OISE..# include 
0b00: 22 6c 69 6e 65 6e 6f 69 73 65 2e 68 22 0a 23 20  "linenoise.h".# 
0b10: 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 61 64 64  define shell_add
0b20: 5f 68 69 73 74 6f 72 79 28 58 29 20 6c 69 6e 65  _history(X) line
0b30: 6e 6f 69 73 65 48 69 73 74 6f 72 79 41 64 64 28  noiseHistoryAdd(
0b40: 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c  X).# define shel
0b50: 6c 5f 72 65 61 64 5f 68 69 73 74 6f 72 79 28 58  l_read_history(X
0b60: 29 20 6c 69 6e 65 6e 6f 69 73 65 48 69 73 74 6f  ) linenoiseHisto
0b70: 72 79 4c 6f 61 64 28 58 29 0a 23 20 64 65 66 69  ryLoad(X).# defi
0b80: 6e 65 20 73 68 65 6c 6c 5f 77 72 69 74 65 5f 68  ne shell_write_h
0b90: 69 73 74 6f 72 79 28 58 29 20 6c 69 6e 65 6e 6f  istory(X) lineno
0ba0: 69 73 65 48 69 73 74 6f 72 79 53 61 76 65 28 58  iseHistorySave(X
0bb0: 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c  ).# define shell
0bc0: 5f 73 74 69 66 6c 65 5f 68 69 73 74 6f 72 79 28  _stifle_history(
0bd0: 58 29 20 6c 69 6e 65 6e 6f 69 73 65 48 69 73 74  X) linenoiseHist
0be0: 6f 72 79 53 65 74 4d 61 78 4c 65 6e 28 58 29 0a  orySetMaxLen(X).
0bf0: 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 72  # define shell_r
0c00: 65 61 64 6c 69 6e 65 28 58 29 20 6c 69 6e 65 6e  eadline(X) linen
0c10: 6f 69 73 65 28 58 29 0a 0a 23 65 6c 73 65 0a 0a  oise(X)..#else..
0c20: 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 72  # define shell_r
0c30: 65 61 64 5f 68 69 73 74 6f 72 79 28 58 29 0a 23  ead_history(X).#
0c40: 20 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 77 72   define shell_wr
0c50: 69 74 65 5f 68 69 73 74 6f 72 79 28 58 29 0a 23  ite_history(X).#
0c60: 20 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 73 74   define shell_st
0c70: 69 66 6c 65 5f 68 69 73 74 6f 72 79 28 58 29 0a  ifle_history(X).
0c80: 0a 23 20 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f  .# define SHELL_
0c90: 55 53 45 5f 4c 4f 43 41 4c 5f 47 45 54 4c 49 4e  USE_LOCAL_GETLIN
0ca0: 45 20 31 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66  E 1.#endif...#if
0cb0: 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29   defined(_WIN32)
0cc0: 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33   || defined(WIN3
0cd0: 32 29 0a 23 20 69 6e 63 6c 75 64 65 20 3c 69 6f  2).# include <io
0ce0: 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 66  .h>.# include <f
0cf0: 63 6e 74 6c 2e 68 3e 0a 23 20 64 65 66 69 6e 65  cntl.h>.# define
0d00: 20 69 73 61 74 74 79 28 68 29 20 5f 69 73 61 74   isatty(h) _isat
0d10: 74 79 28 68 29 0a 23 20 69 66 6e 64 65 66 20 61  ty(h).# ifndef a
0d20: 63 63 65 73 73 0a 23 20 20 64 65 66 69 6e 65 20  ccess.#  define 
0d30: 61 63 63 65 73 73 28 66 2c 6d 29 20 5f 61 63 63  access(f,m) _acc
0d40: 65 73 73 28 28 66 29 2c 28 6d 29 29 0a 23 20 65  ess((f),(m)).# e
0d50: 6e 64 69 66 0a 23 20 75 6e 64 65 66 20 70 6f 70  ndif.# undef pop
0d60: 65 6e 0a 23 20 64 65 66 69 6e 65 20 70 6f 70 65  en.# define pope
0d70: 6e 20 5f 70 6f 70 65 6e 0a 23 20 75 6e 64 65 66  n _popen.# undef
0d80: 20 70 63 6c 6f 73 65 0a 23 20 64 65 66 69 6e 65   pclose.# define
0d90: 20 70 63 6c 6f 73 65 20 5f 70 63 6c 6f 73 65 0a   pclose _pclose.
0da0: 23 65 6c 73 65 0a 20 2f 2a 20 4d 61 6b 65 20 73  #else. /* Make s
0db0: 75 72 65 20 69 73 61 74 74 79 28 29 20 68 61 73  ure isatty() has
0dc0: 20 61 20 70 72 6f 74 6f 74 79 70 65 2e 20 2a 2f   a prototype. */
0dd0: 0a 20 65 78 74 65 72 6e 20 69 6e 74 20 69 73 61  . extern int isa
0de0: 74 74 79 28 69 6e 74 29 3b 0a 0a 23 20 69 66 20  tty(int);..# if 
0df0: 21 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f  !defined(__RTP__
0e00: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 57  ) && !defined(_W
0e10: 52 53 5f 4b 45 52 4e 45 4c 29 0a 20 20 2f 2a 20  RS_KERNEL).  /* 
0e20: 70 6f 70 65 6e 20 61 6e 64 20 70 63 6c 6f 73 65  popen and pclose
0e30: 20 61 72 65 20 6e 6f 74 20 43 38 39 20 66 75 6e   are not C89 fun
0e40: 63 74 69 6f 6e 73 20 61 6e 64 20 73 6f 20 61 72  ctions and so ar
0e50: 65 0a 20 20 2a 2a 20 73 6f 6d 65 74 69 6d 65 73  e.  ** sometimes
0e60: 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68   omitted from th
0e70: 65 20 3c 73 74 64 69 6f 2e 68 3e 20 68 65 61 64  e <stdio.h> head
0e80: 65 72 20 2a 2f 0a 20 20 20 65 78 74 65 72 6e 20  er */.   extern 
0e90: 46 49 4c 45 20 2a 70 6f 70 65 6e 28 63 6f 6e 73  FILE *popen(cons
0ea0: 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68  t char*,const ch
0eb0: 61 72 2a 29 3b 0a 20 20 20 65 78 74 65 72 6e 20  ar*);.   extern 
0ec0: 69 6e 74 20 70 63 6c 6f 73 65 28 46 49 4c 45 2a  int pclose(FILE*
0ed0: 29 3b 0a 23 20 65 6c 73 65 0a 23 20 20 64 65 66  );.# else.#  def
0ee0: 69 6e 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ine SQLITE_OMIT_
0ef0: 50 4f 50 45 4e 20 31 0a 23 20 65 6e 64 69 66 0a  POPEN 1.# endif.
0f00: 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
0f10: 6e 65 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a  ned(_WIN32_WCE).
0f20: 2f 2a 20 57 69 6e 64 6f 77 73 20 43 45 20 28 61  /* Windows CE (a
0f30: 72 6d 2d 77 69 6e 63 65 2d 6d 69 6e 67 77 33 32  rm-wince-mingw32
0f40: 63 65 2d 67 63 63 29 20 64 6f 65 73 20 6e 6f 74  ce-gcc) does not
0f50: 20 70 72 6f 76 69 64 65 20 69 73 61 74 74 79 28   provide isatty(
0f60: 29 0a 20 2a 20 74 68 75 73 20 77 65 20 61 6c 77  ). * thus we alw
0f70: 61 79 73 20 61 73 73 75 6d 65 20 74 68 61 74 20  ays assume that 
0f80: 77 65 20 68 61 76 65 20 61 20 63 6f 6e 73 6f 6c  we have a consol
0f90: 65 2e 20 54 68 61 74 20 63 61 6e 20 62 65 0a 20  e. That can be. 
0fa0: 2a 20 6f 76 65 72 72 69 64 64 65 6e 20 77 69 74  * overridden wit
0fb0: 68 20 74 68 65 20 2d 62 61 74 63 68 20 63 6f 6d  h the -batch com
0fc0: 6d 61 6e 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e  mand line option
0fd0: 2e 0a 20 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73  .. */.#define is
0fe0: 61 74 74 79 28 78 29 20 31 0a 23 65 6e 64 69 66  atty(x) 1.#endif
0ff0: 0a 0a 2f 2a 20 63 74 79 70 65 20 6d 61 63 72 6f  ../* ctype macro
1000: 73 20 74 68 61 74 20 77 6f 72 6b 20 77 69 74 68  s that work with
1010: 20 73 69 67 6e 65 64 20 63 68 61 72 61 63 74 65   signed characte
1020: 72 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 49 73  rs */.#define Is
1030: 53 70 61 63 65 28 58 29 20 20 69 73 73 70 61 63  Space(X)  isspac
1040: 65 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  e((unsigned char
1050: 29 58 29 0a 23 64 65 66 69 6e 65 20 49 73 44 69  )X).#define IsDi
1060: 67 69 74 28 58 29 20 20 69 73 64 69 67 69 74 28  git(X)  isdigit(
1070: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 58  (unsigned char)X
1080: 29 0a 23 64 65 66 69 6e 65 20 54 6f 4c 6f 77 65  ).#define ToLowe
1090: 72 28 58 29 20 20 28 63 68 61 72 29 74 6f 6c 6f  r(X)  (char)tolo
10a0: 77 65 72 28 28 75 6e 73 69 67 6e 65 64 20 63 68  wer((unsigned ch
10b0: 61 72 29 58 29 0a 0a 23 69 66 20 64 65 66 69 6e  ar)X)..#if defin
10c0: 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65  ed(_WIN32) || de
10d0: 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 23 69 6e  fined(WIN32).#in
10e0: 63 6c 75 64 65 20 3c 77 69 6e 64 6f 77 73 2e 68  clude <windows.h
10f0: 3e 0a 0a 2f 2a 20 73 74 72 69 6e 67 20 63 6f 6e  >../* string con
1100: 76 65 72 73 69 6f 6e 20 72 6f 75 74 69 6e 65 73  version routines
1110: 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20 6f 6e 20   only needed on 
1120: 57 69 6e 33 32 20 2a 2f 0a 65 78 74 65 72 6e 20  Win32 */.extern 
1130: 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69  char *sqlite3_wi
1140: 6e 33 32 5f 75 6e 69 63 6f 64 65 5f 74 6f 5f 75  n32_unicode_to_u
1150: 74 66 38 28 4c 50 43 57 53 54 52 29 3b 0a 65 78  tf8(LPCWSTR);.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 6d 62 63 73 5f 74 6f  e3_win32_mbcs_to
1180: 5f 75 74 66 38 5f 76 32 28 63 6f 6e 73 74 20 63  _utf8_v2(const c
1190: 68 61 72 20 2a 2c 20 69 6e 74 29 3b 0a 65 78 74  har *, int);.ext
11a0: 65 72 6e 20 63 68 61 72 20 2a 73 71 6c 69 74 65  ern char *sqlite
11b0: 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f  3_win32_utf8_to_
11c0: 6d 62 63 73 5f 76 32 28 63 6f 6e 73 74 20 63 68  mbcs_v2(const ch
11d0: 61 72 20 2a 2c 20 69 6e 74 29 3b 0a 65 78 74 65  ar *, int);.exte
11e0: 72 6e 20 4c 50 57 53 54 52 20 73 71 6c 69 74 65  rn LPWSTR sqlite
11f0: 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f  3_win32_utf8_to_
1200: 75 6e 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68  unicode(const ch
1210: 61 72 20 2a 7a 54 65 78 74 29 3b 0a 23 65 6e 64  ar *zText);.#end
1220: 69 66 0a 0a 2f 2a 20 4f 6e 20 57 69 6e 64 6f 77  if../* On Window
1230: 73 2c 20 77 65 20 6e 6f 72 6d 61 6c 6c 79 20 72  s, we normally r
1240: 75 6e 20 77 69 74 68 20 6f 75 74 70 75 74 20 6d  un with output m
1250: 6f 64 65 20 6f 66 20 54 45 58 54 20 73 6f 20 74  ode of TEXT so t
1260: 68 61 74 20 5c 6e 20 63 68 61 72 61 63 74 65 72  hat \n character
1270: 73 0a 2a 2a 20 61 72 65 20 61 75 74 6f 6d 61 74  s.** are automat
1280: 69 63 61 6c 6c 79 20 74 72 61 6e 73 6c 61 74 65  ically translate
1290: 64 20 69 6e 74 6f 20 5c 72 5c 6e 2e 20 20 48 6f  d into \r\n.  Ho
12a0: 77 65 76 65 72 2c 20 74 68 69 73 20 62 65 68 61  wever, this beha
12b0: 76 69 6f 72 20 6e 65 65 64 73 0a 2a 2a 20 74 6f  vior needs.** to
12c0: 20 62 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20   be disabled in 
12d0: 73 6f 6d 65 20 63 61 73 65 73 20 28 65 78 3a 20  some cases (ex: 
12e0: 77 68 65 6e 20 67 65 6e 65 72 61 74 69 6e 67 20  when generating 
12f0: 43 53 56 20 6f 75 74 70 75 74 20 61 6e 64 20 77  CSV output and w
1300: 68 65 6e 0a 2a 2a 20 72 65 6e 64 65 72 69 6e 67  hen.** rendering
1310: 20 71 75 6f 74 65 64 20 73 74 72 69 6e 67 73 20   quoted strings 
1320: 74 68 61 74 20 63 6f 6e 74 61 69 6e 20 5c 6e 20  that contain \n 
1330: 63 68 61 72 61 63 74 65 72 73 29 2e 20 20 54 68  characters).  Th
1340: 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72  e following.** r
1350: 6f 75 74 69 6e 65 73 20 74 61 6b 65 20 63 61 72  outines take car
1360: 65 20 6f 66 20 74 68 61 74 2e 0a 2a 2f 0a 23 69  e of that..*/.#i
1370: 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32  f defined(_WIN32
1380: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e  ) || defined(WIN
1390: 33 32 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  32).static void 
13a0: 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28 46 49  setBinaryMode(FI
13b0: 4c 45 20 2a 66 69 6c 65 2c 20 69 6e 74 20 69 73  LE *file, int is
13c0: 4f 75 74 70 75 74 29 7b 0a 20 20 69 66 28 20 69  Output){.  if( i
13d0: 73 4f 75 74 70 75 74 20 29 20 66 66 6c 75 73 68  sOutput ) fflush
13e0: 28 66 69 6c 65 29 3b 0a 20 20 5f 73 65 74 6d 6f  (file);.  _setmo
13f0: 64 65 28 5f 66 69 6c 65 6e 6f 28 66 69 6c 65 29  de(_fileno(file)
1400: 2c 20 5f 4f 5f 42 49 4e 41 52 59 29 3b 0a 7d 0a  , _O_BINARY);.}.
1410: 73 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 54  static void setT
1420: 65 78 74 4d 6f 64 65 28 46 49 4c 45 20 2a 66 69  extMode(FILE *fi
1430: 6c 65 2c 20 69 6e 74 20 69 73 4f 75 74 70 75 74  le, int isOutput
1440: 29 7b 0a 20 20 69 66 28 20 69 73 4f 75 74 70 75  ){.  if( isOutpu
1450: 74 20 29 20 66 66 6c 75 73 68 28 66 69 6c 65 29  t ) fflush(file)
1460: 3b 0a 20 20 5f 73 65 74 6d 6f 64 65 28 5f 66 69  ;.  _setmode(_fi
1470: 6c 65 6e 6f 28 66 69 6c 65 29 2c 20 5f 4f 5f 54  leno(file), _O_T
1480: 45 58 54 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20  EXT);.}.#else.# 
1490: 64 65 66 69 6e 65 20 73 65 74 42 69 6e 61 72 79  define setBinary
14a0: 4d 6f 64 65 28 58 2c 59 29 0a 23 20 64 65 66 69  Mode(X,Y).# defi
14b0: 6e 65 20 73 65 74 54 65 78 74 4d 6f 64 65 28 58  ne setTextMode(X
14c0: 2c 59 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 20  ,Y).#endif.../* 
14d0: 54 72 75 65 20 69 66 20 74 68 65 20 74 69 6d 65  True if the time
14e0: 72 20 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a  r is enabled */.
14f0: 73 74 61 74 69 63 20 69 6e 74 20 65 6e 61 62 6c  static int enabl
1500: 65 54 69 6d 65 72 20 3d 20 30 3b 0a 0a 2f 2a 20  eTimer = 0;../* 
1510: 52 65 74 75 72 6e 20 74 68 65 20 63 75 72 72 65  Return the curre
1520: 6e 74 20 77 61 6c 6c 2d 63 6c 6f 63 6b 20 74 69  nt wall-clock ti
1530: 6d 65 20 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c  me */.static sql
1540: 69 74 65 33 5f 69 6e 74 36 34 20 74 69 6d 65 4f  ite3_int64 timeO
1550: 66 44 61 79 28 76 6f 69 64 29 7b 0a 20 20 73 74  fDay(void){.  st
1560: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73  atic sqlite3_vfs
1570: 20 2a 63 6c 6f 63 6b 56 66 73 20 3d 20 30 3b 0a   *clockVfs = 0;.
1580: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
1590: 74 3b 0a 20 20 69 66 28 20 63 6c 6f 63 6b 56 66  t;.  if( clockVf
15a0: 73 3d 3d 30 20 29 20 63 6c 6f 63 6b 56 66 73 20  s==0 ) clockVfs 
15b0: 3d 20 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  = sqlite3_vfs_fi
15c0: 6e 64 28 30 29 3b 0a 20 20 69 66 28 20 63 6c 6f  nd(0);.  if( clo
15d0: 63 6b 56 66 73 2d 3e 69 56 65 72 73 69 6f 6e 3e  ckVfs->iVersion>
15e0: 3d 32 20 26 26 20 63 6c 6f 63 6b 56 66 73 2d 3e  =2 && clockVfs->
15f0: 78 43 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36  xCurrentTimeInt6
1600: 34 21 3d 30 20 29 7b 0a 20 20 20 20 63 6c 6f 63  4!=0 ){.    cloc
1610: 6b 56 66 73 2d 3e 78 43 75 72 72 65 6e 74 54 69  kVfs->xCurrentTi
1620: 6d 65 49 6e 74 36 34 28 63 6c 6f 63 6b 56 66 73  meInt64(clockVfs
1630: 2c 20 26 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  , &t);.  }else{.
1640: 20 20 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20      double r;.  
1650: 20 20 63 6c 6f 63 6b 56 66 73 2d 3e 78 43 75 72    clockVfs->xCur
1660: 72 65 6e 74 54 69 6d 65 28 63 6c 6f 63 6b 56 66  rentTime(clockVf
1670: 73 2c 20 26 72 29 3b 0a 20 20 20 20 74 20 3d 20  s, &r);.    t = 
1680: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28  (sqlite3_int64)(
1690: 72 2a 38 36 34 30 30 30 30 30 2e 30 29 3b 0a 20  r*86400000.0);. 
16a0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 74 3b 0a 7d   }.  return t;.}
16b0: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f  ..#if !defined(_
16c0: 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69 6e  WIN32) && !defin
16d0: 65 64 28 57 49 4e 33 32 29 20 26 26 20 21 64 65  ed(WIN32) && !de
16e0: 66 69 6e 65 64 28 5f 5f 6d 69 6e 75 78 29 0a 23  fined(__minux).#
16f0: 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d  include <sys/tim
1700: 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73  e.h>.#include <s
1710: 79 73 2f 72 65 73 6f 75 72 63 65 2e 68 3e 0a 0a  ys/resource.h>..
1720: 2f 2a 20 56 78 57 6f 72 6b 73 20 64 6f 65 73 20  /* VxWorks does 
1730: 6e 6f 74 20 73 75 70 70 6f 72 74 20 67 65 74 72  not support getr
1740: 75 73 61 67 65 28 29 20 61 73 20 66 61 72 20 61  usage() as far a
1750: 73 20 77 65 20 63 61 6e 20 64 65 74 65 72 6d 69  s we can determi
1760: 6e 65 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  ne */.#if define
1770: 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 20 7c  d(_WRS_KERNEL) |
1780: 7c 20 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f  | defined(__RTP_
1790: 5f 29 0a 73 74 72 75 63 74 20 72 75 73 61 67 65  _).struct rusage
17a0: 20 7b 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65   {.  struct time
17b0: 76 61 6c 20 72 75 5f 75 74 69 6d 65 3b 20 2f 2a  val ru_utime; /*
17c0: 20 75 73 65 72 20 43 50 55 20 74 69 6d 65 20 75   user CPU time u
17d0: 73 65 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  sed */.  struct 
17e0: 74 69 6d 65 76 61 6c 20 72 75 5f 73 74 69 6d 65  timeval ru_stime
17f0: 3b 20 2f 2a 20 73 79 73 74 65 6d 20 43 50 55 20  ; /* system CPU 
1800: 74 69 6d 65 20 75 73 65 64 20 2a 2f 0a 7d 3b 0a  time used */.};.
1810: 23 64 65 66 69 6e 65 20 67 65 74 72 75 73 61 67  #define getrusag
1820: 65 28 41 2c 42 29 20 6d 65 6d 73 65 74 28 42 2c  e(A,B) memset(B,
1830: 30 2c 73 69 7a 65 6f 66 28 2a 42 29 29 0a 23 65  0,sizeof(*B)).#e
1840: 6e 64 69 66 0a 0a 2f 2a 20 53 61 76 65 64 20 72  ndif../* Saved r
1850: 65 73 6f 75 72 63 65 20 69 6e 66 6f 72 6d 61 74  esource informat
1860: 69 6f 6e 20 66 6f 72 20 74 68 65 20 62 65 67 69  ion for the begi
1870: 6e 6e 69 6e 67 20 6f 66 20 61 6e 20 6f 70 65 72  nning of an oper
1880: 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20  ation */.static 
1890: 73 74 72 75 63 74 20 72 75 73 61 67 65 20 73 42  struct rusage sB
18a0: 65 67 69 6e 3b 20 20 2f 2a 20 43 50 55 20 74 69  egin;  /* CPU ti
18b0: 6d 65 20 61 74 20 73 74 61 72 74 20 2a 2f 0a 73  me at start */.s
18c0: 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e  tatic sqlite3_in
18d0: 74 36 34 20 69 42 65 67 69 6e 3b 20 20 2f 2a 20  t64 iBegin;  /* 
18e0: 57 61 6c 6c 2d 63 6c 6f 63 6b 20 74 69 6d 65 20  Wall-clock time 
18f0: 61 74 20 73 74 61 72 74 20 2a 2f 0a 0a 2f 2a 0a  at start */../*.
1900: 2a 2a 20 42 65 67 69 6e 20 74 69 6d 69 6e 67 20  ** Begin timing 
1910: 61 6e 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2f 0a  an operation.*/.
1920: 73 74 61 74 69 63 20 76 6f 69 64 20 62 65 67 69  static void begi
1930: 6e 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a 20 20  nTimer(void){.  
1940: 69 66 28 20 65 6e 61 62 6c 65 54 69 6d 65 72 20  if( enableTimer 
1950: 29 7b 0a 20 20 20 20 67 65 74 72 75 73 61 67 65  ){.    getrusage
1960: 28 52 55 53 41 47 45 5f 53 45 4c 46 2c 20 26 73  (RUSAGE_SELF, &s
1970: 42 65 67 69 6e 29 3b 0a 20 20 20 20 69 42 65 67  Begin);.    iBeg
1980: 69 6e 20 3d 20 74 69 6d 65 4f 66 44 61 79 28 29  in = timeOfDay()
1990: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 74 75  ;.  }.}../* Retu
19a0: 72 6e 20 74 68 65 20 64 69 66 66 65 72 65 6e 63  rn the differenc
19b0: 65 20 6f 66 20 74 77 6f 20 74 69 6d 65 5f 73 74  e of two time_st
19c0: 72 75 63 74 73 20 69 6e 20 73 65 63 6f 6e 64 73  ructs in seconds
19d0: 20 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75 62 6c   */.static doubl
19e0: 65 20 74 69 6d 65 44 69 66 66 28 73 74 72 75 63  e timeDiff(struc
19f0: 74 20 74 69 6d 65 76 61 6c 20 2a 70 53 74 61 72  t timeval *pStar
1a00: 74 2c 20 73 74 72 75 63 74 20 74 69 6d 65 76 61  t, struct timeva
1a10: 6c 20 2a 70 45 6e 64 29 7b 0a 20 20 72 65 74 75  l *pEnd){.  retu
1a20: 72 6e 20 28 70 45 6e 64 2d 3e 74 76 5f 75 73 65  rn (pEnd->tv_use
1a30: 63 20 2d 20 70 53 74 61 72 74 2d 3e 74 76 5f 75  c - pStart->tv_u
1a40: 73 65 63 29 2a 30 2e 30 30 30 30 30 31 20 2b 0a  sec)*0.000001 +.
1a50: 20 20 20 20 20 20 20 20 20 28 64 6f 75 62 6c 65           (double
1a60: 29 28 70 45 6e 64 2d 3e 74 76 5f 73 65 63 20 2d  )(pEnd->tv_sec -
1a70: 20 70 53 74 61 72 74 2d 3e 74 76 5f 73 65 63 29   pStart->tv_sec)
1a80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74  ;.}../*.** Print
1a90: 20 74 68 65 20 74 69 6d 69 6e 67 20 72 65 73 75   the timing resu
1aa0: 6c 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  lts..*/.static v
1ab0: 6f 69 64 20 65 6e 64 54 69 6d 65 72 28 76 6f 69  oid endTimer(voi
1ac0: 64 29 7b 0a 20 20 69 66 28 20 65 6e 61 62 6c 65  d){.  if( enable
1ad0: 54 69 6d 65 72 20 29 7b 0a 20 20 20 20 73 71 6c  Timer ){.    sql
1ae0: 69 74 65 33 5f 69 6e 74 36 34 20 69 45 6e 64 20  ite3_int64 iEnd 
1af0: 3d 20 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a 20  = timeOfDay();. 
1b00: 20 20 20 73 74 72 75 63 74 20 72 75 73 61 67 65     struct rusage
1b10: 20 73 45 6e 64 3b 0a 20 20 20 20 67 65 74 72 75   sEnd;.    getru
1b20: 73 61 67 65 28 52 55 53 41 47 45 5f 53 45 4c 46  sage(RUSAGE_SELF
1b30: 2c 20 26 73 45 6e 64 29 3b 0a 20 20 20 20 70 72  , &sEnd);.    pr
1b40: 69 6e 74 66 28 22 52 75 6e 20 54 69 6d 65 3a 20  intf("Run Time: 
1b50: 72 65 61 6c 20 25 2e 33 66 20 75 73 65 72 20 25  real %.3f user %
1b60: 66 20 73 79 73 20 25 66 5c 6e 22 2c 0a 20 20 20  f sys %f\n",.   
1b70: 20 20 20 20 28 69 45 6e 64 20 2d 20 69 42 65 67      (iEnd - iBeg
1b80: 69 6e 29 2a 30 2e 30 30 31 2c 0a 20 20 20 20 20  in)*0.001,.     
1b90: 20 20 74 69 6d 65 44 69 66 66 28 26 73 42 65 67    timeDiff(&sBeg
1ba0: 69 6e 2e 72 75 5f 75 74 69 6d 65 2c 20 26 73 45  in.ru_utime, &sE
1bb0: 6e 64 2e 72 75 5f 75 74 69 6d 65 29 2c 0a 20 20  nd.ru_utime),.  
1bc0: 20 20 20 20 20 74 69 6d 65 44 69 66 66 28 26 73       timeDiff(&s
1bd0: 42 65 67 69 6e 2e 72 75 5f 73 74 69 6d 65 2c 20  Begin.ru_stime, 
1be0: 26 73 45 6e 64 2e 72 75 5f 73 74 69 6d 65 29 29  &sEnd.ru_stime))
1bf0: 3b 0a 20 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65  ;.  }.}..#define
1c00: 20 42 45 47 49 4e 5f 54 49 4d 45 52 20 62 65 67   BEGIN_TIMER beg
1c10: 69 6e 54 69 6d 65 72 28 29 0a 23 64 65 66 69 6e  inTimer().#defin
1c20: 65 20 45 4e 44 5f 54 49 4d 45 52 20 65 6e 64 54  e END_TIMER endT
1c30: 69 6d 65 72 28 29 0a 23 64 65 66 69 6e 65 20 48  imer().#define H
1c40: 41 53 5f 54 49 4d 45 52 20 31 0a 0a 23 65 6c 69  AS_TIMER 1..#eli
1c50: 66 20 28 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  f (defined(_WIN3
1c60: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49  2) || defined(WI
1c70: 4e 33 32 29 29 0a 0a 2f 2a 20 53 61 76 65 64 20  N32))../* Saved 
1c80: 72 65 73 6f 75 72 63 65 20 69 6e 66 6f 72 6d 61  resource informa
1c90: 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 62 65 67  tion for the beg
1ca0: 69 6e 6e 69 6e 67 20 6f 66 20 61 6e 20 6f 70 65  inning of an ope
1cb0: 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63  ration */.static
1cc0: 20 48 41 4e 44 4c 45 20 68 50 72 6f 63 65 73 73   HANDLE hProcess
1cd0: 3b 0a 73 74 61 74 69 63 20 46 49 4c 45 54 49 4d  ;.static FILETIM
1ce0: 45 20 66 74 4b 65 72 6e 65 6c 42 65 67 69 6e 3b  E ftKernelBegin;
1cf0: 0a 73 74 61 74 69 63 20 46 49 4c 45 54 49 4d 45  .static FILETIME
1d00: 20 66 74 55 73 65 72 42 65 67 69 6e 3b 0a 73 74   ftUserBegin;.st
1d10: 61 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 74  atic sqlite3_int
1d20: 36 34 20 66 74 57 61 6c 6c 42 65 67 69 6e 3b 0a  64 ftWallBegin;.
1d30: 74 79 70 65 64 65 66 20 42 4f 4f 4c 20 28 57 49  typedef BOOL (WI
1d40: 4e 41 50 49 20 2a 47 45 54 50 52 4f 43 54 49 4d  NAPI *GETPROCTIM
1d50: 45 53 29 28 48 41 4e 44 4c 45 2c 20 4c 50 46 49  ES)(HANDLE, LPFI
1d60: 4c 45 54 49 4d 45 2c 20 4c 50 46 49 4c 45 54 49  LETIME, LPFILETI
1d70: 4d 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ME,.            
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d90: 20 20 20 20 20 20 20 20 4c 50 46 49 4c 45 54 49          LPFILETI
1da0: 4d 45 2c 20 4c 50 46 49 4c 45 54 49 4d 45 29 3b  ME, LPFILETIME);
1db0: 0a 73 74 61 74 69 63 20 47 45 54 50 52 4f 43 54  .static GETPROCT
1dc0: 49 4d 45 53 20 67 65 74 50 72 6f 63 65 73 73 54  IMES getProcessT
1dd0: 69 6d 65 73 41 64 64 72 20 3d 20 4e 55 4c 4c 3b  imesAddr = NULL;
1de0: 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f  ../*.** Check to
1df0: 20 73 65 65 20 69 66 20 77 65 20 68 61 76 65 20   see if we have 
1e00: 74 69 6d 65 72 20 73 75 70 70 6f 72 74 2e 20 20  timer support.  
1e10: 52 65 74 75 72 6e 20 31 20 69 66 20 6e 65 63 65  Return 1 if nece
1e20: 73 73 61 72 79 0a 2a 2a 20 73 75 70 70 6f 72 74  ssary.** support
1e30: 20 66 6f 75 6e 64 20 28 6f 72 20 66 6f 75 6e 64   found (or found
1e40: 20 70 72 65 76 69 6f 75 73 6c 79 29 2e 0a 2a 2f   previously)..*/
1e50: 0a 73 74 61 74 69 63 20 69 6e 74 20 68 61 73 54  .static int hasT
1e60: 69 6d 65 72 28 76 6f 69 64 29 7b 0a 20 20 69 66  imer(void){.  if
1e70: 28 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65  ( getProcessTime
1e80: 73 41 64 64 72 20 29 7b 0a 20 20 20 20 72 65 74  sAddr ){.    ret
1e90: 75 72 6e 20 31 3b 0a 20 20 7d 20 65 6c 73 65 20  urn 1;.  } else 
1ea0: 7b 0a 20 20 20 20 2f 2a 20 47 65 74 50 72 6f 63  {.    /* GetProc
1eb0: 65 73 73 54 69 6d 65 73 28 29 20 69 73 6e 27 74  essTimes() isn't
1ec0: 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20 57 49   supported in WI
1ed0: 4e 39 35 20 61 6e 64 20 73 6f 6d 65 20 6f 74 68  N95 and some oth
1ee0: 65 72 20 57 69 6e 64 6f 77 73 0a 20 20 20 20 2a  er Windows.    *
1ef0: 2a 20 76 65 72 73 69 6f 6e 73 2e 20 53 65 65 20  * versions. See 
1f00: 69 66 20 74 68 65 20 76 65 72 73 69 6f 6e 20 77  if the version w
1f10: 65 20 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e  e are running on
1f20: 20 68 61 73 20 69 74 2c 20 61 6e 64 20 69 66 20   has it, and if 
1f30: 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65 73 2c 20  it.    ** does, 
1f40: 73 61 76 65 20 6f 66 66 20 61 20 70 6f 69 6e 74  save off a point
1f50: 65 72 20 74 6f 20 69 74 20 61 6e 64 20 74 68 65  er to it and the
1f60: 20 63 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73   current process
1f70: 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20 2a 2f 0a   handle..    */.
1f80: 20 20 20 20 68 50 72 6f 63 65 73 73 20 3d 20 47      hProcess = G
1f90: 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1fa0: 28 29 3b 0a 20 20 20 20 69 66 28 20 68 50 72 6f  ();.    if( hPro
1fb0: 63 65 73 73 20 29 7b 0a 20 20 20 20 20 20 48 49  cess ){.      HI
1fc0: 4e 53 54 41 4e 43 45 20 68 69 6e 73 74 4c 69 62  NSTANCE hinstLib
1fd0: 20 3d 20 4c 6f 61 64 4c 69 62 72 61 72 79 28 54   = LoadLibrary(T
1fe0: 45 58 54 28 22 4b 65 72 6e 65 6c 33 32 2e 64 6c  EXT("Kernel32.dl
1ff0: 6c 22 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  l"));.      if( 
2000: 4e 55 4c 4c 20 21 3d 20 68 69 6e 73 74 4c 69 62  NULL != hinstLib
2010: 20 29 7b 0a 20 20 20 20 20 20 20 20 67 65 74 50   ){.        getP
2020: 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72 20  rocessTimesAddr 
2030: 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 28 47  =.            (G
2040: 45 54 50 52 4f 43 54 49 4d 45 53 29 20 47 65 74  ETPROCTIMES) Get
2050: 50 72 6f 63 41 64 64 72 65 73 73 28 68 69 6e 73  ProcAddress(hins
2060: 74 4c 69 62 2c 20 22 47 65 74 50 72 6f 63 65 73  tLib, "GetProces
2070: 73 54 69 6d 65 73 22 29 3b 0a 20 20 20 20 20 20  sTimes");.      
2080: 20 20 69 66 28 20 4e 55 4c 4c 20 21 3d 20 67 65    if( NULL != ge
2090: 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64  tProcessTimesAdd
20a0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  r ){.          r
20b0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
20c0: 20 7d 0a 20 20 20 20 20 20 20 20 46 72 65 65 4c   }.        FreeL
20d0: 69 62 72 61 72 79 28 68 69 6e 73 74 4c 69 62 29  ibrary(hinstLib)
20e0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
20f0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
2100: 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 74  }../*.** Begin t
2110: 69 6d 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69  iming an operati
2120: 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  on.*/.static voi
2130: 64 20 62 65 67 69 6e 54 69 6d 65 72 28 76 6f 69  d beginTimer(voi
2140: 64 29 7b 0a 20 20 69 66 28 20 65 6e 61 62 6c 65  d){.  if( enable
2150: 54 69 6d 65 72 20 26 26 20 67 65 74 50 72 6f 63  Timer && getProc
2160: 65 73 73 54 69 6d 65 73 41 64 64 72 20 29 7b 0a  essTimesAddr ){.
2170: 20 20 20 20 46 49 4c 45 54 49 4d 45 20 66 74 43      FILETIME ftC
2180: 72 65 61 74 69 6f 6e 2c 20 66 74 45 78 69 74 3b  reation, ftExit;
2190: 0a 20 20 20 20 67 65 74 50 72 6f 63 65 73 73 54  .    getProcessT
21a0: 69 6d 65 73 41 64 64 72 28 68 50 72 6f 63 65 73  imesAddr(hProces
21b0: 73 2c 26 66 74 43 72 65 61 74 69 6f 6e 2c 26 66  s,&ftCreation,&f
21c0: 74 45 78 69 74 2c 0a 20 20 20 20 20 20 20 20 20  tExit,.         
21d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
21e0: 66 74 4b 65 72 6e 65 6c 42 65 67 69 6e 2c 26 66  ftKernelBegin,&f
21f0: 74 55 73 65 72 42 65 67 69 6e 29 3b 0a 20 20 20  tUserBegin);.   
2200: 20 66 74 57 61 6c 6c 42 65 67 69 6e 20 3d 20 74   ftWallBegin = t
2210: 69 6d 65 4f 66 44 61 79 28 29 3b 0a 20 20 7d 0a  imeOfDay();.  }.
2220: 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65  }../* Return the
2230: 20 64 69 66 66 65 72 65 6e 63 65 20 6f 66 20 74   difference of t
2240: 77 6f 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75  wo FILETIME stru
2250: 63 74 73 20 69 6e 20 73 65 63 6f 6e 64 73 20 2a  cts in seconds *
2260: 2f 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20  /.static double 
2270: 74 69 6d 65 44 69 66 66 28 46 49 4c 45 54 49 4d  timeDiff(FILETIM
2280: 45 20 2a 70 53 74 61 72 74 2c 20 46 49 4c 45 54  E *pStart, FILET
2290: 49 4d 45 20 2a 70 45 6e 64 29 7b 0a 20 20 73 71  IME *pEnd){.  sq
22a0: 6c 69 74 65 5f 69 6e 74 36 34 20 69 36 34 53 74  lite_int64 i64St
22b0: 61 72 74 20 3d 20 2a 28 28 73 71 6c 69 74 65 5f  art = *((sqlite_
22c0: 69 6e 74 36 34 20 2a 29 20 70 53 74 61 72 74 29  int64 *) pStart)
22d0: 3b 0a 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34  ;.  sqlite_int64
22e0: 20 69 36 34 45 6e 64 20 3d 20 2a 28 28 73 71 6c   i64End = *((sql
22f0: 69 74 65 5f 69 6e 74 36 34 20 2a 29 20 70 45 6e  ite_int64 *) pEn
2300: 64 29 3b 0a 20 20 72 65 74 75 72 6e 20 28 64 6f  d);.  return (do
2310: 75 62 6c 65 29 20 28 28 69 36 34 45 6e 64 20 2d  uble) ((i64End -
2320: 20 69 36 34 53 74 61 72 74 29 20 2f 20 31 30 30   i64Start) / 100
2330: 30 30 30 30 30 2e 30 29 3b 0a 7d 0a 0a 2f 2a 0a  00000.0);.}../*.
2340: 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 74 69 6d  ** Print the tim
2350: 69 6e 67 20 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a  ing results..*/.
2360: 73 74 61 74 69 63 20 76 6f 69 64 20 65 6e 64 54  static void endT
2370: 69 6d 65 72 28 76 6f 69 64 29 7b 0a 20 20 69 66  imer(void){.  if
2380: 28 20 65 6e 61 62 6c 65 54 69 6d 65 72 20 26 26  ( enableTimer &&
2390: 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73   getProcessTimes
23a0: 41 64 64 72 29 7b 0a 20 20 20 20 46 49 4c 45 54  Addr){.    FILET
23b0: 49 4d 45 20 66 74 43 72 65 61 74 69 6f 6e 2c 20  IME ftCreation, 
23c0: 66 74 45 78 69 74 2c 20 66 74 4b 65 72 6e 65 6c  ftExit, ftKernel
23d0: 45 6e 64 2c 20 66 74 55 73 65 72 45 6e 64 3b 0a  End, ftUserEnd;.
23e0: 20 20 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36      sqlite3_int6
23f0: 34 20 66 74 57 61 6c 6c 45 6e 64 20 3d 20 74 69  4 ftWallEnd = ti
2400: 6d 65 4f 66 44 61 79 28 29 3b 0a 20 20 20 20 67  meOfDay();.    g
2410: 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64  etProcessTimesAd
2420: 64 72 28 68 50 72 6f 63 65 73 73 2c 26 66 74 43  dr(hProcess,&ftC
2430: 72 65 61 74 69 6f 6e 2c 26 66 74 45 78 69 74 2c  reation,&ftExit,
2440: 26 66 74 4b 65 72 6e 65 6c 45 6e 64 2c 26 66 74  &ftKernelEnd,&ft
2450: 55 73 65 72 45 6e 64 29 3b 0a 20 20 20 20 70 72  UserEnd);.    pr
2460: 69 6e 74 66 28 22 52 75 6e 20 54 69 6d 65 3a 20  intf("Run Time: 
2470: 72 65 61 6c 20 25 2e 33 66 20 75 73 65 72 20 25  real %.3f user %
2480: 66 20 73 79 73 20 25 66 5c 6e 22 2c 0a 20 20 20  f sys %f\n",.   
2490: 20 20 20 20 28 66 74 57 61 6c 6c 45 6e 64 20 2d      (ftWallEnd -
24a0: 20 66 74 57 61 6c 6c 42 65 67 69 6e 29 2a 30 2e   ftWallBegin)*0.
24b0: 30 30 31 2c 0a 20 20 20 20 20 20 20 74 69 6d 65  001,.       time
24c0: 44 69 66 66 28 26 66 74 55 73 65 72 42 65 67 69  Diff(&ftUserBegi
24d0: 6e 2c 20 26 66 74 55 73 65 72 45 6e 64 29 2c 0a  n, &ftUserEnd),.
24e0: 20 20 20 20 20 20 20 74 69 6d 65 44 69 66 66 28         timeDiff(
24f0: 26 66 74 4b 65 72 6e 65 6c 42 65 67 69 6e 2c 20  &ftKernelBegin, 
2500: 26 66 74 4b 65 72 6e 65 6c 45 6e 64 29 29 3b 0a  &ftKernelEnd));.
2510: 20 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 42    }.}..#define B
2520: 45 47 49 4e 5f 54 49 4d 45 52 20 62 65 67 69 6e  EGIN_TIMER begin
2530: 54 69 6d 65 72 28 29 0a 23 64 65 66 69 6e 65 20  Timer().#define 
2540: 45 4e 44 5f 54 49 4d 45 52 20 65 6e 64 54 69 6d  END_TIMER endTim
2550: 65 72 28 29 0a 23 64 65 66 69 6e 65 20 48 41 53  er().#define HAS
2560: 5f 54 49 4d 45 52 20 68 61 73 54 69 6d 65 72 28  _TIMER hasTimer(
2570: 29 0a 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65  )..#else.#define
2580: 20 42 45 47 49 4e 5f 54 49 4d 45 52 0a 23 64 65   BEGIN_TIMER.#de
2590: 66 69 6e 65 20 45 4e 44 5f 54 49 4d 45 52 0a 23  fine END_TIMER.#
25a0: 64 65 66 69 6e 65 20 48 41 53 5f 54 49 4d 45 52  define HAS_TIMER
25b0: 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a   0.#endif../*.**
25c0: 20 55 73 65 64 20 74 6f 20 70 72 65 76 65 6e 74   Used to prevent
25d0: 20 77 61 72 6e 69 6e 67 73 20 61 62 6f 75 74 20   warnings about 
25e0: 75 6e 75 73 65 64 20 70 61 72 61 6d 65 74 65 72  unused parameter
25f0: 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 55  s.*/.#define UNU
2600: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 78 29  SED_PARAMETER(x)
2610: 20 28 76 6f 69 64 29 28 78 29 0a 0a 2f 2a 0a 2a   (void)(x)../*.*
2620: 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  * If the followi
2630: 6e 67 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  ng flag is set, 
2640: 74 68 65 6e 20 63 6f 6d 6d 61 6e 64 20 65 78 65  then command exe
2650: 63 75 74 69 6f 6e 20 73 74 6f 70 73 0a 2a 2a 20  cution stops.** 
2660: 61 74 20 61 6e 20 65 72 72 6f 72 20 69 66 20 77  at an error if w
2670: 65 20 61 72 65 20 6e 6f 74 20 69 6e 74 65 72 61  e are not intera
2680: 63 74 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  ctive..*/.static
2690: 20 69 6e 74 20 62 61 69 6c 5f 6f 6e 5f 65 72 72   int bail_on_err
26a0: 6f 72 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54  or = 0;../*.** T
26b0: 68 72 65 61 74 20 73 74 64 69 6e 20 61 73 20 61  hreat stdin as a
26c0: 6e 20 69 6e 74 65 72 61 63 74 69 76 65 20 69 6e  n interactive in
26d0: 70 75 74 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f  put if the follo
26e0: 77 69 6e 67 20 76 61 72 69 61 62 6c 65 0a 2a 2a  wing variable.**
26f0: 20 69 73 20 74 72 75 65 2e 20 20 4f 74 68 65 72   is true.  Other
2700: 77 69 73 65 2c 20 61 73 73 75 6d 65 20 73 74 64  wise, assume std
2710: 69 6e 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20  in is connected 
2720: 74 6f 20 61 20 66 69 6c 65 20 6f 72 20 70 69 70  to a file or pip
2730: 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
2740: 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61   stdin_is_intera
2750: 63 74 69 76 65 20 3d 20 31 3b 0a 0a 2f 2a 0a 2a  ctive = 1;../*.*
2760: 2a 20 4f 6e 20 57 69 6e 64 6f 77 73 20 73 79 73  * On Windows sys
2770: 74 65 6d 73 20 77 65 20 68 61 76 65 20 74 6f 20  tems we have to 
2780: 6b 6e 6f 77 20 69 66 20 73 74 61 6e 64 61 72 64  know if standard
2790: 20 6f 75 74 70 75 74 20 69 73 20 61 20 63 6f 6e   output is a con
27a0: 73 6f 6c 65 0a 2a 2a 20 69 6e 20 6f 72 64 65 72  sole.** in order
27b0: 20 74 6f 20 74 72 61 6e 73 6c 61 74 65 20 55 54   to translate UT
27c0: 46 2d 38 20 69 6e 74 6f 20 4d 42 43 53 2e 20 20  F-8 into MBCS.  
27d0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61  The following va
27e0: 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20 74 72 75  riable is.** tru
27f0: 65 20 69 66 20 74 72 61 6e 73 6c 61 74 69 6f 6e  e if translation
2800: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f   is required..*/
2810: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74 64 6f  .static int stdo
2820: 75 74 5f 69 73 5f 63 6f 6e 73 6f 6c 65 20 3d 20  ut_is_console = 
2830: 31 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f  1;../*.** The fo
2840: 6c 6c 6f 77 69 6e 67 20 69 73 20 74 68 65 20 6f  llowing is the o
2850: 70 65 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62  pen SQLite datab
2860: 61 73 65 2e 20 20 57 65 20 6d 61 6b 65 20 61 20  ase.  We make a 
2870: 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68  pointer.** to th
2880: 69 73 20 64 61 74 61 62 61 73 65 20 61 20 73 74  is database a st
2890: 61 74 69 63 20 76 61 72 69 61 62 6c 65 20 73 6f  atic variable so
28a0: 20 74 68 61 74 20 69 74 20 63 61 6e 20 62 65 20   that it can be 
28b0: 61 63 63 65 73 73 65 64 0a 2a 2a 20 62 79 20 74  accessed.** by t
28c0: 68 65 20 53 49 47 49 4e 54 20 68 61 6e 64 6c 65  he SIGINT handle
28d0: 72 20 74 6f 20 69 6e 74 65 72 72 75 70 74 20 64  r to interrupt d
28e0: 61 74 61 62 61 73 65 20 70 72 6f 63 65 73 73 69  atabase processi
28f0: 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71  ng..*/.static sq
2900: 6c 69 74 65 33 20 2a 67 6c 6f 62 61 6c 44 62 20  lite3 *globalDb 
2910: 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 65  = 0;../*.** True
2920: 20 69 66 20 61 6e 20 69 6e 74 65 72 72 75 70 74   if an interrupt
2930: 20 28 43 6f 6e 74 72 6f 6c 2d 43 29 20 68 61 73   (Control-C) has
2940: 20 62 65 65 6e 20 72 65 63 65 69 76 65 64 2e 0a   been received..
2950: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 6c 61 74 69  */.static volati
2960: 6c 65 20 69 6e 74 20 73 65 65 6e 49 6e 74 65 72  le int seenInter
2970: 72 75 70 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a  rupt = 0;../*.**
2980: 20 54 68 69 73 20 69 73 20 74 68 65 20 6e 61 6d   This is the nam
2990: 65 20 6f 66 20 6f 75 72 20 70 72 6f 67 72 61 6d  e of our program
29a0: 2e 20 49 74 20 69 73 20 73 65 74 20 69 6e 20 6d  . It is set in m
29b0: 61 69 6e 28 29 2c 20 75 73 65 64 0a 2a 2a 20 69  ain(), used.** i
29c0: 6e 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 6f 74  n a number of ot
29d0: 68 65 72 20 70 6c 61 63 65 73 2c 20 6d 6f 73 74  her places, most
29e0: 6c 79 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73  ly for error mes
29f0: 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  sages..*/.static
2a00: 20 63 68 61 72 20 2a 41 72 67 76 30 3b 0a 0a 2f   char *Argv0;../
2a10: 2a 0a 2a 2a 20 50 72 6f 6d 70 74 20 73 74 72 69  *.** Prompt stri
2a20: 6e 67 73 2e 20 49 6e 69 74 69 61 6c 69 7a 65 64  ngs. Initialized
2a30: 20 69 6e 20 6d 61 69 6e 2e 20 53 65 74 74 61 62   in main. Settab
2a40: 6c 65 20 77 69 74 68 0a 2a 2a 20 20 20 2e 70 72  le with.**   .pr
2a50: 6f 6d 70 74 20 6d 61 69 6e 20 63 6f 6e 74 69 6e  ompt main contin
2a60: 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  ue.*/.static cha
2a70: 72 20 6d 61 69 6e 50 72 6f 6d 70 74 5b 32 30 5d  r mainPrompt[20]
2a80: 3b 20 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c  ;     /* First l
2a90: 69 6e 65 20 70 72 6f 6d 70 74 2e 20 64 65 66 61  ine prompt. defa
2aa0: 75 6c 74 3a 20 22 73 71 6c 69 74 65 3e 20 22 2a  ult: "sqlite> "*
2ab0: 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 63 6f  /.static char co
2ac0: 6e 74 69 6e 75 65 50 72 6f 6d 70 74 5b 32 30 5d  ntinuePrompt[20]
2ad0: 3b 20 2f 2a 20 43 6f 6e 74 69 6e 75 61 74 69 6f  ; /* Continuatio
2ae0: 6e 20 70 72 6f 6d 70 74 2e 20 64 65 66 61 75 6c  n prompt. defaul
2af0: 74 3a 20 22 20 20 20 2e 2e 2e 3e 20 22 20 2a 2f  t: "   ...> " */
2b00: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e 64 65 72 20 6f  ../*.** Render o
2b10: 75 74 70 75 74 20 6c 69 6b 65 20 66 70 72 69 6e  utput like fprin
2b20: 74 66 28 29 2e 20 20 45 78 63 65 70 74 2c 20 69  tf().  Except, i
2b30: 66 20 74 68 65 20 6f 75 74 70 75 74 20 69 73 20  f the output is 
2b40: 67 6f 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20  going to the.** 
2b50: 63 6f 6e 73 6f 6c 65 20 61 6e 64 20 69 66 20 74  console and if t
2b60: 68 69 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 6f  his is running o
2b70: 6e 20 61 20 57 69 6e 64 6f 77 73 20 6d 61 63 68  n a Windows mach
2b80: 69 6e 65 2c 20 74 72 61 6e 73 6c 61 74 65 20 74  ine, translate t
2b90: 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20 66 72 6f  he.** output fro
2ba0: 6d 20 55 54 46 2d 38 20 69 6e 74 6f 20 4d 42 43  m UTF-8 into MBC
2bb0: 53 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  S..*/.#if define
2bc0: 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66  d(_WIN32) || def
2bd0: 69 6e 65 64 28 57 49 4e 33 32 29 0a 76 6f 69 64  ined(WIN32).void
2be0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 46 49 4c   utf8_printf(FIL
2bf0: 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68  E *out, const ch
2c00: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e  ar *zFormat, ...
2c10: 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b  ){.  va_list ap;
2c20: 0a 20 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20  .  va_start(ap, 
2c30: 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 69 66 28 20  zFormat);.  if( 
2c40: 73 74 64 6f 75 74 5f 69 73 5f 63 6f 6e 73 6f 6c  stdout_is_consol
2c50: 65 20 26 26 20 28 6f 75 74 3d 3d 73 74 64 6f 75  e && (out==stdou
2c60: 74 20 7c 7c 20 6f 75 74 3d 3d 73 74 64 65 72 72  t || out==stderr
2c70: 29 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  ) ){.    char *z
2c80: 31 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72  1 = sqlite3_vmpr
2c90: 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70  intf(zFormat, ap
2ca0: 29 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 32 20  );.    char *z2 
2cb0: 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f  = sqlite3_win32_
2cc0: 75 74 66 38 5f 74 6f 5f 6d 62 63 73 5f 76 32 28  utf8_to_mbcs_v2(
2cd0: 7a 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69  z1, 0);.    sqli
2ce0: 74 65 33 5f 66 72 65 65 28 7a 31 29 3b 0a 20 20  te3_free(z1);.  
2cf0: 20 20 66 70 75 74 73 28 7a 32 2c 20 6f 75 74 29    fputs(z2, out)
2d00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  ;.    sqlite3_fr
2d10: 65 65 28 7a 32 29 3b 0a 20 20 7d 65 6c 73 65 7b  ee(z2);.  }else{
2d20: 0a 20 20 20 20 76 66 70 72 69 6e 74 66 28 6f 75  .    vfprintf(ou
2d30: 74 2c 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  t, zFormat, ap);
2d40: 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70  .  }.  va_end(ap
2d50: 29 3b 0a 7d 0a 23 65 6c 69 66 20 21 64 65 66 69  );.}.#elif !defi
2d60: 6e 65 64 28 75 74 66 38 5f 70 72 69 6e 74 66 29  ned(utf8_printf)
2d70: 0a 23 20 64 65 66 69 6e 65 20 75 74 66 38 5f 70  .# define utf8_p
2d80: 72 69 6e 74 66 20 66 70 72 69 6e 74 66 0a 23 65  rintf fprintf.#e
2d90: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e 64  ndif../*.** Rend
2da0: 65 72 20 6f 75 74 70 75 74 20 6c 69 6b 65 20 66  er output like f
2db0: 70 72 69 6e 74 66 28 29 2e 20 20 54 68 69 73 20  printf().  This 
2dc0: 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65 20 75 73  should not be us
2dd0: 65 64 20 6f 6e 20 61 6e 79 74 68 69 6e 67 20 74  ed on anything t
2de0: 68 61 74 0a 2a 2a 20 69 6e 63 6c 75 64 65 73 20  hat.** includes 
2df0: 73 74 72 69 6e 67 20 66 6f 72 6d 61 74 74 69 6e  string formattin
2e00: 67 20 28 65 2e 67 2e 20 22 25 73 22 29 2e 0a 2a  g (e.g. "%s")..*
2e10: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 72  /.#if !defined(r
2e20: 61 77 5f 70 72 69 6e 74 66 29 0a 23 20 64 65 66  aw_printf).# def
2e30: 69 6e 65 20 72 61 77 5f 70 72 69 6e 74 66 20 66  ine raw_printf f
2e40: 70 72 69 6e 74 66 0a 23 65 6e 64 69 66 0a 0a 2f  printf.#endif../
2e50: 2a 0a 2a 2a 20 57 72 69 74 65 20 49 2f 4f 20 74  *.** Write I/O t
2e60: 72 61 63 65 73 20 74 6f 20 74 68 65 20 66 6f 6c  races to the fol
2e70: 6c 6f 77 69 6e 67 20 73 74 72 65 61 6d 2e 0a 2a  lowing stream..*
2e80: 2f 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  /.#ifdef SQLITE_
2e90: 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45 0a 73  ENABLE_IOTRACE.s
2ea0: 74 61 74 69 63 20 46 49 4c 45 20 2a 69 6f 74 72  tatic FILE *iotr
2eb0: 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a  ace = 0;.#endif.
2ec0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
2ed0: 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 70  ine works like p
2ee0: 72 69 6e 74 66 20 69 6e 20 74 68 61 74 20 69 74  rintf in that it
2ef0: 73 20 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74  s first argument
2f00: 20 69 73 20 61 0a 2a 2a 20 66 6f 72 6d 61 74 20   is a.** format 
2f10: 73 74 72 69 6e 67 20 61 6e 64 20 73 75 62 73 65  string and subse
2f20: 71 75 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20  quent arguments 
2f30: 61 72 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65  are values to be
2f40: 20 73 75 62 73 74 69 74 75 74 65 64 0a 2a 2a 20   substituted.** 
2f50: 69 6e 20 70 6c 61 63 65 20 6f 66 20 25 20 66 69  in place of % fi
2f60: 65 6c 64 73 2e 20 20 54 68 65 20 72 65 73 75 6c  elds.  The resul
2f70: 74 20 6f 66 20 66 6f 72 6d 61 74 74 69 6e 67 20  t of formatting 
2f80: 74 68 69 73 20 73 74 72 69 6e 67 0a 2a 2a 20 69  this string.** i
2f90: 73 20 77 72 69 74 74 65 6e 20 74 6f 20 69 6f 74  s written to iot
2fa0: 72 61 63 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20  race..*/.#ifdef 
2fb0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f  SQLITE_ENABLE_IO
2fc0: 54 52 41 43 45 0a 73 74 61 74 69 63 20 76 6f 69  TRACE.static voi
2fd0: 64 20 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 69  d SQLITE_CDECL i
2fe0: 6f 74 72 61 63 65 50 72 69 6e 74 66 28 63 6f 6e  otracePrintf(con
2ff0: 73 74 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74  st char *zFormat
3000: 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73  , ...){.  va_lis
3010: 74 20 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 3b  t ap;.  char *z;
3020: 0a 20 20 69 66 28 20 69 6f 74 72 61 63 65 3d 3d  .  if( iotrace==
3030: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 76 61  0 ) return;.  va
3040: 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d  _start(ap, zForm
3050: 61 74 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  at);.  z = sqlit
3060: 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72  e3_vmprintf(zFor
3070: 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65  mat, ap);.  va_e
3080: 6e 64 28 61 70 29 3b 0a 20 20 75 74 66 38 5f 70  nd(ap);.  utf8_p
3090: 72 69 6e 74 66 28 69 6f 74 72 61 63 65 2c 20 22  rintf(iotrace, "
30a0: 25 73 22 2c 20 7a 29 3b 0a 20 20 73 71 6c 69 74  %s", z);.  sqlit
30b0: 65 33 5f 66 72 65 65 28 7a 29 3b 0a 7d 0a 23 65  e3_free(z);.}.#e
30c0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70  ndif../*.** Outp
30d0: 75 74 20 73 74 72 69 6e 67 20 7a 55 74 66 20 74  ut string zUtf t
30e0: 6f 20 73 74 72 65 61 6d 20 70 4f 75 74 20 61 73  o stream pOut as
30f0: 20 77 20 63 68 61 72 61 63 74 65 72 73 2e 20 20   w characters.  
3100: 49 66 20 77 20 69 73 20 6e 65 67 61 74 69 76 65  If w is negative
3110: 2c 0a 2a 2a 20 74 68 65 6e 20 72 69 67 68 74 2d  ,.** then right-
3120: 6a 75 73 74 69 66 79 20 74 68 65 20 74 65 78 74  justify the text
3130: 2e 20 20 57 20 69 73 20 74 68 65 20 77 69 64 74  .  W is the widt
3140: 68 20 69 6e 20 55 54 46 2d 38 20 63 68 61 72 61  h in UTF-8 chara
3150: 63 74 65 72 73 2c 20 6e 6f 74 0a 2a 2a 20 69 6e  cters, not.** in
3160: 20 62 79 74 65 73 2e 20 20 54 68 69 73 20 69 73   bytes.  This is
3170: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
3180: 74 68 65 20 25 2a 2e 2a 73 20 73 70 65 63 69 66  the %*.*s specif
3190: 69 63 61 74 69 6f 6e 20 69 6e 20 70 72 69 6e 74  ication in print
31a0: 66 0a 2a 2a 20 73 69 6e 63 65 20 77 69 74 68 20  f.** since with 
31b0: 25 2a 2e 2a 73 20 74 68 65 20 77 69 64 74 68 20  %*.*s the width 
31c0: 69 73 20 6d 65 61 73 75 72 65 64 20 69 6e 20 62  is measured in b
31d0: 79 74 65 73 2c 20 6e 6f 74 20 63 68 61 72 61 63  ytes, not charac
31e0: 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ters..*/.static 
31f0: 76 6f 69 64 20 75 74 66 38 5f 77 69 64 74 68 5f  void utf8_width_
3200: 70 72 69 6e 74 28 46 49 4c 45 20 2a 70 4f 75 74  print(FILE *pOut
3210: 2c 20 69 6e 74 20 77 2c 20 63 6f 6e 73 74 20 63  , int w, const c
3220: 68 61 72 20 2a 7a 55 74 66 29 7b 0a 20 20 69 6e  har *zUtf){.  in
3230: 74 20 69 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20  t i;.  int n;.  
3240: 69 6e 74 20 61 77 20 3d 20 77 3c 30 20 3f 20 2d  int aw = w<0 ? -
3250: 77 20 3a 20 77 3b 0a 20 20 63 68 61 72 20 7a 42  w : w;.  char zB
3260: 75 66 5b 31 30 30 30 5d 3b 0a 20 20 69 66 28 20  uf[1000];.  if( 
3270: 61 77 3e 28 69 6e 74 29 73 69 7a 65 6f 66 28 7a  aw>(int)sizeof(z
3280: 42 75 66 29 2f 33 20 29 20 61 77 20 3d 20 28 69  Buf)/3 ) aw = (i
3290: 6e 74 29 73 69 7a 65 6f 66 28 7a 42 75 66 29 2f  nt)sizeof(zBuf)/
32a0: 33 3b 0a 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20  3;.  for(i=n=0; 
32b0: 7a 55 74 66 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  zUtf[i]; i++){. 
32c0: 20 20 20 69 66 28 20 28 7a 55 74 66 5b 69 5d 26     if( (zUtf[i]&
32d0: 30 78 63 30 29 21 3d 30 78 38 30 20 29 7b 0a 20  0xc0)!=0x80 ){. 
32e0: 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20       n++;.      
32f0: 69 66 28 20 6e 3d 3d 61 77 20 29 7b 0a 20 20 20  if( n==aw ){.   
3300: 20 20 20 20 20 64 6f 7b 20 69 2b 2b 3b 20 7d 77       do{ i++; }w
3310: 68 69 6c 65 28 20 28 7a 55 74 66 5b 69 5d 26 30  hile( (zUtf[i]&0
3320: 78 63 30 29 3d 3d 30 78 38 30 20 29 3b 0a 20 20  xc0)==0x80 );.  
3330: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3340: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
3350: 20 69 66 28 20 6e 3e 3d 61 77 20 29 7b 0a 20 20   if( n>=aw ){.  
3360: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 4f    utf8_printf(pO
3370: 75 74 2c 20 22 25 2e 2a 73 22 2c 20 69 2c 20 7a  ut, "%.*s", i, z
3380: 55 74 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  Utf);.  }else if
3390: 28 20 77 3c 30 20 29 7b 0a 20 20 20 20 75 74 66  ( w<0 ){.    utf
33a0: 38 5f 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  8_printf(pOut, "
33b0: 25 2a 73 25 73 22 2c 20 61 77 2d 6e 2c 20 22 22  %*s%s", aw-n, ""
33c0: 2c 20 7a 55 74 66 29 3b 0a 20 20 7d 65 6c 73 65  , zUtf);.  }else
33d0: 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
33e0: 66 28 70 4f 75 74 2c 20 22 25 73 25 2a 73 22 2c  f(pOut, "%s%*s",
33f0: 20 7a 55 74 66 2c 20 61 77 2d 6e 2c 20 22 22 29   zUtf, aw-n, "")
3400: 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  ;.  }.}.../*.** 
3410: 44 65 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20  Determines if a 
3420: 73 74 72 69 6e 67 20 69 73 20 61 20 6e 75 6d 62  string is a numb
3430: 65 72 20 6f 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74  er of not..*/.st
3440: 61 74 69 63 20 69 6e 74 20 69 73 4e 75 6d 62 65  atic int isNumbe
3450: 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  r(const char *z,
3460: 20 69 6e 74 20 2a 72 65 61 6c 6e 75 6d 29 7b 0a   int *realnum){.
3470: 20 20 69 66 28 20 2a 7a 3d 3d 27 2d 27 20 7c 7c    if( *z=='-' ||
3480: 20 2a 7a 3d 3d 27 2b 27 20 29 20 7a 2b 2b 3b 0a   *z=='+' ) z++;.
3490: 20 20 69 66 28 20 21 49 73 44 69 67 69 74 28 2a    if( !IsDigit(*
34a0: 7a 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  z) ){.    return
34b0: 20 30 3b 0a 20 20 7d 0a 20 20 7a 2b 2b 3b 0a 20   0;.  }.  z++;. 
34c0: 20 69 66 28 20 72 65 61 6c 6e 75 6d 20 29 20 2a   if( realnum ) *
34d0: 72 65 61 6c 6e 75 6d 20 3d 20 30 3b 0a 20 20 77  realnum = 0;.  w
34e0: 68 69 6c 65 28 20 49 73 44 69 67 69 74 28 2a 7a  hile( IsDigit(*z
34f0: 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 69 66  ) ){ z++; }.  if
3500: 28 20 2a 7a 3d 3d 27 2e 27 20 29 7b 0a 20 20 20  ( *z=='.' ){.   
3510: 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 21 49   z++;.    if( !I
3520: 73 44 69 67 69 74 28 2a 7a 29 20 29 20 72 65 74  sDigit(*z) ) ret
3530: 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  urn 0;.    while
3540: 28 20 49 73 44 69 67 69 74 28 2a 7a 29 20 29 7b  ( IsDigit(*z) ){
3550: 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20   z++; }.    if( 
3560: 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c 6e  realnum ) *realn
3570: 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66  um = 1;.  }.  if
3580: 28 20 2a 7a 3d 3d 27 65 27 20 7c 7c 20 2a 7a 3d  ( *z=='e' || *z=
3590: 3d 27 45 27 20 29 7b 0a 20 20 20 20 7a 2b 2b 3b  ='E' ){.    z++;
35a0: 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2b 27  .    if( *z=='+'
35b0: 20 7c 7c 20 2a 7a 3d 3d 27 2d 27 20 29 20 7a 2b   || *z=='-' ) z+
35c0: 2b 3b 0a 20 20 20 20 69 66 28 20 21 49 73 44 69  +;.    if( !IsDi
35d0: 67 69 74 28 2a 7a 29 20 29 20 72 65 74 75 72 6e  git(*z) ) return
35e0: 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 49   0;.    while( I
35f0: 73 44 69 67 69 74 28 2a 7a 29 20 29 7b 20 7a 2b  sDigit(*z) ){ z+
3600: 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 72 65 61  +; }.    if( rea
3610: 6c 6e 75 6d 20 29 20 2a 72 65 61 6c 6e 75 6d 20  lnum ) *realnum 
3620: 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 1;.  }.  retur
3630: 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  n *z==0;.}../*.*
3640: 2a 20 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69  * Compute a stri
3650: 6e 67 20 6c 65 6e 67 74 68 20 74 68 61 74 20 69  ng length that i
3660: 73 20 6c 69 6d 69 74 65 64 20 74 6f 20 77 68 61  s limited to wha
3670: 74 20 63 61 6e 20 62 65 20 73 74 6f 72 65 64 20  t can be stored 
3680: 69 6e 0a 2a 2a 20 6c 6f 77 65 72 20 33 30 20 62  in.** lower 30 b
3690: 69 74 73 20 6f 66 20 61 20 33 32 2d 62 69 74 20  its of a 32-bit 
36a0: 73 69 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a  signed integer..
36b0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74  */.static int st
36c0: 72 6c 65 6e 33 30 28 63 6f 6e 73 74 20 63 68 61  rlen30(const cha
36d0: 72 20 2a 7a 29 7b 0a 20 20 63 6f 6e 73 74 20 63  r *z){.  const c
36e0: 68 61 72 20 2a 7a 32 20 3d 20 7a 3b 0a 20 20 77  har *z2 = z;.  w
36f0: 68 69 6c 65 28 20 2a 7a 32 20 29 7b 20 7a 32 2b  hile( *z2 ){ z2+
3700: 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 78  +; }.  return 0x
3710: 33 66 66 66 66 66 66 66 20 26 20 28 69 6e 74 29  3fffffff & (int)
3720: 28 7a 32 20 2d 20 7a 29 3b 0a 7d 0a 0a 2f 2a 0a  (z2 - z);.}../*.
3730: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65  ** Return the le
3740: 6e 67 74 68 20 6f 66 20 61 20 73 74 72 69 6e 67  ngth of a string
3750: 20 69 6e 20 63 68 61 72 61 63 74 65 72 73 2e 20   in characters. 
3760: 20 4d 75 6c 74 69 62 79 74 65 20 55 54 46 38 20   Multibyte UTF8 
3770: 63 68 61 72 61 63 74 65 72 73 0a 2a 2a 20 63 6f  characters.** co
3780: 75 6e 74 20 61 73 20 61 20 73 69 6e 67 6c 65 20  unt as a single 
3790: 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74  character..*/.st
37a0: 61 74 69 63 20 69 6e 74 20 73 74 72 6c 65 6e 43  atic int strlenC
37b0: 68 61 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  har(const char *
37c0: 7a 29 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b  z){.  int n = 0;
37d0: 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a  .  while( *z ){.
37e0: 20 20 20 20 69 66 28 20 28 30 78 63 30 26 2a 28      if( (0xc0&*(
37f0: 7a 2b 2b 29 29 21 3d 30 78 38 30 20 29 20 6e 2b  z++))!=0x80 ) n+
3800: 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  +;.  }.  return 
3810: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  n;.}../*.** This
3820: 20 72 6f 75 74 69 6e 65 20 72 65 61 64 73 20 61   routine reads a
3830: 20 6c 69 6e 65 20 6f 66 20 74 65 78 74 20 66 72   line of text fr
3840: 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73 74 6f 72  om FILE in, stor
3850: 65 73 0a 2a 2a 20 74 68 65 20 74 65 78 74 20 69  es.** the text i
3860: 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  n memory obtaine
3870: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20  d from malloc() 
3880: 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 70 6f  and returns a po
3890: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20  inter.** to the 
38a0: 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69 73 20 72  text.  NULL is r
38b0: 65 74 75 72 6e 65 64 20 61 74 20 65 6e 64 20 6f  eturned at end o
38c0: 66 20 66 69 6c 65 2c 20 6f 72 20 69 66 20 6d 61  f file, or if ma
38d0: 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69 6c 73 2e  lloc().** fails.
38e0: 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4c 69 6e 65 20  .**.** If zLine 
38f0: 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e  is not NULL then
3900: 20 69 74 20 69 73 20 61 20 6d 61 6c 6c 6f 63 65   it is a malloce
3910: 64 20 62 75 66 66 65 72 20 72 65 74 75 72 6e 65  d buffer returne
3920: 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 65 76  d from.** a prev
3930: 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20 74 68 69  ious call to thi
3940: 73 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6d  s routine that m
3950: 61 79 20 62 65 20 72 65 75 73 65 64 2e 0a 2a 2f  ay be reused..*/
3960: 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 6c 6f  .static char *lo
3970: 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63 68 61 72  cal_getline(char
3980: 20 2a 7a 4c 69 6e 65 2c 20 46 49 4c 45 20 2a 69   *zLine, FILE *i
3990: 6e 29 7b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 20  n){.  int nLine 
39a0: 3d 20 7a 4c 69 6e 65 3d 3d 30 20 3f 20 30 20 3a  = zLine==0 ? 0 :
39b0: 20 31 30 30 3b 0a 20 20 69 6e 74 20 6e 20 3d 20   100;.  int n = 
39c0: 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29  0;..  while( 1 )
39d0: 7b 0a 20 20 20 20 69 66 28 20 6e 2b 31 30 30 3e  {.    if( n+100>
39e0: 6e 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 6e  nLine ){.      n
39f0: 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65 2a 32 20 2b  Line = nLine*2 +
3a00: 20 31 30 30 3b 0a 20 20 20 20 20 20 7a 4c 69 6e   100;.      zLin
3a10: 65 20 3d 20 72 65 61 6c 6c 6f 63 28 7a 4c 69 6e  e = realloc(zLin
3a20: 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20  e, nLine);.     
3a30: 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20   if( zLine==0 ) 
3a40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
3a50: 20 20 20 20 69 66 28 20 66 67 65 74 73 28 26 7a      if( fgets(&z
3a60: 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20 2d  Line[n], nLine -
3a70: 20 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20 20   n, in)==0 ){.  
3a80: 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a      if( n==0 ){.
3a90: 20 20 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69          free(zLi
3aa0: 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  ne);.        ret
3ab0: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
3ac0: 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20       zLine[n] = 
3ad0: 30 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  0;.      break;.
3ae0: 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
3af0: 20 7a 4c 69 6e 65 5b 6e 5d 20 29 20 6e 2b 2b 3b   zLine[n] ) n++;
3b00: 0a 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20  .    if( n>0 && 
3b10: 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27  zLine[n-1]=='\n'
3b20: 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20   ){.      n--;. 
3b30: 20 20 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20       if( n>0 && 
3b40: 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 72 27  zLine[n-1]=='\r'
3b50: 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 4c   ) n--;.      zL
3b60: 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20  ine[n] = 0;.    
3b70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3b80: 20 7d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f   }.#if defined(_
3b90: 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65  WIN32) || define
3ba0: 64 28 57 49 4e 33 32 29 0a 20 20 2f 2a 20 46 6f  d(WIN32).  /* Fo
3bb0: 72 20 69 6e 74 65 72 61 63 74 69 76 65 20 69 6e  r interactive in
3bc0: 70 75 74 20 6f 6e 20 57 69 6e 64 6f 77 73 20 73  put on Windows s
3bd0: 79 73 74 65 6d 73 2c 20 74 72 61 6e 73 6c 61 74  ystems, translat
3be0: 65 20 74 68 65 0a 20 20 2a 2a 20 6d 75 6c 74 69  e the.  ** multi
3bf0: 2d 62 79 74 65 20 63 68 61 72 61 63 74 65 72 73  -byte characters
3c00: 65 74 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  et characters in
3c10: 74 6f 20 55 54 46 2d 38 2e 20 2a 2f 0a 20 20 69  to UTF-8. */.  i
3c20: 66 28 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65  f( stdin_is_inte
3c30: 72 61 63 74 69 76 65 20 26 26 20 69 6e 3d 3d 73  ractive && in==s
3c40: 74 64 69 6e 20 29 7b 0a 20 20 20 20 63 68 61 72  tdin ){.    char
3c50: 20 2a 7a 54 72 61 6e 73 20 3d 20 73 71 6c 69 74   *zTrans = sqlit
3c60: 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f  e3_win32_mbcs_to
3c70: 5f 75 74 66 38 5f 76 32 28 7a 4c 69 6e 65 2c 20  _utf8_v2(zLine, 
3c80: 30 29 3b 0a 20 20 20 20 69 66 28 20 7a 54 72 61  0);.    if( zTra
3c90: 6e 73 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  ns ){.      int 
3ca0: 6e 54 72 61 6e 73 20 3d 20 73 74 72 6c 65 6e 33  nTrans = strlen3
3cb0: 30 28 7a 54 72 61 6e 73 29 2b 31 3b 0a 20 20 20  0(zTrans)+1;.   
3cc0: 20 20 20 69 66 28 20 6e 54 72 61 6e 73 3e 6e 4c     if( nTrans>nL
3cd0: 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ine ){.        z
3ce0: 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 7a  Line = realloc(z
3cf0: 4c 69 6e 65 2c 20 6e 54 72 61 6e 73 29 3b 0a 20  Line, nTrans);. 
3d00: 20 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65         if( zLine
3d10: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
3d20: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54   sqlite3_free(zT
3d30: 72 61 6e 73 29 3b 0a 20 20 20 20 20 20 20 20 20  rans);.         
3d40: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
3d50: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
3d60: 20 20 20 6d 65 6d 63 70 79 28 7a 4c 69 6e 65 2c     memcpy(zLine,
3d70: 20 7a 54 72 61 6e 73 2c 20 6e 54 72 61 6e 73 29   zTrans, nTrans)
3d80: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
3d90: 66 72 65 65 28 7a 54 72 61 6e 73 29 3b 0a 20 20  free(zTrans);.  
3da0: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f    }.  }.#endif /
3db0: 2a 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32  * defined(_WIN32
3dc0: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e  ) || defined(WIN
3dd0: 33 32 29 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20  32) */.  return 
3de0: 7a 4c 69 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zLine;.}../*.** 
3df0: 52 65 74 72 69 65 76 65 20 61 20 73 69 6e 67 6c  Retrieve a singl
3e00: 65 20 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74 20  e line of input 
3e10: 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69  text..**.** If i
3e20: 6e 3d 3d 30 20 74 68 65 6e 20 72 65 61 64 20 66  n==0 then read f
3e30: 72 6f 6d 20 73 74 61 6e 64 61 72 64 20 69 6e 70  rom standard inp
3e40: 75 74 20 61 6e 64 20 70 72 6f 6d 70 74 20 62 65  ut and prompt be
3e50: 66 6f 72 65 20 65 61 63 68 20 6c 69 6e 65 2e 0a  fore each line..
3e60: 2a 2a 20 49 66 20 69 73 43 6f 6e 74 69 6e 75 61  ** If isContinua
3e70: 74 69 6f 6e 20 69 73 20 74 72 75 65 2c 20 74 68  tion is true, th
3e80: 65 6e 20 61 20 63 6f 6e 74 69 6e 75 61 74 69 6f  en a continuatio
3e90: 6e 20 70 72 6f 6d 70 74 20 69 73 20 61 70 70 72  n prompt is appr
3ea0: 6f 70 72 69 61 74 65 2e 0a 2a 2a 20 49 66 20 69  opriate..** If i
3eb0: 73 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 69 73  sContinuation is
3ec0: 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20   zero, then the 
3ed0: 6d 61 69 6e 20 70 72 6f 6d 70 74 20 73 68 6f 75  main prompt shou
3ee0: 6c 64 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a  ld be used..**.*
3ef0: 2a 20 49 66 20 7a 50 72 69 6f 72 20 69 73 20 6e  * If zPrior is n
3f00: 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74 20  ot NULL then it 
3f10: 69 73 20 61 20 62 75 66 66 65 72 20 66 72 6f 6d  is a buffer from
3f20: 20 61 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f   a prior call to
3f30: 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65   this.** routine
3f40: 20 74 68 61 74 20 63 61 6e 20 62 65 20 72 65 75   that can be reu
3f50: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  sed..**.** The r
3f60: 65 73 75 6c 74 20 69 73 20 73 74 6f 72 65 64 20  esult is stored 
3f70: 69 6e 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65  in space obtaine
3f80: 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20  d from malloc() 
3f90: 61 6e 64 20 6d 75 73 74 20 65 69 74 68 65 72 0a  and must either.
3fa0: 2a 2a 20 62 65 20 66 72 65 65 64 20 62 79 20 74  ** be freed by t
3fb0: 68 65 20 63 61 6c 6c 65 72 20 6f 72 20 65 6c 73  he caller or els
3fc0: 65 20 70 61 73 73 65 64 20 62 61 63 6b 20 69 6e  e passed back in
3fd0: 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  to this routine 
3fe0: 76 69 61 20 74 68 65 0a 2a 2a 20 7a 50 72 69 6f  via the.** zPrio
3ff0: 72 20 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 72  r argument for r
4000: 65 75 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  euse..*/.static 
4010: 63 68 61 72 20 2a 6f 6e 65 5f 69 6e 70 75 74 5f  char *one_input_
4020: 6c 69 6e 65 28 46 49 4c 45 20 2a 69 6e 2c 20 63  line(FILE *in, c
4030: 68 61 72 20 2a 7a 50 72 69 6f 72 2c 20 69 6e 74  har *zPrior, int
4040: 20 69 73 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 29   isContinuation)
4050: 7b 0a 20 20 63 68 61 72 20 2a 7a 50 72 6f 6d 70  {.  char *zPromp
4060: 74 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 73 75  t;.  char *zResu
4070: 6c 74 3b 0a 20 20 69 66 28 20 69 6e 21 3d 30 20  lt;.  if( in!=0 
4080: 29 7b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20 3d  ){.    zResult =
4090: 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 7a   local_getline(z
40a0: 50 72 69 6f 72 2c 20 69 6e 29 3b 0a 20 20 7d 65  Prior, in);.  }e
40b0: 6c 73 65 7b 0a 20 20 20 20 7a 50 72 6f 6d 70 74  lse{.    zPrompt
40c0: 20 3d 20 69 73 43 6f 6e 74 69 6e 75 61 74 69 6f   = isContinuatio
40d0: 6e 20 3f 20 63 6f 6e 74 69 6e 75 65 50 72 6f 6d  n ? continueProm
40e0: 70 74 20 3a 20 6d 61 69 6e 50 72 6f 6d 70 74 3b  pt : mainPrompt;
40f0: 0a 23 69 66 20 53 48 45 4c 4c 5f 55 53 45 5f 4c  .#if SHELL_USE_L
4100: 4f 43 41 4c 5f 47 45 54 4c 49 4e 45 0a 20 20 20  OCAL_GETLINE.   
4110: 20 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 50   printf("%s", zP
4120: 72 6f 6d 70 74 29 3b 0a 20 20 20 20 66 66 6c 75  rompt);.    fflu
4130: 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20  sh(stdout);.    
4140: 7a 52 65 73 75 6c 74 20 3d 20 6c 6f 63 61 6c 5f  zResult = local_
4150: 67 65 74 6c 69 6e 65 28 7a 50 72 69 6f 72 2c 20  getline(zPrior, 
4160: 73 74 64 69 6e 29 3b 0a 23 65 6c 73 65 0a 20 20  stdin);.#else.  
4170: 20 20 66 72 65 65 28 7a 50 72 69 6f 72 29 3b 0a    free(zPrior);.
4180: 20 20 20 20 7a 52 65 73 75 6c 74 20 3d 20 73 68      zResult = sh
4190: 65 6c 6c 5f 72 65 61 64 6c 69 6e 65 28 7a 50 72  ell_readline(zPr
41a0: 6f 6d 70 74 29 3b 0a 20 20 20 20 69 66 28 20 7a  ompt);.    if( z
41b0: 52 65 73 75 6c 74 20 26 26 20 2a 7a 52 65 73 75  Result && *zResu
41c0: 6c 74 20 29 20 73 68 65 6c 6c 5f 61 64 64 5f 68  lt ) shell_add_h
41d0: 69 73 74 6f 72 79 28 7a 52 65 73 75 6c 74 29 3b  istory(zResult);
41e0: 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65  .#endif.  }.  re
41f0: 74 75 72 6e 20 7a 52 65 73 75 6c 74 3b 0a 7d 0a  turn zResult;.}.
4200: 2f 2a 0a 2a 2a 20 41 20 76 61 72 69 61 62 6c 65  /*.** A variable
4210: 20 6c 65 6e 67 74 68 20 73 74 72 69 6e 67 20 74   length string t
4220: 6f 20 77 68 69 63 68 20 6f 6e 65 20 63 61 6e 20  o which one can 
4230: 61 70 70 65 6e 64 20 74 65 78 74 2e 0a 2a 2f 0a  append text..*/.
4240: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
4250: 68 65 6c 6c 54 65 78 74 20 53 68 65 6c 6c 54 65  hellText ShellTe
4260: 78 74 3b 0a 73 74 72 75 63 74 20 53 68 65 6c 6c  xt;.struct Shell
4270: 54 65 78 74 20 7b 0a 20 20 63 68 61 72 20 2a 7a  Text {.  char *z
4280: 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74  ;.  int n;.  int
4290: 20 6e 41 6c 6c 6f 63 3b 0a 7d 3b 0a 0a 2f 2a 0a   nAlloc;.};../*.
42a0: 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e  ** Initialize an
42b0: 64 20 64 65 73 74 72 6f 79 20 61 20 53 68 65 6c  d destroy a Shel
42c0: 6c 54 65 78 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a  lText object.*/.
42d0: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 69 74  static void init
42e0: 54 65 78 74 28 53 68 65 6c 6c 54 65 78 74 20 2a  Text(ShellText *
42f0: 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20  p){.  memset(p, 
4300: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  0, sizeof(*p));.
4310: 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 66 72  }.static void fr
4320: 65 65 54 65 78 74 28 53 68 65 6c 6c 54 65 78 74  eeText(ShellText
4330: 20 2a 70 29 7b 0a 20 20 66 72 65 65 28 70 2d 3e   *p){.  free(p->
4340: 7a 29 3b 0a 20 20 69 6e 69 74 54 65 78 74 28 70  z);.  initText(p
4350: 29 3b 0a 7d 0a 0a 2f 2a 20 7a 49 6e 20 69 73 20  );.}../* zIn is 
4360: 65 69 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72  either a pointer
4370: 20 74 6f 20 61 20 4e 55 4c 4c 2d 74 65 72 6d 69   to a NULL-termi
4380: 6e 61 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20  nated string in 
4390: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 0a  memory obtained.
43a0: 2a 2a 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29  ** from malloc()
43b0: 2c 20 6f 72 20 61 20 4e 55 4c 4c 20 70 6f 69 6e  , or a NULL poin
43c0: 74 65 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20  ter. The string 
43d0: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 41  pointed to by zA
43e0: 70 70 65 6e 64 20 69 73 0a 2a 2a 20 61 64 64 65  ppend is.** adde
43f0: 64 20 74 6f 20 7a 49 6e 2c 20 61 6e 64 20 74 68  d to zIn, and th
4400: 65 20 72 65 73 75 6c 74 20 72 65 74 75 72 6e 65  e result returne
4410: 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  d in memory obta
4420: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
4430: 28 29 2e 0a 2a 2a 20 7a 49 6e 2c 20 69 66 20 69  ()..** zIn, if i
4440: 74 20 77 61 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20  t was not NULL, 
4450: 69 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20  is freed..**.** 
4460: 49 66 20 74 68 65 20 74 68 69 72 64 20 61 72 67  If the third arg
4470: 75 6d 65 6e 74 2c 20 71 75 6f 74 65 2c 20 69 73  ument, quote, is
4480: 20 6e 6f 74 20 27 5c 30 27 2c 20 74 68 65 6e 20   not '\0', then 
4490: 69 74 20 69 73 20 75 73 65 64 20 61 73 20 61 0a  it is used as a.
44a0: 2a 2a 20 71 75 6f 74 65 20 63 68 61 72 61 63 74  ** quote charact
44b0: 65 72 20 66 6f 72 20 7a 41 70 70 65 6e 64 2e 0a  er for zAppend..
44c0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61  */.static void a
44d0: 70 70 65 6e 64 54 65 78 74 28 53 68 65 6c 6c 54  ppendText(ShellT
44e0: 65 78 74 20 2a 70 2c 20 63 68 61 72 20 63 6f 6e  ext *p, char con
44f0: 73 74 20 2a 7a 41 70 70 65 6e 64 2c 20 63 68 61  st *zAppend, cha
4500: 72 20 71 75 6f 74 65 29 7b 0a 20 20 69 6e 74 20  r quote){.  int 
4510: 6c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  len;.  int i;.  
4520: 69 6e 74 20 6e 41 70 70 65 6e 64 20 3d 20 73 74  int nAppend = st
4530: 72 6c 65 6e 33 30 28 7a 41 70 70 65 6e 64 29 3b  rlen30(zAppend);
4540: 0a 0a 20 20 6c 65 6e 20 3d 20 6e 41 70 70 65 6e  ..  len = nAppen
4550: 64 2b 70 2d 3e 6e 2b 31 3b 0a 20 20 69 66 28 20  d+p->n+1;.  if( 
4560: 71 75 6f 74 65 20 29 7b 0a 20 20 20 20 6c 65 6e  quote ){.    len
4570: 20 2b 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28 69   += 2;.    for(i
4580: 3d 30 3b 20 69 3c 6e 41 70 70 65 6e 64 3b 20 69  =0; i<nAppend; i
4590: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a  ++){.      if( z
45a0: 41 70 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65  Append[i]==quote
45b0: 20 29 20 6c 65 6e 2b 2b 3b 0a 20 20 20 20 7d 0a   ) len++;.    }.
45c0: 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 2b    }..  if( p->n+
45d0: 6c 65 6e 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63 20 29  len>=p->nAlloc )
45e0: 7b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20  {.    p->nAlloc 
45f0: 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20  = p->nAlloc*2 + 
4600: 6c 65 6e 20 2b 20 32 30 3b 0a 20 20 20 20 70 2d  len + 20;.    p-
4610: 3e 7a 20 3d 20 72 65 61 6c 6c 6f 63 28 70 2d 3e  >z = realloc(p->
4620: 7a 2c 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20  z, p->nAlloc);. 
4630: 20 20 20 69 66 28 20 70 2d 3e 7a 3d 3d 30 20 29     if( p->z==0 )
4640: 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70  {.      memset(p
4650: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29  , 0, sizeof(*p))
4660: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a  ;.      return;.
4670: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28      }.  }..  if(
4680: 20 71 75 6f 74 65 20 29 7b 0a 20 20 20 20 63 68   quote ){.    ch
4690: 61 72 20 2a 7a 43 73 72 20 3d 20 70 2d 3e 7a 2b  ar *zCsr = p->z+
46a0: 70 2d 3e 6e 3b 0a 20 20 20 20 2a 7a 43 73 72 2b  p->n;.    *zCsr+
46b0: 2b 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20 66  + = quote;.    f
46c0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 70 70 65 6e  or(i=0; i<nAppen
46d0: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 2a  d; i++){.      *
46e0: 7a 43 73 72 2b 2b 20 3d 20 7a 41 70 70 65 6e 64  zCsr++ = zAppend
46f0: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  [i];.      if( z
4700: 41 70 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65  Append[i]==quote
4710: 20 29 20 2a 7a 43 73 72 2b 2b 20 3d 20 71 75 6f   ) *zCsr++ = quo
4720: 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 7a  te;.    }.    *z
4730: 43 73 72 2b 2b 20 3d 20 71 75 6f 74 65 3b 0a 20  Csr++ = quote;. 
4740: 20 20 20 70 2d 3e 6e 20 3d 20 28 69 6e 74 29 28     p->n = (int)(
4750: 7a 43 73 72 20 2d 20 70 2d 3e 7a 29 3b 0a 20 20  zCsr - p->z);.  
4760: 20 20 2a 7a 43 73 72 20 3d 20 27 5c 30 27 3b 0a    *zCsr = '\0';.
4770: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d    }else{.    mem
4780: 63 70 79 28 70 2d 3e 7a 2b 70 2d 3e 6e 2c 20 7a  cpy(p->z+p->n, z
4790: 41 70 70 65 6e 64 2c 20 6e 41 70 70 65 6e 64 29  Append, nAppend)
47a0: 3b 0a 20 20 20 20 70 2d 3e 6e 20 2b 3d 20 6e 41  ;.    p->n += nA
47b0: 70 70 65 6e 64 3b 0a 20 20 20 20 70 2d 3e 7a 5b  ppend;.    p->z[
47c0: 70 2d 3e 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20  p->n] = '\0';.  
47d0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  }.}../*.** Attem
47e0: 70 74 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20  pt to determine 
47f0: 69 66 20 69 64 65 6e 74 69 66 69 65 72 20 7a 4e  if identifier zN
4800: 61 6d 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20  ame needs to be 
4810: 71 75 6f 74 65 64 2c 20 65 69 74 68 65 72 0a 2a  quoted, either.*
4820: 2a 20 62 65 63 61 75 73 65 20 69 74 20 63 6f 6e  * because it con
4830: 74 61 69 6e 73 20 6e 6f 6e 2d 61 6c 70 68 61 6e  tains non-alphan
4840: 75 6d 65 72 69 63 20 63 68 61 72 61 63 74 65 72  umeric character
4850: 73 2c 20 6f 72 20 62 65 63 61 75 73 65 20 69 74  s, or because it
4860: 20 69 73 20 61 6e 0a 2a 2a 20 53 51 4c 69 74 65   is an.** SQLite
4870: 20 6b 65 79 77 6f 72 64 2e 20 20 42 65 20 63 6f   keyword.  Be co
4880: 6e 73 65 72 76 61 74 69 76 65 20 69 6e 20 74 68  nservative in th
4890: 69 73 20 65 73 74 69 6d 61 74 65 3a 20 20 57 68  is estimate:  Wh
48a0: 65 6e 20 69 6e 20 64 6f 75 62 74 20 61 73 73 75  en in doubt assu
48b0: 6d 65 0a 2a 2a 20 74 68 61 74 20 71 75 6f 74 69  me.** that quoti
48c0: 6e 67 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a  ng is required..
48d0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 27 22 27  **.** Return '"'
48e0: 20 69 66 20 71 75 6f 74 69 6e 67 20 69 73 20 72   if quoting is r
48f0: 65 71 75 69 72 65 64 2e 20 20 52 65 74 75 72 6e  equired.  Return
4900: 20 30 20 69 66 20 6e 6f 20 71 75 6f 74 69 6e 67   0 if no quoting
4910: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f   is required..*/
4920: 0a 73 74 61 74 69 63 20 63 68 61 72 20 71 75 6f  .static char quo
4930: 74 65 43 68 61 72 28 63 6f 6e 73 74 20 63 68 61  teChar(const cha
4940: 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 2f 2a 20  r *zName){.  /* 
4950: 41 6c 6c 20 53 51 4c 69 74 65 20 6b 65 79 77 6f  All SQLite keywo
4960: 72 64 73 2c 20 69 6e 20 61 6c 70 68 61 62 65 74  rds, in alphabet
4970: 69 63 61 6c 20 6f 72 64 65 72 20 2a 2f 0a 20 20  ical order */.  
4980: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
4990: 72 20 2a 61 7a 4b 65 79 77 6f 72 64 73 5b 5d 20  r *azKeywords[] 
49a0: 3d 20 7b 0a 20 20 20 20 22 41 42 4f 52 54 22 2c  = {.    "ABORT",
49b0: 20 22 41 43 54 49 4f 4e 22 2c 20 22 41 44 44 22   "ACTION", "ADD"
49c0: 2c 20 22 41 46 54 45 52 22 2c 20 22 41 4c 4c 22  , "AFTER", "ALL"
49d0: 2c 20 22 41 4c 54 45 52 22 2c 20 22 41 4e 41 4c  , "ALTER", "ANAL
49e0: 59 5a 45 22 2c 20 22 41 4e 44 22 2c 20 22 41 53  YZE", "AND", "AS
49f0: 22 2c 0a 20 20 20 20 22 41 53 43 22 2c 20 22 41  ",.    "ASC", "A
4a00: 54 54 41 43 48 22 2c 20 22 41 55 54 4f 49 4e 43  TTACH", "AUTOINC
4a10: 52 45 4d 45 4e 54 22 2c 20 22 42 45 46 4f 52 45  REMENT", "BEFORE
4a20: 22 2c 20 22 42 45 47 49 4e 22 2c 20 22 42 45 54  ", "BEGIN", "BET
4a30: 57 45 45 4e 22 2c 20 22 42 59 22 2c 0a 20 20 20  WEEN", "BY",.   
4a40: 20 22 43 41 53 43 41 44 45 22 2c 20 22 43 41 53   "CASCADE", "CAS
4a50: 45 22 2c 20 22 43 41 53 54 22 2c 20 22 43 48 45  E", "CAST", "CHE
4a60: 43 4b 22 2c 20 22 43 4f 4c 4c 41 54 45 22 2c 20  CK", "COLLATE", 
4a70: 22 43 4f 4c 55 4d 4e 22 2c 20 22 43 4f 4d 4d 49  "COLUMN", "COMMI
4a80: 54 22 2c 0a 20 20 20 20 22 43 4f 4e 46 4c 49 43  T",.    "CONFLIC
4a90: 54 22 2c 20 22 43 4f 4e 53 54 52 41 49 4e 54 22  T", "CONSTRAINT"
4aa0: 2c 20 22 43 52 45 41 54 45 22 2c 20 22 43 52 4f  , "CREATE", "CRO
4ab0: 53 53 22 2c 20 22 43 55 52 52 45 4e 54 5f 44 41  SS", "CURRENT_DA
4ac0: 54 45 22 2c 0a 20 20 20 20 22 43 55 52 52 45 4e  TE",.    "CURREN
4ad0: 54 5f 54 49 4d 45 22 2c 20 22 43 55 52 52 45 4e  T_TIME", "CURREN
4ae0: 54 5f 54 49 4d 45 53 54 41 4d 50 22 2c 20 22 44  T_TIMESTAMP", "D
4af0: 41 54 41 42 41 53 45 22 2c 20 22 44 45 46 41 55  ATABASE", "DEFAU
4b00: 4c 54 22 2c 20 22 44 45 46 45 52 52 41 42 4c 45  LT", "DEFERRABLE
4b10: 22 2c 0a 20 20 20 20 22 44 45 46 45 52 52 45 44  ",.    "DEFERRED
4b20: 22 2c 20 22 44 45 4c 45 54 45 22 2c 20 22 44 45  ", "DELETE", "DE
4b30: 53 43 22 2c 20 22 44 45 54 41 43 48 22 2c 20 22  SC", "DETACH", "
4b40: 44 49 53 54 49 4e 43 54 22 2c 20 22 44 52 4f 50  DISTINCT", "DROP
4b50: 22 2c 20 22 45 41 43 48 22 2c 0a 20 20 20 20 22  ", "EACH",.    "
4b60: 45 4c 53 45 22 2c 20 22 45 4e 44 22 2c 20 22 45  ELSE", "END", "E
4b70: 53 43 41 50 45 22 2c 20 22 45 58 43 45 50 54 22  SCAPE", "EXCEPT"
4b80: 2c 20 22 45 58 43 4c 55 53 49 56 45 22 2c 20 22  , "EXCLUSIVE", "
4b90: 45 58 49 53 54 53 22 2c 20 22 45 58 50 4c 41 49  EXISTS", "EXPLAI
4ba0: 4e 22 2c 0a 20 20 20 20 22 46 41 49 4c 22 2c 20  N",.    "FAIL", 
4bb0: 22 46 4f 52 22 2c 20 22 46 4f 52 45 49 47 4e 22  "FOR", "FOREIGN"
4bc0: 2c 20 22 46 52 4f 4d 22 2c 20 22 46 55 4c 4c 22  , "FROM", "FULL"
4bd0: 2c 20 22 47 4c 4f 42 22 2c 20 22 47 52 4f 55 50  , "GLOB", "GROUP
4be0: 22 2c 20 22 48 41 56 49 4e 47 22 2c 20 22 49 46  ", "HAVING", "IF
4bf0: 22 2c 0a 20 20 20 20 22 49 47 4e 4f 52 45 22 2c  ",.    "IGNORE",
4c00: 20 22 49 4d 4d 45 44 49 41 54 45 22 2c 20 22 49   "IMMEDIATE", "I
4c10: 4e 22 2c 20 22 49 4e 44 45 58 22 2c 20 22 49 4e  N", "INDEX", "IN
4c20: 44 45 58 45 44 22 2c 20 22 49 4e 49 54 49 41 4c  DEXED", "INITIAL
4c30: 4c 59 22 2c 20 22 49 4e 4e 45 52 22 2c 0a 20 20  LY", "INNER",.  
4c40: 20 20 22 49 4e 53 45 52 54 22 2c 20 22 49 4e 53    "INSERT", "INS
4c50: 54 45 41 44 22 2c 20 22 49 4e 54 45 52 53 45 43  TEAD", "INTERSEC
4c60: 54 22 2c 20 22 49 4e 54 4f 22 2c 20 22 49 53 22  T", "INTO", "IS"
4c70: 2c 20 22 49 53 4e 55 4c 4c 22 2c 20 22 4a 4f 49  , "ISNULL", "JOI
4c80: 4e 22 2c 20 22 4b 45 59 22 2c 0a 20 20 20 20 22  N", "KEY",.    "
4c90: 4c 45 46 54 22 2c 20 22 4c 49 4b 45 22 2c 20 22  LEFT", "LIKE", "
4ca0: 4c 49 4d 49 54 22 2c 20 22 4d 41 54 43 48 22 2c  LIMIT", "MATCH",
4cb0: 20 22 4e 41 54 55 52 41 4c 22 2c 20 22 4e 4f 22   "NATURAL", "NO"
4cc0: 2c 20 22 4e 4f 54 22 2c 20 22 4e 4f 54 4e 55 4c  , "NOT", "NOTNUL
4cd0: 4c 22 2c 0a 20 20 20 20 22 4e 55 4c 4c 22 2c 20  L",.    "NULL", 
4ce0: 22 4f 46 22 2c 20 22 4f 46 46 53 45 54 22 2c 20  "OF", "OFFSET", 
4cf0: 22 4f 4e 22 2c 20 22 4f 52 22 2c 20 22 4f 52 44  "ON", "OR", "ORD
4d00: 45 52 22 2c 20 22 4f 55 54 45 52 22 2c 20 22 50  ER", "OUTER", "P
4d10: 4c 41 4e 22 2c 20 22 50 52 41 47 4d 41 22 2c 0a  LAN", "PRAGMA",.
4d20: 20 20 20 20 22 50 52 49 4d 41 52 59 22 2c 20 22      "PRIMARY", "
4d30: 51 55 45 52 59 22 2c 20 22 52 41 49 53 45 22 2c  QUERY", "RAISE",
4d40: 20 22 52 45 43 55 52 53 49 56 45 22 2c 20 22 52   "RECURSIVE", "R
4d50: 45 46 45 52 45 4e 43 45 53 22 2c 20 22 52 45 47  EFERENCES", "REG
4d60: 45 58 50 22 2c 0a 20 20 20 20 22 52 45 49 4e 44  EXP",.    "REIND
4d70: 45 58 22 2c 20 22 52 45 4c 45 41 53 45 22 2c 20  EX", "RELEASE", 
4d80: 22 52 45 4e 41 4d 45 22 2c 20 22 52 45 50 4c 41  "RENAME", "REPLA
4d90: 43 45 22 2c 20 22 52 45 53 54 52 49 43 54 22 2c  CE", "RESTRICT",
4da0: 20 22 52 49 47 48 54 22 2c 0a 20 20 20 20 22 52   "RIGHT",.    "R
4db0: 4f 4c 4c 42 41 43 4b 22 2c 20 22 52 4f 57 22 2c  OLLBACK", "ROW",
4dc0: 20 22 53 41 56 45 50 4f 49 4e 54 22 2c 20 22 53   "SAVEPOINT", "S
4dd0: 45 4c 45 43 54 22 2c 20 22 53 45 54 22 2c 20 22  ELECT", "SET", "
4de0: 54 41 42 4c 45 22 2c 20 22 54 45 4d 50 22 2c 0a  TABLE", "TEMP",.
4df0: 20 20 20 20 22 54 45 4d 50 4f 52 41 52 59 22 2c      "TEMPORARY",
4e00: 20 22 54 48 45 4e 22 2c 20 22 54 4f 22 2c 20 22   "THEN", "TO", "
4e10: 54 52 41 4e 53 41 43 54 49 4f 4e 22 2c 20 22 54  TRANSACTION", "T
4e20: 52 49 47 47 45 52 22 2c 20 22 55 4e 49 4f 4e 22  RIGGER", "UNION"
4e30: 2c 20 22 55 4e 49 51 55 45 22 2c 0a 20 20 20 20  , "UNIQUE",.    
4e40: 22 55 50 44 41 54 45 22 2c 20 22 55 53 49 4e 47  "UPDATE", "USING
4e50: 22 2c 20 22 56 41 43 55 55 4d 22 2c 20 22 56 41  ", "VACUUM", "VA
4e60: 4c 55 45 53 22 2c 20 22 56 49 45 57 22 2c 20 22  LUES", "VIEW", "
4e70: 56 49 52 54 55 41 4c 22 2c 20 22 57 48 45 4e 22  VIRTUAL", "WHEN"
4e80: 2c 20 22 57 48 45 52 45 22 2c 0a 20 20 20 20 22  , "WHERE",.    "
4e90: 57 49 54 48 22 2c 20 22 57 49 54 48 4f 55 54 22  WITH", "WITHOUT"
4ea0: 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20  ,.  };.  int i, 
4eb0: 6c 77 72 2c 20 75 70 72 2c 20 6d 69 64 2c 20 63  lwr, upr, mid, c
4ec0: 3b 0a 20 20 69 66 28 20 21 69 73 61 6c 70 68 61  ;.  if( !isalpha
4ed0: 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29  ((unsigned char)
4ee0: 7a 4e 61 6d 65 5b 30 5d 29 20 26 26 20 7a 4e 61  zName[0]) && zNa
4ef0: 6d 65 5b 30 5d 21 3d 27 5f 27 20 29 20 72 65 74  me[0]!='_' ) ret
4f00: 75 72 6e 20 27 22 27 3b 0a 20 20 66 6f 72 28 69  urn '"';.  for(i
4f10: 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b  =0; zName[i]; i+
4f20: 2b 29 7b 0a 20 20 20 20 69 66 28 20 21 69 73 61  +){.    if( !isa
4f30: 6c 6e 75 6d 28 28 75 6e 73 69 67 6e 65 64 20 63  lnum((unsigned c
4f40: 68 61 72 29 7a 4e 61 6d 65 5b 69 5d 29 20 26 26  har)zName[i]) &&
4f50: 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27 20 29   zName[i]!='_' )
4f60: 20 72 65 74 75 72 6e 20 27 22 27 3b 0a 20 20 7d   return '"';.  }
4f70: 0a 20 20 6c 77 72 20 3d 20 30 3b 0a 20 20 75 70  .  lwr = 0;.  up
4f80: 72 20 3d 20 73 69 7a 65 6f 66 28 61 7a 4b 65 79  r = sizeof(azKey
4f90: 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66 28 61 7a  words)/sizeof(az
4fa0: 4b 65 79 77 6f 72 64 73 5b 30 5d 29 20 2d 20 31  Keywords[0]) - 1
4fb0: 3b 0a 20 20 77 68 69 6c 65 28 20 6c 77 72 3c 3d  ;.  while( lwr<=
4fc0: 75 70 72 20 29 7b 0a 20 20 20 20 6d 69 64 20 3d  upr ){.    mid =
4fd0: 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b 0a 20 20   (lwr+upr)/2;.  
4fe0: 20 20 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74    c = sqlite3_st
4ff0: 72 69 63 6d 70 28 61 7a 4b 65 79 77 6f 72 64 73  ricmp(azKeywords
5000: 5b 6d 69 64 5d 2c 20 7a 4e 61 6d 65 29 3b 0a 20  [mid], zName);. 
5010: 20 20 20 69 66 28 20 63 3d 3d 30 20 29 20 72 65     if( c==0 ) re
5020: 74 75 72 6e 20 27 22 27 3b 0a 20 20 20 20 69 66  turn '"';.    if
5030: 28 20 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 6c  ( c<0 ){.      l
5040: 77 72 20 3d 20 6d 69 64 2b 31 3b 0a 20 20 20 20  wr = mid+1;.    
5050: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 70 72  }else{.      upr
5060: 20 3d 20 6d 69 64 2d 31 3b 0a 20 20 20 20 7d 0a   = mid-1;.    }.
5070: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
5080: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75  }../*.** Constru
5090: 63 74 20 61 20 66 61 6b 65 20 6f 62 6a 65 63 74  ct a fake object
50a0: 20 6e 61 6d 65 20 61 6e 64 20 63 6f 6c 75 6d 6e   name and column
50b0: 20 6c 69 73 74 20 74 6f 20 64 65 73 63 72 69 62   list to describ
50c0: 65 20 74 68 65 20 73 74 72 75 63 74 75 72 65 0a  e the structure.
50d0: 2a 2a 20 6f 66 20 74 68 65 20 76 69 65 77 2c 20  ** of the view, 
50e0: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 6f  virtual table, o
50f0: 72 20 74 61 62 6c 65 20 76 61 6c 75 65 64 20 66  r table valued f
5100: 75 6e 63 74 69 6f 6e 20 7a 53 63 68 65 6d 61 2e  unction zSchema.
5110: 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  zName..*/.static
5120: 20 63 68 61 72 20 2a 73 68 65 6c 6c 46 61 6b 65   char *shellFake
5130: 53 63 68 65 6d 61 28 0a 20 20 73 71 6c 69 74 65  Schema(.  sqlite
5140: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
5150: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
5160: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e  e connection con
5170: 74 61 69 6e 69 6e 67 20 74 68 65 20 76 74 61 62  taining the vtab
5180: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
5190: 20 2a 7a 53 63 68 65 6d 61 2c 20 20 20 20 2f 2a   *zSchema,    /*
51a0: 20 53 63 68 65 6d 61 20 6f 66 20 74 68 65 20 64   Schema of the d
51b0: 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20  atabase holding 
51c0: 74 68 65 20 76 74 61 62 20 2a 2f 0a 20 20 63 6f  the vtab */.  co
51d0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
51e0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d        /* The nam
51f0: 65 20 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c  e of the virtual
5200: 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73   table */.){.  s
5210: 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
5220: 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  mt = 0;.  char *
5230: 7a 53 71 6c 3b 0a 20 20 53 68 65 6c 6c 54 65 78  zSql;.  ShellTex
5240: 74 20 73 3b 0a 20 20 63 68 61 72 20 63 51 75 6f  t s;.  char cQuo
5250: 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 44 69 76  te;.  char *zDiv
5260: 20 3d 20 22 28 22 3b 0a 20 20 69 6e 74 20 6e 52   = "(";.  int nR
5270: 6f 77 20 3d 20 30 3b 0a 0a 20 20 7a 53 71 6c 20  ow = 0;..  zSql 
5280: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
5290: 66 28 22 50 52 41 47 4d 41 20 5c 22 25 77 5c 22  f("PRAGMA \"%w\"
52a0: 2e 74 61 62 6c 65 5f 69 6e 66 6f 3d 25 51 3b 22  .table_info=%Q;"
52b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
52c0: 20 20 20 20 20 20 20 20 20 20 20 7a 53 63 68 65             zSche
52d0: 6d 61 20 3f 20 7a 53 63 68 65 6d 61 20 3a 20 22  ma ? zSchema : "
52e0: 6d 61 69 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  main", zName);. 
52f0: 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
5300: 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  _v2(db, zSql, -1
5310: 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
5320: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
5330: 6c 29 3b 0a 20 20 69 6e 69 74 54 65 78 74 28 26  l);.  initText(&
5340: 73 29 3b 0a 20 20 69 66 28 20 7a 53 63 68 65 6d  s);.  if( zSchem
5350: 61 20 29 7b 0a 20 20 20 20 63 51 75 6f 74 65 20  a ){.    cQuote 
5360: 3d 20 71 75 6f 74 65 43 68 61 72 28 7a 53 63 68  = quoteChar(zSch
5370: 65 6d 61 29 3b 0a 20 20 20 20 69 66 28 20 63 51  ema);.    if( cQ
5380: 75 6f 74 65 20 26 26 20 73 71 6c 69 74 65 33 5f  uote && sqlite3_
5390: 73 74 72 69 63 6d 70 28 7a 53 63 68 65 6d 61 2c  stricmp(zSchema,
53a0: 22 74 65 6d 70 22 29 3d 3d 30 20 29 20 63 51 75  "temp")==0 ) cQu
53b0: 6f 74 65 20 3d 20 30 3b 0a 20 20 20 20 61 70 70  ote = 0;.    app
53c0: 65 6e 64 54 65 78 74 28 26 73 2c 20 7a 53 63 68  endText(&s, zSch
53d0: 65 6d 61 2c 20 63 51 75 6f 74 65 29 3b 0a 20 20  ema, cQuote);.  
53e0: 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c    appendText(&s,
53f0: 20 22 2e 22 2c 20 30 29 3b 0a 20 20 7d 0a 20 20   ".", 0);.  }.  
5400: 63 51 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68  cQuote = quoteCh
5410: 61 72 28 7a 4e 61 6d 65 29 3b 0a 20 20 61 70 70  ar(zName);.  app
5420: 65 6e 64 54 65 78 74 28 26 73 2c 20 7a 4e 61 6d  endText(&s, zNam
5430: 65 2c 20 63 51 75 6f 74 65 29 3b 0a 20 20 77 68  e, cQuote);.  wh
5440: 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65  ile( sqlite3_ste
5450: 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
5460: 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73  _ROW ){.    cons
5470: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 28  t char *zCol = (
5480: 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
5490: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
54a0: 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 6e  pStmt, 1);.    n
54b0: 52 6f 77 2b 2b 3b 0a 20 20 20 20 61 70 70 65 6e  Row++;.    appen
54c0: 64 54 65 78 74 28 26 73 2c 20 7a 44 69 76 2c 20  dText(&s, zDiv, 
54d0: 30 29 3b 0a 20 20 20 20 7a 44 69 76 20 3d 20 22  0);.    zDiv = "
54e0: 2c 22 3b 0a 20 20 20 20 63 51 75 6f 74 65 20 3d  ,";.    cQuote =
54f0: 20 71 75 6f 74 65 43 68 61 72 28 7a 43 6f 6c 29   quoteChar(zCol)
5500: 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78 74  ;.    appendText
5510: 28 26 73 2c 20 7a 43 6f 6c 2c 20 63 51 75 6f 74  (&s, zCol, cQuot
5520: 65 29 3b 0a 20 20 7d 0a 20 20 61 70 70 65 6e 64  e);.  }.  append
5530: 54 65 78 74 28 26 73 2c 20 22 29 22 2c 20 30 29  Text(&s, ")", 0)
5540: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  ;.  sqlite3_fina
5550: 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69  lize(pStmt);.  i
5560: 66 28 20 6e 52 6f 77 3d 3d 30 20 29 7b 0a 20 20  f( nRow==0 ){.  
5570: 20 20 66 72 65 65 54 65 78 74 28 26 73 29 3b 0a    freeText(&s);.
5580: 20 20 20 20 73 2e 7a 20 3d 20 30 3b 0a 20 20 7d      s.z = 0;.  }
5590: 0a 20 20 72 65 74 75 72 6e 20 73 2e 7a 3b 0a 7d  .  return s.z;.}
55a0: 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63  ../*.** SQL func
55b0: 74 69 6f 6e 3a 20 20 73 68 65 6c 6c 5f 6d 6f 64  tion:  shell_mod
55c0: 75 6c 65 5f 73 63 68 65 6d 61 28 58 29 0a 2a 2a  ule_schema(X).**
55d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 66 61 6b  .** Return a fak
55e0: 65 20 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65  e schema for the
55f0: 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 20 66 75   table-valued fu
5600: 6e 63 74 69 6f 6e 20 6f 72 20 65 70 6f 6e 79 6d  nction or eponym
5610: 6f 75 73 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74  ous virtual.** t
5620: 61 62 6c 65 20 58 2e 0a 2a 2f 0a 73 74 61 74 69  able X..*/.stati
5630: 63 20 76 6f 69 64 20 73 68 65 6c 6c 4d 6f 64 75  c void shellModu
5640: 6c 65 53 63 68 65 6d 61 28 0a 20 20 73 71 6c 69  leSchema(.  sqli
5650: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
5660: 78 2c 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20  x,.  int nVal,. 
5670: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
5680: 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 63 6f 6e 73  *apVal.){.  cons
5690: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20  t char *zName = 
56a0: 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
56b0: 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
56c0: 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 63 68 61  apVal[0]);.  cha
56d0: 72 20 2a 7a 46 61 6b 65 20 3d 20 73 68 65 6c 6c  r *zFake = shell
56e0: 46 61 6b 65 53 63 68 65 6d 61 28 73 71 6c 69 74  FakeSchema(sqlit
56f0: 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61  e3_context_db_ha
5700: 6e 64 6c 65 28 70 43 74 78 29 2c 20 30 2c 20 7a  ndle(pCtx), 0, z
5710: 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 7a 46 61  Name);.  if( zFa
5720: 6b 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ke ){.    sqlite
5730: 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43  3_result_text(pC
5740: 74 78 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  tx, sqlite3_mpri
5750: 6e 74 66 28 22 2f 2a 20 25 73 20 2a 2f 22 2c 20  ntf("/* %s */", 
5760: 7a 46 61 6b 65 29 2c 0a 20 20 20 20 20 20 20 20  zFake),.        
5770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5780: 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  -1, sqlite3_free
5790: 29 3b 0a 20 20 20 20 66 72 65 65 28 7a 46 61 6b  );.    free(zFak
57a0: 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  e);.  }.}../*.**
57b0: 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20   SQL function:  
57c0: 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68 65 6d 61  shell_add_schema
57d0: 28 53 2c 58 29 0a 2a 2a 0a 2a 2a 20 41 64 64 20  (S,X).**.** Add 
57e0: 74 68 65 20 73 63 68 65 6d 61 20 6e 61 6d 65 20  the schema name 
57f0: 58 20 74 6f 20 74 68 65 20 43 52 45 41 54 45 20  X to the CREATE 
5800: 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 53 20 61  statement in S a
5810: 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 72 65  nd return the re
5820: 73 75 6c 74 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65  sult..** Example
5830: 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41  s:.**.**    CREA
5840: 54 45 20 54 41 42 4c 45 20 74 31 28 78 29 20 20  TE TABLE t1(x)  
5850: 20 2d 3e 20 20 20 43 52 45 41 54 45 20 54 41 42   ->   CREATE TAB
5860: 4c 45 20 78 79 7a 2e 74 31 28 78 29 3b 0a 2a 2a  LE xyz.t1(x);.**
5870: 0a 2a 2a 20 41 6c 73 6f 20 77 6f 72 6b 73 20 6f  .** Also works o
5880: 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41 54  n.**.**    CREAT
5890: 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 43 52  E INDEX.**    CR
58a0: 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45  EATE UNIQUE INDE
58b0: 58 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20 56  X.**    CREATE V
58c0: 49 45 57 0a 2a 2a 20 20 20 20 43 52 45 41 54 45  IEW.**    CREATE
58d0: 20 54 52 49 47 47 45 52 0a 2a 2a 20 20 20 20 43   TRIGGER.**    C
58e0: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41  REATE VIRTUAL TA
58f0: 42 4c 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 55  BLE.**.** This U
5900: 44 46 20 69 73 20 75 73 65 64 20 62 79 20 74 68  DF is used by th
5910: 65 20 2e 73 63 68 65 6d 61 20 63 6f 6d 6d 61 6e  e .schema comman
5920: 64 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20  d to insert the 
5930: 73 63 68 65 6d 61 20 6e 61 6d 65 20 6f 66 0a 2a  schema name of.*
5940: 2a 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  * attached datab
5950: 61 73 65 73 20 69 6e 74 6f 20 74 68 65 20 6d 69  ases into the mi
5960: 64 64 6c 65 20 6f 66 20 74 68 65 20 73 71 6c 69  ddle of the sqli
5970: 74 65 5f 6d 61 73 74 65 72 2e 73 71 6c 20 66 69  te_master.sql fi
5980: 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  eld..*/.static v
5990: 6f 69 64 20 73 68 65 6c 6c 41 64 64 53 63 68 65  oid shellAddSche
59a0: 6d 61 4e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65  maName(.  sqlite
59b0: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
59c0: 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20 73  .  int nVal,.  s
59d0: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
59e0: 70 56 61 6c 0a 29 7b 0a 20 20 73 74 61 74 69 63  pVal.){.  static
59f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 50 72   const char *aPr
5a00: 65 66 69 78 5b 5d 20 3d 20 7b 0a 20 20 20 20 20  efix[] = {.     
5a10: 22 54 41 42 4c 45 22 2c 0a 20 20 20 20 20 22 49  "TABLE",.     "I
5a20: 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 55 4e 49  NDEX",.     "UNI
5a30: 51 55 45 20 49 4e 44 45 58 22 2c 0a 20 20 20 20  QUE INDEX",.    
5a40: 20 22 56 49 45 57 22 2c 0a 20 20 20 20 20 22 54   "VIEW",.     "T
5a50: 52 49 47 47 45 52 22 2c 0a 20 20 20 20 20 22 56  RIGGER",.     "V
5a60: 49 52 54 55 41 4c 20 54 41 42 4c 45 22 0a 20 20  IRTUAL TABLE".  
5a70: 7d 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a  };.  int i = 0;.
5a80: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
5a90: 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  n = (const char*
5aa0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
5ab0: 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20  ext(apVal[0]);. 
5ac0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63   const char *zSc
5ad0: 68 65 6d 61 20 3d 20 28 63 6f 6e 73 74 20 63 68  hema = (const ch
5ae0: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
5af0: 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 31 5d 29  e_text(apVal[1])
5b00: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
5b10: 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63  zName = (const c
5b20: 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c  har*)sqlite3_val
5b30: 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 32 5d  ue_text(apVal[2]
5b40: 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  );.  sqlite3 *db
5b50: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65   = sqlite3_conte
5b60: 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74  xt_db_handle(pCt
5b70: 78 29 3b 0a 20 20 69 66 28 20 7a 49 6e 21 3d 30  x);.  if( zIn!=0
5b80: 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 49 6e 2c   && strncmp(zIn,
5b90: 20 22 43 52 45 41 54 45 20 22 2c 20 37 29 3d 3d   "CREATE ", 7)==
5ba0: 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  0 ){.    for(i=0
5bb0: 3b 20 69 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66  ; i<(int)(sizeof
5bc0: 28 61 50 72 65 66 69 78 29 2f 73 69 7a 65 6f 66  (aPrefix)/sizeof
5bd0: 28 61 50 72 65 66 69 78 5b 30 5d 29 29 3b 20 69  (aPrefix[0])); i
5be0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  ++){.      int n
5bf0: 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 50 72 65   = strlen30(aPre
5c00: 66 69 78 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69  fix[i]);.      i
5c10: 66 28 20 73 74 72 6e 63 6d 70 28 7a 49 6e 2b 37  f( strncmp(zIn+7
5c20: 2c 20 61 50 72 65 66 69 78 5b 69 5d 2c 20 6e 29  , aPrefix[i], n)
5c30: 3d 3d 30 20 26 26 20 7a 49 6e 5b 6e 2b 37 5d 3d  ==0 && zIn[n+7]=
5c40: 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =' ' ){.        
5c50: 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 20  char *z = 0;.   
5c60: 20 20 20 20 20 63 68 61 72 20 2a 7a 46 61 6b 65       char *zFake
5c70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66   = 0;.        if
5c80: 28 20 7a 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  ( zSchema ){.   
5c90: 20 20 20 20 20 20 20 63 68 61 72 20 63 51 75 6f         char cQuo
5ca0: 74 65 20 3d 20 71 75 6f 74 65 43 68 61 72 28 7a  te = quoteChar(z
5cb0: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20  Schema);.       
5cc0: 20 20 20 69 66 28 20 63 51 75 6f 74 65 20 26 26     if( cQuote &&
5cd0: 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
5ce0: 28 7a 53 63 68 65 6d 61 2c 22 74 65 6d 70 22 29  (zSchema,"temp")
5cf0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
5d00: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d     z = sqlite3_m
5d10: 70 72 69 6e 74 66 28 22 25 2e 2a 73 20 5c 22 25  printf("%.*s \"%
5d20: 77 5c 22 2e 25 73 22 2c 20 6e 2b 37 2c 20 7a 49  w\".%s", n+7, zI
5d30: 6e 2c 20 7a 53 63 68 65 6d 61 2c 20 7a 49 6e 2b  n, zSchema, zIn+
5d40: 6e 2b 38 29 3b 0a 20 20 20 20 20 20 20 20 20 20  n+8);.          
5d50: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
5d60: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d     z = sqlite3_m
5d70: 70 72 69 6e 74 66 28 22 25 2e 2a 73 20 25 73 2e  printf("%.*s %s.
5d80: 25 73 22 2c 20 6e 2b 37 2c 20 7a 49 6e 2c 20 7a  %s", n+7, zIn, z
5d90: 53 63 68 65 6d 61 2c 20 7a 49 6e 2b 6e 2b 38 29  Schema, zIn+n+8)
5da0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
5db0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5dc0: 69 66 28 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20  if( zName.      
5dd0: 20 20 20 26 26 20 61 50 72 65 66 69 78 5b 69 5d     && aPrefix[i]
5de0: 5b 30 5d 3d 3d 27 56 27 0a 20 20 20 20 20 20 20  [0]=='V'.       
5df0: 20 20 26 26 20 28 7a 46 61 6b 65 20 3d 20 73 68    && (zFake = sh
5e00: 65 6c 6c 46 61 6b 65 53 63 68 65 6d 61 28 64 62  ellFakeSchema(db
5e10: 2c 20 7a 53 63 68 65 6d 61 2c 20 7a 4e 61 6d 65  , zSchema, zName
5e20: 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b  ))!=0.        ){
5e30: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a  .          if( z
5e40: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
5e50: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d     z = sqlite3_m
5e60: 70 72 69 6e 74 66 28 22 25 73 5c 6e 2f 2a 20 25  printf("%s\n/* %
5e70: 73 20 2a 2f 22 2c 20 7a 49 6e 2c 20 7a 46 61 6b  s */", zIn, zFak
5e80: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65  e);.          }e
5e90: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
5ea0: 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72   z = sqlite3_mpr
5eb0: 69 6e 74 66 28 22 25 7a 5c 6e 2f 2a 20 25 73 20  intf("%z\n/* %s 
5ec0: 2a 2f 22 2c 20 7a 2c 20 7a 46 61 6b 65 29 3b 0a  */", z, zFake);.
5ed0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
5ee0: 20 20 20 20 20 20 66 72 65 65 28 7a 46 61 6b 65        free(zFake
5ef0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
5f00: 20 20 20 20 20 69 66 28 20 7a 20 29 7b 0a 20 20       if( z ){.  
5f10: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
5f20: 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78  result_text(pCtx
5f30: 2c 20 7a 2c 20 2d 31 2c 20 73 71 6c 69 74 65 33  , z, -1, sqlite3
5f40: 5f 66 72 65 65 29 3b 0a 20 20 20 20 20 20 20 20  _free);.        
5f50: 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20    return;.      
5f60: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
5f70: 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
5f80: 72 65 73 75 6c 74 5f 76 61 6c 75 65 28 70 43 74  result_value(pCt
5f90: 78 2c 20 61 70 56 61 6c 5b 30 5d 29 3b 0a 7d 0a  x, apVal[0]);.}.
5fa0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 73 6f 75 72 63  ./*.** The sourc
5fb0: 65 20 63 6f 64 65 20 66 6f 72 20 73 65 76 65 72  e code for sever
5fc0: 61 6c 20 72 75 6e 2d 74 69 6d 65 20 6c 6f 61 64  al run-time load
5fd0: 61 62 6c 65 20 65 78 74 65 6e 73 69 6f 6e 73 20  able extensions 
5fe0: 69 73 20 69 6e 73 65 72 74 65 64 0a 2a 2a 20 62  is inserted.** b
5ff0: 65 6c 6f 77 20 62 79 20 74 68 65 20 2e 2e 2f 74  elow by the ../t
6000: 6f 6f 6c 2f 6d 6b 73 68 65 6c 6c 63 2e 74 63 6c  ool/mkshellc.tcl
6010: 20 73 63 72 69 70 74 2e 20 20 42 65 66 6f 72 65   script.  Before
6020: 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74   processing that
6030: 20 69 6e 63 6c 75 64 65 64 0a 2a 2a 20 63 6f 64   included.** cod
6040: 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 6f 76  e, we need to ov
6050: 65 72 72 69 64 65 20 73 6f 6d 65 20 6d 61 63 72  erride some macr
6060: 6f 73 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 69  os to make the i
6070: 6e 63 6c 75 64 65 64 20 70 72 6f 67 72 61 6d 20  ncluded program 
6080: 63 6f 64 65 0a 2a 2a 20 77 6f 72 6b 20 68 65 72  code.** work her
6090: 65 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65 20  e in the middle 
60a0: 6f 66 20 74 68 69 73 20 72 65 67 75 6c 61 72 20  of this regular 
60b0: 70 72 6f 67 72 61 6d 2e 0a 2a 2f 0a 23 64 65 66  program..*/.#def
60c0: 69 6e 65 20 53 51 4c 49 54 45 5f 45 58 54 45 4e  ine SQLITE_EXTEN
60d0: 53 49 4f 4e 5f 49 4e 49 54 31 0a 23 64 65 66 69  SION_INIT1.#defi
60e0: 6e 65 20 53 51 4c 49 54 45 5f 45 58 54 45 4e 53  ne SQLITE_EXTENS
60f0: 49 4f 4e 5f 49 4e 49 54 32 28 58 29 20 28 76 6f  ION_INIT2(X) (vo
6100: 69 64 29 28 58 29 0a 0a 23 69 66 20 64 65 66 69  id)(X)..#if defi
6110: 6e 65 64 28 5f 57 49 4e 33 32 29 20 26 26 20 64  ned(_WIN32) && d
6120: 65 66 69 6e 65 64 28 5f 4d 53 43 5f 56 45 52 29  efined(_MSC_VER)
6130: 0a 49 4e 43 4c 55 44 45 20 74 65 73 74 5f 77 69  .INCLUDE test_wi
6140: 6e 64 69 72 65 6e 74 2e 68 0a 49 4e 43 4c 55 44  ndirent.h.INCLUD
6150: 45 20 74 65 73 74 5f 77 69 6e 64 69 72 65 6e 74  E test_windirent
6160: 2e 63 0a 23 64 65 66 69 6e 65 20 64 69 72 65 6e  .c.#define diren
6170: 74 20 44 49 52 45 4e 54 0a 23 65 6e 64 69 66 0a  t DIRENT.#endif.
6180: 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d  INCLUDE ../ext/m
6190: 69 73 63 2f 73 68 61 74 68 72 65 65 2e 63 0a 49  isc/shathree.c.I
61a0: 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69  NCLUDE ../ext/mi
61b0: 73 63 2f 66 69 6c 65 69 6f 2e 63 0a 49 4e 43 4c  sc/fileio.c.INCL
61c0: 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f  UDE ../ext/misc/
61d0: 63 6f 6d 70 6c 65 74 69 6f 6e 2e 63 0a 49 4e 43  completion.c.INC
61e0: 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63  LUDE ../ext/misc
61f0: 2f 61 70 70 65 6e 64 76 66 73 2e 63 0a 23 69 66  /appendvfs.c.#if
6200: 64 65 66 20 53 51 4c 49 54 45 5f 48 41 56 45 5f  def SQLITE_HAVE_
6210: 5a 4c 49 42 0a 49 4e 43 4c 55 44 45 20 2e 2e 2f  ZLIB.INCLUDE ../
6220: 65 78 74 2f 6d 69 73 63 2f 7a 69 70 66 69 6c 65  ext/misc/zipfile
6230: 2e 63 0a 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78  .c.INCLUDE ../ex
6240: 74 2f 6d 69 73 63 2f 73 71 6c 61 72 2e 63 0a 23  t/misc/sqlar.c.#
6250: 65 6e 64 69 66 0a 49 4e 43 4c 55 44 45 20 2e 2e  endif.INCLUDE ..
6260: 2f 65 78 74 2f 65 78 70 65 72 74 2f 73 71 6c 69  /ext/expert/sqli
6270: 74 65 33 65 78 70 65 72 74 2e 68 0a 49 4e 43 4c  te3expert.h.INCL
6280: 55 44 45 20 2e 2e 2f 65 78 74 2f 65 78 70 65 72  UDE ../ext/exper
6290: 74 2f 73 71 6c 69 74 65 33 65 78 70 65 72 74 2e  t/sqlite3expert.
62a0: 63 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  c..#if defined(S
62b0: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53  QLITE_ENABLE_SES
62c0: 53 49 4f 4e 29 0a 2f 2a 0a 2a 2a 20 53 74 61 74  SION)./*.** Stat
62d0: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f  e information fo
62e0: 72 20 61 20 73 69 6e 67 6c 65 20 6f 70 65 6e 20  r a single open 
62f0: 73 65 73 73 69 6f 6e 0a 2a 2f 0a 74 79 70 65 64  session.*/.typed
6300: 65 66 20 73 74 72 75 63 74 20 4f 70 65 6e 53 65  ef struct OpenSe
6310: 73 73 69 6f 6e 20 4f 70 65 6e 53 65 73 73 69 6f  ssion OpenSessio
6320: 6e 3b 0a 73 74 72 75 63 74 20 4f 70 65 6e 53 65  n;.struct OpenSe
6330: 73 73 69 6f 6e 20 7b 0a 20 20 63 68 61 72 20 2a  ssion {.  char *
6340: 7a 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20  zName;          
6350: 20 20 20 2f 2a 20 53 79 6d 62 6f 6c 69 63 20 6e     /* Symbolic n
6360: 61 6d 65 20 66 6f 72 20 74 68 69 73 20 73 65 73  ame for this ses
6370: 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 46  sion */.  int nF
6380: 69 6c 74 65 72 3b 20 20 20 20 20 20 20 20 20 20  ilter;          
6390: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
63a0: 78 46 69 6c 74 65 72 20 72 65 6a 65 63 74 69 6f  xFilter rejectio
63b0: 6e 20 47 4c 4f 42 20 70 61 74 74 65 72 6e 73 20  n GLOB patterns 
63c0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 46 69  */.  char **azFi
63d0: 6c 74 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a  lter;         /*
63e0: 20 41 72 72 61 79 20 6f 66 20 78 46 69 6c 74 65   Array of xFilte
63f0: 72 20 72 65 6a 65 63 74 69 6f 6e 20 47 4c 4f 42  r rejection GLOB
6400: 20 70 61 74 74 65 72 6e 73 20 2a 2f 0a 20 20 73   patterns */.  s
6410: 71 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a  qlite3_session *
6420: 70 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f  p;      /* The o
6430: 70 65 6e 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 7d  pen session */.}
6440: 3b 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ;.#endif../*.** 
6450: 53 68 65 6c 6c 20 6f 75 74 70 75 74 20 6d 6f 64  Shell output mod
6460: 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72  e information fr
6470: 6f 6d 20 62 65 66 6f 72 65 20 22 2e 65 78 70 6c  om before ".expl
6480: 61 69 6e 20 6f 6e 22 2c 0a 2a 2a 20 73 61 76 65  ain on",.** save
6490: 64 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e  d so that it can
64a0: 20 62 65 20 72 65 73 74 6f 72 65 64 20 62 79 20   be restored by 
64b0: 22 2e 65 78 70 6c 61 69 6e 20 6f 66 66 22 0a 2a  ".explain off".*
64c0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
64d0: 20 53 61 76 65 64 4d 6f 64 65 49 6e 66 6f 20 53   SavedModeInfo S
64e0: 61 76 65 64 4d 6f 64 65 49 6e 66 6f 3b 0a 73 74  avedModeInfo;.st
64f0: 72 75 63 74 20 53 61 76 65 64 4d 6f 64 65 49 6e  ruct SavedModeIn
6500: 66 6f 20 7b 0a 20 20 69 6e 74 20 76 61 6c 69 64  fo {.  int valid
6510: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 73  ;          /* Is
6520: 20 74 68 65 72 65 20 6c 65 67 69 74 20 64 61 74   there legit dat
6530: 61 20 69 6e 20 68 65 72 65 3f 20 2a 2f 0a 20 20  a in here? */.  
6540: 69 6e 74 20 6d 6f 64 65 3b 20 20 20 20 20 20 20  int mode;       
6550: 20 20 20 20 2f 2a 20 4d 6f 64 65 20 70 72 69 6f      /* Mode prio
6560: 72 20 74 6f 20 22 2e 65 78 70 6c 61 69 6e 20 6f  r to ".explain o
6570: 6e 22 20 2a 2f 0a 20 20 69 6e 74 20 73 68 6f 77  n" */.  int show
6580: 48 65 61 64 65 72 3b 20 20 20 20 20 2f 2a 20 54  Header;     /* T
6590: 68 65 20 22 2e 68 65 61 64 65 72 22 20 73 65 74  he ".header" set
65a0: 74 69 6e 67 20 70 72 69 6f 72 20 74 6f 20 22 2e  ting prior to ".
65b0: 65 78 70 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20  explain on" */. 
65c0: 20 69 6e 74 20 63 6f 6c 57 69 64 74 68 5b 31 30   int colWidth[10
65d0: 30 5d 3b 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 77  0];  /* Column w
65e0: 69 64 74 68 73 20 70 72 69 6f 72 20 74 6f 20 22  idths prior to "
65f0: 2e 65 78 70 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a  .explain on" */.
6600: 7d 3b 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75  };..typedef stru
6610: 63 74 20 45 78 70 65 72 74 49 6e 66 6f 20 45 78  ct ExpertInfo Ex
6620: 70 65 72 74 49 6e 66 6f 3b 0a 73 74 72 75 63 74  pertInfo;.struct
6630: 20 45 78 70 65 72 74 49 6e 66 6f 20 7b 0a 20 20   ExpertInfo {.  
6640: 73 71 6c 69 74 65 33 65 78 70 65 72 74 20 2a 70  sqlite3expert *p
6650: 45 78 70 65 72 74 3b 0a 20 20 69 6e 74 20 62 56  Expert;.  int bV
6660: 65 72 62 6f 73 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a  erbose;.};../*.*
6670: 2a 20 53 74 61 74 65 20 69 6e 66 6f 72 6d 61 74  * State informat
6680: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 64 61  ion about the da
6690: 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
66a0: 6e 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69  n is contained i
66b0: 6e 20 61 6e 0a 2a 2a 20 69 6e 73 74 61 6e 63 65  n an.** instance
66c0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
66d0: 67 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a  g structure..*/.
66e0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53  typedef struct S
66f0: 68 65 6c 6c 53 74 61 74 65 20 53 68 65 6c 6c 53  hellState ShellS
6700: 74 61 74 65 3b 0a 73 74 72 75 63 74 20 53 68 65  tate;.struct She
6710: 6c 6c 53 74 61 74 65 20 7b 0a 20 20 73 71 6c 69  llState {.  sqli
6720: 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20  te3 *db;        
6730: 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61     /* The databa
6740: 73 65 20 2a 2f 0a 20 20 75 38 20 61 75 74 6f 45  se */.  u8 autoE
6750: 78 70 6c 61 69 6e 3b 20 20 20 20 20 20 20 20 2f  xplain;        /
6760: 2a 20 41 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * Automatically 
6770: 74 75 72 6e 20 6f 6e 20 2e 65 78 70 6c 61 69 6e  turn on .explain
6780: 20 6d 6f 64 65 20 2a 2f 0a 20 20 75 38 20 61 75   mode */.  u8 au
6790: 74 6f 45 51 50 3b 20 20 20 20 20 20 20 20 20 20  toEQP;          
67a0: 20 20 2f 2a 20 52 75 6e 20 45 58 50 4c 41 49 4e    /* Run EXPLAIN
67b0: 20 51 55 45 52 59 20 50 4c 41 4e 20 70 72 69 6f   QUERY PLAN prio
67c0: 72 20 74 6f 20 73 65 61 63 68 20 53 51 4c 20 73  r to seach SQL s
67d0: 74 6d 74 20 2a 2f 0a 20 20 75 38 20 73 74 61 74  tmt */.  u8 stat
67e0: 73 4f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20  sOn;            
67f0: 2f 2a 20 54 72 75 65 20 74 6f 20 64 69 73 70 6c  /* True to displ
6800: 61 79 20 6d 65 6d 6f 72 79 20 73 74 61 74 73 20  ay memory stats 
6810: 62 65 66 6f 72 65 20 65 61 63 68 20 66 69 6e 61  before each fina
6820: 6c 69 7a 65 20 2a 2f 0a 20 20 75 38 20 73 63 61  lize */.  u8 sca
6830: 6e 73 74 61 74 73 4f 6e 3b 20 20 20 20 20 20 20  nstatsOn;       
6840: 20 2f 2a 20 54 72 75 65 20 74 6f 20 64 69 73 70   /* True to disp
6850: 6c 61 79 20 73 63 61 6e 20 73 74 61 74 73 20 62  lay scan stats b
6860: 65 66 6f 72 65 20 65 61 63 68 20 66 69 6e 61 6c  efore each final
6870: 69 7a 65 20 2a 2f 0a 20 20 75 38 20 6f 70 65 6e  ize */.  u8 open
6880: 4d 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20  Mode;           
6890: 2f 2a 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f  /* SHELL_OPEN_NO
68a0: 52 4d 41 4c 2c 20 5f 41 50 50 45 4e 44 56 46 53  RMAL, _APPENDVFS
68b0: 2c 20 6f 72 20 5f 5a 49 50 46 49 4c 45 20 2a 2f  , or _ZIPFILE */
68c0: 0a 20 20 69 6e 74 20 6f 75 74 43 6f 75 6e 74 3b  .  int outCount;
68d0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 76            /* Rev
68e0: 65 72 74 20 74 6f 20 73 74 64 6f 75 74 20 77 68  ert to stdout wh
68f0: 65 6e 20 72 65 61 63 68 69 6e 67 20 7a 65 72 6f  en reaching zero
6900: 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20   */.  int cnt;  
6910: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6920: 4e 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64  Number of record
6930: 73 20 64 69 73 70 6c 61 79 65 64 20 73 6f 20 66  s displayed so f
6940: 61 72 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 6f 75  ar */.  FILE *ou
6950: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  t;             /
6960: 2a 20 57 72 69 74 65 20 72 65 73 75 6c 74 73 20  * Write results 
6970: 68 65 72 65 20 2a 2f 0a 20 20 46 49 4c 45 20 2a  here */.  FILE *
6980: 74 72 61 63 65 4f 75 74 3b 20 20 20 20 20 20 20  traceOut;       
6990: 20 2f 2a 20 4f 75 74 70 75 74 20 66 6f 72 20 73   /* Output for s
69a0: 71 6c 69 74 65 33 5f 74 72 61 63 65 28 29 20 2a  qlite3_trace() *
69b0: 2f 0a 20 20 69 6e 74 20 6e 45 72 72 3b 20 20 20  /.  int nErr;   
69c0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
69d0: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73  mber of errors s
69e0: 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64  een */.  int mod
69f0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e;              
6a00: 2f 2a 20 41 6e 20 6f 75 74 70 75 74 20 6d 6f 64  /* An output mod
6a10: 65 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 69  e setting */.  i
6a20: 6e 74 20 63 4d 6f 64 65 3b 20 20 20 20 20 20 20  nt cMode;       
6a30: 20 20 20 20 20 20 2f 2a 20 74 65 6d 70 6f 72 61        /* tempora
6a40: 72 79 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 66  ry output mode f
6a50: 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 71  or the current q
6a60: 75 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f  uery */.  int no
6a70: 72 6d 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20  rmalMode;       
6a80: 20 2f 2a 20 4f 75 74 70 75 74 20 6d 6f 64 65 20   /* Output mode 
6a90: 62 65 66 6f 72 65 20 22 2e 65 78 70 6c 61 69 6e  before ".explain
6aa0: 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74 20 77 72   on" */.  int wr
6ab0: 69 74 61 62 6c 65 53 63 68 65 6d 61 3b 20 20 20  itableSchema;   
6ac0: 20 2f 2a 20 54 72 75 65 20 69 66 20 50 52 41 47   /* True if PRAG
6ad0: 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65  MA writable_sche
6ae0: 6d 61 3d 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 73  ma=ON */.  int s
6af0: 68 6f 77 48 65 61 64 65 72 3b 20 20 20 20 20 20  howHeader;      
6b00: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 68 6f    /* True to sho
6b10: 77 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69  w column names i
6b20: 6e 20 4c 69 73 74 20 6f 72 20 43 6f 6c 75 6d 6e  n List or Column
6b30: 20 6d 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   mode */.  int n
6b40: 43 68 65 63 6b 3b 20 20 20 20 20 20 20 20 20 20  Check;          
6b50: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 22    /* Number of "
6b60: 2e 63 68 65 63 6b 22 20 63 6f 6d 6d 61 6e 64 73  .check" commands
6b70: 20 72 75 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e   run */.  unsign
6b80: 65 64 20 73 68 65 6c 6c 46 6c 67 73 3b 20 20 20  ed shellFlgs;   
6b90: 20 2f 2a 20 56 61 72 69 6f 75 73 20 66 6c 61 67   /* Various flag
6ba0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 65  s */.  char *zDe
6bb0: 73 74 54 61 62 6c 65 3b 20 20 20 20 20 20 2f 2a  stTable;      /*
6bc0: 20 4e 61 6d 65 20 6f 66 20 64 65 73 74 69 6e 61   Name of destina
6bd0: 74 69 6f 6e 20 74 61 62 6c 65 20 77 68 65 6e 20  tion table when 
6be0: 4d 4f 44 45 5f 49 6e 73 65 72 74 20 2a 2f 0a 20  MODE_Insert */. 
6bf0: 20 63 68 61 72 20 7a 54 65 73 74 63 61 73 65 5b   char zTestcase[
6c00: 33 30 5d 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20  30];    /* Name 
6c10: 6f 66 20 63 75 72 72 65 6e 74 20 74 65 73 74 20  of current test 
6c20: 63 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 63  case */.  char c
6c30: 6f 6c 53 65 70 61 72 61 74 6f 72 5b 32 30 5d 3b  olSeparator[20];
6c40: 20 2f 2a 20 43 6f 6c 75 6d 6e 20 73 65 70 61 72   /* Column separ
6c50: 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 20 66  ator character f
6c60: 6f 72 20 73 65 76 65 72 61 6c 20 6d 6f 64 65 73  or several modes
6c70: 20 2a 2f 0a 20 20 63 68 61 72 20 72 6f 77 53 65   */.  char rowSe
6c80: 70 61 72 61 74 6f 72 5b 32 30 5d 3b 20 2f 2a 20  parator[20]; /* 
6c90: 52 6f 77 20 73 65 70 61 72 61 74 6f 72 20 63 68  Row separator ch
6ca0: 61 72 61 63 74 65 72 20 66 6f 72 20 4d 4f 44 45  aracter for MODE
6cb0: 5f 41 73 63 69 69 20 2a 2f 0a 20 20 69 6e 74 20  _Ascii */.  int 
6cc0: 63 6f 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20 20  colWidth[100];  
6cd0: 20 20 20 2f 2a 20 52 65 71 75 65 73 74 65 64 20     /* Requested 
6ce0: 77 69 64 74 68 20 6f 66 20 65 61 63 68 20 63 6f  width of each co
6cf0: 6c 75 6d 6e 20 77 68 65 6e 20 69 6e 20 63 6f 6c  lumn when in col
6d00: 75 6d 6e 20 6d 6f 64 65 2a 2f 0a 20 20 69 6e 74  umn mode*/.  int
6d10: 20 61 63 74 75 61 6c 57 69 64 74 68 5b 31 30 30   actualWidth[100
6d20: 5d 3b 20 20 2f 2a 20 41 63 74 75 61 6c 20 77 69  ];  /* Actual wi
6d30: 64 74 68 20 6f 66 20 65 61 63 68 20 63 6f 6c 75  dth of each colu
6d40: 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20 6e 75 6c  mn */.  char nul
6d50: 6c 56 61 6c 75 65 5b 32 30 5d 3b 20 20 20 20 2f  lValue[20];    /
6d60: 2a 20 54 68 65 20 74 65 78 74 20 74 6f 20 70 72  * The text to pr
6d70: 69 6e 74 20 77 68 65 6e 20 61 20 4e 55 4c 4c 20  int when a NULL 
6d80: 63 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f 6d 0a  comes back from.
6d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6da0: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20           ** the 
6db0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68  database */.  ch
6dc0: 61 72 20 6f 75 74 66 69 6c 65 5b 46 49 4c 45 4e  ar outfile[FILEN
6dd0: 41 4d 45 5f 4d 41 58 5d 3b 20 2f 2a 20 46 69 6c  AME_MAX]; /* Fil
6de0: 65 6e 61 6d 65 20 66 6f 72 20 2a 6f 75 74 20 2a  ename for *out *
6df0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
6e00: 7a 44 62 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20  zDbFilename;    
6e10: 2f 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* name of the d
6e20: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
6e30: 20 20 63 68 61 72 20 2a 7a 46 72 65 65 4f 6e 43    char *zFreeOnC
6e40: 6c 6f 73 65 3b 20 20 20 20 20 20 20 20 20 2f 2a  lose;         /*
6e50: 20 46 69 6c 65 6e 61 6d 65 20 74 6f 20 66 72 65   Filename to fre
6e60: 65 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a  e when closing *
6e70: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
6e80: 7a 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 20  zVfs;           
6e90: 2f 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53 20 74  /* Name of VFS t
6ea0: 6f 20 75 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74  o use */.  sqlit
6eb0: 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20  e3_stmt *pStmt; 
6ec0: 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 74 61    /* Current sta
6ed0: 74 65 6d 65 6e 74 20 69 66 20 61 6e 79 2e 20 2a  tement if any. *
6ee0: 2f 0a 20 20 46 49 4c 45 20 2a 70 4c 6f 67 3b 20  /.  FILE *pLog; 
6ef0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72             /* Wr
6f00: 69 74 65 20 6c 6f 67 20 6f 75 74 70 75 74 20 68  ite log output h
6f10: 65 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69  ere */.  int *ai
6f20: 49 6e 64 65 6e 74 3b 20 20 20 20 20 20 20 20 20  Indent;         
6f30: 2f 2a 20 41 72 72 61 79 20 6f 66 20 69 6e 64 65  /* Array of inde
6f40: 6e 74 73 20 75 73 65 64 20 69 6e 20 4d 4f 44 45  nts used in MODE
6f50: 5f 45 78 70 6c 61 69 6e 20 2a 2f 0a 20 20 69 6e  _Explain */.  in
6f60: 74 20 6e 49 6e 64 65 6e 74 3b 20 20 20 20 20 20  t nIndent;      
6f70: 20 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20       /* Size of 
6f80: 61 72 72 61 79 20 61 69 49 6e 64 65 6e 74 5b 5d  array aiIndent[]
6f90: 20 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65 6e   */.  int iInden
6fa0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  t;           /* 
6fb0: 49 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74  Index of current
6fc0: 20 6f 70 20 69 6e 20 61 69 49 6e 64 65 6e 74 5b   op in aiIndent[
6fd0: 5d 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64  ] */.#if defined
6fe0: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53  (SQLITE_ENABLE_S
6ff0: 45 53 53 49 4f 4e 29 0a 20 20 69 6e 74 20 6e 53  ESSION).  int nS
7000: 65 73 73 69 6f 6e 3b 20 20 20 20 20 20 20 20 20  ession;         
7010: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
7020: 20 61 63 74 69 76 65 20 73 65 73 73 69 6f 6e 73   active sessions
7030: 20 2a 2f 0a 20 20 4f 70 65 6e 53 65 73 73 69 6f   */.  OpenSessio
7040: 6e 20 61 53 65 73 73 69 6f 6e 5b 34 5d 3b 20 20  n aSession[4];  
7050: 2f 2a 20 41 72 72 61 79 20 6f 66 20 73 65 73 73  /* Array of sess
7060: 69 6f 6e 73 2e 20 20 5b 30 5d 20 69 73 20 69 6e  ions.  [0] is in
7070: 20 66 6f 63 75 73 2e 20 2a 2f 0a 23 65 6e 64 69   focus. */.#endi
7080: 66 0a 20 20 45 78 70 65 72 74 49 6e 66 6f 20 65  f.  ExpertInfo e
7090: 78 70 65 72 74 3b 20 20 20 20 20 20 20 20 2f 2a  xpert;        /*
70a0: 20 56 61 6c 69 64 20 69 66 20 70 72 65 76 69 6f   Valid if previo
70b0: 75 73 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20 22  us command was "
70c0: 2e 65 78 70 65 72 74 20 4f 50 54 2e 2e 2e 22 20  .expert OPT..." 
70d0: 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a 20 41 6c 6c 6f 77  */.};.../* Allow
70e0: 65 64 20 76 61 6c 75 65 73 20 66 6f 72 20 53 68  ed values for Sh
70f0: 65 6c 6c 53 74 61 74 65 2e 61 75 74 6f 45 51 50  ellState.autoEQP
7100: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 41 55 54 4f  .*/.#define AUTO
7110: 45 51 50 5f 6f 66 66 20 20 20 20 20 20 30 0a 23  EQP_off      0.#
7120: 64 65 66 69 6e 65 20 41 55 54 4f 45 51 50 5f 6f  define AUTOEQP_o
7130: 6e 20 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e  n       1.#defin
7140: 65 20 41 55 54 4f 45 51 50 5f 74 72 69 67 67 65  e AUTOEQP_trigge
7150: 72 20 20 32 0a 23 64 65 66 69 6e 65 20 41 55 54  r  2.#define AUT
7160: 4f 45 51 50 5f 66 75 6c 6c 20 20 20 20 20 33 0a  OEQP_full     3.
7170: 0a 2f 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75  ./* Allowed valu
7180: 65 73 20 66 6f 72 20 53 68 65 6c 6c 53 74 61 74  es for ShellStat
7190: 65 2e 6f 70 65 6e 4d 6f 64 65 0a 2a 2f 0a 23 64  e.openMode.*/.#d
71a0: 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e  efine SHELL_OPEN
71b0: 5f 55 4e 53 50 45 43 20 20 20 20 20 30 20 20 20  _UNSPEC     0   
71c0: 20 20 20 2f 2a 20 4e 6f 20 6f 70 65 6e 2d 6d 6f     /* No open-mo
71d0: 64 65 20 73 70 65 63 69 66 69 65 64 20 2a 2f 0a  de specified */.
71e0: 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50  #define SHELL_OP
71f0: 45 4e 5f 4e 4f 52 4d 41 4c 20 20 20 20 20 31 20  EN_NORMAL     1 
7200: 20 20 20 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 64       /* Normal d
7210: 61 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a  atabase file */.
7220: 23 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50  #define SHELL_OP
7230: 45 4e 5f 41 50 50 45 4e 44 56 46 53 20 20 32 20  EN_APPENDVFS  2 
7240: 20 20 20 20 20 2f 2a 20 55 73 65 20 61 70 70 65       /* Use appe
7250: 6e 64 76 66 73 20 2a 2f 0a 23 64 65 66 69 6e 65  ndvfs */.#define
7260: 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46   SHELL_OPEN_ZIPF
7270: 49 4c 45 20 20 20 20 33 20 20 20 20 20 20 2f 2a  ILE    3      /*
7280: 20 55 73 65 20 74 68 65 20 7a 69 70 66 69 6c 65   Use the zipfile
7290: 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a   virtual table *
72a0: 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61  /../*.** These a
72b0: 72 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 73  re the allowed s
72c0: 68 65 6c 6c 46 6c 67 73 20 76 61 6c 75 65 73 0a  hellFlgs values.
72d0: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47  */.#define SHFLG
72e0: 5f 50 61 67 65 63 61 63 68 65 20 20 20 20 20 20  _Pagecache      
72f0: 30 78 30 30 30 30 30 30 30 31 20 2f 2a 20 54 68  0x00000001 /* Th
7300: 65 20 2d 2d 70 61 67 65 63 61 63 68 65 20 6f 70  e --pagecache op
7310: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 2a 2f 0a  tion is used */.
7320: 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 4c 6f  #define SHFLG_Lo
7330: 6f 6b 61 73 69 64 65 20 20 20 20 20 20 30 78 30  okaside      0x0
7340: 30 30 30 30 30 30 32 20 2f 2a 20 4c 6f 6f 6b 61  0000002 /* Looka
7350: 73 69 64 65 20 6d 65 6d 6f 72 79 20 69 73 20 75  side memory is u
7360: 73 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  sed */.#define S
7370: 48 46 4c 47 5f 42 61 63 6b 73 6c 61 73 68 20 20  HFLG_Backslash  
7380: 20 20 20 20 30 78 30 30 30 30 30 30 30 34 20 2f      0x00000004 /
7390: 2a 20 54 68 65 20 2d 2d 62 61 63 6b 73 6c 61 73  * The --backslas
73a0: 68 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64  h option is used
73b0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c   */.#define SHFL
73c0: 47 5f 50 72 65 73 65 72 76 65 52 6f 77 69 64 20  G_PreserveRowid 
73d0: 20 30 78 30 30 30 30 30 30 30 38 20 2f 2a 20 2e   0x00000008 /* .
73e0: 64 75 6d 70 20 70 72 65 73 65 72 76 65 73 20 72  dump preserves r
73f0: 6f 77 69 64 20 76 61 6c 75 65 73 20 2a 2f 0a 23  owid values */.#
7400: 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 4e 65 77  define SHFLG_New
7410: 6c 69 6e 65 73 20 20 20 20 20 20 20 30 78 30 30  lines       0x00
7420: 30 30 30 30 31 30 20 2f 2a 20 2e 64 75 6d 70 20  000010 /* .dump 
7430: 2d 2d 6e 65 77 6c 69 6e 65 20 66 6c 61 67 20 2a  --newline flag *
7440: 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f  /.#define SHFLG_
7450: 43 6f 75 6e 74 43 68 61 6e 67 65 73 20 20 20 30  CountChanges   0
7460: 78 30 30 30 30 30 30 32 30 20 2f 2a 20 2e 63 68  x00000020 /* .ch
7470: 61 6e 67 65 73 20 73 65 74 74 69 6e 67 20 2a 2f  anges setting */
7480: 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 45  .#define SHFLG_E
7490: 63 68 6f 20 20 20 20 20 20 20 20 20 20 20 30 78  cho           0x
74a0: 30 30 30 30 30 30 34 30 20 2f 2a 20 2e 65 63 68  00000040 /* .ech
74b0: 6f 20 6f 72 20 2d 2d 65 63 68 6f 20 73 65 74 74  o or --echo sett
74c0: 69 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61  ing */../*.** Ma
74d0: 63 72 6f 73 20 66 6f 72 20 74 65 73 74 69 6e 67  cros for testing
74e0: 20 61 6e 64 20 73 65 74 74 69 6e 67 20 73 68 65   and setting she
74f0: 6c 6c 46 6c 67 73 0a 2a 2f 0a 23 64 65 66 69 6e  llFlgs.*/.#defin
7500: 65 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 50  e ShellHasFlag(P
7510: 2c 58 29 20 20 20 20 28 28 28 50 29 2d 3e 73 68  ,X)    (((P)->sh
7520: 65 6c 6c 46 6c 67 73 20 26 20 28 58 29 29 21 3d  ellFlgs & (X))!=
7530: 30 29 0a 23 64 65 66 69 6e 65 20 53 68 65 6c 6c  0).#define Shell
7540: 53 65 74 46 6c 61 67 28 50 2c 58 29 20 20 20 20  SetFlag(P,X)    
7550: 28 28 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 7c  ((P)->shellFlgs|
7560: 3d 28 58 29 29 0a 23 64 65 66 69 6e 65 20 53 68  =(X)).#define Sh
7570: 65 6c 6c 43 6c 65 61 72 46 6c 61 67 28 50 2c 58  ellClearFlag(P,X
7580: 29 20 20 28 28 50 29 2d 3e 73 68 65 6c 6c 46 6c  )  ((P)->shellFl
7590: 67 73 26 3d 28 7e 28 58 29 29 29 0a 0a 2f 2a 0a  gs&=(~(X)))../*.
75a0: 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74 68 65  ** These are the
75b0: 20 61 6c 6c 6f 77 65 64 20 6d 6f 64 65 73 2e 0a   allowed modes..
75c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
75d0: 4c 69 6e 65 20 20 20 20 20 30 20 20 2f 2a 20 4f  Line     0  /* O
75e0: 6e 65 20 63 6f 6c 75 6d 6e 20 70 65 72 20 6c 69  ne column per li
75f0: 6e 65 2e 20 20 42 6c 61 6e 6b 20 6c 69 6e 65 20  ne.  Blank line 
7600: 62 65 74 77 65 65 6e 20 72 65 63 6f 72 64 73 20  between records 
7610: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
7620: 43 6f 6c 75 6d 6e 20 20 20 31 20 20 2f 2a 20 4f  Column   1  /* O
7630: 6e 65 20 72 65 63 6f 72 64 20 70 65 72 20 6c 69  ne record per li
7640: 6e 65 20 69 6e 20 6e 65 61 74 20 63 6f 6c 75 6d  ne in neat colum
7650: 6e 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  ns */.#define MO
7660: 44 45 5f 4c 69 73 74 20 20 20 20 20 32 20 20 2f  DE_List     2  /
7670: 2a 20 4f 6e 65 20 72 65 63 6f 72 64 20 70 65 72  * One record per
7680: 20 6c 69 6e 65 20 77 69 74 68 20 61 20 73 65 70   line with a sep
7690: 61 72 61 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e  arator */.#defin
76a0: 65 20 4d 4f 44 45 5f 53 65 6d 69 20 20 20 20 20  e MODE_Semi     
76b0: 33 20 20 2f 2a 20 53 61 6d 65 20 61 73 20 4d 4f  3  /* Same as MO
76c0: 44 45 5f 4c 69 73 74 20 62 75 74 20 61 70 70 65  DE_List but appe
76d0: 6e 64 20 22 3b 22 20 74 6f 20 65 61 63 68 20 6c  nd ";" to each l
76e0: 69 6e 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  ine */.#define M
76f0: 4f 44 45 5f 48 74 6d 6c 20 20 20 20 20 34 20 20  ODE_Html     4  
7700: 2f 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 58  /* Generate an X
7710: 48 54 4d 4c 20 74 61 62 6c 65 20 2a 2f 0a 23 64  HTML table */.#d
7720: 65 66 69 6e 65 20 4d 4f 44 45 5f 49 6e 73 65 72  efine MODE_Inser
7730: 74 20 20 20 35 20 20 2f 2a 20 47 65 6e 65 72 61  t   5  /* Genera
7740: 74 65 20 53 51 4c 20 22 69 6e 73 65 72 74 22 20  te SQL "insert" 
7750: 73 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 23 64  statements */.#d
7760: 65 66 69 6e 65 20 4d 4f 44 45 5f 51 75 6f 74 65  efine MODE_Quote
7770: 20 20 20 20 36 20 20 2f 2a 20 51 75 6f 74 65 20      6  /* Quote 
7780: 76 61 6c 75 65 73 20 61 73 20 66 6f 72 20 53 51  values as for SQ
7790: 4c 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44  L */.#define MOD
77a0: 45 5f 54 63 6c 20 20 20 20 20 20 37 20 20 2f 2a  E_Tcl      7  /*
77b0: 20 47 65 6e 65 72 61 74 65 20 41 4e 53 49 2d 43   Generate ANSI-C
77c0: 20 6f 72 20 54 43 4c 20 71 75 6f 74 65 64 20 65   or TCL quoted e
77d0: 6c 65 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69  lements */.#defi
77e0: 6e 65 20 4d 4f 44 45 5f 43 73 76 20 20 20 20 20  ne MODE_Csv     
77f0: 20 38 20 20 2f 2a 20 51 75 6f 74 65 20 73 74 72   8  /* Quote str
7800: 69 6e 67 73 2c 20 6e 75 6d 62 65 72 73 20 61 72  ings, numbers ar
7810: 65 20 70 6c 61 69 6e 20 2a 2f 0a 23 64 65 66 69  e plain */.#defi
7820: 6e 65 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20  ne MODE_Explain 
7830: 20 39 20 20 2f 2a 20 4c 69 6b 65 20 4d 4f 44 45   9  /* Like MODE
7840: 5f 43 6f 6c 75 6d 6e 2c 20 62 75 74 20 64 6f 20  _Column, but do 
7850: 6e 6f 74 20 74 72 75 6e 63 61 74 65 20 64 61 74  not truncate dat
7860: 61 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44  a */.#define MOD
7870: 45 5f 41 73 63 69 69 20 20 20 31 30 20 20 2f 2a  E_Ascii   10  /*
7880: 20 55 73 65 20 41 53 43 49 49 20 75 6e 69 74 20   Use ASCII unit 
7890: 61 6e 64 20 72 65 63 6f 72 64 20 73 65 70 61 72  and record separ
78a0: 61 74 6f 72 73 20 28 30 78 31 46 2f 30 78 31 45  ators (0x1F/0x1E
78b0: 29 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44  ) */.#define MOD
78c0: 45 5f 50 72 65 74 74 79 20 20 31 31 20 20 2f 2a  E_Pretty  11  /*
78d0: 20 50 72 65 74 74 79 2d 70 72 69 6e 74 20 73 63   Pretty-print sc
78e0: 68 65 6d 61 73 20 2a 2f 0a 0a 73 74 61 74 69 63  hemas */..static
78f0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 6f 64   const char *mod
7900: 65 44 65 73 63 72 5b 5d 20 3d 20 7b 0a 20 20 22  eDescr[] = {.  "
7910: 6c 69 6e 65 22 2c 0a 20 20 22 63 6f 6c 75 6d 6e  line",.  "column
7920: 22 2c 0a 20 20 22 6c 69 73 74 22 2c 0a 20 20 22  ",.  "list",.  "
7930: 73 65 6d 69 22 2c 0a 20 20 22 68 74 6d 6c 22 2c  semi",.  "html",
7940: 0a 20 20 22 69 6e 73 65 72 74 22 2c 0a 20 20 22  .  "insert",.  "
7950: 71 75 6f 74 65 22 2c 0a 20 20 22 74 63 6c 22 2c  quote",.  "tcl",
7960: 0a 20 20 22 63 73 76 22 2c 0a 20 20 22 65 78 70  .  "csv",.  "exp
7970: 6c 61 69 6e 22 2c 0a 20 20 22 61 73 63 69 69 22  lain",.  "ascii"
7980: 2c 0a 20 20 22 70 72 65 74 74 79 70 72 69 6e 74  ,.  "prettyprint
7990: 22 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ",.};../*.** The
79a0: 73 65 20 61 72 65 20 74 68 65 20 63 6f 6c 75 6d  se are the colum
79b0: 6e 2f 72 6f 77 2f 6c 69 6e 65 20 73 65 70 61 72  n/row/line separ
79c0: 61 74 6f 72 73 20 75 73 65 64 20 62 79 20 74 68  ators used by th
79d0: 65 20 76 61 72 69 6f 75 73 0a 2a 2a 20 69 6d 70  e various.** imp
79e0: 6f 72 74 2f 65 78 70 6f 72 74 20 6d 6f 64 65 73  ort/export modes
79f0: 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 45 50  ..*/.#define SEP
7a00: 5f 43 6f 6c 75 6d 6e 20 20 20 20 22 7c 22 0a 23  _Column    "|".#
7a10: 64 65 66 69 6e 65 20 53 45 50 5f 52 6f 77 20 20  define SEP_Row  
7a20: 20 20 20 20 20 22 5c 6e 22 0a 23 64 65 66 69 6e       "\n".#defin
7a30: 65 20 53 45 50 5f 54 61 62 20 20 20 20 20 20 20  e SEP_Tab       
7a40: 22 5c 74 22 0a 23 64 65 66 69 6e 65 20 53 45 50  "\t".#define SEP
7a50: 5f 53 70 61 63 65 20 20 20 20 20 22 20 22 0a 23  _Space     " ".#
7a60: 64 65 66 69 6e 65 20 53 45 50 5f 43 6f 6d 6d 61  define SEP_Comma
7a70: 20 20 20 20 20 22 2c 22 0a 23 64 65 66 69 6e 65       ",".#define
7a80: 20 53 45 50 5f 43 72 4c 66 20 20 20 20 20 20 22   SEP_CrLf      "
7a90: 5c 72 5c 6e 22 0a 23 64 65 66 69 6e 65 20 53 45  \r\n".#define SE
7aa0: 50 5f 55 6e 69 74 20 20 20 20 20 20 22 5c 78 31  P_Unit      "\x1
7ab0: 46 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 52  F".#define SEP_R
7ac0: 65 63 6f 72 64 20 20 20 20 22 5c 78 31 45 22 0a  ecord    "\x1E".
7ad0: 0a 2f 2a 0a 2a 2a 20 4e 75 6d 62 65 72 20 6f 66  ./*.** Number of
7ae0: 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 6e 20   elements in an 
7af0: 61 72 72 61 79 0a 2a 2f 0a 23 64 65 66 69 6e 65  array.*/.#define
7b00: 20 41 72 72 61 79 53 69 7a 65 28 58 29 20 20 28   ArraySize(X)  (
7b10: 69 6e 74 29 28 73 69 7a 65 6f 66 28 58 29 2f 73  int)(sizeof(X)/s
7b20: 69 7a 65 6f 66 28 58 5b 30 5d 29 29 0a 0a 2f 2a  izeof(X[0]))../*
7b30: 0a 2a 2a 20 41 20 63 61 6c 6c 62 61 63 6b 20 66  .** A callback f
7b40: 6f 72 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6c  or the sqlite3_l
7b50: 6f 67 28 29 20 69 6e 74 65 72 66 61 63 65 2e 0a  og() interface..
7b60: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  */.static void s
7b70: 68 65 6c 6c 4c 6f 67 28 76 6f 69 64 20 2a 70 41  hellLog(void *pA
7b80: 72 67 2c 20 69 6e 74 20 69 45 72 72 43 6f 64 65  rg, int iErrCode
7b90: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d  , const char *zM
7ba0: 73 67 29 7b 0a 20 20 53 68 65 6c 6c 53 74 61 74  sg){.  ShellStat
7bb0: 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61  e *p = (ShellSta
7bc0: 74 65 2a 29 70 41 72 67 3b 0a 20 20 69 66 28 20  te*)pArg;.  if( 
7bd0: 70 2d 3e 70 4c 6f 67 3d 3d 30 20 29 20 72 65 74  p->pLog==0 ) ret
7be0: 75 72 6e 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e  urn;.  utf8_prin
7bf0: 74 66 28 70 2d 3e 70 4c 6f 67 2c 20 22 28 25 64  tf(p->pLog, "(%d
7c00: 29 20 25 73 5c 6e 22 2c 20 69 45 72 72 43 6f 64  ) %s\n", iErrCod
7c10: 65 2c 20 7a 4d 73 67 29 3b 0a 20 20 66 66 6c 75  e, zMsg);.  fflu
7c20: 73 68 28 70 2d 3e 70 4c 6f 67 29 3b 0a 7d 0a 0a  sh(p->pLog);.}..
7c30: 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65  /*.** Output the
7c40: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73   given string as
7c50: 20 61 20 68 65 78 2d 65 6e 63 6f 64 65 64 20 62   a hex-encoded b
7c60: 6c 6f 62 20 28 65 67 2e 20 58 27 31 32 33 34 27  lob (eg. X'1234'
7c70: 20 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69   ).*/.static voi
7c80: 64 20 6f 75 74 70 75 74 5f 68 65 78 5f 62 6c 6f  d output_hex_blo
7c90: 62 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e  b(FILE *out, con
7ca0: 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62 2c 20  st void *pBlob, 
7cb0: 69 6e 74 20 6e 42 6c 6f 62 29 7b 0a 20 20 69 6e  int nBlob){.  in
7cc0: 74 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 42 6c  t i;.  char *zBl
7cd0: 6f 62 20 3d 20 28 63 68 61 72 20 2a 29 70 42 6c  ob = (char *)pBl
7ce0: 6f 62 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66  ob;.  raw_printf
7cf0: 28 6f 75 74 2c 22 58 27 22 29 3b 0a 20 20 66 6f  (out,"X'");.  fo
7d00: 72 28 69 3d 30 3b 20 69 3c 6e 42 6c 6f 62 3b 20  r(i=0; i<nBlob; 
7d10: 69 2b 2b 29 7b 20 72 61 77 5f 70 72 69 6e 74 66  i++){ raw_printf
7d20: 28 6f 75 74 2c 22 25 30 32 78 22 2c 7a 42 6c 6f  (out,"%02x",zBlo
7d30: 62 5b 69 5d 26 30 78 66 66 29 3b 20 7d 0a 20 20  b[i]&0xff); }.  
7d40: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22  raw_printf(out,"
7d50: 27 22 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69  '");.}../*.** Fi
7d60: 6e 64 20 61 20 73 74 72 69 6e 67 20 74 68 61 74  nd a string that
7d70: 20 69 73 20 6e 6f 74 20 66 6f 75 6e 64 20 61 6e   is not found an
7d80: 79 77 68 65 72 65 20 69 6e 20 7a 5b 5d 2e 20 20  ywhere in z[].  
7d90: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
7da0: 0a 2a 2a 20 74 6f 20 74 68 61 74 20 73 74 72 69  .** to that stri
7db0: 6e 67 2e 0a 2a 2a 0a 2a 2a 20 54 72 79 20 74 6f  ng..**.** Try to
7dc0: 20 75 73 65 20 7a 41 20 61 6e 64 20 7a 42 20 66   use zA and zB f
7dd0: 69 72 73 74 2e 20 20 49 66 20 62 6f 74 68 20 6f  irst.  If both o
7de0: 66 20 74 68 6f 73 65 20 61 72 65 20 61 6c 72 65  f those are alre
7df0: 61 64 79 20 66 6f 75 6e 64 20 69 6e 20 7a 5b 5d  ady found in z[]
7e00: 0a 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20 75 70  .** then make up
7e10: 20 73 6f 6d 65 20 73 74 72 69 6e 67 20 61 6e 64   some string and
7e20: 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65   store it in the
7e30: 20 62 75 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f   buffer zBuf..*/
7e40: 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68  .static const ch
7e50: 61 72 20 2a 75 6e 75 73 65 64 5f 73 74 72 69 6e  ar *unused_strin
7e60: 67 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  g(.  const char 
7e70: 2a 7a 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *z,             
7e80: 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74         /* Result
7e90: 20 6d 75 73 74 20 6e 6f 74 20 61 70 70 65 61 72   must not appear
7ea0: 20 61 6e 79 77 68 65 72 65 20 69 6e 20 7a 20 2a   anywhere in z *
7eb0: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
7ec0: 7a 41 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  zA, const char *
7ed0: 7a 42 2c 20 20 20 2f 2a 20 54 72 79 20 74 68 65  zB,   /* Try the
7ee0: 73 65 20 66 69 72 73 74 20 2a 2f 0a 20 20 63 68  se first */.  ch
7ef0: 61 72 20 2a 7a 42 75 66 20 20 20 20 20 20 20 20  ar *zBuf        
7f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f10: 2f 2a 20 53 70 61 63 65 20 74 6f 20 73 74 6f 72  /* Space to stor
7f20: 65 20 61 20 67 65 6e 65 72 61 74 65 64 20 73 74  e a generated st
7f30: 72 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73  ring */.){.  uns
7f40: 69 67 6e 65 64 20 69 20 3d 20 30 3b 0a 20 20 69  igned i = 0;.  i
7f50: 66 28 20 73 74 72 73 74 72 28 7a 2c 20 7a 41 29  f( strstr(z, zA)
7f60: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 7a 41 3b  ==0 ) return zA;
7f70: 0a 20 20 69 66 28 20 73 74 72 73 74 72 28 7a 2c  .  if( strstr(z,
7f80: 20 7a 42 29 3d 3d 30 20 29 20 72 65 74 75 72 6e   zB)==0 ) return
7f90: 20 7a 42 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73   zB;.  do{.    s
7fa0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
7fb0: 32 30 2c 7a 42 75 66 2c 22 28 25 73 25 75 29 22  20,zBuf,"(%s%u)"
7fc0: 2c 20 7a 41 2c 20 69 2b 2b 29 3b 0a 20 20 7d 77  , zA, i++);.  }w
7fd0: 68 69 6c 65 28 20 73 74 72 73 74 72 28 7a 2c 7a  hile( strstr(z,z
7fe0: 42 75 66 29 21 3d 30 20 29 3b 0a 20 20 72 65 74  Buf)!=0 );.  ret
7ff0: 75 72 6e 20 7a 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a  urn zBuf;.}../*.
8000: 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67 69  ** Output the gi
8010: 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20  ven string as a 
8020: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 75 73  quoted string us
8030: 69 6e 67 20 53 51 4c 20 71 75 6f 74 69 6e 67 20  ing SQL quoting 
8040: 63 6f 6e 76 65 6e 74 69 6f 6e 73 2e 0a 2a 2a 0a  conventions..**.
8050: 2a 2a 20 53 65 65 20 61 6c 73 6f 3a 20 6f 75 74  ** See also: out
8060: 70 75 74 5f 71 75 6f 74 65 64 5f 65 73 63 61 70  put_quoted_escap
8070: 65 64 5f 73 74 72 69 6e 67 28 29 0a 2a 2f 0a 73  ed_string().*/.s
8080: 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75  tatic void outpu
8090: 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28  t_quoted_string(
80a0: 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74  FILE *out, const
80b0: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
80c0: 20 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20   i;.  char c;.  
80d0: 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28 6f 75  setBinaryMode(ou
80e0: 74 2c 20 31 29 3b 0a 20 20 66 6f 72 28 69 3d 30  t, 1);.  for(i=0
80f0: 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20  ; (c = z[i])!=0 
8100: 26 26 20 63 21 3d 27 5c 27 27 3b 20 69 2b 2b 29  && c!='\''; i++)
8110: 7b 7d 0a 20 20 69 66 28 20 63 3d 3d 30 20 29 7b  {}.  if( c==0 ){
8120: 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
8130: 28 6f 75 74 2c 22 27 25 73 27 22 2c 7a 29 3b 0a  (out,"'%s'",z);.
8140: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 61 77    }else{.    raw
8150: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22  _printf(out, "'"
8160: 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a  );.    while( *z
8170: 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
8180: 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30  0; (c = z[i])!=0
8190: 20 26 26 20 63 21 3d 27 5c 27 27 3b 20 69 2b 2b   && c!='\''; i++
81a0: 29 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d  ){}.      if( c=
81b0: 3d 27 5c 27 27 20 29 20 69 2b 2b 3b 0a 20 20 20  ='\'' ) i++;.   
81c0: 20 20 20 69 66 28 20 69 20 29 7b 0a 20 20 20 20     if( i ){.    
81d0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
81e0: 6f 75 74 2c 20 22 25 2e 2a 73 22 2c 20 69 2c 20  out, "%.*s", i, 
81f0: 7a 29 3b 0a 20 20 20 20 20 20 20 20 7a 20 2b 3d  z);.        z +=
8200: 20 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   i;.      }.    
8210: 20 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 7b    if( c=='\'' ){
8220: 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
8230: 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20  ntf(out, "'");. 
8240: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
8250: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
8260: 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( c==0 ){.     
8270: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
8280: 7d 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20  }.      z++;.   
8290: 20 7d 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74   }.    raw_print
82a0: 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 7d  f(out, "'");.  }
82b0: 0a 20 20 73 65 74 54 65 78 74 4d 6f 64 65 28 6f  .  setTextMode(o
82c0: 75 74 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ut, 1);.}../*.**
82d0: 20 4f 75 74 70 75 74 20 74 68 65 20 67 69 76 65   Output the give
82e0: 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20 71 75  n string as a qu
82f0: 6f 74 65 64 20 73 74 72 69 6e 67 20 75 73 69 6e  oted string usin
8300: 67 20 53 51 4c 20 71 75 6f 74 69 6e 67 20 63 6f  g SQL quoting co
8310: 6e 76 65 6e 74 69 6f 6e 73 2e 0a 2a 2a 20 41 64  nventions..** Ad
8320: 64 69 74 69 6f 6e 61 6c 6c 6c 79 20 2c 20 65 73  ditionallly , es
8330: 63 61 70 65 20 74 68 65 20 22 5c 6e 22 20 61 6e  cape the "\n" an
8340: 64 20 22 5c 72 22 20 63 68 61 72 61 63 74 65 72  d "\r" character
8350: 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 64  s so that they d
8360: 6f 20 6e 6f 74 0a 2a 2a 20 67 65 74 20 63 6f 72  o not.** get cor
8370: 72 75 70 74 65 64 20 62 79 20 65 6e 64 2d 6f 66  rupted by end-of
8380: 2d 6c 69 6e 65 20 74 72 61 6e 73 6c 61 74 69 6f  -line translatio
8390: 6e 20 66 61 63 69 6c 69 74 69 65 73 20 69 6e 20  n facilities in 
83a0: 73 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 0a 2a  some operating.*
83b0: 2a 20 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a  * systems..**.**
83c0: 20 54 68 69 73 20 69 73 20 6c 69 6b 65 20 6f 75   This is like ou
83d0: 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69  tput_quoted_stri
83e0: 6e 67 28 29 20 62 75 74 20 77 69 74 68 20 74 68  ng() but with th
83f0: 65 20 61 64 64 69 74 69 6f 6e 20 6f 66 20 74 68  e addition of th
8400: 65 20 5c 72 5c 6e 0a 2a 2a 20 65 73 63 61 70 65  e \r\n.** escape
8410: 20 6d 65 63 68 61 6e 69 73 6d 2e 0a 2a 2f 0a 73   mechanism..*/.s
8420: 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75  tatic void outpu
8430: 74 5f 71 75 6f 74 65 64 5f 65 73 63 61 70 65 64  t_quoted_escaped
8440: 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75  _string(FILE *ou
8450: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
8460: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  ){.  int i;.  ch
8470: 61 72 20 63 3b 0a 20 20 73 65 74 42 69 6e 61 72  ar c;.  setBinar
8480: 79 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a 20  yMode(out, 1);. 
8490: 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a   for(i=0; (c = z
84a0: 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 5c  [i])!=0 && c!='\
84b0: 27 27 20 26 26 20 63 21 3d 27 5c 6e 27 20 26 26  '' && c!='\n' &&
84c0: 20 63 21 3d 27 5c 72 27 3b 20 69 2b 2b 29 7b 7d   c!='\r'; i++){}
84d0: 0a 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20  .  if( c==0 ){. 
84e0: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f     utf8_printf(o
84f0: 75 74 2c 22 27 25 73 27 22 2c 7a 29 3b 0a 20 20  ut,"'%s'",z);.  
8500: 7d 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74  }else{.    const
8510: 20 63 68 61 72 20 2a 7a 4e 4c 20 3d 20 30 3b 0a   char *zNL = 0;.
8520: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
8530: 7a 43 52 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  zCR = 0;.    int
8540: 20 6e 4e 4c 20 3d 20 30 3b 0a 20 20 20 20 69 6e   nNL = 0;.    in
8550: 74 20 6e 43 52 20 3d 20 30 3b 0a 20 20 20 20 63  t nCR = 0;.    c
8560: 68 61 72 20 7a 42 75 66 31 5b 32 30 5d 2c 20 7a  har zBuf1[20], z
8570: 42 75 66 32 5b 32 30 5d 3b 0a 20 20 20 20 66 6f  Buf2[20];.    fo
8580: 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  r(i=0; z[i]; i++
8590: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69  ){.      if( z[i
85a0: 5d 3d 3d 27 5c 6e 27 20 29 20 6e 4e 4c 2b 2b 3b  ]=='\n' ) nNL++;
85b0: 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d  .      if( z[i]=
85c0: 3d 27 5c 72 27 20 29 20 6e 43 52 2b 2b 3b 0a 20  ='\r' ) nCR++;. 
85d0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4e 4c     }.    if( nNL
85e0: 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
85f0: 69 6e 74 66 28 6f 75 74 2c 20 22 72 65 70 6c 61  intf(out, "repla
8600: 63 65 28 22 29 3b 0a 20 20 20 20 20 20 7a 4e 4c  ce(");.      zNL
8610: 20 3d 20 75 6e 75 73 65 64 5f 73 74 72 69 6e 67   = unused_string
8620: 28 7a 2c 20 22 5c 5c 6e 22 2c 20 22 5c 5c 30 31  (z, "\\n", "\\01
8630: 32 22 2c 20 7a 42 75 66 31 29 3b 0a 20 20 20 20  2", zBuf1);.    
8640: 7d 0a 20 20 20 20 69 66 28 20 6e 43 52 20 29 7b  }.    if( nCR ){
8650: 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
8660: 66 28 6f 75 74 2c 20 22 72 65 70 6c 61 63 65 28  f(out, "replace(
8670: 22 29 3b 0a 20 20 20 20 20 20 7a 43 52 20 3d 20  ");.      zCR = 
8680: 75 6e 75 73 65 64 5f 73 74 72 69 6e 67 28 7a 2c  unused_string(z,
8690: 20 22 5c 5c 72 22 2c 20 22 5c 5c 30 31 35 22 2c   "\\r", "\\015",
86a0: 20 7a 42 75 66 32 29 3b 0a 20 20 20 20 7d 0a 20   zBuf2);.    }. 
86b0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
86c0: 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 77 68 69  t, "'");.    whi
86d0: 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20  le( *z ){.      
86e0: 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 5b  for(i=0; (c = z[
86f0: 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 6e  i])!=0 && c!='\n
8700: 27 20 26 26 20 63 21 3d 27 5c 72 27 20 26 26 20  ' && c!='\r' && 
8710: 63 21 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a  c!='\''; i++){}.
8720: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27        if( c=='\'
8730: 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69  ' ) i++;.      i
8740: 66 28 20 69 20 29 7b 0a 20 20 20 20 20 20 20 20  f( i ){.        
8750: 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
8760: 20 22 25 2e 2a 73 22 2c 20 69 2c 20 7a 29 3b 0a   "%.*s", i, z);.
8770: 20 20 20 20 20 20 20 20 7a 20 2b 3d 20 69 3b 0a          z += i;.
8780: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
8790: 28 20 63 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20  ( c=='\'' ){.   
87a0: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
87b0: 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 20  out, "'");.     
87c0: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
87d0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
87e0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62  ==0 ){.        b
87f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
8800: 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69      z++;.      i
8810: 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20  f( c=='\n' ){.  
8820: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
8830: 28 6f 75 74 2c 20 22 25 73 22 2c 20 7a 4e 4c 29  (out, "%s", zNL)
8840: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
8850: 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
8860: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
8870: 2c 20 22 25 73 22 2c 20 7a 43 52 29 3b 0a 20 20  , "%s", zCR);.  
8880: 20 20 7d 0a 20 20 20 20 72 61 77 5f 70 72 69 6e    }.    raw_prin
8890: 74 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20  tf(out, "'");.  
88a0: 20 20 69 66 28 20 6e 43 52 20 29 7b 0a 20 20 20    if( nCR ){.   
88b0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
88c0: 74 2c 20 22 2c 27 25 73 27 2c 63 68 61 72 28 31  t, ",'%s',char(1
88d0: 33 29 29 22 2c 20 7a 43 52 29 3b 0a 20 20 20 20  3))", zCR);.    
88e0: 7d 0a 20 20 20 20 69 66 28 20 6e 4e 4c 20 29 7b  }.    if( nNL ){
88f0: 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
8900: 66 28 6f 75 74 2c 20 22 2c 27 25 73 27 2c 63 68  f(out, ",'%s',ch
8910: 61 72 28 31 30 29 29 22 2c 20 7a 4e 4c 29 3b 0a  ar(10))", zNL);.
8920: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 65 74 54      }.  }.  setT
8930: 65 78 74 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b  extMode(out, 1);
8940: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74  .}../*.** Output
8950: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
8960: 67 20 61 73 20 61 20 71 75 6f 74 65 64 20 61 63  g as a quoted ac
8970: 63 6f 72 64 69 6e 67 20 74 6f 20 43 20 6f 72 20  cording to C or 
8980: 54 43 4c 20 71 75 6f 74 69 6e 67 20 72 75 6c 65  TCL quoting rule
8990: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
89a0: 64 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e  d output_c_strin
89b0: 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e  g(FILE *out, con
89c0: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 75  st char *z){.  u
89d0: 6e 73 69 67 6e 65 64 20 69 6e 74 20 63 3b 0a 20  nsigned int c;. 
89e0: 20 66 70 75 74 63 28 27 22 27 2c 20 6f 75 74 29   fputc('"', out)
89f0: 3b 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20  ;.  while( (c = 
8a00: 2a 28 7a 2b 2b 29 29 21 3d 30 20 29 7b 0a 20 20  *(z++))!=0 ){.  
8a10: 20 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20 29 7b    if( c=='\\' ){
8a20: 0a 20 20 20 20 20 20 66 70 75 74 63 28 63 2c 20  .      fputc(c, 
8a30: 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74  out);.      fput
8a40: 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d  c(c, out);.    }
8a50: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 22 27 20  else if( c=='"' 
8a60: 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27  ){.      fputc('
8a70: 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20  \\', out);.     
8a80: 20 66 70 75 74 63 28 27 22 27 2c 20 6f 75 74 29   fputc('"', out)
8a90: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8aa0: 63 3d 3d 27 5c 74 27 20 29 7b 0a 20 20 20 20 20  c=='\t' ){.     
8ab0: 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74   fputc('\\', out
8ac0: 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27  );.      fputc('
8ad0: 74 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65  t', out);.    }e
8ae0: 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20  lse if( c=='\n' 
8af0: 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27  ){.      fputc('
8b00: 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20  \\', out);.     
8b10: 20 66 70 75 74 63 28 27 6e 27 2c 20 6f 75 74 29   fputc('n', out)
8b20: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8b30: 63 3d 3d 27 5c 72 27 20 29 7b 0a 20 20 20 20 20  c=='\r' ){.     
8b40: 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74   fputc('\\', out
8b50: 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27  );.      fputc('
8b60: 72 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65  r', out);.    }e
8b70: 6c 73 65 20 69 66 28 20 21 69 73 70 72 69 6e 74  lse if( !isprint
8b80: 28 63 26 30 78 66 66 29 20 29 7b 0a 20 20 20 20  (c&0xff) ){.    
8b90: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
8ba0: 2c 20 22 5c 5c 25 30 33 6f 22 2c 20 63 26 30 78  , "\\%03o", c&0x
8bb0: 66 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ff);.    }else{.
8bc0: 20 20 20 20 20 20 66 70 75 74 63 28 63 2c 20 6f        fputc(c, o
8bd0: 75 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ut);.    }.  }. 
8be0: 20 66 70 75 74 63 28 27 22 27 2c 20 6f 75 74 29   fputc('"', out)
8bf0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75  ;.}../*.** Outpu
8c00: 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  t the given stri
8c10: 6e 67 20 77 69 74 68 20 63 68 61 72 61 63 74 65  ng with characte
8c20: 72 73 20 74 68 61 74 20 61 72 65 20 73 70 65 63  rs that are spec
8c30: 69 61 6c 20 74 6f 0a 2a 2a 20 48 54 4d 4c 20 65  ial to.** HTML e
8c40: 73 63 61 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  scaped..*/.stati
8c50: 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 68 74  c void output_ht
8c60: 6d 6c 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a  ml_string(FILE *
8c70: 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  out, const char 
8c80: 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  *z){.  int i;.  
8c90: 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 22  if( z==0 ) z = "
8ca0: 22 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20 29  ";.  while( *z )
8cb0: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 20  {.    for(i=0;  
8cc0: 20 7a 5b 69 5d 0a 20 20 20 20 20 20 20 20 20 20   z[i].          
8cd0: 20 20 26 26 20 7a 5b 69 5d 21 3d 27 3c 27 0a 20    && z[i]!='<'. 
8ce0: 20 20 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b             && z[
8cf0: 69 5d 21 3d 27 26 27 0a 20 20 20 20 20 20 20 20  i]!='&'.        
8d00: 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 3e 27      && z[i]!='>'
8d10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20  .            && 
8d20: 7a 5b 69 5d 21 3d 27 5c 22 27 0a 20 20 20 20 20  z[i]!='\"'.     
8d30: 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d         && z[i]!=
8d40: 27 5c 27 27 3b 0a 20 20 20 20 20 20 20 20 69 2b  '\'';.        i+
8d50: 2b 29 7b 7d 0a 20 20 20 20 69 66 28 20 69 3e 30  +){}.    if( i>0
8d60: 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
8d70: 72 69 6e 74 66 28 6f 75 74 2c 22 25 2e 2a 73 22  rintf(out,"%.*s"
8d80: 2c 69 2c 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ,i,z);.    }.   
8d90: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 3c 27 20 29   if( z[i]=='<' )
8da0: 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
8db0: 74 66 28 6f 75 74 2c 22 26 6c 74 3b 22 29 3b 0a  tf(out,"&lt;");.
8dc0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b      }else if( z[
8dd0: 69 5d 3d 3d 27 26 27 20 29 7b 0a 20 20 20 20 20  i]=='&' ){.     
8de0: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
8df0: 22 26 61 6d 70 3b 22 29 3b 0a 20 20 20 20 7d 65  "&amp;");.    }e
8e00: 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 3e  lse if( z[i]=='>
8e10: 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  ' ){.      raw_p
8e20: 72 69 6e 74 66 28 6f 75 74 2c 22 26 67 74 3b 22  rintf(out,"&gt;"
8e30: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
8e40: 20 7a 5b 69 5d 3d 3d 27 5c 22 27 20 29 7b 0a 20   z[i]=='\"' ){. 
8e50: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
8e60: 6f 75 74 2c 22 26 71 75 6f 74 3b 22 29 3b 0a 20  out,"&quot;");. 
8e70: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69     }else if( z[i
8e80: 5d 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20  ]=='\'' ){.     
8e90: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
8ea0: 22 26 23 33 39 3b 22 29 3b 0a 20 20 20 20 7d 65  "&#39;");.    }e
8eb0: 6c 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b  lse{.      break
8ec0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20 2b 3d  ;.    }.    z +=
8ed0: 20 69 20 2b 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f   i + 1;.  }.}../
8ee0: 2a 0a 2a 2a 20 49 66 20 61 20 66 69 65 6c 64 20  *.** If a field 
8ef0: 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20 63 68 61  contains any cha
8f00: 72 61 63 74 65 72 20 69 64 65 6e 74 69 66 69 65  racter identifie
8f10: 64 20 62 79 20 61 20 31 20 69 6e 20 74 68 65 20  d by a 1 in the 
8f20: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 61 72 72  following.** arr
8f30: 61 79 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72  ay, then the str
8f40: 69 6e 67 20 6d 75 73 74 20 62 65 20 71 75 6f 74  ing must be quot
8f50: 65 64 20 66 6f 72 20 43 53 56 2e 0a 2a 2f 0a 73  ed for CSV..*/.s
8f60: 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
8f70: 20 6e 65 65 64 43 73 76 51 75 6f 74 65 5b 5d 20   needCsvQuote[] 
8f80: 3d 20 7b 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31  = {.  1, 1, 1, 1
8f90: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
8fa0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
8fb0: 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20  , 1, 1,.  1, 1, 
8fc0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
8fd0: 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,   1, 1, 1, 1, 
8fe0: 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c  1, 1, 1, 1,.  1,
8ff0: 20 30 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 1, 0, 0, 0, 
9000: 30 2c 20 31 2c 20 20 20 30 2c 20 30 2c 20 30 2c  0, 1,   0, 0, 0,
9010: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a   0, 0, 0, 0, 0,.
9020: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
9030: 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30   0, 0, 0,   0, 0
9040: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
9050: 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,.  0, 0, 0, 0
9060: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20  , 0, 0, 0, 0,   
9070: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
9080: 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20  , 0, 0,.  0, 0, 
9090: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
90a0: 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,   0, 0, 0, 0, 
90b0: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c  0, 0, 0, 0,.  0,
90c0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
90d0: 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c  0, 0,   0, 0, 0,
90e0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a   0, 0, 0, 0, 0,.
90f0: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
9100: 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30   0, 0, 0,   0, 0
9110: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
9120: 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,.  1, 1, 1, 1
9130: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
9140: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
9150: 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20  , 1, 1,.  1, 1, 
9160: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
9170: 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,   1, 1, 1, 1, 
9180: 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c  1, 1, 1, 1,.  1,
9190: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
91a0: 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c  1, 1,   1, 1, 1,
91b0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a   1, 1, 1, 1, 1,.
91c0: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
91d0: 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31   1, 1, 1,   1, 1
91e0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
91f0: 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,.  1, 1, 1, 1
9200: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
9210: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
9220: 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20  , 1, 1,.  1, 1, 
9230: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
9240: 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,   1, 1, 1, 1, 
9250: 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c  1, 1, 1, 1,.  1,
9260: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
9270: 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c  1, 1,   1, 1, 1,
9280: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a   1, 1, 1, 1, 1,.
9290: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
92a0: 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31   1, 1, 1,   1, 1
92b0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
92c0: 20 31 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 75   1,.};../*.** Ou
92d0: 74 70 75 74 20 61 20 73 69 6e 67 6c 65 20 74 65  tput a single te
92e0: 72 6d 20 6f 66 20 43 53 56 2e 20 20 41 63 74 75  rm of CSV.  Actu
92f0: 61 6c 6c 79 2c 20 70 2d 3e 63 6f 6c 53 65 70 61  ally, p->colSepa
9300: 72 61 74 6f 72 20 69 73 20 75 73 65 64 20 66 6f  rator is used fo
9310: 72 0a 2a 2a 20 74 68 65 20 73 65 70 61 72 61 74  r.** the separat
9320: 6f 72 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72  or, which may or
9330: 20 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 63 6f   may not be a co
9340: 6d 6d 61 2e 20 20 70 2d 3e 6e 75 6c 6c 56 61 6c  mma.  p->nullVal
9350: 75 65 20 69 73 0a 2a 2a 20 74 68 65 20 6e 75 6c  ue is.** the nul
9360: 6c 20 76 61 6c 75 65 2e 20 20 53 74 72 69 6e 67  l value.  String
9370: 73 20 61 72 65 20 71 75 6f 74 65 64 20 69 66 20  s are quoted if 
9380: 6e 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 20  necessary.  The 
9390: 73 65 70 61 72 61 74 6f 72 0a 2a 2a 20 69 73 20  separator.** is 
93a0: 6f 6e 6c 79 20 69 73 73 75 65 64 20 69 66 20 62  only issued if b
93b0: 53 65 70 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a  Sep is true..*/.
93c0: 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70  static void outp
93d0: 75 74 5f 63 73 76 28 53 68 65 6c 6c 53 74 61 74  ut_csv(ShellStat
93e0: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
93f0: 20 2a 7a 2c 20 69 6e 74 20 62 53 65 70 29 7b 0a   *z, int bSep){.
9400: 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 70 2d    FILE *out = p-
9410: 3e 6f 75 74 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  >out;.  if( z==0
9420: 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
9430: 6e 74 66 28 6f 75 74 2c 22 25 73 22 2c 70 2d 3e  ntf(out,"%s",p->
9440: 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 7d 65  nullValue);.  }e
9450: 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  lse{.    int i;.
9460: 20 20 20 20 69 6e 74 20 6e 53 65 70 20 3d 20 73      int nSep = s
9470: 74 72 6c 65 6e 33 30 28 70 2d 3e 63 6f 6c 53 65  trlen30(p->colSe
9480: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 66 6f  parator);.    fo
9490: 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b  r(i=0; z[i]; i++
94a0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65  ){.      if( nee
94b0: 64 43 73 76 51 75 6f 74 65 5b 28 28 75 6e 73 69  dCsvQuote[((unsi
94c0: 67 6e 65 64 20 63 68 61 72 2a 29 7a 29 5b 69 5d  gned char*)z)[i]
94d0: 5d 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 7a  ].         || (z
94e0: 5b 69 5d 3d 3d 70 2d 3e 63 6f 6c 53 65 70 61 72  [i]==p->colSepar
94f0: 61 74 6f 72 5b 30 5d 20 26 26 0a 20 20 20 20 20  ator[0] &&.     
9500: 20 20 20 20 20 20 20 20 28 6e 53 65 70 3d 3d 31          (nSep==1
9510: 20 7c 7c 20 6d 65 6d 63 6d 70 28 7a 2c 20 70 2d   || memcmp(z, p-
9520: 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 6e  >colSeparator, n
9530: 53 65 70 29 3d 3d 30 29 29 20 29 7b 0a 20 20 20  Sep)==0)) ){.   
9540: 20 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20       i = 0;.    
9550: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
9560: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
9570: 20 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63   i==0 ){.      c
9580: 68 61 72 20 2a 7a 51 75 6f 74 65 64 20 3d 20 73  har *zQuoted = s
9590: 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
95a0: 5c 22 25 77 5c 22 22 2c 20 7a 29 3b 0a 20 20 20  \"%w\"", z);.   
95b0: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f     utf8_printf(o
95c0: 75 74 2c 20 22 25 73 22 2c 20 7a 51 75 6f 74 65  ut, "%s", zQuote
95d0: 64 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  d);.      sqlite
95e0: 33 5f 66 72 65 65 28 7a 51 75 6f 74 65 64 29 3b  3_free(zQuoted);
95f0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
9600: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
9610: 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20  t, "%s", z);.   
9620: 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 62 53 65   }.  }.  if( bSe
9630: 70 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  p ){.    utf8_pr
9640: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
9650: 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  ", p->colSeparat
9660: 6f 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  or);.  }.}../*.*
9670: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
9680: 75 6e 73 20 77 68 65 6e 20 74 68 65 20 75 73 65  uns when the use
9690: 72 20 70 72 65 73 73 65 73 20 43 74 72 6c 2d 43  r presses Ctrl-C
96a0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
96b0: 69 6e 74 65 72 72 75 70 74 5f 68 61 6e 64 6c 65  interrupt_handle
96c0: 72 28 69 6e 74 20 4e 6f 74 55 73 65 64 29 7b 0a  r(int NotUsed){.
96d0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
96e0: 45 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 73  ER(NotUsed);.  s
96f0: 65 65 6e 49 6e 74 65 72 72 75 70 74 2b 2b 3b 0a  eenInterrupt++;.
9700: 20 20 69 66 28 20 73 65 65 6e 49 6e 74 65 72 72    if( seenInterr
9710: 75 70 74 3e 32 20 29 20 65 78 69 74 28 31 29 3b  upt>2 ) exit(1);
9720: 0a 20 20 69 66 28 20 67 6c 6f 62 61 6c 44 62 20  .  if( globalDb 
9730: 29 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72  ) sqlite3_interr
9740: 75 70 74 28 67 6c 6f 62 61 6c 44 62 29 3b 0a 7d  upt(globalDb);.}
9750: 0a 0a 23 69 66 20 28 64 65 66 69 6e 65 64 28 5f  ..#if (defined(_
9760: 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65  WIN32) || define
9770: 64 28 57 49 4e 33 32 29 29 20 26 26 20 21 64 65  d(WIN32)) && !de
9780: 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57 43 45  fined(_WIN32_WCE
9790: 29 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  )./*.** This rou
97a0: 74 69 6e 65 20 72 75 6e 73 20 66 6f 72 20 63 6f  tine runs for co
97b0: 6e 73 6f 6c 65 20 65 76 65 6e 74 73 20 28 65 2e  nsole events (e.
97c0: 67 2e 20 43 74 72 6c 2d 43 29 20 6f 6e 20 57 69  g. Ctrl-C) on Wi
97d0: 6e 33 32 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f  n32.*/.static BO
97e0: 4f 4c 20 57 49 4e 41 50 49 20 43 6f 6e 73 6f 6c  OL WINAPI Consol
97f0: 65 43 74 72 6c 48 61 6e 64 6c 65 72 28 0a 20 20  eCtrlHandler(.  
9800: 44 57 4f 52 44 20 64 77 43 74 72 6c 54 79 70 65  DWORD dwCtrlType
9810: 20 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 43   /* One of the C
9820: 54 52 4c 5f 2a 5f 45 56 45 4e 54 20 63 6f 6e 73  TRL_*_EVENT cons
9830: 74 61 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 66  tants */.){.  if
9840: 28 20 64 77 43 74 72 6c 54 79 70 65 3d 3d 43 54  ( dwCtrlType==CT
9850: 52 4c 5f 43 5f 45 56 45 4e 54 20 29 7b 0a 20 20  RL_C_EVENT ){.  
9860: 20 20 69 6e 74 65 72 72 75 70 74 5f 68 61 6e 64    interrupt_hand
9870: 6c 65 72 28 30 29 3b 0a 20 20 20 20 72 65 74 75  ler(0);.    retu
9880: 72 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 20 20 72  rn TRUE;.  }.  r
9890: 65 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a 23  eturn FALSE;.}.#
98a0: 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53  endif..#ifndef S
98b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f  QLITE_OMIT_AUTHO
98c0: 52 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 57  RIZATION./*.** W
98d0: 68 65 6e 20 74 68 65 20 22 2e 61 75 74 68 20 4f  hen the ".auth O
98e0: 4e 22 20 69 73 20 73 65 74 2c 20 74 68 65 20 66  N" is set, the f
98f0: 6f 6c 6c 6f 77 69 6e 67 20 61 75 74 68 6f 72 69  ollowing authori
9900: 7a 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73 0a  zer callback is.
9910: 2a 2a 20 69 6e 76 6f 6b 65 64 2e 20 20 49 74 20  ** invoked.  It 
9920: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53  always returns S
9930: 51 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61  QLITE_OK..*/.sta
9940: 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 41 75 74  tic int shellAut
9950: 68 28 0a 20 20 76 6f 69 64 20 2a 70 43 6c 69 65  h(.  void *pClie
9960: 6e 74 44 61 74 61 2c 0a 20 20 69 6e 74 20 6f 70  ntData,.  int op
9970: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
9980: 7a 41 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  zA1,.  const cha
9990: 72 20 2a 7a 41 32 2c 0a 20 20 63 6f 6e 73 74 20  r *zA2,.  const 
99a0: 63 68 61 72 20 2a 7a 41 33 2c 0a 20 20 63 6f 6e  char *zA3,.  con
99b0: 73 74 20 63 68 61 72 20 2a 7a 41 34 0a 29 7b 0a  st char *zA4.){.
99c0: 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 20    ShellState *p 
99d0: 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 2a 29 70  = (ShellState*)p
99e0: 43 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 73 74  ClientData;.  st
99f0: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
9a00: 2a 61 7a 41 63 74 69 6f 6e 5b 5d 20 3d 20 7b 20  *azAction[] = { 
9a10: 30 2c 0a 20 20 20 20 20 22 43 52 45 41 54 45 5f  0,.     "CREATE_
9a20: 49 4e 44 45 58 22 2c 20 20 20 20 20 20 20 20 20  INDEX",         
9a30: 22 43 52 45 41 54 45 5f 54 41 42 4c 45 22 2c 20  "CREATE_TABLE", 
9a40: 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 5f          "CREATE_
9a50: 54 45 4d 50 5f 49 4e 44 45 58 22 2c 0a 20 20 20  TEMP_INDEX",.   
9a60: 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50 5f 54    "CREATE_TEMP_T
9a70: 41 42 4c 45 22 2c 20 20 20 20 22 43 52 45 41 54  ABLE",    "CREAT
9a80: 45 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22 2c  E_TEMP_TRIGGER",
9a90: 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50 5f 56    "CREATE_TEMP_V
9aa0: 49 45 57 22 2c 0a 20 20 20 20 20 22 43 52 45 41  IEW",.     "CREA
9ab0: 54 45 5f 54 52 49 47 47 45 52 22 2c 20 20 20 20  TE_TRIGGER",    
9ac0: 20 20 20 22 43 52 45 41 54 45 5f 56 49 45 57 22     "CREATE_VIEW"
9ad0: 2c 20 20 20 20 20 20 20 20 20 20 22 44 45 4c 45  ,          "DELE
9ae0: 54 45 22 2c 0a 20 20 20 20 20 22 44 52 4f 50 5f  TE",.     "DROP_
9af0: 49 4e 44 45 58 22 2c 20 20 20 20 20 20 20 20 20  INDEX",         
9b00: 20 20 22 44 52 4f 50 5f 54 41 42 4c 45 22 2c 20    "DROP_TABLE", 
9b10: 20 20 20 20 20 20 20 20 20 20 22 44 52 4f 50 5f            "DROP_
9b20: 54 45 4d 50 5f 49 4e 44 45 58 22 2c 0a 20 20 20  TEMP_INDEX",.   
9b30: 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42    "DROP_TEMP_TAB
9b40: 4c 45 22 2c 20 20 20 20 20 20 22 44 52 4f 50 5f  LE",      "DROP_
9b50: 54 45 4d 50 5f 54 52 49 47 47 45 52 22 2c 20 20  TEMP_TRIGGER",  
9b60: 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45    "DROP_TEMP_VIE
9b70: 57 22 2c 0a 20 20 20 20 20 22 44 52 4f 50 5f 54  W",.     "DROP_T
9b80: 52 49 47 47 45 52 22 2c 20 20 20 20 20 20 20 20  RIGGER",        
9b90: 20 22 44 52 4f 50 5f 56 49 45 57 22 2c 20 20 20   "DROP_VIEW",   
9ba0: 20 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54           "INSERT
9bb0: 22 2c 0a 20 20 20 20 20 22 50 52 41 47 4d 41 22  ",.     "PRAGMA"
9bc0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
9bd0: 22 52 45 41 44 22 2c 20 20 20 20 20 20 20 20 20  "READ",         
9be0: 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 22          "SELECT"
9bf0: 2c 0a 20 20 20 20 20 22 54 52 41 4e 53 41 43 54  ,.     "TRANSACT
9c00: 49 4f 4e 22 2c 20 20 20 20 20 20 20 20 20 20 22  ION",          "
9c10: 55 50 44 41 54 45 22 2c 20 20 20 20 20 20 20 20  UPDATE",        
9c20: 20 20 20 20 20 20 20 22 41 54 54 41 43 48 22 2c         "ATTACH",
9c30: 0a 20 20 20 20 20 22 44 45 54 41 43 48 22 2c 20  .     "DETACH", 
9c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 41                "A
9c50: 4c 54 45 52 5f 54 41 42 4c 45 22 2c 20 20 20 20  LTER_TABLE",    
9c60: 20 20 20 20 20 20 22 52 45 49 4e 44 45 58 22 2c        "REINDEX",
9c70: 0a 20 20 20 20 20 22 41 4e 41 4c 59 5a 45 22 2c  .     "ANALYZE",
9c80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 43                "C
9c90: 52 45 41 54 45 5f 56 54 41 42 4c 45 22 2c 20 20  REATE_VTABLE",  
9ca0: 20 20 20 20 20 20 22 44 52 4f 50 5f 56 54 41 42        "DROP_VTAB
9cb0: 4c 45 22 2c 0a 20 20 20 20 20 22 46 55 4e 43 54  LE",.     "FUNCT
9cc0: 49 4f 4e 22 2c 20 20 20 20 20 20 20 20 20 20 20  ION",           
9cd0: 20 20 22 53 41 56 45 50 4f 49 4e 54 22 2c 20 20    "SAVEPOINT",  
9ce0: 20 20 20 20 20 20 20 20 20 20 22 52 45 43 55 52            "RECUR
9cf0: 53 49 56 45 22 0a 20 20 7d 3b 0a 20 20 69 6e 74  SIVE".  };.  int
9d00: 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   i;.  const char
9d10: 20 2a 61 7a 5b 34 5d 3b 0a 20 20 61 7a 5b 30 5d   *az[4];.  az[0]
9d20: 20 3d 20 7a 41 31 3b 0a 20 20 61 7a 5b 31 5d 20   = zA1;.  az[1] 
9d30: 3d 20 7a 41 32 3b 0a 20 20 61 7a 5b 32 5d 20 3d  = zA2;.  az[2] =
9d40: 20 7a 41 33 3b 0a 20 20 61 7a 5b 33 5d 20 3d 20   zA3;.  az[3] = 
9d50: 7a 41 34 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e  zA4;.  utf8_prin
9d60: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 61 75 74 68  tf(p->out, "auth
9d70: 6f 72 69 7a 65 72 3a 20 25 73 22 2c 20 61 7a 41  orizer: %s", azA
9d80: 63 74 69 6f 6e 5b 6f 70 5d 29 3b 0a 20 20 66 6f  ction[op]);.  fo
9d90: 72 28 69 3d 30 3b 20 69 3c 34 3b 20 69 2b 2b 29  r(i=0; i<4; i++)
9da0: 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  {.    raw_printf
9db0: 28 70 2d 3e 6f 75 74 2c 20 22 20 22 29 3b 0a 20  (p->out, " ");. 
9dc0: 20 20 20 69 66 28 20 61 7a 5b 69 5d 20 29 7b 0a     if( az[i] ){.
9dd0: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73        output_c_s
9de0: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a  tring(p->out, az
9df0: 5b 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  [i]);.    }else{
9e00: 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
9e10: 66 28 70 2d 3e 6f 75 74 2c 20 22 4e 55 4c 4c 22  f(p->out, "NULL"
9e20: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
9e30: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
9e40: 2c 20 22 5c 6e 22 29 3b 0a 20 20 72 65 74 75 72  , "\n");.  retur
9e50: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23  n SQLITE_OK;.}.#
9e60: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 72 69  endif../*.** Pri
9e70: 6e 74 20 61 20 73 63 68 65 6d 61 20 73 74 61 74  nt a schema stat
9e80: 65 6d 65 6e 74 2e 20 20 50 61 72 74 20 6f 66 20  ement.  Part of 
9e90: 4d 4f 44 45 5f 53 65 6d 69 20 61 6e 64 20 4d 4f  MODE_Semi and MO
9ea0: 44 45 5f 50 72 65 74 74 79 20 6f 75 74 70 75 74  DE_Pretty output
9eb0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
9ec0: 74 69 6e 65 20 63 6f 6e 76 65 72 74 73 20 73 6f  tine converts so
9ed0: 6d 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  me CREATE TABLE 
9ee0: 73 74 61 74 65 6d 65 6e 74 73 20 66 6f 72 20 73  statements for s
9ef0: 68 61 64 6f 77 20 74 61 62 6c 65 73 0a 2a 2a 20  hadow tables.** 
9f00: 69 6e 20 46 54 53 33 2f 34 2f 35 20 69 6e 74 6f  in FTS3/4/5 into
9f10: 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46   CREATE TABLE IF
9f20: 20 4e 4f 54 20 45 58 49 53 54 53 20 73 74 61 74   NOT EXISTS stat
9f30: 65 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  ements..*/.stati
9f40: 63 20 76 6f 69 64 20 70 72 69 6e 74 53 63 68 65  c void printSche
9f50: 6d 61 4c 69 6e 65 28 46 49 4c 45 20 2a 6f 75 74  maLine(FILE *out
9f60: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  , const char *z,
9f70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
9f80: 69 6c 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  il){.  if( sqlit
9f90: 65 33 5f 73 74 72 67 6c 6f 62 28 22 43 52 45 41  e3_strglob("CREA
9fa0: 54 45 20 54 41 42 4c 45 20 5b 27 5c 22 5d 2a 22  TE TABLE ['\"]*"
9fb0: 2c 20 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75  , z)==0 ){.    u
9fc0: 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  tf8_printf(out, 
9fd0: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46  "CREATE TABLE IF
9fe0: 20 4e 4f 54 20 45 58 49 53 54 53 20 25 73 25 73   NOT EXISTS %s%s
9ff0: 22 2c 20 7a 2b 31 33 2c 20 7a 54 61 69 6c 29 3b  ", z+13, zTail);
a000: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 74  .  }else{.    ut
a010: 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  f8_printf(out, "
a020: 25 73 25 73 22 2c 20 7a 2c 20 7a 54 61 69 6c 29  %s%s", z, zTail)
a030: 3b 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76  ;.  }.}.static v
a040: 6f 69 64 20 70 72 69 6e 74 53 63 68 65 6d 61 4c  oid printSchemaL
a050: 69 6e 65 4e 28 46 49 4c 45 20 2a 6f 75 74 2c 20  ineN(FILE *out, 
a060: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20  char *z, int n, 
a070: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 69  const char *zTai
a080: 6c 29 7b 0a 20 20 63 68 61 72 20 63 20 3d 20 7a  l){.  char c = z
a090: 5b 6e 5d 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 30 3b  [n];.  z[n] = 0;
a0a0: 0a 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69  .  printSchemaLi
a0b0: 6e 65 28 6f 75 74 2c 20 7a 2c 20 7a 54 61 69 6c  ne(out, z, zTail
a0c0: 29 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 63 3b 0a 7d  );.  z[n] = c;.}
a0d0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
a0e0: 72 75 65 20 69 66 20 73 74 72 69 6e 67 20 7a 5b  rue if string z[
a0f0: 5d 20 68 61 73 20 6e 6f 74 68 69 6e 67 20 62 75  ] has nothing bu
a100: 74 20 77 68 69 74 65 73 70 61 63 65 20 61 6e 64  t whitespace and
a110: 20 63 6f 6d 6d 65 6e 74 73 20 74 6f 20 74 68 65   comments to the
a120: 0a 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66  .** end of the f
a130: 69 72 73 74 20 6c 69 6e 65 2e 0a 2a 2f 0a 73 74  irst line..*/.st
a140: 61 74 69 63 20 69 6e 74 20 77 73 54 6f 45 6f 6c  atic int wsToEol
a150: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
a160: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28  .  int i;.  for(
a170: 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b  i=0; z[i]; i++){
a180: 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  .    if( z[i]=='
a190: 5c 6e 27 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  \n' ) return 1;.
a1a0: 20 20 20 20 69 66 28 20 49 73 53 70 61 63 65 28      if( IsSpace(
a1b0: 7a 5b 69 5d 29 20 29 20 63 6f 6e 74 69 6e 75 65  z[i]) ) continue
a1c0: 3b 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d  ;.    if( z[i]==
a1d0: 27 2d 27 20 26 26 20 7a 5b 69 2b 31 5d 3d 3d 27  '-' && z[i+1]=='
a1e0: 2d 27 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  -' ) return 1;. 
a1f0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
a200: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 20  .  return 1;.}. 
a210: 20 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20     ../*.** This 
a220: 69 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20  is the callback 
a230: 72 6f 75 74 69 6e 65 20 74 68 61 74 20 74 68 65  routine that the
a240: 20 73 68 65 6c 6c 0a 2a 2a 20 69 6e 76 6f 6b 65   shell.** invoke
a250: 73 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f  s for each row o
a260: 66 20 61 20 71 75 65 72 79 20 72 65 73 75 6c 74  f a query result
a270: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
a280: 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28 0a  shell_callback(.
a290: 20 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20    void *pArg,.  
a2a0: 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20  int nArg,       
a2b0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65   /* Number of re
a2c0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a  sult columns */.
a2d0: 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20    char **azArg, 
a2e0: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61     /* Text of ea
a2f0: 63 68 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  ch result column
a300: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 43   */.  char **azC
a310: 6f 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e  ol,    /* Column
a320: 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20   names */.  int 
a330: 2a 61 69 54 79 70 65 20 20 20 20 20 20 2f 2a 20  *aiType      /* 
a340: 43 6f 6c 75 6d 6e 20 74 79 70 65 73 20 2a 2f 0a  Column types */.
a350: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 68  ){.  int i;.  Sh
a360: 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53  ellState *p = (S
a370: 68 65 6c 6c 53 74 61 74 65 2a 29 70 41 72 67 3b  hellState*)pArg;
a380: 0a 0a 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30  ..  if( azArg==0
a390: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
a3a0: 77 69 74 63 68 28 20 70 2d 3e 63 4d 6f 64 65 20  witch( p->cMode 
a3b0: 29 7b 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45  ){.    case MODE
a3c0: 5f 4c 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69  _Line: {.      i
a3d0: 6e 74 20 77 20 3d 20 35 3b 0a 20 20 20 20 20 20  nt w = 5;.      
a3e0: 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62  if( azArg==0 ) b
a3f0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28  reak;.      for(
a400: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
a410: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c  ){.        int l
a420: 65 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a  en = strlen30(az
a430: 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69  Col[i] ? azCol[i
a440: 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20  ] : "");.       
a450: 20 69 66 28 20 6c 65 6e 3e 77 20 29 20 77 20 3d   if( len>w ) w =
a460: 20 6c 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20   len;.      }.  
a470: 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b      if( p->cnt++
a480: 3e 30 20 29 20 75 74 66 38 5f 70 72 69 6e 74 66  >0 ) utf8_printf
a490: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70  (p->out, "%s", p
a4a0: 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b  ->rowSeparator);
a4b0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
a4c0: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
a4d0: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
a4e0: 66 28 70 2d 3e 6f 75 74 2c 22 25 2a 73 20 3d 20  f(p->out,"%*s = 
a4f0: 25 73 25 73 22 2c 20 77 2c 20 61 7a 43 6f 6c 5b  %s%s", w, azCol[
a500: 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  i],.            
a510: 20 20 20 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61      azArg[i] ? a
a520: 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c  zArg[i] : p->nul
a530: 6c 56 61 6c 75 65 2c 20 70 2d 3e 72 6f 77 53 65  lValue, p->rowSe
a540: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
a550: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
a560: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
a570: 44 45 5f 45 78 70 6c 61 69 6e 3a 0a 20 20 20 20  DE_Explain:.    
a580: 63 61 73 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e  case MODE_Column
a590: 3a 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63  : {.      static
a5a0: 20 63 6f 6e 73 74 20 69 6e 74 20 61 45 78 70 6c   const int aExpl
a5b0: 61 69 6e 57 69 64 74 68 73 5b 5d 20 3d 20 7b 34  ainWidths[] = {4
a5c0: 2c 20 31 33 2c 20 34 2c 20 34 2c 20 34 2c 20 31  , 13, 4, 4, 4, 1
a5d0: 33 2c 20 32 2c 20 31 33 7d 3b 0a 20 20 20 20 20  3, 2, 13};.     
a5e0: 20 63 6f 6e 73 74 20 69 6e 74 20 2a 63 6f 6c 57   const int *colW
a5f0: 69 64 74 68 3b 0a 20 20 20 20 20 20 69 6e 74 20  idth;.      int 
a600: 73 68 6f 77 48 64 72 3b 0a 20 20 20 20 20 20 63  showHdr;.      c
a610: 68 61 72 20 2a 72 6f 77 53 65 70 3b 0a 20 20 20  har *rowSep;.   
a620: 20 20 20 69 66 28 20 70 2d 3e 63 4d 6f 64 65 3d     if( p->cMode=
a630: 3d 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 20 29 7b 0a  =MODE_Column ){.
a640: 20 20 20 20 20 20 20 20 63 6f 6c 57 69 64 74 68          colWidth
a650: 20 3d 20 70 2d 3e 63 6f 6c 57 69 64 74 68 3b 0a   = p->colWidth;.
a660: 20 20 20 20 20 20 20 20 73 68 6f 77 48 64 72 20          showHdr 
a670: 3d 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 3b  = p->showHeader;
a680: 0a 20 20 20 20 20 20 20 20 72 6f 77 53 65 70 20  .        rowSep 
a690: 3d 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  = p->rowSeparato
a6a0: 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  r;.      }else{.
a6b0: 20 20 20 20 20 20 20 20 63 6f 6c 57 69 64 74 68          colWidth
a6c0: 20 3d 20 61 45 78 70 6c 61 69 6e 57 69 64 74 68   = aExplainWidth
a6d0: 73 3b 0a 20 20 20 20 20 20 20 20 73 68 6f 77 48  s;.        showH
a6e0: 64 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  dr = 1;.        
a6f0: 72 6f 77 53 65 70 20 3d 20 53 45 50 5f 52 6f 77  rowSep = SEP_Row
a700: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a710: 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20  if( p->cnt++==0 
a720: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
a730: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
a740: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
a750: 77 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  w, n;.          
a760: 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28  if( i<ArraySize(
a770: 70 2d 3e 63 6f 6c 57 69 64 74 68 29 20 29 7b 0a  p->colWidth) ){.
a780: 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20              w = 
a790: 63 6f 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20  colWidth[i];.   
a7a0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
a7b0: 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 30 3b            w = 0;
a7c0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
a7d0: 20 20 20 20 20 20 20 69 66 28 20 77 3d 3d 30 20         if( w==0 
a7e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77  ){.            w
a7f0: 20 3d 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a   = strlenChar(az
a800: 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69  Col[i] ? azCol[i
a810: 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20  ] : "");.       
a820: 20 20 20 20 20 69 66 28 20 77 3c 31 30 20 29 20       if( w<10 ) 
a830: 77 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20  w = 10;.        
a840: 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 43 68      n = strlenCh
a850: 61 72 28 61 7a 41 72 67 20 26 26 20 61 7a 41 72  ar(azArg && azAr
a860: 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20  g[i] ? azArg[i] 
a870: 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b  : p->nullValue);
a880: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
a890: 20 77 3c 6e 20 29 20 77 20 3d 20 6e 3b 0a 20 20   w<n ) w = n;.  
a8a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a8b0: 20 20 20 20 69 66 28 20 69 3c 41 72 72 61 79 53      if( i<ArrayS
a8c0: 69 7a 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64  ize(p->actualWid
a8d0: 74 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  th) ){.         
a8e0: 20 20 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74     p->actualWidt
a8f0: 68 5b 69 5d 20 3d 20 77 3b 0a 20 20 20 20 20 20  h[i] = w;.      
a900: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
a910: 69 66 28 20 73 68 6f 77 48 64 72 20 29 7b 0a 20  if( showHdr ){. 
a920: 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f             utf8_
a930: 77 69 64 74 68 5f 70 72 69 6e 74 28 70 2d 3e 6f  width_print(p->o
a940: 75 74 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69 5d 29  ut, w, azCol[i])
a950: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74  ;.            ut
a960: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
a970: 2c 20 22 25 73 22 2c 20 69 3d 3d 6e 41 72 67 2d  , "%s", i==nArg-
a980: 31 20 3f 20 72 6f 77 53 65 70 20 3a 20 22 20 20  1 ? rowSep : "  
a990: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ");.          }.
a9a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a9b0: 20 20 69 66 28 20 73 68 6f 77 48 64 72 20 29 7b    if( showHdr ){
a9c0: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
a9d0: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
a9e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  {.            in
a9f0: 74 20 77 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t w;.           
aa00: 20 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65   if( i<ArraySize
aa10: 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 29  (p->actualWidth)
aa20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
aa30: 20 20 20 77 20 3d 20 70 2d 3e 61 63 74 75 61 6c     w = p->actual
aa40: 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20  Width[i];.      
aa50: 20 20 20 20 20 20 20 20 20 69 66 28 20 77 3c 30           if( w<0
aa60: 20 29 20 77 20 3d 20 2d 77 3b 0a 20 20 20 20 20   ) w = -w;.     
aa70: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
aa80: 20 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d               w =
aa90: 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20   10;.           
aaa0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 75   }.            u
aab0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
aac0: 74 2c 22 25 2d 2a 2e 2a 73 25 73 22 2c 77 2c 77  t,"%-*.*s%s",w,w
aad0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
aae0: 20 20 20 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       "----------
aaf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ab00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ab10: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ab20: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
ab30: 20 20 20 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d       "----------
ab40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ab50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ab60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
ab70: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
ab80: 20 20 20 20 20 20 20 69 3d 3d 6e 41 72 67 2d 31         i==nArg-1
ab90: 20 3f 20 72 6f 77 53 65 70 20 3a 20 22 20 20 22   ? rowSep : "  "
aba0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
abb0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
abc0: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
abd0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
abe0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
abf0: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
ac00: 20 20 69 6e 74 20 77 3b 0a 20 20 20 20 20 20 20    int w;.       
ac10: 20 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65   if( i<ArraySize
ac20: 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 29  (p->actualWidth)
ac30: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 77   ){.           w
ac40: 20 3d 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74   = p->actualWidt
ac50: 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65  h[i];.        }e
ac60: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
ac70: 77 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20  w = 10;.        
ac80: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d  }.        if( p-
ac90: 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70  >cMode==MODE_Exp
aca0: 6c 61 69 6e 20 26 26 20 61 7a 41 72 67 5b 69 5d  lain && azArg[i]
acb0: 20 26 26 20 73 74 72 6c 65 6e 43 68 61 72 28 61   && strlenChar(a
acc0: 7a 41 72 67 5b 69 5d 29 3e 77 20 29 7b 0a 20 20  zArg[i])>w ){.  
acd0: 20 20 20 20 20 20 20 20 77 20 3d 20 73 74 72 6c          w = strl
ace0: 65 6e 43 68 61 72 28 61 7a 41 72 67 5b 69 5d 29  enChar(azArg[i])
acf0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ad00: 20 20 20 20 69 66 28 20 69 3d 3d 31 20 26 26 20      if( i==1 && 
ad10: 70 2d 3e 61 69 49 6e 64 65 6e 74 20 26 26 20 70  p->aiIndent && p
ad20: 2d 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20  ->pStmt ){.     
ad30: 20 20 20 20 20 69 66 28 20 70 2d 3e 69 49 6e 64       if( p->iInd
ad40: 65 6e 74 3c 70 2d 3e 6e 49 6e 64 65 6e 74 20 29  ent<p->nIndent )
ad50: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74  {.            ut
ad60: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
ad70: 2c 20 22 25 2a 2e 73 22 2c 20 70 2d 3e 61 69 49  , "%*.s", p->aiI
ad80: 6e 64 65 6e 74 5b 70 2d 3e 69 49 6e 64 65 6e 74  ndent[p->iIndent
ad90: 5d 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20  ], "");.        
ada0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d    }.          p-
adb0: 3e 69 49 6e 64 65 6e 74 2b 2b 3b 0a 20 20 20 20  >iIndent++;.    
adc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74      }.        ut
add0: 66 38 5f 77 69 64 74 68 5f 70 72 69 6e 74 28 70  f8_width_print(p
ade0: 2d 3e 6f 75 74 2c 20 77 2c 20 61 7a 41 72 67 5b  ->out, w, azArg[
adf0: 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20  i] ? azArg[i] : 
ae00: 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20  p->nullValue);. 
ae10: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
ae20: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
ae30: 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f 77   i==nArg-1 ? row
ae40: 53 65 70 20 3a 20 22 20 20 22 29 3b 0a 20 20 20  Sep : "  ");.   
ae50: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
ae60: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
ae70: 20 4d 4f 44 45 5f 53 65 6d 69 3a 20 7b 20 20 20   MODE_Semi: {   
ae80: 2f 2a 20 2e 73 63 68 65 6d 61 20 61 6e 64 20 2e  /* .schema and .
ae90: 66 75 6c 6c 73 63 68 65 6d 61 20 6f 75 74 70 75  fullschema outpu
aea0: 74 20 2a 2f 0a 20 20 20 20 20 20 70 72 69 6e 74  t */.      print
aeb0: 53 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75  SchemaLine(p->ou
aec0: 74 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 22 3b 5c  t, azArg[0], ";\
aed0: 6e 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  n");.      break
aee0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
aef0: 20 4d 4f 44 45 5f 50 72 65 74 74 79 3a 20 7b 20   MODE_Pretty: { 
af00: 20 2f 2a 20 2e 73 63 68 65 6d 61 20 61 6e 64 20   /* .schema and 
af10: 2e 66 75 6c 6c 73 63 68 65 6d 61 20 77 69 74 68  .fullschema with
af20: 20 2d 2d 69 6e 64 65 6e 74 20 2a 2f 0a 20 20 20   --indent */.   
af30: 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20     char *z;.    
af40: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69    int j;.      i
af50: 6e 74 20 6e 50 61 72 65 6e 20 3d 20 30 3b 0a 20  nt nParen = 0;. 
af60: 20 20 20 20 20 63 68 61 72 20 63 45 6e 64 20 3d       char cEnd =
af70: 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63   0;.      char c
af80: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6e  ;.      int nLin
af90: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73  e = 0;.      ass
afa0: 65 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a  ert( nArg==1 );.
afb0: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b        if( azArg[
afc0: 30 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  0]==0 ) break;. 
afd0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
afe0: 5f 73 74 72 6c 69 6b 65 28 22 43 52 45 41 54 45  _strlike("CREATE
aff0: 20 56 49 45 57 25 22 2c 20 61 7a 41 72 67 5b 30   VIEW%", azArg[0
b000: 5d 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 20  ], 0)==0.       
b010: 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69  || sqlite3_strli
b020: 6b 65 28 22 43 52 45 41 54 45 20 54 52 49 47 25  ke("CREATE TRIG%
b030: 22 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 30 29 3d  ", azArg[0], 0)=
b040: 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20  =0.      ){.    
b050: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
b060: 70 2d 3e 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c  p->out, "%s;\n",
b070: 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20   azArg[0]);.    
b080: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
b090: 20 7d 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c   }.      z = sql
b0a0: 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
b0b0: 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20  ", azArg[0]);.  
b0c0: 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20      j = 0;.     
b0d0: 20 66 6f 72 28 69 3d 30 3b 20 49 73 53 70 61 63   for(i=0; IsSpac
b0e0: 65 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a  e(z[i]); i++){}.
b0f0: 20 20 20 20 20 20 66 6f 72 28 3b 20 28 63 20 3d        for(; (c =
b100: 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b   z[i])!=0; i++){
b110: 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 73 53  .        if( IsS
b120: 70 61 63 65 28 63 29 20 29 7b 0a 20 20 20 20 20  pace(c) ){.     
b130: 20 20 20 20 20 69 66 28 20 7a 5b 6a 2d 31 5d 3d       if( z[j-1]=
b140: 3d 27 5c 72 27 20 29 20 7a 5b 6a 2d 31 5d 20 3d  ='\r' ) z[j-1] =
b150: 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20 20   '\n';.         
b160: 20 69 66 28 20 49 73 53 70 61 63 65 28 7a 5b 6a   if( IsSpace(z[j
b170: 2d 31 5d 29 20 7c 7c 20 7a 5b 6a 2d 31 5d 3d 3d  -1]) || z[j-1]==
b180: 27 28 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  '(' ) continue;.
b190: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
b1a0: 28 20 28 63 3d 3d 27 28 27 20 7c 7c 20 63 3d 3d  ( (c=='(' || c==
b1b0: 27 29 27 29 20 26 26 20 6a 3e 30 20 26 26 20 49  ')') && j>0 && I
b1c0: 73 53 70 61 63 65 28 7a 5b 6a 2d 31 5d 29 20 29  sSpace(z[j-1]) )
b1d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 2d 2d 3b  {.          j--;
b1e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b1f0: 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20     z[j++] = c;. 
b200: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69       }.      whi
b210: 6c 65 28 20 6a 3e 30 20 26 26 20 49 73 53 70 61  le( j>0 && IsSpa
b220: 63 65 28 7a 5b 6a 2d 31 5d 29 20 29 7b 20 6a 2d  ce(z[j-1]) ){ j-
b230: 2d 3b 20 7d 0a 20 20 20 20 20 20 7a 5b 6a 5d 20  -; }.      z[j] 
b240: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73  = 0;.      if( s
b250: 74 72 6c 65 6e 33 30 28 7a 29 3e 3d 37 39 20 29  trlen30(z)>=79 )
b260: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
b270: 6a 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21  j=0; (c = z[i])!
b280: 3d 30 3b 20 69 2b 2b 29 7b 20 20 2f 2a 20 43 6f  =0; i++){  /* Co
b290: 70 79 20 63 68 61 6e 67 65 73 20 66 72 6f 6d 20  py changes from 
b2a0: 7a 5b 69 5d 20 62 61 63 6b 20 74 6f 20 7a 5b 6a  z[i] back to z[j
b2b0: 5d 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  ] */.          i
b2c0: 66 28 20 63 3d 3d 63 45 6e 64 20 29 7b 0a 20 20  f( c==cEnd ){.  
b2d0: 20 20 20 20 20 20 20 20 20 20 63 45 6e 64 20 3d            cEnd =
b2e0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65   0;.          }e
b2f0: 6c 73 65 20 69 66 28 20 63 3d 3d 27 22 27 20 7c  lse if( c=='"' |
b300: 7c 20 63 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d  | c=='\'' || c==
b310: 27 60 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  '`' ){.         
b320: 20 20 20 63 45 6e 64 20 3d 20 63 3b 0a 20 20 20     cEnd = c;.   
b330: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
b340: 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20   c=='[' ){.     
b350: 20 20 20 20 20 20 20 63 45 6e 64 20 3d 20 27 5d         cEnd = ']
b360: 27 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  ';.          }el
b370: 73 65 20 69 66 28 20 63 3d 3d 27 2d 27 20 26 26  se if( c=='-' &&
b380: 20 7a 5b 69 2b 31 5d 3d 3d 27 2d 27 20 29 7b 0a   z[i+1]=='-' ){.
b390: 20 20 20 20 20 20 20 20 20 20 20 20 63 45 6e 64              cEnd
b3a0: 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20   = '\n';.       
b3b0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d     }else if( c==
b3c0: 27 28 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20  '(' ){.         
b3d0: 20 20 20 6e 50 61 72 65 6e 2b 2b 3b 0a 20 20 20     nParen++;.   
b3e0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
b3f0: 20 63 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20 20   c==')' ){.     
b400: 20 20 20 20 20 20 20 6e 50 61 72 65 6e 2d 2d 3b         nParen--;
b410: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
b420: 20 6e 4c 69 6e 65 3e 30 20 26 26 20 6e 50 61 72   nLine>0 && nPar
b430: 65 6e 3d 3d 30 20 26 26 20 6a 3e 30 20 29 7b 0a  en==0 && j>0 ){.
b440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
b450: 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28 70  intSchemaLineN(p
b460: 2d 3e 6f 75 74 2c 20 7a 2c 20 6a 2c 20 22 5c 6e  ->out, z, j, "\n
b470: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
b480: 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20    j = 0;.       
b490: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
b4a0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a   }.          z[j
b4b0: 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20  ++] = c;.       
b4c0: 20 20 20 69 66 28 20 6e 50 61 72 65 6e 3d 3d 31     if( nParen==1
b4d0: 20 26 26 20 63 45 6e 64 3d 3d 30 0a 20 20 20 20   && cEnd==0.    
b4e0: 20 20 20 20 20 20 20 26 26 20 28 63 3d 3d 27 28         && (c=='(
b4f0: 27 20 7c 7c 20 63 3d 3d 27 5c 6e 27 20 7c 7c 20  ' || c=='\n' || 
b500: 28 63 3d 3d 27 2c 27 20 26 26 20 21 77 73 54 6f  (c==',' && !wsTo
b510: 45 6f 6c 28 7a 2b 69 2b 31 29 29 29 0a 20 20 20  Eol(z+i+1))).   
b520: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
b530: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e        if( c=='\n
b540: 27 20 29 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20  ' ) j--;.       
b550: 20 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61       printSchema
b560: 4c 69 6e 65 4e 28 70 2d 3e 6f 75 74 2c 20 7a 2c  LineN(p->out, z,
b570: 20 6a 2c 20 22 5c 6e 20 20 22 29 3b 0a 20 20 20   j, "\n  ");.   
b580: 20 20 20 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a           j = 0;.
b590: 20 20 20 20 20 20 20 20 20 20 20 20 6e 4c 69 6e              nLin
b5a0: 65 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e++;.           
b5b0: 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28   while( IsSpace(
b5c0: 7a 5b 69 2b 31 5d 29 20 29 7b 20 69 2b 2b 3b 20  z[i+1]) ){ i++; 
b5d0: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  }.          }.  
b5e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b5f0: 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  z[j] = 0;.      
b600: 7d 0a 20 20 20 20 20 20 70 72 69 6e 74 53 63 68  }.      printSch
b610: 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20  emaLine(p->out, 
b620: 7a 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 20  z, ";\n");.     
b630: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
b640: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
b650: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
b660: 44 45 5f 4c 69 73 74 3a 20 7b 0a 20 20 20 20 20  DE_List: {.     
b670: 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30   if( p->cnt++==0
b680: 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65   && p->showHeade
b690: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  r ){.        for
b6a0: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
b6b0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74  +){.          ut
b6c0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
b6d0: 2c 22 25 73 25 73 22 2c 61 7a 43 6f 6c 5b 69 5d  ,"%s%s",azCol[i]
b6e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b6f0: 20 20 20 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20      i==nArg-1 ? 
b700: 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 20  p->rowSeparator 
b710: 3a 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  : p->colSeparato
b720: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
b730: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
b740: 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b  azArg==0 ) break
b750: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
b760: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
b770: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d         char *z =
b780: 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20   azArg[i];.     
b790: 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20     if( z==0 ) z 
b7a0: 3d 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 3b 0a  = p->nullValue;.
b7b0: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
b7c0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
b7d0: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , z);.        if
b7e0: 28 20 69 3c 6e 41 72 67 2d 31 20 29 7b 0a 20 20  ( i<nArg-1 ){.  
b7f0: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
b800: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
b810: 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
b820: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  r);.        }els
b830: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  e{.          utf
b840: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
b850: 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70   "%s", p->rowSep
b860: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20  arator);.       
b870: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
b880: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
b890: 20 20 63 61 73 65 20 4d 4f 44 45 5f 48 74 6d 6c    case MODE_Html
b8a0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  : {.      if( p-
b8b0: 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e  >cnt++==0 && p->
b8c0: 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20  showHeader ){.  
b8d0: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
b8e0: 28 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b  (p->out,"<TR>");
b8f0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
b900: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
b910: 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
b920: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 48  intf(p->out,"<TH
b930: 3e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f  >");.          o
b940: 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e  utput_html_strin
b950: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b  g(p->out, azCol[
b960: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  i]);.          r
b970: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
b980: 2c 22 3c 2f 54 48 3e 5c 6e 22 29 3b 0a 20 20 20  ,"</TH>\n");.   
b990: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
b9a0: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
b9b0: 2c 22 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20  ,"</TR>\n");.   
b9c0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61     }.      if( a
b9d0: 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b  zArg==0 ) break;
b9e0: 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
b9f0: 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29  f(p->out,"<TR>")
ba00: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
ba10: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
ba20: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
ba30: 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 44 3e 22 29  f(p->out,"<TD>")
ba40: 3b 0a 20 20 20 20 20 20 20 20 6f 75 74 70 75 74  ;.        output
ba50: 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28 70 2d 3e  _html_string(p->
ba60: 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20  out, azArg[i] ? 
ba70: 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75  azArg[i] : p->nu
ba80: 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  llValue);.      
ba90: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
baa0: 6f 75 74 2c 22 3c 2f 54 44 3e 5c 6e 22 29 3b 0a  out,"</TD>\n");.
bab0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61        }.      ra
bac0: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
bad0: 22 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20  "</TR>\n");.    
bae0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
baf0: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 54 63 6c     case MODE_Tcl
bb00: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  : {.      if( p-
bb10: 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e  >cnt++==0 && p->
bb20: 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20  showHeader ){.  
bb30: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
bb40: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
bb50: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f         output_c_
bb60: 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 61 7a  string(p->out,az
bb70: 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69  Col[i] ? azCol[i
bb80: 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20  ] : "");.       
bb90: 20 20 20 69 66 28 69 3c 6e 41 72 67 2d 31 29 20     if(i<nArg-1) 
bba0: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
bbb0: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c  ut, "%s", p->col
bbc0: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
bbd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74      }.        ut
bbe0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
bbf0: 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65  , "%s", p->rowSe
bc00: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
bc10: 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72  }.      if( azAr
bc20: 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  g==0 ) break;.  
bc30: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
bc40: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
bc50: 20 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69     output_c_stri
bc60: 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67  ng(p->out, azArg
bc70: 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a  [i] ? azArg[i] :
bc80: 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a   p->nullValue);.
bc90: 20 20 20 20 20 20 20 20 69 66 28 69 3c 6e 41 72          if(i<nAr
bca0: 67 2d 31 29 20 75 74 66 38 5f 70 72 69 6e 74 66  g-1) utf8_printf
bcb0: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70  (p->out, "%s", p
bcc0: 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b  ->colSeparator);
bcd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75  .      }.      u
bce0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
bcf0: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53  t, "%s", p->rowS
bd00: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
bd10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
bd20: 20 20 63 61 73 65 20 4d 4f 44 45 5f 43 73 76 3a    case MODE_Csv:
bd30: 20 7b 0a 20 20 20 20 20 20 73 65 74 42 69 6e 61   {.      setBina
bd40: 72 79 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31  ryMode(p->out, 1
bd50: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
bd60: 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73  cnt++==0 && p->s
bd70: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
bd80: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
bd90: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
bda0: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 73 76        output_csv
bdb0: 28 70 2c 20 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61  (p, azCol[i] ? a
bdc0: 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 2c 20 69 3c  zCol[i] : "", i<
bdd0: 6e 41 72 67 2d 31 29 3b 0a 20 20 20 20 20 20 20  nArg-1);.       
bde0: 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f   }.        utf8_
bdf0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
be00: 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  %s", p->rowSepar
be10: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ator);.      }. 
be20: 20 20 20 20 20 69 66 28 20 6e 41 72 67 3e 30 20       if( nArg>0 
be30: 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  ){.        for(i
be40: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
be50: 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70  {.          outp
be60: 75 74 5f 63 73 76 28 70 2c 20 61 7a 41 72 67 5b  ut_csv(p, azArg[
be70: 69 5d 2c 20 69 3c 6e 41 72 67 2d 31 29 3b 0a 20  i], i<nArg-1);. 
be80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
be90: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
bea0: 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f  out, "%s", p->ro
beb0: 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  wSeparator);.   
bec0: 20 20 20 7d 0a 20 20 20 20 20 20 73 65 74 54 65     }.      setTe
bed0: 78 74 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31  xtMode(p->out, 1
bee0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
bef0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d      }.    case M
bf00: 4f 44 45 5f 49 6e 73 65 72 74 3a 20 7b 0a 20 20  ODE_Insert: {.  
bf10: 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30      if( azArg==0
bf20: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
bf30: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
bf40: 75 74 2c 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  ut,"INSERT INTO 
bf50: 25 73 22 2c 70 2d 3e 7a 44 65 73 74 54 61 62 6c  %s",p->zDestTabl
bf60: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  e);.      if( p-
bf70: 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20  >showHeader ){. 
bf80: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
bf90: 66 28 70 2d 3e 6f 75 74 2c 22 28 22 29 3b 0a 20  f(p->out,"(");. 
bfa0: 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
bfb0: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
bfc0: 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20          if( i>0 
bfd0: 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e  ) raw_printf(p->
bfe0: 6f 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20  out, ",");.     
bff0: 20 20 20 20 20 69 66 28 20 71 75 6f 74 65 43 68       if( quoteCh
c000: 61 72 28 61 7a 43 6f 6c 5b 69 5d 29 20 29 7b 0a  ar(azCol[i]) ){.
c010: 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
c020: 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70   *z = sqlite3_mp
c030: 72 69 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c 20  rintf("\"%w\"", 
c040: 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  azCol[i]);.     
c050: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
c060: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
c070: 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   z);.           
c080: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
c090: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
c0a0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  e{.            r
c0b0: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
c0c0: 2c 20 22 25 73 22 2c 20 61 7a 43 6f 6c 5b 69 5d  , "%s", azCol[i]
c0d0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
c0e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c0f0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
c100: 75 74 2c 22 29 22 29 3b 0a 20 20 20 20 20 20 7d  ut,")");.      }
c110: 0a 20 20 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b  .      p->cnt++;
c120: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
c130: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
c140: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
c150: 28 70 2d 3e 6f 75 74 2c 20 69 3e 30 20 3f 20 22  (p->out, i>0 ? "
c160: 2c 22 20 3a 20 22 20 56 41 4c 55 45 53 28 22 29  ," : " VALUES(")
c170: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 61  ;.        if( (a
c180: 7a 41 72 67 5b 69 5d 3d 3d 30 29 20 7c 7c 20 28  zArg[i]==0) || (
c190: 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65  aiType && aiType
c1a0: 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c  [i]==SQLITE_NULL
c1b0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  ) ){.          u
c1c0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
c1d0: 74 2c 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20  t,"NULL");.     
c1e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54     }else if( aiT
c1f0: 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d  ype && aiType[i]
c200: 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b  ==SQLITE_TEXT ){
c210: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 53  .          if( S
c220: 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20 53  hellHasFlag(p, S
c230: 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29 20 29  HFLG_Newlines) )
c240: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 75  {.            ou
c250: 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69  tput_quoted_stri
c260: 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67  ng(p->out, azArg
c270: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
c280: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
c290: 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64     output_quoted
c2a0: 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28  _escaped_string(
c2b0: 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d  p->out, azArg[i]
c2c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
c2d0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
c2e0: 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70   aiType && aiTyp
c2f0: 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e 54  e[i]==SQLITE_INT
c300: 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20  EGER ){.        
c310: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
c320: 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67  >out,"%s", azArg
c330: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  [i]);.        }e
c340: 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26  lse if( aiType &
c350: 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c  & aiType[i]==SQL
c360: 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20  ITE_FLOAT ){.   
c370: 20 20 20 20 20 20 20 63 68 61 72 20 7a 5b 35 30         char z[50
c380: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75  ];.          dou
c390: 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f  ble r = sqlite3_
c3a0: 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 2d  column_double(p-
c3b0: 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  >pStmt, i);.    
c3c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
c3d0: 70 72 69 6e 74 66 28 35 30 2c 7a 2c 22 25 21 2e  printf(50,z,"%!.
c3e0: 32 30 67 22 2c 20 72 29 3b 0a 20 20 20 20 20 20  20g", r);.      
c3f0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
c400: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b  ->out, "%s", z);
c410: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
c420: 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54  f( aiType && aiT
c430: 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 42  ype[i]==SQLITE_B
c440: 4c 4f 42 20 26 26 20 70 2d 3e 70 53 74 6d 74 20  LOB && p->pStmt 
c450: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  ){.          con
c460: 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62 20 3d  st void *pBlob =
c470: 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
c480: 62 6c 6f 62 28 70 2d 3e 70 53 74 6d 74 2c 20 69  blob(p->pStmt, i
c490: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  );.          int
c4a0: 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33   nBlob = sqlite3
c4b0: 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 2d  _column_bytes(p-
c4c0: 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  >pStmt, i);.    
c4d0: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68 65 78        output_hex
c4e0: 5f 62 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20 70 42  _blob(p->out, pB
c4f0: 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 20  lob, nBlob);.   
c500: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69       }else if( i
c510: 73 4e 75 6d 62 65 72 28 61 7a 41 72 67 5b 69 5d  sNumber(azArg[i]
c520: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
c530: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
c540: 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67  >out,"%s", azArg
c550: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  [i]);.        }e
c560: 6c 73 65 20 69 66 28 20 53 68 65 6c 6c 48 61 73  lse if( ShellHas
c570: 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65  Flag(p, SHFLG_Ne
c580: 77 6c 69 6e 65 73 29 20 29 7b 0a 20 20 20 20 20  wlines) ){.     
c590: 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74       output_quot
c5a0: 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  ed_string(p->out
c5b0: 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  , azArg[i]);.   
c5c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
c5d0: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f        output_quo
c5e0: 74 65 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69  ted_escaped_stri
c5f0: 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67  ng(p->out, azArg
c600: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  [i]);.        }.
c610: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61        }.      ra
c620: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
c630: 22 29 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62  ");\n");.      b
c640: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
c650: 63 61 73 65 20 4d 4f 44 45 5f 51 75 6f 74 65 3a  case MODE_Quote:
c660: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41   {.      if( azA
c670: 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rg==0 ) break;. 
c680: 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 3d       if( p->cnt=
c690: 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61  =0 && p->showHea
c6a0: 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66  der ){.        f
c6b0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20  or(i=0; i<nArg; 
c6c0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
c6d0: 69 66 28 20 69 3e 30 20 29 20 72 61 77 5f 70 72  if( i>0 ) raw_pr
c6e0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 22  intf(p->out, ","
c6f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74  );.          out
c700: 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e  put_quoted_strin
c710: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b  g(p->out, azCol[
c720: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
c730: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
c740: 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a  f(p->out,"\n");.
c750: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d        }.      p-
c760: 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 66 6f  >cnt++;.      fo
c770: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
c780: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
c790: 20 69 3e 30 20 29 20 72 61 77 5f 70 72 69 6e 74   i>0 ) raw_print
c7a0: 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a  f(p->out, ",");.
c7b0: 20 20 20 20 20 20 20 20 69 66 28 20 28 61 7a 41          if( (azA
c7c0: 72 67 5b 69 5d 3d 3d 30 29 20 7c 7c 20 28 61 69  rg[i]==0) || (ai
c7d0: 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69  Type && aiType[i
c7e0: 5d 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20  ]==SQLITE_NULL) 
c7f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
c800: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
c810: 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 20  "NULL");.       
c820: 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70   }else if( aiTyp
c830: 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d  e && aiType[i]==
c840: 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20  SQLITE_TEXT ){. 
c850: 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f           output_
c860: 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d  quoted_string(p-
c870: 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b  >out, azArg[i]);
c880: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
c890: 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54  f( aiType && aiT
c8a0: 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 49  ype[i]==SQLITE_I
c8b0: 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20  NTEGER ){.      
c8c0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
c8d0: 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41  p->out,"%s", azA
c8e0: 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
c8f0: 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65  }else if( aiType
c900: 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53   && aiType[i]==S
c910: 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20  QLITE_FLOAT ){. 
c920: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 5b           char z[
c930: 35 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 64  50];.          d
c940: 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65  ouble r = sqlite
c950: 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28  3_column_double(
c960: 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  p->pStmt, i);.  
c970: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
c980: 73 6e 70 72 69 6e 74 66 28 35 30 2c 7a 2c 22 25  snprintf(50,z,"%
c990: 21 2e 32 30 67 22 2c 20 72 29 3b 0a 20 20 20 20  !.20g", r);.    
c9a0: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
c9b0: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a  (p->out, "%s", z
c9c0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
c9d0: 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61   if( aiType && a
c9e0: 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45  iType[i]==SQLITE
c9f0: 5f 42 4c 4f 42 20 26 26 20 70 2d 3e 70 53 74 6d  _BLOB && p->pStm
ca00: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  t ){.          c
ca10: 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62  onst void *pBlob
ca20: 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
ca30: 6e 5f 62 6c 6f 62 28 70 2d 3e 70 53 74 6d 74 2c  n_blob(p->pStmt,
ca40: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   i);.          i
ca50: 6e 74 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74  nt nBlob = sqlit
ca60: 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28  e3_column_bytes(
ca70: 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  p->pStmt, i);.  
ca80: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68          output_h
ca90: 65 78 5f 62 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20  ex_blob(p->out, 
caa0: 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20  pBlob, nBlob);. 
cab0: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
cac0: 20 69 73 4e 75 6d 62 65 72 28 61 7a 41 72 67 5b   isNumber(azArg[
cad0: 69 5d 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20  i], 0) ){.      
cae0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
caf0: 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41  p->out,"%s", azA
cb00: 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
cb10: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
cb20: 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73   output_quoted_s
cb30: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a  tring(p->out, az
cb40: 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[i]);.       
cb50: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
cb60: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
cb70: 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ut,"\n");.      
cb80: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
cb90: 20 63 61 73 65 20 4d 4f 44 45 5f 41 73 63 69 69   case MODE_Ascii
cba0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  : {.      if( p-
cbb0: 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e  >cnt++==0 && p->
cbc0: 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20  showHeader ){.  
cbd0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
cbe0: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
cbf0: 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29         if( i>0 )
cc00: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
cc10: 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f  out, "%s", p->co
cc20: 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  lSeparator);.   
cc30: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
cc40: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 61  tf(p->out,"%s",a
cc50: 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b  zCol[i] ? azCol[
cc60: 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20  i] : "");.      
cc70: 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38    }.        utf8
cc80: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
cc90: 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61  "%s", p->rowSepa
cca0: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a  rator);.      }.
ccb0: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d        if( azArg=
ccc0: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
ccd0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
cce0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
ccf0: 20 69 66 28 20 69 3e 30 20 29 20 75 74 66 38 5f   if( i>0 ) utf8_
cd00: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
cd10: 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  %s", p->colSepar
cd20: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 75  ator);.        u
cd30: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
cd40: 74 2c 22 25 73 22 2c 61 7a 41 72 67 5b 69 5d 20  t,"%s",azArg[i] 
cd50: 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e  ? azArg[i] : p->
cd60: 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20  nullValue);.    
cd70: 20 20 7d 0a 20 20 20 20 20 20 75 74 66 38 5f 70    }.      utf8_p
cd80: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
cd90: 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  s", p->rowSepara
cda0: 74 6f 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61  tor);.      brea
cdb0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  k;.    }.  }.  r
cdc0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
cdd0: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63 61  * This is the ca
cde0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 74  llback routine t
cdf0: 68 61 74 20 74 68 65 20 53 51 4c 69 74 65 20 6c  hat the SQLite l
ce00: 69 62 72 61 72 79 0a 2a 2a 20 69 6e 76 6f 6b 65  ibrary.** invoke
ce10: 73 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f  s for each row o
ce20: 66 20 61 20 71 75 65 72 79 20 72 65 73 75 6c 74  f a query result
ce30: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
ce40: 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70  callback(void *p
ce50: 41 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63  Arg, int nArg, c
ce60: 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61  har **azArg, cha
ce70: 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20 20 2f 2a  r **azCol){.  /*
ce80: 20 73 69 6e 63 65 20 77 65 20 64 6f 6e 27 74 20   since we don't 
ce90: 68 61 76 65 20 74 79 70 65 20 69 6e 66 6f 2c 20  have type info, 
cea0: 63 61 6c 6c 20 74 68 65 20 73 68 65 6c 6c 5f 63  call the shell_c
ceb0: 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 61 20 4e  allback with a N
cec0: 55 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a 20 20 72  ULL value */.  r
ced0: 65 74 75 72 6e 20 73 68 65 6c 6c 5f 63 61 6c 6c  eturn shell_call
cee0: 62 61 63 6b 28 70 41 72 67 2c 20 6e 41 72 67 2c  back(pArg, nArg,
cef0: 20 61 7a 41 72 67 2c 20 61 7a 43 6f 6c 2c 20 4e   azArg, azCol, N
cf00: 55 4c 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  ULL);.}../*.** T
cf10: 68 69 73 20 69 73 20 74 68 65 20 63 61 6c 6c 62  his is the callb
cf20: 61 63 6b 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d  ack routine from
cf30: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20   sqlite3_exec() 
cf40: 74 68 61 74 20 61 70 70 65 6e 64 73 20 61 6c 6c  that appends all
cf50: 0a 2a 2a 20 6f 75 74 70 75 74 20 6f 6e 74 6f 20  .** output onto 
cf60: 74 68 65 20 65 6e 64 20 6f 66 20 61 20 53 68 65  the end of a She
cf70: 6c 6c 54 65 78 74 20 6f 62 6a 65 63 74 2e 0a 2a  llText object..*
cf80: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 70  /.static int cap
cf90: 74 75 72 65 4f 75 74 70 75 74 43 61 6c 6c 62 61  tureOutputCallba
cfa0: 63 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69  ck(void *pArg, i
cfb0: 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a  nt nArg, char **
cfc0: 61 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a  azArg, char **az
cfd0: 29 7b 0a 20 20 53 68 65 6c 6c 54 65 78 74 20 2a  ){.  ShellText *
cfe0: 70 20 3d 20 28 53 68 65 6c 6c 54 65 78 74 2a 29  p = (ShellText*)
cff0: 70 41 72 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pArg;.  int i;. 
d000: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
d010: 52 28 61 7a 29 3b 0a 20 20 69 66 28 20 61 7a 41  R(az);.  if( azA
d020: 72 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  rg==0 ) return 0
d030: 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 20 29 20 61  ;.  if( p->n ) a
d040: 70 70 65 6e 64 54 65 78 74 28 70 2c 20 22 7c 22  ppendText(p, "|"
d050: 2c 20 30 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  , 0);.  for(i=0;
d060: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
d070: 20 20 20 69 66 28 20 69 20 29 20 61 70 70 65 6e     if( i ) appen
d080: 64 54 65 78 74 28 70 2c 20 22 2c 22 2c 20 30 29  dText(p, ",", 0)
d090: 3b 0a 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b  ;.    if( azArg[
d0a0: 69 5d 20 29 20 61 70 70 65 6e 64 54 65 78 74 28  i] ) appendText(
d0b0: 70 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 30 29 3b  p, azArg[i], 0);
d0c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
d0d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
d0e0: 74 65 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  te an appropriat
d0f0: 65 20 53 45 4c 46 54 45 53 54 20 74 61 62 6c 65  e SELFTEST table
d100: 20 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74   in the main dat
d110: 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  abase..*/.static
d120: 20 76 6f 69 64 20 63 72 65 61 74 65 53 65 6c 66   void createSelf
d130: 74 65 73 74 54 61 62 6c 65 28 53 68 65 6c 6c 53  testTable(ShellS
d140: 74 61 74 65 20 2a 70 29 7b 0a 20 20 63 68 61 72  tate *p){.  char
d150: 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
d160: 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
d170: 3e 64 62 2c 0a 20 20 20 20 22 53 41 56 45 50 4f  >db,.    "SAVEPO
d180: 49 4e 54 20 73 65 6c 66 74 65 73 74 5f 69 6e 69  INT selftest_ini
d190: 74 3b 5c 6e 22 0a 20 20 20 20 22 43 52 45 41 54  t;\n".    "CREAT
d1a0: 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
d1b0: 58 49 53 54 53 20 73 65 6c 66 74 65 73 74 28 5c  XISTS selftest(\
d1c0: 6e 22 0a 20 20 20 20 22 20 20 74 6e 6f 20 49 4e  n".    "  tno IN
d1d0: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
d1e0: 59 2c 5c 6e 22 20 20 20 2f 2a 20 54 65 73 74 20  Y,\n"   /* Test 
d1f0: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 22 20  number */.    " 
d200: 20 6f 70 20 54 45 58 54 2c 5c 6e 22 20 20 20 20   op TEXT,\n"    
d210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d220: 2a 20 4f 70 65 72 61 74 6f 72 3a 20 20 6d 65 6d  * Operator:  mem
d230: 6f 20 72 75 6e 20 2a 2f 0a 20 20 20 20 22 20 20  o run */.    "  
d240: 63 6d 64 20 54 45 58 54 2c 5c 6e 22 20 20 20 20  cmd TEXT,\n"    
d250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d260: 20 43 6f 6d 6d 61 6e 64 20 74 65 78 74 20 2a 2f   Command text */
d270: 0a 20 20 20 20 22 20 20 61 6e 73 20 54 45 58 54  .    "  ans TEXT
d280: 5c 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20  \n"             
d290: 20 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65 64        /* Desired
d2a0: 20 61 6e 73 77 65 72 20 2a 2f 0a 20 20 20 20 22   answer */.    "
d2b0: 29 3b 22 0a 20 20 20 20 22 43 52 45 41 54 45 20  );".    "CREATE 
d2c0: 54 45 4d 50 20 54 41 42 4c 45 20 5b 5f 73 68 65  TEMP TABLE [_she
d2d0: 6c 6c 24 73 65 6c 66 5d 28 6f 70 2c 63 6d 64 2c  ll$self](op,cmd,
d2e0: 61 6e 73 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e  ans);\n".    "IN
d2f0: 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65 6c  SERT INTO [_shel
d300: 6c 24 73 65 6c 66 5d 28 72 6f 77 69 64 2c 6f 70  l$self](rowid,op
d310: 2c 63 6d 64 29 5c 6e 22 0a 20 20 20 20 22 20 20  ,cmd)\n".    "  
d320: 56 41 4c 55 45 53 28 63 6f 61 6c 65 73 63 65 28  VALUES(coalesce(
d330: 28 53 45 4c 45 43 54 20 28 6d 61 78 28 74 6e 6f  (SELECT (max(tno
d340: 29 2b 31 30 30 29 2f 31 30 20 46 52 4f 4d 20 73  )+100)/10 FROM s
d350: 65 6c 66 74 65 73 74 29 2c 31 30 29 2c 5c 6e 22  elftest),10),\n"
d360: 0a 20 20 20 20 22 20 20 20 20 20 20 20 20 20 27  .    "         '
d370: 6d 65 6d 6f 27 2c 27 54 65 73 74 73 20 67 65 6e  memo','Tests gen
d380: 65 72 61 74 65 64 20 62 79 20 2d 2d 69 6e 69 74  erated by --init
d390: 27 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45  ');\n".    "INSE
d3a0: 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24  RT INTO [_shell$
d3b0: 73 65 6c 66 5d 5c 6e 22 0a 20 20 20 20 22 20 20  self]\n".    "  
d3c0: 53 45 4c 45 43 54 20 27 72 75 6e 27 2c 5c 6e 22  SELECT 'run',\n"
d3d0: 0a 20 20 20 20 22 20 20 20 20 27 53 45 4c 45 43  .    "    'SELEC
d3e0: 54 20 68 65 78 28 73 68 61 33 5f 71 75 65 72 79  T hex(sha3_query
d3f0: 28 27 27 53 45 4c 45 43 54 20 74 79 70 65 2c 6e  (''SELECT type,n
d400: 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c 73 71 6c  ame,tbl_name,sql
d410: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
d420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d430: 20 20 20 20 22 46 52 4f 4d 20 73 71 6c 69 74 65      "FROM sqlite
d440: 5f 6d 61 73 74 65 72 20 4f 52 44 45 52 20 42 59  _master ORDER BY
d450: 20 32 27 27 2c 32 32 34 29 29 27 2c 5c 6e 22 0a   2'',224))',\n".
d460: 20 20 20 20 22 20 20 20 20 68 65 78 28 73 68 61      "    hex(sha
d470: 33 5f 71 75 65 72 79 28 27 53 45 4c 45 43 54 20  3_query('SELECT 
d480: 74 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61  type,name,tbl_na
d490: 6d 65 2c 73 71 6c 20 22 0a 20 20 20 20 20 20 20  me,sql ".       
d4a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4b0: 20 20 20 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f     "FROM sqlite_
d4c0: 6d 61 73 74 65 72 20 4f 52 44 45 52 20 42 59 20  master ORDER BY 
d4d0: 32 27 2c 32 32 34 29 29 3b 5c 6e 22 0a 20 20 20  2',224));\n".   
d4e0: 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f   "INSERT INTO [_
d4f0: 73 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20  shell$self]\n". 
d500: 20 20 20 22 20 20 53 45 4c 45 43 54 20 27 72 75     "  SELECT 'ru
d510: 6e 27 2c 22 0a 20 20 20 20 22 20 20 20 20 27 53  n',".    "    'S
d520: 45 4c 45 43 54 20 68 65 78 28 73 68 61 33 5f 71  ELECT hex(sha3_q
d530: 75 65 72 79 28 27 27 53 45 4c 45 43 54 20 2a 20  uery(''SELECT * 
d540: 46 52 4f 4d 20 5c 22 27 20 7c 7c 22 0a 20 20 20  FROM \"' ||".   
d550: 20 22 20 20 20 20 20 20 20 20 70 72 69 6e 74 66   "        printf
d560: 28 27 25 77 27 2c 6e 61 6d 65 29 20 7c 7c 20 27  ('%w',name) || '
d570: 5c 22 20 4e 4f 54 20 49 4e 44 45 58 45 44 27 27  \" NOT INDEXED''
d580: 2c 32 32 34 29 29 27 2c 5c 6e 22 0a 20 20 20 20  ,224))',\n".    
d590: 22 20 20 20 20 68 65 78 28 73 68 61 33 5f 71 75  "    hex(sha3_qu
d5a0: 65 72 79 28 70 72 69 6e 74 66 28 27 53 45 4c 45  ery(printf('SELE
d5b0: 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c 22  CT * FROM \"%w\"
d5c0: 20 4e 4f 54 20 49 4e 44 45 58 45 44 27 2c 6e 61   NOT INDEXED',na
d5d0: 6d 65 29 2c 32 32 34 29 29 5c 6e 22 0a 20 20 20  me),224))\n".   
d5e0: 20 22 20 20 46 52 4f 4d 20 28 5c 6e 22 0a 20 20   "  FROM (\n".  
d5f0: 20 20 22 20 20 20 20 53 45 4c 45 43 54 20 6e 61    "    SELECT na
d600: 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  me FROM sqlite_m
d610: 61 73 74 65 72 5c 6e 22 0a 20 20 20 20 22 20 20  aster\n".    "  
d620: 20 20 20 57 48 45 52 45 20 74 79 70 65 3d 27 74     WHERE type='t
d630: 61 62 6c 65 27 5c 6e 22 0a 20 20 20 20 22 20 20  able'\n".    "  
d640: 20 20 20 20 20 41 4e 44 20 6e 61 6d 65 3c 3e 27       AND name<>'
d650: 73 65 6c 66 74 65 73 74 27 5c 6e 22 0a 20 20 20  selftest'\n".   
d660: 20 22 20 20 20 20 20 20 20 41 4e 44 20 63 6f 61   "       AND coa
d670: 6c 65 73 63 65 28 72 6f 6f 74 70 61 67 65 2c 30  lesce(rootpage,0
d680: 29 3e 30 5c 6e 22 0a 20 20 20 20 22 20 20 29 5c  )>0\n".    "  )\
d690: 6e 22 0a 20 20 20 20 22 20 4f 52 44 45 52 20 42  n".    " ORDER B
d6a0: 59 20 6e 61 6d 65 3b 5c 6e 22 0a 20 20 20 20 22  Y name;\n".    "
d6b0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68  INSERT INTO [_sh
d6c0: 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20 20 20  ell$self]\n".   
d6d0: 20 22 20 20 56 41 4c 55 45 53 28 27 72 75 6e 27   "  VALUES('run'
d6e0: 2c 27 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69  ,'PRAGMA integri
d6f0: 74 79 5f 63 68 65 63 6b 27 2c 27 6f 6b 27 29 3b  ty_check','ok');
d700: 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20  \n".    "INSERT 
d710: 49 4e 54 4f 20 73 65 6c 66 74 65 73 74 28 74 6e  INTO selftest(tn
d720: 6f 2c 6f 70 2c 63 6d 64 2c 61 6e 73 29 22 0a 20  o,op,cmd,ans)". 
d730: 20 20 20 22 20 20 53 45 4c 45 43 54 20 72 6f 77     "  SELECT row
d740: 69 64 2a 31 30 2c 6f 70 2c 63 6d 64 2c 61 6e 73  id*10,op,cmd,ans
d750: 20 46 52 4f 4d 20 5b 5f 73 68 65 6c 6c 24 73 65   FROM [_shell$se
d760: 6c 66 5d 3b 5c 6e 22 0a 20 20 20 20 22 44 52 4f  lf];\n".    "DRO
d770: 50 20 54 41 42 4c 45 20 5b 5f 73 68 65 6c 6c 24  P TABLE [_shell$
d780: 73 65 6c 66 5d 3b 22 0a 20 20 20 20 2c 30 2c 30  self];".    ,0,0
d790: 2c 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66  ,&zErrMsg);.  if
d7a0: 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ( zErrMsg ){.   
d7b0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
d7c0: 65 72 72 2c 20 22 53 45 4c 46 54 45 53 54 20 69  err, "SELFTEST i
d7d0: 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 61  nitialization fa
d7e0: 69 6c 75 72 65 3a 20 25 73 5c 6e 22 2c 20 7a 45  ilure: %s\n", zE
d7f0: 72 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69  rrMsg);.    sqli
d800: 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67  te3_free(zErrMsg
d810: 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33  );.  }.  sqlite3
d820: 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 52 45  _exec(p->db, "RE
d830: 4c 45 41 53 45 20 73 65 6c 66 74 65 73 74 5f 69  LEASE selftest_i
d840: 6e 69 74 22 2c 30 2c 30 2c 30 29 3b 0a 7d 0a 0a  nit",0,0,0);.}..
d850: 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64  ./*.** Set the d
d860: 65 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65  estination table
d870: 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 53 68   field of the Sh
d880: 65 6c 6c 53 74 61 74 65 20 73 74 72 75 63 74 75  ellState structu
d890: 72 65 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d  re to.** the nam
d8a0: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 67  e of the table g
d8b0: 69 76 65 6e 2e 20 20 45 73 63 61 70 65 20 61 6e  iven.  Escape an
d8c0: 79 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65  y quote characte
d8d0: 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20 74 61 62  rs in the.** tab
d8e0: 6c 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74  le name..*/.stat
d8f0: 69 63 20 76 6f 69 64 20 73 65 74 5f 74 61 62 6c  ic void set_tabl
d900: 65 5f 6e 61 6d 65 28 53 68 65 6c 6c 53 74 61 74  e_name(ShellStat
d910: 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *p, const char
d920: 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20   *zName){.  int 
d930: 69 2c 20 6e 3b 0a 20 20 63 68 61 72 20 63 51 75  i, n;.  char cQu
d940: 6f 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  ote;.  char *z;.
d950: 0a 20 20 69 66 28 20 70 2d 3e 7a 44 65 73 74 54  .  if( p->zDestT
d960: 61 62 6c 65 20 29 7b 0a 20 20 20 20 66 72 65 65  able ){.    free
d970: 28 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 29 3b  (p->zDestTable);
d980: 0a 20 20 20 20 70 2d 3e 7a 44 65 73 74 54 61 62  .    p->zDestTab
d990: 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66  le = 0;.  }.  if
d9a0: 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74  ( zName==0 ) ret
d9b0: 75 72 6e 3b 0a 20 20 63 51 75 6f 74 65 20 3d 20  urn;.  cQuote = 
d9c0: 71 75 6f 74 65 43 68 61 72 28 7a 4e 61 6d 65 29  quoteChar(zName)
d9d0: 3b 0a 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30  ;.  n = strlen30
d9e0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 63  (zName);.  if( c
d9f0: 51 75 6f 74 65 20 29 20 6e 20 2b 3d 20 6e 2b 32  Quote ) n += n+2
da00: 3b 0a 20 20 7a 20 3d 20 70 2d 3e 7a 44 65 73 74  ;.  z = p->zDest
da10: 54 61 62 6c 65 20 3d 20 6d 61 6c 6c 6f 63 28 20  Table = malloc( 
da20: 6e 2b 31 20 29 3b 0a 20 20 69 66 28 20 7a 3d 3d  n+1 );.  if( z==
da30: 30 20 29 7b 0a 20 20 20 20 72 61 77 5f 70 72 69  0 ){.    raw_pri
da40: 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f  ntf(stderr,"Erro
da50: 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  r: out of memory
da60: 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31  \n");.    exit(1
da70: 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 30 3b 0a  );.  }.  n = 0;.
da80: 20 20 69 66 28 20 63 51 75 6f 74 65 20 29 20 7a    if( cQuote ) z
da90: 5b 6e 2b 2b 5d 20 3d 20 63 51 75 6f 74 65 3b 0a  [n++] = cQuote;.
daa0: 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d 65    for(i=0; zName
dab0: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a  [i]; i++){.    z
dac0: 5b 6e 2b 2b 5d 20 3d 20 7a 4e 61 6d 65 5b 69 5d  [n++] = zName[i]
dad0: 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b  ;.    if( zName[
dae0: 69 5d 3d 3d 63 51 75 6f 74 65 20 29 20 7a 5b 6e  i]==cQuote ) z[n
daf0: 2b 2b 5d 20 3d 20 63 51 75 6f 74 65 3b 0a 20 20  ++] = cQuote;.  
db00: 7d 0a 20 20 69 66 28 20 63 51 75 6f 74 65 20 29  }.  if( cQuote )
db10: 20 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75 6f 74 65   z[n++] = cQuote
db20: 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 7d 0a  ;.  z[n] = 0;.}.
db30: 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  ../*.** Execute 
db40: 61 20 71 75 65 72 79 20 73 74 61 74 65 6d 65 6e  a query statemen
db50: 74 20 74 68 61 74 20 77 69 6c 6c 20 67 65 6e 65  t that will gene
db60: 72 61 74 65 20 53 51 4c 20 6f 75 74 70 75 74 2e  rate SQL output.
db70: 20 20 50 72 69 6e 74 0a 2a 2a 20 74 68 65 20 72    Print.** the r
db80: 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2c 20 63  esult columns, c
db90: 6f 6d 6d 61 2d 73 65 70 61 72 61 74 65 64 2c 20  omma-separated, 
dba0: 6f 6e 20 61 20 6c 69 6e 65 20 61 6e 64 20 74 68  on a line and th
dbb0: 65 6e 20 61 64 64 20 61 0a 2a 2a 20 73 65 6d 69  en add a.** semi
dbc0: 63 6f 6c 6f 6e 20 74 65 72 6d 69 6e 61 74 6f 72  colon terminator
dbd0: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74   to the end of t
dbe0: 68 61 74 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20  hat line..**.** 
dbf0: 49 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  If the number of
dc00: 20 63 6f 6c 75 6d 6e 73 20 69 73 20 31 20 61 6e   columns is 1 an
dc10: 64 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 63 6f  d that column co
dc20: 6e 74 61 69 6e 73 20 74 65 78 74 20 22 2d 2d 22  ntains text "--"
dc30: 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74  .** then write t
dc40: 68 65 20 73 65 6d 69 63 6f 6c 6f 6e 20 6f 6e 20  he semicolon on 
dc50: 61 20 73 65 70 61 72 61 74 65 20 6c 69 6e 65 2e  a separate line.
dc60: 20 20 54 68 61 74 20 77 61 79 2c 20 69 66 20 61    That way, if a
dc70: 0a 2a 2a 20 22 2d 2d 22 20 63 6f 6d 6d 65 6e 74  .** "--" comment
dc80: 20 6f 63 63 75 72 73 20 61 74 20 74 68 65 20 65   occurs at the e
dc90: 6e 64 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d  nd of the statem
dca0: 65 6e 74 2c 20 74 68 65 20 63 6f 6d 6d 65 6e 74  ent, the comment
dcb0: 0a 2a 2a 20 77 6f 6e 27 74 20 63 6f 6e 73 75 6d  .** won't consum
dcc0: 65 20 74 68 65 20 73 65 6d 69 63 6f 6c 6f 6e 20  e the semicolon 
dcd0: 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2f 0a 73  terminator..*/.s
dce0: 74 61 74 69 63 20 69 6e 74 20 72 75 6e 5f 74 61  tatic int run_ta
dcf0: 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28 0a  ble_dump_query(.
dd00: 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c    ShellState *p,
dd10: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75             /* Qu
dd20: 65 72 79 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ery context */. 
dd30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65   const char *zSe
dd40: 6c 65 63 74 2c 20 20 20 20 20 2f 2a 20 53 45 4c  lect,     /* SEL
dd50: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  ECT statement to
dd60: 20 65 78 74 72 61 63 74 20 63 6f 6e 74 65 6e 74   extract content
dd70: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
dd80: 20 2a 7a 46 69 72 73 74 52 6f 77 20 20 20 20 2f   *zFirstRow    /
dd90: 2a 20 50 72 69 6e 74 20 62 65 66 6f 72 65 20 66  * Print before f
dda0: 69 72 73 74 20 72 6f 77 2c 20 69 66 20 6e 6f 74  irst row, if not
ddb0: 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71   NULL */.){.  sq
ddc0: 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c  lite3_stmt *pSel
ddd0: 65 63 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ect;.  int rc;. 
dde0: 20 69 6e 74 20 6e 52 65 73 75 6c 74 3b 0a 20 20   int nResult;.  
ddf0: 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63  int i;.  const c
de00: 68 61 72 20 2a 7a 3b 0a 20 20 72 63 20 3d 20 73  har *z;.  rc = s
de10: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
de20: 32 28 70 2d 3e 64 62 2c 20 7a 53 65 6c 65 63 74  2(p->db, zSelect
de30: 2c 20 2d 31 2c 20 26 70 53 65 6c 65 63 74 2c 20  , -1, &pSelect, 
de40: 30 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51  0);.  if( rc!=SQ
de50: 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 70 53 65 6c  LITE_OK || !pSel
de60: 65 63 74 20 29 7b 0a 20 20 20 20 75 74 66 38 5f  ect ){.    utf8_
de70: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
de80: 2f 2a 2a 2a 2a 20 45 52 52 4f 52 3a 20 28 25 64  /**** ERROR: (%d
de90: 29 20 25 73 20 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20  ) %s *****/\n", 
dea0: 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rc,.            
deb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d      sqlite3_errm
dec0: 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  sg(p->db));.    
ded0: 69 66 28 20 28 72 63 26 30 78 66 66 29 21 3d 53  if( (rc&0xff)!=S
dee0: 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 20  QLITE_CORRUPT ) 
def0: 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72  p->nErr++;.    r
df00: 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20  eturn rc;.  }.  
df10: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
df20: 70 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 6e 52  p(pSelect);.  nR
df30: 65 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 5f  esult = sqlite3_
df40: 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 65  column_count(pSe
df50: 6c 65 63 74 29 3b 0a 20 20 77 68 69 6c 65 28 20  lect);.  while( 
df60: 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  rc==SQLITE_ROW )
df70: 7b 0a 20 20 20 20 69 66 28 20 7a 46 69 72 73 74  {.    if( zFirst
df80: 52 6f 77 20 29 7b 0a 20 20 20 20 20 20 75 74 66  Row ){.      utf
df90: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
dfa0: 20 22 25 73 22 2c 20 7a 46 69 72 73 74 52 6f 77   "%s", zFirstRow
dfb0: 29 3b 0a 20 20 20 20 20 20 7a 46 69 72 73 74 52  );.      zFirstR
dfc0: 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  ow = 0;.    }.  
dfd0: 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61    z = (const cha
dfe0: 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
dff0: 6e 5f 74 65 78 74 28 70 53 65 6c 65 63 74 2c 20  n_text(pSelect, 
e000: 30 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69  0);.    utf8_pri
e010: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
e020: 2c 20 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  , z);.    for(i=
e030: 31 3b 20 69 3c 6e 52 65 73 75 6c 74 3b 20 69 2b  1; i<nResult; i+
e040: 2b 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  +){.      utf8_p
e050: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2c  rintf(p->out, ",
e060: 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  %s", sqlite3_col
e070: 75 6d 6e 5f 74 65 78 74 28 70 53 65 6c 65 63 74  umn_text(pSelect
e080: 2c 20 69 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  , i));.    }.   
e090: 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20   if( z==0 ) z = 
e0a0: 22 22 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a  "";.    while( z
e0b0: 5b 30 5d 20 26 26 20 28 7a 5b 30 5d 21 3d 27 2d  [0] && (z[0]!='-
e0c0: 27 20 7c 7c 20 7a 5b 31 5d 21 3d 27 2d 27 29 20  ' || z[1]!='-') 
e0d0: 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a  ) z++;.    if( z
e0e0: 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 72 61 77  [0] ){.      raw
e0f0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
e100: 22 5c 6e 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d 65  "\n;\n");.    }e
e110: 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
e120: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 3b  rintf(p->out, ";
e130: 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  \n");.    }.    
e140: 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
e150: 70 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a  p(pSelect);.  }.
e160: 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
e170: 69 6e 61 6c 69 7a 65 28 70 53 65 6c 65 63 74 29  inalize(pSelect)
e180: 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ;.  if( rc!=SQLI
e190: 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 74 66  TE_OK ){.    utf
e1a0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
e1b0: 20 22 2f 2a 2a 2a 2a 20 45 52 52 4f 52 3a 20 28   "/**** ERROR: (
e1c0: 25 64 29 20 25 73 20 2a 2a 2a 2a 2a 2f 5c 6e 22  %d) %s *****/\n"
e1d0: 2c 20 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20  , rc,.          
e1e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72        sqlite3_er
e1f0: 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20  rmsg(p->db));.  
e200: 20 20 69 66 28 20 28 72 63 26 30 78 66 66 29 21    if( (rc&0xff)!
e210: 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
e220: 29 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d  ) p->nErr++;.  }
e230: 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
e240: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
e250: 73 70 61 63 65 20 61 6e 64 20 73 61 76 65 20 6f  space and save o
e260: 66 66 20 63 75 72 72 65 6e 74 20 65 72 72 6f 72  ff current error
e270: 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74   string..*/.stat
e280: 69 63 20 63 68 61 72 20 2a 73 61 76 65 5f 65 72  ic char *save_er
e290: 72 5f 6d 73 67 28 0a 20 20 73 71 6c 69 74 65 33  r_msg(.  sqlite3
e2a0: 20 2a 64 62 20 20 20 20 20 20 20 20 20 20 20 20   *db            
e2b0: 2f 2a 20 44 61 74 61 62 61 73 65 20 74 6f 20 71  /* Database to q
e2c0: 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  uery */.){.  int
e2d0: 20 6e 45 72 72 4d 73 67 20 3d 20 31 2b 73 74 72   nErrMsg = 1+str
e2e0: 6c 65 6e 33 30 28 73 71 6c 69 74 65 33 5f 65 72  len30(sqlite3_er
e2f0: 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 63 68 61  rmsg(db));.  cha
e300: 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c  r *zErrMsg = sql
e310: 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 45  ite3_malloc64(nE
e320: 72 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 7a 45  rrMsg);.  if( zE
e330: 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 6d 65 6d  rrMsg ){.    mem
e340: 63 70 79 28 7a 45 72 72 4d 73 67 2c 20 73 71 6c  cpy(zErrMsg, sql
e350: 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c  ite3_errmsg(db),
e360: 20 6e 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20   nErrMsg);.  }. 
e370: 20 72 65 74 75 72 6e 20 7a 45 72 72 4d 73 67 3b   return zErrMsg;
e380: 0a 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 6c 69 6e  .}..#ifdef __lin
e390: 75 78 5f 5f 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d  ux__./*.** Attem
e3a0: 70 74 20 74 6f 20 64 69 73 70 6c 61 79 20 49 2f  pt to display I/
e3b0: 4f 20 73 74 61 74 73 20 6f 6e 20 4c 69 6e 75 78  O stats on Linux
e3c0: 20 75 73 69 6e 67 20 2f 70 72 6f 63 2f 50 49 44   using /proc/PID
e3d0: 2f 69 6f 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  /io.*/.static vo
e3e0: 69 64 20 64 69 73 70 6c 61 79 4c 69 6e 75 78 49  id displayLinuxI
e3f0: 6f 53 74 61 74 73 28 46 49 4c 45 20 2a 6f 75 74  oStats(FILE *out
e400: 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20  ){.  FILE *in;. 
e410: 20 63 68 61 72 20 7a 5b 32 30 30 5d 3b 0a 20 20   char z[200];.  
e420: 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
e430: 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22  (sizeof(z), z, "
e440: 2f 70 72 6f 63 2f 25 64 2f 69 6f 22 2c 20 67 65  /proc/%d/io", ge
e450: 74 70 69 64 28 29 29 3b 0a 20 20 69 6e 20 3d 20  tpid());.  in = 
e460: 66 6f 70 65 6e 28 7a 2c 20 22 72 62 22 29 3b 0a  fopen(z, "rb");.
e470: 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 20 72 65    if( in==0 ) re
e480: 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 66  turn;.  while( f
e490: 67 65 74 73 28 7a 2c 20 73 69 7a 65 6f 66 28 7a  gets(z, sizeof(z
e4a0: 29 2c 20 69 6e 29 21 3d 30 20 29 7b 0a 20 20 20  ), in)!=0 ){.   
e4b0: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
e4c0: 72 75 63 74 20 7b 0a 20 20 20 20 20 20 63 6f 6e  ruct {.      con
e4d0: 73 74 20 63 68 61 72 20 2a 7a 50 61 74 74 65 72  st char *zPatter
e4e0: 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  n;.      const c
e4f0: 68 61 72 20 2a 7a 44 65 73 63 3b 0a 20 20 20 20  har *zDesc;.    
e500: 7d 20 61 54 72 61 6e 73 5b 5d 20 3d 20 7b 0a 20  } aTrans[] = {. 
e510: 20 20 20 20 20 7b 20 22 72 63 68 61 72 3a 20 22       { "rchar: "
e520: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
e530: 20 20 20 22 42 79 74 65 73 20 72 65 63 65 69 76     "Bytes receiv
e540: 65 64 20 62 79 20 72 65 61 64 28 29 3a 22 20 7d  ed by read():" }
e550: 2c 0a 20 20 20 20 20 20 7b 20 22 77 63 68 61 72  ,.      { "wchar
e560: 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  : ",            
e570: 20 20 20 20 20 20 22 42 79 74 65 73 20 73 65 6e        "Bytes sen
e580: 74 20 74 6f 20 77 72 69 74 65 28 29 3a 22 20 20  t to write():"  
e590: 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 73 79    },.      { "sy
e5a0: 73 63 72 3a 20 22 2c 20 20 20 20 20 20 20 20 20  scr: ",         
e5b0: 20 20 20 20 20 20 20 20 20 22 52 65 61 64 28 29           "Read()
e5c0: 20 73 79 73 74 65 6d 20 63 61 6c 6c 73 3a 22 20   system calls:" 
e5d0: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
e5e0: 22 73 79 73 63 77 3a 20 22 2c 20 20 20 20 20 20  "syscw: ",      
e5f0: 20 20 20 20 20 20 20 20 20 20 20 20 22 57 72 69              "Wri
e600: 74 65 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c  te() system call
e610: 73 3a 22 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  s:"     },.     
e620: 20 7b 20 22 72 65 61 64 5f 62 79 74 65 73 3a 20   { "read_bytes: 
e630: 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ",             "
e640: 42 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d 20  Bytes read from 
e650: 73 74 6f 72 61 67 65 3a 22 20 20 7d 2c 0a 20 20  storage:"  },.  
e660: 20 20 20 20 7b 20 22 77 72 69 74 65 5f 62 79 74      { "write_byt
e670: 65 73 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20  es: ",          
e680: 20 20 22 42 79 74 65 73 20 77 72 69 74 74 65 6e    "Bytes written
e690: 20 74 6f 20 73 74 6f 72 61 67 65 3a 22 20 7d 2c   to storage:" },
e6a0: 0a 20 20 20 20 20 20 7b 20 22 63 61 6e 63 65 6c  .      { "cancel
e6b0: 6c 65 64 5f 77 72 69 74 65 5f 62 79 74 65 73 3a  led_write_bytes:
e6c0: 20 22 2c 20 20 22 43 61 6e 63 65 6c 6c 65 64 20   ",  "Cancelled 
e6d0: 77 72 69 74 65 20 62 79 74 65 73 3a 22 20 20 20  write bytes:"   
e6e0: 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69   },.    };.    i
e6f0: 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d  nt i;.    for(i=
e700: 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
e710: 54 72 61 6e 73 29 3b 20 69 2b 2b 29 7b 0a 20 20  Trans); i++){.  
e720: 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c      int n = strl
e730: 65 6e 33 30 28 61 54 72 61 6e 73 5b 69 5d 2e 7a  en30(aTrans[i].z
e740: 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20  Pattern);.      
e750: 69 66 28 20 73 74 72 6e 63 6d 70 28 61 54 72 61  if( strncmp(aTra
e760: 6e 73 5b 69 5d 2e 7a 50 61 74 74 65 72 6e 2c 20  ns[i].zPattern, 
e770: 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  z, n)==0 ){.    
e780: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
e790: 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 73 22 2c  out, "%-36s %s",
e7a0: 20 61 54 72 61 6e 73 5b 69 5d 2e 7a 44 65 73 63   aTrans[i].zDesc
e7b0: 2c 20 26 7a 5b 6e 5d 29 3b 0a 20 20 20 20 20 20  , &z[n]);.      
e7c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
e7d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 63 6c  .    }.  }.  fcl
e7e0: 6f 73 65 28 69 6e 29 3b 0a 7d 0a 23 65 6e 64 69  ose(in);.}.#endi
e7f0: 66 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79  f../*.** Display
e800: 20 61 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f   a single line o
e810: 66 20 73 74 61 74 75 73 20 75 73 69 6e 67 20 36  f status using 6
e820: 34 2d 62 69 74 20 76 61 6c 75 65 73 2e 0a 2a 2f  4-bit values..*/
e830: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73  .static void dis
e840: 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 0a 20 20  playStatLine(.  
e850: 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 20  ShellState *p,  
e860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
e870: 20 73 68 65 6c 6c 20 63 6f 6e 74 65 78 74 20 2a   shell context *
e880: 2f 0a 20 20 63 68 61 72 20 2a 7a 4c 61 62 65 6c  /.  char *zLabel
e890: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ,             /*
e8a0: 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 69 73 20   Label for this 
e8b0: 6f 6e 65 20 6c 69 6e 65 20 2a 2f 0a 20 20 63 68  one line */.  ch
e8c0: 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 20 20 20  ar *zFormat,    
e8d0: 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 6d 61          /* Forma
e8e0: 74 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74  t for the result
e8f0: 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 74 75   */.  int iStatu
e900: 73 43 74 72 6c 2c 20 20 20 20 20 20 20 20 20 20  sCtrl,          
e910: 2f 2a 20 57 68 69 63 68 20 73 74 61 74 75 73 20  /* Which status 
e920: 74 6f 20 64 69 73 70 6c 61 79 20 2a 2f 0a 20 20  to display */.  
e930: 69 6e 74 20 62 52 65 73 65 74 20 20 20 20 20 20  int bReset      
e940: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
e950: 65 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 73  e to reset the s
e960: 74 61 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  tats */.){.  sql
e970: 69 74 65 33 5f 69 6e 74 36 34 20 69 43 75 72 20  ite3_int64 iCur 
e980: 3d 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65 33 5f  = -1;.  sqlite3_
e990: 69 6e 74 36 34 20 69 48 69 77 74 72 20 3d 20 2d  int64 iHiwtr = -
e9a0: 31 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 50 65 72  1;.  int i, nPer
e9b0: 63 65 6e 74 3b 0a 20 20 63 68 61 72 20 7a 4c 69  cent;.  char zLi
e9c0: 6e 65 5b 32 30 30 5d 3b 0a 20 20 73 71 6c 69 74  ne[200];.  sqlit
e9d0: 65 33 5f 73 74 61 74 75 73 36 34 28 69 53 74 61  e3_status64(iSta
e9e0: 74 75 73 43 74 72 6c 2c 20 26 69 43 75 72 2c 20  tusCtrl, &iCur, 
e9f0: 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29  &iHiwtr, bReset)
ea00: 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6e 50 65  ;.  for(i=0, nPe
ea10: 72 63 65 6e 74 3d 30 3b 20 7a 46 6f 72 6d 61 74  rcent=0; zFormat
ea20: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  [i]; i++){.    i
ea30: 66 28 20 7a 46 6f 72 6d 61 74 5b 69 5d 3d 3d 27  f( zFormat[i]=='
ea40: 25 27 20 29 20 6e 50 65 72 63 65 6e 74 2b 2b 3b  %' ) nPercent++;
ea50: 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 65 72 63  .  }.  if( nPerc
ea60: 65 6e 74 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c  ent>1 ){.    sql
ea70: 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
ea80: 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 7a 4c 69  zeof(zLine), zLi
ea90: 6e 65 2c 20 7a 46 6f 72 6d 61 74 2c 20 69 43 75  ne, zFormat, iCu
eaa0: 72 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 7d 65  r, iHiwtr);.  }e
eab0: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
eac0: 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
ead0: 28 7a 4c 69 6e 65 29 2c 20 7a 4c 69 6e 65 2c 20  (zLine), zLine, 
eae0: 7a 46 6f 72 6d 61 74 2c 20 69 48 69 77 74 72 29  zFormat, iHiwtr)
eaf0: 3b 0a 20 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e  ;.  }.  raw_prin
eb00: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 33 36  tf(p->out, "%-36
eb10: 73 20 25 73 5c 6e 22 2c 20 7a 4c 61 62 65 6c 2c  s %s\n", zLabel,
eb20: 20 7a 4c 69 6e 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   zLine);.}../*.*
eb30: 2a 20 44 69 73 70 6c 61 79 20 6d 65 6d 6f 72 79  * Display memory
eb40: 20 73 74 61 74 73 2e 0a 2a 2f 0a 73 74 61 74 69   stats..*/.stati
eb50: 63 20 69 6e 74 20 64 69 73 70 6c 61 79 5f 73 74  c int display_st
eb60: 61 74 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ats(.  sqlite3 *
eb70: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
eb80: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 74     /* Database t
eb90: 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 68 65  o query */.  She
eba0: 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 2c 20 20  llState *pArg,  
ebb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
ebc0: 74 65 72 20 74 6f 20 53 68 65 6c 6c 53 74 61 74  ter to ShellStat
ebd0: 65 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 73 65  e */.  int bRese
ebe0: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
ebf0: 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65     /* True to re
ec00: 73 65 74 20 74 68 65 20 73 74 61 74 73 20 2a 2f  set the stats */
ec10: 0a 29 7b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a  .){.  int iCur;.
ec20: 20 20 69 6e 74 20 69 48 69 77 74 72 3b 0a 0a 20    int iHiwtr;.. 
ec30: 20 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72   if( pArg && pAr
ec40: 67 2d 3e 6f 75 74 20 29 7b 0a 20 20 20 20 64 69  g->out ){.    di
ec50: 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41  splayStatLine(pA
ec60: 72 67 2c 20 22 4d 65 6d 6f 72 79 20 55 73 65 64  rg, "Memory Used
ec70: 3a 22 2c 0a 20 20 20 20 20 20 20 22 25 6c 6c 64  :",.       "%lld
ec80: 20 28 6d 61 78 20 25 6c 6c 64 29 20 62 79 74 65   (max %lld) byte
ec90: 73 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55  s", SQLITE_STATU
eca0: 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44 2c 20 62  S_MEMORY_USED, b
ecb0: 52 65 73 65 74 29 3b 0a 20 20 20 20 64 69 73 70  Reset);.    disp
ecc0: 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67  layStatLine(pArg
ecd0: 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 4f 75 74  , "Number of Out
ece0: 73 74 61 6e 64 69 6e 67 20 41 6c 6c 6f 63 61 74  standing Allocat
ecf0: 69 6f 6e 73 3a 22 2c 0a 20 20 20 20 20 20 20 22  ions:",.       "
ed00: 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 22  %lld (max %lld)"
ed10: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f  , SQLITE_STATUS_
ed20: 4d 41 4c 4c 4f 43 5f 43 4f 55 4e 54 2c 20 62 52  MALLOC_COUNT, bR
ed30: 65 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20 70  eset);.    if( p
ed40: 41 72 67 2d 3e 73 68 65 6c 6c 46 6c 67 73 20 26  Arg->shellFlgs &
ed50: 20 53 48 46 4c 47 5f 50 61 67 65 63 61 63 68 65   SHFLG_Pagecache
ed60: 20 29 7b 0a 20 20 20 20 20 20 64 69 73 70 6c 61   ){.      displa
ed70: 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20  yStatLine(pArg, 
ed80: 22 4e 75 6d 62 65 72 20 6f 66 20 50 63 61 63 68  "Number of Pcach
ed90: 65 20 50 61 67 65 73 20 55 73 65 64 3a 22 2c 0a  e Pages Used:",.
eda0: 20 20 20 20 20 20 20 20 20 22 25 6c 6c 64 20 28           "%lld (
edb0: 6d 61 78 20 25 6c 6c 64 29 20 70 61 67 65 73 22  max %lld) pages"
edc0: 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f  , SQLITE_STATUS_
edd0: 50 41 47 45 43 41 43 48 45 5f 55 53 45 44 2c 20  PAGECACHE_USED, 
ede0: 62 52 65 73 65 74 29 3b 0a 20 20 20 20 7d 0a 20  bReset);.    }. 
edf0: 20 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69     displayStatLi
ee00: 6e 65 28 70 41 72 67 2c 20 22 4e 75 6d 62 65 72  ne(pArg, "Number
ee10: 20 6f 66 20 50 63 61 63 68 65 20 4f 76 65 72 66   of Pcache Overf
ee20: 6c 6f 77 20 42 79 74 65 73 3a 22 2c 0a 20 20 20  low Bytes:",.   
ee30: 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25      "%lld (max %
ee40: 6c 6c 64 29 20 62 79 74 65 73 22 2c 20 53 51 4c  lld) bytes", SQL
ee50: 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43  ITE_STATUS_PAGEC
ee60: 41 43 48 45 5f 4f 56 45 52 46 4c 4f 57 2c 20 62  ACHE_OVERFLOW, b
ee70: 52 65 73 65 74 29 3b 0a 20 20 20 20 64 69 73 70  Reset);.    disp
ee80: 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67  layStatLine(pArg
ee90: 2c 20 22 4c 61 72 67 65 73 74 20 41 6c 6c 6f 63  , "Largest Alloc
eea0: 61 74 69 6f 6e 3a 22 2c 0a 20 20 20 20 20 20 20  ation:",.       
eeb0: 22 25 6c 6c 64 20 62 79 74 65 73 22 2c 20 53 51  "%lld bytes", SQ
eec0: 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c  LITE_STATUS_MALL
eed0: 4f 43 5f 53 49 5a 45 2c 20 62 52 65 73 65 74 29  OC_SIZE, bReset)
eee0: 3b 0a 20 20 20 20 64 69 73 70 6c 61 79 53 74 61  ;.    displaySta
eef0: 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4c 61 72  tLine(pArg, "Lar
ef00: 67 65 73 74 20 50 63 61 63 68 65 20 41 6c 6c 6f  gest Pcache Allo
ef10: 63 61 74 69 6f 6e 3a 22 2c 0a 20 20 20 20 20 20  cation:",.      
ef20: 20 22 25 6c 6c 64 20 62 79 74 65 73 22 2c 20 53   "%lld bytes", S
ef30: 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47  QLITE_STATUS_PAG
ef40: 45 43 41 43 48 45 5f 53 49 5a 45 2c 20 62 52 65  ECACHE_SIZE, bRe
ef50: 73 65 74 29 3b 0a 23 69 66 64 65 66 20 59 59 54  set);.#ifdef YYT
ef60: 52 41 43 4b 4d 41 58 53 54 41 43 4b 44 45 50 54  RACKMAXSTACKDEPT
ef70: 48 0a 20 20 20 20 64 69 73 70 6c 61 79 53 74 61  H.    displaySta
ef80: 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 44 65 65  tLine(pArg, "Dee
ef90: 70 65 73 74 20 50 61 72 73 65 72 20 53 74 61 63  pest Parser Stac
efa0: 6b 3a 22 2c 0a 20 20 20 20 20 20 20 22 25 6c 6c  k:",.       "%ll
efb0: 64 20 28 6d 61 78 20 25 6c 6c 64 29 22 2c 20 53  d (max %lld)", S
efc0: 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41 52  QLITE_STATUS_PAR
efd0: 53 45 52 5f 53 54 41 43 4b 2c 20 62 52 65 73 65  SER_STACK, bRese
efe0: 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a  t);.#endif.  }..
eff0: 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70 41    if( pArg && pA
f000: 72 67 2d 3e 6f 75 74 20 26 26 20 64 62 20 29 7b  rg->out && db ){
f010: 0a 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e 73  .    if( pArg->s
f020: 68 65 6c 6c 46 6c 67 73 20 26 20 53 48 46 4c 47  hellFlgs & SHFLG
f030: 5f 4c 6f 6f 6b 61 73 69 64 65 20 29 7b 0a 20 20  _Lookaside ){.  
f040: 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75      iHiwtr = iCu
f050: 72 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 73 71  r = -1;.      sq
f060: 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
f070: 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
f080: 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 55 53  TUS_LOOKASIDE_US
f090: 45 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ED,.            
f0a0: 20 20 20 20 20 20 20 20 20 20 20 20 26 69 43 75              &iCu
f0b0: 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73  r, &iHiwtr, bRes
f0c0: 65 74 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70  et);.      raw_p
f0d0: 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
f0e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
f0f0: 4c 6f 6f 6b 61 73 69 64 65 20 53 6c 6f 74 73 20  Lookaside Slots 
f100: 55 73 65 64 3a 20 20 20 20 20 20 20 20 20 20 20  Used:           
f110: 20 20 20 20 20 25 64 20 28 6d 61 78 20 25 64 29       %d (max %d)
f120: 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
f130: 20 20 20 69 43 75 72 2c 20 69 48 69 77 74 72 29     iCur, iHiwtr)
f140: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
f150: 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
f160: 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f  LITE_DBSTATUS_LO
f170: 4f 4b 41 53 49 44 45 5f 48 49 54 2c 0a 20 20 20  OKASIDE_HIT,.   
f180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f190: 20 20 20 20 20 26 69 43 75 72 2c 20 26 69 48 69       &iCur, &iHi
f1a0: 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  wtr, bReset);.  
f1b0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
f1c0: 41 72 67 2d 3e 6f 75 74 2c 20 22 53 75 63 63 65  Arg->out, "Succe
f1d0: 73 73 66 75 6c 20 6c 6f 6f 6b 61 73 69 64 65 20  ssful lookaside 
f1e0: 61 74 74 65 6d 70 74 73 3a 20 20 20 20 20 20 20  attempts:       
f1f0: 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  %d\n",.         
f200: 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a 20 20       iHiwtr);.  
f210: 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
f220: 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
f230: 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53  _DBSTATUS_LOOKAS
f240: 49 44 45 5f 4d 49 53 53 5f 53 49 5a 45 2c 0a 20  IDE_MISS_SIZE,. 
f250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f260: 20 20 20 20 20 20 20 26 69 43 75 72 2c 20 26 69         &iCur, &i
f270: 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a  Hiwtr, bReset);.
f280: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
f290: 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f  (pArg->out, "Loo
f2a0: 6b 61 73 69 64 65 20 66 61 69 6c 75 72 65 73 20  kaside failures 
f2b0: 64 75 65 20 74 6f 20 73 69 7a 65 3a 20 20 20 20  due to size:    
f2c0: 20 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20    %d\n",.       
f2d0: 20 20 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a         iHiwtr);.
f2e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62        sqlite3_db
f2f0: 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
f300: 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b  TE_DBSTATUS_LOOK
f310: 41 53 49 44 45 5f 4d 49 53 53 5f 46 55 4c 4c 2c  ASIDE_MISS_FULL,
f320: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f330: 20 20 20 20 20 20 20 20 20 26 69 43 75 72 2c 20           &iCur, 
f340: 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29  &iHiwtr, bReset)
f350: 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  ;.      raw_prin
f360: 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c  tf(pArg->out, "L
f370: 6f 6f 6b 61 73 69 64 65 20 66 61 69 6c 75 72 65  ookaside failure
f380: 73 20 64 75 65 20 74 6f 20 4f 4f 4d 3a 20 20 20  s due to OOM:   
f390: 20 20 20 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20      %d\n",.     
f3a0: 20 20 20 20 20 20 20 20 20 69 48 69 77 74 72 29           iHiwtr)
f3b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 48 69 77  ;.    }.    iHiw
f3c0: 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a  tr = iCur = -1;.
f3d0: 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
f3e0: 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
f3f0: 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f  _DBSTATUS_CACHE_
f400: 55 53 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48  USED, &iCur, &iH
f410: 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20  iwtr, bReset);. 
f420: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
f430: 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 72 20  rg->out, "Pager 
f440: 48 65 61 70 20 55 73 61 67 65 3a 20 20 20 20 20  Heap Usage:     
f450: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
f460: 64 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20  d bytes\n",.    
f470: 20 20 20 20 20 20 20 20 69 43 75 72 29 3b 0a 20          iCur);. 
f480: 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72     iHiwtr = iCur
f490: 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74   = -1;.    sqlit
f4a0: 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c  e3_db_status(db,
f4b0: 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
f4c0: 5f 43 41 43 48 45 5f 48 49 54 2c 20 26 69 43 75  _CACHE_HIT, &iCu
f4d0: 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a  r, &iHiwtr, 1);.
f4e0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
f4f0: 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20  Arg->out, "Page 
f500: 63 61 63 68 65 20 68 69 74 73 3a 20 20 20 20 20  cache hits:     
f510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f520: 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
f530: 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
f540: 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -1;.    sqlite
f550: 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
f560: 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
f570: 43 41 43 48 45 5f 4d 49 53 53 2c 20 26 69 43 75  CACHE_MISS, &iCu
f580: 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a  r, &iHiwtr, 1);.
f590: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
f5a0: 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20  Arg->out, "Page 
f5b0: 63 61 63 68 65 20 6d 69 73 73 65 73 3a 20 20 20  cache misses:   
f5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f5d0: 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
f5e0: 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
f5f0: 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -1;.    sqlite
f600: 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
f610: 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
f620: 43 41 43 48 45 5f 57 52 49 54 45 2c 20 26 69 43  CACHE_WRITE, &iC
f630: 75 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b  ur, &iHiwtr, 1);
f640: 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
f650: 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65  pArg->out, "Page
f660: 20 63 61 63 68 65 20 77 72 69 74 65 73 3a 20 20   cache writes:  
f670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f680: 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20   %d\n", iCur);. 
f690: 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72     iHiwtr = iCur
f6a0: 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74   = -1;.    sqlit
f6b0: 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c  e3_db_status(db,
f6c0: 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53   SQLITE_DBSTATUS
f6d0: 5f 53 43 48 45 4d 41 5f 55 53 45 44 2c 20 26 69  _SCHEMA_USED, &i
f6e0: 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52  Cur, &iHiwtr, bR
f6f0: 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70  eset);.    raw_p
f700: 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
f710: 20 22 53 63 68 65 6d 61 20 48 65 61 70 20 55 73   "Schema Heap Us
f720: 61 67 65 3a 20 20 20 20 20 20 20 20 20 20 20 20  age:            
f730: 20 20 20 20 20 20 20 25 64 20 62 79 74 65 73 5c         %d bytes\
f740: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
f750: 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77 74  iCur);.    iHiwt
f760: 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20  r = iCur = -1;. 
f770: 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74     sqlite3_db_st
f780: 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f  atus(db, SQLITE_
f790: 44 42 53 54 41 54 55 53 5f 53 54 4d 54 5f 55 53  DBSTATUS_STMT_US
f7a0: 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77  ED, &iCur, &iHiw
f7b0: 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  tr, bReset);.   
f7c0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
f7d0: 2d 3e 6f 75 74 2c 20 22 53 74 61 74 65 6d 65 6e  ->out, "Statemen
f7e0: 74 20 48 65 61 70 2f 4c 6f 6f 6b 61 73 69 64 65  t Heap/Lookaside
f7f0: 20 55 73 61 67 65 3a 20 20 20 20 20 20 25 64 20   Usage:      %d 
f800: 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20  bytes\n",.      
f810: 20 20 20 20 20 20 69 43 75 72 29 3b 0a 20 20 7d        iCur);.  }
f820: 0a 0a 20 20 69 66 28 20 70 41 72 67 20 26 26 20  ..  if( pArg && 
f830: 70 41 72 67 2d 3e 6f 75 74 20 26 26 20 64 62 20  pArg->out && db 
f840: 26 26 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 29  && pArg->pStmt )
f850: 7b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c  {.    iCur = sql
f860: 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73  ite3_stmt_status
f870: 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51  (pArg->pStmt, SQ
f880: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
f890: 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 2c 0a 20  FULLSCAN_STEP,. 
f8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 52                bR
f8c0: 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70  eset);.    raw_p
f8d0: 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
f8e0: 20 22 46 75 6c 6c 73 63 61 6e 20 53 74 65 70 73   "Fullscan Steps
f8f0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
f900: 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43         %d\n", iC
f910: 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20  ur);.    iCur = 
f920: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
f930: 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c  tus(pArg->pStmt,
f940: 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
f950: 55 53 5f 53 4f 52 54 2c 20 62 52 65 73 65 74 29  US_SORT, bReset)
f960: 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
f970: 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53 6f 72  (pArg->out, "Sor
f980: 74 20 4f 70 65 72 61 74 69 6f 6e 73 3a 20 20 20  t Operations:   
f990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9a0: 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a    %d\n", iCur);.
f9b0: 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74      iCur = sqlit
f9c0: 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70  e3_stmt_status(p
f9d0: 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49  Arg->pStmt, SQLI
f9e0: 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55  TE_STMTSTATUS_AU
f9f0: 54 4f 49 4e 44 45 58 2c 62 52 65 73 65 74 29 3b  TOINDEX,bReset);
fa00: 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
fa10: 70 41 72 67 2d 3e 6f 75 74 2c 20 22 41 75 74 6f  pArg->out, "Auto
fa20: 69 6e 64 65 78 20 49 6e 73 65 72 74 73 3a 20 20  index Inserts:  
fa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fa40: 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20   %d\n", iCur);. 
fa50: 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65     iCur = sqlite
fa60: 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41  3_stmt_status(pA
fa70: 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54  rg->pStmt, SQLIT
fa80: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 56 4d 5f  E_STMTSTATUS_VM_
fa90: 53 54 45 50 2c 20 62 52 65 73 65 74 29 3b 0a 20  STEP, bReset);. 
faa0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
fab0: 72 67 2d 3e 6f 75 74 2c 20 22 56 69 72 74 75 61  rg->out, "Virtua
fac0: 6c 20 4d 61 63 68 69 6e 65 20 53 74 65 70 73 3a  l Machine Steps:
fad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
fae0: 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 7d  d\n", iCur);.  }
faf0: 0a 0a 23 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78  ..#ifdef __linux
fb00: 5f 5f 0a 20 20 64 69 73 70 6c 61 79 4c 69 6e 75  __.  displayLinu
fb10: 78 49 6f 53 74 61 74 73 28 70 41 72 67 2d 3e 6f  xIoStats(pArg->o
fb20: 75 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f  ut);.#endif..  /
fb30: 2a 20 44 6f 20 6e 6f 74 20 72 65 6d 6f 76 65 20  * Do not remove 
fb40: 74 68 69 73 20 6d 61 63 68 69 6e 65 20 72 65 61  this machine rea
fb50: 64 61 62 6c 65 20 63 6f 6d 6d 65 6e 74 3a 20 65  dable comment: e
fb60: 78 74 72 61 2d 73 74 61 74 73 2d 6f 75 74 70 75  xtra-stats-outpu
fb70: 74 2d 68 65 72 65 20 2a 2f 0a 0a 20 20 72 65 74  t-here */..  ret
fb80: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
fb90: 44 69 73 70 6c 61 79 20 73 63 61 6e 20 73 74 61  Display scan sta
fba0: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
fbb0: 69 64 20 64 69 73 70 6c 61 79 5f 73 63 61 6e 73  id display_scans
fbc0: 74 61 74 73 28 0a 20 20 73 71 6c 69 74 65 33 20  tats(.  sqlite3 
fbd0: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
fbe0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
fbf0: 61 73 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a  ase to query */.
fc00: 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41    ShellState *pA
fc10: 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
fc20: 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20    /* Pointer to 
fc30: 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 29 7b  ShellState */.){
fc40: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
fc50: 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e  ENABLE_STMT_SCAN
fc60: 53 54 41 54 55 53 0a 20 20 55 4e 55 53 45 44 5f  STATUS.  UNUSED_
fc70: 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20  PARAMETER(db);. 
fc80: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
fc90: 52 28 70 41 72 67 29 3b 0a 23 65 6c 73 65 0a 20  R(pArg);.#else. 
fca0: 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 2c 20 6d 78   int i, k, n, mx
fcb0: 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70  ;.  raw_printf(p
fcc0: 41 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d  Arg->out, "-----
fcd0: 2d 2d 2d 20 73 63 61 6e 73 74 61 74 73 20 2d 2d  --- scanstats --
fce0: 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 6d 78  ------\n");.  mx
fcf0: 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6b 3d 30 3b   = 0;.  for(k=0;
fd00: 20 6b 3c 3d 6d 78 3b 20 6b 2b 2b 29 7b 0a 20 20   k<=mx; k++){.  
fd10: 20 20 64 6f 75 62 6c 65 20 72 45 73 74 4c 6f 6f    double rEstLoo
fd20: 70 20 3d 20 31 2e 30 3b 0a 20 20 20 20 66 6f 72  p = 1.0;.    for
fd30: 28 69 3d 6e 3d 30 3b 20 31 3b 20 69 2b 2b 29 7b  (i=n=0; 1; i++){
fd40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
fd50: 74 6d 74 20 2a 70 20 3d 20 70 41 72 67 2d 3e 70  tmt *p = pArg->p
fd60: 53 74 6d 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  Stmt;.      sqli
fd70: 74 65 33 5f 69 6e 74 36 34 20 6e 4c 6f 6f 70 2c  te3_int64 nLoop,
fd80: 20 6e 56 69 73 69 74 3b 0a 20 20 20 20 20 20 64   nVisit;.      d
fd90: 6f 75 62 6c 65 20 72 45 73 74 3b 0a 20 20 20 20  ouble rEst;.    
fda0: 20 20 69 6e 74 20 69 53 69 64 3b 0a 20 20 20 20    int iSid;.    
fdb0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
fdc0: 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 69 66  xplain;.      if
fdd0: 28 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  ( sqlite3_stmt_s
fde0: 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20  canstatus(p, i, 
fdf0: 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f  SQLITE_SCANSTAT_
fe00: 4e 4c 4f 4f 50 2c 20 28 76 6f 69 64 2a 29 26 6e  NLOOP, (void*)&n
fe10: 4c 6f 6f 70 29 20 29 7b 0a 20 20 20 20 20 20 20  Loop) ){.       
fe20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
fe30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
fe40: 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 70 2c  mt_scanstatus(p,
fe50: 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53   i, SQLITE_SCANS
fe60: 54 41 54 5f 53 45 4c 45 43 54 49 44 2c 20 28 76  TAT_SELECTID, (v
fe70: 6f 69 64 2a 29 26 69 53 69 64 29 3b 0a 20 20 20  oid*)&iSid);.   
fe80: 20 20 20 69 66 28 20 69 53 69 64 3e 6d 78 20 29     if( iSid>mx )
fe90: 20 6d 78 20 3d 20 69 53 69 64 3b 0a 20 20 20 20   mx = iSid;.    
fea0: 20 20 69 66 28 20 69 53 69 64 21 3d 6b 20 29 20    if( iSid!=k ) 
feb0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
fec0: 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20  if( n==0 ){.    
fed0: 20 20 20 20 72 45 73 74 4c 6f 6f 70 20 3d 20 28      rEstLoop = (
fee0: 64 6f 75 62 6c 65 29 6e 4c 6f 6f 70 3b 0a 20 20  double)nLoop;.  
fef0: 20 20 20 20 20 20 69 66 28 20 6b 3e 30 20 29 20        if( k>0 ) 
ff00: 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
ff10: 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20  >out, "-------- 
ff20: 73 75 62 71 75 65 72 79 20 25 64 20 2d 2d 2d 2d  subquery %d ----
ff30: 2d 2d 2d 5c 6e 22 2c 20 6b 29 3b 0a 20 20 20 20  ---\n", k);.    
ff40: 20 20 7d 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20    }.      n++;. 
ff50: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
ff60: 74 5f 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20  t_scanstatus(p, 
ff70: 69 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54  i, SQLITE_SCANST
ff80: 41 54 5f 4e 56 49 53 49 54 2c 20 28 76 6f 69 64  AT_NVISIT, (void
ff90: 2a 29 26 6e 56 69 73 69 74 29 3b 0a 20 20 20 20  *)&nVisit);.    
ffa0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73    sqlite3_stmt_s
ffb0: 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20  canstatus(p, i, 
ffc0: 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f  SQLITE_SCANSTAT_
ffd0: 45 53 54 2c 20 28 76 6f 69 64 2a 29 26 72 45 73  EST, (void*)&rEs
ffe0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
fff0: 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75  3_stmt_scanstatu
10000 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53  s(p, i, SQLITE_S
10010 43 41 4e 53 54 41 54 5f 45 58 50 4c 41 49 4e 2c  CANSTAT_EXPLAIN,
10020 20 28 76 6f 69 64 2a 29 26 7a 45 78 70 6c 61 69   (void*)&zExplai
10030 6e 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  n);.      utf8_p
10040 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
10050 20 22 4c 6f 6f 70 20 25 32 64 3a 20 25 73 5c 6e   "Loop %2d: %s\n
10060 22 2c 20 6e 2c 20 7a 45 78 70 6c 61 69 6e 29 3b  ", n, zExplain);
10070 0a 20 20 20 20 20 20 72 45 73 74 4c 6f 6f 70 20  .      rEstLoop 
10080 2a 3d 20 72 45 73 74 3b 0a 20 20 20 20 20 20 72  *= rEst;.      r
10090 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
100a0 6f 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 22  out,.          "
100b0 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f 70 3d 25           nLoop=%
100c0 2d 38 6c 6c 64 20 6e 52 6f 77 3d 25 2d 38 6c 6c  -8lld nRow=%-8ll
100d0 64 20 65 73 74 52 6f 77 3d 25 2d 38 6c 6c 64 20  d estRow=%-8lld 
100e0 65 73 74 52 6f 77 2f 4c 6f 6f 70 3d 25 2d 38 67  estRow/Loop=%-8g
100f0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6e  \n",.          n
10100 4c 6f 6f 70 2c 20 6e 56 69 73 69 74 2c 20 28 73  Loop, nVisit, (s
10110 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 72 45  qlite3_int64)(rE
10120 73 74 4c 6f 6f 70 2b 30 2e 35 29 2c 20 72 45 73  stLoop+0.5), rEs
10130 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  t.      );.    }
10140 0a 20 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74  .  }.  raw_print
10150 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d  f(pArg->out, "--
10160 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10170 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 23  ---------\n");.#
10180 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  endif.}../*.** P
10190 61 72 61 6d 65 74 65 72 20 61 7a 41 72 72 61 79  arameter azArray
101a0 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 7a 65 72   points to a zer
101b0 6f 2d 74 65 72 6d 69 6e 61 74 65 64 20 61 72 72  o-terminated arr
101c0 61 79 20 6f 66 20 73 74 72 69 6e 67 73 2e 20 7a  ay of strings. z
101d0 53 74 72 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f  Str.** points to
101e0 20 61 20 73 69 6e 67 6c 65 20 6e 75 6c 2d 74 65   a single nul-te
101f0 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e  rminated string.
10200 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   Return non-zero
10210 20 69 66 20 7a 53 74 72 0a 2a 2a 20 69 73 20 65   if zStr.** is e
10220 71 75 61 6c 2c 20 61 63 63 6f 72 64 69 6e 67 20  qual, according 
10230 74 6f 20 73 74 72 63 6d 70 28 29 2c 20 74 6f 20  to strcmp(), to 
10240 61 6e 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e  any of the strin
10250 67 73 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e  gs in the array.
10260 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72  .** Otherwise, r
10270 65 74 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73  eturn zero..*/.s
10280 74 61 74 69 63 20 69 6e 74 20 73 74 72 5f 69 6e  tatic int str_in
10290 5f 61 72 72 61 79 28 63 6f 6e 73 74 20 63 68 61  _array(const cha
102a0 72 20 2a 7a 53 74 72 2c 20 63 6f 6e 73 74 20 63  r *zStr, const c
102b0 68 61 72 20 2a 2a 61 7a 41 72 72 61 79 29 7b 0a  har **azArray){.
102c0 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
102d0 3d 30 3b 20 61 7a 41 72 72 61 79 5b 69 5d 3b 20  =0; azArray[i]; 
102e0 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 30 3d  i++){.    if( 0=
102f0 3d 73 74 72 63 6d 70 28 7a 53 74 72 2c 20 61 7a  =strcmp(zStr, az
10300 41 72 72 61 79 5b 69 5d 29 20 29 20 72 65 74 75  Array[i]) ) retu
10310 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 1;.  }.  retu
10320 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 0;.}../*.** I
10330 66 20 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65  f compiled state
10340 6d 65 6e 74 20 70 53 71 6c 20 61 70 70 65 61 72  ment pSql appear
10350 73 20 74 6f 20 62 65 20 61 6e 20 45 58 50 4c 41  s to be an EXPLA
10360 49 4e 20 73 74 61 74 65 6d 65 6e 74 2c 20 61 6c  IN statement, al
10370 6c 6f 63 61 74 65 0a 2a 2a 20 61 6e 64 20 70 6f  locate.** and po
10380 70 75 6c 61 74 65 20 74 68 65 20 53 68 65 6c 6c  pulate the Shell
10390 53 74 61 74 65 2e 61 69 49 6e 64 65 6e 74 5b 5d  State.aiIndent[]
103a0 20 61 72 72 61 79 20 77 69 74 68 20 74 68 65 20   array with the 
103b0 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 73 70 61  number of.** spa
103c0 63 65 73 20 65 61 63 68 20 6f 70 63 6f 64 65 20  ces each opcode 
103d0 73 68 6f 75 6c 64 20 62 65 20 69 6e 64 65 6e 74  should be indent
103e0 65 64 20 62 65 66 6f 72 65 20 69 74 20 69 73 20  ed before it is 
103f0 6f 75 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 54 68  output..**.** Th
10400 65 20 69 6e 64 65 6e 74 69 6e 67 20 72 75 6c 65  e indenting rule
10410 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  s are:.**.**    
10420 20 2a 20 46 6f 72 20 65 61 63 68 20 22 4e 65 78   * For each "Nex
10430 74 22 2c 20 22 50 72 65 76 22 2c 20 22 56 4e 65  t", "Prev", "VNe
10440 78 74 22 20 6f 72 20 22 56 50 72 65 76 22 20 69  xt" or "VPrev" i
10450 6e 73 74 72 75 63 74 69 6f 6e 2c 20 69 6e 64 65  nstruction, inde
10460 6e 74 0a 2a 2a 20 20 20 20 20 20 20 61 6c 6c 20  nt.**       all 
10470 6f 70 63 6f 64 65 73 20 74 68 61 74 20 6f 63 63  opcodes that occ
10480 75 72 20 62 65 74 77 65 65 6e 20 74 68 65 20 70  ur between the p
10490 32 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  2 jump destinati
104a0 6f 6e 20 61 6e 64 20 74 68 65 20 6f 70 63 6f 64  on and the opcod
104b0 65 0a 2a 2a 20 20 20 20 20 20 20 69 74 73 65 6c  e.**       itsel
104c0 66 20 62 79 20 32 20 73 70 61 63 65 73 2e 0a 2a  f by 2 spaces..*
104d0 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 6f 72 20 65  *.**     * For e
104e0 61 63 68 20 22 47 6f 74 6f 22 2c 20 69 66 20 74  ach "Goto", if t
104f0 68 65 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74  he jump destinat
10500 69 6f 6e 20 69 73 20 65 61 72 6c 69 65 72 20 69  ion is earlier i
10510 6e 20 74 68 65 20 70 72 6f 67 72 61 6d 0a 2a 2a  n the program.**
10520 20 20 20 20 20 20 20 61 6e 64 20 65 6e 64 73 20         and ends 
10530 6f 6e 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 20 20 20  on one of:.**   
10540 20 20 20 20 20 20 20 59 69 65 6c 64 20 20 53 65         Yield  Se
10550 65 6b 47 74 20 20 53 65 65 6b 4c 74 20 20 52 6f  ekGt  SeekLt  Ro
10560 77 53 65 74 52 65 61 64 20 20 52 65 77 69 6e 64  wSetRead  Rewind
10570 0a 2a 2a 20 20 20 20 20 20 20 6f 72 20 69 66 20  .**       or if 
10580 74 68 65 20 50 31 20 70 61 72 61 6d 65 74 65 72  the P1 parameter
10590 20 69 73 20 6f 6e 65 20 69 6e 73 74 65 61 64 20   is one instead 
105a0 6f 66 20 7a 65 72 6f 2c 0a 2a 2a 20 20 20 20 20  of zero,.**     
105b0 20 20 74 68 65 6e 20 69 6e 64 65 6e 74 20 61 6c    then indent al
105c0 6c 20 6f 70 63 6f 64 65 73 20 62 65 74 77 65 65  l opcodes betwee
105d0 6e 20 74 68 65 20 65 61 72 6c 69 65 72 20 69 6e  n the earlier in
105e0 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 20 20 20  struction.**    
105f0 20 20 20 61 6e 64 20 22 47 6f 74 6f 22 20 62 79     and "Goto" by
10600 20 32 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74   2 spaces..*/.st
10610 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
10620 6e 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28 53  n_data_prepare(S
10630 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 73 71  hellState *p, sq
10640 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c  lite3_stmt *pSql
10650 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
10660 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20  *zSql;          
10670 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74       /* The text
10680 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74 61 74   of the SQL stat
10690 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ement */.  const
106a0 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20   char *z;       
106b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73             /* Us
106c0 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74  ed to check if t
106d0 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49  his is an EXPLAI
106e0 4e 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 62 59 69  N */.  int *abYi
106f0 65 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20  eld = 0;        
10700 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
10710 66 20 6f 70 20 69 73 20 61 6e 20 4f 50 5f 59 69  f op is an OP_Yi
10720 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c  eld */.  int nAl
10730 6c 6f 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20  loc = 0;        
10740 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f           /* Allo
10750 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20 70 2d  cated size of p-
10760 3e 61 69 49 6e 64 65 6e 74 5b 5d 2c 20 61 62 59  >aiIndent[], abY
10770 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4f  ield */.  int iO
10780 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p;              
10790 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64            /* Ind
107a0 65 78 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 20  ex of operation 
107b0 69 6e 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 5d  in p->aiIndent[]
107c0 20 2a 2f 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61   */..  const cha
107d0 72 20 2a 61 7a 4e 65 78 74 5b 5d 20 3d 20 7b 20  r *azNext[] = { 
107e0 22 4e 65 78 74 22 2c 20 22 50 72 65 76 22 2c 20  "Next", "Prev", 
107f0 22 56 50 72 65 76 22 2c 20 22 56 4e 65 78 74 22  "VPrev", "VNext"
10800 2c 20 22 53 6f 72 74 65 72 4e 65 78 74 22 2c 0a  , "SorterNext",.
10810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10820 20 20 20 20 20 20 20 20 20 20 20 22 4e 65 78 74             "Next
10830 49 66 4f 70 65 6e 22 2c 20 22 50 72 65 76 49 66  IfOpen", "PrevIf
10840 4f 70 65 6e 22 2c 20 30 20 7d 3b 0a 20 20 63 6f  Open", 0 };.  co
10850 6e 73 74 20 63 68 61 72 20 2a 61 7a 59 69 65 6c  nst char *azYiel
10860 64 5b 5d 20 3d 20 7b 20 22 59 69 65 6c 64 22 2c  d[] = { "Yield",
10870 20 22 53 65 65 6b 4c 54 22 2c 20 22 53 65 65 6b   "SeekLT", "Seek
10880 47 54 22 2c 20 22 52 6f 77 53 65 74 52 65 61 64  GT", "RowSetRead
10890 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
108a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
108b0 52 65 77 69 6e 64 22 2c 20 30 20 7d 3b 0a 20 20  Rewind", 0 };.  
108c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 47 6f  const char *azGo
108d0 74 6f 5b 5d 20 3d 20 7b 20 22 47 6f 74 6f 22 2c  to[] = { "Goto",
108e0 20 30 20 7d 3b 0a 0a 20 20 2f 2a 20 54 72 79 20   0 };..  /* Try 
108f0 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20 69 66  to figure out if
10900 20 74 68 69 73 20 69 73 20 72 65 61 6c 6c 79 20   this is really 
10910 61 6e 20 45 58 50 4c 41 49 4e 20 73 74 61 74 65  an EXPLAIN state
10920 6d 65 6e 74 2e 20 49 66 20 74 68 69 73 0a 20 20  ment. If this.  
10930 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 76 65 72  ** cannot be ver
10940 69 66 69 65 64 2c 20 72 65 74 75 72 6e 20 65 61  ified, return ea
10950 72 6c 79 2e 20 20 2a 2f 0a 20 20 69 66 28 20 73  rly.  */.  if( s
10960 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
10970 75 6e 74 28 70 53 71 6c 29 21 3d 38 20 29 7b 0a  unt(pSql)!=8 ){.
10980 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70      p->cMode = p
10990 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 72 65 74 75  ->mode;.    retu
109a0 72 6e 3b 0a 20 20 7d 0a 20 20 7a 53 71 6c 20 3d  rn;.  }.  zSql =
109b0 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 71   sqlite3_sql(pSq
109c0 6c 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d  l);.  if( zSql==
109d0 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f  0 ) return;.  fo
109e0 72 28 7a 3d 7a 53 71 6c 3b 20 2a 7a 3d 3d 27 20  r(z=zSql; *z==' 
109f0 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 74 27 20 7c 7c  ' || *z=='\t' ||
10a00 20 2a 7a 3d 3d 27 5c 6e 27 20 7c 7c 20 2a 7a 3d   *z=='\n' || *z=
10a10 3d 27 5c 66 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 72  ='\f' || *z=='\r
10a20 27 3b 20 7a 2b 2b 29 3b 0a 20 20 69 66 28 20 73  '; z++);.  if( s
10a30 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
10a40 7a 2c 20 22 65 78 70 6c 61 69 6e 22 2c 20 37 29  z, "explain", 7)
10a50 20 29 7b 0a 20 20 20 20 70 2d 3e 63 4d 6f 64 65   ){.    p->cMode
10a60 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20   = p->mode;.    
10a70 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66  return;.  }..  f
10a80 6f 72 28 69 4f 70 3d 30 3b 20 53 51 4c 49 54 45  or(iOp=0; SQLITE
10a90 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74  _ROW==sqlite3_st
10aa0 65 70 28 70 53 71 6c 29 3b 20 69 4f 70 2b 2b 29  ep(pSql); iOp++)
10ab0 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  {.    int i;.   
10ac0 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c   int iAddr = sql
10ad0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
10ae0 70 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20 63 6f  pSql, 0);.    co
10af0 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20  nst char *zOp = 
10b00 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
10b10 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
10b20 28 70 53 71 6c 2c 20 31 29 3b 0a 0a 20 20 20 20  (pSql, 1);..    
10b30 2f 2a 20 53 65 74 20 70 32 20 74 6f 20 74 68 65  /* Set p2 to the
10b40 20 50 32 20 66 69 65 6c 64 20 6f 66 20 74 68 65   P2 field of the
10b50 20 63 75 72 72 65 6e 74 20 6f 70 63 6f 64 65 2e   current opcode.
10b60 20 54 68 65 6e 2c 20 61 73 73 75 6d 69 6e 67 20   Then, assuming 
10b70 74 68 61 74 0a 20 20 20 20 2a 2a 20 70 32 20 69  that.    ** p2 i
10b80 73 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  s an instruction
10b90 20 61 64 64 72 65 73 73 2c 20 73 65 74 20 76 61   address, set va
10ba0 72 69 61 62 6c 65 20 70 32 6f 70 20 74 6f 20 74  riable p2op to t
10bb0 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74  he index of that
10bc0 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74  .    ** instruct
10bd0 69 6f 6e 20 69 6e 20 74 68 65 20 61 69 49 6e 64  ion in the aiInd
10be0 65 6e 74 5b 5d 20 61 72 72 61 79 2e 20 70 32 20  ent[] array. p2 
10bf0 61 6e 64 20 70 32 6f 70 20 6d 61 79 20 62 65 20  and p2op may be 
10c00 64 69 66 66 65 72 65 6e 74 20 69 66 0a 20 20 20  different if.   
10c10 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20   ** the current 
10c20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 70  instruction is p
10c30 61 72 74 20 6f 66 20 61 20 73 75 62 2d 70 72 6f  art of a sub-pro
10c40 67 72 61 6d 20 67 65 6e 65 72 61 74 65 64 20 62  gram generated b
10c50 79 20 61 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 20  y an.    ** SQL 
10c60 74 72 69 67 67 65 72 20 6f 72 20 66 6f 72 65 69  trigger or forei
10c70 67 6e 20 6b 65 79 2e 20 20 2a 2f 0a 20 20 20 20  gn key.  */.    
10c80 69 6e 74 20 70 32 20 3d 20 73 71 6c 69 74 65 33  int p2 = sqlite3
10c90 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c  _column_int(pSql
10ca0 2c 20 33 29 3b 0a 20 20 20 20 69 6e 74 20 70 32  , 3);.    int p2
10cb0 6f 70 20 3d 20 28 70 32 20 2b 20 28 69 4f 70 2d  op = (p2 + (iOp-
10cc0 69 41 64 64 72 29 29 3b 0a 0a 20 20 20 20 2f 2a  iAddr));..    /*
10cd0 20 47 72 6f 77 20 74 68 65 20 70 2d 3e 61 69 49   Grow the p->aiI
10ce0 6e 64 65 6e 74 20 61 72 72 61 79 20 61 73 20 72  ndent array as r
10cf0 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 69  equired */.    i
10d00 66 28 20 69 4f 70 3e 3d 6e 41 6c 6c 6f 63 20 29  f( iOp>=nAlloc )
10d10 7b 0a 20 20 20 20 20 20 69 66 28 20 69 4f 70 3d  {.      if( iOp=
10d20 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
10d30 20 44 6f 20 66 75 72 74 68 65 72 20 76 65 72 66   Do further verf
10d40 69 63 61 74 69 6f 6e 20 74 68 61 74 20 74 68 69  ication that thi
10d50 73 20 69 73 20 65 78 70 6c 61 69 6e 20 6f 75 74  s is explain out
10d60 70 75 74 2e 20 20 41 62 6f 72 74 20 69 66 0a 20  put.  Abort if. 
10d70 20 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20         ** it is 
10d80 6e 6f 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  not */.        s
10d90 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72  tatic const char
10da0 20 2a 65 78 70 6c 61 69 6e 43 6f 6c 73 5b 5d 20   *explainCols[] 
10db0 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 22  = {.           "
10dc0 61 64 64 72 22 2c 20 22 6f 70 63 6f 64 65 22 2c  addr", "opcode",
10dd0 20 22 70 31 22 2c 20 22 70 32 22 2c 20 22 70 33   "p1", "p2", "p3
10de0 22 2c 20 22 70 34 22 2c 20 22 70 35 22 2c 20 22  ", "p4", "p5", "
10df0 63 6f 6d 6d 65 6e 74 22 20 7d 3b 0a 20 20 20 20  comment" };.    
10e00 20 20 20 20 69 6e 74 20 6a 6a 3b 0a 20 20 20 20      int jj;.    
10e10 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a      for(jj=0; jj
10e20 3c 41 72 72 61 79 53 69 7a 65 28 65 78 70 6c 61  <ArraySize(expla
10e30 69 6e 43 6f 6c 73 29 3b 20 6a 6a 2b 2b 29 7b 0a  inCols); jj++){.
10e40 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 74            if( st
10e50 72 63 6d 70 28 73 71 6c 69 74 65 33 5f 63 6f 6c  rcmp(sqlite3_col
10e60 75 6d 6e 5f 6e 61 6d 65 28 70 53 71 6c 2c 6a 6a  umn_name(pSql,jj
10e70 29 2c 65 78 70 6c 61 69 6e 43 6f 6c 73 5b 6a 6a  ),explainCols[jj
10e80 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ])!=0 ){.       
10e90 20 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20       p->cMode = 
10ea0 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20  p->mode;.       
10eb0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73       sqlite3_res
10ec0 65 74 28 70 53 71 6c 29 3b 0a 20 20 20 20 20 20  et(pSql);.      
10ed0 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
10ee0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10ef0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
10f00 20 20 6e 41 6c 6c 6f 63 20 2b 3d 20 31 30 30 3b    nAlloc += 100;
10f10 0a 20 20 20 20 20 20 70 2d 3e 61 69 49 6e 64 65  .      p->aiInde
10f20 6e 74 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74  nt = (int*)sqlit
10f30 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e  e3_realloc64(p->
10f40 61 69 49 6e 64 65 6e 74 2c 20 6e 41 6c 6c 6f 63  aiIndent, nAlloc
10f50 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20  *sizeof(int));. 
10f60 20 20 20 20 20 61 62 59 69 65 6c 64 20 3d 20 28       abYield = (
10f70 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72 65 61  int*)sqlite3_rea
10f80 6c 6c 6f 63 36 34 28 61 62 59 69 65 6c 64 2c 20  lloc64(abYield, 
10f90 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 69 6e  nAlloc*sizeof(in
10fa0 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  t));.    }.    a
10fb0 62 59 69 65 6c 64 5b 69 4f 70 5d 20 3d 20 73 74  bYield[iOp] = st
10fc0 72 5f 69 6e 5f 61 72 72 61 79 28 7a 4f 70 2c 20  r_in_array(zOp, 
10fd0 61 7a 59 69 65 6c 64 29 3b 0a 20 20 20 20 70 2d  azYield);.    p-
10fe0 3e 61 69 49 6e 64 65 6e 74 5b 69 4f 70 5d 20 3d  >aiIndent[iOp] =
10ff0 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 49 6e 64 65   0;.    p->nInde
11000 6e 74 20 3d 20 69 4f 70 2b 31 3b 0a 0a 20 20 20  nt = iOp+1;..   
11010 20 69 66 28 20 73 74 72 5f 69 6e 5f 61 72 72 61   if( str_in_arra
11020 79 28 7a 4f 70 2c 20 61 7a 4e 65 78 74 29 20 29  y(zOp, azNext) )
11030 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 32  {.      for(i=p2
11040 6f 70 3b 20 69 3c 69 4f 70 3b 20 69 2b 2b 29 20  op; i<iOp; i++) 
11050 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 5d 20 2b  p->aiIndent[i] +
11060 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 2;.    }.    i
11070 66 28 20 73 74 72 5f 69 6e 5f 61 72 72 61 79 28  f( str_in_array(
11080 7a 4f 70 2c 20 61 7a 47 6f 74 6f 29 20 26 26 20  zOp, azGoto) && 
11090 70 32 6f 70 3c 70 2d 3e 6e 49 6e 64 65 6e 74 0a  p2op<p->nIndent.
110a0 20 20 20 20 20 26 26 20 28 61 62 59 69 65 6c 64       && (abYield
110b0 5b 70 32 6f 70 5d 20 7c 7c 20 73 71 6c 69 74 65  [p2op] || sqlite
110c0 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71  3_column_int(pSq
110d0 6c 2c 20 32 29 29 0a 20 20 20 20 29 7b 0a 20 20  l, 2)).    ){.  
110e0 20 20 20 20 66 6f 72 28 69 3d 70 32 6f 70 3b 20      for(i=p2op; 
110f0 69 3c 69 4f 70 3b 20 69 2b 2b 29 20 70 2d 3e 61  i<iOp; i++) p->a
11100 69 49 6e 64 65 6e 74 5b 69 5d 20 2b 3d 20 32 3b  iIndent[i] += 2;
11110 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d  .    }.  }..  p-
11120 3e 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20  >iIndent = 0;.  
11130 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 62 59  sqlite3_free(abY
11140 69 65 6c 64 29 3b 0a 20 20 73 71 6c 69 74 65 33  ield);.  sqlite3
11150 5f 72 65 73 65 74 28 70 53 71 6c 29 3b 0a 7d 0a  _reset(pSql);.}.
11160 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20  ./*.** Free the 
11170 61 72 72 61 79 20 61 6c 6c 6f 63 61 74 65 64 20  array allocated 
11180 62 79 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f  by explain_data_
11190 70 72 65 70 61 72 65 28 29 2e 0a 2a 2f 0a 73 74  prepare()..*/.st
111a0 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69  atic void explai
111b0 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 53 68  n_data_delete(Sh
111c0 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20  ellState *p){.  
111d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e  sqlite3_free(p->
111e0 61 69 49 6e 64 65 6e 74 29 3b 0a 20 20 70 2d 3e  aiIndent);.  p->
111f0 61 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20  aiIndent = 0;.  
11200 70 2d 3e 6e 49 6e 64 65 6e 74 20 3d 20 30 3b 0a  p->nIndent = 0;.
11210 20 20 70 2d 3e 69 49 6e 64 65 6e 74 20 3d 20 30    p->iIndent = 0
11220 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62  ;.}../*.** Disab
11230 6c 65 20 61 6e 64 20 72 65 73 74 6f 72 65 20 2e  le and restore .
11240 77 68 65 72 65 74 72 61 63 65 20 61 6e 64 20 2e  wheretrace and .
11250 73 65 6c 65 63 74 74 72 61 63 65 20 73 65 74 74  selecttrace sett
11260 69 6e 67 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  ings..*/.#if def
11270 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
11280 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  G) && defined(SQ
11290 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45  LITE_ENABLE_SELE
112a0 43 54 54 52 41 43 45 29 0a 65 78 74 65 72 6e 20  CTTRACE).extern 
112b0 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63  int sqlite3Selec
112c0 74 54 72 61 63 65 3b 0a 73 74 61 74 69 63 20 69  tTrace;.static i
112d0 6e 74 20 73 61 76 65 64 53 65 6c 65 63 74 54 72  nt savedSelectTr
112e0 61 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20  ace;.#endif.#if 
112f0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44  defined(SQLITE_D
11300 45 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64  EBUG) && defined
11310 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57  (SQLITE_ENABLE_W
11320 48 45 52 45 54 52 41 43 45 29 0a 65 78 74 65 72  HERETRACE).exter
11330 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65  n int sqlite3Whe
11340 72 65 54 72 61 63 65 3b 0a 73 74 61 74 69 63 20  reTrace;.static 
11350 69 6e 74 20 73 61 76 65 64 57 68 65 72 65 54 72  int savedWhereTr
11360 61 63 65 3b 0a 23 65 6e 64 69 66 0a 73 74 61 74  ace;.#endif.stat
11370 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65 5f  ic void disable_
11380 64 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65  debug_trace_mode
11390 73 28 76 6f 69 64 29 7b 0a 23 69 66 20 64 65 66  s(void){.#if def
113a0 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
113b0 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  G) && defined(SQ
113c0 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45  LITE_ENABLE_SELE
113d0 43 54 54 52 41 43 45 29 0a 20 20 73 61 76 65 64  CTTRACE).  saved
113e0 53 65 6c 65 63 74 54 72 61 63 65 20 3d 20 73 71  SelectTrace = sq
113f0 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65  lite3SelectTrace
11400 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
11410 74 54 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64  tTrace = 0;.#end
11420 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  if.#if defined(S
11430 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20  QLITE_DEBUG) && 
11440 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
11450 4e 41 42 4c 45 5f 57 48 45 52 45 54 52 41 43 45  NABLE_WHERETRACE
11460 29 0a 20 20 73 61 76 65 64 57 68 65 72 65 54 72  ).  savedWhereTr
11470 61 63 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65  ace = sqlite3Whe
11480 72 65 54 72 61 63 65 3b 0a 20 20 73 71 6c 69 74  reTrace;.  sqlit
11490 65 33 57 68 65 72 65 54 72 61 63 65 20 3d 20 30  e3WhereTrace = 0
114a0 3b 0a 23 65 6e 64 69 66 0a 7d 0a 73 74 61 74 69  ;.#endif.}.stati
114b0 63 20 76 6f 69 64 20 72 65 73 74 6f 72 65 5f 64  c void restore_d
114c0 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73  ebug_trace_modes
114d0 28 76 6f 69 64 29 7b 0a 23 69 66 20 64 65 66 69  (void){.#if defi
114e0 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
114f0 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
11500 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43  ITE_ENABLE_SELEC
11510 54 54 52 41 43 45 29 0a 20 20 73 71 6c 69 74 65  TTRACE).  sqlite
11520 33 53 65 6c 65 63 74 54 72 61 63 65 20 3d 20 73  3SelectTrace = s
11530 61 76 65 64 53 65 6c 65 63 74 54 72 61 63 65 3b  avedSelectTrace;
11540 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69  .#endif.#if defi
11550 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
11560 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
11570 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52 45  ITE_ENABLE_WHERE
11580 54 52 41 43 45 29 0a 20 20 73 71 6c 69 74 65 33  TRACE).  sqlite3
11590 57 68 65 72 65 54 72 61 63 65 20 3d 20 73 61 76  WhereTrace = sav
115a0 65 64 57 68 65 72 65 54 72 61 63 65 3b 0a 23 65  edWhereTrace;.#e
115b0 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75  ndif.}../*.** Ru
115c0 6e 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61  n a prepared sta
115d0 74 65 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63  tement.*/.static
115e0 20 76 6f 69 64 20 65 78 65 63 5f 70 72 65 70 61   void exec_prepa
115f0 72 65 64 5f 73 74 6d 74 28 0a 20 20 53 68 65 6c  red_stmt(.  Shel
11600 6c 53 74 61 74 65 20 2a 70 41 72 67 2c 20 20 20  lState *pArg,   
11610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11620 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
11630 50 6f 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c  Pointer to Shell
11640 53 74 61 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74  State */.  sqlit
11650 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 2c 20  e3_stmt *pStmt, 
11660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11670 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
11680 74 61 74 6d 65 6e 74 20 74 6f 20 72 75 6e 20 2a  tatment to run *
11690 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62  /.  int (*xCallb
116a0 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  ack)(void*,int,c
116b0 68 61 72 2a 2a 2c 63 68 61 72 2a 2a 2c 69 6e 74  har**,char**,int
116c0 2a 29 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b  *)   /* Callback
116d0 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a   function */.){.
116e0 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20    int rc;..  /* 
116f0 70 65 72 66 6f 72 6d 20 74 68 65 20 66 69 72 73  perform the firs
11700 74 20 73 74 65 70 2e 20 20 74 68 69 73 20 77 69  t step.  this wi
11710 6c 6c 20 74 65 6c 6c 20 75 73 20 69 66 20 77 65  ll tell us if we
11720 0a 20 20 2a 2a 20 68 61 76 65 20 61 20 72 65 73  .  ** have a res
11730 75 6c 74 20 73 65 74 20 6f 72 20 6e 6f 74 20 61  ult set or not a
11740 6e 64 20 68 6f 77 20 77 69 64 65 20 69 74 20 69  nd how wide it i
11750 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73  s..  */.  rc = s
11760 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
11770 74 29 3b 0a 20 20 2f 2a 20 69 66 20 77 65 20 68  t);.  /* if we h
11780 61 76 65 20 61 20 72 65 73 75 6c 74 20 73 65 74  ave a result set
11790 2e 2e 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c  ... */.  if( SQL
117a0 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b  ITE_ROW == rc ){
117b0 0a 20 20 20 20 2f 2a 20 69 66 20 77 65 20 68 61  .    /* if we ha
117c0 76 65 20 61 20 63 61 6c 6c 62 61 63 6b 2e 2e 2e  ve a callback...
117d0 20 2a 2f 0a 20 20 20 20 69 66 28 20 78 43 61 6c   */.    if( xCal
117e0 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f  lback ){.      /
117f0 2a 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65  * allocate space
11800 20 66 6f 72 20 63 6f 6c 20 6e 61 6d 65 20 70 74   for col name pt
11810 72 2c 20 76 61 6c 75 65 20 70 74 72 2c 20 61 6e  r, value ptr, an
11820 64 20 74 79 70 65 20 2a 2f 0a 20 20 20 20 20 20  d type */.      
11830 69 6e 74 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74  int nCol = sqlit
11840 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
11850 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 76 6f  pStmt);.      vo
11860 69 64 20 2a 70 44 61 74 61 20 3d 20 73 71 6c 69  id *pData = sqli
11870 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 33 2a 6e  te3_malloc64(3*n
11880 43 6f 6c 2a 73 69 7a 65 6f 66 28 63 6f 6e 73 74  Col*sizeof(const
11890 20 63 68 61 72 2a 29 20 2b 20 31 29 3b 0a 20 20   char*) + 1);.  
118a0 20 20 20 20 69 66 28 20 21 70 44 61 74 61 20 29      if( !pData )
118b0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  {.        rc = S
118c0 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
118d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
118e0 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 73 20    char **azCols 
118f0 3d 20 28 63 68 61 72 20 2a 2a 29 70 44 61 74 61  = (char **)pData
11900 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73 20  ;      /* Names 
11910 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
11920 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61  s */.        cha
11930 72 20 2a 2a 61 7a 56 61 6c 73 20 3d 20 26 61 7a  r **azVals = &az
11940 43 6f 6c 73 5b 6e 43 6f 6c 5d 3b 20 20 20 20 20  Cols[nCol];     
11950 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 2a 2f 0a    /* Results */.
11960 20 20 20 20 20 20 20 20 69 6e 74 20 2a 61 69 54          int *aiT
11970 79 70 65 73 20 3d 20 28 69 6e 74 20 2a 29 26 61  ypes = (int *)&a
11980 7a 56 61 6c 73 5b 6e 43 6f 6c 5d 3b 20 2f 2a 20  zVals[nCol]; /* 
11990 52 65 73 75 6c 74 20 74 79 70 65 73 20 2a 2f 0a  Result types */.
119a0 20 20 20 20 20 20 20 20 69 6e 74 20 69 2c 20 78          int i, x
119b0 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
119c0 28 73 69 7a 65 6f 66 28 69 6e 74 29 20 3c 3d 20  (sizeof(int) <= 
119d0 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 29 3b  sizeof(char *));
119e0 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 61 76 65  .        /* save
119f0 20 6f 66 66 20 70 74 72 73 20 74 6f 20 63 6f 6c   off ptrs to col
11a00 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20  umn names */.   
11a10 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
11a20 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
11a30 20 20 20 20 20 20 61 7a 43 6f 6c 73 5b 69 5d 20        azCols[i] 
11a40 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65  = (char *)sqlite
11a50 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53  3_column_name(pS
11a60 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
11a70 20 7d 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20   }.        do{. 
11a80 20 20 20 20 20 20 20 20 20 2f 2a 20 65 78 74 72           /* extr
11a90 61 63 74 20 74 68 65 20 64 61 74 61 20 61 6e 64  act the data and
11aa0 20 64 61 74 61 20 74 79 70 65 73 20 2a 2f 0a 20   data types */. 
11ab0 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30           for(i=0
11ac0 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
11ad0 20 20 20 20 20 20 20 20 20 20 20 20 61 69 54 79              aiTy
11ae0 70 65 73 5b 69 5d 20 3d 20 78 20 3d 20 73 71 6c  pes[i] = x = sql
11af0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65  ite3_column_type
11b00 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20  (pStmt, i);.    
11b10 20 20 20 20 20 20 20 20 69 66 28 20 78 3d 3d 53          if( x==S
11b20 51 4c 49 54 45 5f 42 4c 4f 42 20 26 26 20 70 41  QLITE_BLOB && pA
11b30 72 67 20 26 26 20 70 41 72 67 2d 3e 63 4d 6f 64  rg && pArg->cMod
11b40 65 3d 3d 4d 4f 44 45 5f 49 6e 73 65 72 74 20 29  e==MODE_Insert )
11b50 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
11b60 61 7a 56 61 6c 73 5b 69 5d 20 3d 20 22 22 3b 0a  azVals[i] = "";.
11b70 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
11b80 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
11b90 20 61 7a 56 61 6c 73 5b 69 5d 20 3d 20 28 63 68   azVals[i] = (ch
11ba0 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
11bb0 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69  mn_text(pStmt, i
11bc0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
11bd0 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
11be0 20 21 61 7a 56 61 6c 73 5b 69 5d 20 26 26 20 28   !azVals[i] && (
11bf0 61 69 54 79 70 65 73 5b 69 5d 21 3d 53 51 4c 49  aiTypes[i]!=SQLI
11c00 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20  TE_NULL) ){.    
11c10 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53            rc = S
11c20 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20  QLITE_NOMEM;.   
11c30 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
11c40 3b 20 2f 2a 20 66 72 6f 6d 20 66 6f 72 20 2a 2f  ; /* from for */
11c50 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
11c60 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e           } /* en
11c70 64 20 66 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20  d for */..      
11c80 20 20 20 20 2f 2a 20 69 66 20 64 61 74 61 20 61      /* if data a
11c90 6e 64 20 74 79 70 65 73 20 65 78 74 72 61 63 74  nd types extract
11ca0 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e  ed successfully.
11cb0 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  .. */.          
11cc0 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 20 3d  if( SQLITE_ROW =
11cd0 3d 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  = rc ){.        
11ce0 20 20 20 20 2f 2a 20 63 61 6c 6c 20 74 68 65 20      /* call the 
11cf0 73 75 70 70 6c 69 65 64 20 63 61 6c 6c 62 61 63  supplied callbac
11d00 6b 20 77 69 74 68 20 74 68 65 20 72 65 73 75 6c  k with the resul
11d10 74 20 72 6f 77 20 64 61 74 61 20 2a 2f 0a 20 20  t row data */.  
11d20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78 43            if( xC
11d30 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20 6e 43  allback(pArg, nC
11d40 6f 6c 2c 20 61 7a 56 61 6c 73 2c 20 61 7a 43 6f  ol, azVals, azCo
11d50 6c 73 2c 20 61 69 54 79 70 65 73 29 20 29 7b 0a  ls, aiTypes) ){.
11d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63                rc
11d70 20 3d 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b   = SQLITE_ABORT;
11d80 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
11d90 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
11da0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
11db0 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  tep(pStmt);.    
11dc0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11dd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20      }.        } 
11de0 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f  while( SQLITE_RO
11df0 57 20 3d 3d 20 72 63 20 29 3b 0a 20 20 20 20 20  W == rc );.     
11e00 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
11e10 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a  pData);.      }.
11e20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11e30 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 72 63 20   do{.        rc 
11e40 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
11e50 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 7d 20 77  Stmt);.      } w
11e60 68 69 6c 65 28 20 72 63 20 3d 3d 20 53 51 4c 49  hile( rc == SQLI
11e70 54 45 5f 52 4f 57 20 29 3b 0a 20 20 20 20 7d 0a  TE_ROW );.    }.
11e80 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69    }.}../*.** Thi
11e90 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61  s function is ca
11ea0 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20  lled to process 
11eb0 53 51 4c 20 69 66 20 74 68 65 20 70 72 65 76 69  SQL if the previ
11ec0 6f 75 73 20 73 68 65 6c 6c 20 63 6f 6d 6d 61 6e  ous shell comman
11ed0 64 0a 2a 2a 20 77 61 73 20 22 2e 65 78 70 65 72  d.** was ".exper
11ee0 74 22 2e 20 49 74 20 70 61 73 73 65 73 20 74 68  t". It passes th
11ef0 65 20 53 51 4c 20 69 6e 20 74 68 65 20 73 65 63  e SQL in the sec
11f00 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 64 69 72  ond argument dir
11f10 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 74 68 65 20  ectly to.** the 
11f20 73 71 6c 69 74 65 33 65 78 70 65 72 74 20 6f 62  sqlite3expert ob
11f30 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73  ject..**.** If s
11f40 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54  uccessful, SQLIT
11f50 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
11f60 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20  . Otherwise, an 
11f70 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20  SQLite error.** 
11f80 63 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61  code. In this ca
11f90 73 65 2c 20 28 2a 70 7a 45 72 72 29 20 6d 61 79  se, (*pzErr) may
11fa0 20 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74   be set to point
11fb0 20 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e   to a buffer con
11fc0 74 61 69 6e 69 6e 67 0a 2a 2a 20 61 6e 20 45 6e  taining.** an En
11fd0 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65  glish language e
11fe0 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 49 74  rror message. It
11ff0 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69   is the responsi
12000 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a  bility of the.**
12010 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74   caller to event
12020 75 61 6c 6c 79 20 66 72 65 65 20 74 68 69 73 20  ually free this 
12030 62 75 66 66 65 72 20 75 73 69 6e 67 20 73 71 6c  buffer using sql
12040 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a  ite3_free()..*/.
12050 73 74 61 74 69 63 20 69 6e 74 20 65 78 70 65 72  static int exper
12060 74 48 61 6e 64 6c 65 53 51 4c 28 0a 20 20 53 68  tHandleSQL(.  Sh
12070 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65  ellState *pState
12080 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
12090 2a 7a 53 71 6c 2c 20 0a 20 20 63 68 61 72 20 2a  *zSql, .  char *
120a0 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 61 73 73 65  *pzErr.){.  asse
120b0 72 74 28 20 70 53 74 61 74 65 2d 3e 65 78 70 65  rt( pState->expe
120c0 72 74 2e 70 45 78 70 65 72 74 20 29 3b 0a 20 20  rt.pExpert );.  
120d0 61 73 73 65 72 74 28 20 70 7a 45 72 72 3d 3d 30  assert( pzErr==0
120e0 20 7c 7c 20 2a 70 7a 45 72 72 3d 3d 30 20 29 3b   || *pzErr==0 );
120f0 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
12100 33 5f 65 78 70 65 72 74 5f 73 71 6c 28 70 53 74  3_expert_sql(pSt
12110 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70  ate->expert.pExp
12120 65 72 74 2c 20 7a 53 71 6c 2c 20 70 7a 45 72 72  ert, zSql, pzErr
12130 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  );.}../*.** This
12140 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
12150 6c 65 64 20 65 69 74 68 65 72 20 74 6f 20 73 69  led either to si
12160 6c 65 6e 74 6c 79 20 63 6c 65 61 6e 20 75 70 20  lently clean up 
12170 74 68 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 63 72  the object.** cr
12180 65 61 74 65 64 20 62 79 20 74 68 65 20 22 2e 65  eated by the ".e
12190 78 70 65 72 74 22 20 63 6f 6d 6d 61 6e 64 20 28  xpert" command (
121a0 69 66 20 62 43 61 6e 63 65 6c 3d 3d 31 29 2c 20  if bCancel==1), 
121b0 6f 72 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61  or to generate a
121c0 20 0a 2a 2a 20 72 65 70 6f 72 74 20 66 72 6f 6d   .** report from
121d0 20 69 74 20 61 6e 64 20 74 68 65 6e 20 63 6c 65   it and then cle
121e0 61 6e 20 69 74 20 75 70 20 28 69 66 20 62 43 61  an it up (if bCa
121f0 6e 63 65 6c 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20  ncel==0)..**.** 
12200 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53  If successful, S
12210 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
12220 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
12230 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72   an SQLite error
12240 0a 2a 2a 20 63 6f 64 65 2e 20 49 6e 20 74 68 69  .** code. In thi
12250 73 20 63 61 73 65 2c 20 28 2a 70 7a 45 72 72 29  s case, (*pzErr)
12260 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 70   may be set to p
12270 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72  oint to a buffer
12280 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 61   containing.** a
12290 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61  n English langua
122a0 67 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ge error message
122b0 2e 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70  . It is the resp
122c0 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68  onsibility of th
122d0 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65  e.** caller to e
122e0 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74  ventually free t
122f0 68 69 73 20 62 75 66 66 65 72 20 75 73 69 6e 67  his buffer using
12300 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e   sqlite3_free().
12310 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
12320 78 70 65 72 74 46 69 6e 69 73 68 28 0a 20 20 53  xpertFinish(.  S
12330 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74  hellState *pStat
12340 65 2c 0a 20 20 69 6e 74 20 62 43 61 6e 63 65 6c  e,.  int bCancel
12350 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72  ,.  char **pzErr
12360 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53  .){.  int rc = S
12370 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69  QLITE_OK;.  sqli
12380 74 65 33 65 78 70 65 72 74 20 2a 70 20 3d 20 70  te3expert *p = p
12390 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45  State->expert.pE
123a0 78 70 65 72 74 3b 0a 20 20 61 73 73 65 72 74 28  xpert;.  assert(
123b0 20 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20   p );.  assert( 
123c0 62 43 61 6e 63 65 6c 20 7c 7c 20 70 7a 45 72 72  bCancel || pzErr
123d0 3d 3d 30 20 7c 7c 20 2a 70 7a 45 72 72 3d 3d 30  ==0 || *pzErr==0
123e0 20 29 3b 0a 20 20 69 66 28 20 62 43 61 6e 63 65   );.  if( bCance
123f0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 46 49 4c 45  l==0 ){.    FILE
12400 20 2a 6f 75 74 20 3d 20 70 53 74 61 74 65 2d 3e   *out = pState->
12410 6f 75 74 3b 0a 20 20 20 20 69 6e 74 20 62 56 65  out;.    int bVe
12420 72 62 6f 73 65 20 3d 20 70 53 74 61 74 65 2d 3e  rbose = pState->
12430 65 78 70 65 72 74 2e 62 56 65 72 62 6f 73 65 3b  expert.bVerbose;
12440 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ..    rc = sqlit
12450 65 33 5f 65 78 70 65 72 74 5f 61 6e 61 6c 79 7a  e3_expert_analyz
12460 65 28 70 2c 20 70 7a 45 72 72 29 3b 0a 20 20 20  e(p, pzErr);.   
12470 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
12480 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20  OK ){.      int 
12490 6e 51 75 65 72 79 20 3d 20 73 71 6c 69 74 65 33  nQuery = sqlite3
124a0 5f 65 78 70 65 72 74 5f 63 6f 75 6e 74 28 70 29  _expert_count(p)
124b0 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a  ;.      int i;..
124c0 20 20 20 20 20 20 69 66 28 20 62 56 65 72 62 6f        if( bVerbo
124d0 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  se ){.        co
124e0 6e 73 74 20 63 68 61 72 20 2a 7a 43 61 6e 64 20  nst char *zCand 
124f0 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74  = sqlite3_expert
12500 5f 72 65 70 6f 72 74 28 70 2c 30 2c 45 58 50 45  _report(p,0,EXPE
12510 52 54 5f 52 45 50 4f 52 54 5f 43 41 4e 44 49 44  RT_REPORT_CANDID
12520 41 54 45 53 29 3b 0a 20 20 20 20 20 20 20 20 72  ATES);.        r
12530 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
12540 2d 2d 20 43 61 6e 64 69 64 61 74 65 73 20 2d 2d  -- Candidates --
12550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b  -----------\n");
12570 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
12580 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  ntf(out, "%s\n",
12590 20 7a 43 61 6e 64 29 3b 0a 20 20 20 20 20 20 7d   zCand);.      }
125a0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
125b0 69 3c 6e 51 75 65 72 79 3b 20 69 2b 2b 29 7b 0a  i<nQuery; i++){.
125c0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
125d0 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74  ar *zSql = sqlit
125e0 65 33 5f 65 78 70 65 72 74 5f 72 65 70 6f 72 74  e3_expert_report
125f0 28 70 2c 20 69 2c 20 45 58 50 45 52 54 5f 52 45  (p, i, EXPERT_RE
12600 50 4f 52 54 5f 53 51 4c 29 3b 0a 20 20 20 20 20  PORT_SQL);.     
12610 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
12620 49 64 78 20 3d 20 73 71 6c 69 74 65 33 5f 65 78  Idx = sqlite3_ex
12630 70 65 72 74 5f 72 65 70 6f 72 74 28 70 2c 20 69  pert_report(p, i
12640 2c 20 45 58 50 45 52 54 5f 52 45 50 4f 52 54 5f  , EXPERT_REPORT_
12650 49 4e 44 45 58 45 53 29 3b 0a 20 20 20 20 20 20  INDEXES);.      
12660 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45    const char *zE
12670 51 50 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70  QP = sqlite3_exp
12680 65 72 74 5f 72 65 70 6f 72 74 28 70 2c 20 69 2c  ert_report(p, i,
12690 20 45 58 50 45 52 54 5f 52 45 50 4f 52 54 5f 50   EXPERT_REPORT_P
126a0 4c 41 4e 29 3b 0a 20 20 20 20 20 20 20 20 69 66  LAN);.        if
126b0 28 20 7a 49 64 78 3d 3d 30 20 29 20 7a 49 64 78  ( zIdx==0 ) zIdx
126c0 20 3d 20 22 28 6e 6f 20 6e 65 77 20 69 6e 64 65   = "(no new inde
126d0 78 65 73 29 5c 6e 22 3b 0a 20 20 20 20 20 20 20  xes)\n";.       
126e0 20 69 66 28 20 62 56 65 72 62 6f 73 65 20 29 7b   if( bVerbose ){
126f0 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
12700 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 51  rintf(out, "-- Q
12710 75 65 72 79 20 25 64 20 2d 2d 2d 2d 2d 2d 2d 2d  uery %d --------
12720 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12730 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 2c 69 2b 31 29  --------\n",i+1)
12740 3b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  ;.          raw_
12750 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c  printf(out, "%s\
12760 6e 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20  n\n", zSql);.   
12770 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
12780 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
12790 25 73 5c 6e 22 2c 20 7a 49 64 78 29 3b 0a 20 20  %s\n", zIdx);.  
127a0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
127b0 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 45  (out, "%s\n", zE
127c0 51 50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  QP);.      }.   
127d0 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33   }.  }.  sqlite3
127e0 5f 65 78 70 65 72 74 5f 64 65 73 74 72 6f 79 28  _expert_destroy(
127f0 70 29 3b 0a 20 20 70 53 74 61 74 65 2d 3e 65 78  p);.  pState->ex
12800 70 65 72 74 2e 70 45 78 70 65 72 74 20 3d 20 30  pert.pExpert = 0
12810 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ;.  return rc;.}
12820 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65  .../*.** Execute
12830 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20   a statement or 
12840 73 65 74 20 6f 66 20 73 74 61 74 65 6d 65 6e 74  set of statement
12850 73 2e 20 20 50 72 69 6e 74 0a 2a 2a 20 61 6e 79  s.  Print.** any
12860 20 72 65 73 75 6c 74 20 72 6f 77 73 2f 63 6f 6c   result rows/col
12870 75 6d 6e 73 20 64 65 70 65 6e 64 69 6e 67 20 6f  umns depending o
12880 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 6f  n the current mo
12890 64 65 0a 2a 2a 20 73 65 74 20 76 69 61 20 74 68  de.** set via th
128a0 65 20 73 75 70 70 6c 69 65 64 20 63 61 6c 6c 62  e supplied callb
128b0 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ack..**.** This 
128c0 69 73 20 76 65 72 79 20 73 69 6d 69 6c 61 72 20  is very similar 
128d0 74 6f 20 53 51 4c 69 74 65 27 73 20 62 75 69 6c  to SQLite's buil
128e0 74 2d 69 6e 20 73 71 6c 69 74 65 33 5f 65 78 65  t-in sqlite3_exe
128f0 63 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  c().** function 
12900 65 78 63 65 70 74 20 69 74 20 74 61 6b 65 73 20  except it takes 
12910 61 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65  a slightly diffe
12920 72 65 6e 74 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a  rent callback.**
12930 20 61 6e 64 20 63 61 6c 6c 62 61 63 6b 20 64 61   and callback da
12940 74 61 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a  ta argument..*/.
12950 73 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c  static int shell
12960 5f 65 78 65 63 28 0a 20 20 73 71 6c 69 74 65 33  _exec(.  sqlite3
12970 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
12980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12990 20 20 20 2f 2a 20 41 6e 20 6f 70 65 6e 20 64 61     /* An open da
129a0 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73  tabase */.  cons
129b0 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20  t char *zSql,   
129c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129d0 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 74 6f 20        /* SQL to 
129e0 62 65 20 65 76 61 6c 75 61 74 65 64 20 2a 2f 0a  be evaluated */.
129f0 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61 63    int (*xCallbac
12a00 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68 61  k)(void*,int,cha
12a10 72 2a 2a 2c 63 68 61 72 2a 2a 2c 69 6e 74 2a 29  r**,char**,int*)
12a20 2c 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20  ,   /* Callback 
12a30 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  function */.    
12a40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a60 20 20 20 20 20 20 20 20 2f 2a 20 28 6e 6f 74 20          /* (not 
12a70 74 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69  the same as sqli
12a80 74 65 33 5f 65 78 65 63 29 20 2a 2f 0a 20 20 53  te3_exec) */.  S
12a90 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 2c  hellState *pArg,
12aa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12ab0 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e           /* Poin
12ac0 74 65 72 20 74 6f 20 53 68 65 6c 6c 53 74 61 74  ter to ShellStat
12ad0 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a  e */.  char **pz
12ae0 45 72 72 4d 73 67 20 20 20 20 20 20 20 20 20 20  ErrMsg          
12af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12b00 20 2f 2a 20 45 72 72 6f 72 20 6d 73 67 20 77 72   /* Error msg wr
12b10 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b  itten here */.){
12b20 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
12b30 2a 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20 20  *pStmt = NULL;  
12b40 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20     /* Statement 
12b50 74 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20  to execute. */. 
12b60 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45   int rc = SQLITE
12b70 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20  _OK;            
12b80 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20   /* Return Code 
12b90 2a 2f 0a 20 20 69 6e 74 20 72 63 32 3b 0a 20 20  */.  int rc2;.  
12ba0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 65 66  const char *zLef
12bb0 74 6f 76 65 72 3b 20 20 20 20 20 20 20 20 20 20  tover;          
12bc0 2f 2a 20 54 61 69 6c 20 6f 66 20 75 6e 70 72 6f  /* Tail of unpro
12bd0 63 65 73 73 65 64 20 53 51 4c 20 2a 2f 0a 0a 20  cessed SQL */.. 
12be0 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20 29 7b   if( pzErrMsg ){
12bf0 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d  .    *pzErrMsg =
12c00 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 20 20 69 66   NULL;.  }..  if
12c10 28 20 70 41 72 67 2d 3e 65 78 70 65 72 74 2e 70  ( pArg->expert.p
12c20 45 78 70 65 72 74 20 29 7b 0a 20 20 20 20 72 63  Expert ){.    rc
12c30 20 3d 20 65 78 70 65 72 74 48 61 6e 64 6c 65 53   = expertHandleS
12c40 51 4c 28 70 41 72 67 2c 20 7a 53 71 6c 2c 20 70  QL(pArg, zSql, p
12c50 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 72 65  zErrMsg);.    re
12c60 74 75 72 6e 20 65 78 70 65 72 74 46 69 6e 69 73  turn expertFinis
12c70 68 28 70 41 72 67 2c 20 28 72 63 21 3d 53 51 4c  h(pArg, (rc!=SQL
12c80 49 54 45 5f 4f 4b 29 2c 20 70 7a 45 72 72 4d 73  ITE_OK), pzErrMs
12c90 67 29 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65  g);.  }..  while
12ca0 28 20 7a 53 71 6c 5b 30 5d 20 26 26 20 28 53 51  ( zSql[0] && (SQ
12cb0 4c 49 54 45 5f 4f 4b 20 3d 3d 20 72 63 29 20 29  LITE_OK == rc) )
12cc0 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e  {.    static con
12cd0 73 74 20 63 68 61 72 20 2a 7a 53 74 6d 74 53 71  st char *zStmtSq
12ce0 6c 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  l;.    rc = sqli
12cf0 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
12d00 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
12d10 74 6d 74 2c 20 26 7a 4c 65 66 74 6f 76 65 72 29  tmt, &zLeftover)
12d20 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45  ;.    if( SQLITE
12d30 5f 4f 4b 20 21 3d 20 72 63 20 29 7b 0a 20 20 20  _OK != rc ){.   
12d40 20 20 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20     if( pzErrMsg 
12d50 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72  ){.        *pzEr
12d60 72 4d 73 67 20 3d 20 73 61 76 65 5f 65 72 72 5f  rMsg = save_err_
12d70 6d 73 67 28 64 62 29 3b 0a 20 20 20 20 20 20 7d  msg(db);.      }
12d80 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
12d90 20 20 69 66 28 20 21 70 53 74 6d 74 20 29 7b 0a    if( !pStmt ){.
12da0 20 20 20 20 20 20 20 20 2f 2a 20 74 68 69 73 20          /* this 
12db0 68 61 70 70 65 6e 73 20 66 6f 72 20 61 20 63 6f  happens for a co
12dc0 6d 6d 65 6e 74 20 6f 72 20 77 68 69 74 65 2d 73  mment or white-s
12dd0 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  pace */.        
12de0 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 6f 76 65 72  zSql = zLeftover
12df0 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  ;.        while(
12e00 20 49 73 53 70 61 63 65 28 7a 53 71 6c 5b 30 5d   IsSpace(zSql[0]
12e10 29 20 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20  ) ) zSql++;.    
12e20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
12e30 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 53 74 6d      }.      zStm
12e40 74 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73  tSql = sqlite3_s
12e50 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ql(pStmt);.     
12e60 20 69 66 28 20 7a 53 74 6d 74 53 71 6c 3d 3d 30   if( zStmtSql==0
12e70 20 29 20 7a 53 74 6d 74 53 71 6c 20 3d 20 22 22   ) zStmtSql = ""
12e80 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 49  ;.      while( I
12e90 73 53 70 61 63 65 28 7a 53 74 6d 74 53 71 6c 5b  sSpace(zStmtSql[
12ea0 30 5d 29 20 29 20 7a 53 74 6d 74 53 71 6c 2b 2b  0]) ) zStmtSql++
12eb0 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 73 61 76 65  ;..      /* save
12ec0 20 6f 66 66 20 74 68 65 20 70 72 65 70 61 72 65   off the prepare
12ed0 64 20 73 74 61 74 6d 65 6e 74 20 68 61 6e 64 6c  d statment handl
12ee0 65 20 61 6e 64 20 72 65 73 65 74 20 72 6f 77 20  e and reset row 
12ef0 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69  count */.      i
12f00 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20  f( pArg ){.     
12f10 20 20 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d     pArg->pStmt =
12f20 20 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20   pStmt;.        
12f30 70 41 72 67 2d 3e 63 6e 74 20 3d 20 30 3b 0a 20  pArg->cnt = 0;. 
12f40 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
12f50 20 65 63 68 6f 20 74 68 65 20 73 71 6c 20 73 74   echo the sql st
12f60 61 74 65 6d 65 6e 74 20 69 66 20 65 63 68 6f 20  atement if echo 
12f70 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  on */.      if( 
12f80 70 41 72 67 20 26 26 20 53 68 65 6c 6c 48 61 73  pArg && ShellHas
12f90 46 6c 61 67 28 70 41 72 67 2c 20 53 48 46 4c 47  Flag(pArg, SHFLG
12fa0 5f 45 63 68 6f 29 20 29 7b 0a 20 20 20 20 20 20  _Echo) ){.      
12fb0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41    utf8_printf(pA
12fc0 72 67 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  rg->out, "%s\n",
12fd0 20 7a 53 74 6d 74 53 71 6c 20 3f 20 7a 53 74 6d   zStmtSql ? zStm
12fe0 74 53 71 6c 20 3a 20 7a 53 71 6c 29 3b 0a 20 20  tSql : zSql);.  
12ff0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
13000 53 68 6f 77 20 74 68 65 20 45 58 50 4c 41 49 4e  Show the EXPLAIN
13010 20 51 55 45 52 59 20 50 4c 41 4e 20 69 66 20 2e   QUERY PLAN if .
13020 65 71 70 20 69 73 20 6f 6e 20 2a 2f 0a 20 20 20  eqp is on */.   
13030 20 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70     if( pArg && p
13040 41 72 67 2d 3e 61 75 74 6f 45 51 50 20 26 26 20  Arg->autoEQP && 
13050 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28  sqlite3_strlike(
13060 22 45 58 50 4c 41 49 4e 25 22 2c 7a 53 74 6d 74  "EXPLAIN%",zStmt
13070 53 71 6c 2c 30 29 21 3d 30 20 29 7b 0a 20 20 20  Sql,0)!=0 ){.   
13080 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
13090 74 20 2a 70 45 78 70 6c 61 69 6e 3b 0a 20 20 20  t *pExplain;.   
130a0 20 20 20 20 20 63 68 61 72 20 2a 7a 45 51 50 3b       char *zEQP;
130b0 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74 72 69  .        int tri
130c0 67 67 65 72 45 51 50 20 3d 20 30 3b 0a 20 20 20  ggerEQP = 0;.   
130d0 20 20 20 20 20 64 69 73 61 62 6c 65 5f 64 65 62       disable_deb
130e0 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73 28 29  ug_trace_modes()
130f0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
13100 33 5f 64 62 5f 63 6f 6e 66 69 67 28 64 62 2c 20  3_db_config(db, 
13110 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f  SQLITE_DBCONFIG_
13120 54 52 49 47 47 45 52 5f 45 51 50 2c 20 2d 31 2c  TRIGGER_EQP, -1,
13130 20 26 74 72 69 67 67 65 72 45 51 50 29 3b 0a 20   &triggerEQP);. 
13140 20 20 20 20 20 20 20 69 66 28 20 70 41 72 67 2d         if( pArg-
13150 3e 61 75 74 6f 45 51 50 3e 3d 41 55 54 4f 45 51  >autoEQP>=AUTOEQ
13160 50 5f 74 72 69 67 67 65 72 20 29 7b 0a 20 20 20  P_trigger ){.   
13170 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64         sqlite3_d
13180 62 5f 63 6f 6e 66 69 67 28 64 62 2c 20 53 51 4c  b_config(db, SQL
13190 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 54 52 49  ITE_DBCONFIG_TRI
131a0 47 47 45 52 5f 45 51 50 2c 20 31 2c 20 30 29 3b  GGER_EQP, 1, 0);
131b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
131c0 20 20 20 7a 45 51 50 20 3d 20 73 71 6c 69 74 65     zEQP = sqlite
131d0 33 5f 6d 70 72 69 6e 74 66 28 22 45 58 50 4c 41  3_mprintf("EXPLA
131e0 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 25 73  IN QUERY PLAN %s
131f0 22 2c 20 7a 53 74 6d 74 53 71 6c 29 3b 0a 20 20  ", zStmtSql);.  
13200 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
13210 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
13220 2c 20 7a 45 51 50 2c 20 2d 31 2c 20 26 70 45 78  , zEQP, -1, &pEx
13230 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20  plain, 0);.     
13240 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13250 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
13260 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
13270 5f 73 74 65 70 28 70 45 78 70 6c 61 69 6e 29 3d  _step(pExplain)=
13280 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
13290 20 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70             raw_p
132a0 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
132b0 22 2d 2d 45 51 50 2d 2d 20 25 64 2c 22 2c 73 71  "--EQP-- %d,",sq
132c0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
132d0 28 70 45 78 70 6c 61 69 6e 2c 20 30 29 29 3b 0a  (pExplain, 0));.
132e0 20 20 20 20 20 20 20 20 20 20 20 20 72 61 77 5f              raw_
132f0 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
13300 2c 22 25 64 2c 22 2c 20 73 71 6c 69 74 65 33 5f  ,"%d,", sqlite3_
13310 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c  column_int(pExpl
13320 61 69 6e 2c 20 31 29 29 3b 0a 20 20 20 20 20 20  ain, 1));.      
13330 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
13340 28 70 41 72 67 2d 3e 6f 75 74 2c 22 25 64 2c 22  (pArg->out,"%d,"
13350 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
13360 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 32  _int(pExplain, 2
13370 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
13380 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72 67  utf8_printf(pArg
13390 2d 3e 6f 75 74 2c 22 25 73 5c 6e 22 2c 20 73 71  ->out,"%s\n", sq
133a0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
133b0 74 28 70 45 78 70 6c 61 69 6e 2c 20 33 29 29 3b  t(pExplain, 3));
133c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
133d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
133e0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
133f0 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20  pExplain);.     
13400 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
13410 7a 45 51 50 29 3b 0a 20 20 20 20 20 20 20 20 69  zEQP);.        i
13420 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 51 50  f( pArg->autoEQP
13430 3e 3d 41 55 54 4f 45 51 50 5f 66 75 6c 6c 20 29  >=AUTOEQP_full )
13440 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41  {.          /* A
13450 6c 73 6f 20 64 6f 20 61 6e 20 45 58 50 4c 41 49  lso do an EXPLAI
13460 4e 20 66 6f 72 20 22 2e 65 71 70 20 66 75 6c 6c  N for ".eqp full
13470 22 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20  " mode */.      
13480 20 20 20 20 7a 45 51 50 20 3d 20 73 71 6c 69 74      zEQP = sqlit
13490 65 33 5f 6d 70 72 69 6e 74 66 28 22 45 58 50 4c  e3_mprintf("EXPL
134a0 41 49 4e 20 25 73 22 2c 20 7a 53 74 6d 74 53 71  AIN %s", zStmtSq
134b0 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  l);.          rc
134c0 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
134d0 72 65 5f 76 32 28 64 62 2c 20 7a 45 51 50 2c 20  re_v2(db, zEQP, 
134e0 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20 30  -1, &pExplain, 0
134f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
13500 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc==SQLITE_OK )
13510 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 41  {.            pA
13520 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f 44 45  rg->cMode = MODE
13530 5f 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20  _Explain;.      
13540 20 20 20 20 20 20 65 78 70 6c 61 69 6e 5f 64 61        explain_da
13550 74 61 5f 70 72 65 70 61 72 65 28 70 41 72 67 2c  ta_prepare(pArg,
13560 20 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20   pExplain);.    
13570 20 20 20 20 20 20 20 20 65 78 65 63 5f 70 72 65          exec_pre
13580 70 61 72 65 64 5f 73 74 6d 74 28 70 41 72 67 2c  pared_stmt(pArg,
13590 20 70 45 78 70 6c 61 69 6e 2c 20 78 43 61 6c 6c   pExplain, xCall
135a0 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 20  back);.         
135b0 20 20 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f     explain_data_
135c0 64 65 6c 65 74 65 28 70 41 72 67 29 3b 0a 20 20  delete(pArg);.  
135d0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
135e0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
135f0 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a  lize(pExplain);.
13600 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13610 33 5f 66 72 65 65 28 7a 45 51 50 29 3b 0a 20 20  3_free(zEQP);.  
13620 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
13630 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69  sqlite3_db_confi
13640 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43  g(db, SQLITE_DBC
13650 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51  ONFIG_TRIGGER_EQ
13660 50 2c 20 74 72 69 67 67 65 72 45 51 50 2c 20 30  P, triggerEQP, 0
13670 29 3b 0a 20 20 20 20 20 20 20 20 72 65 73 74 6f  );.        resto
13680 72 65 5f 64 65 62 75 67 5f 74 72 61 63 65 5f 6d  re_debug_trace_m
13690 6f 64 65 73 28 29 3b 0a 20 20 20 20 20 20 7d 0a  odes();.      }.
136a0 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20  .      if( pArg 
136b0 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d  ){.        pArg-
136c0 3e 63 4d 6f 64 65 20 3d 20 70 41 72 67 2d 3e 6d  >cMode = pArg->m
136d0 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ode;.        if(
136e0 20 70 41 72 67 2d 3e 61 75 74 6f 45 78 70 6c 61   pArg->autoExpla
136f0 69 6e 0a 20 20 20 20 20 20 20 20 20 26 26 20 73  in.         && s
13700 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f  qlite3_column_co
13710 75 6e 74 28 70 53 74 6d 74 29 3d 3d 38 0a 20 20  unt(pStmt)==8.  
13720 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
13730 33 5f 73 74 72 6c 69 6b 65 28 22 45 58 50 4c 41  3_strlike("EXPLA
13740 49 4e 25 22 2c 20 7a 53 74 6d 74 53 71 6c 2c 30  IN%", zStmtSql,0
13750 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a  )==0.        ){.
13760 20 20 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e            pArg->
13770 63 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70  cMode = MODE_Exp
13780 6c 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lain;.        }.
13790 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74  .        /* If t
137a0 68 65 20 73 68 65 6c 6c 20 69 73 20 63 75 72 72  he shell is curr
137b0 65 6e 74 6c 79 20 69 6e 20 22 2e 65 78 70 6c 61  ently in ".expla
137c0 69 6e 22 20 6d 6f 64 65 2c 20 67 61 74 68 65 72  in" mode, gather
137d0 20 74 68 65 20 65 78 74 72 61 0a 20 20 20 20 20   the extra.     
137e0 20 20 20 2a 2a 20 64 61 74 61 20 72 65 71 75 69     ** data requi
137f0 72 65 64 20 74 6f 20 61 64 64 20 69 6e 64 65 6e  red to add inden
13800 74 73 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74  ts to the output
13810 2e 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20  .*/.        if( 
13820 70 41 72 67 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44  pArg->cMode==MOD
13830 45 5f 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20  E_Explain ){.   
13840 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 5f 64         explain_d
13850 61 74 61 5f 70 72 65 70 61 72 65 28 70 41 72 67  ata_prepare(pArg
13860 2c 20 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  , pStmt);.      
13870 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20    }.      }..   
13880 20 20 20 65 78 65 63 5f 70 72 65 70 61 72 65 64     exec_prepared
13890 5f 73 74 6d 74 28 70 41 72 67 2c 20 70 53 74 6d  _stmt(pArg, pStm
138a0 74 2c 20 78 43 61 6c 6c 62 61 63 6b 29 3b 0a 20  t, xCallback);. 
138b0 20 20 20 20 20 65 78 70 6c 61 69 6e 5f 64 61 74       explain_dat
138c0 61 5f 64 65 6c 65 74 65 28 70 41 72 67 29 3b 0a  a_delete(pArg);.
138d0 0a 20 20 20 20 20 20 2f 2a 20 70 72 69 6e 74 20  .      /* print 
138e0 75 73 61 67 65 20 73 74 61 74 73 20 69 66 20 73  usage stats if s
138f0 74 61 74 73 20 6f 6e 20 2a 2f 0a 20 20 20 20 20  tats on */.     
13900 20 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72   if( pArg && pAr
13910 67 2d 3e 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20  g->statsOn ){.  
13920 20 20 20 20 20 20 64 69 73 70 6c 61 79 5f 73 74        display_st
13930 61 74 73 28 64 62 2c 20 70 41 72 67 2c 20 30 29  ats(db, pArg, 0)
13940 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
13950 20 2f 2a 20 70 72 69 6e 74 20 6c 6f 6f 70 2d 63   /* print loop-c
13960 6f 75 6e 74 65 72 73 20 69 66 20 72 65 71 75 69  ounters if requi
13970 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  red */.      if(
13980 20 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 73   pArg && pArg->s
13990 63 61 6e 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20  canstatsOn ){.  
139a0 20 20 20 20 20 20 64 69 73 70 6c 61 79 5f 73 63        display_sc
139b0 61 6e 73 74 61 74 73 28 64 62 2c 20 70 41 72 67  anstats(db, pArg
139c0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
139d0 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68    /* Finalize th
139e0 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 75 73 74  e statement just
139f0 20 65 78 65 63 75 74 65 64 2e 20 49 66 20 74 68   executed. If th
13a00 69 73 20 66 61 69 6c 73 2c 20 73 61 76 65 20 61  is fails, save a
13a10 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f  .      ** copy o
13a20 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73  f the error mess
13a30 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  age. Otherwise, 
13a40 73 65 74 20 7a 53 71 6c 20 74 6f 20 70 6f 69 6e  set zSql to poin
13a50 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a  t to the.      *
13a60 2a 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74  * next statement
13a70 20 74 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a   to execute. */.
13a80 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69        rc2 = sqli
13a90 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
13aa0 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  mt);.      if( r
13ab0 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20  c!=SQLITE_NOMEM 
13ac0 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20  ) rc = rc2;.    
13ad0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
13ae0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  _OK ){.        z
13af0 53 71 6c 20 3d 20 7a 4c 65 66 74 6f 76 65 72 3b  Sql = zLeftover;
13b00 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
13b10 49 73 53 70 61 63 65 28 7a 53 71 6c 5b 30 5d 29  IsSpace(zSql[0])
13b20 20 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20   ) zSql++;.     
13b30 20 7d 65 6c 73 65 20 69 66 28 20 70 7a 45 72 72   }else if( pzErr
13b40 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  Msg ){.        *
13b50 70 7a 45 72 72 4d 73 67 20 3d 20 73 61 76 65 5f  pzErrMsg = save_
13b60 65 72 72 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20  err_msg(db);.   
13b70 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 63     }..      /* c
13b80 6c 65 61 72 20 73 61 76 65 64 20 73 74 6d 74 20  lear saved stmt 
13b90 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20  handle */.      
13ba0 69 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20  if( pArg ){.    
13bb0 20 20 20 20 70 41 72 67 2d 3e 70 53 74 6d 74 20      pArg->pStmt 
13bc0 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a  = NULL;.      }.
13bd0 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 65 6e 64      }.  } /* end
13be0 20 77 68 69 6c 65 20 2a 2f 0a 0a 20 20 72 65 74   while */..  ret
13bf0 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  urn rc;.}../*.**
13c00 20 52 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79 20   Release memory 
13c10 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63  previously alloc
13c20 61 74 65 64 20 62 79 20 74 61 62 6c 65 43 6f 6c  ated by tableCol
13c30 75 6d 6e 4c 69 73 74 28 29 2e 0a 2a 2f 0a 73 74  umnList()..*/.st
13c40 61 74 69 63 20 76 6f 69 64 20 66 72 65 65 43 6f  atic void freeCo
13c50 6c 75 6d 6e 4c 69 73 74 28 63 68 61 72 20 2a 2a  lumnList(char **
13c60 61 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b  azCol){.  int i;
13c70 0a 20 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f  .  for(i=1; azCo
13c80 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  l[i]; i++){.    
13c90 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 43  sqlite3_free(azC
13ca0 6f 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 2f 2a  ol[i]);.  }.  /*
13cb0 20 61 7a 43 6f 6c 5b 30 5d 20 69 73 20 61 20 73   azCol[0] is a s
13cc0 74 61 74 69 63 20 73 74 72 69 6e 67 20 2a 2f 0a  tatic string */.
13cd0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
13ce0 7a 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  zCol);.}../*.** 
13cf0 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66  Return a list of
13d00 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 74 72   pointers to str
13d10 69 6e 67 73 20 77 68 69 63 68 20 61 72 65 20 74  ings which are t
13d20 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 0a  he names of all.
13d30 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61  ** columns in ta
13d40 62 6c 65 20 7a 54 61 62 2e 20 20 20 54 68 65 20  ble zTab.   The 
13d50 6d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74  memory to hold t
13d60 68 65 20 6e 61 6d 65 73 20 69 73 20 64 79 6e 61  he names is dyna
13d70 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63  mically.** alloc
13d80 61 74 65 64 20 61 6e 64 20 6d 75 73 74 20 62 65  ated and must be
13d90 20 72 65 6c 65 61 73 65 64 20 62 79 20 74 68 65   released by the
13da0 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 61 20   caller using a 
13db0 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a  subsequent call.
13dc0 2a 2a 20 74 6f 20 66 72 65 65 43 6f 6c 75 6d 6e  ** to freeColumn
13dd0 4c 69 73 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68  List()..**.** Th
13de0 65 20 61 7a 43 6f 6c 5b 30 5d 20 65 6e 74 72 79  e azCol[0] entry
13df0 20 69 73 20 75 73 75 61 6c 6c 79 20 4e 55 4c 4c   is usually NULL
13e00 2e 20 20 48 6f 77 65 76 65 72 2c 20 69 66 20 7a  .  However, if z
13e10 54 61 62 20 63 6f 6e 74 61 69 6e 73 20 61 20 72  Tab contains a r
13e20 6f 77 69 64 0a 2a 2a 20 76 61 6c 75 65 20 74 68  owid.** value th
13e30 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  at needs to be p
13e40 72 65 73 65 72 76 65 64 2c 20 74 68 65 6e 20 61  reserved, then a
13e50 7a 43 6f 6c 5b 30 5d 20 69 73 20 66 69 6c 6c 65  zCol[0] is fille
13e60 64 20 69 6e 20 77 69 74 68 20 74 68 65 0a 2a 2a  d in with the.**
13e70 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 72 6f 77   name of the row
13e80 69 64 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a  id column..**.**
13e90 20 54 68 65 20 66 69 72 73 74 20 72 65 67 75 6c   The first regul
13ea0 61 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65  ar column in the
13eb0 20 74 61 62 6c 65 20 69 73 20 61 7a 43 6f 6c 5b   table is azCol[
13ec0 31 5d 2e 20 20 54 68 65 20 6c 69 73 74 20 69 73  1].  The list is
13ed0 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 62   terminated.** b
13ee0 79 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20  y an entry with 
13ef0 61 7a 43 6f 6c 5b 69 5d 3d 3d 30 2e 0a 2a 2f 0a  azCol[i]==0..*/.
13f00 73 74 61 74 69 63 20 63 68 61 72 20 2a 2a 74 61  static char **ta
13f10 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 53 68  bleColumnList(Sh
13f20 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e  ellState *p, con
13f30 73 74 20 63 68 61 72 20 2a 7a 54 61 62 29 7b 0a  st char *zTab){.
13f40 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 20 3d    char **azCol =
13f50 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   0;.  sqlite3_st
13f60 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 63 68 61  mt *pStmt;.  cha
13f70 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 6e  r *zSql;.  int n
13f80 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e  Col = 0;.  int n
13f90 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 69 6e 74  Alloc = 0;.  int
13fa0 20 6e 50 4b 20 3d 20 30 3b 20 20 20 20 20 20 20   nPK = 0;       
13fb0 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 52 49  /* Number of PRI
13fc0 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73  MARY KEY columns
13fd0 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69   seen */.  int i
13fe0 73 49 50 4b 20 3d 20 30 3b 20 20 20 20 20 2f 2a  sIPK = 0;     /*
13ff0 20 54 72 75 65 20 69 66 20 6f 6e 65 20 50 52 49   True if one PRI
14000 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20  MARY KEY column 
14010 6f 66 20 74 79 70 65 20 49 4e 54 45 47 45 52 20  of type INTEGER 
14020 2a 2f 0a 20 20 69 6e 74 20 70 72 65 73 65 72 76  */.  int preserv
14030 65 52 6f 77 69 64 20 3d 20 53 68 65 6c 6c 48 61  eRowid = ShellHa
14040 73 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 50  sFlag(p, SHFLG_P
14050 72 65 73 65 72 76 65 52 6f 77 69 64 29 3b 0a 20  reserveRowid);. 
14060 20 69 6e 74 20 72 63 3b 0a 0a 20 20 7a 53 71 6c   int rc;..  zSql
14070 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
14080 74 66 28 22 50 52 41 47 4d 41 20 74 61 62 6c 65  tf("PRAGMA table
14090 5f 69 6e 66 6f 3d 25 51 22 2c 20 7a 54 61 62 29  _info=%Q", zTab)
140a0 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
140b0 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
140c0 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
140d0 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  tmt, 0);.  sqlit
140e0 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
140f0 20 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e   if( rc ) return
14100 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c   0;.  while( sql
14110 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
14120 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
14130 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e 3d 6e 41      if( nCol>=nA
14140 6c 6c 6f 63 2d 32 20 29 7b 0a 20 20 20 20 20 20  lloc-2 ){.      
14150 6e 41 6c 6c 6f 63 20 3d 20 6e 41 6c 6c 6f 63 2a  nAlloc = nAlloc*
14160 32 20 2b 20 6e 43 6f 6c 20 2b 20 31 30 3b 0a 20  2 + nCol + 10;. 
14170 20 20 20 20 20 61 7a 43 6f 6c 20 3d 20 73 71 6c       azCol = sql
14180 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 61 7a 43  ite3_realloc(azC
14190 6f 6c 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f  ol, nAlloc*sizeo
141a0 66 28 61 7a 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20  f(azCol[0]));.  
141b0 20 20 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30      if( azCol==0
141c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
141d0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
141e0 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65  Error: out of me
141f0 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20  mory\n");.      
14200 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20    exit(1);.     
14210 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 7a 43   }.    }.    azC
14220 6f 6c 5b 2b 2b 6e 43 6f 6c 5d 20 3d 20 73 71 6c  ol[++nCol] = sql
14230 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
14240 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ", sqlite3_colum
14250 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29  n_text(pStmt, 1)
14260 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  );.    if( sqlit
14270 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
14280 74 6d 74 2c 20 35 29 20 29 7b 0a 20 20 20 20 20  tmt, 5) ){.     
14290 20 6e 50 4b 2b 2b 3b 0a 20 20 20 20 20 20 69 66   nPK++;.      if
142a0 28 20 6e 50 4b 3d 3d 31 0a 20 20 20 20 20 20 20  ( nPK==1.       
142b0 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  && sqlite3_stric
142c0 6d 70 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  mp((const char*)
142d0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
142e0 65 78 74 28 70 53 74 6d 74 2c 32 29 2c 0a 20 20  ext(pStmt,2),.  
142f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14300 20 20 20 20 20 20 20 20 22 49 4e 54 45 47 45 52          "INTEGER
14310 22 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20  ")==0.      ){. 
14320 20 20 20 20 20 20 20 69 73 49 50 4b 20 3d 20 31         isIPK = 1
14330 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
14340 20 20 20 20 20 20 20 69 73 49 50 4b 20 3d 20 30         isIPK = 0
14350 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
14360 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69    }.  sqlite3_fi
14370 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
14380 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 20   if( azCol==0 ) 
14390 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 7a 43 6f  return 0;.  azCo
143a0 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20 61 7a 43 6f  l[0] = 0;.  azCo
143b0 6c 5b 6e 43 6f 6c 2b 31 5d 20 3d 20 30 3b 0a 0a  l[nCol+1] = 0;..
143c0 20 20 2f 2a 20 54 68 65 20 64 65 63 69 73 69 6f    /* The decisio
143d0 6e 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20  n of whether or 
143e0 6e 6f 74 20 61 20 72 6f 77 69 64 20 72 65 61 6c  not a rowid real
143f0 6c 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70  ly needs to be p
14400 72 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 69 73  reserved.  ** is
14410 20 74 72 69 63 6b 79 2e 20 20 57 65 20 6e 65 76   tricky.  We nev
14420 65 72 20 6e 65 65 64 20 74 6f 20 70 72 65 73 65  er need to prese
14430 72 76 65 20 61 20 72 6f 77 69 64 20 66 6f 72 20  rve a rowid for 
14440 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  a WITHOUT ROWID 
14450 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 72 20 61 20  table.  ** or a 
14460 74 61 62 6c 65 20 77 69 74 68 20 61 6e 20 49 4e  table with an IN
14470 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
14480 59 2e 20 20 57 65 20 61 72 65 20 75 6e 61 62 6c  Y.  We are unabl
14490 65 20 74 6f 20 70 72 65 73 65 72 76 65 0a 20 20  e to preserve.  
144a0 2a 2a 20 72 6f 77 69 64 73 20 6f 6e 20 74 61 62  ** rowids on tab
144b0 6c 65 73 20 77 68 65 72 65 20 74 68 65 20 72 6f  les where the ro
144c0 77 69 64 20 69 73 20 69 6e 61 63 63 65 73 73 69  wid is inaccessi
144d0 62 6c 65 20 62 65 63 61 75 73 65 20 74 68 65 72  ble because ther
144e0 65 20 61 72 65 20 6f 74 68 65 72 0a 20 20 2a 2a  e are other.  **
144f0 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
14500 74 61 62 6c 65 20 6e 61 6d 65 64 20 22 72 6f 77  table named "row
14510 69 64 22 2c 20 22 5f 72 6f 77 69 64 5f 22 2c 20  id", "_rowid_", 
14520 61 6e 64 20 22 6f 69 64 22 2e 0a 20 20 2a 2f 0a  and "oid"..  */.
14530 20 20 69 66 28 20 70 72 65 73 65 72 76 65 52 6f    if( preserveRo
14540 77 69 64 20 26 26 20 69 73 49 50 4b 20 29 7b 0a  wid && isIPK ){.
14550 20 20 20 20 2f 2a 20 49 66 20 61 20 73 69 6e 67      /* If a sing
14560 6c 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  le PRIMARY KEY c
14570 6f 6c 75 6d 6e 20 77 69 74 68 20 74 79 70 65 20  olumn with type 
14580 49 4e 54 45 47 45 52 20 77 61 73 20 73 65 65 6e  INTEGER was seen
14590 2c 20 74 68 65 6e 20 69 74 0a 20 20 20 20 2a 2a  , then it.    **
145a0 20 6d 69 67 68 74 20 62 65 20 61 6e 20 61 6c 69   might be an ali
145b0 73 65 20 66 6f 72 20 74 68 65 20 52 4f 57 49 44  se for the ROWID
145c0 2e 20 20 42 75 74 20 69 74 20 6d 69 67 68 74 20  .  But it might 
145d0 61 6c 73 6f 20 62 65 20 61 20 57 49 54 48 4f 55  also be a WITHOU
145e0 54 20 52 4f 57 49 44 0a 20 20 20 20 2a 2a 20 74  T ROWID.    ** t
145f0 61 62 6c 65 20 6f 72 20 61 20 49 4e 54 45 47 45  able or a INTEGE
14600 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 44 45  R PRIMARY KEY DE
14610 53 43 20 63 6f 6c 75 6d 6e 2c 20 6e 65 69 74 68  SC column, neith
14620 65 72 20 6f 66 20 77 68 69 63 68 20 61 72 65 0a  er of which are.
14630 20 20 20 20 2a 2a 20 52 4f 57 49 44 20 61 6c 69      ** ROWID ali
14640 61 73 65 73 2e 20 20 54 6f 20 64 69 73 74 69 6e  ases.  To distin
14650 67 75 69 73 68 20 74 68 65 73 65 20 63 61 73 65  guish these case
14660 73 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20  s, check to see 
14670 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20  if.    ** there 
14680 69 73 20 61 20 22 70 6b 22 20 65 6e 74 72 79 20  is a "pk" entry 
14690 69 6e 20 22 50 52 41 47 4d 41 20 69 6e 64 65 78  in "PRAGMA index
146a0 5f 6c 69 73 74 22 2e 20 20 54 68 65 72 65 20 77  _list".  There w
146b0 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 6e 6f  ill be.    ** no
146c0 20 22 70 6b 22 20 69 6e 64 65 78 20 69 66 20 74   "pk" index if t
146d0 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 72  he PRIMARY KEY r
146e0 65 61 6c 6c 79 20 69 73 20 61 6e 20 61 6c 69 61  eally is an alia
146f0 73 20 66 6f 72 20 74 68 65 20 52 4f 57 49 44 2e  s for the ROWID.
14700 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 53 71 6c  .    */.    zSql
14710 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
14720 74 66 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f  tf("SELECT 1 FRO
14730 4d 20 70 72 61 67 6d 61 5f 69 6e 64 65 78 5f 6c  M pragma_index_l
14740 69 73 74 28 25 51 29 22 0a 20 20 20 20 20 20 20  ist(%Q)".       
14750 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14760 20 20 20 20 22 20 57 48 45 52 45 20 6f 72 69 67      " WHERE orig
14770 69 6e 3d 27 70 6b 27 22 2c 20 7a 54 61 62 29 3b  in='pk'", zTab);
14780 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
14790 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
147a0 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  db, zSql, -1, &p
147b0 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71  Stmt, 0);.    sq
147c0 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
147d0 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a  ;.    if( rc ){.
147e0 20 20 20 20 20 20 66 72 65 65 43 6f 6c 75 6d 6e        freeColumn
147f0 4c 69 73 74 28 61 7a 43 6f 6c 29 3b 0a 20 20 20  List(azCol);.   
14800 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
14810 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
14820 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b  te3_step(pStmt);
14830 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
14840 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
14850 20 20 70 72 65 73 65 72 76 65 52 6f 77 69 64 20    preserveRowid 
14860 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  = rc==SQLITE_ROW
14870 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 65 73  ;.  }.  if( pres
14880 65 72 76 65 52 6f 77 69 64 20 29 7b 0a 20 20 20  erveRowid ){.   
14890 20 2f 2a 20 4f 6e 6c 79 20 70 72 65 73 65 72 76   /* Only preserv
148a0 65 20 74 68 65 20 72 6f 77 69 64 20 69 66 20 77  e the rowid if w
148b0 65 20 63 61 6e 20 66 69 6e 64 20 61 20 6e 61 6d  e can find a nam
148c0 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65  e to use for the
148d0 0a 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 2a 2f  .    ** rowid */
148e0 0a 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72  .    static char
148f0 20 2a 61 7a 52 6f 77 69 64 5b 5d 20 3d 20 7b 20   *azRowid[] = { 
14900 22 72 6f 77 69 64 22 2c 20 22 5f 72 6f 77 69 64  "rowid", "_rowid
14910 5f 22 2c 20 22 6f 69 64 22 20 7d 3b 0a 20 20 20  _", "oid" };.   
14920 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66   int i, j;.    f
14930 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b  or(j=0; j<3; j++
14940 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31  ){.      for(i=1
14950 3b 20 69 3c 3d 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  ; i<=nCol; i++){
14960 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
14970 69 74 65 33 5f 73 74 72 69 63 6d 70 28 61 7a 52  ite3_stricmp(azR
14980 6f 77 69 64 5b 6a 5d 2c 61 7a 43 6f 6c 5b 69 5d  owid[j],azCol[i]
14990 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
149a0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
149b0 69 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  i>nCol ){.      
149c0 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69    /* At this poi
149d0 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 74 68 61 74  nt, we know that
149e0 20 61 7a 52 6f 77 69 64 5b 6a 5d 20 69 73 20 6e   azRowid[j] is n
149f0 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  ot the name of a
14a00 6e 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72  ny.        ** or
14a10 64 69 6e 61 72 79 20 63 6f 6c 75 6d 6e 20 69 6e  dinary column in
14a20 20 74 68 65 20 74 61 62 6c 65 2e 20 20 56 65 72   the table.  Ver
14a30 69 66 79 20 74 68 61 74 20 61 7a 52 6f 77 69 64  ify that azRowid
14a40 5b 6a 5d 20 69 73 20 61 20 76 61 6c 69 64 0a 20  [j] is a valid. 
14a50 20 20 20 20 20 20 20 2a 2a 20 6e 61 6d 65 20 66         ** name f
14a60 6f 72 20 74 68 65 20 72 6f 77 69 64 20 62 65 66  or the rowid bef
14a70 6f 72 65 20 61 64 64 69 6e 67 20 69 74 20 74 6f  ore adding it to
14a80 20 61 7a 43 6f 6c 5b 30 5d 2e 20 20 57 49 54 48   azCol[0].  WITH
14a90 4f 55 54 20 52 4f 57 49 44 0a 20 20 20 20 20 20  OUT ROWID.      
14aa0 20 20 2a 2a 20 74 61 62 6c 65 73 20 77 69 6c 6c    ** tables will
14ab0 20 66 61 69 6c 20 74 68 69 73 20 6c 61 73 74 20   fail this last 
14ac0 63 68 65 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20  check */.       
14ad0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61   rc = sqlite3_ta
14ae0 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64  ble_column_metad
14af0 61 74 61 28 70 2d 3e 64 62 2c 30 2c 7a 54 61 62  ata(p->db,0,zTab
14b00 2c 61 7a 52 6f 77 69 64 5b 6a 5d 2c 30 2c 30 2c  ,azRowid[j],0,0,
14b10 30 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20 20 20  0,0,0);.        
14b20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
14b30 4b 20 29 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 61  K ) azCol[0] = a
14b40 7a 52 6f 77 69 64 5b 6a 5d 3b 0a 20 20 20 20 20  zRowid[j];.     
14b50 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
14b60 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
14b70 74 75 72 6e 20 61 7a 43 6f 6c 3b 0a 7d 0a 0a 2f  turn azCol;.}../
14b80 2a 0a 2a 2a 20 54 6f 67 67 6c 65 20 74 68 65 20  *.** Toggle the 
14b90 72 65 76 65 72 73 65 5f 75 6e 6f 72 64 65 72 65  reverse_unordere
14ba0 64 5f 73 65 6c 65 63 74 73 20 73 65 74 74 69 6e  d_selects settin
14bb0 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  g..*/.static voi
14bc0 64 20 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f 72  d toggleSelectOr
14bd0 64 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62 29  der(sqlite3 *db)
14be0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
14bf0 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69   *pStmt = 0;.  i
14c00 6e 74 20 69 53 65 74 74 69 6e 67 20 3d 20 30 3b  nt iSetting = 0;
14c10 0a 20 20 63 68 61 72 20 7a 53 74 6d 74 5b 31 30  .  char zStmt[10
14c20 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70 72  0];.  sqlite3_pr
14c30 65 70 61 72 65 5f 76 32 28 64 62 2c 20 22 50 52  epare_v2(db, "PR
14c40 41 47 4d 41 20 72 65 76 65 72 73 65 5f 75 6e 6f  AGMA reverse_uno
14c50 72 64 65 72 65 64 5f 73 65 6c 65 63 74 73 22 2c  rdered_selects",
14c60 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
14c70 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
14c80 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
14c90 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 53  TE_ROW ){.    iS
14ca0 65 74 74 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  etting = sqlite3
14cb0 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d  _column_int(pStm
14cc0 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  t, 0);.  }.  sql
14cd0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
14ce0 74 6d 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  tmt);.  sqlite3_
14cf0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
14d00 7a 53 74 6d 74 29 2c 20 7a 53 74 6d 74 2c 0a 20  zStmt), zStmt,. 
14d10 20 20 20 20 20 20 22 50 52 41 47 4d 41 20 72 65        "PRAGMA re
14d20 76 65 72 73 65 5f 75 6e 6f 72 64 65 72 65 64 5f  verse_unordered_
14d30 73 65 6c 65 63 74 73 28 25 64 29 22 2c 20 21 69  selects(%d)", !i
14d40 53 65 74 74 69 6e 67 29 3b 0a 20 20 73 71 6c 69  Setting);.  sqli
14d50 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 74  te3_exec(db, zSt
14d60 6d 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a  mt, 0, 0, 0);.}.
14d70 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
14d80 20 64 69 66 66 65 72 65 6e 74 20 63 61 6c 6c 62   different callb
14d90 61 63 6b 20 72 6f 75 74 69 6e 65 20 75 73 65 64  ack routine used
14da0 20 66 6f 72 20 64 75 6d 70 69 6e 67 20 74 68 65   for dumping the
14db0 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 45 61   database..** Ea
14dc0 63 68 20 72 6f 77 20 72 65 63 65 69 76 65 64 20  ch row received 
14dd0 62 79 20 74 68 69 73 20 63 61 6c 6c 62 61 63 6b  by this callback
14de0 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 74   consists of a t
14df0 61 62 6c 65 20 6e 61 6d 65 2c 0a 2a 2a 20 74 68  able name,.** th
14e00 65 20 74 61 62 6c 65 20 74 79 70 65 20 28 22 69  e table type ("i
14e10 6e 64 65 78 22 20 6f 72 20 22 74 61 62 6c 65 22  ndex" or "table"
14e20 29 20 61 6e 64 20 53 51 4c 20 74 6f 20 63 72 65  ) and SQL to cre
14e30 61 74 65 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  ate the table..*
14e40 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73  * This routine s
14e50 68 6f 75 6c 64 20 70 72 69 6e 74 20 74 65 78 74  hould print text
14e60 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 72   sufficient to r
14e70 65 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c  ecreate the tabl
14e80 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  e..*/.static int
14e90 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 28 76   dump_callback(v
14ea0 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e  oid *pArg, int n
14eb0 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72  Arg, char **azAr
14ec0 67 2c 20 63 68 61 72 20 2a 2a 61 7a 4e 6f 74 55  g, char **azNotU
14ed0 73 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  sed){.  int rc;.
14ee0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
14ef0 61 62 6c 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68  able;.  const ch
14f00 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 63 6f 6e  ar *zType;.  con
14f10 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  st char *zSql;. 
14f20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d   ShellState *p =
14f30 20 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 29 70   (ShellState *)p
14f40 41 72 67 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50  Arg;..  UNUSED_P
14f50 41 52 41 4d 45 54 45 52 28 61 7a 4e 6f 74 55 73  ARAMETER(azNotUs
14f60 65 64 29 3b 0a 20 20 69 66 28 20 6e 41 72 67 21  ed);.  if( nArg!
14f70 3d 33 20 7c 7c 20 61 7a 41 72 67 3d 3d 30 20 29  =3 || azArg==0 )
14f80 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 54 61   return 0;.  zTa
14f90 62 6c 65 20 3d 20 61 7a 41 72 67 5b 30 5d 3b 0a  ble = azArg[0];.
14fa0 20 20 7a 54 79 70 65 20 3d 20 61 7a 41 72 67 5b    zType = azArg[
14fb0 31 5d 3b 0a 20 20 7a 53 71 6c 20 3d 20 61 7a 41  1];.  zSql = azA
14fc0 72 67 5b 32 5d 3b 0a 0a 20 20 69 66 28 20 73 74  rg[2];..  if( st
14fd0 72 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71  rcmp(zTable, "sq
14fe0 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d  lite_sequence")=
14ff0 3d 30 20 29 7b 0a 20 20 20 20 72 61 77 5f 70 72  =0 ){.    raw_pr
15000 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 44 45  intf(p->out, "DE
15010 4c 45 54 45 20 46 52 4f 4d 20 73 71 6c 69 74 65  LETE FROM sqlite
15020 5f 73 65 71 75 65 6e 63 65 3b 5c 6e 22 29 3b 0a  _sequence;\n");.
15030 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69    }else if( sqli
15040 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 73 71 6c  te3_strglob("sql
15050 69 74 65 5f 73 74 61 74 3f 22 2c 20 7a 54 61 62  ite_stat?", zTab
15060 6c 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61  le)==0 ){.    ra
15070 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
15080 20 22 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65   "ANALYZE sqlite
15090 5f 6d 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20 20  _master;\n");.  
150a0 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d  }else if( strncm
150b0 70 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69 74  p(zTable, "sqlit
150c0 65 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20  e_", 7)==0 ){.  
150d0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65    return 0;.  }e
150e0 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28  lse if( strncmp(
150f0 7a 53 71 6c 2c 20 22 43 52 45 41 54 45 20 56 49  zSql, "CREATE VI
15100 52 54 55 41 4c 20 54 41 42 4c 45 22 2c 20 32 30  RTUAL TABLE", 20
15110 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  )==0 ){.    char
15120 20 2a 7a 49 6e 73 3b 0a 20 20 20 20 69 66 28 20   *zIns;.    if( 
15130 21 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65  !p->writableSche
15140 6d 61 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  ma ){.      raw_
15150 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
15160 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f  PRAGMA writable_
15170 73 63 68 65 6d 61 3d 4f 4e 3b 5c 6e 22 29 3b 0a  schema=ON;\n");.
15180 20 20 20 20 20 20 70 2d 3e 77 72 69 74 61 62 6c        p->writabl
15190 65 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20  eSchema = 1;.   
151a0 20 7d 0a 20 20 20 20 7a 49 6e 73 20 3d 20 73 71   }.    zIns = sq
151b0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
151c0 20 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e        "INSERT IN
151d0 54 4f 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  TO sqlite_master
151e0 28 74 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e  (type,name,tbl_n
151f0 61 6d 65 2c 72 6f 6f 74 70 61 67 65 2c 73 71 6c  ame,rootpage,sql
15200 29 22 0a 20 20 20 20 20 20 20 22 56 41 4c 55 45  )".       "VALUE
15210 53 28 27 74 61 62 6c 65 27 2c 27 25 71 27 2c 27  S('table','%q','
15220 25 71 27 2c 30 2c 27 25 71 27 29 3b 22 2c 0a 20  %q',0,'%q');",. 
15230 20 20 20 20 20 20 7a 54 61 62 6c 65 2c 20 7a 54        zTable, zT
15240 61 62 6c 65 2c 20 7a 53 71 6c 29 3b 0a 20 20 20  able, zSql);.   
15250 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
15260 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 49 6e  out, "%s\n", zIn
15270 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  s);.    sqlite3_
15280 66 72 65 65 28 7a 49 6e 73 29 3b 0a 20 20 20 20  free(zIns);.    
15290 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73  return 0;.  }els
152a0 65 7b 0a 20 20 20 20 70 72 69 6e 74 53 63 68 65  e{.    printSche
152b0 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20 7a  maLine(p->out, z
152c0 53 71 6c 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 7d  Sql, ";\n");.  }
152d0 0a 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a  ..  if( strcmp(z
152e0 54 79 70 65 2c 20 22 74 61 62 6c 65 22 29 3d 3d  Type, "table")==
152f0 30 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c 54 65  0 ){.    ShellTe
15300 78 74 20 73 53 65 6c 65 63 74 3b 0a 20 20 20 20  xt sSelect;.    
15310 53 68 65 6c 6c 54 65 78 74 20 73 54 61 62 6c 65  ShellText sTable
15320 3b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43  ;.    char **azC
15330 6f 6c 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  ol;.    int i;. 
15340 20 20 20 63 68 61 72 20 2a 73 61 76 65 64 44 65     char *savedDe
15350 73 74 54 61 62 6c 65 3b 0a 20 20 20 20 69 6e 74  stTable;.    int
15360 20 73 61 76 65 64 4d 6f 64 65 3b 0a 0a 20 20 20   savedMode;..   
15370 20 61 7a 43 6f 6c 20 3d 20 74 61 62 6c 65 43 6f   azCol = tableCo
15380 6c 75 6d 6e 4c 69 73 74 28 70 2c 20 7a 54 61 62  lumnList(p, zTab
15390 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43  le);.    if( azC
153a0 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  ol==0 ){.      p
153b0 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
153c0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
153d0 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 71  .    /* Always q
153e0 75 6f 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e  uote the table n
153f0 61 6d 65 2c 20 65 76 65 6e 20 69 66 20 69 74 20  ame, even if it 
15400 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 70 75  appears to be pu
15410 72 65 20 61 73 63 69 69 2c 0a 20 20 20 20 2a 2a  re ascii,.    **
15420 20 69 6e 20 63 61 73 65 20 69 74 20 69 73 20 61   in case it is a
15430 20 6b 65 79 77 6f 72 64 2e 20 45 78 3a 20 20 49   keyword. Ex:  I
15440 4e 53 45 52 54 20 49 4e 54 4f 20 22 74 61 62 6c  NSERT INTO "tabl
15450 65 22 20 2e 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e  e" ... */.    in
15460 69 74 54 65 78 74 28 26 73 54 61 62 6c 65 29 3b  itText(&sTable);
15470 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28  .    appendText(
15480 26 73 54 61 62 6c 65 2c 20 7a 54 61 62 6c 65 2c  &sTable, zTable,
15490 20 71 75 6f 74 65 43 68 61 72 28 7a 54 61 62 6c   quoteChar(zTabl
154a0 65 29 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 70  e));.    /* If p
154b0 72 65 73 65 72 76 69 6e 67 20 74 68 65 20 72 6f  reserving the ro
154c0 77 69 64 2c 20 61 64 64 20 61 20 63 6f 6c 75 6d  wid, add a colum
154d0 6e 20 6c 69 73 74 20 61 66 74 65 72 20 74 68 65  n list after the
154e0 20 74 61 62 6c 65 20 6e 61 6d 65 2e 0a 20 20 20   table name..   
154f0 20 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72   ** In other wor
15500 64 73 3a 20 20 22 49 4e 53 45 52 54 20 49 4e 54  ds:  "INSERT INT
15510 4f 20 74 61 62 28 72 6f 77 69 64 2c 61 2c 62 2c  O tab(rowid,a,b,
15520 63 2c 2e 2e 2e 29 20 56 41 4c 55 45 53 28 2e 2e  c,...) VALUES(..
15530 2e 29 22 0a 20 20 20 20 2a 2a 20 69 6e 73 74 65  .)".    ** inste
15540 61 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c 20  ad of the usual 
15550 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 61 62  "INSERT INTO tab
15560 20 56 41 4c 55 45 53 28 2e 2e 2e 29 22 2e 0a 20   VALUES(...)".. 
15570 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 7a     */.    if( az
15580 43 6f 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  Col[0] ){.      
15590 61 70 70 65 6e 64 54 65 78 74 28 26 73 54 61 62  appendText(&sTab
155a0 6c 65 2c 20 22 28 22 2c 20 30 29 3b 0a 20 20 20  le, "(", 0);.   
155b0 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
155c0 54 61 62 6c 65 2c 20 61 7a 43 6f 6c 5b 30 5d 2c  Table, azCol[0],
155d0 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69   0);.      for(i
155e0 3d 31 3b 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b  =1; azCol[i]; i+
155f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65  +){.        appe
15600 6e 64 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20  ndText(&sTable, 
15610 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ",", 0);.       
15620 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 54 61   appendText(&sTa
15630 62 6c 65 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 71  ble, azCol[i], q
15640 75 6f 74 65 43 68 61 72 28 61 7a 43 6f 6c 5b 69  uoteChar(azCol[i
15650 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ]));.      }.   
15660 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
15670 54 61 62 6c 65 2c 20 22 29 22 2c 20 30 29 3b 0a  Table, ")", 0);.
15680 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 42 75      }..    /* Bu
15690 69 6c 64 20 61 6e 20 61 70 70 72 6f 70 72 69 61  ild an appropria
156a0 74 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  te SELECT statem
156b0 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 69 74 54  ent */.    initT
156c0 65 78 74 28 26 73 53 65 6c 65 63 74 29 3b 0a 20  ext(&sSelect);. 
156d0 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
156e0 53 65 6c 65 63 74 2c 20 22 53 45 4c 45 43 54 20  Select, "SELECT 
156f0 22 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 61  ", 0);.    if( a
15700 7a 43 6f 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20  zCol[0] ){.     
15710 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
15720 6c 65 63 74 2c 20 61 7a 43 6f 6c 5b 30 5d 2c 20  lect, azCol[0], 
15730 30 29 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64  0);.      append
15740 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22  Text(&sSelect, "
15750 2c 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  ,", 0);.    }.  
15760 20 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c    for(i=1; azCol
15770 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
15780 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
15790 6c 65 63 74 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20  lect, azCol[i], 
157a0 71 75 6f 74 65 43 68 61 72 28 61 7a 43 6f 6c 5b  quoteChar(azCol[
157b0 69 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  i]));.      if( 
157c0 61 7a 43 6f 6c 5b 69 2b 31 5d 20 29 7b 0a 20 20  azCol[i+1] ){.  
157d0 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
157e0 28 26 73 53 65 6c 65 63 74 2c 20 22 2c 22 2c 20  (&sSelect, ",", 
157f0 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
15800 7d 0a 20 20 20 20 66 72 65 65 43 6f 6c 75 6d 6e  }.    freeColumn
15810 4c 69 73 74 28 61 7a 43 6f 6c 29 3b 0a 20 20 20  List(azCol);.   
15820 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
15830 6c 65 63 74 2c 20 22 20 46 52 4f 4d 20 22 2c 20  lect, " FROM ", 
15840 30 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65  0);.    appendTe
15850 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 54 61  xt(&sSelect, zTa
15860 62 6c 65 2c 20 71 75 6f 74 65 43 68 61 72 28 7a  ble, quoteChar(z
15870 54 61 62 6c 65 29 29 3b 0a 0a 20 20 20 20 73 61  Table));..    sa
15880 76 65 64 44 65 73 74 54 61 62 6c 65 20 3d 20 70  vedDestTable = p
15890 2d 3e 7a 44 65 73 74 54 61 62 6c 65 3b 0a 20 20  ->zDestTable;.  
158a0 20 20 73 61 76 65 64 4d 6f 64 65 20 3d 20 70 2d    savedMode = p-
158b0 3e 6d 6f 64 65 3b 0a 20 20 20 20 70 2d 3e 7a 44  >mode;.    p->zD
158c0 65 73 74 54 61 62 6c 65 20 3d 20 73 54 61 62 6c  estTable = sTabl
158d0 65 2e 7a 3b 0a 20 20 20 20 70 2d 3e 6d 6f 64 65  e.z;.    p->mode
158e0 20 3d 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f   = p->cMode = MO
158f0 44 45 5f 49 6e 73 65 72 74 3b 0a 20 20 20 20 72  DE_Insert;.    r
15900 63 20 3d 20 73 68 65 6c 6c 5f 65 78 65 63 28 70  c = shell_exec(p
15910 2d 3e 64 62 2c 20 73 53 65 6c 65 63 74 2e 7a 2c  ->db, sSelect.z,
15920 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 2c   shell_callback,
15930 20 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20   p, 0);.    if( 
15940 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54  (rc&0xff)==SQLIT
15950 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20 20 20  E_CORRUPT ){.   
15960 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
15970 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43  >out, "/****** C
15980 4f 52 52 55 50 54 49 4f 4e 20 45 52 52 4f 52 20  ORRUPTION ERROR 
15990 2a 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20  *******/\n");.  
159a0 20 20 20 20 74 6f 67 67 6c 65 53 65 6c 65 63 74      toggleSelect
159b0 4f 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20  Order(p->db);.  
159c0 20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 70      shell_exec(p
159d0 2d 3e 64 62 2c 20 73 53 65 6c 65 63 74 2e 7a 2c  ->db, sSelect.z,
159e0 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 2c   shell_callback,
159f0 20 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 74 6f   p, 0);.      to
15a00 67 67 6c 65 53 65 6c 65 63 74 4f 72 64 65 72 28  ggleSelectOrder(
15a10 70 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20  p->db);.    }.  
15a20 20 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20    p->zDestTable 
15a30 3d 20 73 61 76 65 64 44 65 73 74 54 61 62 6c 65  = savedDestTable
15a40 3b 0a 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20  ;.    p->mode = 
15a50 73 61 76 65 64 4d 6f 64 65 3b 0a 20 20 20 20 66  savedMode;.    f
15a60 72 65 65 54 65 78 74 28 26 73 54 61 62 6c 65 29  reeText(&sTable)
15a70 3b 0a 20 20 20 20 66 72 65 65 54 65 78 74 28 26  ;.    freeText(&
15a80 73 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 69 66  sSelect);.    if
15a90 28 20 72 63 20 29 20 70 2d 3e 6e 45 72 72 2b 2b  ( rc ) p->nErr++
15aa0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
15ab0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 7a  ;.}../*.** Run z
15ac0 51 75 65 72 79 2e 20 20 55 73 65 20 64 75 6d 70  Query.  Use dump
15ad0 5f 63 61 6c 6c 62 61 63 6b 28 29 20 61 73 20 74  _callback() as t
15ae0 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74  he callback rout
15af0 69 6e 65 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74  ine so that.** t
15b00 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74  he contents of t
15b10 68 65 20 71 75 65 72 79 20 61 72 65 20 6f 75 74  he query are out
15b20 70 75 74 20 61 73 20 53 51 4c 20 73 74 61 74 65  put as SQL state
15b30 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ments..**.** If 
15b40 77 65 20 67 65 74 20 61 20 53 51 4c 49 54 45 5f  we get a SQLITE_
15b50 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2c 20 72  CORRUPT error, r
15b60 65 72 75 6e 20 74 68 65 20 71 75 65 72 79 20 61  erun the query a
15b70 66 74 65 72 20 61 70 70 65 6e 64 69 6e 67 0a 2a  fter appending.*
15b80 2a 20 22 4f 52 44 45 52 20 42 59 20 72 6f 77 69  * "ORDER BY rowi
15b90 64 20 44 45 53 43 22 20 74 6f 20 74 68 65 20 65  d DESC" to the e
15ba0 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
15bb0 74 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d  t run_schema_dum
15bc0 70 5f 71 75 65 72 79 28 0a 20 20 53 68 65 6c 6c  p_query(.  Shell
15bd0 53 74 61 74 65 20 2a 70 2c 0a 20 20 63 6f 6e 73  State *p,.  cons
15be0 74 20 63 68 61 72 20 2a 7a 51 75 65 72 79 0a 29  t char *zQuery.)
15bf0 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68  {.  int rc;.  ch
15c00 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20  ar *zErr = 0;.  
15c10 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
15c20 63 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c  c(p->db, zQuery,
15c30 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 2c 20   dump_callback, 
15c40 70 2c 20 26 7a 45 72 72 29 3b 0a 20 20 69 66 28  p, &zErr);.  if(
15c50 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52   rc==SQLITE_CORR
15c60 55 50 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20  UPT ){.    char 
15c70 2a 7a 51 32 3b 0a 20 20 20 20 69 6e 74 20 6c 65  *zQ2;.    int le
15c80 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 51 75  n = strlen30(zQu
15c90 65 72 79 29 3b 0a 20 20 20 20 72 61 77 5f 70 72  ery);.    raw_pr
15ca0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a  intf(p->out, "/*
15cb0 2a 2a 2a 2a 2a 20 43 4f 52 52 55 50 54 49 4f 4e  ***** CORRUPTION
15cc0 20 45 52 52 4f 52 20 2a 2a 2a 2a 2a 2a 2a 2f 5c   ERROR *******/\
15cd0 6e 22 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 72  n");.    if( zEr
15ce0 72 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  r ){.      utf8_
15cf0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
15d00 2f 2a 2a 2a 2a 2a 2a 20 25 73 20 2a 2a 2a 2a 2a  /****** %s *****
15d10 2a 2f 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20  */\n", zErr);.  
15d20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
15d30 28 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 7a 45  (zErr);.      zE
15d40 72 72 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  rr = 0;.    }.  
15d50 20 20 7a 51 32 20 3d 20 6d 61 6c 6c 6f 63 28 20    zQ2 = malloc( 
15d60 6c 65 6e 2b 31 30 30 20 29 3b 0a 20 20 20 20 69  len+100 );.    i
15d70 66 28 20 7a 51 32 3d 3d 30 20 29 20 72 65 74 75  f( zQ2==0 ) retu
15d80 72 6e 20 72 63 3b 0a 20 20 20 20 73 71 6c 69 74  rn rc;.    sqlit
15d90 65 33 5f 73 6e 70 72 69 6e 74 66 28 6c 65 6e 2b  e3_snprintf(len+
15da0 31 30 30 2c 20 7a 51 32 2c 20 22 25 73 20 4f 52  100, zQ2, "%s OR
15db0 44 45 52 20 42 59 20 72 6f 77 69 64 20 44 45 53  DER BY rowid DES
15dc0 43 22 2c 20 7a 51 75 65 72 79 29 3b 0a 20 20 20  C", zQuery);.   
15dd0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78   rc = sqlite3_ex
15de0 65 63 28 70 2d 3e 64 62 2c 20 7a 51 32 2c 20 64  ec(p->db, zQ2, d
15df0 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2c  ump_callback, p,
15e00 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28   &zErr);.    if(
15e10 20 72 63 20 29 7b 0a 20 20 20 20 20 20 75 74 66   rc ){.      utf
15e20 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
15e30 20 22 2f 2a 2a 2a 2a 2a 2a 20 45 52 52 4f 52 3a   "/****** ERROR:
15e40 20 25 73 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20   %s ******/\n", 
15e50 7a 45 72 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65  zErr);.    }else
15e60 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  {.      rc = SQL
15e70 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20  ITE_CORRUPT;.   
15e80 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
15e90 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 66  ree(zErr);.    f
15ea0 72 65 65 28 7a 51 32 29 3b 0a 20 20 7d 0a 20 20  ree(zQ2);.  }.  
15eb0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
15ec0 0a 2a 2a 20 54 65 78 74 20 6f 66 20 61 20 68 65  .** Text of a he
15ed0 6c 70 20 6d 65 73 73 61 67 65 0a 2a 2f 0a 73 74  lp message.*/.st
15ee0 61 74 69 63 20 63 68 61 72 20 7a 48 65 6c 70 5b  atic char zHelp[
15ef0 5d 20 3d 0a 23 69 66 20 64 65 66 69 6e 65 64 28  ] =.#if defined(
15f00 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42  SQLITE_HAVE_ZLIB
15f10 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
15f20 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
15f30 4c 54 41 42 4c 45 29 0a 20 20 22 2e 61 72 63 68  LTABLE).  ".arch
15f40 69 76 65 20 2e 2e 2e 20 20 20 20 20 20 20 20 20  ive ...         
15f50 20 20 4d 61 6e 61 67 65 20 53 51 4c 20 61 72 63    Manage SQL arc
15f60 68 69 76 65 73 3a 20 5c 22 2e 61 72 63 68 69 76  hives: \".archiv
15f70 65 20 2d 2d 68 65 6c 70 5c 22 20 66 6f 72 20 64  e --help\" for d
15f80 65 74 61 69 6c 73 5c 6e 22 0a 23 65 6e 64 69 66  etails\n".#endif
15f90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
15fa0 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
15fb0 4f 4e 0a 20 20 22 2e 61 75 74 68 20 4f 4e 7c 4f  ON.  ".auth ON|O
15fc0 46 46 20 20 20 20 20 20 20 20 20 20 20 53 68 6f  FF           Sho
15fd0 77 20 61 75 74 68 6f 72 69 7a 65 72 20 63 61 6c  w authorizer cal
15fe0 6c 62 61 63 6b 73 5c 6e 22 0a 23 65 6e 64 69 66  lbacks\n".#endif
15ff0 0a 20 20 22 2e 62 61 63 6b 75 70 20 3f 44 42 3f  .  ".backup ?DB?
16000 20 46 49 4c 45 20 20 20 20 20 20 42 61 63 6b 75   FILE      Backu
16010 70 20 44 42 20 28 64 65 66 61 75 6c 74 20 5c 22  p DB (default \"
16020 6d 61 69 6e 5c 22 29 20 74 6f 20 46 49 4c 45 5c  main\") to FILE\
16030 6e 22 0a 20 20 22 2e 62 61 69 6c 20 6f 6e 7c 6f  n".  ".bail on|o
16040 66 66 20 20 20 20 20 20 20 20 20 20 20 53 74 6f  ff           Sto
16050 70 20 61 66 74 65 72 20 68 69 74 74 69 6e 67 20  p after hitting 
16060 61 6e 20 65 72 72 6f 72 2e 20 20 44 65 66 61 75  an error.  Defau
16070 6c 74 20 4f 46 46 5c 6e 22 0a 20 20 22 2e 62 69  lt OFF\n".  ".bi
16080 6e 61 72 79 20 6f 6e 7c 6f 66 66 20 20 20 20 20  nary on|off     
16090 20 20 20 20 54 75 72 6e 20 62 69 6e 61 72 79 20      Turn binary 
160a0 6f 75 74 70 75 74 20 6f 6e 20 6f 72 20 6f 66 66  output on or off
160b0 2e 20 20 44 65 66 61 75 6c 74 20 4f 46 46 5c 6e  .  Default OFF\n
160c0 22 0a 20 20 22 2e 63 64 20 44 49 52 45 43 54 4f  ".  ".cd DIRECTO
160d0 52 59 20 20 20 20 20 20 20 20 20 20 43 68 61 6e  RY          Chan
160e0 67 65 20 74 68 65 20 77 6f 72 6b 69 6e 67 20 64  ge the working d
160f0 69 72 65 63 74 6f 72 79 20 74 6f 20 44 49 52 45  irectory to DIRE
16100 43 54 4f 52 59 5c 6e 22 0a 20 20 22 2e 63 68 61  CTORY\n".  ".cha
16110 6e 67 65 73 20 6f 6e 7c 6f 66 66 20 20 20 20 20  nges on|off     
16120 20 20 20 53 68 6f 77 20 6e 75 6d 62 65 72 20 6f     Show number o
16130 66 20 72 6f 77 73 20 63 68 61 6e 67 65 64 20 62  f rows changed b
16140 79 20 53 51 4c 5c 6e 22 0a 20 20 22 2e 63 68 65  y SQL\n".  ".che
16150 63 6b 20 47 4c 4f 42 20 20 20 20 20 20 20 20 20  ck GLOB         
16160 20 20 20 46 61 69 6c 20 69 66 20 6f 75 74 70 75     Fail if outpu
16170 74 20 73 69 6e 63 65 20 2e 74 65 73 74 63 61 73  t since .testcas
16180 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68  e does not match
16190 5c 6e 22 0a 20 20 22 2e 63 6c 6f 6e 65 20 4e 45  \n".  ".clone NE
161a0 57 44 42 20 20 20 20 20 20 20 20 20 20 20 43 6c  WDB           Cl
161b0 6f 6e 65 20 64 61 74 61 20 69 6e 74 6f 20 4e 45  one data into NE
161c0 57 44 42 20 66 72 6f 6d 20 74 68 65 20 65 78 69  WDB from the exi
161d0 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 5c 6e  sting database\n
161e0 22 0a 20 20 22 2e 64 61 74 61 62 61 73 65 73 20  ".  ".databases 
161f0 20 20 20 20 20 20 20 20 20 20 20 20 4c 69 73 74              List
16200 20 6e 61 6d 65 73 20 61 6e 64 20 66 69 6c 65 73   names and files
16210 20 6f 66 20 61 74 74 61 63 68 65 64 20 64 61 74   of attached dat
16220 61 62 61 73 65 73 5c 6e 22 0a 20 20 22 2e 64 62  abases\n".  ".db
16230 69 6e 66 6f 20 3f 44 42 3f 20 20 20 20 20 20 20  info ?DB?       
16240 20 20 20 20 53 68 6f 77 20 73 74 61 74 75 73 20      Show status 
16250 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  information abou
16260 74 20 74 68 65 20 64 61 74 61 62 61 73 65 5c 6e  t the database\n
16270 22 0a 20 20 22 2e 64 75 6d 70 20 3f 54 41 42 4c  ".  ".dump ?TABL
16280 45 3f 20 2e 2e 2e 20 20 20 20 20 20 44 75 6d 70  E? ...      Dump
16290 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e   the database in
162a0 20 61 6e 20 53 51 4c 20 74 65 78 74 20 66 6f 72   an SQL text for
162b0 6d 61 74 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  mat\n".  "      
162c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
162d0 20 20 20 49 66 20 54 41 42 4c 45 20 73 70 65 63     If TABLE spec
162e0 69 66 69 65 64 2c 20 6f 6e 6c 79 20 64 75 6d 70  ified, only dump
162f0 20 74 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67   tables matching
16300 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20  \n".  "         
16310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16320 4c 49 4b 45 20 70 61 74 74 65 72 6e 20 54 41 42  LIKE pattern TAB
16330 4c 45 2e 5c 6e 22 0a 20 20 22 2e 65 63 68 6f 20  LE.\n".  ".echo 
16340 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20  on|off          
16350 20 54 75 72 6e 20 63 6f 6d 6d 61 6e 64 20 65 63   Turn command ec
16360 68 6f 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a  ho on or off\n".
16370 20 20 22 2e 65 71 70 20 6f 6e 7c 6f 66 66 7c 66    ".eqp on|off|f
16380 75 6c 6c 20 20 20 20 20 20 20 45 6e 61 62 6c 65  ull       Enable
16390 20 6f 72 20 64 69 73 61 62 6c 65 20 61 75 74 6f   or disable auto
163a0 6d 61 74 69 63 20 45 58 50 4c 41 49 4e 20 51 55  matic EXPLAIN QU
163b0 45 52 59 20 50 4c 41 4e 5c 6e 22 0a 20 20 22 2e  ERY PLAN\n".  ".
163c0 65 78 69 74 20 20 20 20 20 20 20 20 20 20 20 20  exit            
163d0 20 20 20 20 20 20 45 78 69 74 20 74 68 69 73 20        Exit this 
163e0 70 72 6f 67 72 61 6d 5c 6e 22 0a 20 20 22 2e 65  program\n".  ".e
163f0 78 70 65 72 74 20 20 20 20 20 20 20 20 20 20 20  xpert           
16400 20 20 20 20 20 45 58 50 45 52 49 4d 45 4e 54 41       EXPERIMENTA
16410 4c 2e 20 53 75 67 67 65 73 74 20 69 6e 64 65 78  L. Suggest index
16420 65 73 20 66 6f 72 20 73 70 65 63 69 66 69 65 64  es for specified
16430 20 71 75 65 72 69 65 73 5c 6e 22 0a 2f 2a 20 42   queries\n"./* B
16440 65 63 61 75 73 65 20 65 78 70 6c 61 69 6e 20 6d  ecause explain m
16450 6f 64 65 20 63 6f 6d 65 73 20 6f 6e 20 61 75 74  ode comes on aut
16460 6f 6d 61 74 69 63 61 6c 6c 79 20 6e 6f 77 2c 20  omatically now, 
16470 74 68 65 20 22 2e 65 78 70 6c 61 69 6e 22 20 6d  the ".explain" m
16480 6f 64 65 0a 2a 2a 20 69 73 20 72 65 6d 6f 76 65  ode.** is remove
16490 64 20 66 72 6f 6d 20 74 68 65 20 68 65 6c 70 20  d from the help 
164a0 73 63 72 65 65 6e 2e 20 20 49 74 20 69 73 20 73  screen.  It is s
164b0 74 69 6c 6c 20 73 75 70 70 6f 72 74 65 64 20 66  till supported f
164c0 6f 72 20 6c 65 67 61 63 79 2c 20 68 6f 77 65 76  or legacy, howev
164d0 65 72 20 2a 2f 0a 2f 2a 22 2e 65 78 70 6c 61 69  er */./*".explai
164e0 6e 20 3f 6f 6e 7c 6f 66 66 7c 61 75 74 6f 3f 20  n ?on|off|auto? 
164f0 54 75 72 6e 20 45 58 50 4c 41 49 4e 20 6f 75 74  Turn EXPLAIN out
16500 70 75 74 20 6d 6f 64 65 20 6f 6e 20 6f 72 20 6f  put mode on or o
16510 66 66 20 6f 72 20 74 6f 20 61 75 74 6f 6d 61 74  ff or to automat
16520 69 63 5c 6e 22 2a 2f 0a 20 20 22 2e 66 75 6c 6c  ic\n"*/.  ".full
16530 73 63 68 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e 74  schema ?--indent
16540 3f 20 53 68 6f 77 20 73 63 68 65 6d 61 20 61 6e  ? Show schema an
16550 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66  d the content of
16560 20 73 71 6c 69 74 65 5f 73 74 61 74 20 74 61 62   sqlite_stat tab
16570 6c 65 73 5c 6e 22 0a 20 20 22 2e 68 65 61 64 65  les\n".  ".heade
16580 72 73 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20  rs on|off       
16590 20 54 75 72 6e 20 64 69 73 70 6c 61 79 20 6f 66   Turn display of
165a0 20 68 65 61 64 65 72 73 20 6f 6e 20 6f 72 20 6f   headers on or o
165b0 66 66 5c 6e 22 0a 20 20 22 2e 68 65 6c 70 20 20  ff\n".  ".help  
165c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165d0 53 68 6f 77 20 74 68 69 73 20 6d 65 73 73 61 67  Show this messag
165e0 65 5c 6e 22 0a 20 20 22 2e 69 6d 70 6f 72 74 20  e\n".  ".import 
165f0 46 49 4c 45 20 54 41 42 4c 45 20 20 20 20 20 49  FILE TABLE     I
16600 6d 70 6f 72 74 20 64 61 74 61 20 66 72 6f 6d 20  mport data from 
16610 46 49 4c 45 20 69 6e 74 6f 20 54 41 42 4c 45 5c  FILE into TABLE\
16620 6e 22 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  n".#ifndef SQLIT
16630 45 5f 4f 4d 49 54 5f 54 45 53 54 5f 43 4f 4e 54  E_OMIT_TEST_CONT
16640 52 4f 4c 0a 20 20 22 2e 69 6d 70 6f 73 74 65 72  ROL.  ".imposter
16650 20 49 4e 44 45 58 20 54 41 42 4c 45 20 20 43 72   INDEX TABLE  Cr
16660 65 61 74 65 20 69 6d 70 6f 73 74 65 72 20 74 61  eate imposter ta
16670 62 6c 65 20 54 41 42 4c 45 20 6f 6e 20 69 6e 64  ble TABLE on ind
16680 65 78 20 49 4e 44 45 58 5c 6e 22 0a 23 65 6e 64  ex INDEX\n".#end
16690 69 66 0a 20 20 22 2e 69 6e 64 65 78 65 73 20 3f  if.  ".indexes ?
166a0 54 41 42 4c 45 3f 20 20 20 20 20 20 20 53 68 6f  TABLE?       Sho
166b0 77 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 69  w names of all i
166c0 6e 64 65 78 65 73 5c 6e 22 0a 20 20 22 20 20 20  ndexes\n".  "   
166d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166e0 20 20 20 20 20 20 49 66 20 54 41 42 4c 45 20 73        If TABLE s
166f0 70 65 63 69 66 69 65 64 2c 20 6f 6e 6c 79 20 73  pecified, only s
16700 68 6f 77 20 69 6e 64 65 78 65 73 20 66 6f 72 20  how indexes for 
16710 74 61 62 6c 65 73 5c 6e 22 0a 20 20 22 20 20 20  tables\n".  "   
16720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16730 20 20 20 20 20 20 6d 61 74 63 68 69 6e 67 20 4c        matching L
16740 49 4b 45 20 70 61 74 74 65 72 6e 20 54 41 42 4c  IKE pattern TABL
16750 45 2e 5c 6e 22 0a 23 69 66 64 65 66 20 53 51 4c  E.\n".#ifdef SQL
16760 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41  ITE_ENABLE_IOTRA
16770 43 45 0a 20 20 22 2e 69 6f 74 72 61 63 65 20 46  CE.  ".iotrace F
16780 49 4c 45 20 20 20 20 20 20 20 20 20 20 45 6e 61  ILE          Ena
16790 62 6c 65 20 49 2f 4f 20 64 69 61 67 6e 6f 73 74  ble I/O diagnost
167a0 69 63 20 6c 6f 67 67 69 6e 67 20 74 6f 20 46 49  ic logging to FI
167b0 4c 45 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22  LE\n".#endif.  "
167c0 2e 6c 69 6d 69 74 20 3f 4c 49 4d 49 54 3f 20 3f  .limit ?LIMIT? ?
167d0 56 41 4c 3f 20 20 20 44 69 73 70 6c 61 79 20 6f  VAL?   Display o
167e0 72 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c  r change the val
167f0 75 65 20 6f 66 20 61 6e 20 53 51 4c 49 54 45 5f  ue of an SQLITE_
16800 4c 49 4d 49 54 5c 6e 22 0a 20 20 22 2e 6c 69 6e  LIMIT\n".  ".lin
16810 74 20 4f 50 54 49 4f 4e 53 20 20 20 20 20 20 20  t OPTIONS       
16820 20 20 20 52 65 70 6f 72 74 20 70 6f 74 65 6e 74     Report potent
16830 69 61 6c 20 73 63 68 65 6d 61 20 69 73 73 75 65  ial schema issue
16840 73 2e 20 4f 70 74 69 6f 6e 73 3a 5c 6e 22 0a 20  s. Options:\n". 
16850 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
16860 20 20 20 20 20 20 20 20 20 20 20 66 6b 65 79 2d             fkey-
16870 69 6e 64 65 78 65 73 20 20 20 20 20 46 69 6e 64  indexes     Find
16880 20 6d 69 73 73 69 6e 67 20 66 6f 72 65 69 67 6e   missing foreign
16890 20 6b 65 79 20 69 6e 64 65 78 65 73 5c 6e 22 0a   key indexes\n".
168a0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
168b0 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49  MIT_LOAD_EXTENSI
168c0 4f 4e 0a 20 20 22 2e 6c 6f 61 64 20 46 49 4c 45  ON.  ".load FILE
168d0 20 3f 45 4e 54 52 59 3f 20 20 20 20 20 4c 6f 61   ?ENTRY?     Loa
168e0 64 20 61 6e 20 65 78 74 65 6e 73 69 6f 6e 20 6c  d an extension l
168f0 69 62 72 61 72 79 5c 6e 22 0a 23 65 6e 64 69 66  ibrary\n".#endif
16900 0a 20 20 22 2e 6c 6f 67 20 46 49 4c 45 7c 6f 66  .  ".log FILE|of
16910 66 20 20 20 20 20 20 20 20 20 20 54 75 72 6e 20  f          Turn 
16920 6c 6f 67 67 69 6e 67 20 6f 6e 20 6f 72 20 6f 66  logging on or of
16930 66 2e 20 20 46 49 4c 45 20 63 61 6e 20 62 65 20  f.  FILE can be 
16940 73 74 64 65 72 72 2f 73 74 64 6f 75 74 5c 6e 22  stderr/stdout\n"
16950 0a 20 20 22 2e 6d 6f 64 65 20 4d 4f 44 45 20 3f  .  ".mode MODE ?
16960 54 41 42 4c 45 3f 20 20 20 20 20 53 65 74 20 6f  TABLE?     Set o
16970 75 74 70 75 74 20 6d 6f 64 65 20 77 68 65 72 65  utput mode where
16980 20 4d 4f 44 45 20 69 73 20 6f 6e 65 20 6f 66 3a   MODE is one of:
16990 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20  \n".  "         
169a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
169b0 61 73 63 69 69 20 20 20 20 43 6f 6c 75 6d 6e 73  ascii    Columns
169c0 2f 72 6f 77 73 20 64 65 6c 69 6d 69 74 65 64 20  /rows delimited 
169d0 62 79 20 30 78 31 46 20 61 6e 64 20 30 78 31 45  by 0x1F and 0x1E
169e0 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20  \n".  "         
169f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a00 63 73 76 20 20 20 20 20 20 43 6f 6d 6d 61 2d 73  csv      Comma-s
16a10 65 70 61 72 61 74 65 64 20 76 61 6c 75 65 73 5c  eparated values\
16a20 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
16a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
16a40 6f 6c 75 6d 6e 20 20 20 4c 65 66 74 2d 61 6c 69  olumn   Left-ali
16a50 67 6e 65 64 20 63 6f 6c 75 6d 6e 73 2e 20 20 28  gned columns.  (
16a60 53 65 65 20 2e 77 69 64 74 68 29 5c 6e 22 0a 20  See .width)\n". 
16a70 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
16a80 20 20 20 20 20 20 20 20 20 20 20 68 74 6d 6c 20             html 
16a90 20 20 20 20 48 54 4d 4c 20 3c 74 61 62 6c 65 3e      HTML <table>
16aa0 20 63 6f 64 65 5c 6e 22 0a 20 20 22 20 20 20 20   code\n".  "    
16ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ac0 20 20 20 20 20 69 6e 73 65 72 74 20 20 20 53 51       insert   SQ
16ad0 4c 20 69 6e 73 65 72 74 20 73 74 61 74 65 6d 65  L insert stateme
16ae0 6e 74 73 20 66 6f 72 20 54 41 42 4c 45 5c 6e 22  nts for TABLE\n"
16af0 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
16b00 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e               lin
16b10 65 20 20 20 20 20 4f 6e 65 20 76 61 6c 75 65 20  e     One value 
16b20 70 65 72 20 6c 69 6e 65 5c 6e 22 0a 20 20 22 20  per line\n".  " 
16b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b40 20 20 20 20 20 20 20 20 6c 69 73 74 20 20 20 20          list    
16b50 20 56 61 6c 75 65 73 20 64 65 6c 69 6d 69 74 65   Values delimite
16b60 64 20 62 79 20 5c 22 7c 5c 22 5c 6e 22 0a 20 20  d by \"|\"\n".  
16b70 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
16b80 20 20 20 20 20 20 20 20 20 20 71 75 6f 74 65 20            quote 
16b90 20 20 20 45 73 63 61 70 65 20 61 6e 73 77 65 72     Escape answer
16ba0 73 20 61 73 20 66 6f 72 20 53 51 4c 5c 6e 22 0a  s as for SQL\n".
16bb0 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
16bc0 20 20 20 20 20 20 20 20 20 20 20 20 74 61 62 73              tabs
16bd0 20 20 20 20 20 54 61 62 2d 73 65 70 61 72 61 74       Tab-separat
16be0 65 64 20 76 61 6c 75 65 73 5c 6e 22 0a 20 20 22  ed values\n".  "
16bf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c00 20 20 20 20 20 20 20 20 20 74 63 6c 20 20 20 20           tcl    
16c10 20 20 54 43 4c 20 6c 69 73 74 20 65 6c 65 6d 65    TCL list eleme
16c20 6e 74 73 5c 6e 22 0a 20 20 22 2e 6e 75 6c 6c 76  nts\n".  ".nullv
16c30 61 6c 75 65 20 53 54 52 49 4e 47 20 20 20 20 20  alue STRING     
16c40 20 55 73 65 20 53 54 52 49 4e 47 20 69 6e 20 70   Use STRING in p
16c50 6c 61 63 65 20 6f 66 20 4e 55 4c 4c 20 76 61 6c  lace of NULL val
16c60 75 65 73 5c 6e 22 0a 20 20 22 2e 6f 6e 63 65 20  ues\n".  ".once 
16c70 46 49 4c 45 4e 41 4d 45 20 20 20 20 20 20 20 20  FILENAME        
16c80 20 4f 75 74 70 75 74 20 66 6f 72 20 74 68 65 20   Output for the 
16c90 6e 65 78 74 20 53 51 4c 20 63 6f 6d 6d 61 6e 64  next SQL command
16ca0 20 6f 6e 6c 79 20 74 6f 20 46 49 4c 45 4e 41 4d   only to FILENAM
16cb0 45 5c 6e 22 0a 20 20 22 2e 6f 70 65 6e 20 3f 4f  E\n".  ".open ?O
16cc0 50 54 49 4f 4e 53 3f 20 3f 46 49 4c 45 3f 20 43  PTIONS? ?FILE? C
16cd0 6c 6f 73 65 20 65 78 69 73 74 69 6e 67 20 64 61  lose existing da
16ce0 74 61 62 61 73 65 20 61 6e 64 20 72 65 6f 70 65  tabase and reope
16cf0 6e 20 46 49 4c 45 5c 6e 22 0a 20 20 22 20 20 20  n FILE\n".  "   
16d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d10 20 20 20 20 20 20 54 68 65 20 2d 2d 6e 65 77 20        The --new 
16d20 6f 70 74 69 6f 6e 20 73 74 61 72 74 73 20 77 69  option starts wi
16d30 74 68 20 61 6e 20 65 6d 70 74 79 20 66 69 6c 65  th an empty file
16d40 5c 6e 22 0a 20 20 22 2e 6f 75 74 70 75 74 20 3f  \n".  ".output ?
16d50 46 49 4c 45 4e 41 4d 45 3f 20 20 20 20 20 53 65  FILENAME?     Se
16d60 6e 64 20 6f 75 74 70 75 74 20 74 6f 20 46 49 4c  nd output to FIL
16d70 45 4e 41 4d 45 20 6f 72 20 73 74 64 6f 75 74 5c  ENAME or stdout\
16d80 6e 22 0a 20 20 22 2e 70 72 69 6e 74 20 53 54 52  n".  ".print STR
16d90 49 4e 47 2e 2e 2e 20 20 20 20 20 20 20 50 72 69  ING...       Pri
16da0 6e 74 20 6c 69 74 65 72 61 6c 20 53 54 52 49 4e  nt literal STRIN
16db0 47 5c 6e 22 0a 20 20 22 2e 70 72 6f 6d 70 74 20  G\n".  ".prompt 
16dc0 4d 41 49 4e 20 43 4f 4e 54 49 4e 55 45 20 20 52  MAIN CONTINUE  R
16dd0 65 70 6c 61 63 65 20 74 68 65 20 73 74 61 6e 64  eplace the stand
16de0 61 72 64 20 70 72 6f 6d 70 74 73 5c 6e 22 0a 20  ard prompts\n". 
16df0 20 22 2e 71 75 69 74 20 20 20 20 20 20 20 20 20   ".quit         
16e00 20 20 20 20 20 20 20 20 20 45 78 69 74 20 74 68           Exit th
16e10 69 73 20 70 72 6f 67 72 61 6d 5c 6e 22 0a 20 20  is program\n".  
16e20 22 2e 72 65 61 64 20 46 49 4c 45 4e 41 4d 45 20  ".read FILENAME 
16e30 20 20 20 20 20 20 20 20 45 78 65 63 75 74 65 20          Execute 
16e40 53 51 4c 20 69 6e 20 46 49 4c 45 4e 41 4d 45 5c  SQL in FILENAME\
16e50 6e 22 0a 20 20 22 2e 72 65 73 74 6f 72 65 20 3f  n".  ".restore ?
16e60 44 42 3f 20 46 49 4c 45 20 20 20 20 20 52 65 73  DB? FILE     Res
16e70 74 6f 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20  tore content of 
16e80 44 42 20 28 64 65 66 61 75 6c 74 20 5c 22 6d 61  DB (default \"ma
16e90 69 6e 5c 22 29 20 66 72 6f 6d 20 46 49 4c 45 5c  in\") from FILE\
16ea0 6e 22 0a 20 20 22 2e 73 61 76 65 20 46 49 4c 45  n".  ".save FILE
16eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 57 72 69               Wri
16ec0 74 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74  te in-memory dat
16ed0 61 62 61 73 65 20 69 6e 74 6f 20 46 49 4c 45 5c  abase into FILE\
16ee0 6e 22 0a 20 20 22 2e 73 63 61 6e 73 74 61 74 73  n".  ".scanstats
16ef0 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 54 75 72   on|off      Tur
16f00 6e 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  n sqlite3_stmt_s
16f10 63 61 6e 73 74 61 74 75 73 28 29 20 6d 65 74 72  canstatus() metr
16f20 69 63 73 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22  ics on or off\n"
16f30 0a 20 20 22 2e 73 63 68 65 6d 61 20 3f 50 41 54  .  ".schema ?PAT
16f40 54 45 52 4e 3f 20 20 20 20 20 20 53 68 6f 77 20  TERN?      Show 
16f50 74 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65  the CREATE state
16f60 6d 65 6e 74 73 20 6d 61 74 63 68 69 6e 67 20 50  ments matching P
16f70 41 54 54 45 52 4e 5c 6e 22 0a 20 20 22 20 20 20  ATTERN\n".  "   
16f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f90 20 20 20 20 20 20 20 41 64 64 20 2d 2d 69 6e 64         Add --ind
16fa0 65 6e 74 20 66 6f 72 20 70 72 65 74 74 79 2d 70  ent for pretty-p
16fb0 72 69 6e 74 69 6e 67 5c 6e 22 0a 20 20 22 2e 73  rinting\n".  ".s
16fc0 65 6c 66 74 65 73 74 20 3f 2d 2d 69 6e 69 74 3f  elftest ?--init?
16fd0 20 20 20 20 20 52 75 6e 20 74 65 73 74 73 20 64       Run tests d
16fe0 65 66 69 6e 65 64 20 69 6e 20 74 68 65 20 53 45  efined in the SE
16ff0 4c 46 54 45 53 54 20 74 61 62 6c 65 5c 6e 22 0a  LFTEST table\n".
17000 20 20 22 2e 73 65 70 61 72 61 74 6f 72 20 43 4f    ".separator CO
17010 4c 20 3f 52 4f 57 3f 20 20 20 43 68 61 6e 67 65  L ?ROW?   Change
17020 20 74 68 65 20 63 6f 6c 75 6d 6e 20 73 65 70 61   the column sepa
17030 72 61 74 6f 72 20 61 6e 64 20 6f 70 74 69 6f 6e  rator and option
17040 61 6c 6c 79 20 74 68 65 20 72 6f 77 5c 6e 22 0a  ally the row\n".
17050 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
17060 20 20 20 20 20 20 20 20 20 20 20 20 73 65 70 61              sepa
17070 72 61 74 6f 72 20 66 6f 72 20 62 6f 74 68 20 74  rator for both t
17080 68 65 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 61  he output mode a
17090 6e 64 20 2e 69 6d 70 6f 72 74 5c 6e 22 0a 23 69  nd .import\n".#i
170a0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
170b0 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29  _ENABLE_SESSION)
170c0 0a 20 20 22 2e 73 65 73 73 69 6f 6e 20 43 4d 44  .  ".session CMD
170d0 20 2e 2e 2e 20 20 20 20 20 20 20 43 72 65 61 74   ...       Creat
170e0 65 20 6f 72 20 63 6f 6e 74 72 6f 6c 20 73 65 73  e or control ses
170f0 73 69 6f 6e 73 5c 6e 22 0a 23 65 6e 64 69 66 0a  sions\n".#endif.
17100 20 20 22 2e 73 68 61 33 73 75 6d 20 3f 4f 50 54    ".sha3sum ?OPT
17110 49 4f 4e 53 2e 2e 2e 3f 20 20 43 6f 6d 70 75 74  IONS...?  Comput
17120 65 20 61 20 53 48 41 33 20 68 61 73 68 20 6f 66  e a SHA3 hash of
17130 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e   database conten
17140 74 5c 6e 22 0a 20 20 22 2e 73 68 65 6c 6c 20 43  t\n".  ".shell C
17150 4d 44 20 41 52 47 53 2e 2e 2e 20 20 20 20 20 52  MD ARGS...     R
17160 75 6e 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20 69  un CMD ARGS... i
17170 6e 20 61 20 73 79 73 74 65 6d 20 73 68 65 6c 6c  n a system shell
17180 5c 6e 22 0a 20 20 22 2e 73 68 6f 77 20 20 20 20  \n".  ".show    
17190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 68                Sh
171a0 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 76  ow the current v
171b0 61 6c 75 65 73 20 66 6f 72 20 76 61 72 69 6f 75  alues for variou
171c0 73 20 73 65 74 74 69 6e 67 73 5c 6e 22 0a 20 20  s settings\n".  
171d0 22 2e 73 74 61 74 73 20 3f 6f 6e 7c 6f 66 66 3f  ".stats ?on|off?
171e0 20 20 20 20 20 20 20 20 53 68 6f 77 20 73 74 61          Show sta
171f0 74 73 20 6f 72 20 74 75 72 6e 20 73 74 61 74 73  ts or turn stats
17200 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20   on or off\n".  
17210 22 2e 73 79 73 74 65 6d 20 43 4d 44 20 41 52 47  ".system CMD ARG
17220 53 2e 2e 2e 20 20 20 20 52 75 6e 20 43 4d 44 20  S...    Run CMD 
17230 41 52 47 53 2e 2e 2e 20 69 6e 20 61 20 73 79 73  ARGS... in a sys
17240 74 65 6d 20 73 68 65 6c 6c 5c 6e 22 0a 20 20 22  tem shell\n".  "
17250 2e 74 61 62 6c 65 73 20 3f 54 41 42 4c 45 3f 20  .tables ?TABLE? 
17260 20 20 20 20 20 20 20 4c 69 73 74 20 6e 61 6d 65         List name
17270 73 20 6f 66 20 74 61 62 6c 65 73 5c 6e 22 0a 20  s of tables\n". 
17280 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
17290 20 20 20 20 20 20 20 20 20 20 20 49 66 20 54 41             If TA
172a0 42 4c 45 20 73 70 65 63 69 66 69 65 64 2c 20 6f  BLE specified, o
172b0 6e 6c 79 20 6c 69 73 74 20 74 61 62 6c 65 73 20  nly list tables 
172c0 6d 61 74 63 68 69 6e 67 5c 6e 22 0a 20 20 22 20  matching\n".  " 
172d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
172e0 20 20 20 20 20 20 20 20 4c 49 4b 45 20 70 61 74          LIKE pat
172f0 74 65 72 6e 20 54 41 42 4c 45 2e 5c 6e 22 0a 20  tern TABLE.\n". 
17300 20 22 2e 74 65 73 74 63 61 73 65 20 4e 41 4d 45   ".testcase NAME
17310 20 20 20 20 20 20 20 20 20 42 65 67 69 6e 20 72           Begin r
17320 65 64 69 72 65 63 74 69 6e 67 20 6f 75 74 70 75  edirecting outpu
17330 74 20 74 6f 20 27 74 65 73 74 63 61 73 65 2d 6f  t to 'testcase-o
17340 75 74 2e 74 78 74 27 5c 6e 22 0a 20 20 22 2e 74  ut.txt'\n".  ".t
17350 69 6d 65 6f 75 74 20 4d 53 20 20 20 20 20 20 20  imeout MS       
17360 20 20 20 20 20 54 72 79 20 6f 70 65 6e 69 6e 67       Try opening
17370 20 6c 6f 63 6b 65 64 20 74 61 62 6c 65 73 20 66   locked tables f
17380 6f 72 20 4d 53 20 6d 69 6c 6c 69 73 65 63 6f 6e  or MS millisecon
17390 64 73 5c 6e 22 0a 20 20 22 2e 74 69 6d 65 72 20  ds\n".  ".timer 
173a0 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20  on|off          
173b0 54 75 72 6e 20 53 51 4c 20 74 69 6d 65 72 20 6f  Turn SQL timer o
173c0 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20 22 2e  n or off\n".  ".
173d0 74 72 61 63 65 20 46 49 4c 45 7c 6f 66 66 20 20  trace FILE|off  
173e0 20 20 20 20 20 20 4f 75 74 70 75 74 20 65 61 63        Output eac
173f0 68 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  h SQL statement 
17400 61 73 20 69 74 20 69 73 20 72 75 6e 5c 6e 22 0a  as it is run\n".
17410 20 20 22 2e 76 66 73 69 6e 66 6f 20 3f 41 55 58    ".vfsinfo ?AUX
17420 3f 20 20 20 20 20 20 20 20 20 49 6e 66 6f 72 6d  ?         Inform
17430 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
17440 74 6f 70 2d 6c 65 76 65 6c 20 56 46 53 5c 6e 22  top-level VFS\n"
17450 0a 20 20 22 2e 76 66 73 6c 69 73 74 20 20 20 20  .  ".vfslist    
17460 20 20 20 20 20 20 20 20 20 20 20 4c 69 73 74 20             List 
17470 61 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 56 46  all available VF
17480 53 65 73 5c 6e 22 0a 20 20 22 2e 76 66 73 6e 61  Ses\n".  ".vfsna
17490 6d 65 20 3f 41 55 58 3f 20 20 20 20 20 20 20 20  me ?AUX?        
174a0 20 50 72 69 6e 74 20 74 68 65 20 6e 61 6d 65 20   Print the name 
174b0 6f 66 20 74 68 65 20 56 46 53 20 73 74 61 63 6b  of the VFS stack
174c0 5c 6e 22 0a 20 20 22 2e 77 69 64 74 68 20 4e 55  \n".  ".width NU
174d0 4d 31 20 4e 55 4d 32 20 2e 2e 2e 20 20 20 53 65  M1 NUM2 ...   Se
174e0 74 20 63 6f 6c 75 6d 6e 20 77 69 64 74 68 73 20  t column widths 
174f0 66 6f 72 20 5c 22 63 6f 6c 75 6d 6e 5c 22 20 6d  for \"column\" m
17500 6f 64 65 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  ode\n".  "      
17510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17520 20 20 20 4e 65 67 61 74 69 76 65 20 76 61 6c 75     Negative valu
17530 65 73 20 72 69 67 68 74 2d 6a 75 73 74 69 66 79  es right-justify
17540 5c 6e 22 0a 3b 0a 0a 23 69 66 20 64 65 66 69 6e  \n".;..#if defin
17550 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
17560 5f 53 45 53 53 49 4f 4e 29 0a 2f 2a 0a 2a 2a 20  _SESSION)./*.** 
17570 50 72 69 6e 74 20 68 65 6c 70 20 69 6e 66 6f 72  Print help infor
17580 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 22  mation for the "
17590 2e 73 65 73 73 69 6f 6e 73 22 20 63 6f 6d 6d 61  .sessions" comma
175a0 6e 64 0a 2a 2f 0a 76 6f 69 64 20 73 65 73 73 69  nd.*/.void sessi
175b0 6f 6e 5f 68 65 6c 70 28 53 68 65 6c 6c 53 74 61  on_help(ShellSta
175c0 74 65 20 2a 70 29 7b 0a 20 20 72 61 77 5f 70 72  te *p){.  raw_pr
175d0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 0a 20 20 20  intf(p->out,.   
175e0 20 22 2e 73 65 73 73 69 6f 6e 20 3f 4e 41 4d 45   ".session ?NAME
175f0 3f 20 53 55 42 43 4f 4d 4d 41 4e 44 20 3f 41 52  ? SUBCOMMAND ?AR
17600 47 53 2e 2e 2e 3f 5c 6e 22 0a 20 20 20 20 22 49  GS...?\n".    "I
17610 66 20 3f 4e 41 4d 45 3f 20 69 73 20 6f 6d 69 74  f ?NAME? is omit
17620 74 65 64 2c 20 74 68 65 20 66 69 72 73 74 20 64  ted, the first d
17630 65 66 69 6e 65 64 20 73 65 73 73 69 6f 6e 20 69  efined session i
17640 73 20 75 73 65 64 2e 5c 6e 22 0a 20 20 20 20 22  s used.\n".    "
17650 53 75 62 63 6f 6d 6d 61 6e 64 73 3a 5c 6e 22 0a  Subcommands:\n".
17660 20 20 20 20 22 20 20 20 61 74 74 61 63 68 20 54      "   attach T
17670 41 42 4c 45 20 20 20 20 20 20 20 20 20 20 20 20  ABLE            
17680 20 41 74 74 61 63 68 20 54 41 42 4c 45 5c 6e 22   Attach TABLE\n"
17690 0a 20 20 20 20 22 20 20 20 63 68 61 6e 67 65 73  .    "   changes
176a0 65 74 20 46 49 4c 45 20 20 20 20 20 20 20 20 20  et FILE         
176b0 20 20 57 72 69 74 65 20 61 20 63 68 61 6e 67 65    Write a change
176c0 73 65 74 20 69 6e 74 6f 20 46 49 4c 45 5c 6e 22  set into FILE\n"
176d0 0a 20 20 20 20 22 20 20 20 63 6c 6f 73 65 20 20  .    "   close  
176e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
176f0 20 20 43 6c 6f 73 65 20 6f 6e 65 20 73 65 73 73    Close one sess
17700 69 6f 6e 5c 6e 22 0a 20 20 20 20 22 20 20 20 65  ion\n".    "   e
17710 6e 61 62 6c 65 20 3f 42 4f 4f 4c 45 41 4e 3f 20  nable ?BOOLEAN? 
17720 20 20 20 20 20 20 20 20 53 65 74 20 6f 72 20 71          Set or q
17730 75 65 72 79 20 74 68 65 20 65 6e 61 62 6c 65 20  uery the enable 
17740 62 69 74 5c 6e 22 0a 20 20 20 20 22 20 20 20 66  bit\n".    "   f
17750 69 6c 74 65 72 20 47 4c 4f 42 2e 2e 2e 20 20 20  ilter GLOB...   
17760 20 20 20 20 20 20 20 20 52 65 6a 65 63 74 20 74          Reject t
17770 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67 20 47  ables matching G
17780 4c 4f 42 73 5c 6e 22 0a 20 20 20 20 22 20 20 20  LOBs\n".    "   
17790 69 6e 64 69 72 65 63 74 20 3f 42 4f 4f 4c 45 41  indirect ?BOOLEA
177a0 4e 3f 20 20 20 20 20 20 20 4d 61 72 6b 20 6f 72  N?       Mark or
177b0 20 71 75 65 72 79 20 74 68 65 20 69 6e 64 69 72   query the indir
177c0 65 63 74 20 73 74 61 74 75 73 5c 6e 22 0a 20 20  ect status\n".  
177d0 20 20 22 20 20 20 69 73 65 6d 70 74 79 20 20 20    "   isempty   
177e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 51                 Q
177f0 75 65 72 79 20 77 68 65 74 68 65 72 20 74 68 65  uery whether the
17800 20 73 65 73 73 69 6f 6e 20 69 73 20 65 6d 70 74   session is empt
17810 79 5c 6e 22 0a 20 20 20 20 22 20 20 20 6c 69 73  y\n".    "   lis
17820 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
17830 20 20 20 20 20 20 4c 69 73 74 20 63 75 72 72 65        List curre
17840 6e 74 6c 79 20 6f 70 65 6e 20 73 65 73 73 69 6f  ntly open sessio
17850 6e 20 6e 61 6d 65 73 5c 6e 22 0a 20 20 20 20 22  n names\n".    "
17860 20 20 20 6f 70 65 6e 20 44 42 20 4e 41 4d 45 20     open DB NAME 
17870 20 20 20 20 20 20 20 20 20 20 20 20 4f 70 65 6e              Open
17880 20 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20 6f   a new session o
17890 6e 20 44 42 5c 6e 22 0a 20 20 20 20 22 20 20 20  n DB\n".    "   
178a0 70 61 74 63 68 73 65 74 20 46 49 4c 45 20 20 20  patchset FILE   
178b0 20 20 20 20 20 20 20 20 20 57 72 69 74 65 20 61           Write a
178c0 20 70 61 74 63 68 73 65 74 20 69 6e 74 6f 20 46   patchset into F
178d0 49 4c 45 5c 6e 22 0a 20 20 29 3b 0a 7d 0a 23 65  ILE\n".  );.}.#e
178e0 6e 64 69 66 0a 0a 0a 2f 2a 20 46 6f 72 77 61 72  ndif.../* Forwar
178f0 64 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73  d reference */.s
17900 74 61 74 69 63 20 69 6e 74 20 70 72 6f 63 65 73  tatic int proces
17910 73 5f 69 6e 70 75 74 28 53 68 65 6c 6c 53 74 61  s_input(ShellSta
17920 74 65 20 2a 70 2c 20 46 49 4c 45 20 2a 69 6e 29  te *p, FILE *in)
17930 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68  ;../*.** Read th
17940 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69 6c  e content of fil
17950 65 20 7a 4e 61 6d 65 20 69 6e 74 6f 20 6d 65 6d  e zName into mem
17960 6f 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f  ory obtained fro
17970 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
17980 36 34 28 29 0a 2a 2a 20 61 6e 64 20 72 65 74 75  64().** and retu
17990 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
179a0 74 68 65 20 62 75 66 66 65 72 2e 20 54 68 65 20  the buffer. The 
179b0 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e  caller is respon
179c0 73 69 62 6c 65 20 66 6f 72 20 66 72 65 65 69 6e  sible for freein
179d0 67 0a 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 2e  g.** the memory.
179e0 0a 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65  .**.** If parame
179f0 74 65 72 20 70 6e 42 79 74 65 20 69 73 20 6e 6f  ter pnByte is no
17a00 74 20 4e 55 4c 4c 2c 20 28 2a 70 6e 42 79 74 65  t NULL, (*pnByte
17a10 29 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  ) is set to the 
17a20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 0a  number of bytes.
17a30 2a 2a 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46  ** read..**.** F
17a40 6f 72 20 63 6f 6e 76 65 6e 69 65 6e 63 65 2c 20  or convenience, 
17a50 61 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72  a nul-terminator
17a60 20 62 79 74 65 20 69 73 20 61 6c 77 61 79 73 20   byte is always 
17a70 61 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20  appended to the 
17a80 64 61 74 61 20 72 65 61 64 0a 2a 2a 20 66 72 6f  data read.** fro
17a90 6d 20 74 68 65 20 66 69 6c 65 20 62 65 66 6f 72  m the file befor
17aa0 65 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20  e the buffer is 
17ab0 72 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 62  returned. This b
17ac0 79 74 65 20 69 73 20 6e 6f 74 20 69 6e 63 6c 75  yte is not inclu
17ad0 64 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69  ded in.** the fi
17ae0 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 28 2a 70  nal value of (*p
17af0 6e 42 79 74 65 29 2c 20 69 66 20 61 70 70 6c 69  nByte), if appli
17b00 63 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 55 4c  cable..**.** NUL
17b10 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  L is returned if
17b20 20 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e   any error is en
17b30 63 6f 75 6e 74 65 72 65 64 2e 20 54 68 65 20 66  countered. The f
17b40 69 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 2a 70  inal value of *p
17b50 6e 42 79 74 65 0a 2a 2a 20 69 73 20 75 6e 64 65  nByte.** is unde
17b60 66 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61  fined in this ca
17b70 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  se..*/.static ch
17b80 61 72 20 2a 72 65 61 64 46 69 6c 65 28 63 6f 6e  ar *readFile(con
17b90 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
17ba0 69 6e 74 20 2a 70 6e 42 79 74 65 29 7b 0a 20 20  int *pnByte){.  
17bb0 46 49 4c 45 20 2a 69 6e 20 3d 20 66 6f 70 65 6e  FILE *in = fopen
17bc0 28 7a 4e 61 6d 65 2c 20 22 72 62 22 29 3b 0a 20  (zName, "rb");. 
17bd0 20 6c 6f 6e 67 20 6e 49 6e 3b 0a 20 20 73 69 7a   long nIn;.  siz
17be0 65 5f 74 20 6e 52 65 61 64 3b 0a 20 20 63 68 61  e_t nRead;.  cha
17bf0 72 20 2a 70 42 75 66 3b 0a 20 20 69 66 28 20 69  r *pBuf;.  if( i
17c00 6e 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  n==0 ) return 0;
17c10 0a 20 20 66 73 65 65 6b 28 69 6e 2c 20 30 2c 20  .  fseek(in, 0, 
17c20 53 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 6e 49 6e  SEEK_END);.  nIn
17c30 20 3d 20 66 74 65 6c 6c 28 69 6e 29 3b 0a 20 20   = ftell(in);.  
17c40 72 65 77 69 6e 64 28 69 6e 29 3b 0a 20 20 70 42  rewind(in);.  pB
17c50 75 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  uf = sqlite3_mal
17c60 6c 6f 63 36 34 28 20 6e 49 6e 2b 31 20 29 3b 0a  loc64( nIn+1 );.
17c70 20 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29 20    if( pBuf==0 ) 
17c80 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 52 65 61  return 0;.  nRea
17c90 64 20 3d 20 66 72 65 61 64 28 70 42 75 66 2c 20  d = fread(pBuf, 
17ca0 6e 49 6e 2c 20 31 2c 20 69 6e 29 3b 0a 20 20 66  nIn, 1, in);.  f
17cb0 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 69 66 28  close(in);.  if(
17cc0 20 6e 52 65 61 64 21 3d 31 20 29 7b 0a 20 20 20   nRead!=1 ){.   
17cd0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42   sqlite3_free(pB
17ce0 75 66 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  uf);.    return 
17cf0 30 3b 0a 20 20 7d 0a 20 20 70 42 75 66 5b 6e 49  0;.  }.  pBuf[nI
17d00 6e 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 6e  n] = 0;.  if( pn
17d10 42 79 74 65 20 29 20 2a 70 6e 42 79 74 65 20 3d  Byte ) *pnByte =
17d20 20 6e 49 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70   nIn;.  return p
17d30 42 75 66 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69  Buf;.}..#if defi
17d40 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
17d50 45 5f 53 45 53 53 49 4f 4e 29 0a 2f 2a 0a 2a 2a  E_SESSION)./*.**
17d60 20 43 6c 6f 73 65 20 61 20 73 69 6e 67 6c 65 20   Close a single 
17d70 4f 70 65 6e 53 65 73 73 69 6f 6e 20 6f 62 6a 65  OpenSession obje
17d80 63 74 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61  ct and release a
17d90 6c 6c 20 6f 66 20 69 74 73 20 61 73 73 6f 63 69  ll of its associ
17da0 61 74 65 64 0a 2a 2a 20 72 65 73 6f 75 72 63 65  ated.** resource
17db0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
17dc0 64 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 28  d session_close(
17dd0 4f 70 65 6e 53 65 73 73 69 6f 6e 20 2a 70 53 65  OpenSession *pSe
17de0 73 73 69 6f 6e 29 7b 0a 20 20 69 6e 74 20 69 3b  ssion){.  int i;
17df0 0a 20 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f  .  sqlite3sessio
17e00 6e 5f 64 65 6c 65 74 65 28 70 53 65 73 73 69 6f  n_delete(pSessio
17e10 6e 2d 3e 70 29 3b 0a 20 20 73 71 6c 69 74 65 33  n->p);.  sqlite3
17e20 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e  _free(pSession->
17e30 7a 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d  zName);.  for(i=
17e40 30 3b 20 69 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e  0; i<pSession->n
17e50 46 69 6c 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20  Filter; i++){.  
17e60 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
17e70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65  Session->azFilte
17e80 72 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c  r[i]);.  }.  sql
17e90 69 74 65 33 5f 66 72 65 65 28 70 53 65 73 73 69  ite3_free(pSessi
17ea0 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 29 3b 0a 20  on->azFilter);. 
17eb0 20 6d 65 6d 73 65 74 28 70 53 65 73 73 69 6f 6e   memset(pSession
17ec0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 4f 70 65 6e  , 0, sizeof(Open
17ed0 53 65 73 73 69 6f 6e 29 29 3b 0a 7d 0a 23 65 6e  Session));.}.#en
17ee0 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65  dif../*.** Close
17ef0 20 61 6c 6c 20 4f 70 65 6e 53 65 73 73 69 6f 6e   all OpenSession
17f00 20 6f 62 6a 65 63 74 73 20 61 6e 64 20 72 65 6c   objects and rel
17f10 65 61 73 65 20 61 6c 6c 20 61 73 73 6f 63 69 61  ease all associa
17f20 74 65 64 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a  ted resources..*
17f30 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  /.#if defined(SQ
17f40 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53  LITE_ENABLE_SESS
17f50 49 4f 4e 29 0a 73 74 61 74 69 63 20 76 6f 69 64  ION).static void
17f60 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61   session_close_a
17f70 6c 6c 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  ll(ShellState *p
17f80 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  ){.  int i;.  fo
17f90 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 65 73  r(i=0; i<p->nSes
17fa0 73 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  sion; i++){.    
17fb0 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 28 26 70  session_close(&p
17fc0 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 5d 29 3b 0a  ->aSession[i]);.
17fd0 20 20 7d 0a 20 20 70 2d 3e 6e 53 65 73 73 69 6f    }.  p->nSessio
17fe0 6e 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23  n = 0;.}.#else.#
17ff0 20 64 65 66 69 6e 65 20 73 65 73 73 69 6f 6e 5f   define session_
18000 63 6c 6f 73 65 5f 61 6c 6c 28 58 29 0a 23 65 6e  close_all(X).#en
18010 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  dif../*.** Imple
18020 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65  mentation of the
18030 20 78 46 69 6c 74 65 72 20 66 75 6e 63 74 69 6f   xFilter functio
18040 6e 20 66 6f 72 20 61 6e 20 6f 70 65 6e 20 73 65  n for an open se
18050 73 73 69 6f 6e 2e 20 20 4f 6d 69 74 0a 2a 2a 20  ssion.  Omit.** 
18060 61 6e 79 20 74 61 62 6c 65 73 20 6e 61 6d 65 64  any tables named
18070 20 62 79 20 22 2e 73 65 73 73 69 6f 6e 20 66 69   by ".session fi
18080 6c 74 65 72 22 20 62 75 74 20 6c 65 74 20 61 6c  lter" but let al
18090 6c 20 6f 74 68 65 72 20 74 61 62 6c 65 20 74 68  l other table th
180a0 72 6f 75 67 68 2e 0a 2a 2f 0a 23 69 66 20 64 65  rough..*/.#if de
180b0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41  fined(SQLITE_ENA
180c0 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 73 74 61  BLE_SESSION).sta
180d0 74 69 63 20 69 6e 74 20 73 65 73 73 69 6f 6e 5f  tic int session_
180e0 66 69 6c 74 65 72 28 76 6f 69 64 20 2a 70 43 74  filter(void *pCt
180f0 78 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  x, const char *z
18100 54 61 62 29 7b 0a 20 20 4f 70 65 6e 53 65 73 73  Tab){.  OpenSess
18110 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 20 3d 20  ion *pSession = 
18120 28 4f 70 65 6e 53 65 73 73 69 6f 6e 2a 29 70 43  (OpenSession*)pC
18130 74 78 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66  tx;.  int i;.  f
18140 6f 72 28 69 3d 30 3b 20 69 3c 70 53 65 73 73 69  or(i=0; i<pSessi
18150 6f 6e 2d 3e 6e 46 69 6c 74 65 72 3b 20 69 2b 2b  on->nFilter; i++
18160 29 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  ){.    if( sqlit
18170 65 33 5f 73 74 72 67 6c 6f 62 28 70 53 65 73 73  e3_strglob(pSess
18180 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 69 5d  ion->azFilter[i]
18190 2c 20 7a 54 61 62 29 3d 3d 30 20 29 20 72 65 74  , zTab)==0 ) ret
181a0 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  urn 0;.  }.  ret
181b0 75 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 1;.}.#endif.
181c0 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 64 65  ./*.** Try to de
181d0 64 75 63 65 20 74 68 65 20 74 79 70 65 20 6f 66  duce the type of
181e0 20 66 69 6c 65 20 66 6f 72 20 7a 4e 61 6d 65 20   file for zName 
181f0 62 61 73 65 64 20 6f 6e 20 69 74 73 20 63 6f 6e  based on its con
18200 74 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a  tent.  Return.**
18210 20 6f 6e 65 20 6f 66 20 74 68 65 20 53 48 45 4c   one of the SHEL
18220 4c 5f 4f 50 45 4e 5f 2a 20 63 6f 6e 73 74 61 6e  L_OPEN_* constan
18230 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ts..*/.static in
18240 74 20 64 65 64 75 63 65 44 61 74 61 62 61 73 65  t deduceDatabase
18250 54 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20  Type(const char 
18260 2a 7a 4e 61 6d 65 29 7b 0a 20 20 46 49 4c 45 20  *zName){.  FILE 
18270 2a 66 20 3d 20 66 6f 70 65 6e 28 7a 4e 61 6d 65  *f = fopen(zName
18280 2c 20 22 72 62 22 29 3b 0a 20 20 73 69 7a 65 5f  , "rb");.  size_
18290 74 20 6e 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20  t n;.  int rc = 
182a0 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45  SHELL_OPEN_UNSPE
182b0 43 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31  C;.  char zBuf[1
182c0 30 30 5d 3b 0a 20 20 69 66 28 20 66 3d 3d 30 20  00];.  if( f==0 
182d0 29 20 72 65 74 75 72 6e 20 53 48 45 4c 4c 5f 4f  ) return SHELL_O
182e0 50 45 4e 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 66 73  PEN_NORMAL;.  fs
182f0 65 65 6b 28 66 2c 20 2d 32 35 2c 20 53 45 45 4b  eek(f, -25, SEEK
18300 5f 45 4e 44 29 3b 0a 20 20 6e 20 3d 20 66 72 65  _END);.  n = fre
18310 61 64 28 7a 42 75 66 2c 20 32 35 2c 20 31 2c 20  ad(zBuf, 25, 1, 
18320 66 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 31 20 26  f);.  if( n==1 &
18330 26 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20 22  & memcmp(zBuf, "
18340 53 74 61 72 74 2d 4f 66 2d 53 51 4c 69 74 65 33  Start-Of-SQLite3
18350 2d 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20  -", 17)==0 ){.  
18360 20 20 72 63 20 3d 20 53 48 45 4c 4c 5f 4f 50 45    rc = SHELL_OPE
18370 4e 5f 41 50 50 45 4e 44 56 46 53 3b 0a 20 20 7d  N_APPENDVFS;.  }
18380 65 6c 73 65 7b 0a 20 20 20 20 66 73 65 65 6b 28  else{.    fseek(
18390 66 2c 20 2d 32 32 2c 20 53 45 45 4b 5f 45 4e 44  f, -22, SEEK_END
183a0 29 3b 0a 20 20 20 20 6e 20 3d 20 66 72 65 61 64  );.    n = fread
183b0 28 7a 42 75 66 2c 20 32 32 2c 20 31 2c 20 66 29  (zBuf, 22, 1, f)
183c0 3b 0a 20 20 20 20 69 66 28 20 6e 3d 3d 31 20 26  ;.    if( n==1 &
183d0 26 20 7a 42 75 66 5b 30 5d 3d 3d 30 78 35 30 20  & zBuf[0]==0x50 
183e0 26 26 20 7a 42 75 66 5b 31 5d 3d 3d 30 78 34 62  && zBuf[1]==0x4b
183f0 20 26 26 20 7a 42 75 66 5b 32 5d 3d 3d 30 78 30   && zBuf[2]==0x0
18400 35 0a 20 20 20 20 20 20 20 26 26 20 7a 42 75 66  5.       && zBuf
18410 5b 33 5d 3d 3d 30 78 30 36 20 29 7b 0a 20 20 20  [3]==0x06 ){.   
18420 20 20 20 72 63 20 3d 20 53 48 45 4c 4c 5f 4f 50     rc = SHELL_OP
18430 45 4e 5f 5a 49 50 46 49 4c 45 3b 0a 20 20 20 20  EN_ZIPFILE;.    
18440 7d 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66  }.  }.  fclose(f
18450 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20  );.  return rc; 
18460 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20   .}../*.** Make 
18470 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73  sure the databas
18480 65 20 69 73 20 6f 70 65 6e 2e 20 20 49 66 20 69  e is open.  If i
18490 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 6f  t is not, then o
184a0 70 65 6e 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74  pen it.  If.** t
184b0 68 65 20 64 61 74 61 62 61 73 65 20 66 61 69 6c  he database fail
184c0 73 20 74 6f 20 6f 70 65 6e 2c 20 70 72 69 6e 74  s to open, print
184d0 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
184e0 65 20 61 6e 64 20 65 78 69 74 2e 0a 2a 2f 0a 73  e and exit..*/.s
184f0 74 61 74 69 63 20 76 6f 69 64 20 6f 70 65 6e 5f  tatic void open_
18500 64 62 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  db(ShellState *p
18510 2c 20 69 6e 74 20 6b 65 65 70 41 6c 69 76 65 29  , int keepAlive)
18520 7b 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30  {.  if( p->db==0
18530 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
18540 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20  initialize();.  
18550 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64    if( p->openMod
18560 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e  e==SHELL_OPEN_UN
18570 53 50 45 43 20 26 26 20 61 63 63 65 73 73 28 70  SPEC && access(p
18580 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 30 29  ->zDbFilename,0)
18590 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
185a0 6f 70 65 6e 4d 6f 64 65 20 3d 20 64 65 64 75 63  openMode = deduc
185b0 65 44 61 74 61 62 61 73 65 54 79 70 65 28 70 2d  eDatabaseType(p-
185c0 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  >zDbFilename);. 
185d0 20 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28     }.    switch(
185e0 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 29 7b 0a   p->openMode ){.
185f0 20 20 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c        case SHELL
18600 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 3a  _OPEN_APPENDVFS:
18610 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   {.        sqlit
18620 65 33 5f 6f 70 65 6e 5f 76 32 28 70 2d 3e 7a 44  e3_open_v2(p->zD
18630 62 46 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e 64  bFilename, &p->d
18640 62 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 53  b, .           S
18650 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57  QLITE_OPEN_READW
18660 52 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e  RITE|SQLITE_OPEN
18670 5f 43 52 45 41 54 45 2c 20 22 61 70 6e 64 76 66  _CREATE, "apndvf
18680 73 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  s");.        bre
18690 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
186a0 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45    case SHELL_OPE
186b0 4e 5f 5a 49 50 46 49 4c 45 3a 20 7b 0a 20 20 20  N_ZIPFILE: {.   
186c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65       sqlite3_ope
186d0 6e 28 22 3a 6d 65 6d 6f 72 79 3a 22 2c 20 26 70  n(":memory:", &p
186e0 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 62  ->db);.        b
186f0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
18700 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f      case SHELL_O
18710 50 45 4e 5f 55 4e 53 50 45 43 3a 0a 20 20 20 20  PEN_UNSPEC:.    
18720 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45    case SHELL_OPE
18730 4e 5f 4e 4f 52 4d 41 4c 3a 20 7b 0a 20 20 20 20  N_NORMAL: {.    
18740 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e      sqlite3_open
18750 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c  (p->zDbFilename,
18760 20 26 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20   &p->db);.      
18770 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
18780 0a 20 20 20 20 7d 0a 20 20 20 20 67 6c 6f 62 61  .    }.    globa
18790 6c 44 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20  lDb = p->db;.   
187a0 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c   if( p->db==0 ||
187b0 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69   SQLITE_OK!=sqli
187c0 74 65 33 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64  te3_errcode(p->d
187d0 62 29 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  b) ){.      utf8
187e0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  _printf(stderr,"
187f0 45 72 72 6f 72 3a 20 75 6e 61 62 6c 65 20 74 6f  Error: unable to
18800 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 5c   open database \
18810 22 25 73 5c 22 3a 20 25 73 5c 6e 22 2c 0a 20 20  "%s\": %s\n",.  
18820 20 20 20 20 20 20 20 20 70 2d 3e 7a 44 62 46 69          p->zDbFi
18830 6c 65 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 5f  lename, sqlite3_
18840 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a  errmsg(p->db));.
18850 20 20 20 20 20 20 69 66 28 20 6b 65 65 70 41 6c        if( keepAl
18860 69 76 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ive ) return;.  
18870 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20      exit(1);.   
18880 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
18890 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45  E_OMIT_LOAD_EXTE
188a0 4e 53 49 4f 4e 0a 20 20 20 20 73 71 6c 69 74 65  NSION.    sqlite
188b0 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78  3_enable_load_ex
188c0 74 65 6e 73 69 6f 6e 28 70 2d 3e 64 62 2c 20 31  tension(p->db, 1
188d0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71  );.#endif.    sq
188e0 6c 69 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e 69  lite3_fileio_ini
188f0 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a  t(p->db, 0, 0);.
18900 20 20 20 20 73 71 6c 69 74 65 33 5f 73 68 61 74      sqlite3_shat
18910 68 72 65 65 5f 69 6e 69 74 28 70 2d 3e 64 62 2c  hree_init(p->db,
18920 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
18930 74 65 33 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 69  te3_completion_i
18940 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29  nit(p->db, 0, 0)
18950 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
18960 48 41 56 45 5f 5a 4c 49 42 0a 20 20 20 20 73 71  HAVE_ZLIB.    sq
18970 6c 69 74 65 33 5f 7a 69 70 66 69 6c 65 5f 69 6e  lite3_zipfile_in
18980 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b  it(p->db, 0, 0);
18990 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 71 6c  .    sqlite3_sql
189a0 61 72 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30  ar_init(p->db, 0
189b0 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  , 0);.#endif.   
189c0 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
189d0 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20  function(p->db, 
189e0 22 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68 65 6d  "shell_add_schem
189f0 61 22 2c 20 33 2c 20 53 51 4c 49 54 45 5f 55 54  a", 3, SQLITE_UT
18a00 46 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20  F8, 0,.         
18a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a20 20 20 20 73 68 65 6c 6c 41 64 64 53 63 68 65 6d     shellAddSchem
18a30 61 4e 61 6d 65 2c 20 30 2c 20 30 29 3b 0a 20 20  aName, 0, 0);.  
18a40 20 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65    sqlite3_create
18a50 5f 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c  _function(p->db,
18a60 20 22 73 68 65 6c 6c 5f 6d 6f 64 75 6c 65 5f 73   "shell_module_s
18a70 63 68 65 6d 61 22 2c 20 31 2c 20 53 51 4c 49 54  chema", 1, SQLIT
18a80 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20  E_UTF8, 0,.     
18a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18aa0 20 20 20 20 20 20 20 73 68 65 6c 6c 4d 6f 64 75         shellModu
18ab0 6c 65 53 63 68 65 6d 61 2c 20 30 2c 20 30 29 3b  leSchema, 0, 0);
18ac0 0a 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e  .    if( p->open
18ad0 4d 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e  Mode==SHELL_OPEN
18ae0 5f 5a 49 50 46 49 4c 45 20 29 7b 0a 20 20 20 20  _ZIPFILE ){.    
18af0 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73    char *zSql = s
18b00 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
18b10 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45           "CREATE
18b20 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 7a   VIRTUAL TABLE z
18b30 69 70 20 55 53 49 4e 47 20 7a 69 70 66 69 6c 65  ip USING zipfile
18b40 28 25 51 29 3b 22 2c 20 70 2d 3e 7a 44 62 46 69  (%Q);", p->zDbFi
18b50 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73  lename);.      s
18b60 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
18b70 62 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30  b, zSql, 0, 0, 0
18b80 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18b90 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20  _free(zSql);.   
18ba0 20 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 48 41   }.  }.}..#if HA
18bb0 56 45 5f 52 45 41 44 4c 49 4e 45 20 7c 7c 20 48  VE_READLINE || H
18bc0 41 56 45 5f 45 44 49 54 4c 49 4e 45 0a 2f 2a 0a  AVE_EDITLINE./*.
18bd0 2a 2a 20 52 65 61 64 6c 69 6e 65 20 63 6f 6d 70  ** Readline comp
18be0 6c 65 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 73  letion callbacks
18bf0 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
18c00 2a 72 65 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65  *readline_comple
18c10 74 69 6f 6e 5f 67 65 6e 65 72 61 74 6f 72 28 63  tion_generator(c
18c20 6f 6e 73 74 20 63 68 61 72 20 2a 74 65 78 74 2c  onst char *text,
18c30 20 69 6e 74 20 73 74 61 74 65 29 7b 0a 20 20 73   int state){.  s
18c40 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 74  tatic sqlite3_st
18c50 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
18c60 20 63 68 61 72 20 2a 7a 52 65 74 3b 0a 20 20 69   char *zRet;.  i
18c70 66 28 20 73 74 61 74 65 3d 3d 30 20 29 7b 0a 20  f( state==0 ){. 
18c80 20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20     char *zSql;. 
18c90 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
18ca0 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
18cb0 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
18cc0 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 44  printf("SELECT D
18cd0 49 53 54 49 4e 43 54 20 63 61 6e 64 69 64 61 74  ISTINCT candidat
18ce0 65 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65  e COLLATE nocase
18cf0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
18d00 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
18d10 46 52 4f 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e 28  FROM completion(
18d20 25 51 29 20 4f 52 44 45 52 20 42 59 20 31 22 2c  %Q) ORDER BY 1",
18d30 20 74 65 78 74 29 3b 0a 20 20 20 20 73 71 6c 69   text);.    sqli
18d40 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 67  te3_prepare_v2(g
18d50 6c 6f 62 61 6c 44 62 2c 20 7a 53 71 6c 2c 20 2d  lobalDb, zSql, -
18d60 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
18d70 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
18d80 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28  zSql);.  }.  if(
18d90 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
18da0 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
18db0 20 29 7b 0a 20 20 20 20 7a 52 65 74 20 3d 20 73   ){.    zRet = s
18dc0 74 72 64 75 70 28 28 63 6f 6e 73 74 20 63 68 61  trdup((const cha
18dd0 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
18de0 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29  n_text(pStmt, 0)
18df0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
18e00 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
18e10 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 53 74  (pStmt);.    pSt
18e20 6d 74 20 3d 20 30 3b 0a 20 20 20 20 7a 52 65 74  mt = 0;.    zRet
18e30 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
18e40 72 6e 20 7a 52 65 74 3b 0a 7d 0a 73 74 61 74 69  rn zRet;.}.stati
18e50 63 20 63 68 61 72 20 2a 2a 72 65 61 64 6c 69 6e  c char **readlin
18e60 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 28 63 6f 6e  e_completion(con
18e70 73 74 20 63 68 61 72 20 2a 7a 54 65 78 74 2c 20  st char *zText, 
18e80 69 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20  int iStart, int 
18e90 69 45 6e 64 29 7b 0a 20 20 72 6c 5f 61 74 74 65  iEnd){.  rl_atte
18ea0 6d 70 74 65 64 5f 63 6f 6d 70 6c 65 74 69 6f 6e  mpted_completion
18eb0 5f 6f 76 65 72 20 3d 20 31 3b 0a 20 20 72 65 74  _over = 1;.  ret
18ec0 75 72 6e 20 72 6c 5f 63 6f 6d 70 6c 65 74 69 6f  urn rl_completio
18ed0 6e 5f 6d 61 74 63 68 65 73 28 7a 54 65 78 74 2c  n_matches(zText,
18ee0 20 72 65 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65   readline_comple
18ef0 74 69 6f 6e 5f 67 65 6e 65 72 61 74 6f 72 29 3b  tion_generator);
18f00 0a 7d 0a 0a 23 65 6c 69 66 20 48 41 56 45 5f 4c  .}..#elif HAVE_L
18f10 49 4e 45 4e 4f 49 53 45 0a 2f 2a 0a 2a 2a 20 4c  INENOISE./*.** L
18f20 69 6e 65 6e 6f 69 73 65 20 63 6f 6d 70 6c 65 74  inenoise complet
18f30 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 0a 2a 2f 0a  ion callback.*/.
18f40 73 74 61 74 69 63 20 76 6f 69 64 20 6c 69 6e 65  static void line
18f50 6e 6f 69 73 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e  noise_completion
18f60 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69  (const char *zLi
18f70 6e 65 2c 20 6c 69 6e 65 6e 6f 69 73 65 43 6f 6d  ne, linenoiseCom
18f80 70 6c 65 74 69 6f 6e 73 20 2a 6c 63 29 7b 0a 20  pletions *lc){. 
18f90 20 69 6e 74 20 6e 4c 69 6e 65 20 3d 20 73 74 72   int nLine = str
18fa0 6c 65 6e 33 30 28 7a 4c 69 6e 65 29 3b 0a 20 20  len30(zLine);.  
18fb0 69 6e 74 20 69 2c 20 69 53 74 61 72 74 3b 0a 20  int i, iStart;. 
18fc0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
18fd0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72  Stmt = 0;.  char
18fe0 20 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20 7a   *zSql;.  char z
18ff0 42 75 66 5b 31 30 30 30 5d 3b 0a 0a 20 20 69 66  Buf[1000];..  if
19000 28 20 6e 4c 69 6e 65 3e 73 69 7a 65 6f 66 28 7a  ( nLine>sizeof(z
19010 42 75 66 29 2d 33 30 20 29 20 72 65 74 75 72 6e  Buf)-30 ) return
19020 3b 0a 20 20 69 66 28 20 7a 4c 69 6e 65 5b 30 5d  ;.  if( zLine[0]
19030 3d 3d 27 2e 27 20 29 20 72 65 74 75 72 6e 3b 0a  =='.' ) return;.
19040 20 20 66 6f 72 28 69 3d 6e 4c 69 6e 65 2d 31 3b    for(i=nLine-1;
19050 20 69 3e 3d 30 20 26 26 20 28 69 73 61 6c 6e 75   i>=0 && (isalnu
19060 6d 28 7a 4c 69 6e 65 5b 69 5d 29 20 7c 7c 20 7a  m(zLine[i]) || z
19070 4c 69 6e 65 5b 69 5d 3d 3d 27 5f 27 29 3b 20 69  Line[i]=='_'); i
19080 2d 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3d 3d 6e  --){}.  if( i==n
19090 4c 69 6e 65 2d 31 20 29 20 72 65 74 75 72 6e 3b  Line-1 ) return;
190a0 0a 20 20 69 53 74 61 72 74 20 3d 20 69 2b 31 3b  .  iStart = i+1;
190b0 0a 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20  .  memcpy(zBuf, 
190c0 7a 4c 69 6e 65 2c 20 69 53 74 61 72 74 29 3b 0a  zLine, iStart);.
190d0 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
190e0 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
190f0 20 44 49 53 54 49 4e 43 54 20 63 61 6e 64 69 64   DISTINCT candid
19100 61 74 65 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61  ate COLLATE noca
19110 73 65 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  se".            
19120 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
19130 46 52 4f 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e 28  FROM completion(
19140 25 51 2c 25 51 29 20 4f 52 44 45 52 20 42 59 20  %Q,%Q) ORDER BY 
19150 31 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  1",.            
19160 20 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 4c               &zL
19170 69 6e 65 5b 69 53 74 61 72 74 5d 2c 20 7a 4c 69  ine[iStart], zLi
19180 6e 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70  ne);.  sqlite3_p
19190 72 65 70 61 72 65 5f 76 32 28 67 6c 6f 62 61 6c  repare_v2(global
191a0 44 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70  Db, zSql, -1, &p
191b0 53 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69  Stmt, 0);.  sqli
191c0 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
191d0 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 67    sqlite3_exec(g
191e0 6c 6f 62 61 6c 44 62 2c 20 22 50 52 41 47 4d 41  lobalDb, "PRAGMA
191f0 20 70 61 67 65 5f 63 6f 75 6e 74 22 2c 20 30 2c   page_count", 0,
19200 20 30 2c 20 30 29 3b 20 2f 2a 20 4c 6f 61 64 20   0, 0); /* Load 
19210 74 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20  the schema */.  
19220 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73  while( sqlite3_s
19230 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
19240 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f  TE_ROW ){.    co
19250 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 70 6c  nst char *zCompl
19260 65 74 69 6f 6e 20 3d 20 28 63 6f 6e 73 74 20 63  etion = (const c
19270 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
19280 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
19290 30 29 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6d  0);.    int nCom
192a0 70 6c 65 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65  pletion = sqlite
192b0 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
192c0 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  Stmt, 0);.    if
192d0 28 20 69 53 74 61 72 74 2b 6e 43 6f 6d 70 6c 65  ( iStart+nComple
192e0 74 69 6f 6e 20 3c 20 73 69 7a 65 6f 66 28 7a 42  tion < sizeof(zB
192f0 75 66 29 2d 31 20 29 7b 0a 20 20 20 20 20 20 6d  uf)-1 ){.      m
19300 65 6d 63 70 79 28 7a 42 75 66 2b 69 53 74 61 72  emcpy(zBuf+iStar
19310 74 2c 20 7a 43 6f 6d 70 6c 65 74 69 6f 6e 2c 20  t, zCompletion, 
19320 6e 43 6f 6d 70 6c 65 74 69 6f 6e 2b 31 29 3b 0a  nCompletion+1);.
19330 20 20 20 20 20 20 6c 69 6e 65 6e 6f 69 73 65 41        linenoiseA
19340 64 64 43 6f 6d 70 6c 65 74 69 6f 6e 28 6c 63 2c  ddCompletion(lc,
19350 20 7a 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20   zBuf);.    }.  
19360 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  }.  sqlite3_fina
19370 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 7d 0a 23  lize(pStmt);.}.#
19380 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20  endif../*.** Do 
19390 43 2d 6c 61 6e 67 75 61 67 65 20 73 74 79 6c 65  C-language style
193a0 20 64 65 71 75 6f 74 69 6e 67 2e 0a 2a 2a 0a 2a   dequoting..**.*
193b0 2a 20 20 20 20 5c 61 20 20 20 20 2d 3e 20 61 6c  *    \a    -> al
193c0 61 72 6d 0a 2a 2a 20 20 20 20 5c 62 20 20 20 20  arm.**    \b    
193d0 2d 3e 20 62 61 63 6b 73 70 61 63 65 0a 2a 2a 20  -> backspace.** 
193e0 20 20 20 5c 74 20 20 20 20 2d 3e 20 74 61 62 0a     \t    -> tab.
193f0 2a 2a 20 20 20 20 5c 6e 20 20 20 20 2d 3e 20 6e  **    \n    -> n
19400 65 77 6c 69 6e 65 0a 2a 2a 20 20 20 20 5c 76 20  ewline.**    \v 
19410 20 20 20 2d 3e 20 76 65 72 74 69 63 61 6c 20 74     -> vertical t
19420 61 62 0a 2a 2a 20 20 20 20 5c 66 20 20 20 20 2d  ab.**    \f    -
19430 3e 20 66 6f 72 6d 20 66 65 65 64 0a 2a 2a 20 20  > form feed.**  
19440 20 20 5c 72 20 20 20 20 2d 3e 20 63 61 72 72 69    \r    -> carri
19450 61 67 65 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20  age return.**   
19460 20 5c 73 20 20 20 20 2d 3e 20 73 70 61 63 65 0a   \s    -> space.
19470 2a 2a 20 20 20 20 5c 22 20 20 20 20 2d 3e 20 22  **    \"    -> "
19480 0a 2a 2a 20 20 20 20 5c 27 20 20 20 20 2d 3e 20  .**    \'    -> 
19490 27 0a 2a 2a 20 20 20 20 5c 5c 20 20 20 20 2d 3e  '.**    \\    ->
194a0 20 62 61 63 6b 73 6c 61 73 68 0a 2a 2a 20 20 20   backslash.**   
194b0 20 5c 4e 4e 4e 20 20 2d 3e 20 61 73 63 69 69 20   \NNN  -> ascii 
194c0 63 68 61 72 61 63 74 65 72 20 4e 4e 4e 20 69 6e  character NNN in
194d0 20 6f 63 74 61 6c 0a 2a 2f 0a 73 74 61 74 69 63   octal.*/.static
194e0 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 5f 62 61   void resolve_ba
194f0 63 6b 73 6c 61 73 68 65 73 28 63 68 61 72 20 2a  ckslashes(char *
19500 7a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a  z){.  int i, j;.
19510 20 20 63 68 61 72 20 63 3b 0a 20 20 77 68 69 6c    char c;.  whil
19520 65 28 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 5c 5c  e( *z && *z!='\\
19530 27 20 29 20 7a 2b 2b 3b 0a 20 20 66 6f 72 28 69  ' ) z++;.  for(i
19540 3d 6a 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29  =j=0; (c = z[i])
19550 21 3d 30 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a  !=0; i++, j++){.
19560 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20      if( c=='\\' 
19570 26 26 20 7a 5b 69 2b 31 5d 21 3d 30 20 29 7b 0a  && z[i+1]!=0 ){.
19580 20 20 20 20 20 20 63 20 3d 20 7a 5b 2b 2b 69 5d        c = z[++i]
19590 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  ;.      if( c=='
195a0 61 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  a' ){.        c 
195b0 3d 20 27 5c 61 27 3b 0a 20 20 20 20 20 20 7d 65  = '\a';.      }e
195c0 6c 73 65 20 69 66 28 20 63 3d 3d 27 62 27 20 29  lse if( c=='b' )
195d0 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c  {.        c = '\
195e0 62 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  b';.      }else 
195f0 69 66 28 20 63 3d 3d 27 74 27 20 29 7b 0a 20 20  if( c=='t' ){.  
19600 20 20 20 20 20 20 63 20 3d 20 27 5c 74 27 3b 0a        c = '\t';.
19610 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
19620 63 3d 3d 27 6e 27 20 29 7b 0a 20 20 20 20 20 20  c=='n' ){.      
19630 20 20 63 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20    c = '\n';.    
19640 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
19650 76 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  v' ){.        c 
19660 3d 20 27 5c 76 27 3b 0a 20 20 20 20 20 20 7d 65  = '\v';.      }e
19670 6c 73 65 20 69 66 28 20 63 3d 3d 27 66 27 20 29  lse if( c=='f' )
19680 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c  {.        c = '\
19690 66 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  f';.      }else 
196a0 69 66 28 20 63 3d 3d 27 72 27 20 29 7b 0a 20 20  if( c=='r' ){.  
196b0 20 20 20 20 20 20 63 20 3d 20 27 5c 72 27 3b 0a        c = '\r';.
196c0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
196d0 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20  c=='"' ){.      
196e0 20 20 63 20 3d 20 27 22 27 3b 0a 20 20 20 20 20    c = '"';.     
196f0 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c   }else if( c=='\
19700 27 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  '' ){.        c 
19710 3d 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 7d 65  = '\'';.      }e
19720 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20  lse if( c=='\\' 
19730 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27  ){.        c = '
19740 5c 5c 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  \\';.      }else
19750 20 69 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63   if( c>='0' && c
19760 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20 20 20  <='7' ){.       
19770 20 63 20 2d 3d 20 27 30 27 3b 0a 20 20 20 20 20   c -= '0';.     
19780 20 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27     if( z[i+1]>='
19790 30 27 20 26 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37  0' && z[i+1]<='7
197a0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ' ){.          i
197b0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20  ++;.          c 
197c0 3d 20 28 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20  = (c<<3) + z[i] 
197d0 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 20  - '0';.         
197e0 20 69 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27   if( z[i+1]>='0'
197f0 20 26 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20   && z[i+1]<='7' 
19800 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
19810 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
19820 63 20 3d 20 28 63 3c 3c 33 29 20 2b 20 7a 5b 69  c = (c<<3) + z[i
19830 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20  ] - '0';.       
19840 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
19850 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
19860 20 7a 5b 6a 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20   z[j] = c;.  }. 
19870 20 69 66 28 20 6a 3c 69 20 29 20 7a 5b 6a 5d 20   if( j<i ) z[j] 
19880 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  = 0;.}../*.** Re
19890 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f  turn the value o
198a0 66 20 61 20 68 65 78 61 64 65 63 69 6d 61 6c 20  f a hexadecimal 
198b0 64 69 67 69 74 2e 20 20 52 65 74 75 72 6e 20 2d  digit.  Return -
198c0 31 20 69 66 20 74 68 65 20 69 6e 70 75 74 0a 2a  1 if the input.*
198d0 2a 20 69 73 20 6e 6f 74 20 61 20 68 65 78 20 64  * is not a hex d
198e0 69 67 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  igit..*/.static 
198f0 69 6e 74 20 68 65 78 44 69 67 69 74 56 61 6c 75  int hexDigitValu
19900 65 28 63 68 61 72 20 63 29 7b 0a 20 20 69 66 28  e(char c){.  if(
19910 20 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 39   c>='0' && c<='9
19920 27 20 29 20 72 65 74 75 72 6e 20 63 20 2d 20 27  ' ) return c - '
19930 30 27 3b 0a 20 20 69 66 28 20 63 3e 3d 27 61 27  0';.  if( c>='a'
19940 20 26 26 20 63 3c 3d 27 66 27 20 29 20 72 65 74   && c<='f' ) ret
19950 75 72 6e 20 63 20 2d 20 27 61 27 20 2b 20 31 30  urn c - 'a' + 10
19960 3b 0a 20 20 69 66 28 20 63 3e 3d 27 41 27 20 26  ;.  if( c>='A' &
19970 26 20 63 3c 3d 27 46 27 20 29 20 72 65 74 75 72  & c<='F' ) retur
19980 6e 20 63 20 2d 20 27 41 27 20 2b 20 31 30 3b 0a  n c - 'A' + 10;.
19990 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a    return -1;.}..
199a0 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20  /*.** Interpret 
199b0 7a 41 72 67 20 61 73 20 61 6e 20 69 6e 74 65 67  zArg as an integ
199c0 65 72 20 76 61 6c 75 65 2c 20 70 6f 73 73 69 62  er value, possib
199d0 6c 79 20 77 69 74 68 20 73 75 66 66 69 78 65 73  ly with suffixes
199e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  ..*/.static sqli
199f0 74 65 33 5f 69 6e 74 36 34 20 69 6e 74 65 67 65  te3_int64 intege
19a00 72 56 61 6c 75 65 28 63 6f 6e 73 74 20 63 68 61  rValue(const cha
19a10 72 20 2a 7a 41 72 67 29 7b 0a 20 20 73 71 6c 69  r *zArg){.  sqli
19a20 74 65 33 5f 69 6e 74 36 34 20 76 20 3d 20 30 3b  te3_int64 v = 0;
19a30 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
19a40 73 74 72 75 63 74 20 7b 20 63 68 61 72 20 2a 7a  struct { char *z
19a50 53 75 66 66 69 78 3b 20 69 6e 74 20 69 4d 75 6c  Suffix; int iMul
19a60 74 3b 20 7d 20 61 4d 75 6c 74 5b 5d 20 3d 20 7b  t; } aMult[] = {
19a70 0a 20 20 20 20 7b 20 22 4b 69 42 22 2c 20 31 30  .    { "KiB", 10
19a80 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22 4d 69 42  24 },.    { "MiB
19a90 22 2c 20 31 30 32 34 2a 31 30 32 34 20 7d 2c 0a  ", 1024*1024 },.
19aa0 20 20 20 20 7b 20 22 47 69 42 22 2c 20 31 30 32      { "GiB", 102
19ab0 34 2a 31 30 32 34 2a 31 30 32 34 20 7d 2c 0a 20  4*1024*1024 },. 
19ac0 20 20 20 7b 20 22 4b 42 22 2c 20 20 31 30 30 30     { "KB",  1000
19ad0 20 7d 2c 0a 20 20 20 20 7b 20 22 4d 42 22 2c 20   },.    { "MB", 
19ae0 20 31 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20   1000000 },.    
19af0 7b 20 22 47 42 22 2c 20 20 31 30 30 30 30 30 30  { "GB",  1000000
19b00 30 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 4b 22  000 },.    { "K"
19b10 2c 20 20 20 31 30 30 30 20 7d 2c 0a 20 20 20 20  ,   1000 },.    
19b20 7b 20 22 4d 22 2c 20 20 20 31 30 30 30 30 30 30  { "M",   1000000
19b30 20 7d 2c 0a 20 20 20 20 7b 20 22 47 22 2c 20 20   },.    { "G",  
19b40 20 31 30 30 30 30 30 30 30 30 30 20 7d 2c 0a 20   1000000000 },. 
19b50 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69   };.  int i;.  i
19b60 6e 74 20 69 73 4e 65 67 20 3d 20 30 3b 0a 20 20  nt isNeg = 0;.  
19b70 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 2d 27  if( zArg[0]=='-'
19b80 20 29 7b 0a 20 20 20 20 69 73 4e 65 67 20 3d 20   ){.    isNeg = 
19b90 31 3b 0a 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20  1;.    zArg++;. 
19ba0 20 7d 65 6c 73 65 20 69 66 28 20 7a 41 72 67 5b   }else if( zArg[
19bb0 30 5d 3d 3d 27 2b 27 20 29 7b 0a 20 20 20 20 7a  0]=='+' ){.    z
19bc0 41 72 67 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28  Arg++;.  }.  if(
19bd0 20 7a 41 72 67 5b 30 5d 3d 3d 27 30 27 20 26 26   zArg[0]=='0' &&
19be0 20 7a 41 72 67 5b 31 5d 3d 3d 27 78 27 20 29 7b   zArg[1]=='x' ){
19bf0 0a 20 20 20 20 69 6e 74 20 78 3b 0a 20 20 20 20  .    int x;.    
19c00 7a 41 72 67 20 2b 3d 20 32 3b 0a 20 20 20 20 77  zArg += 2;.    w
19c10 68 69 6c 65 28 20 28 78 20 3d 20 68 65 78 44 69  hile( (x = hexDi
19c20 67 69 74 56 61 6c 75 65 28 7a 41 72 67 5b 30 5d  gitValue(zArg[0]
19c30 29 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 76  ))>=0 ){.      v
19c40 20 3d 20 28 76 3c 3c 34 29 20 2b 20 78 3b 0a 20   = (v<<4) + x;. 
19c50 20 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 20       zArg++;.   
19c60 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
19c70 77 68 69 6c 65 28 20 49 73 44 69 67 69 74 28 7a  while( IsDigit(z
19c80 41 72 67 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20  Arg[0]) ){.     
19c90 20 76 20 3d 20 76 2a 31 30 20 2b 20 7a 41 72 67   v = v*10 + zArg
19ca0 5b 30 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20 20  [0] - '0';.     
19cb0 20 7a 41 72 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20   zArg++;.    }. 
19cc0 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
19cd0 41 72 72 61 79 53 69 7a 65 28 61 4d 75 6c 74 29  ArraySize(aMult)
19ce0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
19cf0 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
19d00 61 4d 75 6c 74 5b 69 5d 2e 7a 53 75 66 66 69 78  aMult[i].zSuffix
19d10 2c 20 7a 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20  , zArg)==0 ){.  
19d20 20 20 20 20 76 20 2a 3d 20 61 4d 75 6c 74 5b 69      v *= aMult[i
19d30 5d 2e 69 4d 75 6c 74 3b 0a 20 20 20 20 20 20 62  ].iMult;.      b
19d40 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
19d50 20 20 72 65 74 75 72 6e 20 69 73 4e 65 67 3f 20    return isNeg? 
19d60 2d 76 20 3a 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  -v : v;.}../*.**
19d70 20 49 6e 74 65 72 70 72 65 74 20 7a 41 72 67 20   Interpret zArg 
19d80 61 73 20 65 69 74 68 65 72 20 61 6e 20 69 6e 74  as either an int
19d90 65 67 65 72 20 6f 72 20 61 20 62 6f 6f 6c 65 61  eger or a boolea
19da0 6e 20 76 61 6c 75 65 2e 20 20 52 65 74 75 72 6e  n value.  Return
19db0 20 31 20 6f 72 20 30 0a 2a 2a 20 66 6f 72 20 54   1 or 0.** for T
19dc0 52 55 45 20 61 6e 64 20 46 41 4c 53 45 2e 20 20  RUE and FALSE.  
19dd0 52 65 74 75 72 6e 20 74 68 65 20 69 6e 74 65 67  Return the integ
19de0 65 72 20 76 61 6c 75 65 20 69 66 20 61 70 70 72  er value if appr
19df0 6f 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74  opriate..*/.stat
19e00 69 63 20 69 6e 74 20 62 6f 6f 6c 65 61 6e 56 61  ic int booleanVa
19e10 6c 75 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  lue(const char *
19e20 7a 41 72 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  zArg){.  int i;.
19e30 20 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27    if( zArg[0]=='
19e40 30 27 20 26 26 20 7a 41 72 67 5b 31 5d 3d 3d 27  0' && zArg[1]=='
19e50 78 27 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  x' ){.    for(i=
19e60 32 3b 20 68 65 78 44 69 67 69 74 56 61 6c 75 65  2; hexDigitValue
19e70 28 7a 41 72 67 5b 69 5d 29 3e 3d 30 3b 20 69 2b  (zArg[i])>=0; i+
19e80 2b 29 7b 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  +){}.  }else{.  
19e90 20 20 66 6f 72 28 69 3d 30 3b 20 7a 41 72 67 5b    for(i=0; zArg[
19ea0 69 5d 3e 3d 27 30 27 20 26 26 20 7a 41 72 67 5b  i]>='0' && zArg[
19eb0 69 5d 3c 3d 27 39 27 3b 20 69 2b 2b 29 7b 7d 0a  i]<='9'; i++){}.
19ec0 20 20 7d 0a 20 20 69 66 28 20 69 3e 30 20 26 26    }.  if( i>0 &&
19ed0 20 7a 41 72 67 5b 69 5d 3d 3d 30 20 29 20 72 65   zArg[i]==0 ) re
19ee0 74 75 72 6e 20 28 69 6e 74 29 28 69 6e 74 65 67  turn (int)(integ
19ef0 65 72 56 61 6c 75 65 28 7a 41 72 67 29 20 26 20  erValue(zArg) & 
19f00 30 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 69  0xffffffff);.  i
19f10 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
19f20 6d 70 28 7a 41 72 67 2c 20 22 6f 6e 22 29 3d 3d  mp(zArg, "on")==
19f30 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72  0 || sqlite3_str
19f40 69 63 6d 70 28 7a 41 72 67 2c 22 79 65 73 22 29  icmp(zArg,"yes")
19f50 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
19f60 6e 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73  n 1;.  }.  if( s
19f70 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
19f80 41 72 67 2c 20 22 6f 66 66 22 29 3d 3d 30 20 7c  Arg, "off")==0 |
19f90 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  | sqlite3_stricm
19fa0 70 28 7a 41 72 67 2c 22 6e 6f 22 29 3d 3d 30 20  p(zArg,"no")==0 
19fb0 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
19fc0 0a 20 20 7d 0a 20 20 75 74 66 38 5f 70 72 69 6e  .  }.  utf8_prin
19fd0 74 66 28 73 74 64 65 72 72 2c 20 22 45 52 52 4f  tf(stderr, "ERRO
19fe0 52 3a 20 4e 6f 74 20 61 20 62 6f 6f 6c 65 61 6e  R: Not a boolean
19ff0 20 76 61 6c 75 65 3a 20 5c 22 25 73 5c 22 2e 20   value: \"%s\". 
1a000 41 73 73 75 6d 69 6e 67 20 5c 22 6e 6f 5c 22 2e  Assuming \"no\".
1a010 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 7a  \n",.          z
1a020 41 72 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  Arg);.  return 0
1a030 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f  ;.}../*.** Set o
1a040 72 20 63 6c 65 61 72 20 61 20 73 68 65 6c 6c 20  r clear a shell 
1a050 66 6c 61 67 20 61 63 63 6f 72 64 69 6e 67 20 74  flag according t
1a060 6f 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75  o a boolean valu
1a070 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
1a080 64 20 73 65 74 4f 72 43 6c 65 61 72 46 6c 61 67  d setOrClearFlag
1a090 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20  (ShellState *p, 
1a0a0 75 6e 73 69 67 6e 65 64 20 6d 46 6c 61 67 2c 20  unsigned mFlag, 
1a0b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
1a0c0 29 7b 0a 20 20 69 66 28 20 62 6f 6f 6c 65 61 6e  ){.  if( boolean
1a0d0 56 61 6c 75 65 28 7a 41 72 67 29 20 29 7b 0a 20  Value(zArg) ){. 
1a0e0 20 20 20 53 68 65 6c 6c 53 65 74 46 6c 61 67 28     ShellSetFlag(
1a0f0 70 2c 20 6d 46 6c 61 67 29 3b 0a 20 20 7d 65 6c  p, mFlag);.  }el
1a100 73 65 7b 0a 20 20 20 20 53 68 65 6c 6c 43 6c 65  se{.    ShellCle
1a110 61 72 46 6c 61 67 28 70 2c 20 6d 46 6c 61 67 29  arFlag(p, mFlag)
1a120 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  ;.  }.}../*.** C
1a130 6c 6f 73 65 20 61 6e 20 6f 75 74 70 75 74 20 66  lose an output f
1a140 69 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 69 74  ile, assuming it
1a150 20 69 73 20 6e 6f 74 20 73 74 64 65 72 72 20 6f   is not stderr o
1a160 72 20 73 74 64 6f 75 74 0a 2a 2f 0a 73 74 61 74  r stdout.*/.stat
1a170 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 66  ic void output_f
1a180 69 6c 65 5f 63 6c 6f 73 65 28 46 49 4c 45 20 2a  ile_close(FILE *
1a190 66 29 7b 0a 20 20 69 66 28 20 66 20 26 26 20 66  f){.  if( f && f
1a1a0 21 3d 73 74 64 6f 75 74 20 26 26 20 66 21 3d 73  !=stdout && f!=s
1a1b0 74 64 65 72 72 20 29 20 66 63 6c 6f 73 65 28 66  tderr ) fclose(f
1a1c0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20  );.}../*.** Try 
1a1d0 74 6f 20 6f 70 65 6e 20 61 6e 20 6f 75 74 70 75  to open an outpu
1a1e0 74 20 66 69 6c 65 2e 20 20 20 54 68 65 20 6e 61  t file.   The na
1a1f0 6d 65 73 20 22 73 74 64 6f 75 74 22 20 61 6e 64  mes "stdout" and
1a200 20 22 73 74 64 65 72 72 22 20 61 72 65 0a 2a 2a   "stderr" are.**
1a210 20 72 65 63 6f 67 6e 69 7a 65 64 20 61 6e 64 20   recognized and 
1a220 64 6f 20 74 68 65 20 72 69 67 68 74 20 74 68 69  do the right thi
1a230 6e 67 2e 20 20 4e 55 4c 4c 20 69 73 20 72 65 74  ng.  NULL is ret
1a240 75 72 6e 65 64 20 69 66 20 74 68 65 20 6f 75 74  urned if the out
1a250 70 75 74 0a 2a 2a 20 66 69 6c 65 6e 61 6d 65 20  put.** filename 
1a260 69 73 20 22 6f 66 66 22 2e 0a 2a 2f 0a 73 74 61  is "off"..*/.sta
1a270 74 69 63 20 46 49 4c 45 20 2a 6f 75 74 70 75 74  tic FILE *output
1a280 5f 66 69 6c 65 5f 6f 70 65 6e 28 63 6f 6e 73 74  _file_open(const
1a290 20 63 68 61 72 20 2a 7a 46 69 6c 65 29 7b 0a 20   char *zFile){. 
1a2a0 20 46 49 4c 45 20 2a 66 3b 0a 20 20 69 66 28 20   FILE *f;.  if( 
1a2b0 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 22 73 74  strcmp(zFile,"st
1a2c0 64 6f 75 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  dout")==0 ){.   
1a2d0 20 66 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7d   f = stdout;.  }
1a2e0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
1a2f0 7a 46 69 6c 65 2c 20 22 73 74 64 65 72 72 22 29  zFile, "stderr")
1a300 3d 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d 20 73  ==0 ){.    f = s
1a310 74 64 65 72 72 3b 0a 20 20 7d 65 6c 73 65 20 69  tderr;.  }else i
1a320 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c  f( strcmp(zFile,
1a330 20 22 6f 66 66 22 29 3d 3d 30 20 29 7b 0a 20 20   "off")==0 ){.  
1a340 20 20 66 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65    f = 0;.  }else
1a350 7b 0a 20 20 20 20 66 20 3d 20 66 6f 70 65 6e 28  {.    f = fopen(
1a360 7a 46 69 6c 65 2c 20 22 77 62 22 29 3b 0a 20 20  zFile, "wb");.  
1a370 20 20 69 66 28 20 66 3d 3d 30 20 29 7b 0a 20 20    if( f==0 ){.  
1a380 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
1a390 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
1a3a0 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73  cannot open \"%s
1a3b0 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20  \"\n", zFile);. 
1a3c0 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1a3d0 6e 20 66 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66  n f;.}..#if !def
1a3e0 69 6e 65 64 28 53 51 4c 49 54 45 5f 55 4e 54 45  ined(SQLITE_UNTE
1a3f0 53 54 41 42 4c 45 29 0a 23 69 66 20 21 64 65 66  STABLE).#if !def
1a400 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
1a410 5f 54 52 41 43 45 29 20 26 26 20 21 64 65 66 69  _TRACE) && !defi
1a420 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1a430 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a  FLOATING_POINT).
1a440 2f 2a 0a 2a 2a 20 41 20 72 6f 75 74 69 6e 65 20  /*.** A routine 
1a450 66 6f 72 20 68 61 6e 64 6c 69 6e 67 20 6f 75 74  for handling out
1a460 70 75 74 20 66 72 6f 6d 20 73 71 6c 69 74 65 33  put from sqlite3
1a470 5f 74 72 61 63 65 28 29 2e 0a 2a 2f 0a 73 74 61  _trace()..*/.sta
1a480 74 69 63 20 69 6e 74 20 73 71 6c 5f 74 72 61 63  tic int sql_trac
1a490 65 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20 75 6e  e_callback(.  un
1a4a0 73 69 67 6e 65 64 20 6d 54 79 70 65 2c 0a 20 20  signed mType,.  
1a4b0 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 76 6f  void *pArg,.  vo
1a4c0 69 64 20 2a 70 50 2c 0a 20 20 76 6f 69 64 20 2a  id *pP,.  void *
1a4d0 70 58 0a 29 7b 0a 20 20 46 49 4c 45 20 2a 66 20  pX.){.  FILE *f 
1a4e0 3d 20 28 46 49 4c 45 2a 29 70 41 72 67 3b 0a 20  = (FILE*)pArg;. 
1a4f0 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
1a500 52 28 6d 54 79 70 65 29 3b 0a 20 20 55 4e 55 53  R(mType);.  UNUS
1a510 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50 29  ED_PARAMETER(pP)
1a520 3b 0a 20 20 69 66 28 20 66 20 29 7b 0a 20 20 20  ;.  if( f ){.   
1a530 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
1a540 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 58   (const char*)pX
1a550 3b 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 73 74  ;.    int i = st
1a560 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 77  rlen30(z);.    w
1a570 68 69 6c 65 28 20 69 3e 30 20 26 26 20 7a 5b 69  hile( i>0 && z[i
1a580 2d 31 5d 3d 3d 27 3b 27 20 29 7b 20 69 2d 2d 3b  -1]==';' ){ i--;
1a590 20 7d 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e   }.    utf8_prin
1a5a0 74 66 28 66 2c 20 22 25 2e 2a 73 3b 5c 6e 22 2c  tf(f, "%.*s;\n",
1a5b0 20 69 2c 20 7a 29 3b 0a 20 20 7d 0a 20 20 72 65   i, z);.  }.  re
1a5c0 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
1a5d0 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41  .#endif../*.** A
1a5e0 20 6e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 74   no-op routine t
1a5f0 68 61 74 20 72 75 6e 73 20 77 69 74 68 20 74 68  hat runs with th
1a600 65 20 22 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20  e ".breakpoint" 
1a610 64 6f 63 2d 63 6f 6d 6d 61 6e 64 2e 20 20 54 68  doc-command.  Th
1a620 69 73 20 69 73 0a 2a 2a 20 61 20 75 73 65 66 75  is is.** a usefu
1a630 6c 20 73 70 6f 74 20 74 6f 20 73 65 74 20 61 20  l spot to set a 
1a640 64 65 62 75 67 67 65 72 20 62 72 65 61 6b 70 6f  debugger breakpo
1a650 69 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  int..*/.static v
1a660 6f 69 64 20 74 65 73 74 5f 62 72 65 61 6b 70 6f  oid test_breakpo
1a670 69 6e 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61  int(void){.  sta
1a680 74 69 63 20 69 6e 74 20 6e 43 61 6c 6c 20 3d 20  tic int nCall = 
1a690 30 3b 0a 20 20 6e 43 61 6c 6c 2b 2b 3b 0a 7d 0a  0;.  nCall++;.}.
1a6a0 0a 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74  ./*.** An object
1a6b0 20 75 73 65 64 20 74 6f 20 72 65 61 64 20 61 20   used to read a 
1a6c0 43 53 56 20 61 6e 64 20 6f 74 68 65 72 20 66 69  CSV and other fi
1a6d0 6c 65 73 20 66 6f 72 20 69 6d 70 6f 72 74 2e 0a  les for import..
1a6e0 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
1a6f0 74 20 49 6d 70 6f 72 74 43 74 78 20 49 6d 70 6f  t ImportCtx Impo
1a700 72 74 43 74 78 3b 0a 73 74 72 75 63 74 20 49 6d  rtCtx;.struct Im
1a710 70 6f 72 74 43 74 78 20 7b 0a 20 20 63 6f 6e 73  portCtx {.  cons
1a720 74 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20  t char *zFile;  
1a730 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69  /* Name of the i
1a740 6e 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 46  nput file */.  F
1a750 49 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20 20 20  ILE *in;        
1a760 20 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 43     /* Read the C
1a770 53 56 20 74 65 78 74 20 66 72 6f 6d 20 74 68 69  SV text from thi
1a780 73 20 69 6e 70 75 74 20 73 74 72 65 61 6d 20 2a  s input stream *
1a790 2f 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20  /.  char *z;    
1a7a0 20 20 20 20 20 20 20 20 2f 2a 20 41 63 63 75 6d          /* Accum
1a7b0 75 6c 61 74 65 64 20 74 65 78 74 20 66 6f 72 20  ulated text for 
1a7c0 61 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74  a field */.  int
1a7d0 20 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   n;             
1a7e0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79   /* Number of by
1a7f0 74 65 73 20 69 6e 20 7a 20 2a 2f 0a 20 20 69 6e  tes in z */.  in
1a800 74 20 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20  t nAlloc;       
1a810 20 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63    /* Space alloc
1a820 61 74 65 64 20 66 6f 72 20 7a 5b 5d 20 2a 2f 0a  ated for z[] */.
1a830 20 20 69 6e 74 20 6e 4c 69 6e 65 3b 20 20 20 20    int nLine;    
1a840 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
1a850 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a   line number */.
1a860 20 20 69 6e 74 20 62 4e 6f 74 46 69 72 73 74 3b    int bNotFirst;
1a870 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
1a880 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 62 79 74   one or more byt
1a890 65 73 20 61 6c 72 65 61 64 79 20 72 65 61 64 20  es already read 
1a8a0 2a 2f 0a 20 20 69 6e 74 20 63 54 65 72 6d 3b 20  */.  int cTerm; 
1a8b0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 72           /* Char
1a8c0 61 63 74 65 72 20 74 68 61 74 20 74 65 72 6d 69  acter that termi
1a8d0 6e 61 74 65 64 20 74 68 65 20 6d 6f 73 74 20 72  nated the most r
1a8e0 65 63 65 6e 74 20 66 69 65 6c 64 20 2a 2f 0a 20  ecent field */. 
1a8f0 20 69 6e 74 20 63 43 6f 6c 53 65 70 3b 20 20 20   int cColSep;   
1a900 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75       /* The colu
1a910 6d 6e 20 73 65 70 61 72 61 74 6f 72 20 63 68 61  mn separator cha
1a920 72 61 63 74 65 72 2e 20 20 28 55 73 75 61 6c 6c  racter.  (Usuall
1a930 79 20 22 2c 22 29 20 2a 2f 0a 20 20 69 6e 74 20  y ",") */.  int 
1a940 63 52 6f 77 53 65 70 3b 20 20 20 20 20 20 20 20  cRowSep;        
1a950 2f 2a 20 54 68 65 20 72 6f 77 20 73 65 70 61 72  /* The row separ
1a960 61 74 6f 72 20 63 68 61 72 61 63 74 65 72 2e 20  ator character. 
1a970 20 28 55 73 75 61 6c 6c 79 20 22 5c 6e 22 29 20   (Usually "\n") 
1a980 2a 2f 0a 7d 3b 0a 0a 2f 2a 20 41 70 70 65 6e 64  */.};../* Append
1a990 20 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74   a single byte t
1a9a0 6f 20 7a 5b 5d 20 2a 2f 0a 73 74 61 74 69 63 20  o z[] */.static 
1a9b0 76 6f 69 64 20 69 6d 70 6f 72 74 5f 61 70 70 65  void import_appe
1a9c0 6e 64 5f 63 68 61 72 28 49 6d 70 6f 72 74 43 74  nd_char(ImportCt
1a9d0 78 20 2a 70 2c 20 69 6e 74 20 63 29 7b 0a 20 20  x *p, int c){.  
1a9e0 69 66 28 20 70 2d 3e 6e 2b 31 3e 3d 70 2d 3e 6e  if( p->n+1>=p->n
1a9f0 41 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e  Alloc ){.    p->
1aa00 6e 41 6c 6c 6f 63 20 2b 3d 20 70 2d 3e 6e 41 6c  nAlloc += p->nAl
1aa10 6c 6f 63 20 2b 20 31 30 30 3b 0a 20 20 20 20 70  loc + 100;.    p
1aa20 2d 3e 7a 20 3d 20 73 71 6c 69 74 65 33 5f 72 65  ->z = sqlite3_re
1aa30 61 6c 6c 6f 63 36 34 28 70 2d 3e 7a 2c 20 70 2d  alloc64(p->z, p-
1aa40 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66  >nAlloc);.    if
1aa50 28 20 70 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20  ( p->z==0 ){.   
1aa60 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
1aa70 64 65 72 72 2c 20 22 6f 75 74 20 6f 66 20 6d 65  derr, "out of me
1aa80 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20  mory\n");.      
1aa90 65 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20  exit(1);.    }. 
1aaa0 20 7d 0a 20 20 70 2d 3e 7a 5b 70 2d 3e 6e 2b 2b   }.  p->z[p->n++
1aab0 5d 20 3d 20 28 63 68 61 72 29 63 3b 0a 7d 0a 0a  ] = (char)c;.}..
1aac0 2f 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65  /* Read a single
1aad0 20 66 69 65 6c 64 20 6f 66 20 43 53 56 20 74 65   field of CSV te
1aae0 78 74 2e 20 20 43 6f 6d 70 61 74 69 62 6c 65 20  xt.  Compatible 
1aaf0 77 69 74 68 20 72 66 63 34 31 38 30 20 61 6e 64  with rfc4180 and
1ab00 20 65 78 74 65 6e 64 65 64 0a 2a 2a 20 77 69 74   extended.** wit
1ab10 68 20 74 68 65 20 6f 70 74 69 6f 6e 20 6f 66 20  h the option of 
1ab20 68 61 76 69 6e 67 20 61 20 73 65 70 61 72 61 74  having a separat
1ab30 6f 72 20 6f 74 68 65 72 20 74 68 61 6e 20 22 2c  or other than ",
1ab40 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 20 49 6e  "..**.**   +  In
1ab50 70 75 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20 70  put comes from p
1ab60 2d 3e 69 6e 2e 0a 2a 2a 20 20 20 2b 20 20 53 74  ->in..**   +  St
1ab70 6f 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 70  ore results in p
1ab80 2d 3e 7a 20 6f 66 20 6c 65 6e 67 74 68 20 70 2d  ->z of length p-
1ab90 3e 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f  >n.  Space to ho
1aba0 6c 64 20 70 2d 3e 7a 20 63 6f 6d 65 73 0a 2a 2a  ld p->z comes.**
1abb0 20 20 20 20 20 20 66 72 6f 6d 20 73 71 6c 69 74        from sqlit
1abc0 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 29 2e 0a 2a  e3_malloc64()..*
1abd0 2a 20 20 20 2b 20 20 55 73 65 20 70 2d 3e 63 53  *   +  Use p->cS
1abe0 65 70 20 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e  ep as the column
1abf0 20 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68 65   separator.  The
1ac00 20 64 65 66 61 75 6c 74 20 69 73 20 22 2c 22 2e   default is ",".
1ac10 0a 2a 2a 20 20 20 2b 20 20 55 73 65 20 70 2d 3e  .**   +  Use p->
1ac20 72 53 65 70 20 61 73 20 74 68 65 20 72 6f 77 20  rSep as the row 
1ac30 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68 65 20  separator.  The 
1ac40 64 65 66 61 75 6c 74 20 69 73 20 22 5c 6e 22 2e  default is "\n".
1ac50 0a 2a 2a 20 20 20 2b 20 20 4b 65 65 70 20 74 72  .**   +  Keep tr
1ac60 61 63 6b 20 6f 66 20 74 68 65 20 6c 69 6e 65 20  ack of the line 
1ac70 6e 75 6d 62 65 72 20 69 6e 20 70 2d 3e 6e 4c 69  number in p->nLi
1ac80 6e 65 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72  ne..**   +  Stor
1ac90 65 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20  e the character 
1aca0 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 20  that terminates 
1acb0 74 68 65 20 66 69 65 6c 64 20 69 6e 20 70 2d 3e  the field in p->
1acc0 63 54 65 72 6d 2e 20 20 53 74 6f 72 65 0a 2a 2a  cTerm.  Store.**
1acd0 20 20 20 20 20 20 45 4f 46 20 6f 6e 20 65 6e 64        EOF on end
1ace0 2d 6f 66 2d 66 69 6c 65 2e 0a 2a 2a 20 20 20 2b  -of-file..**   +
1acf0 20 20 52 65 70 6f 72 74 20 73 79 6e 74 61 78 20    Report syntax 
1ad00 65 72 72 6f 72 73 20 6f 6e 20 73 74 64 65 72 72  errors on stderr
1ad10 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
1ad20 2a 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 63 73  *SQLITE_CDECL cs
1ad30 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64  v_read_one_field
1ad40 28 49 6d 70 6f 72 74 43 74 78 20 2a 70 29 7b 0a  (ImportCtx *p){.
1ad50 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 63    int c;.  int c
1ad60 53 65 70 20 3d 20 70 2d 3e 63 43 6f 6c 53 65 70  Sep = p->cColSep
1ad70 3b 0a 20 20 69 6e 74 20 72 53 65 70 20 3d 20 70  ;.  int rSep = p
1ad80 2d 3e 63 52 6f 77 53 65 70 3b 0a 20 20 70 2d 3e  ->cRowSep;.  p->
1ad90 6e 20 3d 20 30 3b 0a 20 20 63 20 3d 20 66 67 65  n = 0;.  c = fge
1ada0 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 69 66 28  tc(p->in);.  if(
1adb0 20 63 3d 3d 45 4f 46 20 7c 7c 20 73 65 65 6e 49   c==EOF || seenI
1adc0 6e 74 65 72 72 75 70 74 20 29 7b 0a 20 20 20 20  nterrupt ){.    
1add0 70 2d 3e 63 54 65 72 6d 20 3d 20 45 4f 46 3b 0a  p->cTerm = EOF;.
1ade0 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1adf0 7d 0a 20 20 69 66 28 20 63 3d 3d 27 22 27 20 29  }.  if( c=='"' )
1ae00 7b 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 70 70  {.    int pc, pp
1ae10 63 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74  c;.    int start
1ae20 4c 69 6e 65 20 3d 20 70 2d 3e 6e 4c 69 6e 65 3b  Line = p->nLine;
1ae30 0a 20 20 20 20 69 6e 74 20 63 51 75 6f 74 65 20  .    int cQuote 
1ae40 3d 20 63 3b 0a 20 20 20 20 70 63 20 3d 20 70 70  = c;.    pc = pp
1ae50 63 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  c = 0;.    while
1ae60 28 20 31 20 29 7b 0a 20 20 20 20 20 20 63 20 3d  ( 1 ){.      c =
1ae70 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20   fgetc(p->in);. 
1ae80 20 20 20 20 20 69 66 28 20 63 3d 3d 72 53 65 70       if( c==rSep
1ae90 20 29 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20   ) p->nLine++;. 
1aea0 20 20 20 20 20 69 66 28 20 63 3d 3d 63 51 75 6f       if( c==cQuo
1aeb0 74 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  te ){.        if
1aec0 28 20 70 63 3d 3d 63 51 75 6f 74 65 20 29 7b 0a  ( pc==cQuote ){.
1aed0 20 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 30            pc = 0
1aee0 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  ;.          cont
1aef0 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
1af00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
1af10 28 20 28 63 3d 3d 63 53 65 70 20 26 26 20 70 63  ( (c==cSep && pc
1af20 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20 20 20 20  ==cQuote).      
1af30 20 7c 7c 20 28 63 3d 3d 72 53 65 70 20 26 26 20   || (c==rSep && 
1af40 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20 20  pc==cQuote).    
1af50 20 20 20 7c 7c 20 28 63 3d 3d 72 53 65 70 20 26     || (c==rSep &
1af60 26 20 70 63 3d 3d 27 5c 72 27 20 26 26 20 70 70  & pc=='\r' && pp
1af70 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20 20 20  c==cQuote).     
1af80 20 20 7c 7c 20 28 63 3d 3d 45 4f 46 20 26 26 20    || (c==EOF && 
1af90 70 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20 20  pc==cQuote).    
1afa0 20 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b    ){.        do{
1afb0 20 70 2d 3e 6e 2d 2d 3b 20 7d 77 68 69 6c 65 28   p->n--; }while(
1afc0 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 21 3d 63 51 75   p->z[p->n]!=cQu
1afd0 6f 74 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ote );.        p
1afe0 2d 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20 20  ->cTerm = c;.   
1aff0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1b000 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 63    }.      if( pc
1b010 3d 3d 63 51 75 6f 74 65 20 26 26 20 63 21 3d 27  ==cQuote && c!='
1b020 5c 72 27 20 29 7b 0a 20 20 20 20 20 20 20 20 75  \r' ){.        u
1b030 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
1b040 72 2c 20 22 25 73 3a 25 64 3a 20 75 6e 65 73 63  r, "%s:%d: unesc
1b050 61 70 65 64 20 25 63 20 63 68 61 72 61 63 74 65  aped %c characte
1b060 72 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  r\n",.          
1b070 20 20 20 20 20 20 70 2d 3e 7a 46 69 6c 65 2c 20        p->zFile, 
1b080 70 2d 3e 6e 4c 69 6e 65 2c 20 63 51 75 6f 74 65  p->nLine, cQuote
1b090 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1b0a0 20 69 66 28 20 63 3d 3d 45 4f 46 20 29 7b 0a 20   if( c==EOF ){. 
1b0b0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
1b0c0 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25  tf(stderr, "%s:%
1b0d0 64 3a 20 75 6e 74 65 72 6d 69 6e 61 74 65 64 20  d: unterminated 
1b0e0 25 63 2d 71 75 6f 74 65 64 20 66 69 65 6c 64 5c  %c-quoted field\
1b0f0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1b100 20 20 20 20 70 2d 3e 7a 46 69 6c 65 2c 20 73 74      p->zFile, st
1b110 61 72 74 4c 69 6e 65 2c 20 63 51 75 6f 74 65 29  artLine, cQuote)
1b120 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 54 65  ;.        p->cTe
1b130 72 6d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  rm = c;.        
1b140 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1b150 20 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65       import_appe
1b160 6e 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20  nd_char(p, c);. 
1b170 20 20 20 20 20 70 70 63 20 3d 20 70 63 3b 0a 20       ppc = pc;. 
1b180 20 20 20 20 20 70 63 20 3d 20 63 3b 0a 20 20 20       pc = c;.   
1b190 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
1b1a0 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  /* If this is th
1b1b0 65 20 66 69 72 73 74 20 66 69 65 6c 64 20 62 65  e first field be
1b1c0 69 6e 67 20 70 61 72 73 65 64 20 61 6e 64 20 69  ing parsed and i
1b1d0 74 20 62 65 67 69 6e 73 20 77 69 74 68 20 74 68  t begins with th
1b1e0 65 0a 20 20 20 20 2a 2a 20 55 54 46 2d 38 20 42  e.    ** UTF-8 B
1b1f0 4f 4d 20 20 28 30 78 45 46 20 42 42 20 42 46 29  OM  (0xEF BB BF)
1b200 20 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 42   then skip the B
1b210 4f 4d 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 63  OM */.    if( (c
1b220 26 30 78 66 66 29 3d 3d 30 78 65 66 20 26 26 20  &0xff)==0xef && 
1b230 70 2d 3e 62 4e 6f 74 46 69 72 73 74 3d 3d 30 20  p->bNotFirst==0 
1b240 29 7b 0a 20 20 20 20 20 20 69 6d 70 6f 72 74 5f  ){.      import_
1b250 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63  append_char(p, c
1b260 29 3b 0a 20 20 20 20 20 20 63 20 3d 20 66 67 65  );.      c = fge
1b270 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 20  tc(p->in);.     
1b280 20 69 66 28 20 28 63 26 30 78 66 66 29 3d 3d 30   if( (c&0xff)==0
1b290 78 62 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69  xbb ){.        i
1b2a0 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61  mport_append_cha
1b2b0 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20 20 20  r(p, c);.       
1b2c0 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e   c = fgetc(p->in
1b2d0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
1b2e0 63 26 30 78 66 66 29 3d 3d 30 78 62 66 20 29 7b  c&0xff)==0xbf ){
1b2f0 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e 62 4e  .          p->bN
1b300 6f 74 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20  otFirst = 1;.   
1b310 20 20 20 20 20 20 20 70 2d 3e 6e 20 3d 20 30 3b         p->n = 0;
1b320 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1b330 6e 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66  n csv_read_one_f
1b340 69 65 6c 64 28 70 29 3b 0a 20 20 20 20 20 20 20  ield(p);.       
1b350 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
1b360 0a 20 20 20 20 77 68 69 6c 65 28 20 63 21 3d 45  .    while( c!=E
1b370 4f 46 20 26 26 20 63 21 3d 63 53 65 70 20 26 26  OF && c!=cSep &&
1b380 20 63 21 3d 72 53 65 70 20 29 7b 0a 20 20 20 20   c!=rSep ){.    
1b390 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f    import_append_
1b3a0 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20  char(p, c);.    
1b3b0 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69    c = fgetc(p->i
1b3c0 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  n);.    }.    if
1b3d0 28 20 63 3d 3d 72 53 65 70 20 29 7b 0a 20 20 20  ( c==rSep ){.   
1b3e0 20 20 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20     p->nLine++;. 
1b3f0 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 3e 30 20       if( p->n>0 
1b400 26 26 20 70 2d 3e 7a 5b 70 2d 3e 6e 2d 31 5d 3d  && p->z[p->n-1]=
1b410 3d 27 5c 72 27 20 29 20 70 2d 3e 6e 2d 2d 3b 0a  ='\r' ) p->n--;.
1b420 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 63 54 65      }.    p->cTe
1b430 72 6d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 69 66  rm = c;.  }.  if
1b440 28 20 70 2d 3e 7a 20 29 20 70 2d 3e 7a 5b 70 2d  ( p->z ) p->z[p-
1b450 3e 6e 5d 20 3d 20 30 3b 0a 20 20 70 2d 3e 62 4e  >n] = 0;.  p->bN
1b460 6f 74 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 72  otFirst = 1;.  r
1b470 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a 2f  eturn p->z;.}../
1b480 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20  * Read a single 
1b490 66 69 65 6c 64 20 6f 66 20 41 53 43 49 49 20 64  field of ASCII d
1b4a0 65 6c 69 6d 69 74 65 64 20 74 65 78 74 2e 0a 2a  elimited text..*
1b4b0 2a 0a 2a 2a 20 20 20 2b 20 20 49 6e 70 75 74 20  *.**   +  Input 
1b4c0 63 6f 6d 65 73 20 66 72 6f 6d 20 70 2d 3e 69 6e  comes from p->in
1b4d0 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65 20  ..**   +  Store 
1b4e0 72 65 73 75 6c 74 73 20 69 6e 20 70 2d 3e 7a 20  results in p->z 
1b4f0 6f 66 20 6c 65 6e 67 74 68 20 70 2d 3e 6e 2e 20  of length p->n. 
1b500 20 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 70   Space to hold p
1b510 2d 3e 7a 20 63 6f 6d 65 73 0a 2a 2a 20 20 20 20  ->z comes.**    
1b520 20 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d    from sqlite3_m
1b530 61 6c 6c 6f 63 36 34 28 29 2e 0a 2a 2a 20 20 20  alloc64()..**   
1b540 2b 20 20 55 73 65 20 70 2d 3e 63 53 65 70 20 61  +  Use p->cSep a
1b550 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 73 65 70  s the column sep
1b560 61 72 61 74 6f 72 2e 20 20 54 68 65 20 64 65 66  arator.  The def
1b570 61 75 6c 74 20 69 73 20 22 5c 78 31 46 22 2e 0a  ault is "\x1F"..
1b580 2a 2a 20 20 20 2b 20 20 55 73 65 20 70 2d 3e 72  **   +  Use p->r
1b590 53 65 70 20 61 73 20 74 68 65 20 72 6f 77 20 73  Sep as the row s
1b5a0 65 70 61 72 61 74 6f 72 2e 20 20 54 68 65 20 64  eparator.  The d
1b5b0 65 66 61 75 6c 74 20 69 73 20 22 5c 78 31 45 22  efault is "\x1E"
1b5c0 2e 0a 2a 2a 20 20 20 2b 20 20 4b 65 65 70 20 74  ..**   +  Keep t
1b5d0 72 61 63 6b 20 6f 66 20 74 68 65 20 72 6f 77 20  rack of the row 
1b5e0 6e 75 6d 62 65 72 20 69 6e 20 70 2d 3e 6e 4c 69  number in p->nLi
1b5f0 6e 65 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72  ne..**   +  Stor
1b600 65 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20  e the character 
1b610 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 20  that terminates 
1b620 74 68 65 20 66 69 65 6c 64 20 69 6e 20 70 2d 3e  the field in p->
1b630 63 54 65 72 6d 2e 20 20 53 74 6f 72 65 0a 2a 2a  cTerm.  Store.**
1b640 20 20 20 20 20 20 45 4f 46 20 6f 6e 20 65 6e 64        EOF on end
1b650 2d 6f 66 2d 66 69 6c 65 2e 0a 2a 2a 20 20 20 2b  -of-file..**   +
1b660 20 20 52 65 70 6f 72 74 20 73 79 6e 74 61 78 20    Report syntax 
1b670 65 72 72 6f 72 73 20 6f 6e 20 73 74 64 65 72 72  errors on stderr
1b680 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
1b690 2a 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 61 73  *SQLITE_CDECL as
1b6a0 63 69 69 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65  cii_read_one_fie
1b6b0 6c 64 28 49 6d 70 6f 72 74 43 74 78 20 2a 70 29  ld(ImportCtx *p)
1b6c0 7b 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74  {.  int c;.  int
1b6d0 20 63 53 65 70 20 3d 20 70 2d 3e 63 43 6f 6c 53   cSep = p->cColS
1b6e0 65 70 3b 0a 20 20 69 6e 74 20 72 53 65 70 20 3d  ep;.  int rSep =
1b6f0 20 70 2d 3e 63 52 6f 77 53 65 70 3b 0a 20 20 70   p->cRowSep;.  p
1b700 2d 3e 6e 20 3d 20 30 3b 0a 20 20 63 20 3d 20 66  ->n = 0;.  c = f
1b710 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 69  getc(p->in);.  i
1b720 66 28 20 63 3d 3d 45 4f 46 20 7c 7c 20 73 65 65  f( c==EOF || see
1b730 6e 49 6e 74 65 72 72 75 70 74 20 29 7b 0a 20 20  nInterrupt ){.  
1b740 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 45 4f 46    p->cTerm = EOF
1b750 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1b760 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 63 21 3d    }.  while( c!=
1b770 45 4f 46 20 26 26 20 63 21 3d 63 53 65 70 20 26  EOF && c!=cSep &
1b780 26 20 63 21 3d 72 53 65 70 20 29 7b 0a 20 20 20  & c!=rSep ){.   
1b790 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63   import_append_c
1b7a0 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 63  har(p, c);.    c
1b7b0 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b   = fgetc(p->in);
1b7c0 0a 20 20 7d 0a 20 20 69 66 28 20 63 3d 3d 72 53  .  }.  if( c==rS
1b7d0 65 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 69  ep ){.    p->nLi
1b7e0 6e 65 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63  ne++;.  }.  p->c
1b7f0 54 65 72 6d 20 3d 20 63 3b 0a 20 20 69 66 28 20  Term = c;.  if( 
1b800 70 2d 3e 7a 20 29 20 70 2d 3e 7a 5b 70 2d 3e 6e  p->z ) p->z[p->n
1b810 5d 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  ] = 0;.  return 
1b820 70 2d 3e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  p->z;.}../*.** T
1b830 72 79 20 74 6f 20 74 72 61 6e 73 66 65 72 20 64  ry to transfer d
1b840 61 74 61 20 66 6f 72 20 74 61 62 6c 65 20 7a 54  ata for table zT
1b850 61 62 6c 65 2e 20 20 49 66 20 61 6e 20 65 72 72  able.  If an err
1b860 6f 72 20 69 73 20 73 65 65 6e 20 77 68 69 6c 65  or is seen while
1b870 0a 2a 2a 20 6d 6f 76 69 6e 67 20 66 6f 72 77 61  .** moving forwa
1b880 72 64 2c 20 74 72 79 20 74 6f 20 67 6f 20 62 61  rd, try to go ba
1b890 63 6b 77 61 72 64 73 2e 20 20 54 68 65 20 62 61  ckwards.  The ba
1b8a0 63 6b 77 61 72 64 73 20 6d 6f 76 65 6d 65 6e 74  ckwards movement
1b8b0 20 77 6f 6e 27 74 0a 2a 2a 20 77 6f 72 6b 20 66   won't.** work f
1b8c0 6f 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44  or WITHOUT ROWID
1b8d0 20 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74   tables..*/.stat
1b8e0 69 63 20 76 6f 69 64 20 74 72 79 54 6f 43 6c 6f  ic void tryToClo
1b8f0 6e 65 44 61 74 61 28 0a 20 20 53 68 65 6c 6c 53  neData(.  ShellS
1b900 74 61 74 65 20 2a 70 2c 0a 20 20 73 71 6c 69 74  tate *p,.  sqlit
1b910 65 33 20 2a 6e 65 77 44 62 2c 0a 20 20 63 6f 6e  e3 *newDb,.  con
1b920 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 0a  st char *zTable.
1b930 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
1b940 74 20 2a 70 51 75 65 72 79 20 3d 20 30 3b 0a 20  t *pQuery = 0;. 
1b950 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1b960 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 63 68  Insert = 0;.  ch
1b970 61 72 20 2a 7a 51 75 65 72 79 20 3d 20 30 3b 0a  ar *zQuery = 0;.
1b980 20 20 63 68 61 72 20 2a 7a 49 6e 73 65 72 74 20    char *zInsert 
1b990 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  = 0;.  int rc;. 
1b9a0 20 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20   int i, j, n;.  
1b9b0 69 6e 74 20 6e 54 61 62 6c 65 20 3d 20 73 74 72  int nTable = str
1b9c0 6c 65 6e 33 30 28 7a 54 61 62 6c 65 29 3b 0a 20  len30(zTable);. 
1b9d0 20 69 6e 74 20 6b 20 3d 20 30 3b 0a 20 20 69 6e   int k = 0;.  in
1b9e0 74 20 63 6e 74 20 3d 20 30 3b 0a 20 20 63 6f 6e  t cnt = 0;.  con
1b9f0 73 74 20 69 6e 74 20 73 70 69 6e 52 61 74 65 20  st int spinRate 
1ba00 3d 20 31 30 30 30 30 3b 0a 0a 20 20 7a 51 75 65  = 10000;..  zQue
1ba10 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ry = sqlite3_mpr
1ba20 69 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46  intf("SELECT * F
1ba30 52 4f 4d 20 5c 22 25 77 5c 22 22 2c 20 7a 54 61  ROM \"%w\"", zTa
1ba40 62 6c 65 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c  ble);.  rc = sql
1ba50 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
1ba60 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d  p->db, zQuery, -
1ba70 31 2c 20 26 70 51 75 65 72 79 2c 20 30 29 3b 0a  1, &pQuery, 0);.
1ba80 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1ba90 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
1baa0 72 72 2c 20 22 45 72 72 6f 72 20 25 64 3a 20 25  rr, "Error %d: %
1bab0 73 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20  s on [%s]\n",.  
1bac0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1bad0 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f  3_extended_errco
1bae0 64 65 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74  de(p->db), sqlit
1baf0 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
1bb00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 51  ,.            zQ
1bb10 75 65 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20  uery);.    goto 
1bb20 65 6e 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20  end_data_xfer;. 
1bb30 20 7d 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33   }.  n = sqlite3
1bb40 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 51  _column_count(pQ
1bb50 75 65 72 79 29 3b 0a 20 20 7a 49 6e 73 65 72 74  uery);.  zInsert
1bb60 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f   = sqlite3_mallo
1bb70 63 36 34 28 32 30 30 20 2b 20 6e 54 61 62 6c 65  c64(200 + nTable
1bb80 20 2b 20 6e 2a 33 29 3b 0a 20 20 69 66 28 20 7a   + n*3);.  if( z
1bb90 49 6e 73 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20  Insert==0 ){.   
1bba0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
1bbb0 72 72 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f  rr, "out of memo
1bbc0 72 79 5c 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f  ry\n");.    goto
1bbd0 20 65 6e 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a   end_data_xfer;.
1bbe0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e    }.  sqlite3_sn
1bbf0 70 72 69 6e 74 66 28 32 30 30 2b 6e 54 61 62 6c  printf(200+nTabl
1bc00 65 2c 7a 49 6e 73 65 72 74 2c 0a 20 20 20 20 20  e,zInsert,.     
1bc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 49                "I
1bc20 4e 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20  NSERT OR IGNORE 
1bc30 49 4e 54 4f 20 5c 22 25 73 5c 22 20 56 41 4c 55  INTO \"%s\" VALU
1bc40 45 53 28 3f 22 2c 20 7a 54 61 62 6c 65 29 3b 0a  ES(?", zTable);.
1bc50 20 20 69 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a    i = strlen30(z
1bc60 49 6e 73 65 72 74 29 3b 0a 20 20 66 6f 72 28 6a  Insert);.  for(j
1bc70 3d 31 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29 7b 0a 20  =1; j<n; j++){. 
1bc80 20 20 20 6d 65 6d 63 70 79 28 7a 49 6e 73 65 72     memcpy(zInser
1bc90 74 2b 69 2c 20 22 2c 3f 22 2c 20 32 29 3b 0a 20  t+i, ",?", 2);. 
1bca0 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20     i += 2;.  }. 
1bcb0 20 6d 65 6d 63 70 79 28 7a 49 6e 73 65 72 74 2b   memcpy(zInsert+
1bcc0 69 2c 20 22 29 3b 22 2c 20 33 29 3b 0a 20 20 72  i, ");", 3);.  r
1bcd0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
1bce0 61 72 65 5f 76 32 28 6e 65 77 44 62 2c 20 7a 49  are_v2(newDb, zI
1bcf0 6e 73 65 72 74 2c 20 2d 31 2c 20 26 70 49 6e 73  nsert, -1, &pIns
1bd00 65 72 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ert, 0);.  if( r
1bd10 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  c ){.    utf8_pr
1bd20 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
1bd30 72 6f 72 20 25 64 3a 20 25 73 20 6f 6e 20 5b 25  ror %d: %s on [%
1bd40 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  s]\n",.         
1bd50 20 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e     sqlite3_exten
1bd60 64 65 64 5f 65 72 72 63 6f 64 65 28 6e 65 77 44  ded_errcode(newD
1bd70 62 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  b), sqlite3_errm
1bd80 73 67 28 6e 65 77 44 62 29 2c 0a 20 20 20 20 20  sg(newDb),.     
1bd90 20 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a         zQuery);.
1bda0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74      goto end_dat
1bdb0 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20 66 6f  a_xfer;.  }.  fo
1bdc0 72 28 6b 3d 30 3b 20 6b 3c 32 3b 20 6b 2b 2b 29  r(k=0; k<2; k++)
1bdd0 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72 63  {.    while( (rc
1bde0 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
1bdf0 70 51 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45  pQuery))==SQLITE
1be00 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 66 6f  _ROW ){.      fo
1be10 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
1be20 7b 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68  {.        switch
1be30 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
1be40 5f 74 79 70 65 28 70 51 75 65 72 79 2c 20 69 29  _type(pQuery, i)
1be50 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61   ){.          ca
1be60 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20  se SQLITE_NULL: 
1be70 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
1be80 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28  lite3_bind_null(
1be90 70 49 6e 73 65 72 74 2c 20 69 2b 31 29 3b 0a 20  pInsert, i+1);. 
1bea0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1beb0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1bec0 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
1bed0 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20  ITE_INTEGER: {. 
1bee0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1bef0 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 49  e3_bind_int64(pI
1bf00 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69  nsert, i+1, sqli
1bf10 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
1bf20 28 70 51 75 65 72 79 2c 69 29 29 3b 0a 20 20 20  (pQuery,i));.   
1bf30 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1bf40 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1bf50 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
1bf60 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  E_FLOAT: {.     
1bf70 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
1bf80 69 6e 64 5f 64 6f 75 62 6c 65 28 70 49 6e 73 65  ind_double(pInse
1bf90 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33  rt, i+1, sqlite3
1bfa0 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70  _column_double(p
1bfb0 51 75 65 72 79 2c 69 29 29 3b 0a 20 20 20 20 20  Query,i));.     
1bfc0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1bfd0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1bfe0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1bff0 54 45 58 54 3a 20 7b 0a 20 20 20 20 20 20 20 20  TEXT: {.        
1c000 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
1c010 5f 74 65 78 74 28 70 49 6e 73 65 72 74 2c 20 69  _text(pInsert, i
1c020 2b 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  +1,.            
1c030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c040 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
1c050 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
1c060 74 28 70 51 75 65 72 79 2c 69 29 2c 0a 20 20 20  t(pQuery,i),.   
1c070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c080 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 53 51            -1, SQ
1c090 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
1c0a0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1c0b0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1c0c0 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
1c0d0 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TE_BLOB: {.     
1c0e0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
1c0f0 69 6e 64 5f 62 6c 6f 62 28 70 49 6e 73 65 72 74  ind_blob(pInsert
1c100 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63  , i+1, sqlite3_c
1c110 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 51 75 65 72  olumn_blob(pQuer
1c120 79 2c 69 29 2c 0a 20 20 20 20 20 20 20 20 20 20  y,i),.          
1c130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c150 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e    sqlite3_column
1c160 5f 62 79 74 65 73 28 70 51 75 65 72 79 2c 69 29  _bytes(pQuery,i)
1c170 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c180 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
1c1a0 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
1c1b0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1c1c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1c1d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f       }.      } /
1c1e0 2a 20 45 6e 64 20 66 6f 72 20 2a 2f 0a 20 20 20  * End for */.   
1c1f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
1c200 73 74 65 70 28 70 49 6e 73 65 72 74 29 3b 0a 20  step(pInsert);. 
1c210 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1c220 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
1c230 4c 49 54 45 5f 52 4f 57 20 26 26 20 72 63 21 3d  LITE_ROW && rc!=
1c240 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
1c250 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
1c260 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
1c270 72 20 25 64 3a 20 25 73 5c 6e 22 2c 20 73 71 6c  r %d: %s\n", sql
1c280 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72  ite3_extended_er
1c290 72 63 6f 64 65 28 6e 65 77 44 62 29 2c 0a 20 20  rcode(newDb),.  
1c2a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c2b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72        sqlite3_er
1c2c0 72 6d 73 67 28 6e 65 77 44 62 29 29 3b 0a 20 20  rmsg(newDb));.  
1c2d0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1c2e0 74 65 33 5f 72 65 73 65 74 28 70 49 6e 73 65 72  te3_reset(pInser
1c2f0 74 29 3b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b  t);.      cnt++;
1c300 0a 20 20 20 20 20 20 69 66 28 20 28 63 6e 74 25  .      if( (cnt%
1c310 73 70 69 6e 52 61 74 65 29 3d 3d 30 20 29 7b 0a  spinRate)==0 ){.
1c320 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
1c330 25 63 5c 62 22 2c 20 22 7c 2f 2d 5c 5c 22 5b 28  %c\b", "|/-\\"[(
1c340 63 6e 74 2f 73 70 69 6e 52 61 74 65 29 25 34 5d  cnt/spinRate)%4]
1c350 29 3b 0a 20 20 20 20 20 20 20 20 66 66 6c 75 73  );.        fflus
1c360 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20  h(stdout);.     
1c370 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20   }.    } /* End 
1c380 77 68 69 6c 65 20 2a 2f 0a 20 20 20 20 69 66 28  while */.    if(
1c390 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
1c3a0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 71   ) break;.    sq
1c3b0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
1c3c0 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69  Query);.    sqli
1c3d0 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29  te3_free(zQuery)
1c3e0 3b 0a 20 20 20 20 7a 51 75 65 72 79 20 3d 20 73  ;.    zQuery = s
1c3f0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1c400 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22  SELECT * FROM \"
1c410 25 77 5c 22 20 4f 52 44 45 52 20 42 59 20 72 6f  %w\" ORDER BY ro
1c420 77 69 64 20 44 45 53 43 3b 22 2c 0a 20 20 20 20  wid DESC;",.    
1c430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c440 20 20 20 20 20 20 20 20 20 7a 54 61 62 6c 65 29           zTable)
1c450 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1c460 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
1c470 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c  >db, zQuery, -1,
1c480 20 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20   &pQuery, 0);.  
1c490 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1c4a0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
1c4b0 64 65 72 72 2c 20 22 57 61 72 6e 69 6e 67 3a 20  derr, "Warning: 
1c4c0 63 61 6e 6e 6f 74 20 73 74 65 70 20 5c 22 25 73  cannot step \"%s
1c4d0 5c 22 20 62 61 63 6b 77 61 72 64 73 22 2c 20 7a  \" backwards", z
1c4e0 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72  Table);.      br
1c4f0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 2f  eak;.    }.  } /
1c500 2a 20 45 6e 64 20 66 6f 72 28 6b 3d 30 2e 2e 2e  * End for(k=0...
1c510 29 20 2a 2f 0a 0a 65 6e 64 5f 64 61 74 61 5f 78  ) */..end_data_x
1c520 66 65 72 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  fer:.  sqlite3_f
1c530 69 6e 61 6c 69 7a 65 28 70 51 75 65 72 79 29 3b  inalize(pQuery);
1c540 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
1c550 69 7a 65 28 70 49 6e 73 65 72 74 29 3b 0a 20 20  ize(pInsert);.  
1c560 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75  sqlite3_free(zQu
1c570 65 72 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ery);.  sqlite3_
1c580 66 72 65 65 28 7a 49 6e 73 65 72 74 29 3b 0a 7d  free(zInsert);.}
1c590 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  .../*.** Try to 
1c5a0 74 72 61 6e 73 66 65 72 20 61 6c 6c 20 72 6f 77  transfer all row
1c5b0 73 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 20  s of the schema 
1c5c0 74 68 61 74 20 6d 61 74 63 68 20 7a 57 68 65 72  that match zWher
1c5d0 65 2e 20 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20  e.  For.** each 
1c5e0 72 6f 77 2c 20 69 6e 76 6f 6b 65 20 78 46 6f 72  row, invoke xFor
1c5f0 45 61 63 68 28 29 20 6f 6e 20 74 68 65 20 6f 62  Each() on the ob
1c600 6a 65 63 74 20 64 65 66 69 6e 65 64 20 62 79 20  ject defined by 
1c610 74 68 61 74 20 72 6f 77 2e 0a 2a 2a 20 49 66 20  that row..** If 
1c620 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
1c630 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20 6d 6f  untered while mo
1c640 76 69 6e 67 20 66 6f 72 77 61 72 64 20 74 68 72  ving forward thr
1c650 6f 75 67 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69  ough the.** sqli
1c660 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2c  te_master table,
1c670 20 74 72 79 20 61 67 61 69 6e 20 6d 6f 76 69 6e   try again movin
1c680 67 20 62 61 63 6b 77 61 72 64 73 2e 0a 2a 2f 0a  g backwards..*/.
1c690 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 79 54  static void tryT
1c6a0 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 0a 20 20  oCloneSchema(.  
1c6b0 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20  ShellState *p,. 
1c6c0 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62 2c   sqlite3 *newDb,
1c6d0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1c6e0 57 68 65 72 65 2c 0a 20 20 76 6f 69 64 20 28 2a  Where,.  void (*
1c6f0 78 46 6f 72 45 61 63 68 29 28 53 68 65 6c 6c 53  xForEach)(ShellS
1c700 74 61 74 65 2a 2c 73 71 6c 69 74 65 33 2a 2c 63  tate*,sqlite3*,c
1c710 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a 20  onst char*).){. 
1c720 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1c730 51 75 65 72 79 20 3d 20 30 3b 0a 20 20 63 68 61  Query = 0;.  cha
1c740 72 20 2a 7a 51 75 65 72 79 20 3d 20 30 3b 0a 20  r *zQuery = 0;. 
1c750 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74   int rc;.  const
1c760 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1c770 7a 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 75  zName;.  const u
1c780 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 53  nsigned char *zS
1c790 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  ql;.  char *zErr
1c7a0 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 7a 51 75 65  Msg = 0;..  zQue
1c7b0 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ry = sqlite3_mpr
1c7c0 69 6e 74 66 28 22 53 45 4c 45 43 54 20 6e 61 6d  intf("SELECT nam
1c7d0 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  e, sql FROM sqli
1c7e0 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20  te_master".     
1c7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c800 20 20 20 20 20 20 22 20 57 48 45 52 45 20 25 73        " WHERE %s
1c810 22 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 72 63  ", zWhere);.  rc
1c820 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
1c830 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75  re_v2(p->db, zQu
1c840 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79  ery, -1, &pQuery
1c850 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
1c860 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
1c870 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
1c880 3a 20 28 25 64 29 20 25 73 20 6f 6e 20 5b 25 73  : (%d) %s on [%s
1c890 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ]\n",.          
1c8a0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1c8b0 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f  3_extended_errco
1c8c0 64 65 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74  de(p->db), sqlit
1c8d0 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
1c8e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c8f0 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20        zQuery);. 
1c900 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 63 68 65     goto end_sche
1c910 6d 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20 77  ma_xfer;.  }.  w
1c920 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69  hile( (rc = sqli
1c930 74 65 33 5f 73 74 65 70 28 70 51 75 65 72 79 29  te3_step(pQuery)
1c940 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
1c950 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
1c960 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
1c970 28 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20  (pQuery, 0);.   
1c980 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
1c990 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65  column_text(pQue
1c9a0 72 79 2c 20 31 29 3b 0a 20 20 20 20 70 72 69 6e  ry, 1);.    prin
1c9b0 74 66 28 22 25 73 2e 2e 2e 20 22 2c 20 7a 4e 61  tf("%s... ", zNa
1c9c0 6d 65 29 3b 20 66 66 6c 75 73 68 28 73 74 64 6f  me); fflush(stdo
1c9d0 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ut);.    sqlite3
1c9e0 5f 65 78 65 63 28 6e 65 77 44 62 2c 20 28 63 6f  _exec(newDb, (co
1c9f0 6e 73 74 20 63 68 61 72 2a 29 7a 53 71 6c 2c 20  nst char*)zSql, 
1ca00 30 2c 20 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b  0, 0, &zErrMsg);
1ca10 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67  .    if( zErrMsg
1ca20 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
1ca30 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
1ca40 72 72 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a 20 5b  rror: %s\nSQL: [
1ca50 25 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 2c  %s]\n", zErrMsg,
1ca60 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 71   zSql);.      sq
1ca70 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
1ca80 73 67 29 3b 0a 20 20 20 20 20 20 7a 45 72 72 4d  sg);.      zErrM
1ca90 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  sg = 0;.    }.  
1caa0 20 20 69 66 28 20 78 46 6f 72 45 61 63 68 20 29    if( xForEach )
1cab0 7b 0a 20 20 20 20 20 20 78 46 6f 72 45 61 63 68  {.      xForEach
1cac0 28 70 2c 20 6e 65 77 44 62 2c 20 28 63 6f 6e 73  (p, newDb, (cons
1cad0 74 20 63 68 61 72 2a 29 7a 4e 61 6d 65 29 3b 0a  t char*)zName);.
1cae0 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6e 74 66      }.    printf
1caf0 28 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20 7d 0a  ("done\n");.  }.
1cb00 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1cb10 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 73 71 6c  _DONE ){.    sql
1cb20 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51  ite3_finalize(pQ
1cb30 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  uery);.    sqlit
1cb40 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b  e3_free(zQuery);
1cb50 0a 20 20 20 20 7a 51 75 65 72 79 20 3d 20 73 71  .    zQuery = sq
1cb60 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
1cb70 45 4c 45 43 54 20 6e 61 6d 65 2c 20 73 71 6c 20  ELECT name, sql 
1cb80 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
1cb90 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  er".            
1cba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cbb0 20 22 20 57 48 45 52 45 20 25 73 20 4f 52 44 45   " WHERE %s ORDE
1cbc0 52 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22  R BY rowid DESC"
1cbd0 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 72  , zWhere);.    r
1cbe0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
1cbf0 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51  are_v2(p->db, zQ
1cc00 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72  uery, -1, &pQuer
1cc10 79 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  y, 0);.    if( r
1cc20 63 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  c ){.      utf8_
1cc30 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1cc40 45 72 72 6f 72 3a 20 28 25 64 29 20 25 73 20 6f  Error: (%d) %s o
1cc50 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20  n [%s]\n",.     
1cc60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc70 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
1cc80 64 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29  d_errcode(p->db)
1cc90 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
1cca0 28 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20  (p->db),.       
1ccb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
1ccc0 51 75 65 72 79 29 3b 0a 20 20 20 20 20 20 67 6f  Query);.      go
1ccd0 74 6f 20 65 6e 64 5f 73 63 68 65 6d 61 5f 78 66  to end_schema_xf
1cce0 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68  er;.    }.    wh
1ccf0 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74  ile( (rc = sqlit
1cd00 65 33 5f 73 74 65 70 28 70 51 75 65 72 79 29 29  e3_step(pQuery))
1cd10 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
1cd20 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
1cd30 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
1cd40 74 28 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20  t(pQuery, 0);.  
1cd50 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
1cd60 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
1cd70 51 75 65 72 79 2c 20 31 29 3b 0a 20 20 20 20 20  Query, 1);.     
1cd80 20 70 72 69 6e 74 66 28 22 25 73 2e 2e 2e 20 22   printf("%s... "
1cd90 2c 20 7a 4e 61 6d 65 29 3b 20 66 66 6c 75 73 68  , zName); fflush
1cda0 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20  (stdout);.      
1cdb0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77  sqlite3_exec(new
1cdc0 44 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  Db, (const char*
1cdd0 29 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45  )zSql, 0, 0, &zE
1cde0 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 69 66  rrMsg);.      if
1cdf0 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ( zErrMsg ){.   
1ce00 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
1ce10 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
1ce20 20 25 73 5c 6e 53 51 4c 3a 20 5b 25 73 5d 5c 6e   %s\nSQL: [%s]\n
1ce30 22 2c 20 7a 45 72 72 4d 73 67 2c 20 7a 53 71 6c  ", zErrMsg, zSql
1ce40 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1ce50 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
1ce60 3b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 4d 73  ;.        zErrMs
1ce70 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  g = 0;.      }. 
1ce80 20 20 20 20 20 69 66 28 20 78 46 6f 72 45 61 63       if( xForEac
1ce90 68 20 29 7b 0a 20 20 20 20 20 20 20 20 78 46 6f  h ){.        xFo
1cea0 72 45 61 63 68 28 70 2c 20 6e 65 77 44 62 2c 20  rEach(p, newDb, 
1ceb0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 4e 61  (const char*)zNa
1cec0 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
1ced0 20 20 20 70 72 69 6e 74 66 28 22 64 6f 6e 65 5c     printf("done\
1cee0 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 65  n");.    }.  }.e
1cef0 6e 64 5f 73 63 68 65 6d 61 5f 78 66 65 72 3a 0a  nd_schema_xfer:.
1cf00 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
1cf10 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20 73 71  ze(pQuery);.  sq
1cf20 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72  lite3_free(zQuer
1cf30 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  y);.}../*.** Ope
1cf40 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  n a new database
1cf50 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 7a 4e 65   file named "zNe
1cf60 77 44 62 22 2e 20 20 54 72 79 20 74 6f 20 72 65  wDb".  Try to re
1cf70 63 6f 76 65 72 20 61 73 20 6d 75 63 68 20 69 6e  cover as much in
1cf80 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 61 73 20  formation.** as 
1cf90 70 6f 73 73 69 62 6c 65 20 6f 75 74 20 6f 66 20  possible out of 
1cfa0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
1cfb0 65 20 28 77 68 69 63 68 20 6d 69 67 68 74 20 62  e (which might b
1cfc0 65 20 63 6f 72 72 75 70 74 29 20 61 6e 64 20 77  e corrupt) and w
1cfd0 72 69 74 65 20 69 74 0a 2a 2a 20 69 6e 74 6f 20  rite it.** into 
1cfe0 7a 4e 65 77 44 62 2e 0a 2a 2f 0a 73 74 61 74 69  zNewDb..*/.stati
1cff0 63 20 76 6f 69 64 20 74 72 79 54 6f 43 6c 6f 6e  c void tryToClon
1d000 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c  e(ShellState *p,
1d010 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65   const char *zNe
1d020 77 44 62 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  wDb){.  int rc;.
1d030 20 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62    sqlite3 *newDb
1d040 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 63 63 65   = 0;.  if( acce
1d050 73 73 28 7a 4e 65 77 44 62 2c 30 29 3d 3d 30 20  ss(zNewDb,0)==0 
1d060 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
1d070 74 66 28 73 74 64 65 72 72 2c 20 22 46 69 6c 65  tf(stderr, "File
1d080 20 5c 22 25 73 5c 22 20 61 6c 72 65 61 64 79 20   \"%s\" already 
1d090 65 78 69 73 74 73 2e 5c 6e 22 2c 20 7a 4e 65 77  exists.\n", zNew
1d0a0 44 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  Db);.    return;
1d0b0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
1d0c0 74 65 33 5f 6f 70 65 6e 28 7a 4e 65 77 44 62 2c  te3_open(zNewDb,
1d0d0 20 26 6e 65 77 44 62 29 3b 0a 20 20 69 66 28 20   &newDb);.  if( 
1d0e0 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  rc ){.    utf8_p
1d0f0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 43  rintf(stderr, "C
1d100 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 6f 75 74  annot create out
1d110 70 75 74 20 64 61 74 61 62 61 73 65 3a 20 25 73  put database: %s
1d120 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1d130 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
1d140 6e 65 77 44 62 29 29 3b 0a 20 20 7d 65 6c 73 65  newDb));.  }else
1d150 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  {.    sqlite3_ex
1d160 65 63 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d  ec(p->db, "PRAGM
1d170 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
1d180 61 3d 4f 4e 3b 22 2c 20 30 2c 20 30 2c 20 30 29  a=ON;", 0, 0, 0)
1d190 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  ;.    sqlite3_ex
1d1a0 65 63 28 6e 65 77 44 62 2c 20 22 42 45 47 49 4e  ec(newDb, "BEGIN
1d1b0 20 45 58 43 4c 55 53 49 56 45 3b 22 2c 20 30 2c   EXCLUSIVE;", 0,
1d1c0 20 30 2c 20 30 29 3b 0a 20 20 20 20 74 72 79 54   0, 0);.    tryT
1d1d0 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 70 2c 20  oCloneSchema(p, 
1d1e0 6e 65 77 44 62 2c 20 22 74 79 70 65 3d 27 74 61  newDb, "type='ta
1d1f0 62 6c 65 27 22 2c 20 74 72 79 54 6f 43 6c 6f 6e  ble'", tryToClon
1d200 65 44 61 74 61 29 3b 0a 20 20 20 20 74 72 79 54  eData);.    tryT
1d210 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 70 2c 20  oCloneSchema(p, 
1d220 6e 65 77 44 62 2c 20 22 74 79 70 65 21 3d 27 74  newDb, "type!='t
1d230 61 62 6c 65 27 22 2c 20 30 29 3b 0a 20 20 20 20  able'", 0);.    
1d240 73 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77  sqlite3_exec(new
1d250 44 62 2c 20 22 43 4f 4d 4d 49 54 3b 22 2c 20 30  Db, "COMMIT;", 0
1d260 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
1d270 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
1d280 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c   "PRAGMA writabl
1d290 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 22 2c 20  e_schema=OFF;", 
1d2a0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 0, 0);.  }.  
1d2b0 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 6e 65  sqlite3_close(ne
1d2c0 77 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  wDb);.}../*.** C
1d2d0 68 61 6e 67 65 20 74 68 65 20 6f 75 74 70 75 74  hange the output
1d2e0 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 73 74   file back to st
1d2f0 64 6f 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dout.*/.static v
1d300 6f 69 64 20 6f 75 74 70 75 74 5f 72 65 73 65 74  oid output_reset
1d310 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b  (ShellState *p){
1d320 0a 20 20 69 66 28 20 70 2d 3e 6f 75 74 66 69 6c  .  if( p->outfil
1d330 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69 66  e[0]=='|' ){.#if
1d340 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1d350 5f 50 4f 50 45 4e 0a 20 20 20 20 70 63 6c 6f 73  _POPEN.    pclos
1d360 65 28 70 2d 3e 6f 75 74 29 3b 0a 23 65 6e 64 69  e(p->out);.#endi
1d370 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  f.  }else{.    o
1d380 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65  utput_file_close
1d390 28 70 2d 3e 6f 75 74 29 3b 0a 20 20 7d 0a 20 20  (p->out);.  }.  
1d3a0 70 2d 3e 6f 75 74 66 69 6c 65 5b 30 5d 20 3d 20  p->outfile[0] = 
1d3b0 30 3b 0a 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74  0;.  p->out = st
1d3c0 64 6f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  dout;.}../*.** R
1d3d0 75 6e 20 61 6e 20 53 51 4c 20 63 6f 6d 6d 61 6e  un an SQL comman
1d3e0 64 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  d and return the
1d3f0 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20   single integer 
1d400 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69  result..*/.stati
1d410 63 20 69 6e 74 20 64 62 5f 69 6e 74 28 53 68 65  c int db_int(She
1d420 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73  llState *p, cons
1d430 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20  t char *zSql){. 
1d440 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1d450 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 65 73 20  Stmt;.  int res 
1d460 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70  = 0;.  sqlite3_p
1d470 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
1d480 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
1d490 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53 74  t, 0);.  if( pSt
1d4a0 6d 74 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  mt && sqlite3_st
1d4b0 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
1d4c0 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 72 65 73  E_ROW ){.    res
1d4d0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
1d4e0 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 30 29 3b 0a  n_int(pStmt,0);.
1d4f0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69    }.  sqlite3_fi
1d500 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
1d510 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
1d520 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
1d530 32 2d 62 79 74 65 20 6f 72 20 34 2d 62 79 74 65  2-byte or 4-byte
1d540 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
1d550 67 65 72 20 69 6e 74 6f 20 61 20 6e 61 74 69 76  ger into a nativ
1d560 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 73 74 61  e integer.*/.sta
1d570 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  tic unsigned int
1d580 20 67 65 74 32 62 79 74 65 49 6e 74 28 75 6e 73   get2byteInt(uns
1d590 69 67 6e 65 64 20 63 68 61 72 20 2a 61 29 7b 0a  igned char *a){.
1d5a0 20 20 72 65 74 75 72 6e 20 28 61 5b 30 5d 3c 3c    return (a[0]<<
1d5b0 38 29 20 2b 20 61 5b 31 5d 3b 0a 7d 0a 73 74 61  8) + a[1];.}.sta
1d5c0 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  tic unsigned int
1d5d0 20 67 65 74 34 62 79 74 65 49 6e 74 28 75 6e 73   get4byteInt(uns
1d5e0 69 67 6e 65 64 20 63 68 61 72 20 2a 61 29 7b 0a  igned char *a){.
1d5f0 20 20 72 65 74 75 72 6e 20 28 61 5b 30 5d 3c 3c    return (a[0]<<
1d600 32 34 29 20 2b 20 28 61 5b 31 5d 3c 3c 31 36 29  24) + (a[1]<<16)
1d610 20 2b 20 28 61 5b 32 5d 3c 3c 38 29 20 2b 20 61   + (a[2]<<8) + a
1d620 5b 33 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  [3];.}../*.** Im
1d630 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
1d640 74 68 65 20 22 2e 69 6e 66 6f 22 20 63 6f 6d 6d  the ".info" comm
1d650 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  and..**.** Retur
1d660 6e 20 31 20 6f 6e 20 65 72 72 6f 72 2c 20 32 20  n 1 on error, 2 
1d670 74 6f 20 65 78 69 74 2c 20 61 6e 64 20 30 20 6f  to exit, and 0 o
1d680 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
1d690 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f 64 62  tic int shell_db
1d6a0 69 6e 66 6f 5f 63 6f 6d 6d 61 6e 64 28 53 68 65  info_command(She
1d6b0 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e 74 20  llState *p, int 
1d6c0 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41  nArg, char **azA
1d6d0 72 67 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  rg){.  static co
1d6e0 6e 73 74 20 73 74 72 75 63 74 20 7b 20 63 6f 6e  nst struct { con
1d6f0 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20  st char *zName; 
1d700 69 6e 74 20 6f 66 73 74 3b 20 7d 20 61 46 69 65  int ofst; } aFie
1d710 6c 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20  ld[] = {.     { 
1d720 22 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75  "file change cou
1d730 6e 74 65 72 3a 22 2c 20 20 32 34 20 20 7d 2c 0a  nter:",  24  },.
1d740 20 20 20 20 20 7b 20 22 64 61 74 61 62 61 73 65       { "database
1d750 20 70 61 67 65 20 63 6f 75 6e 74 3a 22 2c 20 20   page count:",  
1d760 32 38 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66  28  },.     { "f
1d770 72 65 65 6c 69 73 74 20 70 61 67 65 20 63 6f 75  reelist page cou
1d780 6e 74 3a 22 2c 20 20 33 36 20 20 7d 2c 0a 20 20  nt:",  36  },.  
1d790 20 20 20 7b 20 22 73 63 68 65 6d 61 20 63 6f 6f     { "schema coo
1d7a0 6b 69 65 3a 22 2c 20 20 20 20 20 20 20 20 34 30  kie:",        40
1d7b0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63 68    },.     { "sch
1d7c0 65 6d 61 20 66 6f 72 6d 61 74 3a 22 2c 20 20 20  ema format:",   
1d7d0 20 20 20 20 20 34 34 20 20 7d 2c 0a 20 20 20 20       44  },.    
1d7e0 20 7b 20 22 64 65 66 61 75 6c 74 20 63 61 63 68   { "default cach
1d7f0 65 20 73 69 7a 65 3a 22 2c 20 20 20 34 38 20 20  e size:",   48  
1d800 7d 2c 0a 20 20 20 20 20 7b 20 22 61 75 74 6f 76  },.     { "autov
1d810 61 63 75 75 6d 20 74 6f 70 20 72 6f 6f 74 3a 22  acuum top root:"
1d820 2c 20 20 35 32 20 20 7d 2c 0a 20 20 20 20 20 7b  ,  52  },.     {
1d830 20 22 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61   "incremental va
1d840 63 75 75 6d 3a 22 2c 20 20 20 36 34 20 20 7d 2c  cuum:",   64  },
1d850 0a 20 20 20 20 20 7b 20 22 74 65 78 74 20 65 6e  .     { "text en
1d860 63 6f 64 69 6e 67 3a 22 2c 20 20 20 20 20 20 20  coding:",       
1d870 20 35 36 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   56  },.     { "
1d880 75 73 65 72 20 76 65 72 73 69 6f 6e 3a 22 2c 20  user version:", 
1d890 20 20 20 20 20 20 20 20 36 30 20 20 7d 2c 0a 20          60  },. 
1d8a0 20 20 20 20 7b 20 22 61 70 70 6c 69 63 61 74 69      { "applicati
1d8b0 6f 6e 20 69 64 3a 22 2c 20 20 20 20 20 20 20 36  on id:",       6
1d8c0 38 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 6f  8  },.     { "so
1d8d0 66 74 77 61 72 65 20 76 65 72 73 69 6f 6e 3a 22  ftware version:"
1d8e0 2c 20 20 20 20 20 39 36 20 20 7d 2c 0a 20 20 7d  ,     96  },.  }
1d8f0 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
1d900 20 73 74 72 75 63 74 20 7b 20 63 6f 6e 73 74 20   struct { const 
1d910 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 63 6f 6e  char *zName; con
1d920 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 7d  st char *zSql; }
1d930 20 61 51 75 65 72 79 5b 5d 20 3d 20 7b 0a 20 20   aQuery[] = {.  
1d940 20 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20     { "number of 
1d950 74 61 62 6c 65 73 3a 22 2c 0a 20 20 20 20 20 20  tables:",.      
1d960 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   "SELECT count(*
1d970 29 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20  ) FROM %s WHERE 
1d980 74 79 70 65 3d 27 74 61 62 6c 65 27 22 20 7d 2c  type='table'" },
1d990 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62 65 72 20  .     { "number 
1d9a0 6f 66 20 69 6e 64 65 78 65 73 3a 22 2c 0a 20 20  of indexes:",.  
1d9b0 20 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75       "SELECT cou
1d9c0 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20 57 48  nt(*) FROM %s WH
1d9d0 45 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27  ERE type='index'
1d9e0 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6e 75 6d  " },.     { "num
1d9f0 62 65 72 20 6f 66 20 74 72 69 67 67 65 72 73 3a  ber of triggers:
1da00 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43  ",.       "SELEC
1da10 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
1da20 25 73 20 57 48 45 52 45 20 74 79 70 65 3d 27 74  %s WHERE type='t
1da30 72 69 67 67 65 72 27 22 20 7d 2c 0a 20 20 20 20  rigger'" },.    
1da40 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20 76 69   { "number of vi
1da50 65 77 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 53  ews:",.       "S
1da60 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
1da70 52 4f 4d 20 25 73 20 57 48 45 52 45 20 74 79 70  ROM %s WHERE typ
1da80 65 3d 27 76 69 65 77 27 22 20 7d 2c 0a 20 20 20  e='view'" },.   
1da90 20 20 7b 20 22 73 63 68 65 6d 61 20 73 69 7a 65    { "schema size
1daa0 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45  :",.       "SELE
1dab0 43 54 20 74 6f 74 61 6c 28 6c 65 6e 67 74 68 28  CT total(length(
1dac0 73 71 6c 29 29 20 46 52 4f 4d 20 25 73 22 20 7d  sql)) FROM %s" }
1dad0 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  ,.  };.  int i;.
1dae0 20 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 54    char *zSchemaT
1daf0 61 62 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62 20  ab;.  char *zDb 
1db00 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72  = nArg>=2 ? azAr
1db10 67 5b 31 5d 20 3a 20 22 6d 61 69 6e 22 3b 0a 20  g[1] : "main";. 
1db20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1db30 53 74 6d 74 20 3d 20 30 3b 0a 20 20 75 6e 73 69  Stmt = 0;.  unsi
1db40 67 6e 65 64 20 63 68 61 72 20 61 48 64 72 5b 31  gned char aHdr[1
1db50 30 30 5d 3b 0a 20 20 6f 70 65 6e 5f 64 62 28 70  00];.  open_db(p
1db60 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64  , 0);.  if( p->d
1db70 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  b==0 ) return 1;
1db80 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  .  sqlite3_prepa
1db90 72 65 5f 76 32 28 70 2d 3e 64 62 2c 22 53 45 4c  re_v2(p->db,"SEL
1dba0 45 43 54 20 64 61 74 61 20 46 52 4f 4d 20 73 71  ECT data FROM sq
1dbb0 6c 69 74 65 5f 64 62 70 61 67 65 28 3f 31 29 20  lite_dbpage(?1) 
1dbc0 57 48 45 52 45 20 70 67 6e 6f 3d 31 22 2c 0a 20  WHERE pgno=1",. 
1dbd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1dbe0 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20      -1, &pStmt, 
1dbf0 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69  0);.  sqlite3_bi
1dc00 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31  nd_text(pStmt, 1
1dc10 2c 20 7a 44 62 2c 20 2d 31 2c 20 53 51 4c 49 54  , zDb, -1, SQLIT
1dc20 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28  E_STATIC);.  if(
1dc30 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
1dc40 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
1dc50 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 63  .   && sqlite3_c
1dc60 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d  olumn_bytes(pStm
1dc70 74 2c 30 29 3e 31 30 30 0a 20 20 29 7b 0a 20 20  t,0)>100.  ){.  
1dc80 20 20 6d 65 6d 63 70 79 28 61 48 64 72 2c 20 73    memcpy(aHdr, s
1dc90 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
1dca0 6f 62 28 70 53 74 6d 74 2c 30 29 2c 20 31 30 30  ob(pStmt,0), 100
1dcb0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
1dcc0 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
1dcd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 61 77    }else{.    raw
1dce0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
1dcf0 22 75 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20  "unable to read 
1dd00 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 5c  database header\
1dd10 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  n");.    sqlite3
1dd20 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
1dd30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
1dd40 20 20 7d 0a 20 20 69 20 3d 20 67 65 74 32 62 79    }.  i = get2by
1dd50 74 65 49 6e 74 28 61 48 64 72 2b 31 36 29 3b 0a  teInt(aHdr+16);.
1dd60 20 20 69 66 28 20 69 3d 3d 31 20 29 20 69 20 3d    if( i==1 ) i =
1dd70 20 36 35 35 33 36 3b 0a 20 20 75 74 66 38 5f 70   65536;.  utf8_p
1dd80 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
1dd90 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22 64 61 74  -20s %d\n", "dat
1dda0 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 3a  abase page size:
1ddb0 22 2c 20 69 29 3b 0a 20 20 75 74 66 38 5f 70 72  ", i);.  utf8_pr
1ddc0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d  intf(p->out, "%-
1ddd0 32 30 73 20 25 64 5c 6e 22 2c 20 22 77 72 69 74  20s %d\n", "writ
1dde0 65 20 66 6f 72 6d 61 74 3a 22 2c 20 61 48 64 72  e format:", aHdr
1ddf0 5b 31 38 5d 29 3b 0a 20 20 75 74 66 38 5f 70 72  [18]);.  utf8_pr
1de00 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d  intf(p->out, "%-
1de10 32 30 73 20 25 64 5c 6e 22 2c 20 22 72 65 61 64  20s %d\n", "read
1de20 20 66 6f 72 6d 61 74 3a 22 2c 20 61 48 64 72 5b   format:", aHdr[
1de30 31 39 5d 29 3b 0a 20 20 75 74 66 38 5f 70 72 69  19]);.  utf8_pri
1de40 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32  ntf(p->out, "%-2
1de50 30 73 20 25 64 5c 6e 22 2c 20 22 72 65 73 65 72  0s %d\n", "reser
1de60 76 65 64 20 62 79 74 65 73 3a 22 2c 20 61 48 64  ved bytes:", aHd
1de70 72 5b 32 30 5d 29 3b 0a 20 20 66 6f 72 28 69 3d  r[20]);.  for(i=
1de80 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
1de90 46 69 65 6c 64 29 3b 20 69 2b 2b 29 7b 0a 20 20  Field); i++){.  
1dea0 20 20 69 6e 74 20 6f 66 73 74 20 3d 20 61 46 69    int ofst = aFi
1deb0 65 6c 64 5b 69 5d 2e 6f 66 73 74 3b 0a 20 20 20  eld[i].ofst;.   
1dec0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 76 61   unsigned int va
1ded0 6c 20 3d 20 67 65 74 34 62 79 74 65 49 6e 74 28  l = get4byteInt(
1dee0 61 48 64 72 20 2b 20 6f 66 73 74 29 3b 0a 20 20  aHdr + ofst);.  
1def0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
1df00 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 75 22  >out, "%-20s %u"
1df10 2c 20 61 46 69 65 6c 64 5b 69 5d 2e 7a 4e 61 6d  , aField[i].zNam
1df20 65 2c 20 76 61 6c 29 3b 0a 20 20 20 20 73 77 69  e, val);.    swi
1df30 74 63 68 28 20 6f 66 73 74 20 29 7b 0a 20 20 20  tch( ofst ){.   
1df40 20 20 20 63 61 73 65 20 35 36 3a 20 7b 0a 20 20     case 56: {.  
1df50 20 20 20 20 20 20 69 66 28 20 76 61 6c 3d 3d 31        if( val==1
1df60 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d   ) raw_printf(p-
1df70 3e 6f 75 74 2c 20 22 20 28 75 74 66 38 29 22 29  >out, " (utf8)")
1df80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 76 61  ;.        if( va
1df90 6c 3d 3d 32 20 29 20 72 61 77 5f 70 72 69 6e 74  l==2 ) raw_print
1dfa0 66 28 70 2d 3e 6f 75 74 2c 20 22 20 28 75 74 66  f(p->out, " (utf
1dfb0 31 36 6c 65 29 22 29 3b 0a 20 20 20 20 20 20 20  16le)");.       
1dfc0 20 69 66 28 20 76 61 6c 3d 3d 33 20 29 20 72 61   if( val==3 ) ra
1dfd0 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
1dfe0 20 22 20 28 75 74 66 31 36 62 65 29 22 29 3b 0a   " (utf16be)");.
1dff0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1e000 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
1e010 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d 0a  out, "\n");.  }.
1e020 20 20 69 66 28 20 7a 44 62 3d 3d 30 20 29 7b 0a    if( zDb==0 ){.
1e030 20 20 20 20 7a 53 63 68 65 6d 61 54 61 62 20 3d      zSchemaTab =
1e040 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1e050 28 22 6d 61 69 6e 2e 73 71 6c 69 74 65 5f 6d 61  ("main.sqlite_ma
1e060 73 74 65 72 22 29 3b 0a 20 20 7d 65 6c 73 65 20  ster");.  }else 
1e070 69 66 28 20 73 74 72 63 6d 70 28 7a 44 62 2c 22  if( strcmp(zDb,"
1e080 74 65 6d 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20  temp")==0 ){.   
1e090 20 7a 53 63 68 65 6d 61 54 61 62 20 3d 20 73 71   zSchemaTab = sq
1e0a0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
1e0b0 73 22 2c 20 22 73 71 6c 69 74 65 5f 74 65 6d 70  s", "sqlite_temp
1e0c0 5f 6d 61 73 74 65 72 22 29 3b 0a 20 20 7d 65 6c  _master");.  }el
1e0d0 73 65 7b 0a 20 20 20 20 7a 53 63 68 65 6d 61 54  se{.    zSchemaT
1e0e0 61 62 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ab = sqlite3_mpr
1e0f0 69 6e 74 66 28 22 5c 22 25 77 5c 22 2e 73 71 6c  intf("\"%w\".sql
1e100 69 74 65 5f 6d 61 73 74 65 72 22 2c 20 7a 44 62  ite_master", zDb
1e110 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
1e120 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 51  ; i<ArraySize(aQ
1e130 75 65 72 79 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  uery); i++){.   
1e140 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71   char *zSql = sq
1e150 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 51  lite3_mprintf(aQ
1e160 75 65 72 79 5b 69 5d 2e 7a 53 71 6c 2c 20 7a 53  uery[i].zSql, zS
1e170 63 68 65 6d 61 54 61 62 29 3b 0a 20 20 20 20 69  chemaTab);.    i
1e180 6e 74 20 76 61 6c 20 3d 20 64 62 5f 69 6e 74 28  nt val = db_int(
1e190 70 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 73 71  p, zSql);.    sq
1e1a0 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
1e1b0 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  ;.    utf8_print
1e1c0 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73  f(p->out, "%-20s
1e1d0 20 25 64 5c 6e 22 2c 20 61 51 75 65 72 79 5b 69   %d\n", aQuery[i
1e1e0 5d 2e 7a 4e 61 6d 65 2c 20 76 61 6c 29 3b 0a 20  ].zName, val);. 
1e1f0 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
1e200 65 28 7a 53 63 68 65 6d 61 54 61 62 29 3b 0a 20  e(zSchemaTab);. 
1e210 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1e220 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63 75  .** Print the cu
1e230 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 72  rrent sqlite3_er
1e240 72 6d 73 67 28 29 20 76 61 6c 75 65 20 74 6f 20  rmsg() value to 
1e250 73 74 64 65 72 72 20 61 6e 64 20 72 65 74 75 72  stderr and retur
1e260 6e 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n 1..*/.static i
1e270 6e 74 20 73 68 65 6c 6c 44 61 74 61 62 61 73 65  nt shellDatabase
1e280 45 72 72 6f 72 28 73 71 6c 69 74 65 33 20 2a 64  Error(sqlite3 *d
1e290 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b){.  const char
1e2a0 20 2a 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33   *zErr = sqlite3
1e2b0 5f 65 72 72 6d 73 67 28 64 62 29 3b 0a 20 20 75  _errmsg(db);.  u
1e2c0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
1e2d0 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  r, "Error: %s\n"
1e2e0 2c 20 7a 45 72 72 29 3b 0a 20 20 72 65 74 75 72  , zErr);.  retur
1e2f0 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  n 1;.}../*.** Pr
1e300 69 6e 74 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65  int an out-of-me
1e310 6d 6f 72 79 20 6d 65 73 73 61 67 65 20 74 6f 20  mory message to 
1e320 73 74 64 65 72 72 20 61 6e 64 20 72 65 74 75 72  stderr and retur
1e330 6e 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n 1..*/.static i
1e340 6e 74 20 73 68 65 6c 6c 4e 6f 6d 65 6d 45 72 72  nt shellNomemErr
1e350 6f 72 28 76 6f 69 64 29 7b 0a 20 20 72 61 77 5f  or(void){.  raw_
1e360 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1e370 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65  Error: out of me
1e380 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 72 65 74 75  mory\n");.  retu
1e390 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 1;.}../*.** C
1e3a0 6f 6d 70 61 72 65 20 74 68 65 20 70 61 74 74 65  ompare the patte
1e3b0 72 6e 20 69 6e 20 7a 47 6c 6f 62 5b 5d 20 61 67  rn in zGlob[] ag
1e3c0 61 69 6e 73 74 20 74 68 65 20 74 65 78 74 20 69  ainst the text i
1e3d0 6e 20 7a 5b 5d 2e 20 20 52 65 74 75 72 6e 20 54  n z[].  Return T
1e3e0 52 55 45 0a 2a 2a 20 69 66 20 74 68 65 79 20 6d  RUE.** if they m
1e3f0 61 74 63 68 20 61 6e 64 20 46 41 4c 53 45 20 28  atch and FALSE (
1e400 30 29 20 69 66 20 74 68 65 79 20 64 6f 20 6e 6f  0) if they do no
1e410 74 20 6d 61 74 63 68 2e 0a 2a 2a 0a 2a 2a 20 47  t match..**.** G
1e420 6c 6f 62 62 69 6e 67 20 72 75 6c 65 73 3a 0a 2a  lobbing rules:.*
1e430 2a 0a 2a 2a 20 20 20 20 20 20 27 2a 27 20 20 20  *.**      '*'   
1e440 20 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79 20      Matches any 
1e450 73 65 71 75 65 6e 63 65 20 6f 66 20 7a 65 72 6f  sequence of zero
1e460 20 6f 72 20 6d 6f 72 65 20 63 68 61 72 61 63 74   or more charact
1e470 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ers..**.**      
1e480 27 3f 27 20 20 20 20 20 20 20 4d 61 74 63 68 65  '?'       Matche
1e490 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 68  s exactly one ch
1e4a0 61 72 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20  aracter..**.**  
1e4b0 20 20 20 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d 61     [...]      Ma
1e4c0 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63  tches one charac
1e4d0 74 65 72 20 66 72 6f 6d 20 74 68 65 20 65 6e 63  ter from the enc
1e4e0 6c 6f 73 65 64 20 6c 69 73 74 20 6f 66 0a 2a 2a  losed list of.**
1e4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e500 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a  characters..**.*
1e510 2a 20 20 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20 20  *     [^...]    
1e520 20 4d 61 74 63 68 65 73 20 6f 6e 65 20 63 68 61   Matches one cha
1e530 72 61 63 74 65 72 20 6e 6f 74 20 69 6e 20 74 68  racter not in th
1e540 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74 2e  e enclosed list.
1e550 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 23 27 20  .**.**      '#' 
1e560 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 61 6e        Matches an
1e570 79 20 73 65 71 75 65 6e 63 65 20 6f 66 20 6f 6e  y sequence of on
1e580 65 20 6f 72 20 6d 6f 72 65 20 64 69 67 69 74 73  e or more digits
1e590 20 77 69 74 68 20 61 6e 0a 2a 2a 20 20 20 20 20   with an.**     
1e5a0 20 20 20 20 20 20 20 20 20 20 20 6f 70 74 69 6f             optio
1e5b0 6e 61 6c 20 2b 20 6f 72 20 2d 20 73 69 67 6e 20  nal + or - sign 
1e5c0 69 6e 20 66 72 6f 6e 74 0a 2a 2a 0a 2a 2a 20 20  in front.**.**  
1e5d0 20 20 20 20 27 20 27 20 20 20 20 20 20 20 41 6e      ' '       An
1e5e0 79 20 73 70 61 6e 20 6f 66 20 77 68 69 74 65 73  y span of whites
1e5f0 70 61 63 65 20 6d 61 74 63 68 65 73 20 61 6e 79  pace matches any
1e600 20 6f 74 68 65 72 20 73 70 61 6e 20 6f 66 0a 2a   other span of.*
1e610 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1e620 20 77 68 69 74 65 73 70 61 63 65 2e 0a 2a 2a 0a   whitespace..**.
1e630 2a 2a 20 45 78 74 72 61 20 77 68 69 74 65 73 70  ** Extra whitesp
1e640 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ace at the end o
1e650 66 20 7a 5b 5d 20 69 73 20 69 67 6e 6f 72 65 64  f z[] is ignored
1e660 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1e670 74 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 63 6f  testcase_glob(co
1e680 6e 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62 2c  nst char *zGlob,
1e690 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b   const char *z){
1e6a0 0a 20 20 69 6e 74 20 63 2c 20 63 32 3b 0a 20 20  .  int c, c2;.  
1e6b0 69 6e 74 20 69 6e 76 65 72 74 3b 0a 20 20 69 6e  int invert;.  in
1e6c0 74 20 73 65 65 6e 3b 0a 0a 20 20 77 68 69 6c 65  t seen;..  while
1e6d0 28 20 28 63 20 3d 20 28 2a 28 7a 47 6c 6f 62 2b  ( (c = (*(zGlob+
1e6e0 2b 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  +)))!=0 ){.    i
1e6f0 66 28 20 49 73 53 70 61 63 65 28 63 29 20 29 7b  f( IsSpace(c) ){
1e700 0a 20 20 20 20 20 20 69 66 28 20 21 49 73 53 70  .      if( !IsSp
1e710 61 63 65 28 2a 7a 29 20 29 20 72 65 74 75 72 6e  ace(*z) ) return
1e720 20 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   0;.      while(
1e730 20 49 73 53 70 61 63 65 28 2a 7a 47 6c 6f 62 29   IsSpace(*zGlob)
1e740 20 29 20 7a 47 6c 6f 62 2b 2b 3b 0a 20 20 20 20   ) zGlob++;.    
1e750 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65    while( IsSpace
1e760 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  (*z) ) z++;.    
1e770 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 2a 27  }else if( c=='*'
1e780 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   ){.      while(
1e790 20 28 63 3d 28 2a 28 7a 47 6c 6f 62 2b 2b 29 29   (c=(*(zGlob++))
1e7a0 29 20 3d 3d 20 27 2a 27 20 7c 7c 20 63 3d 3d 27  ) == '*' || c=='
1e7b0 3f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ?' ){.        if
1e7c0 28 20 63 3d 3d 27 3f 27 20 26 26 20 28 2a 28 7a  ( c=='?' && (*(z
1e7d0 2b 2b 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ++))==0 ) return
1e7e0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1e7f0 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20    if( c==0 ){.  
1e800 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1e810 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1e820 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20  c=='[' ){.      
1e830 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 74    while( *z && t
1e840 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 7a 47 6c  estcase_glob(zGl
1e850 6f 62 2d 31 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20  ob-1,z)==0 ){.  
1e860 20 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20          z++;.   
1e870 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
1e880 65 74 75 72 6e 20 28 2a 7a 29 21 3d 30 3b 0a 20  eturn (*z)!=0;. 
1e890 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69       }.      whi
1e8a0 6c 65 28 20 28 63 32 20 3d 20 28 2a 28 7a 2b 2b  le( (c2 = (*(z++
1e8b0 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  )))!=0 ){.      
1e8c0 20 20 77 68 69 6c 65 28 20 63 32 21 3d 63 20 29    while( c2!=c )
1e8d0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 32 20 3d  {.          c2 =
1e8e0 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 20 20 20   *(z++);.       
1e8f0 20 20 20 69 66 28 20 63 32 3d 3d 30 20 29 20 72     if( c2==0 ) r
1e900 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
1e910 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 74   }.        if( t
1e920 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 7a 47 6c  estcase_glob(zGl
1e930 6f 62 2c 7a 29 20 29 20 72 65 74 75 72 6e 20 31  ob,z) ) return 1
1e940 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1e950 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65  return 0;.    }e
1e960 6c 73 65 20 69 66 28 20 63 3d 3d 27 3f 27 20 29  lse if( c=='?' )
1e970 7b 0a 20 20 20 20 20 20 69 66 28 20 28 2a 28 7a  {.      if( (*(z
1e980 2b 2b 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ++))==0 ) return
1e990 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
1e9a0 28 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20  ( c=='[' ){.    
1e9b0 20 20 69 6e 74 20 70 72 69 6f 72 5f 63 20 3d 20    int prior_c = 
1e9c0 30 3b 0a 20 20 20 20 20 20 73 65 65 6e 20 3d 20  0;.      seen = 
1e9d0 30 3b 0a 20 20 20 20 20 20 69 6e 76 65 72 74 20  0;.      invert 
1e9e0 3d 20 30 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a  = 0;.      c = *
1e9f0 28 7a 2b 2b 29 3b 0a 20 20 20 20 20 20 69 66 28  (z++);.      if(
1ea00 20 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   c==0 ) return 0
1ea10 3b 0a 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a  ;.      c2 = *(z
1ea20 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 69  Glob++);.      i
1ea30 66 28 20 63 32 3d 3d 27 5e 27 20 29 7b 0a 20 20  f( c2=='^' ){.  
1ea40 20 20 20 20 20 20 69 6e 76 65 72 74 20 3d 20 31        invert = 1
1ea50 3b 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a  ;.        c2 = *
1ea60 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20  (zGlob++);.     
1ea70 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d   }.      if( c2=
1ea80 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =']' ){.        
1ea90 69 66 28 20 63 3d 3d 27 5d 27 20 29 20 73 65 65  if( c==']' ) see
1eaa0 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63  n = 1;.        c
1eab0 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a  2 = *(zGlob++);.
1eac0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68        }.      wh
1ead0 69 6c 65 28 20 63 32 20 26 26 20 63 32 21 3d 27  ile( c2 && c2!='
1eae0 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ]' ){.        if
1eaf0 28 20 63 32 3d 3d 27 2d 27 20 26 26 20 7a 47 6c  ( c2=='-' && zGl
1eb00 6f 62 5b 30 5d 21 3d 27 5d 27 20 26 26 20 7a 47  ob[0]!=']' && zG
1eb10 6c 6f 62 5b 30 5d 21 3d 30 20 26 26 20 70 72 69  lob[0]!=0 && pri
1eb20 6f 72 5f 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  or_c>0 ){.      
1eb30 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62      c2 = *(zGlob
1eb40 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ++);.          i
1eb50 66 28 20 63 3e 3d 70 72 69 6f 72 5f 63 20 26 26  f( c>=prior_c &&
1eb60 20 63 3c 3d 63 32 20 29 20 73 65 65 6e 20 3d 20   c<=c2 ) seen = 
1eb70 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72 69  1;.          pri
1eb80 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  or_c = 0;.      
1eb90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1eba0 20 20 20 69 66 28 20 63 3d 3d 63 32 20 29 7b 0a     if( c==c2 ){.
1ebb0 20 20 20 20 20 20 20 20 20 20 20 20 73 65 65 6e              seen
1ebc0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
1ebd0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6f  }.          prio
1ebe0 72 5f 63 20 3d 20 63 32 3b 0a 20 20 20 20 20 20  r_c = c2;.      
1ebf0 20 20 7d 0a 20 20 20 20 20 20 20 20 63 32 20 3d    }.        c2 =
1ec00 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20   *(zGlob++);.   
1ec10 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
1ec20 32 3d 3d 30 20 7c 7c 20 28 73 65 65 6e 20 5e 20  2==0 || (seen ^ 
1ec30 69 6e 76 65 72 74 29 3d 3d 30 20 29 20 72 65 74  invert)==0 ) ret
1ec40 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  urn 0;.    }else
1ec50 20 69 66 28 20 63 3d 3d 27 23 27 20 29 7b 0a 20   if( c=='#' ){. 
1ec60 20 20 20 20 20 69 66 28 20 28 7a 5b 30 5d 3d 3d       if( (z[0]==
1ec70 27 2d 27 20 7c 7c 20 7a 5b 30 5d 3d 3d 27 2b 27  '-' || z[0]=='+'
1ec80 29 20 26 26 20 49 73 44 69 67 69 74 28 7a 5b 31  ) && IsDigit(z[1
1ec90 5d 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20  ]) ) z++;.      
1eca0 69 66 28 20 21 49 73 44 69 67 69 74 28 7a 5b 30  if( !IsDigit(z[0
1ecb0 5d 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ]) ) return 0;. 
1ecc0 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20       z++;.      
1ecd0 77 68 69 6c 65 28 20 49 73 44 69 67 69 74 28 7a  while( IsDigit(z
1ece0 5b 30 5d 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20  [0]) ){ z++; }. 
1ecf0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1ed00 69 66 28 20 63 21 3d 28 2a 28 7a 2b 2b 29 29 20  if( c!=(*(z++)) 
1ed10 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
1ed20 7d 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 49  }.  }.  while( I
1ed30 73 53 70 61 63 65 28 2a 7a 29 20 29 7b 20 7a 2b  sSpace(*z) ){ z+
1ed40 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a  +; }.  return *z
1ed50 3d 3d 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  ==0;.}.../*.** C
1ed60 6f 6d 70 61 72 65 20 74 68 65 20 73 74 72 69 6e  ompare the strin
1ed70 67 20 61 73 20 61 20 63 6f 6d 6d 61 6e 64 2d 6c  g as a command-l
1ed80 69 6e 65 20 6f 70 74 69 6f 6e 20 77 69 74 68 20  ine option with 
1ed90 65 69 74 68 65 72 20 6f 6e 65 20 6f 72 20 74 77  either one or tw
1eda0 6f 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 22 2d 22  o.** initial "-"
1edb0 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a   characters..*/.
1edc0 73 74 61 74 69 63 20 69 6e 74 20 6f 70 74 69 6f  static int optio
1edd0 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61  nMatch(const cha
1ede0 72 20 2a 7a 53 74 72 2c 20 63 6f 6e 73 74 20 63  r *zStr, const c
1edf0 68 61 72 20 2a 7a 4f 70 74 29 7b 0a 20 20 69 66  har *zOpt){.  if
1ee00 28 20 7a 53 74 72 5b 30 5d 21 3d 27 2d 27 20 29  ( zStr[0]!='-' )
1ee10 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 53 74   return 0;.  zSt
1ee20 72 2b 2b 3b 0a 20 20 69 66 28 20 7a 53 74 72 5b  r++;.  if( zStr[
1ee30 30 5d 3d 3d 27 2d 27 20 29 20 7a 53 74 72 2b 2b  0]=='-' ) zStr++
1ee40 3b 0a 20 20 72 65 74 75 72 6e 20 73 74 72 63 6d  ;.  return strcm
1ee50 70 28 7a 53 74 72 2c 20 7a 4f 70 74 29 3d 3d 30  p(zStr, zOpt)==0
1ee60 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
1ee70 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74  e a file..*/.int
1ee80 20 73 68 65 6c 6c 44 65 6c 65 74 65 46 69 6c 65   shellDeleteFile
1ee90 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
1eea0 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 72  lename){.  int r
1eeb0 63 3b 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32  c;.#ifdef _WIN32
1eec0 0a 20 20 77 63 68 61 72 5f 74 20 2a 7a 20 3d 20  .  wchar_t *z = 
1eed0 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74  sqlite3_win32_ut
1eee0 66 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 7a 46  f8_to_unicode(zF
1eef0 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 63 20 3d  ilename);.  rc =
1ef00 20 5f 77 75 6e 6c 69 6e 6b 28 7a 29 3b 0a 20 20   _wunlink(z);.  
1ef10 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
1ef20 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d 20 75 6e  .#else.  rc = un
1ef30 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  link(zFilename);
1ef40 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
1ef50 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
1ef60 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
1ef70 6e 20 6f 66 20 53 51 4c 20 73 63 61 6c 61 72 20  n of SQL scalar 
1ef80 66 75 6e 63 74 69 6f 6e 20 66 6b 65 79 5f 63 6f  function fkey_co
1ef90 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 29 2c 20  llate_clause(), 
1efa0 75 73 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 22  used.** by the "
1efb0 2e 6c 69 6e 74 20 66 6b 65 79 2d 69 6e 64 65 78  .lint fkey-index
1efc0 65 73 22 20 63 6f 6d 6d 61 6e 64 2e 20 54 68 69  es" command. Thi
1efd0 73 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f  s scalar functio
1efe0 6e 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 63  n is always.** c
1eff0 61 6c 6c 65 64 20 77 69 74 68 20 66 6f 75 72 20  alled with four 
1f000 61 72 67 75 6d 65 6e 74 73 20 2d 20 74 68 65 20  arguments - the 
1f010 70 61 72 65 6e 74 20 74 61 62 6c 65 20 6e 61 6d  parent table nam
1f020 65 2c 20 74 68 65 20 70 61 72 65 6e 74 20 63 6f  e, the parent co
1f030 6c 75 6d 6e 20 6e 61 6d 65 2c 0a 2a 2a 20 74 68  lumn name,.** th
1f040 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20 6e 61  e child table na
1f050 6d 65 20 61 6e 64 20 74 68 65 20 63 68 69 6c 64  me and the child
1f060 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2a   column name..**
1f070 0a 2a 2a 20 20 20 66 6b 65 79 5f 63 6f 6c 6c 61  .**   fkey_colla
1f080 74 65 5f 63 6c 61 75 73 65 28 27 70 61 72 65 6e  te_clause('paren
1f090 74 2d 74 61 62 27 2c 20 27 70 61 72 65 6e 74 2d  t-tab', 'parent-
1f0a0 63 6f 6c 27 2c 20 27 63 68 69 6c 64 2d 74 61 62  col', 'child-tab
1f0b0 27 2c 20 27 63 68 69 6c 64 2d 63 6f 6c 27 29 0a  ', 'child-col').
1f0c0 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  **.** If either 
1f0d0 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62  of the named tab
1f0e0 6c 65 73 20 6f 72 20 63 6f 6c 75 6d 6e 73 20 64  les or columns d
1f0f0 6f 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 69  o not exist, thi
1f100 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65  s function.** re
1f110 74 75 72 6e 73 20 61 6e 20 65 6d 70 74 79 20 73  turns an empty s
1f120 74 72 69 6e 67 2e 20 41 6e 20 65 6d 70 74 79 20  tring. An empty 
1f130 73 74 72 69 6e 67 20 69 73 20 61 6c 73 6f 20 72  string is also r
1f140 65 74 75 72 6e 65 64 20 69 66 20 62 6f 74 68 20  eturned if both 
1f150 74 61 62 6c 65 73 0a 2a 2a 20 61 6e 64 20 63 6f  tables.** and co
1f160 6c 75 6d 6e 73 20 65 78 69 73 74 20 62 75 74 20  lumns exist but 
1f170 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 64 65  have the same de
1f180 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
1f190 73 65 71 75 65 6e 63 65 2e 20 4f 72 2c 0a 2a 2a  sequence. Or,.**
1f1a0 20 69 66 20 62 6f 74 68 20 65 78 69 73 74 20 62   if both exist b
1f1b0 75 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 63  ut the default c
1f1c0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1f1d0 65 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  es are different
1f1e0 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
1f1f0 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  on returns the s
1f200 74 72 69 6e 67 20 22 20 43 4f 4c 4c 41 54 45 20  tring " COLLATE 
1f210 3c 70 61 72 65 6e 74 2d 63 6f 6c 6c 61 74 69 6f  <parent-collatio
1f220 6e 3e 22 2c 20 77 68 65 72 65 0a 2a 2a 20 3c 70  n>", where.** <p
1f230 61 72 65 6e 74 2d 63 6f 6c 6c 61 74 69 6f 6e 3e  arent-collation>
1f240 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20   is the default 
1f250 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1f260 63 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  ce of the parent
1f270 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74   column..*/.stat
1f280 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 46 6b 65  ic void shellFke
1f290 79 43 6f 6c 6c 61 74 65 43 6c 61 75 73 65 28 0a  yCollateClause(.
1f2a0 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
1f2b0 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e  t *pCtx,.  int n
1f2c0 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Val,.  sqlite3_v
1f2d0 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a  alue **apVal.){.
1f2e0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1f2f0 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f  sqlite3_context_
1f300 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78 29 3b  db_handle(pCtx);
1f310 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1f320 50 61 72 65 6e 74 3b 0a 20 20 63 6f 6e 73 74 20  Parent;.  const 
1f330 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6c  char *zParentCol
1f340 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1f350 7a 50 61 72 65 6e 74 53 65 71 3b 0a 20 20 63 6f  zParentSeq;.  co
1f360 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 69 6c 64  nst char *zChild
1f370 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1f380 7a 43 68 69 6c 64 43 6f 6c 3b 0a 20 20 63 6f 6e  zChildCol;.  con
1f390 73 74 20 63 68 61 72 20 2a 7a 43 68 69 6c 64 53  st char *zChildS
1f3a0 65 71 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 69 74  eq = 0;  /* Init
1f3b0 69 61 6c 69 7a 65 20 74 6f 20 61 76 6f 69 64 20  ialize to avoid 
1f3c0 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77  false-positive w
1f3d0 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  arning */.  int 
1f3e0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  rc;..  assert( n
1f3f0 56 61 6c 3d 3d 34 20 29 3b 0a 20 20 7a 50 61 72  Val==4 );.  zPar
1f400 65 6e 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ent = (const cha
1f410 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
1f420 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b  _text(apVal[0]);
1f430 0a 20 20 7a 50 61 72 65 6e 74 43 6f 6c 20 3d 20  .  zParentCol = 
1f440 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
1f450 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
1f460 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 7a 43 68  apVal[1]);.  zCh
1f470 69 6c 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ild = (const cha
1f480 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
1f490 5f 74 65 78 74 28 61 70 56 61 6c 5b 32 5d 29 3b  _text(apVal[2]);
1f4a0 0a 20 20 7a 43 68 69 6c 64 43 6f 6c 20 3d 20 28  .  zChildCol = (
1f4b0 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
1f4c0 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
1f4d0 70 56 61 6c 5b 33 5d 29 3b 0a 0a 20 20 73 71 6c  pVal[3]);..  sql
1f4e0 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
1f4f0 28 70 43 74 78 2c 20 22 22 2c 20 2d 31 2c 20 53  (pCtx, "", -1, S
1f500 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
1f510 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61   rc = sqlite3_ta
1f520 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64  ble_column_metad
1f530 61 74 61 28 0a 20 20 20 20 20 20 64 62 2c 20 22  ata(.      db, "
1f540 6d 61 69 6e 22 2c 20 7a 50 61 72 65 6e 74 2c 20  main", zParent, 
1f550 7a 50 61 72 65 6e 74 43 6f 6c 2c 20 30 2c 20 26  zParentCol, 0, &
1f560 7a 50 61 72 65 6e 74 53 65 71 2c 20 30 2c 20 30  zParentSeq, 0, 0
1f570 2c 20 30 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  , 0.  );.  if( r
1f580 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1f590 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1f5a0 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65  _table_column_me
1f5b0 74 61 64 61 74 61 28 0a 20 20 20 20 20 20 20 20  tadata(.        
1f5c0 64 62 2c 20 22 6d 61 69 6e 22 2c 20 7a 43 68 69  db, "main", zChi
1f5d0 6c 64 2c 20 7a 43 68 69 6c 64 43 6f 6c 2c 20 30  ld, zChildCol, 0
1f5e0 2c 20 26 7a 43 68 69 6c 64 53 65 71 2c 20 30 2c  , &zChildSeq, 0,
1f5f0 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d   0, 0.    );.  }
1f600 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
1f610 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65 33  TE_OK && sqlite3
1f620 5f 73 74 72 69 63 6d 70 28 7a 50 61 72 65 6e 74  _stricmp(zParent
1f630 53 65 71 2c 20 7a 43 68 69 6c 64 53 65 71 29 20  Seq, zChildSeq) 
1f640 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  ){.    char *z =
1f650 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1f660 28 22 20 43 4f 4c 4c 41 54 45 20 25 73 22 2c 20  (" COLLATE %s", 
1f670 7a 50 61 72 65 6e 74 53 65 71 29 3b 0a 20 20 20  zParentSeq);.   
1f680 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1f690 74 65 78 74 28 70 43 74 78 2c 20 7a 2c 20 2d 31  text(pCtx, z, -1
1f6a0 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
1f6b0 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
1f6c0 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 7d 0a  _free(z);.  }.}.
1f6d0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ../*.** The impl
1f6e0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 64 6f  ementation of do
1f6f0 74 2d 63 6f 6d 6d 61 6e 64 20 22 2e 6c 69 6e 74  t-command ".lint
1f700 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 22 2e 0a   fkey-indexes"..
1f710 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 69  */.static int li
1f720 6e 74 46 6b 65 79 49 6e 64 65 78 65 73 28 0a 20  ntFkeyIndexes(. 
1f730 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74   ShellState *pSt
1f740 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
1f750 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68 65 6c   /* Current shel
1f760 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a  l tool state */.
1f770 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20    char **azArg, 
1f780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f790 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72    /* Array of ar
1f7a0 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74  guments passed t
1f7b0 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f  o dot command */
1f7c0 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20 20  .  int nArg     
1f7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f7e0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1f7f0 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67  entries in azArg
1f800 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  [] */.){.  sqlit
1f810 65 33 20 2a 64 62 20 3d 20 70 53 74 61 74 65 2d  e3 *db = pState-
1f820 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61  >db;       /* Da
1f830 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 6f  tabase handle to
1f840 20 71 75 65 72 79 20 22 6d 61 69 6e 22 20 64 62   query "main" db
1f850 20 6f 66 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 6f   of */.  FILE *o
1f860 75 74 20 3d 20 70 53 74 61 74 65 2d 3e 6f 75 74  ut = pState->out
1f870 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 65  ;        /* Stre
1f880 61 6d 20 74 6f 20 77 72 69 74 65 20 6e 6f 6e 2d  am to write non-
1f890 65 72 72 6f 72 20 6f 75 74 70 75 74 20 74 6f 20  error output to 
1f8a0 2a 2f 0a 20 20 69 6e 74 20 62 56 65 72 62 6f 73  */.  int bVerbos
1f8b0 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
1f8c0 20 20 20 20 20 2f 2a 20 49 66 20 2d 76 65 72 62       /* If -verb
1f8d0 6f 73 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ose is present *
1f8e0 2f 0a 20 20 69 6e 74 20 62 47 72 6f 75 70 42 79  /.  int bGroupBy
1f8f0 50 61 72 65 6e 74 20 3d 20 30 3b 20 20 20 20 20  Parent = 0;     
1f900 20 20 20 20 2f 2a 20 49 66 20 2d 67 72 6f 75 70      /* If -group
1f910 62 79 70 61 72 65 6e 74 20 69 73 20 70 72 65 73  byparent is pres
1f920 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ent */.  int i; 
1f930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f940 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 69           /* To i
1f950 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61  terate through a
1f960 7a 41 72 67 5b 5d 20 2a 2f 0a 20 20 63 6f 6e 73  zArg[] */.  cons
1f970 74 20 63 68 61 72 20 2a 7a 49 6e 64 65 6e 74 20  t char *zIndent 
1f980 3d 20 22 22 3b 20 20 20 20 20 20 20 2f 2a 20 48  = "";       /* H
1f990 6f 77 20 6d 75 63 68 20 74 6f 20 69 6e 64 65 6e  ow much to inden
1f9a0 74 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 62  t CREATE INDEX b
1f9b0 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  y */.  int rc;  
1f9c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f9d0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1f9e0 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
1f9f0 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20  e3_stmt *pSql = 
1fa00 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  0;         /* Co
1fa10 6d 70 69 6c 65 64 20 76 65 72 73 69 6f 6e 20 6f  mpiled version o
1fa20 66 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  f SQL statement 
1fa30 62 65 6c 6f 77 20 2a 2f 0a 0a 20 20 2f 2a 0a 20  below */..  /*. 
1fa40 20 2a 2a 20 54 68 69 73 20 53 45 4c 45 43 54 20   ** This SELECT 
1fa50 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e  statement return
1fa60 73 20 6f 6e 65 20 72 6f 77 20 66 6f 72 20 65 61  s one row for ea
1fa70 63 68 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  ch foreign key c
1fa80 6f 6e 73 74 72 61 69 6e 74 0a 20 20 2a 2a 20 69  onstraint.  ** i
1fa90 6e 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66 20  n the schema of 
1faa0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
1fab0 65 2e 20 54 68 65 20 63 6f 6c 75 6d 6e 20 76 61  e. The column va
1fac0 6c 75 65 73 20 61 72 65 3a 0a 20 20 2a 2a 0a 20  lues are:.  **. 
1fad0 20 2a 2a 20 30 2e 20 54 68 65 20 74 65 78 74 20   ** 0. The text 
1fae0 6f 66 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  of an SQL statem
1faf0 65 6e 74 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a  ent similar to:.
1fb00 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 22    **.  **      "
1fb10 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
1fb20 41 4e 20 53 45 4c 45 43 54 20 31 20 46 52 4f 4d  AN SELECT 1 FROM
1fb30 20 63 68 69 6c 64 5f 74 61 62 6c 65 20 57 48 45   child_table WHE
1fb40 52 45 20 63 68 69 6c 64 5f 6b 65 79 3d 3f 22 0a  RE child_key=?".
1fb50 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 54 68 69    **.  **    Thi
1fb60 73 20 53 45 4c 45 43 54 20 69 73 20 73 69 6d 69  s SELECT is simi
1fb70 6c 61 72 20 74 6f 20 74 68 65 20 6f 6e 65 20 74  lar to the one t
1fb80 68 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e 20  hat the foreign 
1fb90 6b 65 79 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74  keys implementat
1fba0 69 6f 6e 0a 20 20 2a 2a 20 20 20 20 6e 65 65 64  ion.  **    need
1fbb0 73 20 74 6f 20 72 75 6e 20 69 6e 74 65 72 6e 61  s to run interna
1fbc0 6c 6c 79 20 6f 6e 20 63 68 69 6c 64 20 74 61 62  lly on child tab
1fbd0 6c 65 73 2e 20 49 66 20 74 68 65 72 65 20 69 73  les. If there is
1fbe0 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63   an index that c
1fbf0 61 6e 0a 20 20 2a 2a 20 20 20 20 62 65 20 75 73  an.  **    be us
1fc00 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74  ed to optimize t
1fc10 68 69 73 20 71 75 65 72 79 2c 20 74 68 65 6e 20  his query, then 
1fc20 69 74 20 63 61 6e 20 61 6c 73 6f 20 62 65 20 75  it can also be u
1fc30 73 65 64 20 62 79 20 74 68 65 20 46 4b 0a 20 20  sed by the FK.  
1fc40 2a 2a 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74 61  **    implementa
1fc50 74 69 6f 6e 20 74 6f 20 6f 70 74 69 6d 69 7a 65  tion to optimize
1fc60 20 44 45 4c 45 54 45 20 6f 72 20 55 50 44 41 54   DELETE or UPDAT
1fc70 45 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 20  E statements on 
1fc80 74 68 65 20 70 61 72 65 6e 74 0a 20 20 2a 2a 20  the parent.  ** 
1fc90 20 20 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20     table..  **. 
1fca0 20 2a 2a 20 31 2e 20 41 20 47 4c 4f 42 20 70 61   ** 1. A GLOB pa
1fcb0 74 74 65 72 6e 20 73 75 69 74 61 62 6c 65 20 66  ttern suitable f
1fcc0 6f 72 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  or sqlite3_strgl
1fcd0 6f 62 28 29 2e 20 49 66 20 74 68 65 20 70 6c 61  ob(). If the pla
1fce0 6e 20 6f 75 74 70 75 74 20 62 79 0a 20 20 2a 2a  n output by.  **
1fcf0 20 20 20 20 74 68 65 20 45 58 50 4c 41 49 4e 20      the EXPLAIN 
1fd00 51 55 45 52 59 20 50 4c 41 4e 20 63 6f 6d 6d 61  QUERY PLAN comma
1fd10 6e 64 20 6d 61 74 63 68 65 73 20 74 68 69 73 20  nd matches this 
1fd20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 74 68  pattern, then th
1fd30 65 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 20 20  e schema.  **   
1fd40 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 64   contains an ind
1fd50 65 78 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  ex that can be u
1fd60 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20  sed to optimize 
1fd70 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2a 0a  the query..  **.
1fd80 20 20 2a 2a 20 32 2e 20 48 75 6d 61 6e 20 72 65    ** 2. Human re
1fd90 61 64 61 62 6c 65 20 74 65 78 74 20 74 68 61 74  adable text that
1fda0 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 63   describes the c
1fdb0 68 69 6c 64 20 74 61 62 6c 65 20 61 6e 64 20 63  hild table and c
1fdc0 6f 6c 75 6d 6e 73 2e 20 65 2e 67 2e 0a 20 20 2a  olumns. e.g..  *
1fdd0 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 22 63 68  *.  **       "ch
1fde0 69 6c 64 5f 74 61 62 6c 65 28 63 68 69 6c 64 5f  ild_table(child_
1fdf0 6b 65 79 31 2c 20 63 68 69 6c 64 5f 6b 65 79 32  key1, child_key2
1fe00 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 33 2e 20  )".  **.  ** 3. 
1fe10 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 74  Human readable t
1fe20 65 78 74 20 74 68 61 74 20 64 65 73 63 72 69 62  ext that describ
1fe30 65 73 20 74 68 65 20 70 61 72 65 6e 74 20 74 61  es the parent ta
1fe40 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 2e  ble and columns.
1fe50 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   e.g..  **.  ** 
1fe60 20 20 20 20 20 20 22 70 61 72 65 6e 74 5f 74 61        "parent_ta
1fe70 62 6c 65 28 70 61 72 65 6e 74 5f 6b 65 79 31 2c  ble(parent_key1,
1fe80 20 70 61 72 65 6e 74 5f 6b 65 79 32 29 22 0a 20   parent_key2)". 
1fe90 20 2a 2a 0a 20 20 2a 2a 20 34 2e 20 41 20 66 75   **.  ** 4. A fu
1fea0 6c 6c 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  ll CREATE INDEX 
1feb0 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 61 6e  statement for an
1fec0 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 75 6c   index that coul
1fed0 64 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20 2a  d be used to.  *
1fee0 2a 20 20 20 20 6f 70 74 69 6d 69 7a 65 20 44 45  *    optimize DE
1fef0 4c 45 54 45 20 6f 72 20 55 50 44 41 54 45 20 73  LETE or UPDATE s
1ff00 74 61 74 65 6d 65 6e 74 73 20 6f 6e 20 74 68 65  tatements on the
1ff10 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2e 20 65   parent table. e
1ff20 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  .g..  **.  **   
1ff30 20 20 20 20 22 43 52 45 41 54 45 20 49 4e 44 45      "CREATE INDE
1ff40 58 20 63 68 69 6c 64 5f 74 61 62 6c 65 5f 63 68  X child_table_ch
1ff50 69 6c 64 5f 6b 65 79 20 4f 4e 20 63 68 69 6c 64  ild_key ON child
1ff60 5f 74 61 62 6c 65 28 63 68 69 6c 64 5f 6b 65 79  _table(child_key
1ff70 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 35 2e 20  )".  **.  ** 5. 
1ff80 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
1ff90 70 61 72 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20  parent table..  
1ffa0 2a 2a 0a 20 20 2a 2a 20 54 68 65 73 65 20 73 69  **.  ** These si
1ffb0 78 20 76 61 6c 75 65 73 20 61 72 65 20 75 73 65  x values are use
1ffc0 64 20 62 79 20 74 68 65 20 43 20 6c 6f 67 69 63  d by the C logic
1ffd0 20 62 65 6c 6f 77 20 74 6f 20 67 65 6e 65 72 61   below to genera
1ffe0 74 65 20 74 68 65 20 72 65 70 6f 72 74 2e 0a 20  te the report.. 
1fff0 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
20000 20 2a 7a 53 71 6c 20 3d 0a 20 20 22 53 45 4c 45   *zSql =.  "SELE
20010 43 54 20 22 0a 20 20 20 20 22 20 20 20 20 20 27  CT ".    "     '
20020 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
20030 41 4e 20 53 45 4c 45 43 54 20 31 20 46 52 4f 4d  AN SELECT 1 FROM
20040 20 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61   ' || quote(s.na
20050 6d 65 29 20 7c 7c 20 27 20 57 48 45 52 45 20 27  me) || ' WHERE '
20060 22 0a 20 20 20 20 22 20 20 7c 7c 20 67 72 6f 75  ".    "  || grou
20070 70 5f 63 6f 6e 63 61 74 28 71 75 6f 74 65 28 73  p_concat(quote(s
20080 2e 6e 61 6d 65 29 20 7c 7c 20 27 2e 27 20 7c 7c  .name) || '.' ||
20090 20 71 75 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d 29   quote(f.[from])
200a0 20 7c 7c 20 27 3d 3f 27 20 22 0a 20 20 20 20 22   || '=?' ".    "
200b0 20 20 7c 7c 20 66 6b 65 79 5f 63 6f 6c 6c 61 74    || fkey_collat
200c0 65 5f 63 6c 61 75 73 65 28 22 0a 20 20 20 20 22  e_clause(".    "
200d0 20 20 20 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d         f.[table]
200e0 2c 20 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f  , COALESCE(f.[to
200f0 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73 2e  ], p.[name]), s.
20100 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29 2c  name, f.[from]),
20110 27 20 41 4e 44 20 27 29 22 0a 20 20 20 20 22 2c  ' AND ')".    ",
20120 20 22 0a 20 20 20 20 22 20 20 20 20 20 27 53 45   ".    "     'SE
20130 41 52 43 48 20 54 41 42 4c 45 20 27 20 7c 7c 20  ARCH TABLE ' || 
20140 73 2e 6e 61 6d 65 20 7c 7c 20 27 20 55 53 49 4e  s.name || ' USIN
20150 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58  G COVERING INDEX
20160 2a 28 27 22 0a 20 20 20 20 22 20 20 7c 7c 20 67  *('".    "  || g
20170 72 6f 75 70 5f 63 6f 6e 63 61 74 28 27 2a 3d 3f  roup_concat('*=?
20180 27 2c 20 27 20 41 4e 44 20 27 29 20 7c 7c 20 27  ', ' AND ') || '
20190 29 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20  )'".    ", ".   
201a0 20 22 20 20 20 20 20 73 2e 6e 61 6d 65 20 20 7c   "     s.name  |
201b0 7c 20 27 28 27 20 7c 7c 20 67 72 6f 75 70 5f 63  | '(' || group_c
201c0 6f 6e 63 61 74 28 66 2e 5b 66 72 6f 6d 5d 2c 20  oncat(f.[from], 
201d0 20 27 2c 20 27 29 20 7c 7c 20 27 29 27 22 0a 20   ', ') || ')'". 
201e0 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20 20 20     ", ".    "   
201f0 20 20 66 2e 5b 74 61 62 6c 65 5d 20 7c 7c 20 27    f.[table] || '
20200 28 27 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63  (' || group_conc
20210 61 74 28 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74  at(COALESCE(f.[t
20220 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 29 20 7c  o], p.[name])) |
20230 7c 20 27 29 27 22 0a 20 20 20 20 22 2c 20 22 0a  | ')'".    ", ".
20240 20 20 20 20 22 20 20 20 20 20 27 43 52 45 41 54      "     'CREAT
20250 45 20 49 4e 44 45 58 20 27 20 7c 7c 20 71 75 6f  E INDEX ' || quo
20260 74 65 28 73 2e 6e 61 6d 65 20 7c 7c 27 5f 27 7c  te(s.name ||'_'|
20270 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 66  | group_concat(f
20280 2e 5b 66 72 6f 6d 5d 2c 20 27 5f 27 29 29 22 0a  .[from], '_'))".
20290 20 20 20 20 22 20 20 7c 7c 20 27 20 4f 4e 20 27      "  || ' ON '
202a0 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61 6d 65   || quote(s.name
202b0 29 20 7c 7c 20 27 28 27 22 0a 20 20 20 20 22 20  ) || '('".    " 
202c0 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74   || group_concat
202d0 28 71 75 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d 29  (quote(f.[from])
202e0 20 7c 7c 22 0a 20 20 20 20 22 20 20 20 20 20 20   ||".    "      
202f0 20 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63    fkey_collate_c
20300 6c 61 75 73 65 28 22 0a 20 20 20 20 22 20 20 20  lause(".    "   
20310 20 20 20 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d         f.[table]
20320 2c 20 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f  , COALESCE(f.[to
20330 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73 2e  ], p.[name]), s.
20340 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29 2c  name, f.[from]),
20350 20 27 2c 20 27 29 22 0a 20 20 20 20 22 20 20 7c   ', ')".    "  |
20360 7c 20 27 29 3b 27 22 0a 20 20 20 20 22 2c 20 22  | ');'".    ", "
20370 0a 20 20 20 20 22 20 20 20 20 20 66 2e 5b 74 61  .    "     f.[ta
20380 62 6c 65 5d 20 22 0a 20 20 20 20 22 46 52 4f 4d  ble] ".    "FROM
20390 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 41   sqlite_master A
203a0 53 20 73 2c 20 70 72 61 67 6d 61 5f 66 6f 72 65  S s, pragma_fore
203b0 69 67 6e 5f 6b 65 79 5f 6c 69 73 74 28 73 2e 6e  ign_key_list(s.n
203c0 61 6d 65 29 20 41 53 20 66 20 22 0a 20 20 20 20  ame) AS f ".    
203d0 22 4c 45 46 54 20 4a 4f 49 4e 20 70 72 61 67 6d  "LEFT JOIN pragm
203e0 61 5f 74 61 62 6c 65 5f 69 6e 66 6f 20 41 53 20  a_table_info AS 
203f0 70 20 4f 4e 20 28 70 6b 2d 31 3d 73 65 71 20 41  p ON (pk-1=seq A
20400 4e 44 20 70 2e 61 72 67 3d 66 2e 5b 74 61 62 6c  ND p.arg=f.[tabl
20410 65 5d 29 20 22 0a 20 20 20 20 22 47 52 4f 55 50  e]) ".    "GROUP
20420 20 42 59 20 73 2e 6e 61 6d 65 2c 20 66 2e 69 64   BY s.name, f.id
20430 20 22 0a 20 20 20 20 22 4f 52 44 45 52 20 42 59   ".    "ORDER BY
20440 20 28 43 41 53 45 20 57 48 45 4e 20 3f 20 54 48   (CASE WHEN ? TH
20450 45 4e 20 66 2e 5b 74 61 62 6c 65 5d 20 45 4c 53  EN f.[table] ELS
20460 45 20 73 2e 6e 61 6d 65 20 45 4e 44 29 22 0a 20  E s.name END)". 
20470 20 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20   ;.  const char 
20480 2a 7a 47 6c 6f 62 49 50 4b 20 3d 20 22 53 45 41  *zGlobIPK = "SEA
20490 52 43 48 20 54 41 42 4c 45 20 2a 20 55 53 49 4e  RCH TABLE * USIN
204a0 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  G INTEGER PRIMAR
204b0 59 20 4b 45 59 20 28 72 6f 77 69 64 3d 3f 29 22  Y KEY (rowid=?)"
204c0 3b 0a 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c  ;..  for(i=2; i<
204d0 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
204e0 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30  int n = strlen30
204f0 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20  (azArg[i]);.    
20500 69 66 28 20 6e 3e 31 20 26 26 20 73 71 6c 69 74  if( n>1 && sqlit
20510 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 2d 76 65  e3_strnicmp("-ve
20520 72 62 6f 73 65 22 2c 20 61 7a 41 72 67 5b 69 5d  rbose", azArg[i]
20530 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , n)==0 ){.     
20540 20 62 56 65 72 62 6f 73 65 20 3d 20 31 3b 0a 20   bVerbose = 1;. 
20550 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66     }.    else if
20560 28 20 6e 3e 31 20 26 26 20 73 71 6c 69 74 65 33  ( n>1 && sqlite3
20570 5f 73 74 72 6e 69 63 6d 70 28 22 2d 67 72 6f 75  _strnicmp("-grou
20580 70 62 79 70 61 72 65 6e 74 22 2c 20 61 7a 41 72  pbyparent", azAr
20590 67 5b 69 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  g[i], n)==0 ){. 
205a0 20 20 20 20 20 62 47 72 6f 75 70 42 79 50 61 72       bGroupByPar
205b0 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a  ent = 1;.      z
205c0 49 6e 64 65 6e 74 20 3d 20 22 20 20 20 20 22 3b  Indent = "    ";
205d0 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 7b  .    }.    else{
205e0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
205f0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
20600 3a 20 25 73 20 25 73 20 3f 2d 76 65 72 62 6f 73  : %s %s ?-verbos
20610 65 3f 20 3f 2d 67 72 6f 75 70 62 79 70 61 72 65  e? ?-groupbypare
20620 6e 74 3f 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  nt?\n",.        
20630 20 20 61 7a 41 72 67 5b 30 5d 2c 20 61 7a 41 72    azArg[0], azAr
20640 67 5b 31 5d 0a 20 20 20 20 20 20 29 3b 0a 20 20  g[1].      );.  
20650 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
20660 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20  E_ERROR;.    }. 
20670 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65   }..  /* Registe
20680 72 20 74 68 65 20 66 6b 65 79 5f 63 6f 6c 6c 61  r the fkey_colla
20690 74 65 5f 63 6c 61 75 73 65 28 29 20 53 51 4c 20  te_clause() SQL 
206a0 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 72 63  function */.  rc
206b0 20 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74   = sqlite3_creat
206c0 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22  e_function(db, "
206d0 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61  fkey_collate_cla
206e0 75 73 65 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f  use", 4, SQLITE_
206f0 55 54 46 38 2c 0a 20 20 20 20 20 20 30 2c 20 73  UTF8,.      0, s
20700 68 65 6c 6c 46 6b 65 79 43 6f 6c 6c 61 74 65 43  hellFkeyCollateC
20710 6c 61 75 73 65 2c 20 30 2c 20 30 0a 20 20 29 3b  lause, 0, 0.  );
20720 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ...  if( rc==SQL
20730 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63  ITE_OK ){.    rc
20740 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
20750 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20  re_v2(db, zSql, 
20760 2d 31 2c 20 26 70 53 71 6c 2c 20 30 29 3b 0a 20  -1, &pSql, 0);. 
20770 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c   }.  if( rc==SQL
20780 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
20790 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
207a0 53 71 6c 2c 20 31 2c 20 62 47 72 6f 75 70 42 79  Sql, 1, bGroupBy
207b0 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20  Parent);.  }..  
207c0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
207d0 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32  K ){.    int rc2
207e0 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 72 65  ;.    char *zPre
207f0 76 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  v = 0;.    while
20800 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71  ( SQLITE_ROW==sq
20810 6c 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29  lite3_step(pSql)
20820 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 65   ){.      int re
20830 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 73 71  s = -1;.      sq
20840 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 45 78 70  lite3_stmt *pExp
20850 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20  lain = 0;.      
20860 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 51 50  const char *zEQP
20870 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
20880 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
20890 65 78 74 28 70 53 71 6c 2c 20 30 29 3b 0a 20 20  ext(pSql, 0);.  
208a0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
208b0 7a 47 6c 6f 62 20 3d 20 28 63 6f 6e 73 74 20 63  zGlob = (const c
208c0 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
208d0 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 31  umn_text(pSql, 1
208e0 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  );.      const c
208f0 68 61 72 20 2a 7a 46 72 6f 6d 20 3d 20 28 63 6f  har *zFrom = (co
20900 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
20910 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
20920 71 6c 2c 20 32 29 3b 0a 20 20 20 20 20 20 63 6f  ql, 2);.      co
20930 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 72 67 65  nst char *zTarge
20940 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  t = (const char*
20950 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
20960 74 65 78 74 28 70 53 71 6c 2c 20 33 29 3b 0a 20  text(pSql, 3);. 
20970 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
20980 2a 7a 43 49 20 3d 20 28 63 6f 6e 73 74 20 63 68  *zCI = (const ch
20990 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
209a0 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 34 29  mn_text(pSql, 4)
209b0 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
209c0 61 72 20 2a 7a 50 61 72 65 6e 74 20 3d 20 28 63  ar *zParent = (c
209d0 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
209e0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
209f0 53 71 6c 2c 20 35 29 3b 0a 0a 20 20 20 20 20 20  Sql, 5);..      
20a00 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
20a10 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 45 51 50  pare_v2(db, zEQP
20a20 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c  , -1, &pExplain,
20a30 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
20a40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62  c!=SQLITE_OK ) b
20a50 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20  reak;.      if( 
20a60 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
20a70 74 65 33 5f 73 74 65 70 28 70 45 78 70 6c 61 69  te3_step(pExplai
20a80 6e 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  n) ){.        co
20a90 6e 73 74 20 63 68 61 72 20 2a 7a 50 6c 61 6e 20  nst char *zPlan 
20aa0 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
20ab0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
20ac0 78 74 28 70 45 78 70 6c 61 69 6e 2c 20 33 29 3b  xt(pExplain, 3);
20ad0 0a 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 28  .        res = (
20ae0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30  .              0
20af0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  ==sqlite3_strglo
20b00 62 28 7a 47 6c 6f 62 2c 20 7a 50 6c 61 6e 29 0a  b(zGlob, zPlan).
20b10 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 30 3d             || 0=
20b20 3d 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62  =sqlite3_strglob
20b30 28 7a 47 6c 6f 62 49 50 4b 2c 20 7a 50 6c 61 6e  (zGlobIPK, zPlan
20b40 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20  ).        );.   
20b50 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20     }.      rc = 
20b60 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
20b70 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20  (pExplain);.    
20b80 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
20b90 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20  _OK ) break;..  
20ba0 20 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b      if( res<0 ){
20bb0 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
20bc0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
20bd0 6f 72 3a 20 69 6e 74 65 72 6e 61 6c 20 65 72 72  or: internal err
20be0 6f 72 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72  or");.        br
20bf0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
20c00 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 47  {.        if( bG
20c10 72 6f 75 70 42 79 50 61 72 65 6e 74 0a 20 20 20  roupByParent.   
20c20 20 20 20 20 20 26 26 20 28 62 56 65 72 62 6f 73       && (bVerbos
20c30 65 20 7c 7c 20 72 65 73 3d 3d 30 29 0a 20 20 20  e || res==0).   
20c40 20 20 20 20 20 26 26 20 28 7a 50 72 65 76 3d 3d       && (zPrev==
20c50 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72  0 || sqlite3_str
20c60 69 63 6d 70 28 7a 50 61 72 65 6e 74 2c 20 7a 50  icmp(zParent, zP
20c70 72 65 76 29 29 0a 20 20 20 20 20 20 20 20 29 7b  rev)).        ){
20c80 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
20c90 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 50  rintf(out, "-- P
20ca0 61 72 65 6e 74 20 74 61 62 6c 65 20 25 73 5c 6e  arent table %s\n
20cb0 22 2c 20 7a 50 61 72 65 6e 74 29 3b 0a 20 20 20  ", zParent);.   
20cc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
20cd0 72 65 65 28 7a 50 72 65 76 29 3b 0a 20 20 20 20  ree(zPrev);.    
20ce0 20 20 20 20 20 20 7a 50 72 65 76 20 3d 20 73 71        zPrev = sq
20cf0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
20d00 73 22 2c 20 7a 50 61 72 65 6e 74 29 3b 0a 20 20  s", zParent);.  
20d10 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
20d20 20 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20   if( res==0 ){. 
20d30 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
20d40 6e 74 66 28 6f 75 74 2c 20 22 25 73 25 73 20 2d  ntf(out, "%s%s -
20d50 2d 3e 20 25 73 5c 6e 22 2c 20 7a 49 6e 64 65 6e  -> %s\n", zInden
20d60 74 2c 20 7a 43 49 2c 20 7a 54 61 72 67 65 74 29  t, zCI, zTarget)
20d70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
20d80 69 66 28 20 62 56 65 72 62 6f 73 65 20 29 7b 0a  if( bVerbose ){.
20d90 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
20da0 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 2f 2a 20  intf(out, "%s/* 
20db0 6e 6f 20 65 78 74 72 61 20 69 6e 64 65 78 65 73  no extra indexes
20dc0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 25 73   required for %s
20dd0 20 2d 3e 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20   -> %s */\n",.  
20de0 20 20 20 20 20 20 20 20 20 20 20 20 7a 49 6e 64              zInd
20df0 65 6e 74 2c 20 7a 46 72 6f 6d 2c 20 7a 54 61 72  ent, zFrom, zTar
20e00 67 65 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b  get.          );
20e10 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20e20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c   }.    }.    sql
20e30 69 74 65 33 5f 66 72 65 65 28 7a 50 72 65 76 29  ite3_free(zPrev)
20e40 3b 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53  ;..    if( rc!=S
20e50 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
20e60 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
20e70 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c  err, "%s\n", sql
20e80 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
20e90 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 32  ;.    }..    rc2
20ea0 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
20eb0 69 7a 65 28 70 53 71 6c 29 3b 0a 20 20 20 20 69  ize(pSql);.    i
20ec0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20ed0 20 26 26 20 72 63 32 21 3d 53 51 4c 49 54 45 5f   && rc2!=SQLITE_
20ee0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d  OK ){.      rc =
20ef0 20 72 63 32 3b 0a 20 20 20 20 20 20 72 61 77 5f   rc2;.      raw_
20f00 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
20f10 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  %s\n", sqlite3_e
20f20 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20  rrmsg(db));.    
20f30 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  }.  }else{.    r
20f40 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
20f50 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  , "%s\n", sqlite
20f60 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
20f70 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
20f80 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  .}../*.** Implem
20f90 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22 2e 6c 69  entation of ".li
20fa0 6e 74 22 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e  nt" dot command.
20fb0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
20fc0 69 6e 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20  intDotCommand(. 
20fd0 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74   ShellState *pSt
20fe0 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
20ff0 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68 65 6c   /* Current shel
21000 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a  l tool state */.
21010 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20    char **azArg, 
21020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21030 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72    /* Array of ar
21040 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74  guments passed t
21050 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f  o dot command */
21060 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20 20  .  int nArg     
21070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21080 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
21090 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67  entries in azArg
210a0 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e  [] */.){.  int n
210b0 3b 0a 20 20 6e 20 3d 20 28 6e 41 72 67 3e 3d 32  ;.  n = (nArg>=2
210c0 20 3f 20 73 74 72 6c 65 6e 33 30 28 61 7a 41 72   ? strlen30(azAr
210d0 67 5b 31 5d 29 20 3a 20 30 29 3b 0a 20 20 69 66  g[1]) : 0);.  if
210e0 28 20 6e 3c 31 20 7c 7c 20 73 71 6c 69 74 65 33  ( n<1 || sqlite3
210f0 5f 73 74 72 6e 69 63 6d 70 28 61 7a 41 72 67 5b  _strnicmp(azArg[
21100 31 5d 2c 20 22 66 6b 65 79 2d 69 6e 64 65 78 65  1], "fkey-indexe
21110 73 22 2c 20 6e 29 20 29 20 67 6f 74 6f 20 75 73  s", n) ) goto us
21120 61 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 6c 69  age;.  return li
21130 6e 74 46 6b 65 79 49 6e 64 65 78 65 73 28 70 53  ntFkeyIndexes(pS
21140 74 61 74 65 2c 20 61 7a 41 72 67 2c 20 6e 41 72  tate, azArg, nAr
21150 67 29 3b 0a 0a 20 75 73 61 67 65 3a 0a 20 20 72  g);.. usage:.  r
21160 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
21170 2c 20 22 55 73 61 67 65 20 25 73 20 73 75 62 2d  , "Usage %s sub-
21180 63 6f 6d 6d 61 6e 64 20 3f 73 77 69 74 63 68 65  command ?switche
21190 73 2e 2e 2e 3f 5c 6e 22 2c 20 61 7a 41 72 67 5b  s...?\n", azArg[
211a0 30 5d 29 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74  0]);.  raw_print
211b0 66 28 73 74 64 65 72 72 2c 20 22 57 68 65 72 65  f(stderr, "Where
211c0 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 73 20 61 72   sub-commands ar
211d0 65 3a 5c 6e 22 29 3b 0a 20 20 72 61 77 5f 70 72  e:\n");.  raw_pr
211e0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 20 20  intf(stderr, "  
211f0 20 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 5c 6e    fkey-indexes\n
21200 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  ");.  return SQL
21210 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 23 69  ITE_ERROR;.}..#i
21220 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  f !defined(SQLIT
21230 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41  E_OMIT_VIRTUALTA
21240 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28  BLE) && defined(
21250 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42  SQLITE_HAVE_ZLIB
21260 29 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  )./*************
21270 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21280 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21290 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
212a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
212b0 2a 2a 2a 2a 0a 2a 2a 20 54 68 65 20 22 2e 61 72  ****.** The ".ar
212c0 63 68 69 76 65 22 20 6f 72 20 22 2e 61 72 22 20  chive" or ".ar" 
212d0 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74  command..*/.stat
212e0 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 50 72 65  ic void shellPre
212f0 70 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33 20  pare(.  sqlite3 
21300 2a 64 62 2c 20 0a 20 20 69 6e 74 20 2a 70 52 63  *db, .  int *pRc
21310 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  , .  const char 
21320 2a 7a 53 71 6c 2c 20 0a 20 20 73 71 6c 69 74 65  *zSql, .  sqlite
21330 33 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 0a  3_stmt **ppStmt.
21340 29 7b 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 30  ){.  *ppStmt = 0
21350 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51  ;.  if( *pRc==SQ
21360 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69  LITE_OK ){.    i
21370 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
21380 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a  prepare_v2(db, z
21390 53 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d 74 2c  Sql, -1, ppStmt,
213a0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21   0);.    if( rc!
213b0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
213c0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
213d0 74 64 65 72 72 2c 20 22 73 71 6c 20 65 72 72 6f  tderr, "sql erro
213e0 72 3a 20 25 73 20 28 25 64 29 5c 6e 22 2c 20 0a  r: %s (%d)\n", .
213f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
21400 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 73 71  3_errmsg(db), sq
21410 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62  lite3_errcode(db
21420 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20  ).      );.     
21430 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 20 20   *pRc = rc;.    
21440 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  }.  }.}..static 
21450 76 6f 69 64 20 73 68 65 6c 6c 50 72 65 70 61 72  void shellPrepar
21460 65 50 72 69 6e 74 66 28 0a 20 20 73 71 6c 69 74  ePrintf(.  sqlit
21470 65 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 2a  e3 *db, .  int *
21480 70 52 63 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  pRc, .  sqlite3_
21490 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 0a 20  stmt **ppStmt,. 
214a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d   const char *zFm
214b0 74 2c 20 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 2a  t, .  ....){.  *
214c0 70 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66  ppStmt = 0;.  if
214d0 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRc==SQLITE_O
214e0 4b 20 29 7b 0a 20 20 20 20 76 61 5f 6c 69 73 74  K ){.    va_list
214f0 20 61 70 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a   ap;.    char *z
21500 3b 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61  ;.    va_start(a
21510 70 2c 20 7a 46 6d 74 29 3b 0a 20 20 20 20 7a 20  p, zFmt);.    z 
21520 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e  = sqlite3_vmprin
21530 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20  tf(zFmt, ap);.  
21540 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20    if( z==0 ){.  
21550 20 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54      *pRc = SQLIT
21560 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c  E_NOMEM;.    }el
21570 73 65 7b 0a 20 20 20 20 20 20 73 68 65 6c 6c 50  se{.      shellP
21580 72 65 70 61 72 65 28 64 62 2c 20 70 52 63 2c 20  repare(db, pRc, 
21590 7a 2c 20 70 70 53 74 6d 74 29 3b 0a 20 20 20 20  z, ppStmt);.    
215a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
215b0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  );.    }.  }.}..
215c0 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c  static void shel
215d0 6c 46 69 6e 61 6c 69 7a 65 28 0a 20 20 69 6e 74  lFinalize(.  int
215e0 20 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69 74 65   *pRc, .  sqlite
215f0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 0a 29 7b  3_stmt *pStmt.){
21600 0a 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a  .  if( pStmt ){.
21610 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
21620 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e  = sqlite3_db_han
21630 64 6c 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  dle(pStmt);.    
21640 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
21650 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
21660 3b 0a 20 20 20 20 69 66 28 20 2a 70 52 63 3d 3d  ;.    if( *pRc==
21670 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21680 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54     if( rc!=SQLIT
21690 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
216a0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
216b0 72 2c 20 22 53 51 4c 20 65 72 72 6f 72 3a 20 25  r, "SQL error: %
216c0 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  s\n", sqlite3_er
216d0 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 20  rmsg(db));.     
216e0 20 7d 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20   }.      *pRc = 
216f0 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  rc;.    }.  }.}.
21700 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65  .static void she
21710 6c 6c 52 65 73 65 74 28 0a 20 20 69 6e 74 20 2a  llReset(.  int *
21720 70 52 63 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f  pRc, .  sqlite3_
21730 73 74 6d 74 20 2a 70 53 74 6d 74 0a 29 7b 0a 20  stmt *pStmt.){. 
21740 20 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65   int rc = sqlite
21750 33 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a  3_reset(pStmt);.
21760 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49    if( *pRc==SQLI
21770 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
21780 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
21790 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20  {.      sqlite3 
217a0 2a 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 64 62  *db = sqlite3_db
217b0 5f 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 3b 0a  _handle(pStmt);.
217c0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
217d0 28 73 74 64 65 72 72 2c 20 22 53 51 4c 20 65 72  (stderr, "SQL er
217e0 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69  ror: %s\n", sqli
217f0 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b  te3_errmsg(db));
21800 0a 20 20 20 20 7d 0a 20 20 20 20 2a 70 52 63 20  .    }.    *pRc 
21810 3d 20 72 63 3b 0a 20 20 7d 0a 7d 0a 2f 2a 0a 2a  = rc;.  }.}./*.*
21820 2a 20 53 74 72 75 63 74 75 72 65 20 72 65 70 72  * Structure repr
21830 65 73 65 6e 74 69 6e 67 20 61 20 73 69 6e 67 6c  esenting a singl
21840 65 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e 64 2e  e ".ar" command.
21850 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
21860 63 74 20 41 72 43 6f 6d 6d 61 6e 64 20 41 72 43  ct ArCommand ArC
21870 6f 6d 6d 61 6e 64 3b 0a 73 74 72 75 63 74 20 41  ommand;.struct A
21880 72 43 6f 6d 6d 61 6e 64 20 7b 0a 20 20 69 6e 74  rCommand {.  int
21890 20 65 43 6d 64 3b 20 20 20 20 20 20 20 20 20 20   eCmd;          
218a0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
218b0 41 6e 20 41 52 5f 43 4d 44 5f 2a 20 76 61 6c 75  An AR_CMD_* valu
218c0 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  e */.  const cha
218d0 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20 20  r *zFile;       
218e0 20 20 20 20 20 20 20 2f 2a 20 2d 2d 66 69 6c 65         /* --file
218f0 20 61 72 67 75 6d 65 6e 74 2c 20 6f 72 20 4e 55   argument, or NU
21900 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  LL */.  const ch
21910 61 72 20 2a 7a 44 69 72 3b 20 20 20 20 20 20 20  ar *zDir;       
21920 20 20 20 20 20 20 20 20 2f 2a 20 2d 2d 64 69 72          /* --dir
21930 65 63 74 6f 72 79 20 61 72 67 75 6d 65 6e 74 2c  ectory argument,
21940 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e   or NULL */.  in
21950 74 20 62 56 65 72 62 6f 73 65 3b 20 20 20 20 20  t bVerbose;     
21960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
21970 20 54 72 75 65 20 69 66 20 2d 2d 76 65 72 62 6f   True if --verbo
21980 73 65 20 2a 2f 0a 20 20 69 6e 74 20 62 5a 69 70  se */.  int bZip
21990 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
219a0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
219b0 69 66 20 2d 2d 7a 69 70 20 2a 2f 0a 20 20 69 6e  if --zip */.  in
219c0 74 20 6e 41 72 67 3b 20 20 20 20 20 20 20 20 20  t nArg;         
219d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
219e0 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6d 6d 61   Number of comma
219f0 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  nd arguments */.
21a00 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 3b 20    char **azArg; 
21a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f    /* Array of co
21a30 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
21a40 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 69  */.};../*.** Pri
21a50 6e 74 20 61 20 75 73 61 67 65 20 6d 65 73 73 61  nt a usage messa
21a60 67 65 20 66 6f 72 20 74 68 65 20 2e 61 72 20 63  ge for the .ar c
21a70 6f 6d 6d 61 6e 64 20 74 6f 20 73 74 64 65 72 72  ommand to stderr
21a80 20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49   and return SQLI
21a90 54 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 73 74 61  TE_ERROR..*/.sta
21aa0 74 69 63 20 69 6e 74 20 61 72 55 73 61 67 65 28  tic int arUsage(
21ab0 46 49 4c 45 20 2a 66 29 7b 0a 20 20 72 61 77 5f  FILE *f){.  raw_
21ac0 70 72 69 6e 74 66 28 66 2c 0a 22 5c 6e 22 0a 22  printf(f,."\n"."
21ad0 55 73 61 67 65 3a 20 2e 61 72 20 5b 4f 50 54 49  Usage: .ar [OPTI
21ae0 4f 4e 2e 2e 2e 5d 20 5b 46 49 4c 45 2e 2e 2e 5d  ON...] [FILE...]
21af0 5c 6e 22 0a 22 54 68 65 20 2e 61 72 20 63 6f 6d  \n"."The .ar com
21b00 6d 61 6e 64 20 6d 61 6e 61 67 65 73 20 73 71 6c  mand manages sql
21b10 61 72 20 61 72 63 68 69 76 65 73 2e 5c 6e 22 0a  ar archives.\n".
21b20 22 5c 6e 22 0a 22 45 78 61 6d 70 6c 65 73 3a 5c  "\n"."Examples:\
21b30 6e 22 0a 22 20 20 2e 61 72 20 2d 63 66 20 61 72  n"."  .ar -cf ar
21b40 63 68 69 76 65 2e 73 61 72 20 66 6f 6f 20 62 61  chive.sar foo ba
21b50 72 20 20 20 20 23 20 43 72 65 61 74 65 20 61 72  r    # Create ar
21b60 63 68 69 76 65 2e 73 61 72 20 66 72 6f 6d 20 66  chive.sar from f
21b70 69 6c 65 73 20 66 6f 6f 20 61 6e 64 20 62 61 72  iles foo and bar
21b80 5c 6e 22 0a 22 20 20 2e 61 72 20 2d 74 66 20 61  \n"."  .ar -tf a
21b90 72 63 68 69 76 65 2e 73 61 72 20 20 20 20 20 20  rchive.sar      
21ba0 20 20 20 20 20 20 23 20 4c 69 73 74 20 6d 65 6d        # List mem
21bb0 62 65 72 73 20 6f 66 20 61 72 63 68 69 76 65 2e  bers of archive.
21bc0 73 61 72 5c 6e 22 0a 22 20 20 2e 61 72 20 2d 78  sar\n"."  .ar -x
21bd0 76 66 20 61 72 63 68 69 76 65 2e 73 61 72 20 20  vf archive.sar  
21be0 20 20 20 20 20 20 20 20 20 23 20 56 65 72 62 6f           # Verbo
21bf0 73 65 6c 79 20 65 78 74 72 61 63 74 20 66 69 6c  sely extract fil
21c00 65 73 20 66 72 6f 6d 20 61 72 63 68 69 76 65 2e  es from archive.
21c10 73 61 72 5c 6e 22 0a 22 5c 6e 22 0a 22 45 61 63  sar\n"."\n"."Eac
21c20 68 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 6d  h command line m
21c30 75 73 74 20 66 65 61 74 75 72 65 20 65 78 61 63  ust feature exac
21c40 74 6c 79 20 6f 6e 65 20 63 6f 6d 6d 61 6e 64 20  tly one command 
21c50 6f 70 74 69 6f 6e 3a 5c 6e 22 0a 22 20 20 2d 63  option:\n"."  -c
21c60 2c 20 2d 2d 63 72 65 61 74 65 20 20 20 20 20 20  , --create      
21c70 20 20 20 20 20 20 20 20 20 43 72 65 61 74 65 20           Create 
21c80 61 20 6e 65 77 20 61 72 63 68 69 76 65 5c 6e 22  a new archive\n"
21c90 0a 22 20 20 2d 75 2c 20 2d 2d 75 70 64 61 74 65  ."  -u, --update
21ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55                 U
21cb0 70 64 61 74 65 20 6f 72 20 61 64 64 20 66 69 6c  pdate or add fil
21cc0 65 73 20 74 6f 20 61 6e 20 65 78 69 73 74 69 6e  es to an existin
21cd0 67 20 61 72 63 68 69 76 65 5c 6e 22 0a 22 20 20  g archive\n"."  
21ce0 2d 74 2c 20 2d 2d 6c 69 73 74 20 20 20 20 20 20  -t, --list      
21cf0 20 20 20 20 20 20 20 20 20 20 20 4c 69 73 74 20             List 
21d00 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 72 63 68  contents of arch
21d10 69 76 65 5c 6e 22 0a 22 20 20 2d 78 2c 20 2d 2d  ive\n"."  -x, --
21d20 65 78 74 72 61 63 74 20 20 20 20 20 20 20 20 20  extract         
21d30 20 20 20 20 20 45 78 74 72 61 63 74 20 66 69 6c       Extract fil
21d40 65 73 20 66 72 6f 6d 20 61 72 63 68 69 76 65 5c  es from archive\
21d50 6e 22 0a 22 5c 6e 22 0a 22 41 6e 64 20 7a 65 72  n"."\n"."And zer
21d60 6f 20 6f 72 20 6d 6f 72 65 20 6f 70 74 69 6f 6e  o or more option
21d70 61 6c 20 6f 70 74 69 6f 6e 73 3a 5c 6e 22 0a 22  al options:\n"."
21d80 20 20 2d 76 2c 20 2d 2d 76 65 72 62 6f 73 65 20    -v, --verbose 
21d90 20 20 20 20 20 20 20 20 20 20 20 20 20 50 72 69               Pri
21da0 6e 74 20 65 61 63 68 20 66 69 6c 65 6e 61 6d 65  nt each filename
21db0 20 61 73 20 69 74 20 69 73 20 70 72 6f 63 65 73   as it is proces
21dc0 73 65 64 5c 6e 22 0a 22 20 20 2d 66 20 46 49 4c  sed\n"."  -f FIL
21dd0 45 2c 20 2d 2d 66 69 6c 65 20 46 49 4c 45 20 20  E, --file FILE  
21de0 20 20 20 20 20 4f 70 65 72 61 74 65 20 6f 6e 20       Operate on 
21df0 61 72 63 68 69 76 65 20 46 49 4c 45 20 28 64 65  archive FILE (de
21e00 66 61 75 6c 74 20 69 73 20 63 75 72 72 65 6e 74  fault is current
21e10 20 64 62 29 5c 6e 22 0a 22 20 20 2d 43 20 44 49   db)\n"."  -C DI
21e20 52 2c 20 2d 2d 64 69 72 65 63 74 6f 72 79 20 44  R, --directory D
21e30 49 52 20 20 20 20 43 68 61 6e 67 65 20 74 6f 20  IR    Change to 
21e40 64 69 72 65 63 74 6f 72 79 20 44 49 52 20 74 6f  directory DIR to
21e50 20 72 65 61 64 2f 65 78 74 72 61 63 74 20 66 69   read/extract fi
21e60 6c 65 73 5c 6e 22 0a 22 5c 6e 22 0a 22 53 65 65  les\n"."\n"."See
21e70 20 61 6c 73 6f 3a 20 68 74 74 70 3a 2f 2f 73 71   also: http://sq
21e80 6c 69 74 65 2e 6f 72 67 2f 63 6c 69 2e 68 74 6d  lite.org/cli.htm
21e90 6c 23 73 71 6c 61 72 5f 61 72 63 68 69 76 65 5f  l#sqlar_archive_
21ea0 73 75 70 70 6f 72 74 5c 6e 22 0a 22 5c 6e 22 0a  support\n"."\n".
21eb0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
21ec0 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a  TE_ERROR;.}../*.
21ed0 2a 2a 20 50 72 69 6e 74 20 61 6e 20 65 72 72 6f  ** Print an erro
21ee0 72 20 6d 65 73 73 61 67 65 20 66 6f 72 20 74 68  r message for th
21ef0 65 20 2e 61 72 20 63 6f 6d 6d 61 6e 64 20 74 6f  e .ar command to
21f00 20 73 74 64 65 72 72 20 61 6e 64 20 72 65 74 75   stderr and retu
21f10 72 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52  rn .** SQLITE_ER
21f20 52 4f 52 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ROR..*/.static i
21f30 6e 74 20 61 72 45 72 72 6f 72 4d 73 67 28 63 6f  nt arErrorMsg(co
21f40 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20  nst char *zFmt, 
21f50 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
21f60 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  ap;.  char *z;. 
21f70 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
21f80 6d 74 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74  mt);.  z = sqlit
21f90 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74  e3_vmprintf(zFmt
21fa0 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28  , ap);.  va_end(
21fb0 61 70 29 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74  ap);.  raw_print
21fc0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
21fd0 3a 20 25 73 20 28 74 72 79 20 5c 22 2e 61 72 20  : %s (try \".ar 
21fe0 2d 2d 68 65 6c 70 5c 22 29 5c 6e 22 2c 20 7a 29  --help\")\n", z)
21ff0 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
22000 28 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  (z);.  return SQ
22010 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f  LITE_ERROR;.}../
22020 2a 0a 2a 2a 20 56 61 6c 75 65 73 20 66 6f 72 20  *.** Values for 
22030 41 72 43 6f 6d 6d 61 6e 64 2e 65 43 6d 64 2e 0a  ArCommand.eCmd..
22040 2a 2f 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d  */.#define AR_CM
22050 44 5f 43 52 45 41 54 45 20 20 20 20 20 20 20 31  D_CREATE       1
22060 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f  .#define AR_CMD_
22070 45 58 54 52 41 43 54 20 20 20 20 20 20 32 0a 23  EXTRACT      2.#
22080 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 4c 49  define AR_CMD_LI
22090 53 54 20 20 20 20 20 20 20 20 20 33 0a 23 64 65  ST         3.#de
220a0 66 69 6e 65 20 41 52 5f 43 4d 44 5f 55 50 44 41  fine AR_CMD_UPDA
220b0 54 45 20 20 20 20 20 20 20 34 0a 23 64 65 66 69  TE       4.#defi
220c0 6e 65 20 41 52 5f 43 4d 44 5f 48 45 4c 50 20 20  ne AR_CMD_HELP  
220d0 20 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20         5../*.** 
220e0 4f 74 68 65 72 20 28 6e 6f 6e 2d 63 6f 6d 6d 61  Other (non-comma
220f0 6e 64 29 20 73 77 69 74 63 68 65 73 2e 0a 2a 2f  nd) switches..*/
22100 0a 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49 54  .#define AR_SWIT
22110 43 48 5f 56 45 52 42 4f 53 45 20 20 20 36 0a 23  CH_VERBOSE   6.#
22120 64 65 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48  define AR_SWITCH
22130 5f 46 49 4c 45 20 20 20 20 20 20 37 0a 23 64 65  _FILE      7.#de
22140 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 44  fine AR_SWITCH_D
22150 49 52 45 43 54 4f 52 59 20 38 0a 23 64 65 66 69  IRECTORY 8.#defi
22160 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 5a 49 50  ne AR_SWITCH_ZIP
22170 20 20 20 20 20 20 20 39 0a 0a 73 74 61 74 69 63         9..static
22180 20 69 6e 74 20 61 72 50 72 6f 63 65 73 73 53 77   int arProcessSw
22190 69 74 63 68 28 41 72 43 6f 6d 6d 61 6e 64 20 2a  itch(ArCommand *
221a0 70 41 72 2c 20 69 6e 74 20 65 53 77 69 74 63 68  pAr, int eSwitch
221b0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41  , const char *zA
221c0 72 67 29 7b 0a 20 20 73 77 69 74 63 68 28 20 65  rg){.  switch( e
221d0 53 77 69 74 63 68 20 29 7b 0a 20 20 20 20 63 61  Switch ){.    ca
221e0 73 65 20 41 52 5f 43 4d 44 5f 43 52 45 41 54 45  se AR_CMD_CREATE
221f0 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d  :.    case AR_CM
22200 44 5f 45 58 54 52 41 43 54 3a 0a 20 20 20 20 63  D_EXTRACT:.    c
22210 61 73 65 20 41 52 5f 43 4d 44 5f 4c 49 53 54 3a  ase AR_CMD_LIST:
22220 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44  .    case AR_CMD
22230 5f 55 50 44 41 54 45 3a 0a 20 20 20 20 63 61 73  _UPDATE:.    cas
22240 65 20 41 52 5f 43 4d 44 5f 48 45 4c 50 3a 0a 20  e AR_CMD_HELP:. 
22250 20 20 20 20 20 69 66 28 20 70 41 72 2d 3e 65 43       if( pAr->eC
22260 6d 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  md ){.        re
22270 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28  turn arErrorMsg(
22280 22 6d 75 6c 74 69 70 6c 65 20 63 6f 6d 6d 61 6e  "multiple comman
22290 64 20 6f 70 74 69 6f 6e 73 22 29 3b 0a 20 20 20  d options");.   
222a0 20 20 20 7d 0a 20 20 20 20 20 20 70 41 72 2d 3e     }.      pAr->
222b0 65 43 6d 64 20 3d 20 65 53 77 69 74 63 68 3b 0a  eCmd = eSwitch;.
222c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
222d0 20 20 63 61 73 65 20 41 52 5f 53 57 49 54 43 48    case AR_SWITCH
222e0 5f 56 45 52 42 4f 53 45 3a 0a 20 20 20 20 20 20  _VERBOSE:.      
222f0 70 41 72 2d 3e 62 56 65 72 62 6f 73 65 20 3d 20  pAr->bVerbose = 
22300 31 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  1;.      break;.
22310 20 20 20 20 63 61 73 65 20 41 52 5f 53 57 49 54      case AR_SWIT
22320 43 48 5f 5a 49 50 3a 0a 20 20 20 20 20 20 70 41  CH_ZIP:.      pA
22330 72 2d 3e 62 5a 69 70 20 3d 20 31 3b 0a 20 20 20  r->bZip = 1;.   
22340 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63     break;..    c
22350 61 73 65 20 41 52 5f 53 57 49 54 43 48 5f 46 49  ase AR_SWITCH_FI
22360 4c 45 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 7a  LE:.      pAr->z
22370 46 69 6c 65 20 3d 20 7a 41 72 67 3b 0a 20 20 20  File = zArg;.   
22380 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
22390 73 65 20 41 52 5f 53 57 49 54 43 48 5f 44 49 52  se AR_SWITCH_DIR
223a0 45 43 54 4f 52 59 3a 0a 20 20 20 20 20 20 70 41  ECTORY:.      pA
223b0 72 2d 3e 7a 44 69 72 20 3d 20 7a 41 72 67 3b 0a  r->zDir = zArg;.
223c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d        break;.  }
223d0 0a 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ..  return SQLIT
223e0 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  E_OK;.}../*.** P
223f0 61 72 73 65 20 74 68 65 20 63 6f 6d 6d 61 6e 64  arse the command
22400 20 6c 69 6e 65 20 66 6f 72 20 61 6e 20 22 2e 61   line for an ".a
22410 72 22 20 63 6f 6d 6d 61 6e 64 2e 20 54 68 65 20  r" command. The 
22420 72 65 73 75 6c 74 73 20 61 72 65 20 77 72 69 74  results are writ
22430 74 65 6e 20 69 6e 74 6f 0a 2a 2a 20 73 74 72 75  ten into.** stru
22440 63 74 75 72 65 20 28 2a 70 41 72 29 2e 20 53 51  cture (*pAr). SQ
22450 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
22460 6e 65 64 20 69 66 20 74 68 65 20 63 6f 6d 6d 61  ned if the comma
22470 6e 64 20 6c 69 6e 65 20 69 73 20 70 61 72 73 65  nd line is parse
22480 64 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c  d.** successfull
22490 79 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20  y, otherwise an 
224a0 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
224b0 20 77 72 69 74 74 65 6e 20 74 6f 20 73 74 64 65   written to stde
224c0 72 72 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54  rr and .** SQLIT
224d0 45 5f 45 52 52 4f 52 20 72 65 74 75 72 6e 65 64  E_ERROR returned
224e0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
224f0 61 72 50 61 72 73 65 43 6f 6d 6d 61 6e 64 28 0a  arParseCommand(.
22500 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20    char **azArg, 
22510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22520 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72    /* Array of ar
22530 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74  guments passed t
22540 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f  o dot command */
22550 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20  .  int nArg,    
22560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22570 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
22580 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67  entries in azArg
22590 5b 5d 20 2a 2f 0a 20 20 41 72 43 6f 6d 6d 61 6e  [] */.  ArComman
225a0 64 20 2a 70 41 72 20 20 20 20 20 20 20 20 20 20  d *pAr          
225b0 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c          /* Popul
225c0 61 74 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20  ate this object 
225d0 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 41  */.){.  struct A
225e0 72 53 77 69 74 63 68 20 7b 0a 20 20 20 20 63 68  rSwitch {.    ch
225f0 61 72 20 63 53 68 6f 72 74 3b 0a 20 20 20 20 63  ar cShort;.    c
22600 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 6e 67  onst char *zLong
22610 3b 0a 20 20 20 20 69 6e 74 20 65 53 77 69 74 63  ;.    int eSwitc
22620 68 3b 0a 20 20 20 20 69 6e 74 20 62 41 72 67 3b  h;.    int bArg;
22630 0a 20 20 7d 20 61 53 77 69 74 63 68 5b 5d 20 3d  .  } aSwitch[] =
22640 20 7b 0a 20 20 20 20 7b 20 27 63 27 2c 20 22 63   {.    { 'c', "c
22650 72 65 61 74 65 22 2c 20 20 20 20 41 52 5f 43 4d  reate",    AR_CM
22660 44 5f 43 52 45 41 54 45 2c 20 30 20 7d 2c 0a 20  D_CREATE, 0 },. 
22670 20 20 20 7b 20 27 78 27 2c 20 22 65 78 74 72 61     { 'x', "extra
22680 63 74 22 2c 20 20 20 41 52 5f 43 4d 44 5f 45 58  ct",   AR_CMD_EX
22690 54 52 41 43 54 2c 20 30 20 7d 2c 0a 20 20 20 20  TRACT, 0 },.    
226a0 7b 20 27 74 27 2c 20 22 6c 69 73 74 22 2c 20 20  { 't', "list",  
226b0 20 20 20 20 41 52 5f 43 4d 44 5f 4c 49 53 54 2c      AR_CMD_LIST,
226c0 20 30 20 7d 2c 0a 20 20 20 20 7b 20 27 75 27 2c   0 },.    { 'u',
226d0 20 22 75 70 64 61 74 65 22 2c 20 20 20 20 41 52   "update",    AR
226e0 5f 43 4d 44 5f 55 50 44 41 54 45 2c 20 30 20 7d  _CMD_UPDATE, 0 }
226f0 2c 0a 20 20 20 20 7b 20 27 68 27 2c 20 22 68 65  ,.    { 'h', "he
22700 6c 70 22 2c 20 20 20 20 20 20 41 52 5f 43 4d 44  lp",      AR_CMD
22710 5f 48 45 4c 50 2c 20 30 20 7d 2c 0a 20 20 20 20  _HELP, 0 },.    
22720 7b 20 27 76 27 2c 20 22 76 65 72 62 6f 73 65 22  { 'v', "verbose"
22730 2c 20 20 20 41 52 5f 53 57 49 54 43 48 5f 56 45  ,   AR_SWITCH_VE
22740 52 42 4f 53 45 2c 20 30 20 7d 2c 0a 20 20 20 20  RBOSE, 0 },.    
22750 7b 20 27 66 27 2c 20 22 66 69 6c 65 22 2c 20 20  { 'f', "file",  
22760 20 20 20 20 41 52 5f 53 57 49 54 43 48 5f 46 49      AR_SWITCH_FI
22770 4c 45 2c 20 31 20 7d 2c 0a 20 20 20 20 7b 20 27  LE, 1 },.    { '
22780 43 27 2c 20 22 64 69 72 65 63 74 6f 72 79 22 2c  C', "directory",
22790 20 41 52 5f 53 57 49 54 43 48 5f 44 49 52 45 43   AR_SWITCH_DIREC
227a0 54 4f 52 59 2c 20 31 20 7d 2c 0a 20 20 20 20 7b  TORY, 1 },.    {
227b0 20 27 7a 27 2c 20 22 7a 69 70 22 2c 20 20 20 20   'z', "zip",    
227c0 20 20 20 41 52 5f 53 57 49 54 43 48 5f 5a 49 50     AR_SWITCH_ZIP
227d0 2c 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74  , 0 }.  };.  int
227e0 20 6e 53 77 69 74 63 68 20 3d 20 73 69 7a 65 6f   nSwitch = sizeo
227f0 66 28 61 53 77 69 74 63 68 29 20 2f 20 73 69 7a  f(aSwitch) / siz
22800 65 6f 66 28 73 74 72 75 63 74 20 41 72 53 77 69  eof(struct ArSwi
22810 74 63 68 29 3b 0a 20 20 73 74 72 75 63 74 20 41  tch);.  struct A
22820 72 53 77 69 74 63 68 20 2a 70 45 6e 64 20 3d 20  rSwitch *pEnd = 
22830 26 61 53 77 69 74 63 68 5b 6e 53 77 69 74 63 68  &aSwitch[nSwitch
22840 5d 3b 0a 0a 20 20 69 66 28 20 6e 41 72 67 3c 3d  ];..  if( nArg<=
22850 31 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  1 ){.    return 
22860 61 72 55 73 61 67 65 28 73 74 64 65 72 72 29 3b  arUsage(stderr);
22870 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68  .  }else{.    ch
22880 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 31 5d  ar *z = azArg[1]
22890 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 41 72  ;.    memset(pAr
228a0 2c 20 30 2c 20 73 69 7a 65 6f 66 28 41 72 43 6f  , 0, sizeof(ArCo
228b0 6d 6d 61 6e 64 29 29 3b 0a 0a 20 20 20 20 69 66  mmand));..    if
228c0 28 20 7a 5b 30 5d 21 3d 27 2d 27 20 29 7b 0a 20  ( z[0]!='-' ){. 
228d0 20 20 20 20 20 2f 2a 20 54 72 61 64 69 74 69 6f       /* Traditio
228e0 6e 61 6c 20 73 74 79 6c 65 20 5b 74 61 72 5d 20  nal style [tar] 
228f0 69 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20  invocation */.  
22900 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
22910 20 69 6e 74 20 69 41 72 67 20 3d 20 32 3b 0a 20   int iArg = 2;. 
22920 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b       for(i=0; z[
22930 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
22940 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
22950 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  rg = 0;.        
22960 73 74 72 75 63 74 20 41 72 53 77 69 74 63 68 20  struct ArSwitch 
22970 2a 70 4f 70 74 3b 0a 20 20 20 20 20 20 20 20 66  *pOpt;.        f
22980 6f 72 28 70 4f 70 74 3d 26 61 53 77 69 74 63 68  or(pOpt=&aSwitch
22990 5b 30 5d 3b 20 70 4f 70 74 3c 70 45 6e 64 3b 20  [0]; pOpt<pEnd; 
229a0 70 4f 70 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20  pOpt++){.       
229b0 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 70 4f 70     if( z[i]==pOp
229c0 74 2d 3e 63 53 68 6f 72 74 20 29 20 62 72 65 61  t->cShort ) brea
229d0 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
229e0 20 20 20 20 20 69 66 28 20 70 4f 70 74 3d 3d 70       if( pOpt==p
229f0 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20  End ){.         
22a00 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d   return arErrorM
22a10 73 67 28 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64  sg("unrecognized
22a20 20 6f 70 74 69 6f 6e 3a 20 25 63 22 2c 20 7a 5b   option: %c", z[
22a30 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
22a40 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 74 2d         if( pOpt-
22a50 3e 62 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20  >bArg ){.       
22a60 20 20 20 69 66 28 20 69 41 72 67 3e 3d 6e 41 72     if( iArg>=nAr
22a70 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  g ){.           
22a80 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d   return arErrorM
22a90 73 67 28 22 6f 70 74 69 6f 6e 20 72 65 71 75 69  sg("option requi
22aa0 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a  res an argument:
22ab0 20 25 63 22 2c 7a 5b 69 5d 29 3b 0a 20 20 20 20   %c",z[i]);.    
22ac0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
22ad0 20 20 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b 69    zArg = azArg[i
22ae0 41 72 67 2b 2b 5d 3b 0a 20 20 20 20 20 20 20 20  Arg++];.        
22af0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 72  }.        if( ar
22b00 50 72 6f 63 65 73 73 53 77 69 74 63 68 28 70 41  ProcessSwitch(pA
22b10 72 2c 20 70 4f 70 74 2d 3e 65 53 77 69 74 63 68  r, pOpt->eSwitch
22b20 2c 20 7a 41 72 67 29 20 29 20 72 65 74 75 72 6e  , zArg) ) return
22b30 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
22b40 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41 72       }.      pAr
22b50 2d 3e 6e 41 72 67 20 3d 20 6e 41 72 67 2d 69 41  ->nArg = nArg-iA
22b60 72 67 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41  rg;.      if( pA
22b70 72 2d 3e 6e 41 72 67 3e 30 20 29 7b 0a 20 20 20  r->nArg>0 ){.   
22b80 20 20 20 20 20 70 41 72 2d 3e 61 7a 41 72 67 20       pAr->azArg 
22b90 3d 20 26 61 7a 41 72 67 5b 69 41 72 67 5d 3b 0a  = &azArg[iArg];.
22ba0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
22bb0 65 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d  e{.      /* Non-
22bc0 74 72 61 64 69 74 69 6f 6e 61 6c 20 69 6e 76 6f  traditional invo
22bd0 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  cation */.      
22be0 69 6e 74 20 69 41 72 67 3b 0a 20 20 20 20 20 20  int iArg;.      
22bf0 66 6f 72 28 69 41 72 67 3d 31 3b 20 69 41 72 67  for(iArg=1; iArg
22c00 3c 6e 41 72 67 3b 20 69 41 72 67 2b 2b 29 7b 0a  <nArg; iArg++){.
22c10 20 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20          int n;. 
22c20 20 20 20 20 20 20 20 7a 20 3d 20 61 7a 41 72 67         z = azArg
22c30 5b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20 20  [iArg];.        
22c40 69 66 28 20 7a 5b 30 5d 21 3d 27 2d 27 20 29 7b  if( z[0]!='-' ){
22c50 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  .          /* Al
22c60 6c 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6d 6d  l remaining comm
22c70 61 6e 64 20 6c 69 6e 65 20 77 6f 72 64 73 20 61  and line words a
22c80 72 65 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d  re command argum
22c90 65 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20  ents. */.       
22ca0 20 20 20 70 41 72 2d 3e 61 7a 41 72 67 20 3d 20     pAr->azArg = 
22cb0 26 61 7a 41 72 67 5b 69 41 72 67 5d 3b 0a 20 20  &azArg[iArg];.  
22cc0 20 20 20 20 20 20 20 20 70 41 72 2d 3e 6e 41 72          pAr->nAr
22cd0 67 20 3d 20 6e 41 72 67 2d 69 41 72 67 3b 0a 20  g = nArg-iArg;. 
22ce0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
22cf0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22d00 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a    n = strlen30(z
22d10 29 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20  );..        if( 
22d20 7a 5b 31 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20  z[1]!='-' ){.   
22d30 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
22d40 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f          /* One o
22d50 72 20 6d 6f 72 65 20 73 68 6f 72 74 20 6f 70 74  r more short opt
22d60 69 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  ions */.        
22d70 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 3b 20    for(i=1; i<n; 
22d80 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
22d90 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
22da0 72 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  rg = 0;.        
22db0 20 20 20 20 73 74 72 75 63 74 20 41 72 53 77 69      struct ArSwi
22dc0 74 63 68 20 2a 70 4f 70 74 3b 0a 20 20 20 20 20  tch *pOpt;.     
22dd0 20 20 20 20 20 20 20 66 6f 72 28 70 4f 70 74 3d         for(pOpt=
22de0 26 61 53 77 69 74 63 68 5b 30 5d 3b 20 70 4f 70  &aSwitch[0]; pOp
22df0 74 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b  t<pEnd; pOpt++){
22e00 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
22e10 66 28 20 7a 5b 69 5d 3d 3d 70 4f 70 74 2d 3e 63  f( z[i]==pOpt->c
22e20 53 68 6f 72 74 20 29 20 62 72 65 61 6b 3b 0a 20  Short ) break;. 
22e30 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
22e40 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70           if( pOp
22e50 74 3d 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20  t==pEnd ){.     
22e60 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
22e70 61 72 45 72 72 6f 72 4d 73 67 28 22 75 6e 72 65  arErrorMsg("unre
22e80 63 6f 67 6e 69 7a 65 64 20 6f 70 74 69 6f 6e 3a  cognized option:
22e90 20 25 63 5c 6e 22 2c 20 7a 5b 69 5d 29 3b 0a 20   %c\n", z[i]);. 
22ea0 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
22eb0 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70           if( pOp
22ec0 74 2d 3e 62 41 72 67 20 29 7b 0a 20 20 20 20 20  t->bArg ){.     
22ed0 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 28           if( i<(
22ee0 6e 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  n-1) ){.        
22ef0 20 20 20 20 20 20 20 20 7a 41 72 67 20 3d 20 26          zArg = &
22f00 7a 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20  z[i+1];.        
22f10 20 20 20 20 20 20 20 20 69 20 3d 20 6e 3b 0a 20          i = n;. 
22f20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c               }el
22f30 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
22f40 20 20 20 20 69 66 28 20 69 41 72 67 3e 3d 28 6e      if( iArg>=(n
22f50 41 72 67 2d 31 29 20 29 7b 0a 20 20 20 20 20 20  Arg-1) ){.      
22f60 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
22f70 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 22 6f  rn arErrorMsg("o
22f80 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61  ption requires a
22f90 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25 63 5c 6e  n argument: %c\n
22fa0 22 2c 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  ",z[i]);.       
22fb0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22fc0 20 20 20 20 20 20 20 20 20 20 20 7a 41 72 67 20             zArg 
22fd0 3d 20 61 7a 41 72 67 5b 2b 2b 69 41 72 67 5d 3b  = azArg[++iArg];
22fe0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
22ff0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
23000 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61             if( a
23010 72 50 72 6f 63 65 73 73 53 77 69 74 63 68 28 70  rProcessSwitch(p
23020 41 72 2c 20 70 4f 70 74 2d 3e 65 53 77 69 74 63  Ar, pOpt->eSwitc
23030 68 2c 20 7a 41 72 67 29 20 29 20 72 65 74 75 72  h, zArg) ) retur
23040 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
23050 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
23060 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b      }else if( z[
23070 32 5d 3d 3d 27 5c 30 27 20 29 7b 0a 20 20 20 20  2]=='\0' ){.    
23080 20 20 20 20 20 20 2f 2a 20 41 20 2d 2d 20 6f 70        /* A -- op
23090 74 69 6f 6e 2c 20 69 6e 64 69 63 61 74 69 6e 67  tion, indicating
230a0 20 74 68 61 74 20 61 6c 6c 20 72 65 6d 61 69 6e   that all remain
230b0 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65  ing command line
230c0 20 77 6f 72 64 73 0a 20 20 20 20 20 20 20 20 20   words.         
230d0 20 2a 2a 20 61 72 65 20 63 6f 6d 6d 61 6e 64 20   ** are command 
230e0 61 72 67 75 6d 65 6e 74 73 2e 20 20 2a 2f 0a 20  arguments.  */. 
230f0 20 20 20 20 20 20 20 20 20 70 41 72 2d 3e 61 7a           pAr->az
23100 41 72 67 20 3d 20 26 61 7a 41 72 67 5b 69 41 72  Arg = &azArg[iAr
23110 67 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  g+1];.          
23120 70 41 72 2d 3e 6e 41 72 67 20 3d 20 6e 41 72 67  pAr->nArg = nArg
23130 2d 69 41 72 67 2d 31 3b 0a 20 20 20 20 20 20 20  -iArg-1;.       
23140 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
23150 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
23160 20 20 20 2f 2a 20 41 20 6c 6f 6e 67 20 6f 70 74     /* A long opt
23170 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ion */.         
23180 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
23190 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
231a0 20 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 66     /* Argument f
231b0 6f 72 20 6f 70 74 69 6f 6e 2c 20 69 66 20 61 6e  or option, if an
231c0 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73  y */.          s
231d0 74 72 75 63 74 20 41 72 53 77 69 74 63 68 20 2a  truct ArSwitch *
231e0 70 4d 61 74 63 68 20 3d 20 30 3b 20 20 20 20 20  pMatch = 0;     
231f0 20 2f 2a 20 4d 61 74 63 68 69 6e 67 20 6f 70 74   /* Matching opt
23200 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ion */.         
23210 20 73 74 72 75 63 74 20 41 72 53 77 69 74 63 68   struct ArSwitch
23220 20 2a 70 4f 70 74 3b 20 20 20 20 20 20 20 20 20   *pOpt;         
23230 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 2a     /* Iterator *
23240 2f 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28  /.          for(
23250 70 4f 70 74 3d 26 61 53 77 69 74 63 68 5b 30 5d  pOpt=&aSwitch[0]
23260 3b 20 70 4f 70 74 3c 70 45 6e 64 3b 20 70 4f 70  ; pOpt<pEnd; pOp
23270 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t++){.          
23280 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c    const char *zL
23290 6f 6e 67 20 3d 20 70 4f 70 74 2d 3e 7a 4c 6f 6e  ong = pOpt->zLon
232a0 67 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  g;.            i
232b0 66 28 20 28 6e 2d 32 29 3c 3d 73 74 72 6c 65 6e  f( (n-2)<=strlen
232c0 33 30 28 7a 4c 6f 6e 67 29 20 26 26 20 30 3d 3d  30(zLong) && 0==
232d0 6d 65 6d 63 6d 70 28 26 7a 5b 32 5d 2c 20 7a 4c  memcmp(&z[2], zL
232e0 6f 6e 67 2c 20 6e 2d 32 29 20 29 7b 0a 20 20 20  ong, n-2) ){.   
232f0 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
23300 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20  Match ){.       
23310 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
23320 61 72 45 72 72 6f 72 4d 73 67 28 22 61 6d 62 69  arErrorMsg("ambi
23330 67 75 6f 75 73 20 6f 70 74 69 6f 6e 3a 20 25 73  guous option: %s
23340 22 2c 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",z);.          
23350 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
23360 20 20 20 20 20 20 20 20 20 20 20 70 4d 61 74 63             pMatc
23370 68 20 3d 20 70 4f 70 74 3b 0a 20 20 20 20 20 20  h = pOpt;.      
23380 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23390 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
233a0 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 69    }..          i
233b0 66 28 20 70 4d 61 74 63 68 3d 3d 30 20 29 7b 0a  f( pMatch==0 ){.
233c0 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
233d0 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 22 75  rn arErrorMsg("u
233e0 6e 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74 69  nrecognized opti
233f0 6f 6e 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20  on: %s", z);.   
23400 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23410 20 20 20 69 66 28 20 70 4d 61 74 63 68 2d 3e 62     if( pMatch->b
23420 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Arg ){.         
23430 20 20 20 69 66 28 20 69 41 72 67 3e 3d 28 6e 41     if( iArg>=(nA
23440 72 67 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  rg-1) ){.       
23450 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72         return ar
23460 45 72 72 6f 72 4d 73 67 28 22 6f 70 74 69 6f 6e  ErrorMsg("option
23470 20 72 65 71 75 69 72 65 73 20 61 6e 20 61 72 67   requires an arg
23480 75 6d 65 6e 74 3a 20 25 73 22 2c 20 7a 29 3b 0a  ument: %s", z);.
23490 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
234a0 20 20 20 20 20 20 20 20 20 20 7a 41 72 67 20 3d            zArg =
234b0 20 61 7a 41 72 67 5b 2b 2b 69 41 72 67 5d 3b 0a   azArg[++iArg];.
234c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
234d0 20 20 20 20 20 20 69 66 28 20 61 72 50 72 6f 63        if( arProc
234e0 65 73 73 53 77 69 74 63 68 28 70 41 72 2c 20 70  essSwitch(pAr, p
234f0 4d 61 74 63 68 2d 3e 65 53 77 69 74 63 68 2c 20  Match->eSwitch, 
23500 7a 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 53  zArg) ) return S
23510 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
23520 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
23530 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75     }.  }..  retu
23540 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a  rn SQLITE_OK;.}.
23550 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63  ./*.** This func
23560 74 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61  tion assumes tha
23570 74 20 61 6c 6c 20 61 72 67 75 6d 65 6e 74 73 20  t all arguments 
23580 77 69 74 68 69 6e 20 74 68 65 20 41 72 43 6f 6d  within the ArCom
23590 6d 61 6e 64 2e 61 7a 41 72 67 5b 5d 0a 2a 2a 20  mand.azArg[].** 
235a0 61 72 72 61 79 20 72 65 66 65 72 20 74 6f 20 61  array refer to a
235b0 72 63 68 69 76 65 20 6d 65 6d 62 65 72 73 2c 20  rchive members, 
235c0 61 73 20 66 6f 72 20 74 68 65 20 2d 2d 65 78 74  as for the --ext
235d0 72 61 63 74 20 6f 72 20 2d 2d 6c 69 73 74 20 63  ract or --list c
235e0 6f 6d 6d 61 6e 64 73 2e 20 0a 2a 2a 20 49 74 20  ommands. .** It 
235f0 63 68 65 63 6b 73 20 74 68 61 74 20 65 61 63 68  checks that each
23600 20 6f 66 20 74 68 65 6d 20 61 72 65 20 70 72 65   of them are pre
23610 73 65 6e 74 2e 20 49 66 20 61 6e 79 20 73 70 65  sent. If any spe
23620 63 69 66 69 65 64 20 66 69 6c 65 20 69 73 20 6e  cified file is n
23630 6f 74 0a 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e  ot.** present in
23640 20 74 68 65 20 61 72 63 68 69 76 65 2c 20 61 6e   the archive, an
23650 20 65 72 72 6f 72 20 69 73 20 70 72 69 6e 74 65   error is printe
23660 64 20 74 6f 20 73 74 64 65 72 72 20 61 6e 64 20  d to stderr and 
23670 61 6e 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65  an error.** code
23680 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72   returned. Other
23690 77 69 73 65 2c 20 69 66 20 61 6c 6c 20 73 70 65  wise, if all spe
236a0 63 69 66 69 65 64 20 61 72 67 75 6d 65 6e 74 73  cified arguments
236b0 20 61 72 65 20 70 72 65 73 65 6e 74 20 69 6e 0a   are present in.
236c0 2a 2a 20 74 68 65 20 61 72 63 68 69 76 65 2c 20  ** the archive, 
236d0 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74  SQLITE_OK is ret
236e0 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  urned..**.** Thi
236f0 73 20 66 75 6e 63 74 69 6f 6e 20 73 74 72 69 70  s function strip
23700 73 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 27  s any trailing '
23710 2f 27 20 63 68 61 72 61 63 74 65 72 73 20 66 72  /' characters fr
23720 6f 6d 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74  om each argument
23730 2e 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 6f 6e  ..** This is con
23740 73 69 73 74 65 6e 74 20 77 69 74 68 20 74 68 65  sistent with the
23750 20 77 61 79 20 74 68 65 20 5b 74 61 72 5d 20 63   way the [tar] c
23760 6f 6d 6d 61 6e 64 20 73 65 65 6d 73 20 74 6f 20  ommand seems to 
23770 77 6f 72 6b 20 6f 6e 0a 2a 2a 20 4c 69 6e 75 78  work on.** Linux
23780 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
23790 61 72 43 68 65 63 6b 45 6e 74 72 69 65 73 28 73  arCheckEntries(s
237a0 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 72 43 6f  qlite3 *db, ArCo
237b0 6d 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20 69  mmand *pAr){.  i
237c0 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f  nt rc = SQLITE_O
237d0 4b 3b 0a 20 20 69 66 28 20 70 41 72 2d 3e 6e 41  K;.  if( pAr->nA
237e0 72 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b  rg ){.    int i;
237f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  .    sqlite3_stm
23800 74 20 2a 70 54 65 73 74 20 3d 20 30 3b 0a 0a 20  t *pTest = 0;.. 
23810 20 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50     shellPrepareP
23820 72 69 6e 74 66 28 64 62 2c 20 26 72 63 2c 20 26  rintf(db, &rc, &
23830 70 54 65 73 74 2c 20 22 53 45 4c 45 43 54 20 6e  pTest, "SELECT n
23840 61 6d 65 20 46 52 4f 4d 20 25 73 20 57 48 45 52  ame FROM %s WHER
23850 45 20 6e 61 6d 65 3d 3f 31 22 2c 20 0a 20 20 20  E name=?1", .   
23860 20 20 20 20 20 70 41 72 2d 3e 62 5a 69 70 20 3f       pAr->bZip ?
23870 20 22 7a 69 70 66 69 6c 65 28 3f 32 29 22 20 3a   "zipfile(?2)" :
23880 20 22 73 71 6c 61 72 22 0a 20 20 20 20 29 3b 0a   "sqlar".    );.
23890 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
238a0 54 45 5f 4f 4b 20 26 26 20 70 41 72 2d 3e 62 5a  TE_OK && pAr->bZ
238b0 69 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ip ){.      sqli
238c0 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 54  te3_bind_text(pT
238d0 65 73 74 2c 20 32 2c 20 70 41 72 2d 3e 7a 46 69  est, 2, pAr->zFi
238e0 6c 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54  le, -1, SQLITE_T
238f0 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d  RANSIENT);.    }
23900 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
23910 70 41 72 2d 3e 6e 41 72 67 20 26 26 20 72 63 3d  pAr->nArg && rc=
23920 3d 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29  =SQLITE_OK; i++)
23930 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20  {.      char *z 
23940 3d 20 70 41 72 2d 3e 61 7a 41 72 67 5b 69 5d 3b  = pAr->azArg[i];
23950 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73  .      int n = s
23960 74 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20  trlen30(z);.    
23970 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3b 0a 20    int bOk = 0;. 
23980 20 20 20 20 20 77 68 69 6c 65 28 20 6e 3e 30 20       while( n>0 
23990 26 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29  && z[n-1]=='/' )
239a0 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d   n--;.      z[n]
239b0 20 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 73   = '\0';.      s
239c0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74  qlite3_bind_text
239d0 28 70 54 65 73 74 2c 20 31 2c 20 7a 2c 20 2d 31  (pTest, 1, z, -1
239e0 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
239f0 3b 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49  ;.      if( SQLI
23a00 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
23a10 73 74 65 70 28 70 54 65 73 74 29 20 29 7b 0a 20  step(pTest) ){. 
23a20 20 20 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b 0a         bOk = 1;.
23a30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 68        }.      sh
23a40 65 6c 6c 52 65 73 65 74 28 26 72 63 2c 20 70 54  ellReset(&rc, pT
23a50 65 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  est);.      if( 
23a60 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26  rc==SQLITE_OK &&
23a70 20 62 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20   bOk==0 ){.     
23a80 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
23a90 64 65 72 72 2c 20 22 6e 6f 74 20 66 6f 75 6e 64  derr, "not found
23aa0 20 69 6e 20 61 72 63 68 69 76 65 3a 20 25 73 5c   in archive: %s\
23ab0 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20  n", z);.        
23ac0 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
23ad0 52 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  R;.      }.    }
23ae0 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69  .    shellFinali
23af0 7a 65 28 26 72 63 2c 20 70 54 65 73 74 29 3b 0a  ze(&rc, pTest);.
23b00 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63    }..  return rc
23b10 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 6d 61  ;.}../*.** Forma
23b20 74 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65  t a WHERE clause
23b30 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65   that can be use
23b40 64 20 61 67 61 69 6e 73 74 20 74 68 65 20 22 73  d against the "s
23b50 71 6c 61 72 22 20 74 61 62 6c 65 20 74 6f 0a 2a  qlar" table to.*
23b60 2a 20 69 64 65 6e 74 69 66 79 20 61 6c 6c 20 61  * identify all a
23b70 72 63 68 69 76 65 20 6d 65 6d 62 65 72 73 20 74  rchive members t
23b80 68 61 74 20 6d 61 74 63 68 20 74 68 65 20 63 6f  hat match the co
23b90 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20  mmand arguments 
23ba0 68 65 6c 64 0a 2a 2a 20 69 6e 20 28 2a 70 41 72  held.** in (*pAr
23bb0 29 2e 20 4c 65 61 76 65 20 74 68 69 73 20 57 48  ). Leave this WH
23bc0 45 52 45 20 63 6c 61 75 73 65 20 69 6e 20 28 2a  ERE clause in (*
23bd0 70 7a 57 68 65 72 65 29 20 62 65 66 6f 72 65 20  pzWhere) before 
23be0 72 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 54 68  returning..** Th
23bf0 65 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70  e caller is resp
23c00 6f 6e 73 69 62 6c 65 20 66 6f 72 20 65 76 65 6e  onsible for even
23c10 74 75 61 6c 6c 79 20 63 61 6c 6c 69 6e 67 20 73  tually calling s
23c20 71 6c 69 74 65 33 5f 66 72 65 65 28 29 20 6f 6e  qlite3_free() on
23c30 0a 2a 2a 20 61 6e 79 20 6e 6f 6e 2d 4e 55 4c 4c  .** any non-NULL
23c40 20 28 2a 70 7a 57 68 65 72 65 29 20 76 61 6c 75   (*pzWhere) valu
23c50 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  e..*/.static voi
23c60 64 20 61 72 57 68 65 72 65 43 6c 61 75 73 65 28  d arWhereClause(
23c70 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20  .  int *pRc, .  
23c80 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20  ArCommand *pAr, 
23c90 0a 20 20 63 68 61 72 20 2a 2a 70 7a 57 68 65 72  .  char **pzWher
23ca0 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
23cb0 20 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 57     /* OUT: New W
23cc0 48 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 29  HERE clause */.)
23cd0 7b 0a 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65  {.  char *zWhere
23ce0 20 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63   = 0;.  if( *pRc
23cf0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
23d00 20 20 20 69 66 28 20 70 41 72 2d 3e 6e 41 72 67     if( pAr->nArg
23d10 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 57 68  ==0 ){.      zWh
23d20 65 72 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ere = sqlite3_mp
23d30 72 69 6e 74 66 28 22 31 22 29 3b 0a 20 20 20 20  rintf("1");.    
23d40 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74  }else{.      int
23d50 20 69 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   i;.      const 
23d60 63 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b  char *zSep = "";
23d70 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
23d80 69 3c 70 41 72 2d 3e 6e 41 72 67 3b 20 69 2b 2b  i<pAr->nArg; i++
23d90 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  ){.        const
23da0 20 63 68 61 72 20 2a 7a 20 3d 20 70 41 72 2d 3e   char *z = pAr->
23db0 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20  azArg[i];.      
23dc0 20 20 7a 57 68 65 72 65 20 3d 20 73 71 6c 69 74    zWhere = sqlit
23dd0 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
23de0 20 20 20 20 20 20 20 20 22 25 7a 25 73 20 6e 61          "%z%s na
23df0 6d 65 20 3d 20 27 25 71 27 20 4f 52 20 6e 61 6d  me = '%q' OR nam
23e00 65 20 42 45 54 57 45 45 4e 20 27 25 71 2f 27 20  e BETWEEN '%q/' 
23e10 41 4e 44 20 27 25 71 30 27 22 2c 20 0a 20 20 20  AND '%q0'", .   
23e20 20 20 20 20 20 20 20 20 20 7a 57 68 65 72 65 2c           zWhere,
23e30 20 7a 53 65 70 2c 20 7a 2c 20 7a 2c 20 7a 0a 20   zSep, z, z, z. 
23e40 20 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20             );.  
23e50 20 20 20 20 20 20 69 66 28 20 7a 57 68 65 72 65        if( zWhere
23e60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
23e70 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e   *pRc = SQLITE_N
23e80 4f 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20  OMEM;.          
23e90 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
23ea0 0a 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20  .        zSep = 
23eb0 22 20 4f 52 20 22 3b 0a 20 20 20 20 20 20 7d 0a  " OR ";.      }.
23ec0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 57      }.  }.  *pzW
23ed0 68 65 72 65 20 3d 20 7a 57 68 65 72 65 3b 0a 7d  here = zWhere;.}
23ee0 0a 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74  ../*.** Argument
23ef0 20 7a 4d 6f 64 65 20 6d 75 73 74 20 70 6f 69 6e   zMode must poin
23f00 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 61 74  t to a buffer at
23f10 20 6c 65 61 73 74 20 31 31 20 62 79 74 65 73 20   least 11 bytes 
23f20 69 6e 20 73 69 7a 65 2e 20 54 68 69 73 0a 2a 2a  in size. This.**
23f30 20 66 75 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61   function popula
23f40 74 65 73 20 74 68 69 73 20 62 75 66 66 65 72 20  tes this buffer 
23f50 77 69 74 68 20 74 68 65 20 73 74 72 69 6e 67 20  with the string 
23f60 69 6e 74 65 72 70 72 65 74 61 74 69 6f 6e 20 6f  interpretation o
23f70 66 0a 2a 2a 20 74 68 65 20 75 6e 69 78 20 66 69  f.** the unix fi
23f80 6c 65 20 6d 6f 64 65 20 70 61 73 73 65 64 20 61  le mode passed a
23f90 73 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67  s the second arg
23fa0 75 6d 65 6e 74 20 28 65 2e 67 2e 20 22 64 72 77  ument (e.g. "drw
23fb0 78 72 2d 78 72 2d 78 22 29 2e 0a 2a 2f 0a 73 74  xr-xr-x")..*/.st
23fc0 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 4d  atic void shellM
23fd0 6f 64 65 54 6f 53 74 72 69 6e 67 28 63 68 61 72  odeToString(char
23fe0 20 2a 7a 4d 6f 64 65 2c 20 69 6e 74 20 6d 6f 64   *zMode, int mod
23ff0 65 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  e){.  int i;..  
24000 2f 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 73  /* Magic numbers
24010 20 63 6f 70 69 65 64 20 66 72 6f 6d 20 5b 6d 61   copied from [ma
24020 6e 20 32 20 73 74 61 74 5d 20 2a 2f 0a 20 20 69  n 2 stat] */.  i
24030 66 28 20 6d 6f 64 65 20 26 20 30 30 34 30 30 30  f( mode & 004000
24040 30 20 29 7b 0a 20 20 20 20 7a 4d 6f 64 65 5b 30  0 ){.    zMode[0
24050 5d 20 3d 20 27 64 27 3b 0a 20 20 7d 65 6c 73 65  ] = 'd';.  }else
24060 20 69 66 28 20 28 6d 6f 64 65 20 26 20 30 31 32   if( (mode & 012
24070 30 30 30 30 29 3d 3d 30 31 32 30 30 30 30 20 29  0000)==0120000 )
24080 7b 0a 20 20 20 20 7a 4d 6f 64 65 5b 30 5d 20 3d  {.    zMode[0] =
24090 20 27 6c 27 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   'l';.  }else{. 
240a0 20 20 20 7a 4d 6f 64 65 5b 30 5d 20 3d 20 27 2d     zMode[0] = '-
240b0 27 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d  ';.  }..  for(i=
240c0 30 3b 20 69 3c 33 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<3; i++){.  
240d0 20 20 69 6e 74 20 6d 20 3d 20 28 6d 6f 64 65 20    int m = (mode 
240e0 3e 3e 20 28 28 32 2d 69 29 2a 33 29 29 3b 0a 20  >> ((2-i)*3));. 
240f0 20 20 20 63 68 61 72 20 2a 61 20 3d 20 26 7a 4d     char *a = &zM
24100 6f 64 65 5b 31 20 2b 20 69 2a 33 5d 3b 0a 20 20  ode[1 + i*3];.  
24110 20 20 61 5b 30 5d 20 3d 20 28 6d 20 26 20 30 78    a[0] = (m & 0x
24120 34 29 20 3f 20 27 72 27 20 3a 20 27 2d 27 3b 0a  4) ? 'r' : '-';.
24130 20 20 20 20 61 5b 31 5d 20 3d 20 28 6d 20 26 20      a[1] = (m & 
24140 30 78 32 29 20 3f 20 27 77 27 20 3a 20 27 2d 27  0x2) ? 'w' : '-'
24150 3b 0a 20 20 20 20 61 5b 32 5d 20 3d 20 28 6d 20  ;.    a[2] = (m 
24160 26 20 30 78 31 29 20 3f 20 27 78 27 20 3a 20 27  & 0x1) ? 'x' : '
24170 2d 27 3b 0a 20 20 7d 0a 20 20 7a 4d 6f 64 65 5b  -';.  }.  zMode[
24180 31 30 5d 20 3d 20 27 5c 30 27 3b 0a 7d 0a 0a 2f  10] = '\0';.}../
24190 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
241a0 69 6f 6e 20 6f 66 20 2e 61 72 20 22 6c 69 73 54  ion of .ar "lisT
241b0 22 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a 73  " command. .*/.s
241c0 74 61 74 69 63 20 69 6e 74 20 61 72 4c 69 73 74  tatic int arList
241d0 43 6f 6d 6d 61 6e 64 28 53 68 65 6c 6c 53 74 61  Command(ShellSta
241e0 74 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 20 2a  te *p, sqlite3 *
241f0 64 62 2c 20 41 72 43 6f 6d 6d 61 6e 64 20 2a 70  db, ArCommand *p
24200 41 72 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  Ar){.  const cha
24210 72 20 2a 7a 53 71 6c 20 3d 20 22 53 45 4c 45 43  r *zSql = "SELEC
24220 54 20 25 73 20 46 52 4f 4d 20 25 73 20 57 48 45  T %s FROM %s WHE
24230 52 45 20 25 73 22 3b 20 0a 20 20 63 6f 6e 73 74  RE %s"; .  const
24240 20 63 68 61 72 20 2a 7a 54 62 6c 20 3d 20 28 70   char *zTbl = (p
24250 41 72 2d 3e 62 5a 69 70 20 3f 20 22 7a 69 70 66  Ar->bZip ? "zipf
24260 69 6c 65 28 3f 29 22 20 3a 20 22 73 71 6c 61 72  ile(?)" : "sqlar
24270 22 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ");.  const char
24280 20 2a 61 7a 43 6f 6c 73 5b 5d 20 3d 20 7b 0a 20   *azCols[] = {. 
24290 20 20 20 22 6e 61 6d 65 22 2c 0a 20 20 20 20 22     "name",.    "
242a0 6d 6f 64 65 2c 20 73 7a 2c 20 64 61 74 65 74 69  mode, sz, dateti
242b0 6d 65 28 6d 74 69 6d 65 2c 20 27 75 6e 69 78 65  me(mtime, 'unixe
242c0 70 6f 63 68 27 29 2c 20 6e 61 6d 65 22 0a 20 20  poch'), name".  
242d0 7d 3b 0a 0a 20 20 63 68 61 72 20 2a 7a 57 68 65  };..  char *zWhe
242e0 72 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65  re = 0;.  sqlite
242f0 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30  3_stmt *pSql = 0
24300 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72  ;.  int rc;..  r
24310 63 20 3d 20 61 72 43 68 65 63 6b 45 6e 74 72 69  c = arCheckEntri
24320 65 73 28 64 62 2c 20 70 41 72 29 3b 0a 20 20 61  es(db, pAr);.  a
24330 72 57 68 65 72 65 43 6c 61 75 73 65 28 26 72 63  rWhereClause(&rc
24340 2c 20 70 41 72 2c 20 26 7a 57 68 65 72 65 29 3b  , pAr, &zWhere);
24350 0a 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65  ..  shellPrepare
24360 50 72 69 6e 74 66 28 64 62 2c 20 26 72 63 2c 20  Printf(db, &rc, 
24370 26 70 53 71 6c 2c 20 7a 53 71 6c 2c 20 61 7a 43  &pSql, zSql, azC
24380 6f 6c 73 5b 70 41 72 2d 3e 62 56 65 72 62 6f 73  ols[pAr->bVerbos
24390 65 5d 2c 20 7a 54 62 6c 2c 20 7a 57 68 65 72 65  e], zTbl, zWhere
243a0 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
243b0 49 54 45 5f 4f 4b 20 26 26 20 70 41 72 2d 3e 62  ITE_OK && pAr->b
243c0 5a 69 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  Zip ){.    sqlit
243d0 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 71  e3_bind_text(pSq
243e0 6c 2c 20 31 2c 20 70 41 72 2d 3e 7a 46 69 6c 65  l, 1, pAr->zFile
243f0 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
24400 4e 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 20 20 77  NSIENT);.  }.  w
24410 68 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45  hile( rc==SQLITE
24420 5f 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f  _OK && SQLITE_RO
24430 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
24440 70 53 71 6c 29 20 29 7b 0a 20 20 20 20 69 66 28  pSql) ){.    if(
24450 20 70 41 72 2d 3e 62 56 65 72 62 6f 73 65 20 29   pAr->bVerbose )
24460 7b 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4d 6f  {.      char zMo
24470 64 65 5b 31 31 5d 3b 0a 20 20 20 20 20 20 73 68  de[11];.      sh
24480 65 6c 6c 4d 6f 64 65 54 6f 53 74 72 69 6e 67 28  ellModeToString(
24490 7a 4d 6f 64 65 2c 20 73 71 6c 69 74 65 33 5f 63  zMode, sqlite3_c
244a0 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20  olumn_int(pSql, 
244b0 30 29 29 3b 0a 0a 20 20 20 20 20 20 72 61 77 5f  0));..      raw_
244c0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
244d0 25 73 20 25 20 31 30 64 20 20 25 73 20 20 25 73  %s % 10d  %s  %s
244e0 5c 6e 22 2c 20 7a 4d 6f 64 65 2c 0a 20 20 20 20  \n", zMode,.    
244f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
24500 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 31  lumn_int(pSql, 1
24510 29 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71  ), .          sq
24520 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
24530 74 28 70 53 71 6c 2c 20 32 29 2c 0a 20 20 20 20  t(pSql, 2),.    
24540 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
24550 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20  lumn_text(pSql, 
24560 33 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  3).      );.    
24570 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
24580 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
24590 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f  "%s\n", sqlite3_
245a0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
245b0 2c 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  , 0));.    }.  }
245c0 0a 0a 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a  ..  shellFinaliz
245d0 65 28 26 72 63 2c 20 70 53 71 6c 29 3b 0a 20 20  e(&rc, pSql);.  
245e0 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f  return rc;.}.../
245f0 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74  *.** Implementat
24600 69 6f 6e 20 6f 66 20 2e 61 72 20 22 65 58 74 72  ion of .ar "eXtr
24610 61 63 74 22 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a  act" command. .*
24620 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 45  /.static int arE
24630 78 74 72 61 63 74 43 6f 6d 6d 61 6e 64 28 53 68  xtractCommand(Sh
24640 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 73 71 6c  ellState *p, sql
24650 69 74 65 33 20 2a 64 62 2c 20 41 72 43 6f 6d 6d  ite3 *db, ArComm
24660 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20 63 6f 6e  and *pAr){.  con
24670 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 31 20 3d  st char *zSql1 =
24680 20 0a 20 20 20 20 22 53 45 4c 45 43 54 20 22 0a   .    "SELECT ".
24690 20 20 20 20 22 20 20 3a 31 20 7c 7c 20 6e 61 6d      "  :1 || nam
246a0 65 2c 20 22 0a 20 20 20 20 22 20 20 77 72 69 74  e, ".    "  writ
246b0 65 66 69 6c 65 28 3f 31 20 7c 7c 20 6e 61 6d 65  efile(?1 || name
246c0 2c 20 25 73 2c 20 6d 6f 64 65 2c 20 6d 74 69 6d  , %s, mode, mtim
246d0 65 29 20 22 0a 20 20 20 20 22 46 52 4f 4d 20 25  e) ".    "FROM %
246e0 73 20 57 48 45 52 45 20 28 25 73 29 20 41 4e 44  s WHERE (%s) AND
246f0 20 28 64 61 74 61 20 49 53 20 4e 55 4c 4c 20 4f   (data IS NULL O
24700 52 20 3f 32 20 3d 20 30 29 22 3b 0a 0a 20 20 63  R ?2 = 0)";..  c
24710 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 45 78 74  onst char *azExt
24720 72 61 41 72 67 5b 5d 20 3d 20 7b 20 0a 20 20 20  raArg[] = { .   
24730 20 22 73 71 6c 61 72 5f 75 6e 63 6f 6d 70 72 65   "sqlar_uncompre
24740 73 73 28 64 61 74 61 2c 20 73 7a 29 22 2c 0a 20  ss(data, sz)",. 
24750 20 20 20 22 64 61 74 61 22 0a 20 20 7d 3b 0a 20     "data".  };. 
24760 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 53   const char *azS
24770 6f 75 72 63 65 5b 5d 20 3d 20 7b 0a 20 20 20 20  ource[] = {.    
24780 22 73 71 6c 61 72 22 2c 20 22 7a 69 70 66 69 6c  "sqlar", "zipfil
24790 65 28 3f 33 29 22 0a 20 20 7d 3b 0a 0a 20 20 73  e(?3)".  };..  s
247a0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 71  qlite3_stmt *pSq
247b0 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63 20  l = 0;.  int rc 
247c0 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 63  = SQLITE_OK;.  c
247d0 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a 20  har *zDir = 0;. 
247e0 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20   char *zWhere = 
247f0 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f  0;.  int i;..  /
24800 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 73 20 61  * If arguments a
24810 72 65 20 73 70 65 63 69 66 69 65 64 2c 20 63 68  re specified, ch
24820 65 63 6b 20 74 68 61 74 20 74 68 65 79 20 61 63  eck that they ac
24830 74 75 61 6c 6c 79 20 65 78 69 73 74 20 77 69 74  tually exist wit
24840 68 69 6e 0a 20 20 2a 2a 20 74 68 65 20 61 72 63  hin.  ** the arc
24850 68 69 76 65 20 62 65 66 6f 72 65 20 70 72 6f 63  hive before proc
24860 65 65 64 69 6e 67 2e 20 41 6e 64 20 66 6f 72 6d  eeding. And form
24870 75 6c 61 74 65 20 61 20 57 48 45 52 45 20 63 6c  ulate a WHERE cl
24880 61 75 73 65 20 74 6f 0a 20 20 2a 2a 20 6d 61 74  ause to.  ** mat
24890 63 68 20 74 68 65 6d 2e 20 20 2a 2f 0a 20 20 72  ch them.  */.  r
248a0 63 20 3d 20 61 72 43 68 65 63 6b 45 6e 74 72 69  c = arCheckEntri
248b0 65 73 28 64 62 2c 20 70 41 72 29 3b 0a 20 20 61  es(db, pAr);.  a
248c0 72 57 68 65 72 65 43 6c 61 75 73 65 28 26 72 63  rWhereClause(&rc
248d0 2c 20 70 41 72 2c 20 26 7a 57 68 65 72 65 29 3b  , pAr, &zWhere);
248e0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
248f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28  TE_OK ){.    if(
24900 20 70 41 72 2d 3e 7a 44 69 72 20 29 7b 0a 20 20   pAr->zDir ){.  
24910 20 20 20 20 7a 44 69 72 20 3d 20 73 71 6c 69 74      zDir = sqlit
24920 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 2f 22  e3_mprintf("%s/"
24930 2c 20 70 41 72 2d 3e 7a 44 69 72 29 3b 0a 20 20  , pAr->zDir);.  
24940 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
24950 44 69 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Dir = sqlite3_mp
24960 72 69 6e 74 66 28 22 22 29 3b 0a 20 20 20 20 7d  rintf("");.    }
24970 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d 30  .    if( zDir==0
24980 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e   ) rc = SQLITE_N
24990 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 73 68 65  OMEM;.  }..  she
249a0 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66 28  llPreparePrintf(
249b0 64 62 2c 20 26 72 63 2c 20 26 70 53 71 6c 2c 20  db, &rc, &pSql, 
249c0 7a 53 71 6c 31 2c 20 0a 20 20 20 20 20 20 61 7a  zSql1, .      az
249d0 45 78 74 72 61 41 72 67 5b 70 41 72 2d 3e 62 5a  ExtraArg[pAr->bZ
249e0 69 70 5d 2c 20 61 7a 53 6f 75 72 63 65 5b 70 41  ip], azSource[pA
249f0 72 2d 3e 62 5a 69 70 5d 2c 20 7a 57 68 65 72 65  r->bZip], zWhere
24a00 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 72 63 3d  .  );..  if( rc=
24a10 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
24a20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
24a30 65 78 74 28 70 53 71 6c 2c 20 31 2c 20 7a 44 69  ext(pSql, 1, zDi
24a40 72 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54  r, -1, SQLITE_ST
24a50 41 54 49 43 29 3b 0a 20 20 20 20 69 66 28 20 70  ATIC);.    if( p
24a60 41 72 2d 3e 62 5a 69 70 20 29 7b 0a 20 20 20 20  Ar->bZip ){.    
24a70 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
24a80 65 78 74 28 70 53 71 6c 2c 20 33 2c 20 70 41 72  ext(pSql, 3, pAr
24a90 2d 3e 7a 46 69 6c 65 2c 20 2d 31 2c 20 53 51 4c  ->zFile, -1, SQL
24aa0 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
24ab0 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 75 6e 20 74   }..    /* Run t
24ac0 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
24ad0 65 6e 74 20 74 77 69 63 65 2e 20 54 68 65 20 66  ent twice. The f
24ae0 69 72 73 74 20 74 69 6d 65 2c 20 77 72 69 74 65  irst time, write
24af0 66 69 6c 65 28 29 20 69 73 20 63 61 6c 6c 65 64  file() is called
24b00 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61 6c 6c 20  .    ** for all 
24b10 61 72 63 68 69 76 65 20 6d 65 6d 62 65 72 73 20  archive members 
24b20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 65  that should be e
24b30 78 74 72 61 63 74 65 64 2e 20 54 68 65 20 73 65  xtracted. The se
24b40 63 6f 6e 64 20 74 69 6d 65 2c 0a 20 20 20 20 2a  cond time,.    *
24b50 2a 20 6f 6e 6c 79 20 66 6f 72 20 74 68 65 20 64  * only for the d
24b60 69 72 65 63 74 6f 72 69 65 73 2e 20 54 68 69 73  irectories. This
24b70 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65 20   is because the 
24b80 74 69 6d 65 73 74 61 6d 70 73 20 66 6f 72 0a 20  timestamps for. 
24b90 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64 20     ** extracted 
24ba0 64 69 72 65 63 74 6f 72 69 65 73 20 6d 75 73 74  directories must
24bb0 20 62 65 20 72 65 73 65 74 20 61 66 74 65 72 20   be reset after 
24bc0 74 68 65 79 20 61 72 65 20 70 6f 70 75 6c 61 74  they are populat
24bd0 65 64 20 28 61 73 0a 20 20 20 20 2a 2a 20 70 6f  ed (as.    ** po
24be0 70 75 6c 61 74 69 6e 67 20 74 68 65 6d 20 63 68  pulating them ch
24bf0 61 6e 67 65 73 20 74 68 65 20 74 69 6d 65 73 74  anges the timest
24c00 61 6d 70 29 2e 20 20 2a 2f 0a 20 20 20 20 66 6f  amp).  */.    fo
24c10 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b 29  r(i=0; i<2; i++)
24c20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
24c30 62 69 6e 64 5f 69 6e 74 28 70 53 71 6c 2c 20 32  bind_int(pSql, 2
24c40 2c 20 69 29 3b 0a 20 20 20 20 20 20 77 68 69 6c  , i);.      whil
24c50 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  e( rc==SQLITE_OK
24c60 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d   && SQLITE_ROW==
24c70 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 71  sqlite3_step(pSq
24c80 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  l) ){.        if
24c90 28 20 69 3d 3d 30 20 26 26 20 70 41 72 2d 3e 62  ( i==0 && pAr->b
24ca0 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20  Verbose ){.     
24cb0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
24cc0 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  p->out, "%s\n", 
24cd0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
24ce0 65 78 74 28 70 53 71 6c 2c 20 30 29 29 3b 0a 20  ext(pSql, 0));. 
24cf0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
24d00 0a 20 20 20 20 20 20 73 68 65 6c 6c 52 65 73 65  .      shellRese
24d10 74 28 26 72 63 2c 20 70 53 71 6c 29 3b 0a 20 20  t(&rc, pSql);.  
24d20 20 20 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69 6e    }.    shellFin
24d30 61 6c 69 7a 65 28 26 72 63 2c 20 70 53 71 6c 29  alize(&rc, pSql)
24d40 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65 33  ;.  }..  sqlite3
24d50 5f 66 72 65 65 28 7a 44 69 72 29 3b 0a 20 20 73  _free(zDir);.  s
24d60 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 68 65  qlite3_free(zWhe
24d70 72 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  re);.  return rc
24d80 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c  ;.}.../*.** Impl
24d90 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 2e 61  ementation of .a
24da0 72 20 22 63 72 65 61 74 65 22 20 61 6e 64 20 22  r "create" and "
24db0 75 70 64 61 74 65 22 20 63 6f 6d 6d 61 6e 64 73  update" commands
24dc0 2e 0a 2a 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74  ..**.** Create t
24dd0 68 65 20 22 73 71 6c 61 72 22 20 74 61 62 6c 65  he "sqlar" table
24de0 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
24df0 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20   if it does not 
24e00 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 0a 2a  already exist..*
24e10 2a 20 54 68 65 6e 20 61 64 64 20 65 61 63 68 20  * Then add each 
24e20 66 69 6c 65 20 69 6e 20 74 68 65 20 61 7a 46 69  file in the azFi
24e30 6c 65 5b 5d 20 61 72 72 61 79 20 74 6f 20 74 68  le[] array to th
24e40 65 20 61 72 63 68 69 76 65 2e 20 44 69 72 65 63  e archive. Direc
24e50 74 6f 72 69 65 73 0a 2a 2a 20 61 72 65 20 61 64  tories.** are ad
24e60 64 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e  ded recursively.
24e70 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 56 65   If argument bVe
24e80 72 62 6f 73 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  rbose is non-zer
24e90 6f 2c 20 61 20 6d 65 73 73 61 67 65 20 69 73 0a  o, a message is.
24ea0 2a 2a 20 70 72 69 6e 74 65 64 20 6f 6e 20 73 74  ** printed on st
24eb0 64 6f 75 74 20 66 6f 72 20 65 61 63 68 20 66 69  dout for each fi
24ec0 6c 65 20 61 72 63 68 69 76 65 64 2e 0a 2a 2a 0a  le archived..**.
24ed0 2a 2a 20 54 68 65 20 63 72 65 61 74 65 20 63 6f  ** The create co
24ee0 6d 6d 61 6e 64 20 69 73 20 74 68 65 20 73 61 6d  mmand is the sam
24ef0 65 20 61 73 20 75 70 64 61 74 65 2c 20 65 78 63  e as update, exc
24f00 65 70 74 20 74 68 61 74 20 69 74 20 64 72 6f 70  ept that it drop
24f10 73 0a 2a 2a 20 61 6e 79 20 65 78 69 73 74 69 6e  s.** any existin
24f20 67 20 22 73 71 6c 61 72 22 20 74 61 62 6c 65 20  g "sqlar" table 
24f30 62 65 66 6f 72 65 20 62 65 67 69 6e 6e 69 6e 67  before beginning
24f40 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
24f50 61 72 43 72 65 61 74 65 55 70 64 61 74 65 28 0a  arCreateUpdate(.
24f60 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c    ShellState *p,
24f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24f80 20 20 2f 2a 20 53 68 65 6c 6c 20 73 74 61 74 65    /* Shell state
24f90 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 73 71   pointer */.  sq
24fa0 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 41 72 43  lite3 *db,.  ArC
24fb0 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 20 20 20  ommand *pAr,    
24fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24fd0 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  Command argument
24fe0 73 20 61 6e 64 20 6f 70 74 69 6f 6e 73 20 2a 2f  s and options */
24ff0 0a 20 20 69 6e 74 20 62 55 70 64 61 74 65 0a 29  .  int bUpdate.)
25000 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
25010 7a 53 71 6c 20 3d 20 22 53 45 4c 45 43 54 20 6e  zSql = "SELECT n
25020 61 6d 65 2c 20 6d 6f 64 65 2c 20 6d 74 69 6d 65  ame, mode, mtime
25030 2c 20 64 61 74 61 20 46 52 4f 4d 20 66 73 64 69  , data FROM fsdi
25040 72 28 3f 2c 20 3f 29 22 3b 0a 20 20 63 6f 6e 73  r(?, ?)";.  cons
25050 74 20 63 68 61 72 20 2a 7a 43 72 65 61 74 65 20  t char *zCreate 
25060 3d 20 0a 20 20 20 20 20 20 22 43 52 45 41 54 45  = .      "CREATE
25070 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58   TABLE IF NOT EX
25080 49 53 54 53 20 73 71 6c 61 72 28 5c 6e 22 0a 20  ISTS sqlar(\n". 
25090 20 20 20 20 20 22 20 20 6e 61 6d 65 20 54 45 58       "  name TEX
250a0 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 20  T PRIMARY KEY,  
250b0 2d 2d 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  -- name of the f
250c0 69 6c 65 5c 6e 22 0a 20 20 20 20 20 20 22 20 20  ile\n".      "  
250d0 6d 6f 64 65 20 49 4e 54 2c 20 20 20 20 20 20 20  mode INT,       
250e0 20 20 20 20 20 20 20 20 2d 2d 20 61 63 63 65 73          -- acces
250f0 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 5c 6e 22  s permissions\n"
25100 0a 20 20 20 20 20 20 22 20 20 6d 74 69 6d 65 20  .      "  mtime 
25110 49 4e 54 2c 20 20 20 20 20 20 20 20 20 20 20 20  INT,            
25120 20 20 2d 2d 20 6c 61 73 74 20 6d 6f 64 69 66 69    -- last modifi
25130 63 61 74 69 6f 6e 20 74 69 6d 65 5c 6e 22 0a 20  cation time\n". 
25140 20 20 20 20 20 22 20 20 73 7a 20 49 4e 54 2c 20       "  sz INT, 
25150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25160 2d 2d 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c 65  -- original file
25170 20 73 69 7a 65 5c 6e 22 0a 20 20 20 20 20 20 22   size\n".      "
25180 20 20 64 61 74 61 20 42 4c 4f 42 20 20 20 20 20    data BLOB     
25190 20 20 20 20 20 20 20 20 20 20 2d 2d 20 63 6f 6d            -- com
251a0 70 72 65 73 73 65 64 20 63 6f 6e 74 65 6e 74 5c  pressed content\
251b0 6e 22 0a 20 20 20 20 20 20 22 29 22 3b 0a 20 20  n".      ")";.  
251c0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 72 6f  const char *zDro
251d0 70 20 3d 20 22 44 52 4f 50 20 54 41 42 4c 45 20  p = "DROP TABLE 
251e0 49 46 20 45 58 49 53 54 53 20 73 71 6c 61 72 22  IF EXISTS sqlar"
251f0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
25200 7a 49 6e 73 65 72 74 20 3d 20 22 52 45 50 4c 41  zInsert = "REPLA
25210 43 45 20 49 4e 54 4f 20 73 71 6c 61 72 20 56 41  CE INTO sqlar VA
25220 4c 55 45 53 28 3f 2c 3f 2c 3f 2c 3f 2c 73 71 6c  LUES(?,?,?,?,sql
25230 61 72 5f 63 6f 6d 70 72 65 73 73 28 3f 29 29 22  ar_compress(?))"
25240 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ;..  sqlite3_stm
25250 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 20 20 20  t *pStmt = 0;   
25260 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f 72       /* Director
25270 79 20 74 72 61 76 65 72 73 65 72 20 2a 2f 0a 20  y traverser */. 
25280 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
25290 49 6e 73 65 72 74 20 3d 20 30 3b 20 20 20 20 20  Insert = 0;     
252a0 20 2f 2a 20 43 6f 6d 70 69 6c 61 74 69 6f 6e 20   /* Compilation 
252b0 6f 66 20 7a 49 6e 73 65 72 74 20 2a 2f 0a 20 20  of zInsert */.  
252c0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
252d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252e0 2f 2a 20 46 6f 72 20 69 74 65 72 61 74 69 6e 67  /* For iterating
252f0 20 74 68 72 6f 75 67 68 20 61 7a 46 69 6c 65 5b   through azFile[
25300 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  ] */.  int rc;  
25310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25320 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
25330 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73 65   code */..  asse
25340 72 74 28 20 70 41 72 2d 3e 62 5a 69 70 3d 3d 30  rt( pAr->bZip==0
25350 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69   );..  rc = sqli
25360 74 65 33 5f 65 78 65 63 28 64 62 2c 20 22 53 41  te3_exec(db, "SA
25370 56 45 50 4f 49 4e 54 20 61 72 3b 22 2c 20 30 2c  VEPOINT ar;", 0,
25380 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63   0, 0);.  if( rc
25390 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
253a0 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28 20  turn rc;..  if( 
253b0 62 55 70 64 61 74 65 3d 3d 30 20 29 7b 0a 20 20  bUpdate==0 ){.  
253c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
253d0 78 65 63 28 64 62 2c 20 7a 44 72 6f 70 2c 20 30  xec(db, zDrop, 0
253e0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  , 0, 0);.    if(
253f0 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29   rc!=SQLITE_OK )
25400 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a   return rc;.  }.
25410 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
25420 65 78 65 63 28 64 62 2c 20 7a 43 72 65 61 74 65  exec(db, zCreate
25430 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 73 68  , 0, 0, 0);.  sh
25440 65 6c 6c 50 72 65 70 61 72 65 28 64 62 2c 20 26  ellPrepare(db, &
25450 72 63 2c 20 7a 49 6e 73 65 72 74 2c 20 26 70 49  rc, zInsert, &pI
25460 6e 73 65 72 74 29 3b 0a 20 20 73 68 65 6c 6c 50  nsert);.  shellP
25470 72 65 70 61 72 65 28 64 62 2c 20 26 72 63 2c 20  repare(db, &rc, 
25480 7a 53 71 6c 2c 20 26 70 53 74 6d 74 29 3b 0a 20  zSql, &pStmt);. 
25490 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
254a0 78 74 28 70 53 74 6d 74 2c 20 32 2c 20 70 41 72  xt(pStmt, 2, pAr
254b0 2d 3e 7a 44 69 72 2c 20 2d 31 2c 20 53 51 4c 49  ->zDir, -1, SQLI
254c0 54 45 5f 53 54 41 54 49 43 29 3b 0a 0a 20 20 66  TE_STATIC);..  f
254d0 6f 72 28 69 3d 30 3b 20 69 3c 70 41 72 2d 3e 6e  or(i=0; i<pAr->n
254e0 41 72 67 20 26 26 20 72 63 3d 3d 53 51 4c 49 54  Arg && rc==SQLIT
254f0 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  E_OK; i++){.    
25500 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
25510 74 28 70 53 74 6d 74 2c 20 31 2c 20 70 41 72 2d  t(pStmt, 1, pAr-
25520 3e 61 7a 41 72 67 5b 69 5d 2c 20 2d 31 2c 20 53  >azArg[i], -1, S
25530 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
25540 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53 51     while( rc==SQ
25550 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49 54  LITE_OK && SQLIT
25560 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
25570 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20  tep(pStmt) ){.  
25580 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20 20      int sz;.    
25590 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e    const char *zN
255a0 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
255b0 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
255c0 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29  n_text(pStmt, 0)
255d0 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d 6f 64 65  ;.      int mode
255e0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
255f0 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31 29 3b  n_int(pStmt, 1);
25600 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20  .      unsigned 
25610 69 6e 74 20 6d 74 69 6d 65 20 3d 20 73 71 6c 69  int mtime = sqli
25620 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
25630 53 74 6d 74 2c 20 32 29 3b 0a 0a 20 20 20 20 20  Stmt, 2);..     
25640 20 69 66 28 20 70 41 72 2d 3e 62 56 65 72 62 6f   if( pAr->bVerbo
25650 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61  se ){.        ra
25660 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
25670 20 22 25 73 5c 6e 22 2c 20 7a 4e 61 6d 65 29 3b   "%s\n", zName);
25680 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
25690 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
256a0 74 28 70 49 6e 73 65 72 74 2c 20 31 2c 20 7a 4e  t(pInsert, 1, zN
256b0 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f  ame, -1, SQLITE_
256c0 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 73  STATIC);.      s
256d0 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
256e0 70 49 6e 73 65 72 74 2c 20 32 2c 20 6d 6f 64 65  pInsert, 2, mode
256f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
25700 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 49 6e 73  _bind_int64(pIns
25710 65 72 74 2c 20 33 2c 20 28 73 71 6c 69 74 65 33  ert, 3, (sqlite3
25720 5f 69 6e 74 36 34 29 6d 74 69 6d 65 29 3b 0a 0a  _int64)mtime);..
25730 20 20 20 20 20 20 69 66 28 20 53 5f 49 53 44 49        if( S_ISDI
25740 52 28 6d 6f 64 65 29 20 29 7b 0a 20 20 20 20 20  R(mode) ){.     
25750 20 20 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20 20     sz = 0;.     
25760 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
25770 6e 75 6c 6c 28 70 49 6e 73 65 72 74 2c 20 35 29  null(pInsert, 5)
25780 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
25790 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
257a0 69 6e 64 5f 76 61 6c 75 65 28 70 49 6e 73 65 72  ind_value(pInser
257b0 74 2c 20 35 2c 20 73 71 6c 69 74 65 33 5f 63 6f  t, 5, sqlite3_co
257c0 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 53 74 6d 74  lumn_value(pStmt
257d0 2c 20 33 29 29 3b 0a 20 20 20 20 20 20 20 20 69  , 3));.        i
257e0 66 28 20 53 5f 49 53 4c 4e 4b 28 6d 6f 64 65 29  f( S_ISLNK(mode)
257f0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 7a   ){.          sz
25800 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d   = -1;.        }
25810 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
25820 73 7a 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  sz = sqlite3_col
25830 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74 2c  umn_bytes(pStmt,
25840 20 33 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   3);.        }. 
25850 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73 71       }..      sq
25860 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70  lite3_bind_int(p
25870 49 6e 73 65 72 74 2c 20 34 2c 20 73 7a 29 3b 0a  Insert, 4, sz);.
25880 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
25890 65 70 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 20  ep(pInsert);.   
258a0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
258b0 72 65 73 65 74 28 70 49 6e 73 65 72 74 29 3b 0a  reset(pInsert);.
258c0 20 20 20 20 7d 0a 20 20 20 20 73 68 65 6c 6c 52      }.    shellR
258d0 65 73 65 74 28 26 72 63 2c 20 70 53 74 6d 74 29  eset(&rc, pStmt)
258e0 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 21  ;.  }..  if( rc!
258f0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25900 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64    sqlite3_exec(d
25910 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f 20  b, "ROLLBACK TO 
25920 61 72 3b 20 52 45 4c 45 41 53 45 20 61 72 3b 22  ar; RELEASE ar;"
25930 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 65  , 0, 0, 0);.  }e
25940 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73 71  lse{.    rc = sq
25950 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 22  lite3_exec(db, "
25960 52 45 4c 45 41 53 45 20 61 72 3b 22 2c 20 30 2c  RELEASE ar;", 0,
25970 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 68   0, 0);.  }.  sh
25980 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c  ellFinalize(&rc,
25990 20 70 53 74 6d 74 29 3b 0a 20 20 73 68 65 6c 6c   pStmt);.  shell
259a0 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 49  Finalize(&rc, pI
259b0 6e 73 65 72 74 29 3b 0a 20 20 72 65 74 75 72 6e  nsert);.  return
259c0 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d   rc;.}../*.** Im
259d0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
259e0 2e 61 72 20 22 43 72 65 61 74 65 22 20 63 6f 6d  .ar "Create" com
259f0 6d 61 6e 64 2e 20 0a 2a 2a 0a 2a 2a 20 43 72 65  mand. .**.** Cre
25a00 61 74 65 20 74 68 65 20 22 73 71 6c 61 72 22 20  ate the "sqlar" 
25a10 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61 74  table in the dat
25a20 61 62 61 73 65 20 69 66 20 69 74 20 64 6f 65 73  abase if it does
25a30 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69   not already exi
25a40 73 74 2e 0a 2a 2a 20 54 68 65 6e 20 61 64 64 20  st..** Then add 
25a50 65 61 63 68 20 66 69 6c 65 20 69 6e 20 74 68 65  each file in the
25a60 20 61 7a 46 69 6c 65 5b 5d 20 61 72 72 61 79 20   azFile[] array 
25a70 74 6f 20 74 68 65 20 61 72 63 68 69 76 65 2e 20  to the archive. 
25a80 44 69 72 65 63 74 6f 72 69 65 73 0a 2a 2a 20 61  Directories.** a
25a90 72 65 20 61 64 64 65 64 20 72 65 63 75 72 73 69  re added recursi
25aa0 76 65 6c 79 2e 20 49 66 20 61 72 67 75 6d 65 6e  vely. If argumen
25ab0 74 20 62 56 65 72 62 6f 73 65 20 69 73 20 6e 6f  t bVerbose is no
25ac0 6e 2d 7a 65 72 6f 2c 20 61 20 6d 65 73 73 61 67  n-zero, a messag
25ad0 65 20 69 73 0a 2a 2a 20 70 72 69 6e 74 65 64 20  e is.** printed 
25ae0 6f 6e 20 73 74 64 6f 75 74 20 66 6f 72 20 65 61  on stdout for ea
25af0 63 68 20 66 69 6c 65 20 61 72 63 68 69 76 65 64  ch file archived
25b00 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
25b10 61 72 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64 28  arCreateCommand(
25b20 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
25b30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25b40 20 20 20 2f 2a 20 53 68 65 6c 6c 20 73 74 61 74     /* Shell stat
25b50 65 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 73  e pointer */.  s
25b60 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 41 72  qlite3 *db,.  Ar
25b70 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 20 20 20 20  Command *pAr    
25b80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25b90 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
25ba0 74 73 20 61 6e 64 20 6f 70 74 69 6f 6e 73 20 2a  ts and options *
25bb0 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 61 72  /.){.  return ar
25bc0 43 72 65 61 74 65 55 70 64 61 74 65 28 70 2c 20  CreateUpdate(p, 
25bd0 64 62 2c 20 70 41 72 2c 20 30 29 3b 0a 7d 0a 0a  db, pAr, 0);.}..
25be0 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61  /*.** Implementa
25bf0 74 69 6f 6e 20 6f 66 20 2e 61 72 20 22 55 70 64  tion of .ar "Upd
25c00 61 74 65 22 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a  ate" command. .*
25c10 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 55  /.static int arU
25c20 70 64 61 74 65 43 6d 64 28 53 68 65 6c 6c 53 74  pdateCmd(ShellSt
25c30 61 74 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 20  ate *p, sqlite3 
25c40 2a 64 62 2c 20 41 72 43 6f 6d 6d 61 6e 64 20 2a  *db, ArCommand *
25c50 70 41 72 29 7b 0a 20 20 72 65 74 75 72 6e 20 61  pAr){.  return a
25c60 72 43 72 65 61 74 65 55 70 64 61 74 65 28 70 2c  rCreateUpdate(p,
25c70 20 64 62 2c 20 70 41 72 2c 20 31 29 3b 0a 7d 0a   db, pAr, 1);.}.
25c80 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
25c90 74 61 74 69 6f 6e 20 6f 66 20 22 2e 61 72 22 20  tation of ".ar" 
25ca0 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a  dot command..*/.
25cb0 73 74 61 74 69 63 20 69 6e 74 20 61 72 44 6f 74  static int arDot
25cc0 43 6f 6d 6d 61 6e 64 28 0a 20 20 53 68 65 6c 6c  Command(.  Shell
25cd0 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20  State *pState,  
25ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75             /* Cu
25cf0 72 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c  rrent shell tool
25d00 20 73 74 61 74 65 20 2a 2f 0a 20 20 63 68 61 72   state */.  char
25d10 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20   **azArg,       
25d20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
25d30 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74  rray of argument
25d40 73 20 70 61 73 73 65 64 20 74 6f 20 64 6f 74 20  s passed to dot 
25d50 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
25d60 20 6e 41 72 67 20 20 20 20 20 20 20 20 20 20 20   nArg           
25d70 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25d80 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
25d90 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a  s in azArg[] */.
25da0 29 7b 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20 63  ){.  ArCommand c
25db0 6d 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  md;.  int rc;.  
25dc0 72 63 20 3d 20 61 72 50 61 72 73 65 43 6f 6d 6d  rc = arParseComm
25dd0 61 6e 64 28 61 7a 41 72 67 2c 20 6e 41 72 67 2c  and(azArg, nArg,
25de0 20 26 63 6d 64 29 3b 0a 20 20 69 66 28 20 72 63   &cmd);.  if( rc
25df0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
25e00 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
25e10 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
25e20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61 6e   /* Database han
25e30 64 6c 65 20 74 6f 20 75 73 65 20 61 73 20 61 72  dle to use as ar
25e40 63 68 69 76 65 20 2a 2f 0a 0a 20 20 20 20 69 66  chive */..    if
25e50 28 20 63 6d 64 2e 62 5a 69 70 20 29 7b 0a 20 20  ( cmd.bZip ){.  
25e60 20 20 20 20 69 66 28 20 63 6d 64 2e 7a 46 69 6c      if( cmd.zFil
25e70 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
25e80 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
25e90 72 2c 20 22 7a 69 70 20 66 6f 72 6d 61 74 20 72  r, "zip format r
25ea0 65 71 75 69 72 65 73 20 61 20 2d 2d 66 69 6c 65  equires a --file
25eb0 20 73 77 69 74 63 68 5c 6e 22 29 3b 0a 20 20 20   switch\n");.   
25ec0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
25ed0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
25ee0 7d 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28 20  }else.      if( 
25ef0 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44  cmd.eCmd==AR_CMD
25f00 5f 43 52 45 41 54 45 20 7c 7c 20 63 6d 64 2e 65  _CREATE || cmd.e
25f10 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 55 50 44 41  Cmd==AR_CMD_UPDA
25f20 54 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61  TE ){.        ra
25f30 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
25f40 20 22 7a 69 70 20 61 72 63 68 69 76 65 73 20 61   "zip archives a
25f50 72 65 20 72 65 61 64 2d 6f 6e 6c 79 5c 6e 22 29  re read-only\n")
25f60 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
25f70 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
25f80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62 20       }.      db 
25f90 3d 20 70 53 74 61 74 65 2d 3e 64 62 3b 0a 20 20  = pState->db;.  
25fa0 20 20 7d 65 6c 73 65 20 69 66 28 20 63 6d 64 2e    }else if( cmd.
25fb0 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20 69  zFile ){.      i
25fc0 6e 74 20 66 6c 61 67 73 3b 0a 20 20 20 20 20 20  nt flags;.      
25fd0 69 66 28 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52  if( cmd.eCmd==AR
25fe0 5f 43 4d 44 5f 43 52 45 41 54 45 20 7c 7c 20 63  _CMD_CREATE || c
25ff0 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f  md.eCmd==AR_CMD_
26000 55 50 44 41 54 45 20 29 7b 0a 20 20 20 20 20 20  UPDATE ){.      
26010 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54 45    flags = SQLITE
26020 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7c  _OPEN_READWRITE|
26030 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45 41  SQLITE_OPEN_CREA
26040 54 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  TE;.      }else{
26050 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20 3d  .        flags =
26060 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41   SQLITE_OPEN_REA
26070 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a 20  DONLY;.      }. 
26080 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
26090 33 5f 6f 70 65 6e 5f 76 32 28 63 6d 64 2e 7a 46  3_open_v2(cmd.zF
260a0 69 6c 65 2c 20 26 64 62 2c 20 66 6c 61 67 73 2c  ile, &db, flags,
260b0 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72   0);.      if( r
260c0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
260d0 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
260e0 74 66 28 73 74 64 65 72 72 2c 20 22 63 61 6e 6e  tf(stderr, "cann
260f0 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20 25 73  ot open file: %s
26100 20 28 25 73 29 5c 6e 22 2c 20 0a 20 20 20 20 20   (%s)\n", .     
26110 20 20 20 20 20 20 20 63 6d 64 2e 7a 46 69 6c 65         cmd.zFile
26120 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
26130 28 64 62 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  (db).        );.
26140 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
26150 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 20  close(db);.     
26160 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20     return rc;.  
26170 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
26180 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e 69 74 28  te3_fileio_init(
26190 64 62 2c 20 30 2c 20 30 29 3b 0a 23 69 66 64 65  db, 0, 0);.#ifde
261a0 66 20 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c  f SQLITE_HAVE_ZL
261b0 49 42 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  IB.      sqlite3
261c0 5f 73 71 6c 61 72 5f 69 6e 69 74 28 64 62 2c 20  _sqlar_init(db, 
261d0 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20  0, 0);.#endif.  
261e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 64    }else{.      d
261f0 62 20 3d 20 70 53 74 61 74 65 2d 3e 64 62 3b 0a  b = pState->db;.
26200 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74 63      }..    switc
26210 68 28 20 63 6d 64 2e 65 43 6d 64 20 29 7b 0a 20  h( cmd.eCmd ){. 
26220 20 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44       case AR_CMD
26230 5f 43 52 45 41 54 45 3a 0a 20 20 20 20 20 20 20  _CREATE:.       
26240 20 72 63 20 3d 20 61 72 43 72 65 61 74 65 43 6f   rc = arCreateCo
26250 6d 6d 61 6e 64 28 70 53 74 61 74 65 2c 20 64 62  mmand(pState, db
26260 2c 20 26 63 6d 64 29 3b 0a 20 20 20 20 20 20 20  , &cmd);.       
26270 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63   break;..      c
26280 61 73 65 20 41 52 5f 43 4d 44 5f 45 58 54 52 41  ase AR_CMD_EXTRA
26290 43 54 3a 0a 20 20 20 20 20 20 20 20 72 63 20 3d  CT:.        rc =
262a0 20 61 72 45 78 74 72 61 63 74 43 6f 6d 6d 61 6e   arExtractComman
262b0 64 28 70 53 74 61 74 65 2c 20 64 62 2c 20 26 63  d(pState, db, &c
262c0 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  md);.        bre
262d0 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20  ak;..      case 
262e0 41 52 5f 43 4d 44 5f 4c 49 53 54 3a 0a 20 20 20  AR_CMD_LIST:.   
262f0 20 20 20 20 20 72 63 20 3d 20 61 72 4c 69 73 74       rc = arList
26300 43 6f 6d 6d 61 6e 64 28 70 53 74 61 74 65 2c 20  Command(pState, 
26310 64 62 2c 20 26 63 6d 64 29 3b 0a 20 20 20 20 20  db, &cmd);.     
26320 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
26330 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 48 45 4c   case AR_CMD_HEL
26340 50 3a 0a 20 20 20 20 20 20 20 20 61 72 55 73 61  P:.        arUsa
26350 67 65 28 70 53 74 61 74 65 2d 3e 6f 75 74 29 3b  ge(pState->out);
26360 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
26370 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  .      default:.
26380 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
26390 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44  cmd.eCmd==AR_CMD
263a0 5f 55 50 44 41 54 45 20 29 3b 0a 20 20 20 20 20  _UPDATE );.     
263b0 20 20 20 72 63 20 3d 20 61 72 55 70 64 61 74 65     rc = arUpdate
263c0 43 6d 64 28 70 53 74 61 74 65 2c 20 64 62 2c 20  Cmd(pState, db, 
263d0 26 63 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 62  &cmd);.        b
263e0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
263f0 20 69 66 28 20 63 6d 64 2e 7a 46 69 6c 65 20 29   if( cmd.zFile )
26400 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
26410 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20 7d  close(db);.    }
26420 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72  .  }..  return r
26430 63 3b 0a 7d 0a 2f 2a 20 45 6e 64 20 6f 66 20 74  c;.}./* End of t
26440 68 65 20 22 2e 61 72 63 68 69 76 65 22 20 6f 72  he ".archive" or
26450 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e 64 20 6c   ".ar" command l
26460 6f 67 69 63 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ogic.***********
26470 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26480 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26490 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
264a0 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
264b0 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66 20  *******/.#endif 
264c0 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
264d0 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54  TE_OMIT_VIRTUALT
264e0 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64  ABLE) && defined
264f0 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49  (SQLITE_HAVE_ZLI
26500 42 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  B) */../*.** Imp
26510 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22  lementation of "
26520 2e 65 78 70 65 72 74 22 20 64 6f 74 20 63 6f 6d  .expert" dot com
26530 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  mand..*/.static 
26540 69 6e 74 20 65 78 70 65 72 74 44 6f 74 43 6f 6d  int expertDotCom
26550 6d 61 6e 64 28 0a 20 20 53 68 65 6c 6c 53 74 61  mand(.  ShellSta
26560 74 65 20 2a 70 53 74 61 74 65 2c 20 20 20 20 20  te *pState,     
26570 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65          /* Curre
26580 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73 74  nt shell tool st
26590 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ate */.  char **
265a0 61 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20 20  azArg,          
265b0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61           /* Arra
265c0 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70  y of arguments p
265d0 61 73 73 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d  assed to dot com
265e0 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41  mand */.  int nA
265f0 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20  rg              
26600 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
26610 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69  ber of entries i
26620 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a  n azArg[] */.){.
26630 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54    int rc = SQLIT
26640 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 45  E_OK;.  char *zE
26650 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b  rr = 0;.  int i;
26660 0a 20 20 69 6e 74 20 69 53 61 6d 70 6c 65 20 3d  .  int iSample =
26670 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   0;..  assert( p
26680 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45  State->expert.pE
26690 78 70 65 72 74 3d 3d 30 20 29 3b 0a 20 20 6d 65  xpert==0 );.  me
266a0 6d 73 65 74 28 26 70 53 74 61 74 65 2d 3e 65 78  mset(&pState->ex
266b0 70 65 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28  pert, 0, sizeof(
266c0 45 78 70 65 72 74 49 6e 66 6f 29 29 3b 0a 0a 20  ExpertInfo));.. 
266d0 20 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51   for(i=1; rc==SQ
266e0 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 41 72  LITE_OK && i<nAr
266f0 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61  g; i++){.    cha
26700 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 3b  r *z = azArg[i];
26710 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20  .    int n;.    
26720 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26  if( z[0]=='-' &&
26730 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b   z[1]=='-' ) z++
26740 3b 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e  ;.    n = strlen
26750 33 30 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e  30(z);.    if( n
26760 3e 3d 32 20 26 26 20 30 3d 3d 73 74 72 6e 63 6d  >=2 && 0==strncm
26770 70 28 7a 2c 20 22 2d 76 65 72 62 6f 73 65 22 2c  p(z, "-verbose",
26780 20 6e 29 20 29 7b 0a 20 20 20 20 20 20 70 53 74   n) ){.      pSt
26790 61 74 65 2d 3e 65 78 70 65 72 74 2e 62 56 65 72  ate->expert.bVer
267a0 62 6f 73 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  bose = 1;.    }.
267b0 20 20 20 20 65 6c 73 65 20 69 66 28 20 6e 3e 3d      else if( n>=
267c0 32 20 26 26 20 30 3d 3d 73 74 72 6e 63 6d 70 28  2 && 0==strncmp(
267d0 7a 2c 20 22 2d 73 61 6d 70 6c 65 22 2c 20 6e 29  z, "-sample", n)
267e0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d   ){.      if( i=
267f0 3d 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20 20  =(nArg-1) ){.   
26800 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
26810 73 74 64 65 72 72 2c 20 22 6f 70 74 69 6f 6e 20  stderr, "option 
26820 72 65 71 75 69 72 65 73 20 61 6e 20 61 72 67 75  requires an argu
26830 6d 65 6e 74 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b  ment: %s\n", z);
26840 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
26850 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
26860 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
26870 20 69 53 61 6d 70 6c 65 20 3d 20 28 69 6e 74 29   iSample = (int)
26880 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41  integerValue(azA
26890 72 67 5b 2b 2b 69 5d 29 3b 0a 20 20 20 20 20 20  rg[++i]);.      
268a0 20 20 69 66 28 20 69 53 61 6d 70 6c 65 3c 30 20    if( iSample<0 
268b0 7c 7c 20 69 53 61 6d 70 6c 65 3e 31 30 30 20 29  || iSample>100 )
268c0 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  {.          raw_
268d0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
268e0 76 61 6c 75 65 20 6f 75 74 20 6f 66 20 72 61 6e  value out of ran
268f0 67 65 3a 20 25 73 5c 6e 22 2c 20 61 7a 41 72 67  ge: %s\n", azArg
26900 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
26910 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
26920 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  R;.        }.   
26930 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65     }.    }.    e
26940 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
26950 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75  rintf(stderr, "u
26960 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25  nknown option: %
26970 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20  s\n", z);.      
26980 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
26990 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  R;.    }.  }..  
269a0 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
269b0 4b 20 29 7b 0a 20 20 20 20 70 53 74 61 74 65 2d  K ){.    pState-
269c0 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 20  >expert.pExpert 
269d0 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74  = sqlite3_expert
269e0 5f 6e 65 77 28 70 53 74 61 74 65 2d 3e 64 62 2c  _new(pState->db,
269f0 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28   &zErr);.    if(
26a00 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e   pState->expert.
26a10 70 45 78 70 65 72 74 3d 3d 30 20 29 7b 0a 20 20  pExpert==0 ){.  
26a20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
26a30 74 64 65 72 72 2c 20 22 73 71 6c 69 74 65 33 5f  tderr, "sqlite3_
26a40 65 78 70 65 72 74 5f 6e 65 77 3a 20 25 73 5c 6e  expert_new: %s\n
26a50 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 20 20  ", zErr);.      
26a60 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f  rc = SQLITE_ERRO
26a70 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  R;.    }else{.  
26a80 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 70 65      sqlite3_expe
26a90 72 74 5f 63 6f 6e 66 69 67 28 0a 20 20 20 20 20  rt_config(.     
26aa0 20 20 20 20 20 70 53 74 61 74 65 2d 3e 65 78 70       pState->exp
26ab0 65 72 74 2e 70 45 78 70 65 72 74 2c 20 45 58 50  ert.pExpert, EXP
26ac0 45 52 54 5f 43 4f 4e 46 49 47 5f 53 41 4d 50 4c  ERT_CONFIG_SAMPL
26ad0 45 2c 20 69 53 61 6d 70 6c 65 0a 20 20 20 20 20  E, iSample.     
26ae0 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   );.    }.  }.. 
26af0 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a   return rc;.}...
26b00 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 70 75  /*.** If an inpu
26b10 74 20 6c 69 6e 65 20 62 65 67 69 6e 73 20 77 69  t line begins wi
26b20 74 68 20 22 2e 22 20 74 68 65 6e 20 69 6e 76 6f  th "." then invo
26b30 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ke this routine 
26b40 74 6f 0a 2a 2a 20 70 72 6f 63 65 73 73 20 74 68  to.** process th
26b50 61 74 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52  at line..**.** R
26b60 65 74 75 72 6e 20 31 20 6f 6e 20 65 72 72 6f 72  eturn 1 on error
26b70 2c 20 32 20 74 6f 20 65 78 69 74 2c 20 61 6e 64  , 2 to exit, and
26b80 20 30 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f   0 otherwise..*/
26b90 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 5f 6d  .static int do_m
26ba0 65 74 61 5f 63 6f 6d 6d 61 6e 64 28 63 68 61 72  eta_command(char
26bb0 20 2a 7a 4c 69 6e 65 2c 20 53 68 65 6c 6c 53 74   *zLine, ShellSt
26bc0 61 74 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 68  ate *p){.  int h
26bd0 20 3d 20 31 3b 0a 20 20 69 6e 74 20 6e 41 72 67   = 1;.  int nArg
26be0 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 2c 20 63   = 0;.  int n, c
26bf0 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a  ;.  int rc = 0;.
26c00 20 20 63 68 61 72 20 2a 61 7a 41 72 67 5b 35 30    char *azArg[50
26c10 5d 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 65 78 70  ];..  if( p->exp
26c20 65 72 74 2e 70 45 78 70 65 72 74 20 29 7b 0a 20  ert.pExpert ){. 
26c30 20 20 20 65 78 70 65 72 74 46 69 6e 69 73 68 28     expertFinish(
26c40 70 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  p, 1, 0);.  }.. 
26c50 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20 69 6e   /* Parse the in
26c60 70 75 74 20 6c 69 6e 65 20 69 6e 74 6f 20 74 6f  put line into to
26c70 6b 65 6e 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69  kens..  */.  whi
26c80 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20 26 26 20  le( zLine[h] && 
26c90 6e 41 72 67 3c 41 72 72 61 79 53 69 7a 65 28 61  nArg<ArraySize(a
26ca0 7a 41 72 67 29 20 29 7b 0a 20 20 20 20 77 68 69  zArg) ){.    whi
26cb0 6c 65 28 20 49 73 53 70 61 63 65 28 7a 4c 69 6e  le( IsSpace(zLin
26cc0 65 5b 68 5d 29 20 29 7b 20 68 2b 2b 3b 20 7d 0a  e[h]) ){ h++; }.
26cd0 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d      if( zLine[h]
26ce0 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
26cf0 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27   if( zLine[h]=='
26d00 5c 27 27 20 7c 7c 20 7a 4c 69 6e 65 5b 68 5d 3d  \'' || zLine[h]=
26d10 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20 69 6e  ='"' ){.      in
26d20 74 20 64 65 6c 69 6d 20 3d 20 7a 4c 69 6e 65 5b  t delim = zLine[
26d30 68 2b 2b 5d 3b 0a 20 20 20 20 20 20 61 7a 41 72  h++];.      azAr
26d40 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26 7a 4c 69  g[nArg++] = &zLi
26d50 6e 65 5b 68 5d 3b 0a 20 20 20 20 20 20 77 68 69  ne[h];.      whi
26d60 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20 26 26 20  le( zLine[h] && 
26d70 7a 4c 69 6e 65 5b 68 5d 21 3d 64 65 6c 69 6d 20  zLine[h]!=delim 
26d80 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ){.        if( z
26d90 4c 69 6e 65 5b 68 5d 3d 3d 27 5c 5c 27 20 26 26  Line[h]=='\\' &&
26da0 20 64 65 6c 69 6d 3d 3d 27 22 27 20 26 26 20 7a   delim=='"' && z
26db0 4c 69 6e 65 5b 68 2b 31 5d 21 3d 30 20 29 20 68  Line[h+1]!=0 ) h
26dc0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 68 2b 2b 3b  ++;.        h++;
26dd0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
26de0 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 64 65 6c  f( zLine[h]==del
26df0 69 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4c  im ){.        zL
26e00 69 6e 65 5b 68 2b 2b 5d 20 3d 20 30 3b 0a 20 20  ine[h++] = 0;.  
26e10 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
26e20 64 65 6c 69 6d 3d 3d 27 22 27 20 29 20 72 65 73  delim=='"' ) res
26e30 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68 65 73  olve_backslashes
26e40 28 61 7a 41 72 67 5b 6e 41 72 67 2d 31 5d 29 3b  (azArg[nArg-1]);
26e50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
26e60 20 20 61 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d 20    azArg[nArg++] 
26e70 3d 20 26 7a 4c 69 6e 65 5b 68 5d 3b 0a 20 20 20  = &zLine[h];.   
26e80 20 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b     while( zLine[
26e90 68 5d 20 26 26 20 21 49 73 53 70 61 63 65 28 7a  h] && !IsSpace(z
26ea0 4c 69 6e 65 5b 68 5d 29 20 29 7b 20 68 2b 2b 3b  Line[h]) ){ h++;
26eb0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69   }.      if( zLi
26ec0 6e 65 5b 68 5d 20 29 20 7a 4c 69 6e 65 5b 68 2b  ne[h] ) zLine[h+
26ed0 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  +] = 0;.      re
26ee0 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68 65  solve_backslashe
26ef0 73 28 61 7a 41 72 67 5b 6e 41 72 67 2d 31 5d 29  s(azArg[nArg-1])
26f00 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
26f10 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20 69 6e  * Process the in
26f20 70 75 74 20 6c 69 6e 65 2e 0a 20 20 2a 2f 0a 20  put line..  */. 
26f30 20 69 66 28 20 6e 41 72 67 3d 3d 30 20 29 20 72   if( nArg==0 ) r
26f40 65 74 75 72 6e 20 30 3b 20 2f 2a 20 6e 6f 20 74  eturn 0; /* no t
26f50 6f 6b 65 6e 73 2c 20 6e 6f 20 65 72 72 6f 72 20  okens, no error 
26f60 2a 2f 0a 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33  */.  n = strlen3
26f70 30 28 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 63  0(azArg[0]);.  c
26f80 20 3d 20 61 7a 41 72 67 5b 30 5d 5b 30 5d 3b 0a   = azArg[0][0];.
26f90 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
26fa0 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49  OMIT_AUTHORIZATI
26fb0 4f 4e 0a 20 20 69 66 28 20 63 3d 3d 27 61 27 20  ON.  if( c=='a' 
26fc0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
26fd0 5b 30 5d 2c 20 22 61 75 74 68 22 2c 20 6e 29 3d  [0], "auth", n)=
26fe0 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
26ff0 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72  rg!=2 ){.      r
27000 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
27010 2c 20 22 55 73 61 67 65 3a 20 2e 61 75 74 68 20  , "Usage: .auth 
27020 4f 4e 7c 4f 46 46 5c 6e 22 29 3b 0a 20 20 20 20  ON|OFF\n");.    
27030 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
27040 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
27050 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20  d_exit;.    }.  
27060 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
27070 0a 20 20 20 20 69 66 28 20 62 6f 6f 6c 65 61 6e  .    if( boolean
27080 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 20  Value(azArg[1]) 
27090 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
270a0 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28  _set_authorizer(
270b0 70 2d 3e 64 62 2c 20 73 68 65 6c 6c 41 75 74 68  p->db, shellAuth
270c0 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , p);.    }else{
270d0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
270e0 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 2d  et_authorizer(p-
270f0 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  >db, 0, 0);.    
27100 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  }.  }else.#endif
27110 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ..#if !defined(S
27120 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55  QLITE_OMIT_VIRTU
27130 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66 69  ALTABLE) && defi
27140 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f  ned(SQLITE_HAVE_
27150 5a 4c 49 42 29 0a 20 20 69 66 28 20 63 3d 3d 27  ZLIB).  if( c=='
27160 61 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  a' && strncmp(az
27170 41 72 67 5b 30 5d 2c 20 22 61 72 63 68 69 76 65  Arg[0], "archive
27180 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
27190 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
271a0 20 20 20 72 63 20 3d 20 61 72 44 6f 74 43 6f 6d     rc = arDotCom
271b0 6d 61 6e 64 28 70 2c 20 61 7a 41 72 67 2c 20 6e  mand(p, azArg, n
271c0 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  Arg);.  }else.#e
271d0 6e 64 69 66 0a 0a 20 20 69 66 28 20 28 63 3d 3d  ndif..  if( (c==
271e0 27 62 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73  'b' && n>=3 && s
271f0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
27200 20 22 62 61 63 6b 75 70 22 2c 20 6e 29 3d 3d 30   "backup", n)==0
27210 29 0a 20 20 20 7c 7c 20 28 63 3d 3d 27 73 27 20  ).   || (c=='s' 
27220 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63  && n>=3 && strnc
27230 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 61  mp(azArg[0], "sa
27240 76 65 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 29 7b  ve", n)==0).  ){
27250 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
27260 2a 7a 44 65 73 74 46 69 6c 65 20 3d 20 30 3b 0a  *zDestFile = 0;.
27270 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
27280 7a 44 62 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  zDb = 0;.    sql
27290 69 74 65 33 20 2a 70 44 65 73 74 3b 0a 20 20 20  ite3 *pDest;.   
272a0 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
272b0 2a 70 42 61 63 6b 75 70 3b 0a 20 20 20 20 69 6e  *pBackup;.    in
272c0 74 20 6a 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31  t j;.    for(j=1
272d0 3b 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 29 7b 0a  ; j<nArg; j++){.
272e0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
272f0 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a   *z = azArg[j];.
27300 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d        if( z[0]==
27310 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77  '-' ){.        w
27320 68 69 6c 65 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20  hile( z[0]=='-' 
27330 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 2f  ) z++;.        /
27340 2a 20 4e 6f 20 6f 70 74 69 6f 6e 73 20 74 6f 20  * No options to 
27350 70 72 6f 63 65 73 73 20 61 74 20 74 68 69 73 20  process at this 
27360 74 69 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  time */.        
27370 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
27380 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
27390 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a  "unknown option:
273a0 20 25 73 5c 6e 22 2c 20 61 7a 41 72 67 5b 6a 5d   %s\n", azArg[j]
273b0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
273c0 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
273d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
273e0 20 7a 44 65 73 74 46 69 6c 65 3d 3d 30 20 29 7b   zDestFile==0 ){
273f0 0a 20 20 20 20 20 20 20 20 7a 44 65 73 74 46 69  .        zDestFi
27400 6c 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20  le = azArg[j];. 
27410 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a       }else if( z
27420 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Db==0 ){.       
27430 20 7a 44 62 20 3d 20 7a 44 65 73 74 46 69 6c 65   zDb = zDestFile
27440 3b 0a 20 20 20 20 20 20 20 20 7a 44 65 73 74 46  ;.        zDestF
27450 69 6c 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a  ile = azArg[j];.
27460 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
27470 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
27480 73 74 64 65 72 72 2c 20 22 74 6f 6f 20 6d 61 6e  stderr, "too man
27490 79 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 2e  y arguments to .
274a0 62 61 63 6b 75 70 5c 6e 22 29 3b 0a 20 20 20 20  backup\n");.    
274b0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
274c0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
274d0 69 66 28 20 7a 44 65 73 74 46 69 6c 65 3d 3d 30  if( zDestFile==0
274e0 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
274f0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6d 69  intf(stderr, "mi
27500 73 73 69 6e 67 20 46 49 4c 45 4e 41 4d 45 20 61  ssing FILENAME a
27510 72 67 75 6d 65 6e 74 20 6f 6e 20 2e 62 61 63 6b  rgument on .back
27520 75 70 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65  up\n");.      re
27530 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
27540 20 20 69 66 28 20 7a 44 62 3d 3d 30 20 29 20 7a    if( zDb==0 ) z
27550 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20  Db = "main";.   
27560 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70   rc = sqlite3_op
27570 65 6e 28 7a 44 65 73 74 46 69 6c 65 2c 20 26 70  en(zDestFile, &p
27580 44 65 73 74 29 3b 0a 20 20 20 20 69 66 28 20 72  Dest);.    if( r
27590 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
275a0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
275b0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
275c0 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22  : cannot open \"
275d0 25 73 5c 22 5c 6e 22 2c 20 7a 44 65 73 74 46 69  %s\"\n", zDestFi
275e0 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  le);.      sqlit
275f0 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b  e3_close(pDest);
27600 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
27610 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f  .    }.    open_
27620 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 70 42  db(p, 0);.    pB
27630 61 63 6b 75 70 20 3d 20 73 71 6c 69 74 65 33 5f  ackup = sqlite3_
27640 62 61 63 6b 75 70 5f 69 6e 69 74 28 70 44 65 73  backup_init(pDes
27650 74 2c 20 22 6d 61 69 6e 22 2c 20 70 2d 3e 64 62  t, "main", p->db
27660 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20  , zDb);.    if( 
27670 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20  pBackup==0 ){.  
27680 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
27690 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
276a0 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  %s\n", sqlite3_e
276b0 72 72 6d 73 67 28 70 44 65 73 74 29 29 3b 0a 20  rrmsg(pDest));. 
276c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f       sqlite3_clo
276d0 73 65 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20  se(pDest);.     
276e0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
276f0 0a 20 20 20 20 77 68 69 6c 65 28 20 20 28 72 63  .    while(  (rc
27700 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75   = sqlite3_backu
27710 70 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31  p_step(pBackup,1
27720 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  00))==SQLITE_OK 
27730 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ){}.    sqlite3_
27740 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70 42  backup_finish(pB
27750 61 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28 20  ackup);.    if( 
27760 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
27770 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b  ){.      rc = 0;
27780 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
27790 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
277a0 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73  derr, "Error: %s
277b0 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
277c0 6d 73 67 28 70 44 65 73 74 29 29 3b 0a 20 20 20  msg(pDest));.   
277d0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
277e0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .    sqlite3_clo
277f0 73 65 28 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c  se(pDest);.  }el
27800 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 62 27  se..  if( c=='b'
27810 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
27820 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62  cmp(azArg[0], "b
27830 61 69 6c 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ail", n)==0 ){. 
27840 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
27850 7b 0a 20 20 20 20 20 20 62 61 69 6c 5f 6f 6e 5f  {.      bail_on_
27860 65 72 72 6f 72 20 3d 20 62 6f 6f 6c 65 61 6e 56  error = booleanV
27870 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a  alue(azArg[1]);.
27880 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27890 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
278a0 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 62 61 69  rr, "Usage: .bai
278b0 6c 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20  l on|off\n");.  
278c0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
278d0 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
278e0 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20   c=='b' && n>=3 
278f0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
27900 5b 30 5d 2c 20 22 62 69 6e 61 72 79 22 2c 20 6e  [0], "binary", n
27910 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
27920 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20  nArg==2 ){.     
27930 20 69 66 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75   if( booleanValu
27940 65 28 61 7a 41 72 67 5b 31 5d 29 20 29 7b 0a 20  e(azArg[1]) ){. 
27950 20 20 20 20 20 20 20 73 65 74 42 69 6e 61 72 79         setBinary
27960 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b  Mode(p->out, 1);
27970 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
27980 20 20 20 20 20 20 73 65 74 54 65 78 74 4d 6f 64        setTextMod
27990 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20  e(p->out, 1);.  
279a0 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
279b0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
279c0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
279d0 3a 20 2e 62 69 6e 61 72 79 20 6f 6e 7c 6f 66 66  : .binary on|off
279e0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
279f0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
27a00 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63 27 20  e..  if( c=='c' 
27a10 26 26 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b  && strcmp(azArg[
27a20 30 5d 2c 22 63 64 22 29 3d 3d 30 20 29 7b 0a 20  0],"cd")==0 ){. 
27a30 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
27a40 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  {.#if defined(_W
27a50 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  IN32) || defined
27a60 28 57 49 4e 33 32 29 0a 20 20 20 20 20 20 77 63  (WIN32).      wc
27a70 68 61 72 5f 74 20 2a 7a 20 3d 20 73 71 6c 69 74  har_t *z = sqlit
27a80 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f  e3_win32_utf8_to
27a90 5f 75 6e 69 63 6f 64 65 28 61 7a 41 72 67 5b 31  _unicode(azArg[1
27aa0 5d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 21  ]);.      rc = !
27ab0 53 65 74 43 75 72 72 65 6e 74 44 69 72 65 63 74  SetCurrentDirect
27ac0 6f 72 79 57 28 7a 29 3b 0a 20 20 20 20 20 20 73  oryW(z);.      s
27ad0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
27ae0 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d  #else.      rc =
27af0 20 63 68 64 69 72 28 61 7a 41 72 67 5b 31 5d 29   chdir(azArg[1])
27b00 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  ;.#endif.      i
27b10 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
27b20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
27b30 65 72 72 2c 20 22 43 61 6e 6e 6f 74 20 63 68 61  err, "Cannot cha
27b40 6e 67 65 20 74 6f 20 64 69 72 65 63 74 6f 72 79  nge to directory
27b50 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72   \"%s\"\n", azAr
27b60 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 72  g[1]);.        r
27b70 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  c = 1;.      }. 
27b80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
27b90 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
27ba0 72 2c 20 22 55 73 61 67 65 3a 20 2e 63 64 20 44  r, "Usage: .cd D
27bb0 49 52 45 43 54 4f 52 59 5c 6e 22 29 3b 0a 20 20  IRECTORY\n");.  
27bc0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
27bd0 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20  }.  }else..  /* 
27be0 54 68 65 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64  The undocumented
27bf0 20 22 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20 63   ".breakpoint" c
27c00 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20 61 20  ommand causes a 
27c10 63 61 6c 6c 20 74 6f 20 74 68 65 20 6e 6f 2d 6f  call to the no-o
27c20 70 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 6e  p.  ** routine n
27c30 61 6d 65 64 20 74 65 73 74 5f 62 72 65 61 6b 70  amed test_breakp
27c40 6f 69 6e 74 28 29 2e 0a 20 20 2a 2f 0a 20 20 69  oint()..  */.  i
27c50 66 28 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d  f( c=='b' && n>=
27c60 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  3 && strncmp(azA
27c70 72 67 5b 30 5d 2c 20 22 62 72 65 61 6b 70 6f 69  rg[0], "breakpoi
27c80 6e 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  nt", n)==0 ){.  
27c90 20 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e    test_breakpoin
27ca0 74 28 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  t();.  }else..  
27cb0 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20 6e 3e  if( c=='c' && n>
27cc0 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =3 && strncmp(az
27cd0 41 72 67 5b 30 5d 2c 20 22 63 68 61 6e 67 65 73  Arg[0], "changes
27ce0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
27cf0 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20  if( nArg==2 ){. 
27d00 20 20 20 20 20 73 65 74 4f 72 43 6c 65 61 72 46       setOrClearF
27d10 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 43 6f 75  lag(p, SHFLG_Cou
27d20 6e 74 43 68 61 6e 67 65 73 2c 20 61 7a 41 72 67  ntChanges, azArg
27d30 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  [1]);.    }else{
27d40 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
27d50 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
27d60 3a 20 2e 63 68 61 6e 67 65 73 20 6f 6e 7c 6f 66  : .changes on|of
27d70 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  f\n");.      rc 
27d80 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
27d90 73 65 0a 0a 20 20 2f 2a 20 43 61 6e 63 65 6c 20  se..  /* Cancel 
27da0 6f 75 74 70 75 74 20 72 65 64 69 72 65 63 74 69  output redirecti
27db0 6f 6e 2c 20 69 66 20 69 74 20 69 73 20 63 75 72  on, if it is cur
27dc0 72 65 6e 74 6c 79 20 73 65 74 20 28 62 79 20 2e  rently set (by .
27dd0 74 65 73 74 63 61 73 65 29 0a 20 20 2a 2a 20 54  testcase).  ** T
27de0 68 65 6e 20 72 65 61 64 20 74 68 65 20 63 6f 6e  hen read the con
27df0 74 65 6e 74 20 6f 66 20 74 68 65 20 74 65 73 74  tent of the test
27e00 63 61 73 65 2d 6f 75 74 2e 74 78 74 20 66 69 6c  case-out.txt fil
27e10 65 20 61 6e 64 20 63 6f 6d 70 61 72 65 20 61 67  e and compare ag
27e20 61 69 6e 73 74 0a 20 20 2a 2a 20 61 7a 41 72 67  ainst.  ** azArg
27e30 5b 31 5d 2e 20 20 49 66 20 74 68 65 72 65 20 61  [1].  If there a
27e40 72 65 20 64 69 66 66 65 72 65 6e 63 65 73 2c 20  re differences, 
27e50 72 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20  report an error 
27e60 61 6e 64 20 65 78 69 74 2e 0a 20 20 2a 2f 0a 20  and exit..  */. 
27e70 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20 6e   if( c=='c' && n
27e80 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
27e90 7a 41 72 67 5b 30 5d 2c 20 22 63 68 65 63 6b 22  zArg[0], "check"
27ea0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63  , n)==0 ){.    c
27eb0 68 61 72 20 2a 7a 52 65 73 20 3d 20 30 3b 0a 20  har *zRes = 0;. 
27ec0 20 20 20 6f 75 74 70 75 74 5f 72 65 73 65 74 28     output_reset(
27ed0 70 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67  p);.    if( nArg
27ee0 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77  !=2 ){.      raw
27ef0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
27f00 22 55 73 61 67 65 3a 20 2e 63 68 65 63 6b 20 47  "Usage: .check G
27f10 4c 4f 42 2d 50 41 54 54 45 52 4e 5c 6e 22 29 3b  LOB-PATTERN\n");
27f20 0a 20 20 20 20 20 20 72 63 20 3d 20 32 3b 0a 20  .      rc = 2;. 
27f30 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 7a 52     }else if( (zR
27f40 65 73 20 3d 20 72 65 61 64 46 69 6c 65 28 22 74  es = readFile("t
27f50 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 22  estcase-out.txt"
27f60 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 0))==0 ){.    
27f70 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
27f80 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  err, "Error: can
27f90 6e 6f 74 20 72 65 61 64 20 27 74 65 73 74 63 61  not read 'testca
27fa0 73 65 2d 6f 75 74 2e 74 78 74 27 5c 6e 22 29 3b  se-out.txt'\n");
27fb0 0a 20 20 20 20 20 20 72 63 20 3d 20 32 3b 0a 20  .      rc = 2;. 
27fc0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 74 65 73     }else if( tes
27fd0 74 63 61 73 65 5f 67 6c 6f 62 28 61 7a 41 72 67  tcase_glob(azArg
27fe0 5b 31 5d 2c 7a 52 65 73 29 3d 3d 30 20 29 7b 0a  [1],zRes)==0 ){.
27ff0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
28000 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20 20  f(stderr,.      
28010 20 20 20 20 20 20 20 20 20 20 20 22 74 65 73 74             "test
28020 63 61 73 65 2d 25 73 20 46 41 49 4c 45 44 5c 6e  case-%s FAILED\n
28030 20 45 78 70 65 63 74 65 64 3a 20 5b 25 73 5d 5c   Expected: [%s]\
28040 6e 20 20 20 20 20 20 47 6f 74 3a 20 5b 25 73 5d  n      Got: [%s]
28050 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
28060 20 20 20 20 20 20 70 2d 3e 7a 54 65 73 74 63 61        p->zTestca
28070 73 65 2c 20 61 7a 41 72 67 5b 31 5d 2c 20 7a 52  se, azArg[1], zR
28080 65 73 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  es);.      rc = 
28090 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
280a0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
280b0 73 74 64 6f 75 74 2c 20 22 74 65 73 74 63 61 73  stdout, "testcas
280c0 65 2d 25 73 20 6f 6b 5c 6e 22 2c 20 70 2d 3e 7a  e-%s ok\n", p->z
280d0 54 65 73 74 63 61 73 65 29 3b 0a 20 20 20 20 20  Testcase);.     
280e0 20 70 2d 3e 6e 43 68 65 63 6b 2b 2b 3b 0a 20 20   p->nCheck++;.  
280f0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
28100 66 72 65 65 28 7a 52 65 73 29 3b 0a 20 20 7d 65  free(zRes);.  }e
28110 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63  lse..  if( c=='c
28120 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
28130 72 67 5b 30 5d 2c 20 22 63 6c 6f 6e 65 22 2c 20  rg[0], "clone", 
28140 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  n)==0 ){.    if(
28150 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
28160 20 20 74 72 79 54 6f 43 6c 6f 6e 65 28 70 2c 20    tryToClone(p, 
28170 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d  azArg[1]);.    }
28180 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
28190 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
281a0 55 73 61 67 65 3a 20 2e 63 6c 6f 6e 65 20 46 49  Usage: .clone FI
281b0 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20 20 20  LENAME\n");.    
281c0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
281d0 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
281e0 3d 3d 27 64 27 20 26 26 20 6e 3e 31 20 26 26 20  =='d' && n>1 && 
281f0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
28200 2c 20 22 64 61 74 61 62 61 73 65 73 22 2c 20 6e  , "databases", n
28210 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65 6c  )==0 ){.    Shel
28220 6c 53 74 61 74 65 20 64 61 74 61 3b 0a 20 20 20  lState data;.   
28230 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
28240 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28   0;.    open_db(
28250 70 2c 20 30 29 3b 0a 20 20 20 20 6d 65 6d 63 70  p, 0);.    memcp
28260 79 28 26 64 61 74 61 2c 20 70 2c 20 73 69 7a 65  y(&data, p, size
28270 6f 66 28 64 61 74 61 29 29 3b 0a 20 20 20 20 64  of(data));.    d
28280 61 74 61 2e 73 68 6f 77 48 65 61 64 65 72 20 3d  ata.showHeader =
28290 20 30 3b 0a 20 20 20 20 64 61 74 61 2e 63 4d 6f   0;.    data.cMo
282a0 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d  de = data.mode =
282b0 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20   MODE_List;.    
282c0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
282d0 28 73 69 7a 65 6f 66 28 64 61 74 61 2e 63 6f 6c  (sizeof(data.col
282e0 53 65 70 61 72 61 74 6f 72 29 2c 64 61 74 61 2e  Separator),data.
282f0 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 22 3a 20  colSeparator,": 
28300 22 29 3b 0a 20 20 20 20 64 61 74 61 2e 63 6e 74  ");.    data.cnt
28310 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
28320 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53  3_exec(p->db, "S
28330 45 4c 45 43 54 20 6e 61 6d 65 2c 20 66 69 6c 65  ELECT name, file
28340 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 64 61 74   FROM pragma_dat
28350 61 62 61 73 65 5f 6c 69 73 74 22 2c 0a 20 20 20  abase_list",.   
28360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61                ca
28370 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26  llback, &data, &
28380 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66  zErrMsg);.    if
28390 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ( zErrMsg ){.   
283a0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
283b0 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73  tderr,"Error: %s
283c0 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  \n", zErrMsg);. 
283d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
283e0 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
283f0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
28400 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
28410 3d 3d 27 64 27 20 26 26 20 73 74 72 6e 63 6d 70  =='d' && strncmp
28420 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64 62 69 6e  (azArg[0], "dbin
28430 66 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  fo", n)==0 ){.  
28440 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f 64 62 69    rc = shell_dbi
28450 6e 66 6f 5f 63 6f 6d 6d 61 6e 64 28 70 2c 20 6e  nfo_command(p, n
28460 41 72 67 2c 20 61 7a 41 72 67 29 3b 0a 20 20 7d  Arg, azArg);.  }
28470 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
28480 64 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  d' && strncmp(az
28490 41 72 67 5b 30 5d 2c 20 22 64 75 6d 70 22 2c 20  Arg[0], "dump", 
284a0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e  n)==0 ){.    con
284b0 73 74 20 63 68 61 72 20 2a 7a 4c 69 6b 65 20 3d  st char *zLike =
284c0 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   0;.    int i;. 
284d0 20 20 20 69 6e 74 20 73 61 76 65 64 53 68 6f 77     int savedShow
284e0 48 65 61 64 65 72 20 3d 20 70 2d 3e 73 68 6f 77  Header = p->show
284f0 48 65 61 64 65 72 3b 0a 20 20 20 20 53 68 65 6c  Header;.    Shel
28500 6c 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 53 48  lClearFlag(p, SH
28510 46 4c 47 5f 50 72 65 73 65 72 76 65 52 6f 77 69  FLG_PreserveRowi
28520 64 7c 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73  d|SHFLG_Newlines
28530 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  );.    for(i=1; 
28540 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
28550 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b 69 5d      if( azArg[i]
28560 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20  [0]=='-' ){.    
28570 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
28580 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 2b 31 3b 0a  z = azArg[i]+1;.
28590 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d          if( z[0]
285a0 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20  =='-' ) z++;.   
285b0 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
285c0 7a 2c 22 70 72 65 73 65 72 76 65 2d 72 6f 77 69  z,"preserve-rowi
285d0 64 73 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65  ds")==0 ){.#ifde
285e0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
285f0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
28600 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
28610 73 74 64 65 72 72 2c 20 22 54 68 65 20 2d 2d 70  stderr, "The --p
28620 72 65 73 65 72 76 65 2d 72 6f 77 69 64 73 20 6f  reserve-rowids o
28630 70 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6d  ption is not com
28640 70 61 74 69 62 6c 65 22 0a 20 20 20 20 20 20 20  patible".       
28650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28660 20 20 20 20 20 20 22 20 77 69 74 68 20 53 51 4c        " with SQL
28670 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
28680 54 41 42 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20  TABLE\n");.     
28690 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
286a0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61         goto meta
286b0 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 23  _command_exit;.#
286c0 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 53  else.          S
286d0 68 65 6c 6c 53 65 74 46 6c 61 67 28 70 2c 20 53  hellSetFlag(p, S
286e0 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52 6f 77  HFLG_PreserveRow
286f0 69 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  id);.#endif.    
28700 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20      }else.      
28710 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22    if( strcmp(z,"
28720 6e 65 77 6c 69 6e 65 73 22 29 3d 3d 30 20 29 7b  newlines")==0 ){
28730 0a 20 20 20 20 20 20 20 20 20 20 53 68 65 6c 6c  .          Shell
28740 53 65 74 46 6c 61 67 28 70 2c 20 53 48 46 4c 47  SetFlag(p, SHFLG
28750 5f 4e 65 77 6c 69 6e 65 73 29 3b 0a 20 20 20 20  _Newlines);.    
28760 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20      }else.      
28770 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61    {.          ra
28780 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
28790 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e   "Unknown option
287a0 20 5c 22 25 73 5c 22 20 6f 6e 20 5c 22 2e 64 75   \"%s\" on \".du
287b0 6d 70 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 69  mp\"\n", azArg[i
287c0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ]);.          rc
287d0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
287e0 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
287f0 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  d_exit;.        
28800 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
28810 28 20 7a 4c 69 6b 65 20 29 7b 0a 20 20 20 20 20  ( zLike ){.     
28820 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
28830 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 64  derr, "Usage: .d
28840 75 6d 70 20 3f 2d 2d 70 72 65 73 65 72 76 65 2d  ump ?--preserve-
28850 72 6f 77 69 64 73 3f 20 22 0a 20 20 20 20 20 20  rowids? ".      
28860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28870 20 20 20 20 20 22 3f 2d 2d 6e 65 77 6c 69 6e 65       "?--newline
28880 73 3f 20 3f 4c 49 4b 45 2d 50 41 54 54 45 52 4e  s? ?LIKE-PATTERN
28890 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72  ?\n");.        r
288a0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67  c = 1;.        g
288b0 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
288c0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 65 6c  _exit;.      }el
288d0 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6b  se{.        zLik
288e0 65 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20  e = azArg[i];.  
288f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
28900 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
28910 20 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69     /* When playi
28920 6e 67 20 62 61 63 6b 20 61 20 22 64 75 6d 70 22  ng back a "dump"
28930 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6d 69  , the content mi
28940 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 61 6e  ght appear in an
28950 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 77 68   order.    ** wh
28960 69 63 68 20 63 61 75 73 65 73 20 69 6d 6d 65 64  ich causes immed
28970 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79  iate foreign key
28980 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
28990 62 65 20 76 69 6f 6c 61 74 65 64 2e 0a 20 20 20  be violated..   
289a0 20 2a 2a 20 53 6f 20 64 69 73 61 62 6c 65 20 66   ** So disable f
289b0 6f 72 65 69 67 6e 2d 6b 65 79 20 63 6f 6e 73 74  oreign-key const
289c0 72 61 69 6e 74 20 65 6e 66 6f 72 63 65 6d 65 6e  raint enforcemen
289d0 74 20 74 6f 20 70 72 65 76 65 6e 74 20 70 72 6f  t to prevent pro
289e0 62 6c 65 6d 73 2e 20 2a 2f 0a 20 20 20 20 72 61  blems. */.    ra
289f0 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
28a00 20 22 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e   "PRAGMA foreign
28a10 5f 6b 65 79 73 3d 4f 46 46 3b 5c 6e 22 29 3b 0a  _keys=OFF;\n");.
28a20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
28a30 2d 3e 6f 75 74 2c 20 22 42 45 47 49 4e 20 54 52  ->out, "BEGIN TR
28a40 41 4e 53 41 43 54 49 4f 4e 3b 5c 6e 22 29 3b 0a  ANSACTION;\n");.
28a50 20 20 20 20 70 2d 3e 77 72 69 74 61 62 6c 65 53      p->writableS
28a60 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 70  chema = 0;.    p
28a70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30  ->showHeader = 0
28a80 3b 0a 20 20 20 20 2f 2a 20 53 65 74 20 77 72 69  ;.    /* Set wri
28a90 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 20  table_schema=ON 
28aa0 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 66  since doing so f
28ab0 6f 72 63 65 73 20 53 51 4c 69 74 65 20 74 6f 20  orces SQLite to 
28ac0 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 20 20 2a  initialize.    *
28ad0 2a 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 65  * as much of the
28ae0 20 73 63 68 65 6d 61 20 61 73 20 69 74 20 63 61   schema as it ca
28af0 6e 20 65 76 65 6e 20 69 66 20 74 68 65 20 73 71  n even if the sq
28b00 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
28b10 65 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 72 72  e is.    ** corr
28b20 75 70 74 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  upt. */.    sqli
28b30 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
28b40 22 53 41 56 45 50 4f 49 4e 54 20 64 75 6d 70 3b  "SAVEPOINT dump;
28b50 20 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65   PRAGMA writable
28b60 5f 73 63 68 65 6d 61 3d 4f 4e 22 2c 20 30 2c 20  _schema=ON", 0, 
28b70 30 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 6e 45  0, 0);.    p->nE
28b80 72 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  rr = 0;.    if( 
28b90 7a 4c 69 6b 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zLike==0 ){.    
28ba0 20 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d    run_schema_dum
28bb0 70 5f 71 75 65 72 79 28 70 2c 0a 20 20 20 20 20  p_query(p,.     
28bc0 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c     "SELECT name,
28bd0 20 74 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20   type, sql FROM 
28be0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a  sqlite_master ".
28bf0 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20 73          "WHERE s
28c00 71 6c 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20  ql NOT NULL AND 
28c10 74 79 70 65 3d 3d 27 74 61 62 6c 65 27 20 41 4e  type=='table' AN
28c20 44 20 6e 61 6d 65 21 3d 27 73 71 6c 69 74 65 5f  D name!='sqlite_
28c30 73 65 71 75 65 6e 63 65 27 22 0a 20 20 20 20 20  sequence'".     
28c40 20 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 73 63   );.      run_sc
28c50 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28  hema_dump_query(
28c60 70 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45  p,.        "SELE
28c70 43 54 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73  CT name, type, s
28c80 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  ql FROM sqlite_m
28c90 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20  aster ".        
28ca0 22 57 48 45 52 45 20 6e 61 6d 65 3d 3d 27 73 71  "WHERE name=='sq
28cb0 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 27 22 0a  lite_sequence'".
28cc0 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72        );.      r
28cd0 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75  un_table_dump_qu
28ce0 65 72 79 28 70 2c 0a 20 20 20 20 20 20 20 20 22  ery(p,.        "
28cf0 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20  SELECT sql FROM 
28d00 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a  sqlite_master ".
28d10 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20 73          "WHERE s
28d20 71 6c 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20  ql NOT NULL AND 
28d30 74 79 70 65 20 49 4e 20 28 27 69 6e 64 65 78 27  type IN ('index'
28d40 2c 27 74 72 69 67 67 65 72 27 2c 27 76 69 65 77  ,'trigger','view
28d50 27 29 22 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a  ')", 0.      );.
28d60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28d70 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20   char *zSql;.   
28d80 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
28d90 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
28da0 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c     "SELECT name,
28db0 20 74 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20   type, sql FROM 
28dc0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a  sqlite_master ".
28dd0 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20 74          "WHERE t
28de0 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 25 51 20  bl_name LIKE %Q 
28df0 41 4e 44 20 74 79 70 65 3d 3d 27 74 61 62 6c 65  AND type=='table
28e00 27 22 0a 20 20 20 20 20 20 20 20 22 20 20 41 4e  '".        "  AN
28e10 44 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22 2c  D sql NOT NULL",
28e20 20 7a 4c 69 6b 65 29 3b 0a 20 20 20 20 20 20 72   zLike);.      r
28e30 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71  un_schema_dump_q
28e40 75 65 72 79 28 70 2c 7a 53 71 6c 29 3b 0a 20 20  uery(p,zSql);.  
28e50 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
28e60 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 7a 53  (zSql);.      zS
28e70 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
28e80 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 53  intf(.        "S
28e90 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73  ELECT sql FROM s
28ea0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20  qlite_master ". 
28eb0 20 20 20 20 20 20 20 22 57 48 45 52 45 20 73 71         "WHERE sq
28ec0 6c 20 4e 4f 54 20 4e 55 4c 4c 22 0a 20 20 20 20  l NOT NULL".    
28ed0 20 20 20 20 22 20 20 41 4e 44 20 74 79 70 65 20      "  AND type 
28ee0 49 4e 20 28 27 69 6e 64 65 78 27 2c 27 74 72 69  IN ('index','tri
28ef0 67 67 65 72 27 2c 27 76 69 65 77 27 29 22 0a 20  gger','view')". 
28f00 20 20 20 20 20 20 20 22 20 20 41 4e 44 20 74 62         "  AND tb
28f10 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 25 51 22 2c  l_name LIKE %Q",
28f20 20 7a 4c 69 6b 65 29 3b 0a 20 20 20 20 20 20 72   zLike);.      r
28f30 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75  un_table_dump_qu
28f40 65 72 79 28 70 2c 20 7a 53 71 6c 2c 20 30 29 3b  ery(p, zSql, 0);
28f50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
28f60 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d  ree(zSql);.    }
28f70 0a 20 20 20 20 69 66 28 20 70 2d 3e 77 72 69 74  .    if( p->writ
28f80 61 62 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20 20  ableSchema ){.  
28f90 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
28fa0 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 77  ->out, "PRAGMA w
28fb0 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f  ritable_schema=O
28fc0 46 46 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 70  FF;\n");.      p
28fd0 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61  ->writableSchema
28fe0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
28ff0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
29000 64 62 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74  db, "PRAGMA writ
29010 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b  able_schema=OFF;
29020 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ", 0, 0, 0);.   
29030 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
29040 3e 64 62 2c 20 22 52 45 4c 45 41 53 45 20 64 75  >db, "RELEASE du
29050 6d 70 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  mp;", 0, 0, 0);.
29060 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
29070 2d 3e 6f 75 74 2c 20 70 2d 3e 6e 45 72 72 20 3f  ->out, p->nErr ?
29080 20 22 52 4f 4c 4c 42 41 43 4b 3b 20 2d 2d 20 64   "ROLLBACK; -- d
29090 75 65 20 74 6f 20 65 72 72 6f 72 73 5c 6e 22 20  ue to errors\n" 
290a0 3a 20 22 43 4f 4d 4d 49 54 3b 5c 6e 22 29 3b 0a  : "COMMIT;\n");.
290b0 20 20 20 20 70 2d 3e 73 68 6f 77 48 65 61 64 65      p->showHeade
290c0 72 20 3d 20 73 61 76 65 64 53 68 6f 77 48 65 61  r = savedShowHea
290d0 64 65 72 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  der;.  }else..  
290e0 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74  if( c=='e' && st
290f0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
29100 22 65 63 68 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b  "echo", n)==0 ){
29110 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32  .    if( nArg==2
29120 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4f 72 43   ){.      setOrC
29130 6c 65 61 72 46 6c 61 67 28 70 2c 20 53 48 46 4c  learFlag(p, SHFL
29140 47 5f 45 63 68 6f 2c 20 61 7a 41 72 67 5b 31 5d  G_Echo, azArg[1]
29150 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
29160 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
29170 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
29180 65 63 68 6f 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b  echo on|off\n");
29190 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
291a0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
291b0 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74  if( c=='e' && st
291c0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
291d0 22 65 71 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  "eqp", n)==0 ){.
291e0 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
291f0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
29200 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 66 75  cmp(azArg[1],"fu
29210 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ll")==0 ){.     
29220 20 20 20 70 2d 3e 61 75 74 6f 45 51 50 20 3d 20     p->autoEQP = 
29230 41 55 54 4f 45 51 50 5f 66 75 6c 6c 3b 0a 20 20  AUTOEQP_full;.  
29240 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
29250 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74  rcmp(azArg[1],"t
29260 72 69 67 67 65 72 22 29 3d 3d 30 20 29 7b 0a 20  rigger")==0 ){. 
29270 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51         p->autoEQ
29280 50 20 3d 20 41 55 54 4f 45 51 50 5f 74 72 69 67  P = AUTOEQP_trig
29290 67 65 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ger;.      }else
292a0 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 75 74  {.        p->aut
292b0 6f 45 51 50 20 3d 20 62 6f 6f 6c 65 61 6e 56 61  oEQP = booleanVa
292c0 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  lue(azArg[1]);. 
292d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
292e0 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
292f0 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
29300 65 3a 20 2e 65 71 70 20 6f 66 66 7c 6f 6e 7c 74  e: .eqp off|on|t
29310 72 69 67 67 65 72 7c 66 75 6c 6c 5c 6e 22 29 3b  rigger|full\n");
29320 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
29330 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
29340 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74  if( c=='e' && st
29350 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
29360 22 65 78 69 74 22 2c 20 6e 29 3d 3d 30 20 29 7b  "exit", n)==0 ){
29370 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 31 20  .    if( nArg>1 
29380 26 26 20 28 72 63 20 3d 20 28 69 6e 74 29 69 6e  && (rc = (int)in
29390 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67  tegerValue(azArg
293a0 5b 31 5d 29 29 21 3d 30 20 29 20 65 78 69 74 28  [1]))!=0 ) exit(
293b0 72 63 29 3b 0a 20 20 20 20 72 63 20 3d 20 32 3b  rc);.    rc = 2;
293c0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 54  .  }else..  /* T
293d0 68 65 20 22 2e 65 78 70 6c 61 69 6e 22 20 63 6f  he ".explain" co
293e0 6d 6d 61 6e 64 20 69 73 20 61 75 74 6f 6d 61 74  mmand is automat
293f0 69 63 20 6e 6f 77 2e 20 20 49 74 20 69 73 20 6c  ic now.  It is l
29400 61 72 67 65 6c 79 20 70 6f 69 6e 74 6c 65 73 73  argely pointless
29410 2e 20 20 49 74 0a 20 20 2a 2a 20 72 65 74 61 69  .  It.  ** retai
29420 6e 65 64 20 70 75 72 65 6c 79 20 66 6f 72 20 62  ned purely for b
29430 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
29440 62 69 6c 69 74 79 20 2a 2f 0a 20 20 69 66 28 20  bility */.  if( 
29450 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d  c=='e' && strncm
29460 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78 70  p(azArg[0], "exp
29470 6c 61 69 6e 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  lain", n)==0 ){.
29480 20 20 20 20 69 6e 74 20 76 61 6c 20 3d 20 31 3b      int val = 1;
29490 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 3d 32  .    if( nArg>=2
294a0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74   ){.      if( st
294b0 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 61  rcmp(azArg[1],"a
294c0 75 74 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  uto")==0 ){.    
294d0 20 20 20 20 76 61 6c 20 3d 20 39 39 3b 0a 20 20      val = 99;.  
294e0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
294f0 20 20 20 76 61 6c 20 3d 20 20 62 6f 6f 6c 65 61     val =  boolea
29500 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29  nValue(azArg[1])
29510 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
29520 20 20 20 20 69 66 28 20 76 61 6c 3d 3d 31 20 26      if( val==1 &
29530 26 20 70 2d 3e 6d 6f 64 65 21 3d 4d 4f 44 45 5f  & p->mode!=MODE_
29540 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20  Explain ){.     
29550 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 20 3d   p->normalMode =
29560 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20   p->mode;.      
29570 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45  p->mode = MODE_E
29580 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 70 2d  xplain;.      p-
29590 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20 3d 20 30  >autoExplain = 0
295a0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
295b0 76 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  val==0 ){.      
295c0 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44  if( p->mode==MOD
295d0 45 5f 45 78 70 6c 61 69 6e 20 29 20 70 2d 3e 6d  E_Explain ) p->m
295e0 6f 64 65 20 3d 20 70 2d 3e 6e 6f 72 6d 61 6c 4d  ode = p->normalM
295f0 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e 61 75  ode;.      p->au
29600 74 6f 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a 20  toExplain = 0;. 
29610 20 20 20 7d 65 6c 73 65 20 69 66 28 20 76 61 6c     }else if( val
29620 3d 3d 39 39 20 29 7b 0a 20 20 20 20 20 20 69 66  ==99 ){.      if
29630 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f  ( p->mode==MODE_
29640 45 78 70 6c 61 69 6e 20 29 20 70 2d 3e 6d 6f 64  Explain ) p->mod
29650 65 20 3d 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64  e = p->normalMod
29660 65 3b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f  e;.      p->auto
29670 45 78 70 6c 61 69 6e 20 3d 20 31 3b 0a 20 20 20  Explain = 1;.   
29680 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
29690 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e  ( c=='e' && strn
296a0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65  cmp(azArg[0], "e
296b0 78 70 65 72 74 22 2c 20 6e 29 3d 3d 30 20 29 7b  xpert", n)==0 ){
296c0 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
296d0 30 29 3b 0a 20 20 20 20 65 78 70 65 72 74 44 6f  0);.    expertDo
296e0 74 43 6f 6d 6d 61 6e 64 28 70 2c 20 61 7a 41 72  tCommand(p, azAr
296f0 67 2c 20 6e 41 72 67 29 3b 0a 20 20 7d 65 6c 73  g, nArg);.  }els
29700 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 66 27 20  e..  if( c=='f' 
29710 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
29720 5b 30 5d 2c 20 22 66 75 6c 6c 73 63 68 65 6d 61  [0], "fullschema
29730 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
29740 53 68 65 6c 6c 53 74 61 74 65 20 64 61 74 61 3b  ShellState data;
29750 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  .    char *zErrM
29760 73 67 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  sg = 0;.    int 
29770 64 6f 53 74 61 74 73 20 3d 20 30 3b 0a 20 20 20  doStats = 0;.   
29780 20 6d 65 6d 63 70 79 28 26 64 61 74 61 2c 20 70   memcpy(&data, p
29790 2c 20 73 69 7a 65 6f 66 28 64 61 74 61 29 29 3b  , sizeof(data));
297a0 0a 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65  .    data.showHe
297b0 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 64 61  ader = 0;.    da
297c0 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e  ta.cMode = data.
297d0 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 53 65 6d 69  mode = MODE_Semi
297e0 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  ;.    if( nArg==
297f0 32 20 26 26 20 6f 70 74 69 6f 6e 4d 61 74 63 68  2 && optionMatch
29800 28 61 7a 41 72 67 5b 31 5d 2c 20 22 69 6e 64 65  (azArg[1], "inde
29810 6e 74 22 29 20 29 7b 0a 20 20 20 20 20 20 64 61  nt") ){.      da
29820 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e  ta.cMode = data.
29830 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 50 72 65 74  mode = MODE_Pret
29840 74 79 3b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d  ty;.      nArg =
29850 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
29860 28 20 6e 41 72 67 21 3d 31 20 29 7b 0a 20 20 20  ( nArg!=1 ){.   
29870 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
29880 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 66  derr, "Usage: .f
29890 75 6c 6c 73 63 68 65 6d 61 20 3f 2d 2d 69 6e 64  ullschema ?--ind
298a0 65 6e 74 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ent?\n");.      
298b0 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f  rc = 1;.      go
298c0 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
298d0 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  exit;.    }.    
298e0 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
298f0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
29900 65 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20  exec(p->db,.    
29910 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46     "SELECT sql F
29920 52 4f 4d 22 0a 20 20 20 20 20 20 20 22 20 20 28  ROM".       "  (
29930 53 45 4c 45 43 54 20 73 71 6c 20 73 71 6c 2c 20  SELECT sql sql, 
29940 74 79 70 65 20 74 79 70 65 2c 20 74 62 6c 5f 6e  type type, tbl_n
29950 61 6d 65 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61  ame tbl_name, na
29960 6d 65 20 6e 61 6d 65 2c 20 72 6f 77 69 64 20 78  me name, rowid x
29970 22 0a 20 20 20 20 20 20 20 22 20 20 20 20 20 46  ".       "     F
29980 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
29990 72 20 55 4e 49 4f 4e 20 41 4c 4c 22 0a 20 20 20  r UNION ALL".   
299a0 20 20 20 20 22 20 20 20 53 45 4c 45 43 54 20 73      "   SELECT s
299b0 71 6c 2c 20 74 79 70 65 2c 20 74 62 6c 5f 6e 61  ql, type, tbl_na
299c0 6d 65 2c 20 6e 61 6d 65 2c 20 72 6f 77 69 64 20  me, name, rowid 
299d0 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d 70  FROM sqlite_temp
299e0 5f 6d 61 73 74 65 72 29 20 22 0a 20 20 20 20 20  _master) ".     
299f0 20 20 22 57 48 45 52 45 20 74 79 70 65 21 3d 27    "WHERE type!='
29a00 6d 65 74 61 27 20 41 4e 44 20 73 71 6c 20 4e 4f  meta' AND sql NO
29a10 54 4e 55 4c 4c 20 41 4e 44 20 6e 61 6d 65 20 4e  TNULL AND name N
29a20 4f 54 20 4c 49 4b 45 20 27 73 71 6c 69 74 65 5f  OT LIKE 'sqlite_
29a30 25 27 20 22 0a 20 20 20 20 20 20 20 22 4f 52 44  %' ".       "ORD
29a40 45 52 20 42 59 20 72 6f 77 69 64 22 2c 0a 20 20  ER BY rowid",.  
29a50 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26       callback, &
29a60 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 0a 20  data, &zErrMsg. 
29a70 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63     );.    if( rc
29a80 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
29a90 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
29aa0 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 20 20  t *pStmt;.      
29ab0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
29ac0 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 0a 20  pare_v2(p->db,. 
29ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
29ae0 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d  ELECT rowid FROM
29af0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a   sqlite_master".
29b00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
29b10 20 57 48 45 52 45 20 6e 61 6d 65 20 47 4c 4f 42   WHERE name GLOB
29b20 20 27 73 71 6c 69 74 65 5f 73 74 61 74 5b 31 33   'sqlite_stat[13
29b30 34 5d 27 22 2c 0a 20 20 20 20 20 20 20 20 20 20  4]'",.          
29b40 20 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c       -1, &pStmt,
29b50 20 30 29 3b 0a 20 20 20 20 20 20 64 6f 53 74 61   0);.      doSta
29b60 74 73 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  ts = sqlite3_ste
29b70 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
29b80 5f 52 4f 57 3b 0a 20 20 20 20 20 20 73 71 6c 69  _ROW;.      sqli
29b90 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
29ba0 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  mt);.    }.    i
29bb0 66 28 20 64 6f 53 74 61 74 73 3d 3d 30 20 29 7b  f( doStats==0 ){
29bc0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
29bd0 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 20 4e 6f  f(p->out, "/* No
29be0 20 53 54 41 54 20 74 61 62 6c 65 73 20 61 76 61   STAT tables ava
29bf0 69 6c 61 62 6c 65 20 2a 2f 5c 6e 22 29 3b 0a 20  ilable */\n");. 
29c00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29c10 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
29c20 74 2c 20 22 41 4e 41 4c 59 5a 45 20 73 71 6c 69  t, "ANALYZE sqli
29c30 74 65 5f 6d 61 73 74 65 72 3b 5c 6e 22 29 3b 0a  te_master;\n");.
29c40 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78        sqlite3_ex
29c50 65 63 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43  ec(p->db, "SELEC
29c60 54 20 27 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74  T 'ANALYZE sqlit
29c70 65 5f 6d 61 73 74 65 72 27 22 2c 0a 20 20 20 20  e_master'",.    
29c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
29c90 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20  allback, &data, 
29ca0 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  &zErrMsg);.     
29cb0 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61   data.cMode = da
29cc0 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 49  ta.mode = MODE_I
29cd0 6e 73 65 72 74 3b 0a 20 20 20 20 20 20 64 61 74  nsert;.      dat
29ce0 61 2e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 22  a.zDestTable = "
29cf0 73 71 6c 69 74 65 5f 73 74 61 74 31 22 3b 0a 20  sqlite_stat1";. 
29d00 20 20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28       shell_exec(
29d10 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20 2a  p->db, "SELECT *
29d20 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61   FROM sqlite_sta
29d30 74 31 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  t1",.           
29d40 20 20 20 20 20 20 73 68 65 6c 6c 5f 63 61 6c 6c        shell_call
29d50 62 61 63 6b 2c 20 26 64 61 74 61 2c 26 7a 45 72  back, &data,&zEr
29d60 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 64 61 74  rMsg);.      dat
29d70 61 2e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 22  a.zDestTable = "
29d80 73 71 6c 69 74 65 5f 73 74 61 74 33 22 3b 0a 20  sqlite_stat3";. 
29d90 20 20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28       shell_exec(
29da0 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20 2a  p->db, "SELECT *
29db0 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61   FROM sqlite_sta
29dc0 74 33 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  t3",.           
29dd0 20 20 20 20 20 20 73 68 65 6c 6c 5f 63 61 6c 6c        shell_call
29de0 62 61 63 6b 2c 20 26 64 61 74 61 2c 26 7a 45 72  back, &data,&zEr
29df0 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 64 61 74  rMsg);.      dat
29e00 61 2e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 22  a.zDestTable = "
29e10 73 71 6c 69 74 65 5f 73 74 61 74 34 22 3b 0a 20  sqlite_stat4";. 
29e20 20 20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28       shell_exec(
29e30 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20 2a  p->db, "SELECT *
29e40 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61   FROM sqlite_sta
29e50 74 34 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  t4",.           
29e60 20 20 20 20 20 20 73 68 65 6c 6c 5f 63 61 6c 6c        shell_call
29e70 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45  back, &data, &zE
29e80 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 61  rrMsg);.      ra
29e90 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
29ea0 20 22 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65   "ANALYZE sqlite
29eb0 5f 6d 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20 20  _master;\n");.  
29ec0 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
29ed0 66 28 20 63 3d 3d 27 68 27 20 26 26 20 73 74 72  f( c=='h' && str
29ee0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
29ef0 68 65 61 64 65 72 73 22 2c 20 6e 29 3d 3d 30 20  headers", n)==0 
29f00 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  ){.    if( nArg=
29f10 3d 32 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73  =2 ){.      p->s
29f20 68 6f 77 48 65 61 64 65 72 20 3d 20 62 6f 6f 6c  howHeader = bool
29f30 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31  eanValue(azArg[1
29f40 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
29f50 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
29f60 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
29f70 2e 68 65 61 64 65 72 73 20 6f 6e 7c 6f 66 66 5c  .headers on|off\
29f80 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
29f90 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
29fa0 0a 0a 20 20 69 66 28 20 63 3d 3d 27 68 27 20 26  ..  if( c=='h' &
29fb0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
29fc0 30 5d 2c 20 22 68 65 6c 70 22 2c 20 6e 29 3d 3d  0], "help", n)==
29fd0 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  0 ){.    utf8_pr
29fe0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
29ff0 22 2c 20 7a 48 65 6c 70 29 3b 0a 20 20 7d 65 6c  ", zHelp);.  }el
2a000 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 69 27  se..  if( c=='i'
2a010 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2a020 67 5b 30 5d 2c 20 22 69 6d 70 6f 72 74 22 2c 20  g[0], "import", 
2a030 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61  n)==0 ){.    cha
2a040 72 20 2a 7a 54 61 62 6c 65 3b 20 20 20 20 20 20  r *zTable;      
2a050 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65           /* Inse
2a060 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 69  rt data into thi
2a070 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63  s table */.    c
2a080 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20  har *zFile;     
2a090 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
2a0a0 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 65 78  me of file to ex
2a0b0 74 72 61 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  tra content from
2a0c0 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
2a0d0 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 4e 55  stmt *pStmt = NU
2a0e0 4c 4c 3b 20 2f 2a 20 41 20 73 74 61 74 65 6d 65  LL; /* A stateme
2a0f0 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43  nt */.    int nC
2a100 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
2a110 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
2a120 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
2a130 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69  e table */.    i
2a140 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
2a150 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
2a160 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
2a170 20 61 6e 20 53 51 4c 20 73 74 72 69 6e 67 20 2a   an SQL string *
2a180 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20  /.    int i, j; 
2a190 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a1a0 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
2a1b0 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65  rs */.    int ne
2a1c0 65 64 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20  edCommit;       
2a1d0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
2a1e0 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42   COMMIT or ROLLB
2a1f0 41 43 4b 20 61 74 20 65 6e 64 20 2a 2f 0a 20 20  ACK at end */.  
2a200 20 20 69 6e 74 20 6e 53 65 70 3b 20 20 20 20 20    int nSep;     
2a210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
2a220 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
2a230 20 69 6e 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61   in p->colSepara
2a240 74 6f 72 5b 5d 20 2a 2f 0a 20 20 20 20 63 68 61  tor[] */.    cha
2a250 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20  r *zSql;        
2a260 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 53           /* An S
2a270 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  QL statement */.
2a280 20 20 20 20 49 6d 70 6f 72 74 43 74 78 20 73 43      ImportCtx sC
2a290 74 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  tx;             
2a2a0 2f 2a 20 52 65 61 64 65 72 20 63 6f 6e 74 65 78  /* Reader contex
2a2b0 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 28  t */.    char *(
2a2c0 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 2a 78 52  SQLITE_CDECL *xR
2a2d0 65 61 64 29 28 49 6d 70 6f 72 74 43 74 78 2a 29  ead)(ImportCtx*)
2a2e0 3b 20 2f 2a 20 46 75 6e 63 20 74 6f 20 72 65 61  ; /* Func to rea
2a2f0 64 20 6f 6e 65 20 76 61 6c 75 65 20 2a 2f 0a 20  d one value */. 
2a300 20 20 20 69 6e 74 20 28 53 51 4c 49 54 45 5f 43     int (SQLITE_C
2a310 44 45 43 4c 20 2a 78 43 6c 6f 73 65 72 29 28 46  DECL *xCloser)(F
2a320 49 4c 45 2a 29 3b 20 20 20 20 20 20 2f 2a 20 46  ILE*);      /* F
2a330 75 6e 63 20 74 6f 20 63 6c 6f 73 65 20 66 69 6c  unc to close fil
2a340 65 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 6e 41  e */..    if( nA
2a350 72 67 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 72  rg!=3 ){.      r
2a360 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
2a370 2c 20 22 55 73 61 67 65 3a 20 2e 69 6d 70 6f 72  , "Usage: .impor
2a380 74 20 46 49 4c 45 20 54 41 42 4c 45 5c 6e 22 29  t FILE TABLE\n")
2a390 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74  ;.      goto met
2a3a0 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
2a3b0 20 20 20 20 7d 0a 20 20 20 20 7a 46 69 6c 65 20      }.    zFile 
2a3c0 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20  = azArg[1];.    
2a3d0 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72 67 5b 32  zTable = azArg[2
2a3e0 5d 3b 0a 20 20 20 20 73 65 65 6e 49 6e 74 65 72  ];.    seenInter
2a3f0 72 75 70 74 20 3d 20 30 3b 0a 20 20 20 20 6d 65  rupt = 0;.    me
2a400 6d 73 65 74 28 26 73 43 74 78 2c 20 30 2c 20 73  mset(&sCtx, 0, s
2a410 69 7a 65 6f 66 28 73 43 74 78 29 29 3b 0a 20 20  izeof(sCtx));.  
2a420 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
2a430 0a 20 20 20 20 6e 53 65 70 20 3d 20 73 74 72 6c  .    nSep = strl
2a440 65 6e 33 30 28 70 2d 3e 63 6f 6c 53 65 70 61 72  en30(p->colSepar
2a450 61 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 6e  ator);.    if( n
2a460 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sep==0 ){.      
2a470 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2a480 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
2a490 20 20 20 20 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d      "Error: non-
2a4a0 6e 75 6c 6c 20 63 6f 6c 75 6d 6e 20 73 65 70 61  null column sepa
2a4b0 72 61 74 6f 72 20 72 65 71 75 69 72 65 64 20 66  rator required f
2a4c0 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20  or import\n");. 
2a4d0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2a4e0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 53 65     }.    if( nSe
2a4f0 70 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 61 77  p>1 ){.      raw
2a500 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2a510 22 45 72 72 6f 72 3a 20 6d 75 6c 74 69 2d 63 68  "Error: multi-ch
2a520 61 72 61 63 74 65 72 20 63 6f 6c 75 6d 6e 20 73  aracter column s
2a530 65 70 61 72 61 74 6f 72 73 20 6e 6f 74 20 61 6c  eparators not al
2a540 6c 6f 77 65 64 22 0a 20 20 20 20 20 20 20 20 20  lowed".         
2a550 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 66               " f
2a560 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20  or import\n");. 
2a570 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2a580 20 20 20 7d 0a 20 20 20 20 6e 53 65 70 20 3d 20     }.    nSep = 
2a590 73 74 72 6c 65 6e 33 30 28 70 2d 3e 72 6f 77 53  strlen30(p->rowS
2a5a0 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 69  eparator);.    i
2a5b0 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20  f( nSep==0 ){.  
2a5c0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2a5d0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6e  tderr, "Error: n
2a5e0 6f 6e 2d 6e 75 6c 6c 20 72 6f 77 20 73 65 70 61  on-null row sepa
2a5f0 72 61 74 6f 72 20 72 65 71 75 69 72 65 64 20 66  rator required f
2a600 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20  or import\n");. 
2a610 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2a620 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 53 65     }.    if( nSe
2a630 70 3d 3d 32 20 26 26 20 70 2d 3e 6d 6f 64 65 3d  p==2 && p->mode=
2a640 3d 4d 4f 44 45 5f 43 73 76 20 26 26 20 73 74 72  =MODE_Csv && str
2a650 63 6d 70 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  cmp(p->rowSepara
2a660 74 6f 72 2c 20 53 45 50 5f 43 72 4c 66 29 3d 3d  tor, SEP_CrLf)==
2a670 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 68  0 ){.      /* Wh
2a680 65 6e 20 69 6d 70 6f 72 74 69 6e 67 20 43 53 56  en importing CSV
2a690 20 28 6f 6e 6c 79 29 2c 20 69 66 20 74 68 65 20   (only), if the 
2a6a0 72 6f 77 20 73 65 70 61 72 61 74 6f 72 20 69 73  row separator is
2a6b0 20 73 65 74 20 74 6f 20 74 68 65 0a 20 20 20 20   set to the.    
2a6c0 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 6f 75 74    ** default out
2a6d0 70 75 74 20 72 6f 77 20 73 65 70 61 72 61 74 6f  put row separato
2a6e0 72 2c 20 63 68 61 6e 67 65 20 69 74 20 74 6f 20  r, change it to 
2a6f0 74 68 65 20 64 65 66 61 75 6c 74 20 69 6e 70 75  the default inpu
2a700 74 0a 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 73  t.      ** row s
2a710 65 70 61 72 61 74 6f 72 2e 20 20 54 68 69 73 20  eparator.  This 
2a720 61 76 6f 69 64 73 20 68 61 76 69 6e 67 20 74 6f  avoids having to
2a730 20 6d 61 69 6e 74 61 69 6e 20 64 69 66 66 65 72   maintain differ
2a740 65 6e 74 20 69 6e 70 75 74 0a 20 20 20 20 20 20  ent input.      
2a750 2a 2a 20 61 6e 64 20 6f 75 74 70 75 74 20 72 6f  ** and output ro
2a760 77 20 73 65 70 61 72 61 74 6f 72 73 2e 20 2a 2f  w separators. */
2a770 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
2a780 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
2a790 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c  ->rowSeparator),
2a7a0 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
2a7b0 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20  , SEP_Row);.    
2a7c0 20 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33    nSep = strlen3
2a7d0 30 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  0(p->rowSeparato
2a7e0 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  r);.    }.    if
2a7f0 28 20 6e 53 65 70 3e 31 20 29 7b 0a 20 20 20 20  ( nSep>1 ){.    
2a800 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2a810 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6d 75 6c  err, "Error: mul
2a820 74 69 2d 63 68 61 72 61 63 74 65 72 20 72 6f 77  ti-character row
2a830 20 73 65 70 61 72 61 74 6f 72 73 20 6e 6f 74 20   separators not 
2a840 61 6c 6c 6f 77 65 64 22 0a 20 20 20 20 20 20 20  allowed".       
2a850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2a860 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29 3b   for import\n");
2a870 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
2a880 0a 20 20 20 20 7d 0a 20 20 20 20 73 43 74 78 2e  .    }.    sCtx.
2a890 7a 46 69 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a 20  zFile = zFile;. 
2a8a0 20 20 20 73 43 74 78 2e 6e 4c 69 6e 65 20 3d 20     sCtx.nLine = 
2a8b0 31 3b 0a 20 20 20 20 69 66 28 20 73 43 74 78 2e  1;.    if( sCtx.
2a8c0 7a 46 69 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b  zFile[0]=='|' ){
2a8d0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
2a8e0 4d 49 54 5f 50 4f 50 45 4e 0a 20 20 20 20 20 20  MIT_POPEN.      
2a8f0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2a900 72 2c 20 22 45 72 72 6f 72 3a 20 70 69 70 65 73  r, "Error: pipes
2a910 20 61 72 65 20 6e 6f 74 20 73 75 70 70 6f 72 74   are not support
2a920 65 64 20 69 6e 20 74 68 69 73 20 4f 53 5c 6e 22  ed in this OS\n"
2a930 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
2a940 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 73  1;.#else.      s
2a950 43 74 78 2e 69 6e 20 3d 20 70 6f 70 65 6e 28 73  Ctx.in = popen(s
2a960 43 74 78 2e 7a 46 69 6c 65 2b 31 2c 20 22 72 22  Ctx.zFile+1, "r"
2a970 29 3b 0a 20 20 20 20 20 20 73 43 74 78 2e 7a 46  );.      sCtx.zF
2a980 69 6c 65 20 3d 20 22 3c 70 69 70 65 3e 22 3b 0a  ile = "<pipe>";.
2a990 20 20 20 20 20 20 78 43 6c 6f 73 65 72 20 3d 20        xCloser = 
2a9a0 70 63 6c 6f 73 65 3b 0a 23 65 6e 64 69 66 0a 20  pclose;.#endif. 
2a9b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a9c0 73 43 74 78 2e 69 6e 20 3d 20 66 6f 70 65 6e 28  sCtx.in = fopen(
2a9d0 73 43 74 78 2e 7a 46 69 6c 65 2c 20 22 72 62 22  sCtx.zFile, "rb"
2a9e0 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72  );.      xCloser
2a9f0 20 3d 20 66 63 6c 6f 73 65 3b 0a 20 20 20 20 7d   = fclose;.    }
2aa00 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 6f 64 65  .    if( p->mode
2aa10 3d 3d 4d 4f 44 45 5f 41 73 63 69 69 20 29 7b 0a  ==MODE_Ascii ){.
2aa20 20 20 20 20 20 20 78 52 65 61 64 20 3d 20 61 73        xRead = as
2aa30 63 69 69 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65  cii_read_one_fie
2aa40 6c 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ld;.    }else{. 
2aa50 20 20 20 20 20 78 52 65 61 64 20 3d 20 63 73 76       xRead = csv
2aa60 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 3b  _read_one_field;
2aa70 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
2aa80 43 74 78 2e 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  Ctx.in==0 ){.   
2aa90 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2aaa0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63  tderr, "Error: c
2aab0 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c  annot open \"%s\
2aac0 22 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20  "\n", zFile);.  
2aad0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2aae0 20 20 7d 0a 20 20 20 20 73 43 74 78 2e 63 43 6f    }.    sCtx.cCo
2aaf0 6c 53 65 70 20 3d 20 70 2d 3e 63 6f 6c 53 65 70  lSep = p->colSep
2ab00 61 72 61 74 6f 72 5b 30 5d 3b 0a 20 20 20 20 73  arator[0];.    s
2ab10 43 74 78 2e 63 52 6f 77 53 65 70 20 3d 20 70 2d  Ctx.cRowSep = p-
2ab20 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 5b 30 5d  >rowSeparator[0]
2ab30 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c  ;.    zSql = sql
2ab40 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
2ab50 4c 45 43 54 20 2a 20 46 52 4f 4d 20 25 73 22 2c  LECT * FROM %s",
2ab60 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66   zTable);.    if
2ab70 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zSql==0 ){.   
2ab80 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2ab90 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6f 75  derr, "Error: ou
2aba0 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b  t of memory\n");
2abb0 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28 73  .      xCloser(s
2abc0 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20 72  Ctx.in);.      r
2abd0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
2abe0 20 20 20 6e 42 79 74 65 20 3d 20 73 74 72 6c 65     nByte = strle
2abf0 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20 72  n30(zSql);.    r
2ac00 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
2ac10 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53  are_v2(p->db, zS
2ac20 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
2ac30 30 29 3b 0a 20 20 20 20 69 6d 70 6f 72 74 5f 61  0);.    import_a
2ac40 70 70 65 6e 64 5f 63 68 61 72 28 26 73 43 74 78  ppend_char(&sCtx
2ac50 2c 20 30 29 3b 20 20 20 20 2f 2a 20 54 6f 20 65  , 0);    /* To e
2ac60 6e 73 75 72 65 20 73 43 74 78 2e 7a 20 69 73 20  nsure sCtx.z is 
2ac70 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 20  allocated */.   
2ac80 20 69 66 28 20 72 63 20 26 26 20 73 71 6c 69 74   if( rc && sqlit
2ac90 65 33 5f 73 74 72 67 6c 6f 62 28 22 6e 6f 20 73  e3_strglob("no s
2aca0 75 63 68 20 74 61 62 6c 65 3a 20 2a 22 2c 20 73  uch table: *", s
2acb0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
2acc0 3e 64 62 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  >db))==0 ){.    
2acd0 20 20 63 68 61 72 20 2a 7a 43 72 65 61 74 65 20    char *zCreate 
2ace0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2acf0 66 28 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  f("CREATE TABLE 
2ad00 25 73 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20  %s", zTable);.  
2ad10 20 20 20 20 63 68 61 72 20 63 53 65 70 20 3d 20      char cSep = 
2ad20 27 28 27 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  '(';.      while
2ad30 28 20 78 52 65 61 64 28 26 73 43 74 78 29 20 29  ( xRead(&sCtx) )
2ad40 7b 0a 20 20 20 20 20 20 20 20 7a 43 72 65 61 74  {.        zCreat
2ad50 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
2ad60 6e 74 66 28 22 25 7a 25 63 5c 6e 20 20 5c 22 25  ntf("%z%c\n  \"%
2ad70 77 5c 22 20 54 45 58 54 22 2c 20 7a 43 72 65 61  w\" TEXT", zCrea
2ad80 74 65 2c 20 63 53 65 70 2c 20 73 43 74 78 2e 7a  te, cSep, sCtx.z
2ad90 29 3b 0a 20 20 20 20 20 20 20 20 63 53 65 70 20  );.        cSep 
2ada0 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 69  = ',';.        i
2adb0 66 28 20 73 43 74 78 2e 63 54 65 72 6d 21 3d 73  f( sCtx.cTerm!=s
2adc0 43 74 78 2e 63 43 6f 6c 53 65 70 20 29 20 62 72  Ctx.cColSep ) br
2add0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
2ade0 20 20 20 69 66 28 20 63 53 65 70 3d 3d 27 28 27     if( cSep=='('
2adf0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2ae00 74 65 33 5f 66 72 65 65 28 7a 43 72 65 61 74 65  te3_free(zCreate
2ae10 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2ae20 65 33 5f 66 72 65 65 28 73 43 74 78 2e 7a 29 3b  e3_free(sCtx.z);
2ae30 0a 20 20 20 20 20 20 20 20 78 43 6c 6f 73 65 72  .        xCloser
2ae40 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20  (sCtx.in);.     
2ae50 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2ae60 74 64 65 72 72 2c 22 25 73 3a 20 65 6d 70 74 79  tderr,"%s: empty
2ae70 20 66 69 6c 65 5c 6e 22 2c 20 73 43 74 78 2e 7a   file\n", sCtx.z
2ae80 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 72  File);.        r
2ae90 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
2aea0 0a 20 20 20 20 20 20 7a 43 72 65 61 74 65 20 3d  .      zCreate =
2aeb0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2aec0 28 22 25 7a 5c 6e 29 22 2c 20 7a 43 72 65 61 74  ("%z\n)", zCreat
2aed0 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  e);.      rc = s
2aee0 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
2aef0 62 2c 20 7a 43 72 65 61 74 65 2c 20 30 2c 20 30  b, zCreate, 0, 0
2af00 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
2af10 74 65 33 5f 66 72 65 65 28 7a 43 72 65 61 74 65  te3_free(zCreate
2af20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
2af30 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
2af40 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2af50 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 73 28  CREATE TABLE %s(
2af60 2e 2e 2e 29 20 66 61 69 6c 65 64 3a 20 25 73 5c  ...) failed: %s\
2af70 6e 22 2c 20 7a 54 61 62 6c 65 2c 0a 20 20 20 20  n", zTable,.    
2af80 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2af90 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
2afa0 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ));.        sqli
2afb0 74 65 33 5f 66 72 65 65 28 73 43 74 78 2e 7a 29  te3_free(sCtx.z)
2afc0 3b 0a 20 20 20 20 20 20 20 20 78 43 6c 6f 73 65  ;.        xClose
2afd0 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20  r(sCtx.in);.    
2afe0 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2aff0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
2b000 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
2b010 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  _v2(p->db, zSql,
2b020 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
2b030 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2b040 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
2b050 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2b060 20 20 20 69 66 20 28 70 53 74 6d 74 29 20 73 71     if (pStmt) sq
2b070 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
2b080 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 75 74 66  Stmt);.      utf
2b090 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2b0a0 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73  "Error: %s\n", s
2b0b0 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
2b0c0 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 78 43 6c  >db));.      xCl
2b0d0 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20  oser(sCtx.in);. 
2b0e0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2b0f0 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20     }.    nCol = 
2b100 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
2b110 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  ount(pStmt);.   
2b120 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
2b130 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 53  e(pStmt);.    pS
2b140 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  tmt = 0;.    if(
2b150 20 6e 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72   nCol==0 ) retur
2b160 6e 20 30 3b 20 2f 2a 20 6e 6f 20 63 6f 6c 75 6d  n 0; /* no colum
2b170 6e 73 2c 20 6e 6f 20 65 72 72 6f 72 20 2a 2f 0a  ns, no error */.
2b180 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
2b190 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e 42 79  e3_malloc64( nBy
2b1a0 74 65 2a 32 20 2b 20 32 30 20 2b 20 6e 43 6f 6c  te*2 + 20 + nCol
2b1b0 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53  *2 );.    if( zS
2b1c0 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ql==0 ){.      r
2b1d0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
2b1e0 2c 20 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66  , "Error: out of
2b1f0 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20   memory\n");.   
2b200 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e     xCloser(sCtx.
2b210 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  in);.      retur
2b220 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  n 1;.    }.    s
2b230 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2b240 6e 42 79 74 65 2b 32 30 2c 20 7a 53 71 6c 2c 20  nByte+20, zSql, 
2b250 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5c 22 25  "INSERT INTO \"%
2b260 77 5c 22 20 56 41 4c 55 45 53 28 3f 22 2c 20 7a  w\" VALUES(?", z
2b270 54 61 62 6c 65 29 3b 0a 20 20 20 20 6a 20 3d 20  Table);.    j = 
2b280 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a  strlen30(zSql);.
2b290 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
2b2a0 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
2b2b0 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27   zSql[j++] = ','
2b2c0 3b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b  ;.      zSql[j++
2b2d0 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a 20  ] = '?';.    }. 
2b2e0 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27     zSql[j++] = '
2b2f0 29 27 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d 20  )';.    zSql[j] 
2b300 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 0;.    rc = sq
2b310 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
2b320 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  (p->db, zSql, -1
2b330 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
2b340 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2b350 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Sql);.    if( rc
2b360 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
2b370 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
2b380 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c  rror: %s\n", sql
2b390 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
2b3a0 62 29 29 3b 0a 20 20 20 20 20 20 69 66 20 28 70  b));.      if (p
2b3b0 53 74 6d 74 29 20 73 71 6c 69 74 65 33 5f 66 69  Stmt) sqlite3_fi
2b3c0 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
2b3d0 20 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74       xCloser(sCt
2b3e0 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74  x.in);.      ret
2b3f0 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
2b400 20 6e 65 65 64 43 6f 6d 6d 69 74 20 3d 20 73 71   needCommit = sq
2b410 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f  lite3_get_autoco
2b420 6d 6d 69 74 28 70 2d 3e 64 62 29 3b 0a 20 20 20  mmit(p->db);.   
2b430 20 69 66 28 20 6e 65 65 64 43 6f 6d 6d 69 74 20   if( needCommit 
2b440 29 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  ) sqlite3_exec(p
2b450 2d 3e 64 62 2c 20 22 42 45 47 49 4e 22 2c 20 30  ->db, "BEGIN", 0
2b460 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 64 6f 7b  , 0, 0);.    do{
2b470 0a 20 20 20 20 20 20 69 6e 74 20 73 74 61 72 74  .      int start
2b480 4c 69 6e 65 20 3d 20 73 43 74 78 2e 6e 4c 69 6e  Line = sCtx.nLin
2b490 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  e;.      for(i=0
2b4a0 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
2b4b0 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20          char *z 
2b4c0 3d 20 78 52 65 61 64 28 26 73 43 74 78 29 3b 0a  = xRead(&sCtx);.
2b4d0 20 20 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20          /*.     
2b4e0 20 20 20 2a 2a 20 44 69 64 20 77 65 20 72 65 61     ** Did we rea
2b4f0 63 68 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 20 62  ch end-of-file b
2b500 65 66 6f 72 65 20 66 69 6e 64 69 6e 67 20 61 6e  efore finding an
2b510 79 20 63 6f 6c 75 6d 6e 73 3f 0a 20 20 20 20 20  y columns?.     
2b520 20 20 20 2a 2a 20 49 66 20 73 6f 2c 20 73 74 6f     ** If so, sto
2b530 70 20 69 6e 73 74 65 61 64 20 6f 66 20 4e 55 4c  p instead of NUL
2b540 4c 20 66 69 6c 6c 69 6e 67 20 74 68 65 20 72 65  L filling the re
2b550 6d 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 73 2e  maining columns.
2b560 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2b570 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 26 26 20      if( z==0 && 
2b580 69 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  i==0 ) break;.  
2b590 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20        /*.       
2b5a0 20 2a 2a 20 44 69 64 20 77 65 20 72 65 61 63 68   ** Did we reach
2b5b0 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 20 4f 52 20   end-of-file OR 
2b5c0 65 6e 64 2d 6f 66 2d 6c 69 6e 65 20 62 65 66 6f  end-of-line befo
2b5d0 72 65 20 66 69 6e 64 69 6e 67 20 61 6e 79 0a 20  re finding any. 
2b5e0 20 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e         ** column
2b5f0 73 20 69 6e 20 41 53 43 49 49 20 6d 6f 64 65 3f  s in ASCII mode?
2b600 20 20 49 66 20 73 6f 2c 20 73 74 6f 70 20 69 6e    If so, stop in
2b610 73 74 65 61 64 20 6f 66 20 4e 55 4c 4c 20 66 69  stead of NULL fi
2b620 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  lling.        **
2b630 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 63   the remaining c
2b640 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 20 20 20 20  olumns..        
2b650 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
2b660 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 41 73 63  ->mode==MODE_Asc
2b670 69 69 20 26 26 20 28 7a 3d 3d 30 20 7c 7c 20 7a  ii && (z==0 || z
2b680 5b 30 5d 3d 3d 30 29 20 26 26 20 69 3d 3d 30 20  [0]==0) && i==0 
2b690 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
2b6a0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
2b6b0 78 74 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20 7a  xt(pStmt, i+1, z
2b6c0 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
2b6d0 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 20  NSIENT);.       
2b6e0 20 69 66 28 20 69 3c 6e 43 6f 6c 2d 31 20 26 26   if( i<nCol-1 &&
2b6f0 20 73 43 74 78 2e 63 54 65 72 6d 21 3d 73 43 74   sCtx.cTerm!=sCt
2b700 78 2e 63 43 6f 6c 53 65 70 20 29 7b 0a 20 20 20  x.cColSep ){.   
2b710 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2b720 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25  tf(stderr, "%s:%
2b730 64 3a 20 65 78 70 65 63 74 65 64 20 25 64 20 63  d: expected %d c
2b740 6f 6c 75 6d 6e 73 20 62 75 74 20 66 6f 75 6e 64  olumns but found
2b750 20 25 64 20 2d 20 22 0a 20 20 20 20 20 20 20 20   %d - ".        
2b760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b770 20 20 22 66 69 6c 6c 69 6e 67 20 74 68 65 20 72    "filling the r
2b780 65 73 74 20 77 69 74 68 20 4e 55 4c 4c 5c 6e 22  est with NULL\n"
2b790 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2b7a0 20 20 20 20 20 20 20 20 20 20 20 20 73 43 74 78              sCtx
2b7b0 2e 7a 46 69 6c 65 2c 20 73 74 61 72 74 4c 69 6e  .zFile, startLin
2b7c0 65 2c 20 6e 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20  e, nCol, i+1);. 
2b7d0 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32 3b           i += 2;
2b7e0 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
2b7f0 28 20 69 3c 3d 6e 43 6f 6c 20 29 7b 20 73 71 6c  ( i<=nCol ){ sql
2b800 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70  ite3_bind_null(p
2b810 53 74 6d 74 2c 20 69 29 3b 20 69 2b 2b 3b 20 7d  Stmt, i); i++; }
2b820 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2b830 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 43 74   }.      if( sCt
2b840 78 2e 63 54 65 72 6d 3d 3d 73 43 74 78 2e 63 43  x.cTerm==sCtx.cC
2b850 6f 6c 53 65 70 20 29 7b 0a 20 20 20 20 20 20 20  olSep ){.       
2b860 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 78   do{.          x
2b870 52 65 61 64 28 26 73 43 74 78 29 3b 0a 20 20 20  Read(&sCtx);.   
2b880 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
2b890 20 20 20 20 7d 77 68 69 6c 65 28 20 73 43 74 78      }while( sCtx
2b8a0 2e 63 54 65 72 6d 3d 3d 73 43 74 78 2e 63 43 6f  .cTerm==sCtx.cCo
2b8b0 6c 53 65 70 20 29 3b 0a 20 20 20 20 20 20 20 20  lSep );.        
2b8c0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
2b8d0 72 72 2c 20 22 25 73 3a 25 64 3a 20 65 78 70 65  rr, "%s:%d: expe
2b8e0 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20  cted %d columns 
2b8f0 62 75 74 20 66 6f 75 6e 64 20 25 64 20 2d 20 22  but found %d - "
2b900 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b910 20 20 20 20 20 20 20 20 20 22 65 78 74 72 61 73           "extras
2b920 20 69 67 6e 6f 72 65 64 5c 6e 22 2c 0a 20 20 20   ignored\n",.   
2b930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b940 20 20 20 20 20 73 43 74 78 2e 7a 46 69 6c 65 2c       sCtx.zFile,
2b950 20 73 74 61 72 74 4c 69 6e 65 2c 20 6e 43 6f 6c   startLine, nCol
2b960 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , i);.      }.  
2b970 20 20 20 20 69 66 28 20 69 3e 3d 6e 43 6f 6c 20      if( i>=nCol 
2b980 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2b990 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a  e3_step(pStmt);.
2b9a0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2b9b0 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
2b9c0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2b9d0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2b9e0 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
2b9f0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25  rintf(stderr, "%
2ba00 73 3a 25 64 3a 20 49 4e 53 45 52 54 20 66 61 69  s:%d: INSERT fai
2ba10 6c 65 64 3a 20 25 73 5c 6e 22 2c 20 73 43 74 78  led: %s\n", sCtx
2ba20 2e 7a 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20  .zFile,.        
2ba30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
2ba40 61 72 74 4c 69 6e 65 2c 20 73 71 6c 69 74 65 33  artLine, sqlite3
2ba50 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
2ba60 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ba70 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73   }.    }while( s
2ba80 43 74 78 2e 63 54 65 72 6d 21 3d 45 4f 46 20 29  Ctx.cTerm!=EOF )
2ba90 3b 0a 0a 20 20 20 20 78 43 6c 6f 73 65 72 28 73  ;..    xCloser(s
2baa0 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 73 71 6c  Ctx.in);.    sql
2bab0 69 74 65 33 5f 66 72 65 65 28 73 43 74 78 2e 7a  ite3_free(sCtx.z
2bac0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
2bad0 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
2bae0 20 20 20 20 69 66 28 20 6e 65 65 64 43 6f 6d 6d      if( needComm
2baf0 69 74 20 29 20 73 71 6c 69 74 65 33 5f 65 78 65  it ) sqlite3_exe
2bb00 63 28 70 2d 3e 64 62 2c 20 22 43 4f 4d 4d 49 54  c(p->db, "COMMIT
2bb10 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  ", 0, 0, 0);.  }
2bb20 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51  else..#ifndef SQ
2bb30 4c 49 54 45 5f 55 4e 54 45 53 54 41 42 4c 45 0a  LITE_UNTESTABLE.
2bb40 20 20 69 66 28 20 63 3d 3d 27 69 27 20 26 26 20    if( c=='i' && 
2bb50 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2bb60 2c 20 22 69 6d 70 6f 73 74 65 72 22 2c 20 6e 29  , "imposter", n)
2bb70 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==0 ){.    char 
2bb80 2a 7a 53 71 6c 3b 0a 20 20 20 20 63 68 61 72 20  *zSql;.    char 
2bb90 2a 7a 43 6f 6c 6c 69 73 74 20 3d 20 30 3b 0a 20  *zCollist = 0;. 
2bba0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
2bbb0 2a 70 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20  *pStmt;.    int 
2bbc0 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 69 6e  tnum = 0;.    in
2bbd0 74 20 69 3b 0a 20 20 20 20 69 66 28 20 6e 41 72  t i;.    if( nAr
2bbe0 67 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 75 74  g!=3 ){.      ut
2bbf0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2bc00 2c 20 22 55 73 61 67 65 3a 20 2e 69 6d 70 6f 73  , "Usage: .impos
2bc10 74 65 72 20 49 4e 44 45 58 20 49 4d 50 4f 53 54  ter INDEX IMPOST
2bc20 45 52 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  ER\n");.      rc
2bc30 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
2bc40 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
2bc50 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70  it;.    }.    op
2bc60 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
2bc70 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
2bc80 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
2bc90 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20 73 71  rootpage FROM sq
2bca0 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20  lite_master".   
2bcb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bcc0 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20          " WHERE 
2bcd0 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79  name='%q' AND ty
2bce0 70 65 3d 27 69 6e 64 65 78 27 22 2c 20 61 7a 41  pe='index'", azA
2bcf0 72 67 5b 31 5d 29 3b 0a 20 20 20 20 73 71 6c 69  rg[1]);.    sqli
2bd00 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
2bd10 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
2bd20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
2bd30 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
2bd40 6c 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  l);.    if( sqli
2bd50 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
2bd60 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
2bd70 20 20 20 20 20 74 6e 75 6d 20 3d 20 73 71 6c 69       tnum = sqli
2bd80 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
2bd90 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Stmt, 0);.    }.
2bda0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
2bdb0 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
2bdc0 20 69 66 28 20 74 6e 75 6d 3d 3d 30 20 29 7b 0a   if( tnum==0 ){.
2bdd0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2bde0 66 28 73 74 64 65 72 72 2c 20 22 6e 6f 20 73 75  f(stderr, "no su
2bdf0 63 68 20 69 6e 64 65 78 3a 20 5c 22 25 73 5c 22  ch index: \"%s\"
2be00 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  \n", azArg[1]);.
2be10 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
2be20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
2be30 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
2be40 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c  }.    zSql = sql
2be50 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52  ite3_mprintf("PR
2be60 41 47 4d 41 20 69 6e 64 65 78 5f 78 69 6e 66 6f  AGMA index_xinfo
2be70 3d 27 25 71 27 22 2c 20 61 7a 41 72 67 5b 31 5d  ='%q'", azArg[1]
2be80 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
2be90 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
2bea0 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
2beb0 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
2bec0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
2bed0 6c 29 3b 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20  l);.    i = 0;. 
2bee0 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65     while( sqlite
2bef0 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53  3_step(pStmt)==S
2bf00 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
2bf10 20 20 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b 32     char zLabel[2
2bf20 30 5d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  0];.      const 
2bf30 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 28 63 6f  char *zCol = (co
2bf40 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
2bf50 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
2bf60 74 6d 74 2c 32 29 3b 0a 20 20 20 20 20 20 69 2b  tmt,2);.      i+
2bf70 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f  +;.      if( zCo
2bf80 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l==0 ){.        
2bf90 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  if( sqlite3_colu
2bfa0 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 31 29 3d  mn_int(pStmt,1)=
2bfb0 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =-1 ){.         
2bfc0 20 7a 43 6f 6c 20 3d 20 22 5f 52 4f 57 49 44 5f   zCol = "_ROWID_
2bfd0 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ";.        }else
2bfe0 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
2bff0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
2c000 65 6f 66 28 7a 4c 61 62 65 6c 29 2c 7a 4c 61 62  eof(zLabel),zLab
2c010 65 6c 2c 22 65 78 70 72 25 64 22 2c 69 29 3b 0a  el,"expr%d",i);.
2c020 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d            zCol =
2c030 20 7a 4c 61 62 65 6c 3b 0a 20 20 20 20 20 20 20   zLabel;.       
2c040 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2c050 20 69 66 28 20 7a 43 6f 6c 6c 69 73 74 3d 3d 30   if( zCollist==0
2c060 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c   ){.        zCol
2c070 6c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d  list = sqlite3_m
2c080 70 72 69 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c  printf("\"%w\"",
2c090 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 65   zCol);.      }e
2c0a0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  lse{.        zCo
2c0b0 6c 6c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 5f  llist = sqlite3_
2c0c0 6d 70 72 69 6e 74 66 28 22 25 7a 2c 5c 22 25 77  mprintf("%z,\"%w
2c0d0 5c 22 22 2c 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a  \"", zCollist, z
2c0e0 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Col);.      }.  
2c0f0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
2c100 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
2c110 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  .    zSql = sqli
2c120 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
2c130 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54         "CREATE T
2c140 41 42 4c 45 20 5c 22 25 77 5c 22 28 25 73 2c 50  ABLE \"%w\"(%s,P
2c150 52 49 4d 41 52 59 20 4b 45 59 28 25 73 29 29 57  RIMARY KEY(%s))W
2c160 49 54 48 4f 55 54 20 52 4f 57 49 44 22 2c 0a 20  ITHOUT ROWID",. 
2c170 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b 32           azArg[2
2c180 5d 2c 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 43 6f  ], zCollist, zCo
2c190 6c 6c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  llist);.    sqli
2c1a0 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c 6c 69 73  te3_free(zCollis
2c1b0 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  t);.    rc = sql
2c1c0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
2c1d0 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
2c1e0 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64  L_IMPOSTER, p->d
2c1f0 62 2c 20 22 6d 61 69 6e 22 2c 20 31 2c 20 74 6e  b, "main", 1, tn
2c200 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  um);.    if( rc=
2c210 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2c220 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2c230 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 53 71  _exec(p->db, zSq
2c240 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  l, 0, 0, 0);.   
2c250 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
2c260 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
2c270 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52  ESTCTRL_IMPOSTER
2c280 2c 20 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22 2c  , p->db, "main",
2c290 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
2c2a0 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2c2b0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
2c2c0 72 72 2c 20 22 45 72 72 6f 72 20 69 6e 20 5b 25  rr, "Error in [%
2c2d0 73 5d 3a 20 25 73 5c 6e 22 2c 20 7a 53 71 6c 2c  s]: %s\n", zSql,
2c2e0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
2c2f0 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 7d  p->db));.      }
2c300 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 74  else{.        ut
2c310 66 38 5f 70 72 69 6e 74 66 28 73 74 64 6f 75 74  f8_printf(stdout
2c320 2c 20 22 25 73 3b 5c 6e 22 2c 20 7a 53 71 6c 29  , "%s;\n", zSql)
2c330 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  ;.        raw_pr
2c340 69 6e 74 66 28 73 74 64 6f 75 74 2c 0a 20 20 20  intf(stdout,.   
2c350 20 20 20 20 20 20 20 20 22 57 41 52 4e 49 4e 47          "WARNING
2c360 3a 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 20  : writing to an 
2c370 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 77  imposter table w
2c380 69 6c 6c 20 63 6f 72 72 75 70 74 20 74 68 65 20  ill corrupt the 
2c390 69 6e 64 65 78 21 5c 6e 22 0a 20 20 20 20 20 20  index!\n".      
2c3a0 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
2c3b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
2c3c0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2c3d0 20 22 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52   "SQLITE_TESTCTR
2c3e0 4c 5f 49 4d 50 4f 53 54 45 52 20 72 65 74 75 72  L_IMPOSTER retur
2c3f0 6e 73 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20  ns %d\n", rc);. 
2c400 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
2c410 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
2c420 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 65 6c  ree(zSql);.  }el
2c430 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  se.#endif /* !de
2c440 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
2c450 54 5f 54 45 53 54 5f 43 4f 4e 54 52 4f 4c 29 20  T_TEST_CONTROL) 
2c460 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
2c470 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
2c480 0a 20 20 69 66 28 20 63 3d 3d 27 69 27 20 26 26  .  if( c=='i' &&
2c490 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2c4a0 5d 2c 20 22 69 6f 74 72 61 63 65 22 2c 20 6e 29  ], "iotrace", n)
2c4b0 3d 3d 30 20 29 7b 0a 20 20 20 20 53 51 4c 49 54  ==0 ){.    SQLIT
2c4c0 45 5f 41 50 49 20 65 78 74 65 72 6e 20 76 6f 69  E_API extern voi
2c4d0 64 20 28 53 51 4c 49 54 45 5f 43 44 45 43 4c 20  d (SQLITE_CDECL 
2c4e0 2a 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 29  *sqlite3IoTrace)
2c4f0 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 2e 2e  (const char*, ..
2c500 2e 29 3b 0a 20 20 20 20 69 66 28 20 69 6f 74 72  .);.    if( iotr
2c510 61 63 65 20 26 26 20 69 6f 74 72 61 63 65 21 3d  ace && iotrace!=
2c520 73 74 64 6f 75 74 20 29 20 66 63 6c 6f 73 65 28  stdout ) fclose(
2c530 69 6f 74 72 61 63 65 29 3b 0a 20 20 20 20 69 6f  iotrace);.    io
2c540 74 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 69  trace = 0;.    i
2c550 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20  f( nArg<2 ){.   
2c560 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63     sqlite3IoTrac
2c570 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 0;.    }else
2c580 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72   if( strcmp(azAr
2c590 67 5b 31 5d 2c 20 22 2d 22 29 3d 3d 30 20 29 7b  g[1], "-")==0 ){
2c5a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f  .      sqlite3Io
2c5b0 54 72 61 63 65 20 3d 20 69 6f 74 72 61 63 65 50  Trace = iotraceP
2c5c0 72 69 6e 74 66 3b 0a 20 20 20 20 20 20 69 6f 74  rintf;.      iot
2c5d0 72 61 63 65 20 3d 20 73 74 64 6f 75 74 3b 0a 20  race = stdout;. 
2c5e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2c5f0 69 6f 74 72 61 63 65 20 3d 20 66 6f 70 65 6e 28  iotrace = fopen(
2c600 61 7a 41 72 67 5b 31 5d 2c 20 22 77 22 29 3b 0a  azArg[1], "w");.
2c610 20 20 20 20 20 20 69 66 28 20 69 6f 74 72 61 63        if( iotrac
2c620 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
2c630 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
2c640 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e  rr, "Error: cann
2c650 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e  ot open \"%s\"\n
2c660 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ", azArg[1]);.  
2c670 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54        sqlite3IoT
2c680 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  race = 0;.      
2c690 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
2c6a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
2c6b0 71 6c 69 74 65 33 49 6f 54 72 61 63 65 20 3d 20  qlite3IoTrace = 
2c6c0 69 6f 74 72 61 63 65 50 72 69 6e 74 66 3b 0a 20  iotracePrintf;. 
2c6d0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2c6e0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69  else.#endif..  i
2c6f0 66 28 20 63 3d 3d 27 6c 27 20 26 26 20 6e 3e 3d  f( c=='l' && n>=
2c700 35 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  5 && strncmp(azA
2c710 72 67 5b 30 5d 2c 20 22 6c 69 6d 69 74 73 22 2c  rg[0], "limits",
2c720 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74   n)==0 ){.    st
2c730 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
2c740 74 20 7b 0a 20 20 20 20 20 20 20 63 6f 6e 73 74  t {.       const
2c750 20 63 68 61 72 20 2a 7a 4c 69 6d 69 74 4e 61 6d   char *zLimitNam
2c760 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  e;   /* Name of 
2c770 61 20 6c 69 6d 69 74 20 2a 2f 0a 20 20 20 20 20  a limit */.     
2c780 20 20 69 6e 74 20 6c 69 6d 69 74 43 6f 64 65 3b    int limitCode;
2c790 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2c7a0 6e 74 65 67 65 72 20 63 6f 64 65 20 66 6f 72 20  nteger code for 
2c7b0 74 68 61 74 20 6c 69 6d 69 74 20 2a 2f 0a 20 20  that limit */.  
2c7c0 20 20 7d 20 61 4c 69 6d 69 74 5b 5d 20 3d 20 7b    } aLimit[] = {
2c7d0 0a 20 20 20 20 20 20 7b 20 22 6c 65 6e 67 74 68  .      { "length
2c7e0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2c7f0 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c    SQLITE_LIMIT_L
2c800 45 4e 47 54 48 20 20 20 20 20 20 20 20 20 20 20  ENGTH           
2c810 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2c820 20 20 7b 20 22 73 71 6c 5f 6c 65 6e 67 74 68 22    { "sql_length"
2c830 2c 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c  ,            SQL
2c840 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45  ITE_LIMIT_SQL_LE
2c850 4e 47 54 48 20 20 20 20 20 20 20 20 20 20 20 20  NGTH            
2c860 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
2c870 63 6f 6c 75 6d 6e 22 2c 20 20 20 20 20 20 20 20  column",        
2c880 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
2c890 49 4d 49 54 5f 43 4f 4c 55 4d 4e 20 20 20 20 20  IMIT_COLUMN     
2c8a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2c8b0 2c 0a 20 20 20 20 20 20 7b 20 22 65 78 70 72 5f  ,.      { "expr_
2c8c0 64 65 70 74 68 22 2c 20 20 20 20 20 20 20 20 20  depth",         
2c8d0 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
2c8e0 45 58 50 52 5f 44 45 50 54 48 20 20 20 20 20 20  EXPR_DEPTH      
2c8f0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2c900 20 20 20 7b 20 22 63 6f 6d 70 6f 75 6e 64 5f 73     { "compound_s
2c910 65 6c 65 63 74 22 2c 20 20 20 20 20 20 20 53 51  elect",       SQ
2c920 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f  LITE_LIMIT_COMPO
2c930 55 4e 44 5f 53 45 4c 45 43 54 20 20 20 20 20 20  UND_SELECT      
2c940 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
2c950 22 76 64 62 65 5f 6f 70 22 2c 20 20 20 20 20 20  "vdbe_op",      
2c960 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
2c970 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 20 20 20  LIMIT_VDBE_OP   
2c980 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c990 7d 2c 0a 20 20 20 20 20 20 7b 20 22 66 75 6e 63  },.      { "func
2c9a0 74 69 6f 6e 5f 61 72 67 22 2c 20 20 20 20 20 20  tion_arg",      
2c9b0 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
2c9c0 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 20 20  _FUNCTION_ARG   
2c9d0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2c9e0 20 20 20 20 7b 20 22 61 74 74 61 63 68 65 64 22      { "attached"
2c9f0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  ,              S
2ca00 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41  QLITE_LIMIT_ATTA
2ca10 43 48 45 44 20 20 20 20 20 20 20 20 20 20 20 20  CHED            
2ca20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
2ca30 20 22 6c 69 6b 65 5f 70 61 74 74 65 72 6e 5f 6c   "like_pattern_l
2ca40 65 6e 67 74 68 22 2c 20 20 20 53 51 4c 49 54 45  ength",   SQLITE
2ca50 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54  _LIMIT_LIKE_PATT
2ca60 45 52 4e 5f 4c 45 4e 47 54 48 20 20 20 20 20 20  ERN_LENGTH      
2ca70 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 76 61 72   },.      { "var
2ca80 69 61 62 6c 65 5f 6e 75 6d 62 65 72 22 2c 20 20  iable_number",  
2ca90 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
2caa0 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
2cab0 52 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  R           },. 
2cac0 20 20 20 20 20 7b 20 22 74 72 69 67 67 65 72 5f       { "trigger_
2cad0 64 65 70 74 68 22 2c 20 20 20 20 20 20 20 20 20  depth",         
2cae0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49  SQLITE_LIMIT_TRI
2caf0 47 47 45 52 5f 44 45 50 54 48 20 20 20 20 20 20  GGER_DEPTH      
2cb00 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
2cb10 7b 20 22 77 6f 72 6b 65 72 5f 74 68 72 65 61 64  { "worker_thread
2cb20 73 22 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54  s",        SQLIT
2cb30 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54  E_LIMIT_WORKER_T
2cb40 48 52 45 41 44 53 20 20 20 20 20 20 20 20 20 20  HREADS          
2cb50 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20    },.    };.    
2cb60 69 6e 74 20 69 2c 20 6e 32 3b 0a 20 20 20 20 6f  int i, n2;.    o
2cb70 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
2cb80 20 20 69 66 28 20 6e 41 72 67 3d 3d 31 20 29 7b    if( nArg==1 ){
2cb90 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
2cba0 69 3c 41 72 72 61 79 53 69 7a 65 28 61 4c 69 6d  i<ArraySize(aLim
2cbb0 69 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  it); i++){.     
2cbc0 20 20 20 70 72 69 6e 74 66 28 22 25 32 30 73 20     printf("%20s 
2cbd0 25 64 5c 6e 22 2c 20 61 4c 69 6d 69 74 5b 69 5d  %d\n", aLimit[i]
2cbe0 2e 7a 4c 69 6d 69 74 4e 61 6d 65 2c 0a 20 20 20  .zLimitName,.   
2cbf0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2cc00 74 65 33 5f 6c 69 6d 69 74 28 70 2d 3e 64 62 2c  te3_limit(p->db,
2cc10 20 61 4c 69 6d 69 74 5b 69 5d 2e 6c 69 6d 69 74   aLimit[i].limit
2cc20 43 6f 64 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20  Code, -1));.    
2cc30 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
2cc40 28 20 6e 41 72 67 3e 33 20 29 7b 0a 20 20 20 20  ( nArg>3 ){.    
2cc50 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2cc60 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 6c 69  err, "Usage: .li
2cc70 6d 69 74 20 4e 41 4d 45 20 3f 4e 45 57 2d 56 41  mit NAME ?NEW-VA
2cc80 4c 55 45 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20  LUE?\n");.      
2cc90 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f  rc = 1;.      go
2cca0 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
2ccb0 65 78 69 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  exit;.    }else{
2ccc0 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 69 6d 69  .      int iLimi
2ccd0 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 6e 32  t = -1;.      n2
2cce0 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 41 72   = strlen30(azAr
2ccf0 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72  g[1]);.      for
2cd00 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
2cd10 65 28 61 4c 69 6d 69 74 29 3b 20 69 2b 2b 29 7b  e(aLimit); i++){
2cd20 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
2cd30 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 61 4c  ite3_strnicmp(aL
2cd40 69 6d 69 74 5b 69 5d 2e 7a 4c 69 6d 69 74 4e 61  imit[i].zLimitNa
2cd50 6d 65 2c 20 61 7a 41 72 67 5b 31 5d 2c 20 6e 32  me, azArg[1], n2
2cd60 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2cd70 20 20 69 66 28 20 69 4c 69 6d 69 74 3c 30 20 29    if( iLimit<0 )
2cd80 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 4c  {.            iL
2cd90 69 6d 69 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  imit = i;.      
2cda0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2cdb0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2cdc0 74 66 28 73 74 64 65 72 72 2c 20 22 61 6d 62 69  tf(stderr, "ambi
2cdd0 67 75 6f 75 73 20 6c 69 6d 69 74 3a 20 5c 22 25  guous limit: \"%
2cde0 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d  s\"\n", azArg[1]
2cdf0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
2ce00 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
2ce10 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
2ce20 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20  mand_exit;.     
2ce30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2ce40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2ce50 66 28 20 69 4c 69 6d 69 74 3c 30 20 29 7b 0a 20  f( iLimit<0 ){. 
2ce60 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2ce70 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e 6b 6e  tf(stderr, "unkn
2ce80 6f 77 6e 20 6c 69 6d 69 74 3a 20 5c 22 25 73 5c  own limit: \"%s\
2ce90 22 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  "\n".           
2cea0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 65 6e               "en
2ceb0 74 65 72 20 5c 22 2e 6c 69 6d 69 74 73 5c 22 20  ter \".limits\" 
2cec0 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74  with no argument
2ced0 73 20 66 6f 72 20 61 20 6c 69 73 74 2e 5c 6e 22  s for a list.\n"
2cee0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2cef0 20 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67             azArg
2cf00 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63  [1]);.        rc
2cf10 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 1;.        go
2cf20 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
2cf30 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  exit;.      }.  
2cf40 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 33 20      if( nArg==3 
2cf50 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2cf60 65 33 5f 6c 69 6d 69 74 28 70 2d 3e 64 62 2c 20  e3_limit(p->db, 
2cf70 61 4c 69 6d 69 74 5b 69 4c 69 6d 69 74 5d 2e 6c  aLimit[iLimit].l
2cf80 69 6d 69 74 43 6f 64 65 2c 0a 20 20 20 20 20 20  imitCode,.      
2cf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cfa0 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75  (int)integerValu
2cfb0 65 28 61 7a 41 72 67 5b 32 5d 29 29 3b 0a 20 20  e(azArg[2]));.  
2cfc0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 72 69 6e      }.      prin
2cfd0 74 66 28 22 25 32 30 73 20 25 64 5c 6e 22 2c 20  tf("%20s %d\n", 
2cfe0 61 4c 69 6d 69 74 5b 69 4c 69 6d 69 74 5d 2e 7a  aLimit[iLimit].z
2cff0 4c 69 6d 69 74 4e 61 6d 65 2c 0a 20 20 20 20 20  LimitName,.     
2d000 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2d010 6c 69 6d 69 74 28 70 2d 3e 64 62 2c 20 61 4c 69  limit(p->db, aLi
2d020 6d 69 74 5b 69 4c 69 6d 69 74 5d 2e 6c 69 6d 69  mit[iLimit].limi
2d030 74 43 6f 64 65 2c 20 2d 31 29 29 3b 0a 20 20 20  tCode, -1));.   
2d040 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
2d050 28 20 63 3d 3d 27 6c 27 20 26 26 20 6e 3e 32 20  ( c=='l' && n>2 
2d060 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2d070 5b 30 5d 2c 20 22 6c 69 6e 74 22 2c 20 6e 29 3d  [0], "lint", n)=
2d080 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64  =0 ){.    open_d
2d090 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6c 69 6e  b(p, 0);.    lin
2d0a0 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 70 2c 20 61  tDotCommand(p, a
2d0b0 7a 41 72 67 2c 20 6e 41 72 67 29 3b 0a 20 20 7d  zArg, nArg);.  }
2d0c0 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51  else..#ifndef SQ
2d0d0 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
2d0e0 58 54 45 4e 53 49 4f 4e 0a 20 20 69 66 28 20 63  XTENSION.  if( c
2d0f0 3d 3d 27 6c 27 20 26 26 20 73 74 72 6e 63 6d 70  =='l' && strncmp
2d100 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 6f 61 64  (azArg[0], "load
2d110 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
2d120 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
2d130 65 2c 20 2a 7a 50 72 6f 63 3b 0a 20 20 20 20 63  e, *zProc;.    c
2d140 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
2d150 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32  ;.    if( nArg<2
2d160 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
2d170 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
2d180 61 67 65 3a 20 2e 6c 6f 61 64 20 46 49 4c 45 20  age: .load FILE 
2d190 3f 45 4e 54 52 59 50 4f 49 4e 54 3f 5c 6e 22 29  ?ENTRYPOINT?\n")
2d1a0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
2d1b0 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
2d1c0 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
2d1d0 20 20 7d 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20    }.    zFile = 
2d1e0 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 7a 50  azArg[1];.    zP
2d1f0 72 6f 63 20 3d 20 6e 41 72 67 3e 3d 33 20 3f 20  roc = nArg>=3 ? 
2d200 61 7a 41 72 67 5b 32 5d 20 3a 20 30 3b 0a 20 20  azArg[2] : 0;.  
2d210 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
2d220 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2d230 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  3_load_extension
2d240 28 70 2d 3e 64 62 2c 20 7a 46 69 6c 65 2c 20 7a  (p->db, zFile, z
2d250 50 72 6f 63 2c 20 26 7a 45 72 72 4d 73 67 29 3b  Proc, &zErrMsg);
2d260 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2d270 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2d280 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
2d290 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e  rr, "Error: %s\n
2d2a0 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ", zErrMsg);.   
2d2b0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2d2c0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
2d2d0 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
2d2e0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20  }else.#endif..  
2d2f0 69 66 28 20 63 3d 3d 27 6c 27 20 26 26 20 73 74  if( c=='l' && st
2d300 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2d310 22 6c 6f 67 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  "log", n)==0 ){.
2d320 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 32 20      if( nArg!=2 
2d330 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
2d340 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
2d350 67 65 3a 20 2e 6c 6f 67 20 46 49 4c 45 4e 41 4d  ge: .log FILENAM
2d360 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  E\n");.      rc 
2d370 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
2d380 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2d390 20 2a 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b   *zFile = azArg[
2d3a0 31 5d 3b 0a 20 20 20 20 20 20 6f 75 74 70 75 74  1];.      output
2d3b0 5f 66 69 6c 65 5f 63 6c 6f 73 65 28 70 2d 3e 70  _file_close(p->p
2d3c0 4c 6f 67 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  Log);.      p->p
2d3d0 4c 6f 67 20 3d 20 6f 75 74 70 75 74 5f 66 69 6c  Log = output_fil
2d3e0 65 5f 6f 70 65 6e 28 7a 46 69 6c 65 29 3b 0a 20  e_open(zFile);. 
2d3f0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
2d400 69 66 28 20 63 3d 3d 27 6d 27 20 26 26 20 73 74  if( c=='m' && st
2d410 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2d420 22 6d 6f 64 65 22 2c 20 6e 29 3d 3d 30 20 29 7b  "mode", n)==0 ){
2d430 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
2d440 2a 7a 4d 6f 64 65 20 3d 20 6e 41 72 67 3e 3d 32  *zMode = nArg>=2
2d450 20 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20 22 22   ? azArg[1] : ""
2d460 3b 0a 20 20 20 20 69 6e 74 20 6e 32 20 3d 20 73  ;.    int n2 = s
2d470 74 72 6c 65 6e 33 30 28 7a 4d 6f 64 65 29 3b 0a  trlen30(zMode);.
2d480 20 20 20 20 69 6e 74 20 63 32 20 3d 20 7a 4d 6f      int c2 = zMo
2d490 64 65 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 63  de[0];.    if( c
2d4a0 32 3d 3d 27 6c 27 20 26 26 20 6e 32 3e 32 20 26  2=='l' && n2>2 &
2d4b0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2d4c0 31 5d 2c 22 6c 69 6e 65 73 22 2c 6e 32 29 3d 3d  1],"lines",n2)==
2d4d0 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  0 ){.      p->mo
2d4e0 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 6e 65 3b 0a  de = MODE_Line;.
2d4f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
2d500 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
2d510 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20  >rowSeparator), 
2d520 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c  p->rowSeparator,
2d530 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20 7d   SEP_Row);.    }
2d540 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 63 27  else if( c2=='c'
2d550 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2d560 67 5b 31 5d 2c 22 63 6f 6c 75 6d 6e 73 22 2c 6e  g[1],"columns",n
2d570 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  2)==0 ){.      p
2d580 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43 6f  ->mode = MODE_Co
2d590 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69  lumn;.      sqli
2d5a0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
2d5b0 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  eof(p->rowSepara
2d5c0 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61  tor), p->rowSepa
2d5d0 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b  rator, SEP_Row);
2d5e0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
2d5f0 32 3d 3d 27 6c 27 20 26 26 20 6e 32 3e 32 20 26  2=='l' && n2>2 &
2d600 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2d610 31 5d 2c 22 6c 69 73 74 22 2c 6e 32 29 3d 3d 30  1],"list",n2)==0
2d620 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64   ){.      p->mod
2d630 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20  e = MODE_List;. 
2d640 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
2d650 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
2d660 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70  colSeparator), p
2d670 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20  ->colSeparator, 
2d680 53 45 50 5f 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  SEP_Column);.   
2d690 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2d6a0 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f  ntf(sizeof(p->ro
2d6b0 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e  wSeparator), p->
2d6c0 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45  rowSeparator, SE
2d6d0 50 5f 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73  P_Row);.    }els
2d6e0 65 20 69 66 28 20 63 32 3d 3d 27 68 27 20 26 26  e if( c2=='h' &&
2d6f0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31   strncmp(azArg[1
2d700 5d 2c 22 68 74 6d 6c 22 2c 6e 32 29 3d 3d 30 20  ],"html",n2)==0 
2d710 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  ){.      p->mode
2d720 20 3d 20 4d 4f 44 45 5f 48 74 6d 6c 3b 0a 20 20   = MODE_Html;.  
2d730 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d    }else if( c2==
2d740 27 74 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  't' && strncmp(a
2d750 7a 41 72 67 5b 31 5d 2c 22 74 63 6c 22 2c 6e 32  zArg[1],"tcl",n2
2d760 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  )==0 ){.      p-
2d770 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 54 63 6c  >mode = MODE_Tcl
2d780 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2d790 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
2d7a0 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
2d7b0 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
2d7c0 72 2c 20 53 45 50 5f 53 70 61 63 65 29 3b 0a 20  r, SEP_Space);. 
2d7d0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
2d7e0 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
2d7f0 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70  rowSeparator), p
2d800 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20  ->rowSeparator, 
2d810 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20 7d 65  SEP_Row);.    }e
2d820 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 63 27 20  lse if( c2=='c' 
2d830 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2d840 5b 31 5d 2c 22 63 73 76 22 2c 6e 32 29 3d 3d 30  [1],"csv",n2)==0
2d850 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64   ){.      p->mod
2d860 65 20 3d 20 4d 4f 44 45 5f 43 73 76 3b 0a 20 20  e = MODE_Csv;.  
2d870 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2d880 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63  intf(sizeof(p->c
2d890 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d  olSeparator), p-
2d8a0 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 53  >colSeparator, S
2d8b0 45 50 5f 43 6f 6d 6d 61 29 3b 0a 20 20 20 20 20  EP_Comma);.     
2d8c0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2d8d0 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53  f(sizeof(p->rowS
2d8e0 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f  eparator), p->ro
2d8f0 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f  wSeparator, SEP_
2d900 43 72 4c 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65  CrLf);.    }else
2d910 20 69 66 28 20 63 32 3d 3d 27 74 27 20 26 26 20   if( c2=='t' && 
2d920 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d  strncmp(azArg[1]
2d930 2c 22 74 61 62 73 22 2c 6e 32 29 3d 3d 30 20 29  ,"tabs",n2)==0 )
2d940 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20  {.      p->mode 
2d950 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20  = MODE_List;.   
2d960 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2d970 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f  ntf(sizeof(p->co
2d980 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e  lSeparator), p->
2d990 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 53 45  colSeparator, SE
2d9a0 50 5f 54 61 62 29 3b 0a 20 20 20 20 7d 65 6c 73  P_Tab);.    }els
2d9b0 65 20 69 66 28 20 63 32 3d 3d 27 69 27 20 26 26  e if( c2=='i' &&
2d9c0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31   strncmp(azArg[1
2d9d0 5d 2c 22 69 6e 73 65 72 74 22 2c 6e 32 29 3d 3d  ],"insert",n2)==
2d9e0 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  0 ){.      p->mo
2d9f0 64 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74  de = MODE_Insert
2da00 3b 0a 20 20 20 20 20 20 73 65 74 5f 74 61 62 6c  ;.      set_tabl
2da10 65 5f 6e 61 6d 65 28 70 2c 20 6e 41 72 67 3e 3d  e_name(p, nArg>=
2da20 33 20 3f 20 61 7a 41 72 67 5b 32 5d 20 3a 20 22  3 ? azArg[2] : "
2da30 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 7d 65 6c  table");.    }el
2da40 73 65 20 69 66 28 20 63 32 3d 3d 27 71 27 20 26  se if( c2=='q' &
2da50 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2da60 31 5d 2c 22 71 75 6f 74 65 22 2c 6e 32 29 3d 3d  1],"quote",n2)==
2da70 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  0 ){.      p->mo
2da80 64 65 20 3d 20 4d 4f 44 45 5f 51 75 6f 74 65 3b  de = MODE_Quote;
2da90 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
2daa0 32 3d 3d 27 61 27 20 26 26 20 73 74 72 6e 63 6d  2=='a' && strncm
2dab0 70 28 61 7a 41 72 67 5b 31 5d 2c 22 61 73 63 69  p(azArg[1],"asci
2dac0 69 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20  i",n2)==0 ){.   
2dad0 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
2dae0 45 5f 41 73 63 69 69 3b 0a 20 20 20 20 20 20 73  E_Ascii;.      s
2daf0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2db00 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70  sizeof(p->colSep
2db10 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53  arator), p->colS
2db20 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 55 6e  eparator, SEP_Un
2db30 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  it);.      sqlit
2db40 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
2db50 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  of(p->rowSeparat
2db60 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  or), p->rowSepar
2db70 61 74 6f 72 2c 20 53 45 50 5f 52 65 63 6f 72 64  ator, SEP_Record
2db80 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
2db90 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20 20   nArg==1 ){.    
2dba0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
2dbb0 6f 75 74 2c 20 22 63 75 72 72 65 6e 74 20 6f 75  out, "current ou
2dbc0 74 70 75 74 20 6d 6f 64 65 3a 20 25 73 5c 6e 22  tput mode: %s\n"
2dbd0 2c 20 6d 6f 64 65 44 65 73 63 72 5b 70 2d 3e 6d  , modeDescr[p->m
2dbe0 6f 64 65 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ode]);.    }else
2dbf0 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2dc00 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
2dc10 72 3a 20 6d 6f 64 65 20 73 68 6f 75 6c 64 20 62  r: mode should b
2dc20 65 20 6f 6e 65 20 6f 66 3a 20 22 0a 20 20 20 20  e one of: ".    
2dc30 20 20 20 20 20 22 61 73 63 69 69 20 63 6f 6c 75       "ascii colu
2dc40 6d 6e 20 63 73 76 20 68 74 6d 6c 20 69 6e 73 65  mn csv html inse
2dc50 72 74 20 6c 69 6e 65 20 6c 69 73 74 20 71 75 6f  rt line list quo
2dc60 74 65 20 74 61 62 73 20 74 63 6c 5c 6e 22 29 3b  te tabs tcl\n");
2dc70 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
2dc80 20 20 20 7d 0a 20 20 20 20 70 2d 3e 63 4d 6f 64     }.    p->cMod
2dc90 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 7d  e = p->mode;.  }
2dca0 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
2dcb0 6e 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  n' && strncmp(az
2dcc0 41 72 67 5b 30 5d 2c 20 22 6e 75 6c 6c 76 61 6c  Arg[0], "nullval
2dcd0 75 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ue", n)==0 ){.  
2dce0 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b    if( nArg==2 ){
2dcf0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
2dd00 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
2dd10 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 2c 20 70 2d  ->nullValue), p-
2dd20 3e 6e 75 6c 6c 56 61 6c 75 65 2c 0a 20 20 20 20  >nullValue,.    
2dd30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd40 20 20 20 22 25 2e 2a 73 22 2c 20 28 69 6e 74 29     "%.*s", (int)
2dd50 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 6e 75 6c  ArraySize(p->nul
2dd60 6c 56 61 6c 75 65 29 2d 31 2c 20 61 7a 41 72 67  lValue)-1, azArg
2dd70 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  [1]);.    }else{
2dd80 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
2dd90 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
2dda0 3a 20 2e 6e 75 6c 6c 76 61 6c 75 65 20 53 54 52  : .nullvalue STR
2ddb0 49 4e 47 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  ING\n");.      r
2ddc0 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
2ddd0 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
2dde0 6f 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  o' && strncmp(az
2ddf0 41 72 67 5b 30 5d 2c 20 22 6f 70 65 6e 22 2c 20  Arg[0], "open", 
2de00 6e 29 3d 3d 30 20 26 26 20 6e 3e 3d 32 20 29 7b  n)==0 && n>=2 ){
2de10 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 46  .    char *zNewF
2de20 69 6c 65 6e 61 6d 65 3b 20 20 2f 2a 20 4e 61 6d  ilename;  /* Nam
2de30 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
2de40 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a  e file to open *
2de50 2f 0a 20 20 20 20 69 6e 74 20 69 4e 61 6d 65 20  /.    int iName 
2de60 3d 20 31 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e  = 1;       /* In
2de70 64 65 78 20 69 6e 20 61 7a 41 72 67 5b 5d 20 6f  dex in azArg[] o
2de80 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 2a  f the filename *
2de90 2f 0a 20 20 20 20 69 6e 74 20 6e 65 77 46 6c 61  /.    int newFla
2dea0 67 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72  g = 0;     /* Tr
2deb0 75 65 20 74 6f 20 64 65 6c 65 74 65 20 66 69 6c  ue to delete fil
2dec0 65 20 62 65 66 6f 72 65 20 6f 70 65 6e 69 6e 67  e before opening
2ded0 20 2a 2f 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65   */.    /* Close
2dee0 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 64 61   the existing da
2def0 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 73 65  tabase */.    se
2df00 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c 6c 28  ssion_close_all(
2df10 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  p);.    sqlite3_
2df20 63 6c 6f 73 65 28 70 2d 3e 64 62 29 3b 0a 20 20  close(p->db);.  
2df30 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 20    p->db = 0;.   
2df40 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20   p->zDbFilename 
2df50 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  = 0;.    sqlite3
2df60 5f 66 72 65 65 28 70 2d 3e 7a 46 72 65 65 4f 6e  _free(p->zFreeOn
2df70 43 6c 6f 73 65 29 3b 0a 20 20 20 20 70 2d 3e 7a  Close);.    p->z
2df80 46 72 65 65 4f 6e 43 6c 6f 73 65 20 3d 20 30 3b  FreeOnClose = 0;
2df90 0a 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65  .    p->openMode
2dfa0 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e   = SHELL_OPEN_UN
2dfb0 53 50 45 43 3b 0a 20 20 20 20 2f 2a 20 43 68 65  SPEC;.    /* Che
2dfc0 63 6b 20 66 6f 72 20 63 6f 6d 6d 61 6e 64 2d 6c  ck for command-l
2dfd0 69 6e 65 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f  ine arguments */
2dfe0 0a 20 20 20 20 66 6f 72 28 69 4e 61 6d 65 3d 31  .    for(iName=1
2dff0 3b 20 69 4e 61 6d 65 3c 6e 41 72 67 20 26 26 20  ; iName<nArg && 
2e000 61 7a 41 72 67 5b 69 4e 61 6d 65 5d 5b 30 5d 3d  azArg[iName][0]=
2e010 3d 27 2d 27 3b 20 69 4e 61 6d 65 2b 2b 29 7b 0a  ='-'; iName++){.
2e020 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2e030 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 4e 61 6d   *z = azArg[iNam
2e040 65 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70  e];.      if( op
2e050 74 69 6f 6e 4d 61 74 63 68 28 7a 2c 22 6e 65 77  tionMatch(z,"new
2e060 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65  ") ){.        ne
2e070 77 46 6c 61 67 20 3d 20 31 3b 0a 23 69 66 64 65  wFlag = 1;.#ifde
2e080 66 20 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a 49  f SQLITE_HAVE_ZI
2e090 50 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  P.      }else if
2e0a0 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 7a 2c  ( optionMatch(z,
2e0b0 20 22 7a 69 70 22 29 20 29 7b 0a 20 20 20 20 20   "zip") ){.     
2e0c0 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d     p->openMode =
2e0d0 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46   SHELL_OPEN_ZIPF
2e0e0 49 4c 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ILE;.#endif.    
2e0f0 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 74 69    }else if( opti
2e100 6f 6e 4d 61 74 63 68 28 7a 2c 20 22 61 70 70 65  onMatch(z, "appe
2e110 6e 64 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20  nd") ){.        
2e120 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20 53 48  p->openMode = SH
2e130 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44 56  ELL_OPEN_APPENDV
2e140 46 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  FS;.      }else 
2e150 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b  if( z[0]=='-' ){
2e160 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
2e170 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e  intf(stderr, "un
2e180 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25 73  known option: %s
2e190 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20  \n", z);.       
2e1a0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
2e1b0 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
2e1c0 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d  nd_exit;.      }
2e1d0 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 66  .    }.    /* If
2e1e0 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 73   a filename is s
2e1f0 70 65 63 69 66 69 65 64 2c 20 74 72 79 20 74 6f  pecified, try to
2e200 20 6f 70 65 6e 20 69 74 20 66 69 72 73 74 20 2a   open it first *
2e210 2f 0a 20 20 20 20 7a 4e 65 77 46 69 6c 65 6e 61  /.    zNewFilena
2e220 6d 65 20 3d 20 6e 41 72 67 3e 69 4e 61 6d 65 20  me = nArg>iName 
2e230 3f 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  ? sqlite3_mprint
2e240 66 28 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 4e  f("%s", azArg[iN
2e250 61 6d 65 5d 29 20 3a 20 30 3b 0a 20 20 20 20 69  ame]) : 0;.    i
2e260 66 28 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 20  f( zNewFilename 
2e270 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77  ){.      if( new
2e280 46 6c 61 67 20 29 20 73 68 65 6c 6c 44 65 6c 65  Flag ) shellDele
2e290 74 65 46 69 6c 65 28 7a 4e 65 77 46 69 6c 65 6e  teFile(zNewFilen
2e2a0 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a  ame);.      p->z
2e2b0 44 62 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 4e 65  DbFilename = zNe
2e2c0 77 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20  wFilename;.     
2e2d0 20 6f 70 65 6e 5f 64 62 28 70 2c 20 31 29 3b 0a   open_db(p, 1);.
2e2e0 20 20 20 20 20 20 69 66 28 20 70 2d 3e 64 62 3d        if( p->db=
2e2f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  =0 ){.        ut
2e300 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2e310 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74  , "Error: cannot
2e320 20 6f 70 65 6e 20 27 25 73 27 5c 6e 22 2c 20 7a   open '%s'\n", z
2e330 4e 65 77 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  NewFilename);.  
2e340 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2e350 65 65 28 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 29  ee(zNewFilename)
2e360 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2e370 20 20 20 20 20 20 20 70 2d 3e 7a 46 72 65 65 4f         p->zFreeO
2e380 6e 43 6c 6f 73 65 20 3d 20 7a 4e 65 77 46 69 6c  nClose = zNewFil
2e390 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20  ename;.      }. 
2e3a0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
2e3b0 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  db==0 ){.      /
2e3c0 2a 20 41 73 20 61 20 66 61 6c 6c 2d 62 61 63 6b  * As a fall-back
2e3d0 20 6f 70 65 6e 20 61 20 54 45 4d 50 20 64 61 74   open a TEMP dat
2e3e0 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 70  abase */.      p
2e3f0 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d 20  ->zDbFilename = 
2e400 30 3b 0a 20 20 20 20 20 20 6f 70 65 6e 5f 64 62  0;.      open_db
2e410 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  (p, 0);.    }.  
2e420 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
2e430 27 6f 27 0a 20 20 20 26 26 20 28 73 74 72 6e 63  'o'.   && (strnc
2e440 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f 75  mp(azArg[0], "ou
2e450 74 70 75 74 22 2c 20 6e 29 3d 3d 30 20 7c 7c 20  tput", n)==0 || 
2e460 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2e470 2c 20 22 6f 6e 63 65 22 2c 20 6e 29 3d 3d 30 29  , "once", n)==0)
2e480 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  .  ){.    const 
2e490 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 6e 41  char *zFile = nA
2e4a0 72 67 3e 3d 32 20 3f 20 61 7a 41 72 67 5b 31 5d  rg>=2 ? azArg[1]
2e4b0 20 3a 20 22 73 74 64 6f 75 74 22 3b 0a 20 20 20   : "stdout";.   
2e4c0 20 69 66 28 20 6e 41 72 67 3e 32 20 29 7b 0a 20   if( nArg>2 ){. 
2e4d0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2e4e0 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
2e4f0 20 2e 25 73 20 46 49 4c 45 5c 6e 22 2c 20 61 7a   .%s FILE\n", az
2e500 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 72  Arg[0]);.      r
2e510 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74  c = 1;.      got
2e520 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
2e530 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  xit;.    }.    i
2e540 66 28 20 6e 3e 31 20 26 26 20 73 74 72 6e 63 6d  f( n>1 && strncm
2e550 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f 6e 63  p(azArg[0], "onc
2e560 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  e", n)==0 ){.   
2e570 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20 29 7b     if( nArg<2 ){
2e580 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
2e590 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
2e5a0 67 65 3a 20 2e 6f 6e 63 65 20 46 49 4c 45 5c 6e  ge: .once FILE\n
2e5b0 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ");.        rc =
2e5c0 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
2e5d0 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
2e5e0 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  it;.      }.    
2e5f0 20 20 70 2d 3e 6f 75 74 43 6f 75 6e 74 20 3d 20    p->outCount = 
2e600 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  2;.    }else{.  
2e610 20 20 20 20 70 2d 3e 6f 75 74 43 6f 75 6e 74 20      p->outCount 
2e620 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f  = 0;.    }.    o
2e630 75 74 70 75 74 5f 72 65 73 65 74 28 70 29 3b 0a  utput_reset(p);.
2e640 20 20 20 20 69 66 28 20 7a 46 69 6c 65 5b 30 5d      if( zFile[0]
2e650 3d 3d 27 7c 27 20 29 7b 0a 23 69 66 64 65 66 20  =='|' ){.#ifdef 
2e660 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f 50 45  SQLITE_OMIT_POPE
2e670 4e 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  N.      raw_prin
2e680 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
2e690 72 3a 20 70 69 70 65 73 20 61 72 65 20 6e 6f 74  r: pipes are not
2e6a0 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20 74 68   supported in th
2e6b0 69 73 20 4f 53 5c 6e 22 29 3b 0a 20 20 20 20 20  is OS\n");.     
2e6c0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 70   rc = 1;.      p
2e6d0 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a  ->out = stdout;.
2e6e0 23 65 6c 73 65 0a 20 20 20 20 20 20 70 2d 3e 6f  #else.      p->o
2e6f0 75 74 20 3d 20 70 6f 70 65 6e 28 7a 46 69 6c 65  ut = popen(zFile
2e700 20 2b 20 31 2c 20 22 77 22 29 3b 0a 20 20 20 20   + 1, "w");.    
2e710 20 20 69 66 28 20 70 2d 3e 6f 75 74 3d 3d 30 20    if( p->out==0 
2e720 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
2e730 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
2e740 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65  rror: cannot ope
2e750 6e 20 70 69 70 65 20 5c 22 25 73 5c 22 5c 6e 22  n pipe \"%s\"\n"
2e760 2c 20 7a 46 69 6c 65 20 2b 20 31 29 3b 0a 20 20  , zFile + 1);.  
2e770 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 73        p->out = s
2e780 74 64 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 72  tdout;.        r
2e790 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  c = 1;.      }el
2e7a0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
2e7b0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
2e7c0 65 6f 66 28 70 2d 3e 6f 75 74 66 69 6c 65 29 2c  eof(p->outfile),
2e7d0 20 70 2d 3e 6f 75 74 66 69 6c 65 2c 20 22 25 73   p->outfile, "%s
2e7e0 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20  ", zFile);.     
2e7f0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65   }.#endif.    }e
2e800 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6f 75  lse{.      p->ou
2e810 74 20 3d 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f  t = output_file_
2e820 6f 70 65 6e 28 7a 46 69 6c 65 29 3b 0a 20 20 20  open(zFile);.   
2e830 20 20 20 69 66 28 20 70 2d 3e 6f 75 74 3d 3d 30     if( p->out==0
2e840 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
2e850 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 22 6f 66  strcmp(zFile,"of
2e860 66 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  f")!=0 ){.      
2e870 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2e880 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 63  stderr,"Error: c
2e890 61 6e 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 5c  annot write to \
2e8a0 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 29  "%s\"\n", zFile)
2e8b0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2e8c0 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64      p->out = std
2e8d0 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20  out;.        rc 
2e8e0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73  = 1;.      } els
2e8f0 65 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e {.        sqli
2e900 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
2e910 65 6f 66 28 70 2d 3e 6f 75 74 66 69 6c 65 29 2c  eof(p->outfile),
2e920 20 70 2d 3e 6f 75 74 66 69 6c 65 2c 20 22 25 73   p->outfile, "%s
2e930 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20  ", zFile);.     
2e940 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
2e950 0a 0a 20 20 69 66 28 20 63 3d 3d 27 70 27 20 26  ..  if( c=='p' &
2e960 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d  & n>=3 && strncm
2e970 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 70 72 69  p(azArg[0], "pri
2e980 6e 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  nt", n)==0 ){.  
2e990 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
2e9a0 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=1; i<nArg; i+
2e9b0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3e  +){.      if( i>
2e9c0 31 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70  1 ) raw_printf(p
2e9d0 2d 3e 6f 75 74 2c 20 22 20 22 29 3b 0a 20 20 20  ->out, " ");.   
2e9e0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
2e9f0 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 61 7a 41  ->out, "%s", azA
2ea00 72 67 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  rg[i]);.    }.  
2ea10 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
2ea20 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d 65  out, "\n");.  }e
2ea30 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 70  lse..  if( c=='p
2ea40 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
2ea50 72 67 5b 30 5d 2c 20 22 70 72 6f 6d 70 74 22 2c  rg[0], "prompt",
2ea60 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   n)==0 ){.    if
2ea70 28 20 6e 41 72 67 20 3e 3d 20 32 29 20 7b 0a 20  ( nArg >= 2) {. 
2ea80 20 20 20 20 20 73 74 72 6e 63 70 79 28 6d 61 69       strncpy(mai
2ea90 6e 50 72 6f 6d 70 74 2c 61 7a 41 72 67 5b 31 5d  nPrompt,azArg[1]
2eaa0 2c 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28  ,(int)ArraySize(
2eab0 6d 61 69 6e 50 72 6f 6d 70 74 29 2d 31 29 3b 0a  mainPrompt)-1);.
2eac0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41      }.    if( nA
2ead0 72 67 20 3e 3d 20 33 29 20 7b 0a 20 20 20 20 20  rg >= 3) {.     
2eae0 20 73 74 72 6e 63 70 79 28 63 6f 6e 74 69 6e 75   strncpy(continu
2eaf0 65 50 72 6f 6d 70 74 2c 61 7a 41 72 67 5b 32 5d  ePrompt,azArg[2]
2eb00 2c 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28  ,(int)ArraySize(
2eb10 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 29 2d  continuePrompt)-
2eb20 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  1);.    }.  }els
2eb30 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 71 27 20  e..  if( c=='q' 
2eb40 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2eb50 5b 30 5d 2c 20 22 71 75 69 74 22 2c 20 6e 29 3d  [0], "quit", n)=
2eb60 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 32  =0 ){.    rc = 2
2eb70 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
2eb80 20 63 3d 3d 27 72 27 20 26 26 20 6e 3e 3d 33 20   c=='r' && n>=3 
2eb90 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2eba0 5b 30 5d 2c 20 22 72 65 61 64 22 2c 20 6e 29 3d  [0], "read", n)=
2ebb0 3d 30 20 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a  =0 ){.    FILE *
2ebc0 61 6c 74 3b 0a 20 20 20 20 69 66 28 20 6e 41 72  alt;.    if( nAr
2ebd0 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 61  g!=2 ){.      ra
2ebe0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2ebf0 20 22 55 73 61 67 65 3a 20 2e 72 65 61 64 20 46   "Usage: .read F
2ec00 49 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  ILE\n");.      r
2ec10 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74  c = 1;.      got
2ec20 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
2ec30 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  xit;.    }.    a
2ec40 6c 74 20 3d 20 66 6f 70 65 6e 28 61 7a 41 72 67  lt = fopen(azArg
2ec50 5b 31 5d 2c 20 22 72 62 22 29 3b 0a 20 20 20 20  [1], "rb");.    
2ec60 69 66 28 20 61 6c 74 3d 3d 30 20 29 7b 0a 20 20  if( alt==0 ){.  
2ec70 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2ec80 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 63  stderr,"Error: c
2ec90 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c  annot open \"%s\
2eca0 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  "\n", azArg[1]);
2ecb0 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
2ecc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ecd0 72 63 20 3d 20 70 72 6f 63 65 73 73 5f 69 6e 70  rc = process_inp
2ece0 75 74 28 70 2c 20 61 6c 74 29 3b 0a 20 20 20 20  ut(p, alt);.    
2ecf0 20 20 66 63 6c 6f 73 65 28 61 6c 74 29 3b 0a 20    fclose(alt);. 
2ed00 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
2ed10 69 66 28 20 63 3d 3d 27 72 27 20 26 26 20 6e 3e  if( c=='r' && n>
2ed20 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =3 && strncmp(az
2ed30 41 72 67 5b 30 5d 2c 20 22 72 65 73 74 6f 72 65  Arg[0], "restore
2ed40 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
2ed50 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 72 63  const char *zSrc
2ed60 46 69 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  File;.    const 
2ed70 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 20 20 73  char *zDb;.    s
2ed80 71 6c 69 74 65 33 20 2a 70 53 72 63 3b 0a 20 20  qlite3 *pSrc;.  
2ed90 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
2eda0 20 2a 70 42 61 63 6b 75 70 3b 0a 20 20 20 20 69   *pBackup;.    i
2edb0 6e 74 20 6e 54 69 6d 65 6f 75 74 20 3d 20 30 3b  nt nTimeout = 0;
2edc0 0a 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  ..    if( nArg==
2edd0 32 20 29 7b 0a 20 20 20 20 20 20 7a 53 72 63 46  2 ){.      zSrcF
2ede0 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a  ile = azArg[1];.
2edf0 20 20 20 20 20 20 7a 44 62 20 3d 20 22 6d 61 69        zDb = "mai
2ee00 6e 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  n";.    }else if
2ee10 28 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20 20 20  ( nArg==3 ){.   
2ee20 20 20 20 7a 53 72 63 46 69 6c 65 20 3d 20 61 7a     zSrcFile = az
2ee30 41 72 67 5b 32 5d 3b 0a 20 20 20 20 20 20 7a 44  Arg[2];.      zD
2ee40 62 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20  b = azArg[1];.  
2ee50 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2ee60 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
2ee70 2c 20 22 55 73 61 67 65 3a 20 2e 72 65 73 74 6f  , "Usage: .resto
2ee80 72 65 20 3f 44 42 3f 20 46 49 4c 45 5c 6e 22 29  re ?DB? FILE\n")
2ee90 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
2eea0 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
2eeb0 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
2eec0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
2eed0 69 74 65 33 5f 6f 70 65 6e 28 7a 53 72 63 46 69  ite3_open(zSrcFi
2eee0 6c 65 2c 20 26 70 53 72 63 29 3b 0a 20 20 20 20  le, &pSrc);.    
2eef0 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
2ef00 4b 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  K ){.      utf8_
2ef10 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2ef20 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70  Error: cannot op
2ef30 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 53  en \"%s\"\n", zS
2ef40 72 63 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 73  rcFile);.      s
2ef50 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 53 72  qlite3_close(pSr
2ef60 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  c);.      return
2ef70 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70   1;.    }.    op
2ef80 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
2ef90 20 70 42 61 63 6b 75 70 20 3d 20 73 71 6c 69 74   pBackup = sqlit
2efa0 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28 70  e3_backup_init(p
2efb0 2d 3e 64 62 2c 20 7a 44 62 2c 20 70 53 72 63 2c  ->db, zDb, pSrc,
2efc0 20 22 6d 61 69 6e 22 29 3b 0a 20 20 20 20 69 66   "main");.    if
2efd0 28 20 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a  ( pBackup==0 ){.
2efe0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2eff0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
2f000 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33  : %s\n", sqlite3
2f010 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
2f020 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63  .      sqlite3_c
2f030 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 20 20  lose(pSrc);.    
2f040 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
2f050 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72 63  }.    while( (rc
2f060 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75   = sqlite3_backu
2f070 70 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31  p_step(pBackup,1
2f080 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  00))==SQLITE_OK.
2f090 20 20 20 20 20 20 20 20 20 20 7c 7c 20 72 63 3d            || rc=
2f0a0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 20 29 7b  =SQLITE_BUSY  ){
2f0b0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
2f0c0 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
2f0d0 20 20 20 20 20 20 69 66 28 20 6e 54 69 6d 65 6f        if( nTimeo
2f0e0 75 74 2b 2b 20 3e 3d 20 33 20 29 20 62 72 65 61  ut++ >= 3 ) brea
2f0f0 6b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  k;.        sqlit
2f100 65 33 5f 73 6c 65 65 70 28 31 30 30 29 3b 0a 20  e3_sleep(100);. 
2f110 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2f120 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
2f130 66 69 6e 69 73 68 28 70 42 61 63 6b 75 70 29 3b  finish(pBackup);
2f140 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
2f150 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
2f160 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65    rc = 0;.    }e
2f170 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
2f180 54 45 5f 42 55 53 59 20 7c 7c 20 72 63 3d 3d 53  TE_BUSY || rc==S
2f190 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a  QLITE_LOCKED ){.
2f1a0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2f1b0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
2f1c0 20 73 6f 75 72 63 65 20 64 61 74 61 62 61 73 65   source database
2f1d0 20 69 73 20 62 75 73 79 5c 6e 22 29 3b 0a 20 20   is busy\n");.  
2f1e0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2f1f0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 74 66  }else{.      utf
2f200 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2f210 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20   "Error: %s\n", 
2f220 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
2f230 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 72 63  ->db));.      rc
2f240 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
2f250 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 53  sqlite3_close(pS
2f260 72 63 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 0a 20  rc);.  }else... 
2f270 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20 73   if( c=='s' && s
2f280 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2f290 20 22 73 63 61 6e 73 74 61 74 73 22 2c 20 6e 29   "scanstats", n)
2f2a0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
2f2b0 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg==2 ){.      
2f2c0 70 2d 3e 73 63 61 6e 73 74 61 74 73 4f 6e 20 3d  p->scanstatsOn =
2f2d0 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a   booleanValue(az
2f2e0 41 72 67 5b 31 5d 29 3b 0a 23 69 66 6e 64 65 66  Arg[1]);.#ifndef
2f2f0 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
2f300 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20  TMT_SCANSTATUS. 
2f310 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2f320 73 74 64 65 72 72 2c 20 22 57 61 72 6e 69 6e 67  stderr, "Warning
2f330 3a 20 2e 73 63 61 6e 73 74 61 74 73 20 6e 6f 74  : .scanstats not
2f340 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68   available in th
2f350 69 73 20 62 75 69 6c 64 2e 5c 6e 22 29 3b 0a 23  is build.\n");.#
2f360 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
2f370 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
2f380 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
2f390 3a 20 2e 73 63 61 6e 73 74 61 74 73 20 6f 6e 7c  : .scanstats on|
2f3a0 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  off\n");.      r
2f3b0 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
2f3c0 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
2f3d0 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  s' && strncmp(az
2f3e0 41 72 67 5b 30 5d 2c 20 22 73 63 68 65 6d 61 22  Arg[0], "schema"
2f3f0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53  , n)==0 ){.    S
2f400 68 65 6c 6c 54 65 78 74 20 73 53 65 6c 65 63 74  hellText sSelect
2f410 3b 0a 20 20 20 20 53 68 65 6c 6c 53 74 61 74 65  ;.    ShellState
2f420 20 64 61 74 61 3b 0a 20 20 20 20 63 68 61 72 20   data;.    char 
2f430 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  *zErrMsg = 0;.  
2f440 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
2f450 69 76 20 3d 20 22 28 22 3b 0a 20 20 20 20 63 6f  iv = "(";.    co
2f460 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
2f470 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 53 63  = 0;.    int iSc
2f480 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 69 6e  hema = 0;.    in
2f490 74 20 62 44 65 62 75 67 20 3d 20 30 3b 0a 20 20  t bDebug = 0;.  
2f4a0 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 20 20 6f    int ii;..    o
2f4b0 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
2f4c0 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 2c 20    memcpy(&data, 
2f4d0 70 2c 20 73 69 7a 65 6f 66 28 64 61 74 61 29 29  p, sizeof(data))
2f4e0 3b 0a 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48  ;.    data.showH
2f4f0 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 64  eader = 0;.    d
2f500 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61  ata.cMode = data
2f510 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 53 65 6d  .mode = MODE_Sem
2f520 69 3b 0a 20 20 20 20 69 6e 69 74 54 65 78 74 28  i;.    initText(
2f530 26 73 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 66  &sSelect);.    f
2f540 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e 41 72 67  or(ii=1; ii<nArg
2f550 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ; ii++){.      i
2f560 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 61  f( optionMatch(a
2f570 7a 41 72 67 5b 69 69 5d 2c 22 69 6e 64 65 6e 74  zArg[ii],"indent
2f580 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 64 61  ") ){.        da
2f590 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e  ta.cMode = data.
2f5a0 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 50 72 65 74  mode = MODE_Pret
2f5b0 74 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ty;.      }else 
2f5c0 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28  if( optionMatch(
2f5d0 61 7a 41 72 67 5b 69 69 5d 2c 22 64 65 62 75 67  azArg[ii],"debug
2f5e0 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 44  ") ){.        bD
2f5f0 65 62 75 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  ebug = 1;.      
2f600 7d 65 6c 73 65 20 69 66 28 20 7a 4e 61 6d 65 3d  }else if( zName=
2f610 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4e  =0 ){.        zN
2f620 61 6d 65 20 3d 20 61 7a 41 72 67 5b 69 69 5d 3b  ame = azArg[ii];
2f630 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
2f640 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2f650 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
2f660 20 2e 73 63 68 65 6d 61 20 3f 2d 2d 69 6e 64 65   .schema ?--inde
2f670 6e 74 3f 20 3f 4c 49 4b 45 2d 50 41 54 54 45 52  nt? ?LIKE-PATTER
2f680 4e 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  N?\n");.        
2f690 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
2f6a0 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
2f6b0 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a  d_exit;.      }.
2f6c0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 4e      }.    if( zN
2f6d0 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame!=0 ){.      
2f6e0 69 6e 74 20 69 73 4d 61 73 74 65 72 20 3d 20 73  int isMaster = s
2f6f0 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 7a  qlite3_strlike(z
2f700 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 6d 61  Name, "sqlite_ma
2f710 73 74 65 72 22 2c 20 30 29 3d 3d 30 3b 0a 20 20  ster", 0)==0;.  
2f720 20 20 20 20 69 66 28 20 69 73 4d 61 73 74 65 72      if( isMaster
2f730 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 6c   || sqlite3_strl
2f740 69 6b 65 28 7a 4e 61 6d 65 2c 22 73 71 6c 69 74  ike(zName,"sqlit
2f750 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 2c 30  e_temp_master",0
2f760 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2f770 63 68 61 72 20 2a 6e 65 77 5f 61 72 67 76 5b 32  char *new_argv[2
2f780 5d 2c 20 2a 6e 65 77 5f 63 6f 6c 76 5b 32 5d 3b  ], *new_colv[2];
2f790 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 61 72 67  .        new_arg
2f7a0 76 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d  v[0] = sqlite3_m
2f7b0 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
2f7c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 43                "C
2f7d0 52 45 41 54 45 20 54 41 42 4c 45 20 25 73 20 28  REATE TABLE %s (
2f7e0 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  \n".            
2f7f0 20 20 20 20 20 20 20 20 20 20 22 20 20 74 79 70            "  typ
2f800 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20  e text,\n".     
2f810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f820 20 22 20 20 6e 61 6d 65 20 74 65 78 74 2c 5c 6e   "  name text,\n
2f830 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
2f840 20 20 20 20 20 20 20 20 22 20 20 74 62 6c 5f 6e          "  tbl_n
2f850 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20  ame text,\n".   
2f860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f870 20 20 20 22 20 20 72 6f 6f 74 70 61 67 65 20 69     "  rootpage i
2f880 6e 74 65 67 65 72 2c 5c 6e 22 0a 20 20 20 20 20  nteger,\n".     
2f890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f8a0 20 22 20 20 73 71 6c 20 74 65 78 74 5c 6e 22 0a   "  sql text\n".
2f8b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f8c0 20 20 20 20 20 20 22 29 22 2c 20 69 73 4d 61 73        ")", isMas
2f8d0 74 65 72 20 3f 20 22 73 71 6c 69 74 65 5f 6d 61  ter ? "sqlite_ma
2f8e0 73 74 65 72 22 20 3a 20 22 73 71 6c 69 74 65 5f  ster" : "sqlite_
2f8f0 74 65 6d 70 5f 6d 61 73 74 65 72 22 29 3b 0a 20  temp_master");. 
2f900 20 20 20 20 20 20 20 6e 65 77 5f 61 72 67 76 5b         new_argv[
2f910 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  1] = 0;.        
2f920 6e 65 77 5f 63 6f 6c 76 5b 30 5d 20 3d 20 22 73  new_colv[0] = "s
2f930 71 6c 22 3b 0a 20 20 20 20 20 20 20 20 6e 65 77  ql";.        new
2f940 5f 63 6f 6c 76 5b 31 5d 20 3d 20 30 3b 0a 20 20  _colv[1] = 0;.  
2f950 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 28 26        callback(&
2f960 64 61 74 61 2c 20 31 2c 20 6e 65 77 5f 61 72 67  data, 1, new_arg
2f970 76 2c 20 6e 65 77 5f 63 6f 6c 76 29 3b 0a 20 20  v, new_colv);.  
2f980 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2f990 65 65 28 6e 65 77 5f 61 72 67 76 5b 30 5d 29 3b  ee(new_argv[0]);
2f9a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2f9b0 20 20 20 69 66 28 20 7a 44 69 76 20 29 7b 0a 20     if( zDiv ){. 
2f9c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
2f9d0 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
2f9e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2f9f0 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
2fa00 62 2c 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20  b, "SELECT name 
2fa10 46 52 4f 4d 20 70 72 61 67 6d 61 5f 64 61 74 61  FROM pragma_data
2fa20 62 61 73 65 5f 6c 69 73 74 22 2c 0a 20 20 20 20  base_list",.    
2fa30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa40 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 26 70            -1, &p
2fa50 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Stmt, 0);.      
2fa60 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
2fa70 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2fa80 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73  derr, "Error: %s
2fa90 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
2faa0 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
2fab0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
2fac0 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
2fad0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
2fae0 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
2faf0 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
2fb00 20 20 20 20 7d 0a 20 20 20 20 20 20 61 70 70 65      }.      appe
2fb10 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
2fb20 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f   "SELECT sql FRO
2fb30 4d 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 53  M", 0);.      iS
2fb40 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20  chema = 0;.     
2fb50 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f   while( sqlite3_
2fb60 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c  step(pStmt)==SQL
2fb70 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
2fb80 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2fb90 44 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  Db = (const char
2fba0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
2fbb0 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b  _text(pStmt, 0);
2fbc0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 53  .        char zS
2fbd0 63 4e 75 6d 5b 33 30 5d 3b 0a 20 20 20 20 20 20  cNum[30];.      
2fbe0 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2fbf0 74 66 28 73 69 7a 65 6f 66 28 7a 53 63 4e 75 6d  tf(sizeof(zScNum
2fc00 29 2c 20 7a 53 63 4e 75 6d 2c 20 22 25 64 22 2c  ), zScNum, "%d",
2fc10 20 2b 2b 69 53 63 68 65 6d 61 29 3b 0a 20 20 20   ++iSchema);.   
2fc20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
2fc30 26 73 53 65 6c 65 63 74 2c 20 7a 44 69 76 2c 20  &sSelect, zDiv, 
2fc40 30 29 3b 0a 20 20 20 20 20 20 20 20 7a 44 69 76  0);.        zDiv
2fc50 20 3d 20 22 20 55 4e 49 4f 4e 20 41 4c 4c 20 22   = " UNION ALL "
2fc60 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ;.        append
2fc70 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22  Text(&sSelect, "
2fc80 53 45 4c 45 43 54 20 73 68 65 6c 6c 5f 61 64 64  SELECT shell_add
2fc90 5f 73 63 68 65 6d 61 28 73 71 6c 2c 22 2c 20 30  _schema(sql,", 0
2fca0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
2fcb0 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
2fcc0 44 62 2c 20 22 6d 61 69 6e 22 29 21 3d 30 20 29  Db, "main")!=0 )
2fcd0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 70 65  {.          appe
2fce0 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
2fcf0 20 7a 44 62 2c 20 27 22 27 29 3b 0a 20 20 20 20   zDb, '"');.    
2fd00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2fd10 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
2fd20 26 73 53 65 6c 65 63 74 2c 20 22 4e 55 4c 4c 22  &sSelect, "NULL"
2fd30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
2fd40 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
2fd50 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 2c 6e  xt(&sSelect, ",n
2fd60 61 6d 65 29 20 41 53 20 73 71 6c 2c 20 74 79 70  ame) AS sql, typ
2fd70 65 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d  e, tbl_name, nam
2fd80 65 2c 20 72 6f 77 69 64 2c 22 2c 20 30 29 3b 0a  e, rowid,", 0);.
2fd90 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
2fda0 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 53 63  xt(&sSelect, zSc
2fdb0 4e 75 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Num, 0);.       
2fdc0 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
2fdd0 6c 65 63 74 2c 20 22 20 41 53 20 73 6e 75 6d 2c  lect, " AS snum,
2fde0 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   ", 0);.        
2fdf0 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
2fe00 65 63 74 2c 20 7a 44 62 2c 20 27 5c 27 27 29 3b  ect, zDb, '\'');
2fe10 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
2fe20 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 20  ext(&sSelect, " 
2fe30 41 53 20 73 6e 61 6d 65 20 46 52 4f 4d 20 22 2c  AS sname FROM ",
2fe40 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70   0);.        app
2fe50 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
2fe60 2c 20 7a 44 62 2c 20 27 22 27 29 3b 0a 20 20 20  , zDb, '"');.   
2fe70 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
2fe80 26 73 53 65 6c 65 63 74 2c 20 22 2e 73 71 6c 69  &sSelect, ".sqli
2fe90 74 65 5f 6d 61 73 74 65 72 22 2c 20 30 29 3b 0a  te_master", 0);.
2fea0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
2feb0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
2fec0 53 74 6d 74 29 3b 0a 23 69 66 64 65 66 20 53 51  Stmt);.#ifdef SQ
2fed0 4c 49 54 45 5f 49 4e 54 52 4f 53 50 45 43 54 49  LITE_INTROSPECTI
2fee0 4f 4e 5f 50 52 41 47 4d 41 53 0a 20 20 20 20 20  ON_PRAGMAS.     
2fef0 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
2ff00 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
2ff10 28 26 73 53 65 6c 65 63 74 2c 0a 20 20 20 20 20  (&sSelect,.     
2ff20 20 20 20 20 20 20 22 20 55 4e 49 4f 4e 20 41 4c        " UNION AL
2ff30 4c 20 53 45 4c 45 43 54 20 73 68 65 6c 6c 5f 6d  L SELECT shell_m
2ff40 6f 64 75 6c 65 5f 73 63 68 65 6d 61 28 6e 61 6d  odule_schema(nam
2ff50 65 29 2c 22 0a 20 20 20 20 20 20 20 20 20 20 20  e),".           
2ff60 22 20 27 74 61 62 6c 65 27 2c 20 6e 61 6d 65 2c  " 'table', name,
2ff70 20 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20 39 65 2b   name, name, 9e+
2ff80 39 39 2c 20 27 6d 61 69 6e 27 20 46 52 4f 4d 20  99, 'main' FROM 
2ff90 70 72 61 67 6d 61 5f 6d 6f 64 75 6c 65 5f 6c 69  pragma_module_li
2ffa0 73 74 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  st", 0);.      }
2ffb0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 61 70  .#endif.      ap
2ffc0 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63  pendText(&sSelec
2ffd0 74 2c 20 22 29 20 57 48 45 52 45 20 22 2c 20 30  t, ") WHERE ", 0
2ffe0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 61  );.      if( zNa
2fff0 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  me ){.        ch
30000 61 72 20 2a 7a 51 61 72 67 20 3d 20 73 71 6c 69  ar *zQarg = sqli
30010 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 51 22  te3_mprintf("%Q"
30020 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
30030 20 20 69 66 28 20 73 74 72 63 68 72 28 7a 4e 61    if( strchr(zNa
30040 6d 65 2c 20 27 2e 27 29 20 29 7b 0a 20 20 20 20  me, '.') ){.    
30050 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
30060 28 26 73 53 65 6c 65 63 74 2c 20 22 6c 6f 77 65  (&sSelect, "lowe
30070 72 28 70 72 69 6e 74 66 28 27 25 73 2e 25 73 27  r(printf('%s.%s'
30080 2c 73 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65 29  ,sname,tbl_name)
30090 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  )", 0);.        
300a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
300b0 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
300c0 6c 65 63 74 2c 20 22 6c 6f 77 65 72 28 74 62 6c  lect, "lower(tbl
300d0 5f 6e 61 6d 65 29 22 2c 20 30 29 3b 0a 20 20 20  _name)", 0);.   
300e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
300f0 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
30100 63 74 2c 20 73 74 72 63 68 72 28 7a 4e 61 6d 65  ct, strchr(zName
30110 2c 20 27 2a 27 29 20 3f 20 22 20 47 4c 4f 42 20  , '*') ? " GLOB 
30120 22 20 3a 20 22 20 4c 49 4b 45 20 22 2c 20 30 29  " : " LIKE ", 0)
30130 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ;.        append
30140 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a  Text(&sSelect, z
30150 51 61 72 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  Qarg, 0);.      
30160 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
30170 65 6c 65 63 74 2c 20 22 20 41 4e 44 20 22 2c 20  elect, " AND ", 
30180 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
30190 74 65 33 5f 66 72 65 65 28 7a 51 61 72 67 29 3b  te3_free(zQarg);
301a0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
301b0 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
301c0 63 74 2c 20 22 74 79 70 65 21 3d 27 6d 65 74 61  ct, "type!='meta
301d0 27 20 41 4e 44 20 73 71 6c 20 49 53 20 4e 4f 54  ' AND sql IS NOT
301e0 20 4e 55 4c 4c 22 0a 20 20 20 20 20 20 20 20 20   NULL".         
301f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30200 20 20 22 20 4f 52 44 45 52 20 42 59 20 73 6e 75    " ORDER BY snu
30210 6d 2c 20 72 6f 77 69 64 22 2c 20 30 29 3b 0a 20  m, rowid", 0);. 
30220 20 20 20 20 20 69 66 28 20 62 44 65 62 75 67 20       if( bDebug 
30230 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
30240 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
30250 53 51 4c 3a 20 25 73 3b 5c 6e 22 2c 20 73 53 65  SQL: %s;\n", sSe
30260 6c 65 63 74 2e 7a 29 3b 0a 20 20 20 20 20 20 7d  lect.z);.      }
30270 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
30280 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
30290 70 2d 3e 64 62 2c 20 73 53 65 6c 65 63 74 2e 7a  p->db, sSelect.z
302a0 2c 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74  , callback, &dat
302b0 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  a, &zErrMsg);.  
302c0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 72 65 65      }.      free
302d0 54 65 78 74 28 26 73 53 65 6c 65 63 74 29 3b 0a  Text(&sSelect);.
302e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 45      }.    if( zE
302f0 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 75  rrMsg ){.      u
30300 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
30310 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  r,"Error: %s\n",
30320 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20   zErrMsg);.     
30330 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
30340 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 63  rrMsg);.      rc
30350 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
30360 69 66 28 20 72 63 20 21 3d 20 53 51 4c 49 54 45  if( rc != SQLITE
30370 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 61 77  _OK ){.      raw
30380 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  _printf(stderr,"
30390 45 72 72 6f 72 3a 20 71 75 65 72 79 69 6e 67 20  Error: querying 
303a0 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69  schema informati
303b0 6f 6e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  on\n");.      rc
303c0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
303d0 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  .      rc = 0;. 
303e0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69     }.  }else..#i
303f0 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
30400 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69 6e  _DEBUG) && defin
30410 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
30420 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a 20 20  _SELECTTRACE).  
30430 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20 6e 3d  if( c=='s' && n=
30440 3d 31 31 20 26 26 20 73 74 72 6e 63 6d 70 28 61  =11 && strncmp(a
30450 7a 41 72 67 5b 30 5d 2c 20 22 73 65 6c 65 63 74  zArg[0], "select
30460 74 72 61 63 65 22 2c 20 6e 29 3d 3d 30 20 29 7b  trace", n)==0 ){
30470 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
30480 63 74 54 72 61 63 65 20 3d 20 28 69 6e 74 29 69  ctTrace = (int)i
30490 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72  ntegerValue(azAr
304a0 67 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  g[1]);.  }else.#
304b0 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
304c0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
304d0 5f 53 45 53 53 49 4f 4e 29 0a 20 20 69 66 28 20  _SESSION).  if( 
304e0 63 3d 3d 27 73 27 20 26 26 20 73 74 72 6e 63 6d  c=='s' && strncm
304f0 70 28 61 7a 41 72 67 5b 30 5d 2c 22 73 65 73 73  p(azArg[0],"sess
30500 69 6f 6e 22 2c 6e 29 3d 3d 30 20 26 26 20 6e 3e  ion",n)==0 && n>
30510 3d 33 20 29 7b 0a 20 20 20 20 4f 70 65 6e 53 65  =3 ){.    OpenSe
30520 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 20  ssion *pSession 
30530 3d 20 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 30  = &p->aSession[0
30540 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 7a  ];.    char **az
30550 43 6d 64 20 3d 20 26 61 7a 41 72 67 5b 31 5d 3b  Cmd = &azArg[1];
30560 0a 20 20 20 20 69 6e 74 20 69 53 65 73 20 3d 20  .    int iSes = 
30570 30 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6d 64 20  0;.    int nCmd 
30580 3d 20 6e 41 72 67 20 2d 20 31 3b 0a 20 20 20 20  = nArg - 1;.    
30590 69 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 6e  int i;.    if( n
305a0 41 72 67 3c 3d 31 20 29 20 67 6f 74 6f 20 73 65  Arg<=1 ) goto se
305b0 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72  ssion_syntax_err
305c0 6f 72 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28  or;.    open_db(
305d0 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e  p, 0);.    if( n
305e0 41 72 67 3e 3d 33 20 29 7b 0a 20 20 20 20 20 20  Arg>=3 ){.      
305f0 66 6f 72 28 69 53 65 73 3d 30 3b 20 69 53 65 73  for(iSes=0; iSes
30600 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b 20 69 53  <p->nSession; iS
30610 65 73 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  es++){.        i
30620 66 28 20 73 74 72 63 6d 70 28 70 2d 3e 61 53 65  f( strcmp(p->aSe
30630 73 73 69 6f 6e 5b 69 53 65 73 5d 2e 7a 4e 61 6d  ssion[iSes].zNam
30640 65 2c 20 61 7a 41 72 67 5b 31 5d 29 3d 3d 30 20  e, azArg[1])==0 
30650 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
30660 0a 20 20 20 20 20 20 69 66 28 20 69 53 65 73 3c  .      if( iSes<
30670 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20  p->nSession ){. 
30680 20 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e 20         pSession 
30690 3d 20 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 69  = &p->aSession[i
306a0 53 65 73 5d 3b 0a 20 20 20 20 20 20 20 20 61 7a  Ses];.        az
306b0 43 6d 64 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e  Cmd++;.        n
306c0 43 6d 64 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c  Cmd--;.      }el
306d0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 53 65 73  se{.        pSes
306e0 73 69 6f 6e 20 3d 20 26 70 2d 3e 61 53 65 73 73  sion = &p->aSess
306f0 69 6f 6e 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  ion[0];.        
30700 69 53 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  iSes = 0;.      
30710 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
30720 2e 73 65 73 73 69 6f 6e 20 61 74 74 61 63 68 20  .session attach 
30730 54 41 42 4c 45 0a 20 20 20 20 2a 2a 20 49 6e 76  TABLE.    ** Inv
30740 6f 6b 65 20 74 68 65 20 73 71 6c 69 74 65 33 73  oke the sqlite3s
30750 65 73 73 69 6f 6e 5f 61 74 74 61 63 68 28 29 20  ession_attach() 
30760 69 6e 74 65 72 66 61 63 65 20 74 6f 20 61 74 74  interface to att
30770 61 63 68 20 61 20 70 61 72 74 69 63 75 6c 61 72  ach a particular
30780 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 73 6f  .    ** table so
30790 20 74 68 61 74 20 69 74 20 69 73 20 6e 65 76 65   that it is neve
307a0 72 20 66 69 6c 74 65 72 65 64 2e 0a 20 20 20 20  r filtered..    
307b0 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  */.    if( strcm
307c0 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 61 74 74 61  p(azCmd[0],"atta
307d0 63 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ch")==0 ){.     
307e0 20 69 66 28 20 6e 43 6d 64 21 3d 32 20 29 20 67   if( nCmd!=2 ) g
307f0 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74  oto session_synt
30800 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  ax_error;.      
30810 69 66 28 20 70 53 65 73 73 69 6f 6e 2d 3e 70 3d  if( pSession->p=
30820 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65  =0 ){.        se
30830 73 73 69 6f 6e 5f 6e 6f 74 5f 6f 70 65 6e 3a 0a  ssion_not_open:.
30840 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
30850 74 66 28 73 74 64 65 72 72 2c 20 22 45 52 52 4f  tf(stderr, "ERRO
30860 52 3a 20 4e 6f 20 73 65 73 73 69 6f 6e 73 20 61  R: No sessions a
30870 72 65 20 6f 70 65 6e 5c 6e 22 29 3b 0a 20 20 20  re open\n");.   
30880 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
30890 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 73 65    rc = sqlite3se
308a0 73 73 69 6f 6e 5f 61 74 74 61 63 68 28 70 53 65  ssion_attach(pSe
308b0 73 73 69 6f 6e 2d 3e 70 2c 20 61 7a 43 6d 64 5b  ssion->p, azCmd[
308c0 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1]);.        if(
308d0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
308e0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
308f0 72 72 2c 20 22 45 52 52 4f 52 3a 20 73 71 6c 69  rr, "ERROR: sqli
30900 74 65 33 73 65 73 73 69 6f 6e 5f 61 74 74 61 63  te3session_attac
30910 68 28 29 20 72 65 74 75 72 6e 73 20 25 64 5c 6e  h() returns %d\n
30920 22 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  ", rc);.        
30930 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20    rc = 0;.      
30940 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
30950 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73  }else..    /* .s
30960 65 73 73 69 6f 6e 20 63 68 61 6e 67 65 73 65 74  ession changeset
30970 20 46 49 4c 45 0a 20 20 20 20 2a 2a 20 2e 73 65   FILE.    ** .se
30980 73 73 69 6f 6e 20 70 61 74 63 68 73 65 74 20 46  ssion patchset F
30990 49 4c 45 0a 20 20 20 20 2a 2a 20 57 72 69 74 65  ILE.    ** Write
309a0 20 61 20 63 68 61 6e 67 65 73 65 74 20 6f 72 20   a changeset or 
309b0 70 61 74 63 68 73 65 74 20 69 6e 74 6f 20 61 20  patchset into a 
309c0 66 69 6c 65 2e 20 20 54 68 65 20 66 69 6c 65 20  file.  The file 
309d0 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a  is overwritten..
309e0 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
309f0 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22  trcmp(azCmd[0],"
30a00 63 68 61 6e 67 65 73 65 74 22 29 3d 3d 30 20 7c  changeset")==0 |
30a10 7c 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30  | strcmp(azCmd[0
30a20 5d 2c 22 70 61 74 63 68 73 65 74 22 29 3d 3d 30  ],"patchset")==0
30a30 20 29 7b 0a 20 20 20 20 20 20 46 49 4c 45 20 2a   ){.      FILE *
30a40 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  out = 0;.      i
30a50 66 28 20 6e 43 6d 64 21 3d 32 20 29 20 67 6f 74  f( nCmd!=2 ) got
30a60 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78  o session_syntax
30a70 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 66  _error;.      if
30a80 28 20 70 53 65 73 73 69 6f 6e 2d 3e 70 3d 3d 30  ( pSession->p==0
30a90 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f   ) goto session_
30aa0 6e 6f 74 5f 6f 70 65 6e 3b 0a 20 20 20 20 20 20  not_open;.      
30ab0 6f 75 74 20 3d 20 66 6f 70 65 6e 28 61 7a 43 6d  out = fopen(azCm
30ac0 64 5b 31 5d 2c 20 22 77 62 22 29 3b 0a 20 20 20  d[1], "wb");.   
30ad0 20 20 20 69 66 28 20 6f 75 74 3d 3d 30 20 29 7b     if( out==0 ){
30ae0 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
30af0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 52  intf(stderr, "ER
30b00 52 4f 52 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  ROR: cannot open
30b10 20 5c 22 25 73 5c 22 20 66 6f 72 20 77 72 69 74   \"%s\" for writ
30b20 69 6e 67 5c 6e 22 2c 20 61 7a 43 6d 64 5b 31 5d  ing\n", azCmd[1]
30b30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
30b40 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 43 68          int szCh
30b50 6e 67 3b 0a 20 20 20 20 20 20 20 20 76 6f 69 64  ng;.        void
30b60 20 2a 70 43 68 6e 67 3b 0a 20 20 20 20 20 20 20   *pChng;.       
30b70 20 69 66 28 20 61 7a 43 6d 64 5b 30 5d 5b 30 5d   if( azCmd[0][0]
30b80 3d 3d 27 63 27 20 29 7b 0a 20 20 20 20 20 20 20  =='c' ){.       
30b90 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 73     rc = sqlite3s
30ba0 65 73 73 69 6f 6e 5f 63 68 61 6e 67 65 73 65 74  ession_changeset
30bb0 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 26 73  (pSession->p, &s
30bc0 7a 43 68 6e 67 2c 20 26 70 43 68 6e 67 29 3b 0a  zChng, &pChng);.
30bd0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
30be0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
30bf0 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 70 61 74  lite3session_pat
30c00 63 68 73 65 74 28 70 53 65 73 73 69 6f 6e 2d 3e  chset(pSession->
30c10 70 2c 20 26 73 7a 43 68 6e 67 2c 20 26 70 43 68  p, &szChng, &pCh
30c20 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ng);.        }. 
30c30 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
30c40 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74  .          print
30c50 66 28 22 45 72 72 6f 72 3a 20 65 72 72 6f 72 20  f("Error: error 
30c60 63 6f 64 65 20 25 64 5c 6e 22 2c 20 72 63 29 3b  code %d\n", rc);
30c70 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
30c80 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
30c90 20 20 20 20 20 69 66 28 20 70 43 68 6e 67 0a 20       if( pChng. 
30ca0 20 20 20 20 20 20 20 20 20 26 26 20 66 77 72 69           && fwri
30cb0 74 65 28 70 43 68 6e 67 2c 20 73 7a 43 68 6e 67  te(pChng, szChng
30cc0 2c 20 31 2c 20 6f 75 74 29 21 3d 31 20 29 7b 0a  , 1, out)!=1 ){.
30cd0 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
30ce0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 52  intf(stderr, "ER
30cf0 52 4f 52 3a 20 46 61 69 6c 65 64 20 74 6f 20 77  ROR: Failed to w
30d00 72 69 74 65 20 65 6e 74 69 72 65 20 25 64 2d 62  rite entire %d-b
30d10 79 74 65 20 6f 75 74 70 75 74 5c 6e 22 2c 0a 20  yte output\n",. 
30d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30d30 20 73 7a 43 68 6e 67 29 3b 0a 20 20 20 20 20 20   szChng);.      
30d40 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
30d50 74 65 33 5f 66 72 65 65 28 70 43 68 6e 67 29 3b  te3_free(pChng);
30d60 0a 20 20 20 20 20 20 20 20 66 63 6c 6f 73 65 28  .        fclose(
30d70 6f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  out);.      }.  
30d80 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20    }else..    /* 
30d90 2e 73 65 73 73 69 6f 6e 20 63 6c 6f 73 65 0a 20  .session close. 
30da0 20 20 20 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20     ** Close the 
30db0 69 64 65 6e 74 69 66 69 65 64 20 73 65 73 73 69  identified sessi
30dc0 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  on.    */.    if
30dd0 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30  ( strcmp(azCmd[0
30de0 5d 2c 20 22 63 6c 6f 73 65 22 29 3d 3d 30 20 29  ], "close")==0 )
30df0 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6d 64  {.      if( nCmd
30e00 21 3d 31 20 29 20 67 6f 74 6f 20 73 65 73 73 69  !=1 ) goto sessi
30e10 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b  on_syntax_error;
30e20 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53  .      if( p->nS
30e30 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  ession ){.      
30e40 20 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 28    session_close(
30e50 70 53 65 73 73 69 6f 6e 29 3b 0a 20 20 20 20 20  pSession);.     
30e60 20 20 20 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 69     p->aSession[i
30e70 53 65 73 5d 20 3d 20 70 2d 3e 61 53 65 73 73 69  Ses] = p->aSessi
30e80 6f 6e 5b 2d 2d 70 2d 3e 6e 53 65 73 73 69 6f 6e  on[--p->nSession
30e90 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
30ea0 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65  else..    /* .se
30eb0 73 73 69 6f 6e 20 65 6e 61 62 6c 65 20 3f 42 4f  ssion enable ?BO
30ec0 4f 4c 45 41 4e 3f 0a 20 20 20 20 2a 2a 20 51 75  OLEAN?.    ** Qu
30ed0 65 72 79 20 6f 72 20 73 65 74 20 74 68 65 20 65  ery or set the e
30ee0 6e 61 62 6c 65 20 66 6c 61 67 0a 20 20 20 20 2a  nable flag.    *
30ef0 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  /.    if( strcmp
30f00 28 61 7a 43 6d 64 5b 30 5d 2c 20 22 65 6e 61 62  (azCmd[0], "enab
30f10 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  le")==0 ){.     
30f20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 69   int ii;.      i
30f30 66 28 20 6e 43 6d 64 3e 32 20 29 20 67 6f 74 6f  f( nCmd>2 ) goto
30f40 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f   session_syntax_
30f50 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 69 20  error;.      ii 
30f60 3d 20 6e 43 6d 64 3d 3d 31 20 3f 20 2d 31 20 3a  = nCmd==1 ? -1 :
30f70 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a   booleanValue(az
30f80 43 6d 64 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69  Cmd[1]);.      i
30f90 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29  f( p->nSession )
30fa0 7b 0a 20 20 20 20 20 20 20 20 69 69 20 3d 20 73  {.        ii = s
30fb0 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 65 6e  qlite3session_en
30fc0 61 62 6c 65 28 70 53 65 73 73 69 6f 6e 2d 3e 70  able(pSession->p
30fd0 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 20 20 75  , ii);.        u
30fe0 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
30ff0 74 2c 20 22 73 65 73 73 69 6f 6e 20 25 73 20 65  t, "session %s e
31000 6e 61 62 6c 65 20 66 6c 61 67 20 3d 20 25 64 5c  nable flag = %d\
31010 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
31020 20 20 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e          pSession
31030 2d 3e 7a 4e 61 6d 65 2c 20 69 69 29 3b 0a 20 20  ->zName, ii);.  
31040 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a      }.    }else.
31050 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e  .    /* .session
31060 20 66 69 6c 74 65 72 20 47 4c 4f 42 20 2e 2e 2e   filter GLOB ...
31070 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20 61 20 6c  ..    ** Set a l
31080 69 73 74 20 6f 66 20 47 4c 4f 42 20 70 61 74 74  ist of GLOB patt
31090 65 72 6e 73 20 6f 66 20 74 61 62 6c 65 20 6e 61  erns of table na
310a0 6d 65 73 20 74 6f 20 62 65 20 65 78 63 6c 75 64  mes to be exclud
310b0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
310c0 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b  f( strcmp(azCmd[
310d0 30 5d 2c 20 22 66 69 6c 74 65 72 22 29 3d 3d 30  0], "filter")==0
310e0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69   ){.      int ii
310f0 2c 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 69  , nByte;.      i
31100 66 28 20 6e 43 6d 64 3c 32 20 29 20 67 6f 74 6f  f( nCmd<2 ) goto
31110 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f   session_syntax_
31120 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 66 28  error;.      if(
31130 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a   p->nSession ){.
31140 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30          for(ii=0
31150 3b 20 69 69 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e  ; ii<pSession->n
31160 46 69 6c 74 65 72 3b 20 69 69 2b 2b 29 7b 0a 20  Filter; ii++){. 
31170 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
31180 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e  _free(pSession->
31190 61 7a 46 69 6c 74 65 72 5b 69 69 5d 29 3b 0a 20  azFilter[ii]);. 
311a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
311b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53   sqlite3_free(pS
311c0 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72  ession->azFilter
311d0 29 3b 0a 20 20 20 20 20 20 20 20 6e 42 79 74 65  );.        nByte
311e0 20 3d 20 73 69 7a 65 6f 66 28 70 53 65 73 73 69   = sizeof(pSessi
311f0 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 30 5d 29  on->azFilter[0])
31200 2a 28 6e 43 6d 64 2d 31 29 3b 0a 20 20 20 20 20  *(nCmd-1);.     
31210 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46     pSession->azF
31220 69 6c 74 65 72 20 3d 20 73 71 6c 69 74 65 33 5f  ilter = sqlite3_
31230 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b  malloc( nByte );
31240 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65  .        if( pSe
31250 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 3d  ssion->azFilter=
31260 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
31270 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
31280 72 2c 20 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f  r, "Error: out o
31290 72 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20  r memory\n");.  
312a0 20 20 20 20 20 20 20 20 65 78 69 74 28 31 29 3b          exit(1);
312b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
312c0 20 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c     for(ii=1; ii<
312d0 6e 43 6d 64 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  nCmd; ii++){.   
312e0 20 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d         pSession-
312f0 3e 61 7a 46 69 6c 74 65 72 5b 69 69 2d 31 5d 20  >azFilter[ii-1] 
31300 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
31310 66 28 22 25 73 22 2c 20 61 7a 43 6d 64 5b 69 69  f("%s", azCmd[ii
31320 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
31330 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e        pSession->
31340 6e 46 69 6c 74 65 72 20 3d 20 69 69 2d 31 3b 0a  nFilter = ii-1;.
31350 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
31360 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69  e..    /* .sessi
31370 6f 6e 20 69 6e 64 69 72 65 63 74 20 3f 42 4f 4f  on indirect ?BOO
31380 4c 45 41 4e 3f 0a 20 20 20 20 2a 2a 20 51 75 65  LEAN?.    ** Que
31390 72 79 20 6f 72 20 73 65 74 20 74 68 65 20 69 6e  ry or set the in
313a0 64 69 72 65 63 74 20 66 6c 61 67 0a 20 20 20 20  direct flag.    
313b0 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  */.    if( strcm
313c0 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22 69 6e 64  p(azCmd[0], "ind
313d0 69 72 65 63 74 22 29 3d 3d 30 20 29 7b 0a 20 20  irect")==0 ){.  
313e0 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
313f0 20 20 69 66 28 20 6e 43 6d 64 3e 32 20 29 20 67    if( nCmd>2 ) g
31400 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74  oto session_synt
31410 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  ax_error;.      
31420 69 69 20 3d 20 6e 43 6d 64 3d 3d 31 20 3f 20 2d  ii = nCmd==1 ? -
31430 31 20 3a 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  1 : booleanValue
31440 28 61 7a 43 6d 64 5b 31 5d 29 3b 0a 20 20 20 20  (azCmd[1]);.    
31450 20 20 69 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f    if( p->nSessio
31460 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 69 20  n ){.        ii 
31470 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e  = sqlite3session
31480 5f 69 6e 64 69 72 65 63 74 28 70 53 65 73 73 69  _indirect(pSessi
31490 6f 6e 2d 3e 70 2c 20 69 69 29 3b 0a 20 20 20 20  on->p, ii);.    
314a0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
314b0 70 2d 3e 6f 75 74 2c 20 22 73 65 73 73 69 6f 6e  p->out, "session
314c0 20 25 73 20 69 6e 64 69 72 65 63 74 20 66 6c 61   %s indirect fla
314d0 67 20 3d 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20  g = %d\n",.     
314e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
314f0 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 2c 20  Session->zName, 
31500 69 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ii);.      }.   
31510 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e   }else..    /* .
31520 73 65 73 73 69 6f 6e 20 69 73 65 6d 70 74 79 0a  session isempty.
31530 20 20 20 20 2a 2a 20 44 65 74 65 72 6d 69 6e 65      ** Determine
31540 20 69 66 20 74 68 65 20 73 65 73 73 69 6f 6e 20   if the session 
31550 69 73 20 65 6d 70 74 79 0a 20 20 20 20 2a 2f 0a  is empty.    */.
31560 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
31570 7a 43 6d 64 5b 30 5d 2c 20 22 69 73 65 6d 70 74  zCmd[0], "isempt
31580 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  y")==0 ){.      
31590 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 69 66  int ii;.      if
315a0 28 20 6e 43 6d 64 21 3d 31 20 29 20 67 6f 74 6f  ( nCmd!=1 ) goto
315b0 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f   session_syntax_
315c0 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 66 28  error;.      if(
315d0 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a   p->nSession ){.
315e0 20 20 20 20 20 20 20 20 69 69 20 3d 20 73 71 6c          ii = sql
315f0 69 74 65 33 73 65 73 73 69 6f 6e 5f 69 73 65 6d  ite3session_isem
31600 70 74 79 28 70 53 65 73 73 69 6f 6e 2d 3e 70 29  pty(pSession->p)
31610 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  ;.        utf8_p
31620 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 73  rintf(p->out, "s
31630 65 73 73 69 6f 6e 20 25 73 20 69 73 65 6d 70 74  ession %s isempt
31640 79 20 66 6c 61 67 20 3d 20 25 64 5c 6e 22 2c 0a  y flag = %d\n",.
31650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31660 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e      pSession->zN
31670 61 6d 65 2c 20 69 69 29 3b 0a 20 20 20 20 20 20  ame, ii);.      
31680 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20  }.    }else..   
31690 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 6c 69 73   /* .session lis
316a0 74 0a 20 20 20 20 2a 2a 20 4c 69 73 74 20 61 6c  t.    ** List al
316b0 6c 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  l currently open
316c0 20 73 65 73 73 69 6f 6e 73 0a 20 20 20 20 2a 2f   sessions.    */
316d0 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
316e0 61 7a 43 6d 64 5b 30 5d 2c 22 6c 69 73 74 22 29  azCmd[0],"list")
316f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ==0 ){.      for
31700 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 65 73 73  (i=0; i<p->nSess
31710 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ion; i++){.     
31720 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
31730 2d 3e 6f 75 74 2c 20 22 25 64 20 25 73 5c 6e 22  ->out, "%d %s\n"
31740 2c 20 69 2c 20 70 2d 3e 61 53 65 73 73 69 6f 6e  , i, p->aSession
31750 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
31760 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20    }.    }else.. 
31770 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 6f     /* .session o
31780 70 65 6e 20 44 42 20 4e 41 4d 45 0a 20 20 20 20  pen DB NAME.    
31790 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 73 65  ** Open a new se
317a0 73 73 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d  ssion called NAM
317b0 45 20 6f 6e 20 74 68 65 20 61 74 74 61 63 68 65  E on the attache
317c0 64 20 64 61 74 61 62 61 73 65 20 44 42 2e 0a 20  d database DB.. 
317d0 20 20 20 2a 2a 20 44 42 20 69 73 20 6e 6f 72 6d     ** DB is norm
317e0 61 6c 6c 79 20 22 6d 61 69 6e 22 2e 0a 20 20 20  ally "main"..   
317f0 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63   */.    if( strc
31800 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 6f 70 65  mp(azCmd[0],"ope
31810 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n")==0 ){.      
31820 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
31830 20 20 20 69 66 28 20 6e 43 6d 64 21 3d 33 20 29     if( nCmd!=3 )
31840 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79   goto session_sy
31850 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20  ntax_error;.    
31860 20 20 7a 4e 61 6d 65 20 3d 20 61 7a 43 6d 64 5b    zName = azCmd[
31870 32 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4e  2];.      if( zN
31880 61 6d 65 5b 30 5d 3d 3d 30 20 29 20 67 6f 74 6f  ame[0]==0 ) goto
31890 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f   session_syntax_
318a0 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 66 6f 72  error;.      for
318b0 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 65 73 73  (i=0; i<p->nSess
318c0 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ion; i++){.     
318d0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 70 2d     if( strcmp(p-
318e0 3e 61 53 65 73 73 69 6f 6e 5b 69 5d 2e 7a 4e 61  >aSession[i].zNa
318f0 6d 65 2c 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  me,zName)==0 ){.
31900 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
31910 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53  rintf(stderr, "S
31920 65 73 73 69 6f 6e 20 5c 22 25 73 5c 22 20 61 6c  ession \"%s\" al
31930 72 65 61 64 79 20 65 78 69 73 74 73 5c 6e 22 2c  ready exists\n",
31940 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
31950 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
31960 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20  mand_exit;.     
31970 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
31980 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 73 73 69     if( p->nSessi
31990 6f 6e 3e 3d 41 72 72 61 79 53 69 7a 65 28 70 2d  on>=ArraySize(p-
319a0 3e 61 53 65 73 73 69 6f 6e 29 20 29 7b 0a 20 20  >aSession) ){.  
319b0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
319c0 28 73 74 64 65 72 72 2c 20 22 4d 61 78 69 6d 75  (stderr, "Maximu
319d0 6d 20 6f 66 20 25 64 20 73 65 73 73 69 6f 6e 73  m of %d sessions
319e0 5c 6e 22 2c 20 41 72 72 61 79 53 69 7a 65 28 70  \n", ArraySize(p
319f0 2d 3e 61 53 65 73 73 69 6f 6e 29 29 3b 0a 20 20  ->aSession));.  
31a00 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
31a10 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
31a20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 65 73      }.      pSes
31a30 73 69 6f 6e 20 3d 20 26 70 2d 3e 61 53 65 73 73  sion = &p->aSess
31a40 69 6f 6e 5b 70 2d 3e 6e 53 65 73 73 69 6f 6e 5d  ion[p->nSession]
31a50 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
31a60 69 74 65 33 73 65 73 73 69 6f 6e 5f 63 72 65 61  ite3session_crea
31a70 74 65 28 70 2d 3e 64 62 2c 20 61 7a 43 6d 64 5b  te(p->db, azCmd[
31a80 31 5d 2c 20 26 70 53 65 73 73 69 6f 6e 2d 3e 70  1], &pSession->p
31a90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
31aa0 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  ){.        raw_p
31ab0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 43  rintf(stderr, "C
31ac0 61 6e 6e 6f 74 20 6f 70 65 6e 20 73 65 73 73 69  annot open sessi
31ad0 6f 6e 3a 20 65 72 72 6f 72 20 63 6f 64 65 3d 25  on: error code=%
31ae0 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20 20  d\n", rc);.     
31af0 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 20     rc = 0;.     
31b00 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
31b10 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20  mand_exit;.     
31b20 20 7d 0a 20 20 20 20 20 20 70 53 65 73 73 69 6f   }.      pSessio
31b30 6e 2d 3e 6e 46 69 6c 74 65 72 20 3d 20 30 3b 0a  n->nFilter = 0;.
31b40 20 20 20 20 20 20 73 71 6c 69 74 65 33 73 65 73        sqlite3ses
31b50 73 69 6f 6e 5f 74 61 62 6c 65 5f 66 69 6c 74 65  sion_table_filte
31b60 72 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 73  r(pSession->p, s
31b70 65 73 73 69 6f 6e 5f 66 69 6c 74 65 72 2c 20 70  ession_filter, p
31b80 53 65 73 73 69 6f 6e 29 3b 0a 20 20 20 20 20 20  Session);.      
31b90 70 2d 3e 6e 53 65 73 73 69 6f 6e 2b 2b 3b 0a 20  p->nSession++;. 
31ba0 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 7a       pSession->z
31bb0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Name = sqlite3_m
31bc0 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 4e 61  printf("%s", zNa
31bd0 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 20  me);.    }else. 
31be0 20 20 20 2f 2a 20 49 66 20 6e 6f 20 63 6f 6d 6d     /* If no comm
31bf0 61 6e 64 20 6e 61 6d 65 20 6d 61 74 63 68 65 73  and name matches
31c00 2c 20 73 68 6f 77 20 61 20 73 79 6e 74 61 78 20  , show a syntax 
31c10 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 73 65 73  error */.    ses
31c20 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f  sion_syntax_erro
31c30 72 3a 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 68  r:.    session_h
31c40 65 6c 70 28 70 29 3b 0a 20 20 7d 65 6c 73 65 0a  elp(p);.  }else.
31c50 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
31c60 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
31c70 20 55 6e 64 6f 63 75 6d 65 6e 74 65 64 20 63 6f   Undocumented co
31c80 6d 6d 61 6e 64 73 20 66 6f 72 20 69 6e 74 65 72  mmands for inter
31c90 6e 61 6c 20 74 65 73 74 69 6e 67 2e 20 20 53 75  nal testing.  Su
31ca0 62 6a 65 63 74 20 74 6f 20 63 68 61 6e 67 65 0a  bject to change.
31cb0 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 6e 6f 74    ** without not
31cc0 69 63 65 2e 20 2a 2f 0a 20 20 69 66 28 20 63 3d  ice. */.  if( c=
31cd0 3d 27 73 27 20 26 26 20 6e 3e 3d 31 30 20 26 26  ='s' && n>=10 &&
31ce0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
31cf0 5d 2c 20 22 73 65 6c 66 74 65 73 74 2d 22 2c 20  ], "selftest-", 
31d00 39 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  9)==0 ){.    if(
31d10 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
31d20 5d 2b 39 2c 20 22 62 6f 6f 6c 65 61 6e 22 2c 20  ]+9, "boolean", 
31d30 6e 2d 39 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  n-9)==0 ){.     
31d40 20 69 6e 74 20 69 2c 20 76 3b 0a 20 20 20 20 20   int i, v;.     
31d50 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67   for(i=1; i<nArg
31d60 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
31d70 76 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  v = booleanValue
31d80 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20  (azArg[i]);.    
31d90 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
31da0 70 2d 3e 6f 75 74 2c 20 22 25 73 3a 20 25 64 20  p->out, "%s: %d 
31db0 30 78 25 78 5c 6e 22 2c 20 61 7a 41 72 67 5b 69  0x%x\n", azArg[i
31dc0 5d 2c 20 76 2c 20 76 29 3b 0a 20 20 20 20 20 20  ], v, v);.      
31dd0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
31de0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
31df0 2b 39 2c 20 22 69 6e 74 65 67 65 72 22 2c 20 6e  +9, "integer", n
31e00 2d 39 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -9)==0 ){.      
31e10 69 6e 74 20 69 3b 20 73 71 6c 69 74 65 33 5f 69  int i; sqlite3_i
31e20 6e 74 36 34 20 76 3b 0a 20 20 20 20 20 20 66 6f  nt64 v;.      fo
31e30 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=1; i<nArg; i
31e40 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
31e50 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20 20  r zBuf[200];.   
31e60 20 20 20 20 20 76 20 3d 20 69 6e 74 65 67 65 72       v = integer
31e70 56 61 6c 75 65 28 61 7a 41 72 67 5b 69 5d 29 3b  Value(azArg[i]);
31e80 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
31e90 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
31ea0 28 7a 42 75 66 29 2c 7a 42 75 66 2c 22 25 73 3a  (zBuf),zBuf,"%s:
31eb0 20 25 6c 6c 64 20 30 78 25 6c 6c 78 5c 6e 22 2c   %lld 0x%llx\n",
31ec0 20 61 7a 41 72 67 5b 69 5d 2c 76 2c 76 29 3b 0a   azArg[i],v,v);.
31ed0 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
31ee0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
31ef0 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 7d  , zBuf);.      }
31f00 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23  .    }.  }else.#
31f10 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 3d 3d  endif..  if( c==
31f20 27 73 27 20 26 26 20 6e 3e 3d 34 20 26 26 20 73  's' && n>=4 && s
31f30 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
31f40 22 73 65 6c 66 74 65 73 74 22 2c 6e 29 3d 3d 30  "selftest",n)==0
31f50 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 49 73 49   ){.    int bIsI
31f60 6e 69 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nit = 0;        
31f70 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 69 74   /* True to init
31f80 69 61 6c 69 7a 65 20 74 68 65 20 53 45 4c 46 54  ialize the SELFT
31f90 45 53 54 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  EST table */.   
31fa0 20 69 6e 74 20 62 56 65 72 62 6f 73 65 20 3d 20   int bVerbose = 
31fb0 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72  0;        /* Ver
31fc0 62 6f 73 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20  bose output */. 
31fd0 20 20 20 69 6e 74 20 62 53 65 6c 66 74 65 73 74     int bSelftest
31fe0 45 78 69 73 74 73 3b 20 20 20 20 20 2f 2a 20 54  Exists;     /* T
31ff0 72 75 65 20 69 66 20 53 45 4c 46 54 45 53 54 20  rue if SELFTEST 
32000 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a  already exists *
32010 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20 6b 3b 20  /.    int i, k; 
32020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32030 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
32040 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 54 65 73 74  */.    int nTest
32050 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
32060 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 73  /* Number of tes
32070 74 73 20 72 75 6e 73 20 2a 2f 0a 20 20 20 20 69  ts runs */.    i
32080 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20 20  nt nErr = 0;    
32090 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
320a0 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e  r of errors seen
320b0 20 2a 2f 0a 20 20 20 20 53 68 65 6c 6c 54 65 78   */.    ShellTex
320c0 74 20 73 74 72 3b 20 20 20 20 20 20 20 20 20 20  t str;          
320d0 20 2f 2a 20 41 6e 73 77 65 72 20 66 6f 72 20 61   /* Answer for a
320e0 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 73 71   query */.    sq
320f0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
32100 74 20 3d 20 30 3b 20 2f 2a 20 51 75 65 72 79 20  t = 0; /* Query 
32110 61 67 61 69 6e 73 74 20 74 68 65 20 53 45 4c 46  against the SELF
32120 54 45 53 54 20 74 61 62 6c 65 20 2a 2f 0a 0a 20  TEST table */.. 
32130 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 30 29 3b     open_db(p,0);
32140 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
32150 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
32160 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
32170 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20  = azArg[i];.    
32180 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20    if( z[0]=='-' 
32190 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a  && z[1]=='-' ) z
321a0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  ++;.      if( st
321b0 72 63 6d 70 28 7a 2c 22 2d 69 6e 69 74 22 29 3d  rcmp(z,"-init")=
321c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 49  =0 ){.        bI
321d0 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  sInit = 1;.     
321e0 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28   }else.      if(
321f0 20 73 74 72 63 6d 70 28 7a 2c 22 2d 76 22 29 3d   strcmp(z,"-v")=
32200 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 56  =0 ){.        bV
32210 65 72 62 6f 73 65 2b 2b 3b 0a 20 20 20 20 20 20  erbose++;.      
32220 7d 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 20 20  }else.      {.  
32230 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
32240 66 28 73 74 64 65 72 72 2c 20 22 55 6e 6b 6e 6f  f(stderr, "Unkno
32250 77 6e 20 6f 70 74 69 6f 6e 20 5c 22 25 73 5c 22  wn option \"%s\"
32260 20 6f 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20   on \"%s\"\n",. 
32270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32280 20 20 20 61 7a 41 72 67 5b 69 5d 2c 20 61 7a 41     azArg[i], azA
32290 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[0]);.        
322a0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
322b0 72 2c 20 22 53 68 6f 75 6c 64 20 62 65 20 6f 6e  r, "Should be on
322c0 65 20 6f 66 3a 20 2d 2d 69 6e 69 74 20 2d 76 5c  e of: --init -v\
322d0 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  n");.        rc 
322e0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 1;.        got
322f0 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
32300 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xit;.      }.   
32310 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
32320 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
32330 6d 65 74 61 64 61 74 61 28 70 2d 3e 64 62 2c 22  metadata(p->db,"
32340 6d 61 69 6e 22 2c 22 73 65 6c 66 74 65 73 74 22  main","selftest"
32350 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 29 0a 20 20  ,0,0,0,0,0,0).  
32360 20 20 20 20 20 20 20 20 20 21 3d 20 53 51 4c 49           != SQLI
32370 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 62  TE_OK ){.      b
32380 53 65 6c 66 74 65 73 74 45 78 69 73 74 73 20 3d  SelftestExists =
32390 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
323a0 20 20 20 20 20 62 53 65 6c 66 74 65 73 74 45 78       bSelftestEx
323b0 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ists = 1;.    }.
323c0 20 20 20 20 69 66 28 20 62 49 73 49 6e 69 74 20      if( bIsInit 
323d0 29 7b 0a 20 20 20 20 20 20 63 72 65 61 74 65 53  ){.      createS
323e0 65 6c 66 74 65 73 74 54 61 62 6c 65 28 70 29 3b  elftestTable(p);
323f0 0a 20 20 20 20 20 20 62 53 65 6c 66 74 65 73 74  .      bSelftest
32400 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20  Exists = 1;.    
32410 7d 0a 20 20 20 20 69 6e 69 74 54 65 78 74 28 26  }.    initText(&
32420 73 74 72 29 3b 0a 20 20 20 20 61 70 70 65 6e 64  str);.    append
32430 54 65 78 74 28 26 73 74 72 2c 20 22 78 22 2c 20  Text(&str, "x", 
32440 30 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 62 53  0);.    for(k=bS
32450 65 6c 66 74 65 73 74 45 78 69 73 74 73 3b 20 6b  elftestExists; k
32460 3e 3d 30 3b 20 6b 2d 2d 29 7b 0a 20 20 20 20 20  >=0; k--){.     
32470 20 69 66 28 20 6b 3d 3d 31 20 29 7b 0a 20 20 20   if( k==1 ){.   
32480 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
32490 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
324a0 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
324b0 22 53 45 4c 45 43 54 20 74 6e 6f 2c 6f 70 2c 63  "SELECT tno,op,c
324c0 6d 64 2c 61 6e 73 20 46 52 4f 4d 20 73 65 6c 66  md,ans FROM self
324d0 74 65 73 74 20 4f 52 44 45 52 20 42 59 20 74 6e  test ORDER BY tn
324e0 6f 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  o",.            
324f0 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
32500 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
32510 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
32520 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
32530 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 22 56  db,.          "V
32540 41 4c 55 45 53 28 30 2c 27 6d 65 6d 6f 27 2c 27  ALUES(0,'memo','
32550 4d 69 73 73 69 6e 67 20 53 45 4c 46 54 45 53 54  Missing SELFTEST
32560 20 74 61 62 6c 65 20 2d 20 64 65 66 61 75 6c 74   table - default
32570 20 63 68 65 63 6b 73 20 6f 6e 6c 79 27 2c 27 27   checks only',''
32580 29 2c 22 0a 20 20 20 20 20 20 20 20 20 20 22 20  ),".          " 
32590 20 20 20 20 20 28 31 2c 27 72 75 6e 27 2c 27 50       (1,'run','P
325a0 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
325b0 63 68 65 63 6b 27 2c 27 6f 6b 27 29 22 2c 0a 20  check','ok')",. 
325c0 20 20 20 20 20 20 20 20 20 2d 31 2c 20 26 70 53           -1, &pS
325d0 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  tmt, 0);.      }
325e0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
325f0 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
32600 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
32610 6f 72 20 71 75 65 72 79 69 6e 67 20 74 68 65 20  or querying the 
32620 73 65 6c 66 74 65 73 74 20 74 61 62 6c 65 5c 6e  selftest table\n
32630 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ");.        rc =
32640 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   1;.        sqli
32650 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
32660 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  mt);.        got
32670 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
32680 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xit;.      }.   
32690 20 20 20 66 6f 72 28 69 3d 31 3b 20 73 71 6c 69     for(i=1; sqli
326a0 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
326b0 3d 53 51 4c 49 54 45 5f 52 4f 57 3b 20 69 2b 2b  =SQLITE_ROW; i++
326c0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74  ){.        int t
326d0 6e 6f 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  no = sqlite3_col
326e0 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30  umn_int(pStmt, 0
326f0 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  );.        const
32700 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20 28 63 6f   char *zOp = (co
32710 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
32720 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
32730 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  tmt, 1);.       
32740 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
32750 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  l = (const char*
32760 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
32770 74 65 78 74 28 70 53 74 6d 74 2c 20 32 29 3b 0a  text(pStmt, 2);.
32780 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
32790 61 72 20 2a 7a 41 6e 73 20 3d 20 28 63 6f 6e 73  ar *zAns = (cons
327a0 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
327b0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
327c0 74 2c 20 33 29 3b 0a 0a 20 20 20 20 20 20 20 20  t, 3);..        
327d0 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  k = 0;.        i
327e0 66 28 20 62 56 65 72 62 6f 73 65 3e 30 20 29 7b  f( bVerbose>0 ){
327f0 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
32800 2a 7a 51 75 6f 74 65 20 3d 20 73 71 6c 69 74 65  *zQuote = sqlite
32810 33 5f 6d 70 72 69 6e 74 66 28 22 25 71 22 2c 20  3_mprintf("%q", 
32820 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  zSql);.         
32830 20 70 72 69 6e 74 66 28 22 25 64 3a 20 25 73 20   printf("%d: %s 
32840 25 73 5c 6e 22 2c 20 74 6e 6f 2c 20 7a 4f 70 2c  %s\n", tno, zOp,
32850 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20   zSql);.        
32860 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
32870 51 75 6f 74 65 29 3b 0a 20 20 20 20 20 20 20 20  Quote);.        
32880 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74  }.        if( st
32890 72 63 6d 70 28 7a 4f 70 2c 22 6d 65 6d 6f 22 29  rcmp(zOp,"memo")
328a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
328b0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
328c0 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 53 71  out, "%s\n", zSq
328d0 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  l);.        }els
328e0 65 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74  e.        if( st
328f0 72 63 6d 70 28 7a 4f 70 2c 22 72 75 6e 22 29 3d  rcmp(zOp,"run")=
32900 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
32910 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
32920 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  0;.          str
32930 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  .n = 0;.        
32940 20 20 73 74 72 2e 7a 5b 30 5d 20 3d 20 30 3b 0a    str.z[0] = 0;.
32950 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
32960 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
32970 62 2c 20 7a 53 71 6c 2c 20 63 61 70 74 75 72 65  b, zSql, capture
32980 4f 75 74 70 75 74 43 61 6c 6c 62 61 63 6b 2c 20  OutputCallback, 
32990 26 73 74 72 2c 20 26 7a 45 72 72 4d 73 67 29 3b  &str, &zErrMsg);
329a0 0a 20 20 20 20 20 20 20 20 20 20 6e 54 65 73 74  .          nTest
329b0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ++;.          if
329c0 28 20 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20  ( bVerbose ){.  
329d0 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
329e0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 52  rintf(p->out, "R
329f0 65 73 75 6c 74 3a 20 25 73 5c 6e 22 2c 20 73 74  esult: %s\n", st
32a00 72 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r.z);.          
32a10 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
32a20 72 63 20 7c 7c 20 7a 45 72 72 4d 73 67 20 29 7b  rc || zErrMsg ){
32a30 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 45 72  .            nEr
32a40 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r++;.           
32a50 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
32a60 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
32a70 28 70 2d 3e 6f 75 74 2c 20 22 25 64 3a 20 65 72  (p->out, "%d: er
32a80 72 6f 72 2d 63 6f 64 65 2d 25 64 3a 20 25 73 5c  ror-code-%d: %s\
32a90 6e 22 2c 20 74 6e 6f 2c 20 72 63 2c 20 7a 45 72  n", tno, rc, zEr
32aa0 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  rMsg);.         
32ab0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
32ac0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
32ad0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
32ae0 72 63 6d 70 28 7a 41 6e 73 2c 73 74 72 2e 7a 29  rcmp(zAns,str.z)
32af0 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
32b00 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20     nErr++;.     
32b10 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
32b20 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f             utf8_
32b30 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
32b40 25 64 3a 20 45 78 70 65 63 74 65 64 3a 20 5b 25  %d: Expected: [%
32b50 73 5d 5c 6e 22 2c 20 74 6e 6f 2c 20 7a 41 6e 73  s]\n", tno, zAns
32b60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  );.            u
32b70 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
32b80 74 2c 20 22 25 64 3a 20 20 20 20 20 20 47 6f 74  t, "%d:      Got
32b90 3a 20 5b 25 73 5d 5c 6e 22 2c 20 74 6e 6f 2c 20  : [%s]\n", tno, 
32ba0 73 74 72 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20  str.z);.        
32bb0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
32bc0 65 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  e.        {.    
32bd0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
32be0 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20 20  f(stderr,.      
32bf0 20 20 20 20 20 20 22 55 6e 6b 6e 6f 77 6e 20 6f        "Unknown o
32c00 70 65 72 61 74 69 6f 6e 20 5c 22 25 73 5c 22 20  peration \"%s\" 
32c10 6f 6e 20 73 65 6c 66 74 65 73 74 20 6c 69 6e 65  on selftest line
32c20 20 25 64 5c 6e 22 2c 20 7a 4f 70 2c 20 74 6e 6f   %d\n", zOp, tno
32c30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
32c40 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 1;.          b
32c50 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
32c60 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 6c        } /* End l
32c70 6f 6f 70 20 6f 76 65 72 20 72 6f 77 73 20 6f 66  oop over rows of
32c80 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 53 45   content from SE
32c90 4c 46 54 45 53 54 20 2a 2f 0a 20 20 20 20 20 20  LFTEST */.      
32ca0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
32cb0 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 20 2f  (pStmt);.    } /
32cc0 2a 20 45 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20  * End loop over 
32cd0 6b 20 2a 2f 0a 20 20 20 20 66 72 65 65 54 65 78  k */.    freeTex
32ce0 74 28 26 73 74 72 29 3b 0a 20 20 20 20 75 74 66  t(&str);.    utf
32cf0 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
32d00 20 22 25 64 20 65 72 72 6f 72 73 20 6f 75 74 20   "%d errors out 
32d10 6f 66 20 25 64 20 74 65 73 74 73 5c 6e 22 2c 20  of %d tests\n", 
32d20 6e 45 72 72 2c 20 6e 54 65 73 74 29 3b 0a 20 20  nErr, nTest);.  
32d30 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
32d40 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  's' && strncmp(a
32d50 7a 41 72 67 5b 30 5d 2c 20 22 73 65 70 61 72 61  zArg[0], "separa
32d60 74 6f 72 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  tor", n)==0 ){. 
32d70 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20 7c 7c     if( nArg<2 ||
32d80 20 6e 41 72 67 3e 33 20 29 7b 0a 20 20 20 20 20   nArg>3 ){.     
32d90 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
32da0 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73 65 70  rr, "Usage: .sep
32db0 61 72 61 74 6f 72 20 43 4f 4c 20 3f 52 4f 57 3f  arator COL ?ROW?
32dc0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
32dd0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
32de0 28 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20 20 20  ( nArg>=2 ){.   
32df0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
32e00 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f  ntf(sizeof(p->co
32e10 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e  lSeparator), p->
32e20 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 0a 20 20  colSeparator,.  
32e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e40 20 20 20 20 20 22 25 2e 2a 73 22 2c 20 28 69 6e       "%.*s", (in
32e50 74 29 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 63  t)ArraySize(p->c
32e60 6f 6c 53 65 70 61 72 61 74 6f 72 29 2d 31 2c 20  olSeparator)-1, 
32e70 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d  azArg[1]);.    }
32e80 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 3d 33  .    if( nArg>=3
32e90 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
32ea0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
32eb0 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  f(p->rowSeparato
32ec0 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  r), p->rowSepara
32ed0 74 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tor,.           
32ee0 20 20 20 20 20 20 20 20 20 20 20 20 22 25 2e 2a              "%.*
32ef0 73 22 2c 20 28 69 6e 74 29 41 72 72 61 79 53 69  s", (int)ArraySi
32f00 7a 65 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ze(p->rowSeparat
32f10 6f 72 29 2d 31 2c 20 61 7a 41 72 67 5b 32 5d 29  or)-1, azArg[2])
32f20 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
32f30 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26  .  if( c=='s' &&
32f40 20 6e 3e 3d 34 20 26 26 20 73 74 72 6e 63 6d 70   n>=4 && strncmp
32f50 28 61 7a 41 72 67 5b 30 5d 2c 22 73 68 61 33 73  (azArg[0],"sha3s
32f60 75 6d 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  um",n)==0 ){.   
32f70 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69   const char *zLi
32f80 6b 65 20 3d 20 30 3b 20 20 20 2f 2a 20 57 68 69  ke = 0;   /* Whi
32f90 63 68 20 74 61 62 6c 65 20 74 6f 20 63 68 65 63  ch table to chec
32fa0 6b 73 75 6d 2e 20 30 20 6d 65 61 6e 73 20 65 76  ksum. 0 means ev
32fb0 65 72 79 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20  erything */.    
32fc0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
32fd0 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
32fe0 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
32ff0 69 6e 74 20 62 53 63 68 65 6d 61 20 3d 20 30 3b  int bSchema = 0;
33000 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f           /* Also
33010 20 68 61 73 68 20 74 68 65 20 73 63 68 65 6d 61   hash the schema
33020 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 53 65 70   */.    int bSep
33030 61 72 61 74 65 20 3d 20 30 3b 20 20 20 20 20 20  arate = 0;      
33040 20 2f 2a 20 48 61 73 68 20 65 61 63 68 20 74 61   /* Hash each ta
33050 62 6c 65 20 73 65 70 61 72 61 74 65 6c 79 20 2a  ble separately *
33060 2f 0a 20 20 20 20 69 6e 74 20 69 53 69 7a 65 20  /.    int iSize 
33070 3d 20 32 32 34 3b 20 20 20 20 20 20 20 20 20 2f  = 224;         /
33080 2a 20 48 61 73 68 20 61 6c 67 6f 72 69 74 68 6d  * Hash algorithm
33090 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 69   to use */.    i
330a0 6e 74 20 62 44 65 62 75 67 20 3d 20 30 3b 20 20  nt bDebug = 0;  
330b0 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20          /* Only 
330c0 73 68 6f 77 20 74 68 65 20 71 75 65 72 79 20 74  show the query t
330d0 68 61 74 20 77 6f 75 6c 64 20 68 61 76 65 20 72  hat would have r
330e0 75 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  un */.    sqlite
330f0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20  3_stmt *pStmt;  
33100 20 20 20 2f 2a 20 46 6f 72 20 71 75 65 72 79 69     /* For queryi
33110 6e 67 20 74 61 62 6c 65 73 20 6e 61 6d 65 73 20  ng tables names 
33120 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  */.    char *zSq
33130 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
33140 2f 2a 20 53 51 4c 20 74 6f 20 62 65 20 72 75 6e  /* SQL to be run
33150 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   */.    char *zS
33160 65 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ep;             
33170 20 2f 2a 20 53 65 70 61 72 61 74 6f 72 20 2a 2f   /* Separator */
33180 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73  .    ShellText s
33190 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Sql;          /*
331a0 20 43 6f 6d 70 6c 65 74 65 20 53 51 4c 20 66 6f   Complete SQL fo
331b0 72 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 72  r the query to r
331c0 75 6e 20 74 68 65 20 68 61 73 68 20 2a 2f 0a 20  un the hash */. 
331d0 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73 51 75     ShellText sQu
331e0 65 72 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  ery;        /* S
331f0 65 74 20 6f 66 20 71 75 65 72 69 65 73 20 75 73  et of queries us
33200 65 64 20 74 6f 20 72 65 61 64 20 61 6c 6c 20 63  ed to read all c
33210 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 20 20 6f 70  ontent */.    op
33220 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
33230 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67   for(i=1; i<nArg
33240 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f  ; i++){.      co
33250 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a  nst char *z = az
33260 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  Arg[i];.      if
33270 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20  ( z[0]=='-' ){. 
33280 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20         z++;.    
33290 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d      if( z[0]=='-
332a0 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20  ' ) z++;.       
332b0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 73   if( strcmp(z,"s
332c0 63 68 65 6d 61 22 29 3d 3d 30 20 29 7b 0a 20 20  chema")==0 ){.  
332d0 20 20 20 20 20 20 20 20 62 53 63 68 65 6d 61 20          bSchema 
332e0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 1;.        }el
332f0 73 65 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  se.        if( s
33300 74 72 63 6d 70 28 7a 2c 22 73 68 61 33 2d 32 32  trcmp(z,"sha3-22
33310 34 22 29 3d 3d 30 20 7c 7c 20 73 74 72 63 6d 70  4")==0 || strcmp
33320 28 7a 2c 22 73 68 61 33 2d 32 35 36 22 29 3d 3d  (z,"sha3-256")==
33330 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74  0.         || st
33340 72 63 6d 70 28 7a 2c 22 73 68 61 33 2d 33 38 34  rcmp(z,"sha3-384
33350 22 29 3d 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28  ")==0 || strcmp(
33360 7a 2c 22 73 68 61 33 2d 35 31 32 22 29 3d 3d 30  z,"sha3-512")==0
33370 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
33380 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 61 74        iSize = at
33390 6f 69 28 26 7a 5b 35 5d 29 3b 0a 20 20 20 20 20  oi(&z[5]);.     
333a0 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20     }else.       
333b0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 64   if( strcmp(z,"d
333c0 65 62 75 67 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ebug")==0 ){.   
333d0 20 20 20 20 20 20 20 62 44 65 62 75 67 20 3d 20         bDebug = 
333e0 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
333f0 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
33400 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
33410 28 73 74 64 65 72 72 2c 20 22 55 6e 6b 6e 6f 77  (stderr, "Unknow
33420 6e 20 6f 70 74 69 6f 6e 20 5c 22 25 73 5c 22 20  n option \"%s\" 
33430 6f 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20  on \"%s\"\n",.  
33440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33450 20 20 20 20 61 7a 41 72 67 5b 69 5d 2c 20 61 7a      azArg[i], az
33460 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[0]);.       
33470 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
33480 64 65 72 72 2c 20 22 53 68 6f 75 6c 64 20 62 65  derr, "Should be
33490 20 6f 6e 65 20 6f 66 3a 20 2d 2d 73 63 68 65 6d   one of: --schem
334a0 61 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  a".             
334b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
334c0 22 20 2d 2d 73 68 61 33 2d 32 32 34 20 2d 2d 73  " --sha3-224 --s
334d0 68 61 33 2d 32 35 35 20 2d 2d 73 68 61 33 2d 33  ha3-255 --sha3-3
334e0 38 34 20 2d 2d 73 68 61 33 2d 35 31 32 5c 6e 22  84 --sha3-512\n"
334f0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
33500 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67  = 1;.          g
33510 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
33520 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d  _exit;.        }
33530 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
33540 20 7a 4c 69 6b 65 20 29 7b 0a 20 20 20 20 20 20   zLike ){.      
33550 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
33560 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73 68  err, "Usage: .sh
33570 61 33 73 75 6d 20 3f 4f 50 54 49 4f 4e 53 3f 20  a3sum ?OPTIONS? 
33580 3f 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e  ?LIKE-PATTERN?\n
33590 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ");.        rc =
335a0 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
335b0 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
335c0 69 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  it;.      }else{
335d0 0a 20 20 20 20 20 20 20 20 7a 4c 69 6b 65 20 3d  .        zLike =
335e0 20 7a 3b 0a 20 20 20 20 20 20 20 20 62 53 65 70   z;.        bSep
335f0 61 72 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20  arate = 1;.     
33600 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
33610 74 72 6c 69 6b 65 28 22 73 71 6c 69 74 65 5f 25  trlike("sqlite_%
33620 22 2c 20 7a 4c 69 6b 65 2c 20 30 29 3d 3d 30 20  ", zLike, 0)==0 
33630 29 20 62 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  ) bSchema = 1;. 
33640 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
33650 20 69 66 28 20 62 53 63 68 65 6d 61 20 29 7b 0a   if( bSchema ){.
33660 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 22 53 45        zSql = "SE
33670 4c 45 43 54 20 6c 6f 77 65 72 28 6e 61 6d 65 29  LECT lower(name)
33680 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
33690 74 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20  ter".           
336a0 20 20 22 20 57 48 45 52 45 20 74 79 70 65 3d 27    " WHERE type='
336b0 74 61 62 6c 65 27 20 41 4e 44 20 63 6f 61 6c 65  table' AND coale
336c0 73 63 65 28 72 6f 6f 74 70 61 67 65 2c 30 29 3e  sce(rootpage,0)>
336d0 31 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1".             
336e0 22 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  " UNION ALL SELE
336f0 43 54 20 27 73 71 6c 69 74 65 5f 6d 61 73 74 65  CT 'sqlite_maste
33700 72 27 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  r'".            
33710 20 22 20 4f 52 44 45 52 20 42 59 20 31 20 63 6f   " ORDER BY 1 co
33720 6c 6c 61 74 65 20 6e 6f 63 61 73 65 22 3b 0a 20  llate nocase";. 
33730 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
33740 7a 53 71 6c 20 3d 20 22 53 45 4c 45 43 54 20 6c  zSql = "SELECT l
33750 6f 77 65 72 28 6e 61 6d 65 29 20 46 52 4f 4d 20  ower(name) FROM 
33760 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20  sqlite_master". 
33770 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48              " WH
33780 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c 65 27  ERE type='table'
33790 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28 72 6f   AND coalesce(ro
337a0 6f 74 70 61 67 65 2c 30 29 3e 31 22 0a 20 20 20  otpage,0)>1".   
337b0 20 20 20 20 20 20 20 20 20 20 22 20 41 4e 44 20            " AND 
337c0 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27 73  name NOT LIKE 's
337d0 71 6c 69 74 65 5f 25 27 22 0a 20 20 20 20 20 20  qlite_%'".      
337e0 20 20 20 20 20 20 20 22 20 4f 52 44 45 52 20 42         " ORDER B
337f0 59 20 31 20 63 6f 6c 6c 61 74 65 20 6e 6f 63 61  Y 1 collate noca
33800 73 65 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  se";.    }.    s
33810 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
33820 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  2(p->db, zSql, -
33830 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
33840 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 51 75     initText(&sQu
33850 65 72 79 29 3b 0a 20 20 20 20 69 6e 69 74 54 65  ery);.    initTe
33860 78 74 28 26 73 53 71 6c 29 3b 0a 20 20 20 20 61  xt(&sSql);.    a
33870 70 70 65 6e 64 54 65 78 74 28 26 73 53 71 6c 2c  ppendText(&sSql,
33880 20 22 57 49 54 48 20 5b 73 68 61 33 73 75 6d 24   "WITH [sha3sum$
33890 71 75 65 72 79 5d 28 61 2c 62 29 20 41 53 28 22  query](a,b) AS("
338a0 2c 30 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20  ,0);.    zSep = 
338b0 22 56 41 4c 55 45 53 28 22 3b 0a 20 20 20 20 77  "VALUES(";.    w
338c0 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57  hile( SQLITE_ROW
338d0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
338e0 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 63  Stmt) ){.      c
338f0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
33900 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
33910 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
33920 78 74 28 70 53 74 6d 74 2c 30 29 3b 0a 20 20 20  xt(pStmt,0);.   
33930 20 20 20 69 66 28 20 7a 4c 69 6b 65 20 26 26 20     if( zLike && 
33940 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28  sqlite3_strlike(
33950 7a 4c 69 6b 65 2c 20 7a 54 61 62 2c 20 30 29 21  zLike, zTab, 0)!
33960 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
33970 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
33980 28 7a 54 61 62 2c 20 22 73 71 6c 69 74 65 5f 22  (zTab, "sqlite_"
33990 2c 37 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,7)!=0 ){.      
339a0 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 51    appendText(&sQ
339b0 75 65 72 79 2c 22 53 45 4c 45 43 54 20 2a 20 46  uery,"SELECT * F
339c0 52 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 20  ROM ", 0);.     
339d0 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
339e0 51 75 65 72 79 2c 7a 54 61 62 2c 27 22 27 29 3b  Query,zTab,'"');
339f0 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
33a00 65 78 74 28 26 73 51 75 65 72 79 2c 22 20 4e 4f  ext(&sQuery," NO
33a10 54 20 49 4e 44 45 58 45 44 3b 22 2c 20 30 29 3b  T INDEXED;", 0);
33a20 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
33a30 20 73 74 72 63 6d 70 28 7a 54 61 62 2c 20 22 73   strcmp(zTab, "s
33a40 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 29 3d 3d  qlite_master")==
33a50 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70  0 ){.        app
33a60 65 6e 64 54 65 78 74 28 26 73 51 75 65 72 79 2c  endText(&sQuery,
33a70 22 53 45 4c 45 43 54 20 74 79 70 65 2c 6e 61 6d  "SELECT type,nam
33a80 65 2c 74 62 6c 5f 6e 61 6d 65 2c 73 71 6c 20 46  e,tbl_name,sql F
33a90 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
33aa0 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r".             
33ab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
33ac0 4f 52 44 45 52 20 42 59 20 6e 61 6d 65 3b 22 2c  ORDER BY name;",
33ad0 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   0);.      }else
33ae0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54 61 62   if( strcmp(zTab
33af0 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  , "sqlite_sequen
33b00 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ce")==0 ){.     
33b10 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
33b20 51 75 65 72 79 2c 22 53 45 4c 45 43 54 20 6e 61  Query,"SELECT na
33b30 6d 65 2c 73 65 71 20 46 52 4f 4d 20 73 71 6c 69  me,seq FROM sqli
33b40 74 65 5f 73 65 71 75 65 6e 63 65 22 0a 20 20 20  te_sequence".   
33b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b60 20 20 20 20 20 20 20 20 22 20 4f 52 44 45 52 20          " ORDER 
33b70 42 59 20 6e 61 6d 65 3b 22 2c 20 30 29 3b 0a 20  BY name;", 0);. 
33b80 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
33b90 74 72 63 6d 70 28 7a 54 61 62 2c 20 22 73 71 6c  trcmp(zTab, "sql
33ba0 69 74 65 5f 73 74 61 74 31 22 29 3d 3d 30 20 29  ite_stat1")==0 )
33bb0 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  {.        append
33bc0 54 65 78 74 28 26 73 51 75 65 72 79 2c 22 53 45  Text(&sQuery,"SE
33bd0 4c 45 43 54 20 74 62 6c 2c 69 64 78 2c 73 74 61  LECT tbl,idx,sta
33be0 74 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74  t FROM sqlite_st
33bf0 61 74 31 22 0a 20 20 20 20 20 20 20 20 20 20 20  at1".           
33c00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33c10 22 20 4f 52 44 45 52 20 42 59 20 74 62 6c 2c 69  " ORDER BY tbl,i
33c20 64 78 3b 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  dx;", 0);.      
33c30 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
33c40 28 7a 54 61 62 2c 20 22 73 71 6c 69 74 65 5f 73  (zTab, "sqlite_s
33c50 74 61 74 33 22 29 3d 3d 30 0a 20 20 20 20 20 20  tat3")==0.      
33c60 20 20 20 20 20 20 20 7c 7c 20 73 74 72 63 6d 70         || strcmp
33c70 28 7a 54 61 62 2c 20 22 73 71 6c 69 74 65 5f 73  (zTab, "sqlite_s
33c80 74 61 74 34 22 29 3d 3d 30 20 29 7b 0a 20 20 20  tat4")==0 ){.   
33c90 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
33ca0 26 73 51 75 65 72 79 2c 20 22 53 45 4c 45 43 54  &sQuery, "SELECT
33cb0 20 2a 20 46 52 4f 4d 20 22 2c 20 30 29 3b 0a 20   * FROM ", 0);. 
33cc0 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
33cd0 74 28 26 73 51 75 65 72 79 2c 20 7a 54 61 62 2c  t(&sQuery, zTab,
33ce0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70   0);.        app
33cf0 65 6e 64 54 65 78 74 28 26 73 51 75 65 72 79 2c  endText(&sQuery,
33d00 20 22 20 4f 52 44 45 52 20 42 59 20 74 62 6c 2c   " ORDER BY tbl,
33d10 20 69 64 78 2c 20 72 6f 77 69 64 3b 5c 6e 22 2c   idx, rowid;\n",
33d20 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
33d30 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
33d40 53 71 6c 2c 20 7a 53 65 70 2c 20 30 29 3b 0a 20  Sql, zSep, 0);. 
33d50 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
33d60 26 73 53 71 6c 2c 20 73 51 75 65 72 79 2e 7a 2c  &sSql, sQuery.z,
33d70 20 27 5c 27 27 29 3b 0a 20 20 20 20 20 20 73 51   '\'');.      sQ
33d80 75 65 72 79 2e 6e 20 3d 20 30 3b 0a 20 20 20 20  uery.n = 0;.    
33d90 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
33da0 71 6c 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20  ql, ",", 0);.   
33db0 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
33dc0 53 71 6c 2c 20 7a 54 61 62 2c 20 27 5c 27 27 29  Sql, zTab, '\'')
33dd0 3b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22  ;.      zSep = "
33de0 29 2c 28 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ),(";.    }.    
33df0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
33e00 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28  (pStmt);.    if(
33e10 20 62 53 65 70 61 72 61 74 65 20 29 7b 0a 20 20   bSeparate ){.  
33e20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
33e30 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
33e40 20 20 20 20 20 20 22 25 73 29 29 22 0a 20 20 20        "%s))".   
33e50 20 20 20 20 20 20 20 22 20 53 45 4c 45 43 54 20         " SELECT 
33e60 6c 6f 77 65 72 28 68 65 78 28 73 68 61 33 5f 71  lower(hex(sha3_q
33e70 75 65 72 79 28 61 2c 25 64 29 29 29 20 41 53 20  uery(a,%d))) AS 
33e80 68 61 73 68 2c 20 62 20 41 53 20 6c 61 62 65 6c  hash, b AS label
33e90 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 20  ".          "   
33ea0 46 52 4f 4d 20 5b 73 68 61 33 73 75 6d 24 71 75  FROM [sha3sum$qu
33eb0 65 72 79 5d 22 2c 0a 20 20 20 20 20 20 20 20 20  ery]",.         
33ec0 20 73 53 71 6c 2e 7a 2c 20 69 53 69 7a 65 29 3b   sSql.z, iSize);
33ed0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
33ee0 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
33ef0 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
33f00 20 20 20 20 22 25 73 29 29 22 0a 20 20 20 20 20      "%s))".     
33f10 20 20 20 20 20 22 20 53 45 4c 45 43 54 20 6c 6f       " SELECT lo
33f20 77 65 72 28 68 65 78 28 73 68 61 33 5f 71 75 65  wer(hex(sha3_que
33f30 72 79 28 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  ry(group_concat(
33f40 61 2c 27 27 29 2c 25 64 29 29 29 20 41 53 20 68  a,''),%d))) AS h
33f50 61 73 68 22 0a 20 20 20 20 20 20 20 20 20 20 22  ash".          "
33f60 20 20 20 46 52 4f 4d 20 5b 73 68 61 33 73 75 6d     FROM [sha3sum
33f70 24 71 75 65 72 79 5d 22 2c 0a 20 20 20 20 20 20  $query]",.      
33f80 20 20 20 20 73 53 71 6c 2e 7a 2c 20 69 53 69 7a      sSql.z, iSiz
33f90 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72  e);.    }.    fr
33fa0 65 65 54 65 78 74 28 26 73 51 75 65 72 79 29 3b  eeText(&sQuery);
33fb0 0a 20 20 20 20 66 72 65 65 54 65 78 74 28 26 73  .    freeText(&s
33fc0 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 62 44  Sql);.    if( bD
33fd0 65 62 75 67 20 29 7b 0a 20 20 20 20 20 20 75 74  ebug ){.      ut
33fe0 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
33ff0 2c 20 22 25 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b  , "%s\n", zSql);
34000 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
34010 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2d 3e    shell_exec(p->
34020 64 62 2c 20 7a 53 71 6c 2c 20 73 68 65 6c 6c 5f  db, zSql, shell_
34030 63 61 6c 6c 62 61 63 6b 2c 20 70 2c 20 30 29 3b  callback, p, 0);
34040 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
34050 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
34060 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
34070 3d 27 73 27 0a 20 20 20 26 26 20 28 73 74 72 6e  ='s'.   && (strn
34080 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73  cmp(azArg[0], "s
34090 68 65 6c 6c 22 2c 20 6e 29 3d 3d 30 20 7c 7c 20  hell", n)==0 || 
340a0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
340b0 2c 22 73 79 73 74 65 6d 22 2c 6e 29 3d 3d 30 29  ,"system",n)==0)
340c0 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  .  ){.    char *
340d0 7a 43 6d 64 3b 0a 20 20 20 20 69 6e 74 20 69 2c  zCmd;.    int i,
340e0 20 78 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   x;.    if( nArg
340f0 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  <2 ){.      raw_
34100 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
34110 55 73 61 67 65 3a 20 2e 73 79 73 74 65 6d 20 43  Usage: .system C
34120 4f 4d 4d 41 4e 44 5c 6e 22 29 3b 0a 20 20 20 20  OMMAND\n");.    
34130 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
34140 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
34150 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20  d_exit;.    }.  
34160 20 20 7a 43 6d 64 20 3d 20 73 71 6c 69 74 65 33    zCmd = sqlite3
34170 5f 6d 70 72 69 6e 74 66 28 73 74 72 63 68 72 28  _mprintf(strchr(
34180 61 7a 41 72 67 5b 31 5d 2c 27 20 27 29 3d 3d 30  azArg[1],' ')==0
34190 3f 22 25 73 22 3a 22 5c 22 25 73 5c 22 22 2c 20  ?"%s":"\"%s\"", 
341a0 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 66  azArg[1]);.    f
341b0 6f 72 28 69 3d 32 3b 20 69 3c 6e 41 72 67 3b 20  or(i=2; i<nArg; 
341c0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 43 6d 64  i++){.      zCmd
341d0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
341e0 74 66 28 73 74 72 63 68 72 28 61 7a 41 72 67 5b  tf(strchr(azArg[
341f0 69 5d 2c 27 20 27 29 3d 3d 30 3f 22 25 7a 20 25  i],' ')==0?"%z %
34200 73 22 3a 22 25 7a 20 5c 22 25 73 5c 22 22 2c 0a  s":"%z \"%s\"",.
34210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34220 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6d               zCm
34230 64 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  d, azArg[i]);.  
34240 20 20 7d 0a 20 20 20 20 78 20 3d 20 73 79 73 74    }.    x = syst
34250 65 6d 28 7a 43 6d 64 29 3b 0a 20 20 20 20 73 71  em(zCmd);.    sq
34260 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6d 64 29  lite3_free(zCmd)
34270 3b 0a 20 20 20 20 69 66 28 20 78 20 29 20 72 61  ;.    if( x ) ra
34280 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
34290 20 22 53 79 73 74 65 6d 20 63 6f 6d 6d 61 6e 64   "System command
342a0 20 72 65 74 75 72 6e 73 20 25 64 5c 6e 22 2c 20   returns %d\n", 
342b0 78 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69  x);.  }else..  i
342c0 66 28 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72  f( c=='s' && str
342d0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
342e0 73 68 6f 77 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  show", n)==0 ){.
342f0 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
34300 20 63 68 61 72 20 2a 61 7a 42 6f 6f 6c 5b 5d 20   char *azBool[] 
34310 3d 20 7b 20 22 6f 66 66 22 2c 20 22 6f 6e 22 2c  = { "off", "on",
34320 20 22 74 72 69 67 67 65 72 22 2c 20 22 66 75 6c   "trigger", "ful
34330 6c 22 7d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  l"};.    int i;.
34340 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 31 20      if( nArg!=1 
34350 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
34360 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
34370 67 65 3a 20 2e 73 68 6f 77 5c 6e 22 29 3b 0a 20  ge: .show\n");. 
34380 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
34390 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
343a0 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d  mand_exit;.    }
343b0 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
343c0 28 70 2d 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32  (p->out, "%12.12
343d0 73 3a 20 25 73 5c 6e 22 2c 22 65 63 68 6f 22 2c  s: %s\n","echo",
343e0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
343f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34400 20 20 20 61 7a 42 6f 6f 6c 5b 53 68 65 6c 6c 48     azBool[ShellH
34410 61 73 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f  asFlag(p, SHFLG_
34420 45 63 68 6f 29 5d 29 3b 0a 20 20 20 20 75 74 66  Echo)]);.    utf
34430 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
34440 20 22 25 31 32 2e 31 32 73 3a 20 25 73 5c 6e 22   "%12.12s: %s\n"
34450 2c 22 65 71 70 22 2c 20 61 7a 42 6f 6f 6c 5b 70  ,"eqp", azBool[p
34460 2d 3e 61 75 74 6f 45 51 50 26 33 5d 29 3b 0a 20  ->autoEQP&3]);. 
34470 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
34480 2d 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32 73 3a  ->out, "%12.12s:
34490 20 25 73 5c 6e 22 2c 22 65 78 70 6c 61 69 6e 22   %s\n","explain"
344a0 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 6d 6f  ,.         p->mo
344b0 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e  de==MODE_Explain
344c0 20 3f 20 22 6f 6e 22 20 3a 20 70 2d 3e 61 75 74   ? "on" : p->aut
344d0 6f 45 78 70 6c 61 69 6e 20 3f 20 22 61 75 74 6f  oExplain ? "auto
344e0 22 20 3a 20 22 6f 66 66 22 29 3b 0a 20 20 20 20  " : "off");.    
344f0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
34500 75 74 2c 22 25 31 32 2e 31 32 73 3a 20 25 73 5c  ut,"%12.12s: %s\
34510 6e 22 2c 22 68 65 61 64 65 72 73 22 2c 20 61 7a  n","headers", az
34520 42 6f 6f 6c 5b 70 2d 3e 73 68 6f 77 48 65 61 64  Bool[p->showHead
34530 65 72 21 3d 30 5d 29 3b 0a 20 20 20 20 75 74 66  er!=0]);.    utf
34540 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
34550 20 22 25 31 32 2e 31 32 73 3a 20 25 73 5c 6e 22   "%12.12s: %s\n"
34560 2c 22 6d 6f 64 65 22 2c 20 6d 6f 64 65 44 65 73  ,"mode", modeDes
34570 63 72 5b 70 2d 3e 6d 6f 64 65 5d 29 3b 0a 20 20  cr[p->mode]);.  
34580 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
34590 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32 73 3a 20  >out, "%12.12s: 
345a0 22 2c 20 22 6e 75 6c 6c 76 61 6c 75 65 22 29 3b  ", "nullvalue");
345b0 0a 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f  .      output_c_
345c0 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 70  string(p->out, p
345d0 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20  ->nullValue);.  
345e0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
345f0 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20  ->out, "\n");.  
34600 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
34610 3e 6f 75 74 2c 22 25 31 32 2e 31 32 73 3a 20 25  >out,"%12.12s: %
34620 73 5c 6e 22 2c 22 6f 75 74 70 75 74 22 2c 0a 20  s\n","output",. 
34630 20 20 20 20 20 20 20 20 20 20 20 73 74 72 6c 65             strle
34640 6e 33 30 28 70 2d 3e 6f 75 74 66 69 6c 65 29 20  n30(p->outfile) 
34650 3f 20 70 2d 3e 6f 75 74 66 69 6c 65 20 3a 20 22  ? p->outfile : "
34660 73 74 64 6f 75 74 22 29 3b 0a 20 20 20 20 75 74  stdout");.    ut
34670 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
34680 2c 22 25 31 32 2e 31 32 73 3a 20 22 2c 20 22 63  ,"%12.12s: ", "c
34690 6f 6c 73 65 70 61 72 61 74 6f 72 22 29 3b 0a 20  olseparator");. 
346a0 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73 74       output_c_st
346b0 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e  ring(p->out, p->
346c0 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  colSeparator);. 
346d0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
346e0 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  p->out, "\n");. 
346f0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
34700 2d 3e 6f 75 74 2c 22 25 31 32 2e 31 32 73 3a 20  ->out,"%12.12s: 
34710 22 2c 20 22 72 6f 77 73 65 70 61 72 61 74 6f 72  ", "rowseparator
34720 22 29 3b 0a 20 20 20 20 20 20 6f 75 74 70 75 74  ");.      output
34730 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  _c_string(p->out
34740 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
34750 72 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  r);.      raw_pr
34760 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e  intf(p->out, "\n
34770 22 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69  ");.    utf8_pri
34780 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31 32  ntf(p->out, "%12
34790 2e 31 32 73 3a 20 25 73 5c 6e 22 2c 22 73 74 61  .12s: %s\n","sta
347a0 74 73 22 2c 20 61 7a 42 6f 6f 6c 5b 70 2d 3e 73  ts", azBool[p->s
347b0 74 61 74 73 4f 6e 21 3d 30 5d 29 3b 0a 20 20 20  tatsOn!=0]);.   
347c0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
347d0 6f 75 74 2c 20 22 25 31 32 2e 31 32 73 3a 20 22  out, "%12.12s: "
347e0 2c 20 22 77 69 64 74 68 22 29 3b 0a 20 20 20 20  , "width");.    
347f0 66 6f 72 20 28 69 3d 30 3b 69 3c 28 69 6e 74 29  for (i=0;i<(int)
34800 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f 6c  ArraySize(p->col
34810 57 69 64 74 68 29 20 26 26 20 70 2d 3e 63 6f 6c  Width) && p->col
34820 57 69 64 74 68 5b 69 5d 20 21 3d 20 30 3b 69 2b  Width[i] != 0;i+
34830 2b 29 20 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  +) {.      raw_p
34840 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
34850 64 20 22 2c 20 70 2d 3e 63 6f 6c 57 69 64 74 68  d ", p->colWidth
34860 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
34870 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
34880 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 75 74  t, "\n");.    ut
34890 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
348a0 2c 20 22 25 31 32 2e 31 32 73 3a 20 25 73 5c 6e  , "%12.12s: %s\n
348b0 22 2c 20 22 66 69 6c 65 6e 61 6d 65 22 2c 0a 20  ", "filename",. 
348c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
348d0 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3f 20  ->zDbFilename ? 
348e0 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3a  p->zDbFilename :
348f0 20 22 22 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20   "");.  }else.. 
34900 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20 73   if( c=='s' && s
34910 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
34920 20 22 73 74 61 74 73 22 2c 20 6e 29 3d 3d 30 20   "stats", n)==0 
34930 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  ){.    if( nArg=
34940 3d 32 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73  =2 ){.      p->s
34950 74 61 74 73 4f 6e 20 3d 20 62 6f 6f 6c 65 61 6e  tatsOn = boolean
34960 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b  Value(azArg[1]);
34970 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  .    }else if( n
34980 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Arg==1 ){.      
34990 64 69 73 70 6c 61 79 5f 73 74 61 74 73 28 70 2d  display_stats(p-
349a0 3e 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20  >db, p, 0);.    
349b0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
349c0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
349d0 22 55 73 61 67 65 3a 20 2e 73 74 61 74 73 20 3f  "Usage: .stats ?
349e0 6f 6e 7c 6f 66 66 3f 5c 6e 22 29 3b 0a 20 20 20  on|off?\n");.   
349f0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
34a00 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
34a10 28 63 3d 3d 27 74 27 20 26 26 20 6e 3e 31 20 26  (c=='t' && n>1 &
34a20 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
34a30 30 5d 2c 20 22 74 61 62 6c 65 73 22 2c 20 6e 29  0], "tables", n)
34a40 3d 3d 30 29 0a 20 20 20 7c 7c 20 28 63 3d 3d 27  ==0).   || (c=='
34a50 69 27 20 26 26 20 28 73 74 72 6e 63 6d 70 28 61  i' && (strncmp(a
34a60 7a 41 72 67 5b 30 5d 2c 20 22 69 6e 64 69 63 65  zArg[0], "indice
34a70 73 22 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 20 20  s", n)==0.      
34a80 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74             || st
34a90 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
34aa0 22 69 6e 64 65 78 65 73 22 2c 20 6e 29 3d 3d 30  "indexes", n)==0
34ab0 29 20 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c  ) ).  ){.    sql
34ac0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
34ad0 3b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 52  ;.    char **azR
34ae0 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20 6e  esult;.    int n
34af0 52 6f 77 2c 20 6e 41 6c 6c 6f 63 3b 0a 20 20 20  Row, nAlloc;.   
34b00 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 53 68 65   int ii;.    She
34b10 6c 6c 54 65 78 74 20 73 3b 0a 20 20 20 20 69 6e  llText s;.    in
34b20 69 74 54 65 78 74 28 26 73 29 3b 0a 20 20 20 20  itText(&s);.    
34b30 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
34b40 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
34b50 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
34b60 2c 20 22 50 52 41 47 4d 41 20 64 61 74 61 62 61  , "PRAGMA databa
34b70 73 65 5f 6c 69 73 74 22 2c 20 2d 31 2c 20 26 70  se_list", -1, &p
34b80 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  Stmt, 0);.    if
34b90 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 73 68  ( rc ) return sh
34ba0 65 6c 6c 44 61 74 61 62 61 73 65 45 72 72 6f 72  ellDatabaseError
34bb0 28 70 2d 3e 64 62 29 3b 0a 0a 20 20 20 20 69 66  (p->db);..    if
34bc0 28 20 6e 41 72 67 3e 32 20 26 26 20 63 3d 3d 27  ( nArg>2 && c=='
34bd0 69 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  i' ){.      /* I
34be0 74 20 69 73 20 61 6e 20 68 69 73 74 6f 72 69 63  t is an historic
34bf0 61 6c 20 61 63 63 69 64 65 6e 74 20 74 68 61 74  al accident that
34c00 20 74 68 65 20 2e 69 6e 64 65 78 65 73 20 63 6f   the .indexes co
34c10 6d 6d 61 6e 64 20 73 68 6f 77 73 20 61 6e 20 65  mmand shows an e
34c20 72 72 6f 72 0a 20 20 20 20 20 20 2a 2a 20 77 68  rror.      ** wh
34c30 65 6e 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74  en called with t
34c40 68 65 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20  he wrong number 
34c50 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 77 68 65  of arguments whe
34c60 72 65 61 73 20 74 68 65 20 2e 74 61 62 6c 65 73  reas the .tables
34c70 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e  .      ** comman
34c80 64 20 64 6f 65 73 20 6e 6f 74 2e 20 2a 2f 0a 20  d does not. */. 
34c90 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
34ca0 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
34cb0 2e 69 6e 64 65 78 65 73 20 3f 4c 49 4b 45 2d 50  .indexes ?LIKE-P
34cc0 41 54 54 45 52 4e 3f 5c 6e 22 29 3b 0a 20 20 20  ATTERN?\n");.   
34cd0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
34ce0 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
34cf0 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20  nd_exit;.    }. 
34d00 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 73 71 6c     for(ii=0; sql
34d10 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
34d20 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 3b 20 69 69  ==SQLITE_ROW; ii
34d30 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ++){.      const
34d40 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d   char *zDbName =
34d50 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
34d60 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
34d70 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20  t(pStmt, 1);.   
34d80 20 20 20 69 66 28 20 7a 44 62 4e 61 6d 65 3d 3d     if( zDbName==
34d90 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
34da0 20 20 20 20 69 66 28 20 73 2e 7a 20 26 26 20 73      if( s.z && s
34db0 2e 7a 5b 30 5d 20 29 20 61 70 70 65 6e 64 54 65  .z[0] ) appendTe
34dc0 78 74 28 26 73 2c 20 22 20 55 4e 49 4f 4e 20 41  xt(&s, " UNION A
34dd0 4c 4c 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  LL ", 0);.      
34de0 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69  if( sqlite3_stri
34df0 63 6d 70 28 7a 44 62 4e 61 6d 65 2c 20 22 6d 61  cmp(zDbName, "ma
34e00 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  in")==0 ){.     
34e10 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
34e20 2c 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46  , "SELECT name F
34e30 52 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 20  ROM ", 0);.     
34e40 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
34e50 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20 22  appendText(&s, "
34e60 53 45 4c 45 43 54 20 22 2c 20 30 29 3b 0a 20 20  SELECT ", 0);.  
34e70 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
34e80 28 26 73 2c 20 7a 44 62 4e 61 6d 65 2c 20 27 5c  (&s, zDbName, '\
34e90 27 27 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70  '');.        app
34ea0 65 6e 64 54 65 78 74 28 26 73 2c 20 22 7c 7c 27  endText(&s, "||'
34eb0 2e 27 7c 7c 6e 61 6d 65 20 46 52 4f 4d 20 22 2c  .'||name FROM ",
34ec0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
34ed0 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
34ee0 2c 20 7a 44 62 4e 61 6d 65 2c 20 27 22 27 29 3b  , zDbName, '"');
34ef0 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
34f00 74 28 26 73 2c 20 22 2e 73 71 6c 69 74 65 5f 6d  t(&s, ".sqlite_m
34f10 61 73 74 65 72 20 22 2c 20 30 29 3b 0a 20 20 20  aster ", 0);.   
34f20 20 20 20 69 66 28 20 63 3d 3d 27 74 27 20 29 7b     if( c=='t' ){
34f30 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
34f40 65 78 74 28 26 73 2c 22 20 57 48 45 52 45 20 74  ext(&s," WHERE t
34f50 79 70 65 20 49 4e 20 28 27 74 61 62 6c 65 27 2c  ype IN ('table',
34f60 27 76 69 65 77 27 29 22 0a 20 20 20 20 20 20 20  'view')".       
34f70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
34f80 20 20 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20     AND name NOT 
34f90 4c 49 4b 45 20 27 73 71 6c 69 74 65 5f 25 27 22  LIKE 'sqlite_%'"
34fa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
34fb0 20 20 20 20 20 20 20 22 20 20 20 41 4e 44 20 6e         "   AND n
34fc0 61 6d 65 20 4c 49 4b 45 20 3f 31 22 2c 20 30 29  ame LIKE ?1", 0)
34fd0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
34fe0 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
34ff0 74 28 26 73 2c 22 20 57 48 45 52 45 20 74 79 70  t(&s," WHERE typ
35000 65 3d 27 69 6e 64 65 78 27 22 0a 20 20 20 20 20  e='index'".     
35010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35020 20 22 20 20 20 41 4e 44 20 74 62 6c 5f 6e 61 6d   "   AND tbl_nam
35030 65 20 4c 49 4b 45 20 3f 31 22 2c 20 30 29 3b 0a  e LIKE ?1", 0);.
35040 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
35050 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
35060 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
35070 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
35080 73 2c 20 22 20 4f 52 44 45 52 20 42 59 20 31 22  s, " ORDER BY 1"
35090 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  , 0);.    rc = s
350a0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
350b0 32 28 70 2d 3e 64 62 2c 20 73 2e 7a 2c 20 2d 31  2(p->db, s.z, -1
350c0 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
350d0 20 20 66 72 65 65 54 65 78 74 28 26 73 29 3b 0a    freeText(&s);.
350e0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
350f0 75 72 6e 20 73 68 65 6c 6c 44 61 74 61 62 61 73  urn shellDatabas
35100 65 45 72 72 6f 72 28 70 2d 3e 64 62 29 3b 0a 0a  eError(p->db);..
35110 20 20 20 20 2f 2a 20 52 75 6e 20 74 68 65 20 53      /* Run the S
35120 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 70 72 65  QL statement pre
35130 70 61 72 65 64 20 62 79 20 74 68 65 20 61 62 6f  pared by the abo
35140 76 65 20 62 6c 6f 63 6b 2e 20 53 74 6f 72 65 20  ve block. Store 
35150 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20  the results.    
35160 2a 2a 20 61 73 20 61 6e 20 61 72 72 61 79 20 6f  ** as an array o
35170 66 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  f nul-terminated
35180 20 73 74 72 69 6e 67 73 20 69 6e 20 61 7a 52 65   strings in azRe
35190 73 75 6c 74 5b 5d 2e 20 20 2a 2f 0a 20 20 20 20  sult[].  */.    
351a0 6e 52 6f 77 20 3d 20 6e 41 6c 6c 6f 63 20 3d 20  nRow = nAlloc = 
351b0 30 3b 0a 20 20 20 20 61 7a 52 65 73 75 6c 74 20  0;.    azResult 
351c0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 41 72  = 0;.    if( nAr
351d0 67 3e 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  g>1 ){.      sql
351e0 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
351f0 53 74 6d 74 2c 20 31 2c 20 61 7a 41 72 67 5b 31  Stmt, 1, azArg[1
35200 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52  ], -1, SQLITE_TR
35210 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65  ANSIENT);.    }e
35220 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
35230 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74  e3_bind_text(pSt
35240 6d 74 2c 20 31 2c 20 22 25 22 2c 20 2d 31 2c 20  mt, 1, "%", -1, 
35250 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
35260 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
35270 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
35280 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
35290 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 52   ){.      if( nR
352a0 6f 77 3e 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  ow>=nAlloc ){.  
352b0 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 4e        char **azN
352c0 65 77 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ew;.        int 
352d0 6e 32 20 3d 20 6e 41 6c 6c 6f 63 2a 32 20 2b 20  n2 = nAlloc*2 + 
352e0 31 30 3b 0a 20 20 20 20 20 20 20 20 61 7a 4e 65  10;.        azNe
352f0 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  w = sqlite3_real
35300 6c 6f 63 36 34 28 61 7a 52 65 73 75 6c 74 2c 20  loc64(azResult, 
35310 73 69 7a 65 6f 66 28 61 7a 52 65 73 75 6c 74 5b  sizeof(azResult[
35320 30 5d 29 2a 6e 32 29 3b 0a 20 20 20 20 20 20 20  0])*n2);.       
35330 20 69 66 28 20 61 7a 4e 65 77 3d 3d 30 20 29 7b   if( azNew==0 ){
35340 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
35350 73 68 65 6c 6c 4e 6f 6d 65 6d 45 72 72 6f 72 28  shellNomemError(
35360 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
35370 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
35380 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20 3d 20 6e        nAlloc = n
35390 32 3b 0a 20 20 20 20 20 20 20 20 61 7a 52 65 73  2;.        azRes
353a0 75 6c 74 20 3d 20 61 7a 4e 65 77 3b 0a 20 20 20  ult = azNew;.   
353b0 20 20 20 7d 0a 20 20 20 20 20 20 61 7a 52 65 73     }.      azRes
353c0 75 6c 74 5b 6e 52 6f 77 5d 20 3d 20 73 71 6c 69  ult[nRow] = sqli
353d0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
353e0 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
353f0 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 29  _text(pStmt, 0))
35400 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 61  ;.      if( 0==a
35410 7a 52 65 73 75 6c 74 5b 6e 52 6f 77 5d 20 29 7b  zResult[nRow] ){
35420 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 68  .        rc = sh
35430 65 6c 6c 4e 6f 6d 65 6d 45 72 72 6f 72 28 29 3b  ellNomemError();
35440 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
35450 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 52        }.      nR
35460 6f 77 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ow++;.    }.    
35470 69 66 28 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  if( sqlite3_fina
35480 6c 69 7a 65 28 70 53 74 6d 74 29 21 3d 53 51 4c  lize(pStmt)!=SQL
35490 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
354a0 72 63 20 3d 20 73 68 65 6c 6c 44 61 74 61 62 61  rc = shellDataba
354b0 73 65 45 72 72 6f 72 28 70 2d 3e 64 62 29 3b 0a  seError(p->db);.
354c0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 72      }..    /* Pr
354d0 65 74 74 79 2d 70 72 69 6e 74 20 74 68 65 20 63  etty-print the c
354e0 6f 6e 74 65 6e 74 73 20 6f 66 20 61 72 72 61 79  ontents of array
354f0 20 61 7a 52 65 73 75 6c 74 5b 5d 20 74 6f 20 74   azResult[] to t
35500 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20  he output */.   
35510 20 69 66 28 20 72 63 3d 3d 30 20 26 26 20 6e 52   if( rc==0 && nR
35520 6f 77 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  ow>0 ){.      in
35530 74 20 6c 65 6e 2c 20 6d 61 78 6c 65 6e 20 3d 20  t len, maxlen = 
35540 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20  0;.      int i, 
35550 6a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 72  j;.      int nPr
35560 69 6e 74 43 6f 6c 2c 20 6e 50 72 69 6e 74 52 6f  intCol, nPrintRo
35570 77 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  w;.      for(i=0
35580 3b 20 69 3c 6e 52 6f 77 3b 20 69 2b 2b 29 7b 0a  ; i<nRow; i++){.
35590 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 73 74          len = st
355a0 72 6c 65 6e 33 30 28 61 7a 52 65 73 75 6c 74 5b  rlen30(azResult[
355b0 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  i]);.        if(
355c0 20 6c 65 6e 3e 6d 61 78 6c 65 6e 20 29 20 6d 61   len>maxlen ) ma
355d0 78 6c 65 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20  xlen = len;.    
355e0 20 20 7d 0a 20 20 20 20 20 20 6e 50 72 69 6e 74    }.      nPrint
355f0 43 6f 6c 20 3d 20 38 30 2f 28 6d 61 78 6c 65 6e  Col = 80/(maxlen
35600 2b 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  +2);.      if( n
35610 50 72 69 6e 74 43 6f 6c 3c 31 20 29 20 6e 50 72  PrintCol<1 ) nPr
35620 69 6e 74 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20  intCol = 1;.    
35630 20 20 6e 50 72 69 6e 74 52 6f 77 20 3d 20 28 6e    nPrintRow = (n
35640 52 6f 77 20 2b 20 6e 50 72 69 6e 74 43 6f 6c 20  Row + nPrintCol 
35650 2d 20 31 29 2f 6e 50 72 69 6e 74 43 6f 6c 3b 0a  - 1)/nPrintCol;.
35660 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
35670 3c 6e 50 72 69 6e 74 52 6f 77 3b 20 69 2b 2b 29  <nPrintRow; i++)
35680 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  {.        for(j=
35690 69 3b 20 6a 3c 6e 52 6f 77 3b 20 6a 2b 3d 6e 50  i; j<nRow; j+=nP
356a0 72 69 6e 74 52 6f 77 29 7b 0a 20 20 20 20 20 20  rintRow){.      
356b0 20 20 20 20 63 68 61 72 20 2a 7a 53 70 20 3d 20      char *zSp = 
356c0 6a 3c 6e 50 72 69 6e 74 52 6f 77 20 3f 20 22 22  j<nPrintRow ? ""
356d0 20 3a 20 22 20 20 22 3b 0a 20 20 20 20 20 20 20   : "  ";.       
356e0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
356f0 2d 3e 6f 75 74 2c 20 22 25 73 25 2d 2a 73 22 2c  ->out, "%s%-*s",
35700 20 7a 53 70 2c 20 6d 61 78 6c 65 6e 2c 0a 20 20   zSp, maxlen,.  
35710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35720 20 20 20 20 61 7a 52 65 73 75 6c 74 5b 6a 5d 20      azResult[j] 
35730 3f 20 61 7a 52 65 73 75 6c 74 5b 6a 5d 3a 22 22  ? azResult[j]:""
35740 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
35750 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
35760 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  p->out, "\n");. 
35770 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
35780 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
35790 52 6f 77 3b 20 69 69 2b 2b 29 20 73 71 6c 69 74  Row; ii++) sqlit
357a0 65 33 5f 66 72 65 65 28 61 7a 52 65 73 75 6c 74  e3_free(azResult
357b0 5b 69 69 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74  [ii]);.    sqlit
357c0 65 33 5f 66 72 65 65 28 61 7a 52 65 73 75 6c 74  e3_free(azResult
357d0 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a  );.  }else..  /*
357e0 20 42 65 67 69 6e 20 72 65 64 69 72 65 63 74 69   Begin redirecti
357f0 6e 67 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65  ng output to the
35800 20 66 69 6c 65 20 22 74 65 73 74 63 61 73 65 2d   file "testcase-
35810 6f 75 74 2e 74 78 74 22 20 2a 2f 0a 20 20 69 66  out.txt" */.  if
35820 28 20 63 3d 3d 27 74 27 20 26 26 20 73 74 72 63  ( c=='t' && strc
35830 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22 74 65 73  mp(azArg[0],"tes
35840 74 63 61 73 65 22 29 3d 3d 30 20 29 7b 0a 20 20  tcase")==0 ){.  
35850 20 20 6f 75 74 70 75 74 5f 72 65 73 65 74 28 70    output_reset(p
35860 29 3b 0a 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20  );.    p->out = 
35870 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e  output_file_open
35880 28 22 74 65 73 74 63 61 73 65 2d 6f 75 74 2e 74  ("testcase-out.t
35890 78 74 22 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  xt");.    if( p-
358a0 3e 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >out==0 ){.     
358b0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
358c0 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e  rr, "Error: cann
358d0 6f 74 20 6f 70 65 6e 20 27 74 65 73 74 63 61 73  ot open 'testcas
358e0 65 2d 6f 75 74 2e 74 78 74 27 5c 6e 22 29 3b 0a  e-out.txt'\n");.
358f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41      }.    if( nA
35900 72 67 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 73  rg>=2 ){.      s
35910 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
35920 73 69 7a 65 6f 66 28 70 2d 3e 7a 54 65 73 74 63  sizeof(p->zTestc
35930 61 73 65 29 2c 20 70 2d 3e 7a 54 65 73 74 63 61  ase), p->zTestca
35940 73 65 2c 20 22 25 73 22 2c 20 61 7a 41 72 67 5b  se, "%s", azArg[
35950 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1]);.    }else{.
35960 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
35970 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
35980 3e 7a 54 65 73 74 63 61 73 65 29 2c 20 70 2d 3e  >zTestcase), p->
35990 7a 54 65 73 74 63 61 73 65 2c 20 22 3f 22 29 3b  zTestcase, "?");
359a0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
359b0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 55  #ifndef SQLITE_U
359c0 4e 54 45 53 54 41 42 4c 45 0a 20 20 69 66 28 20  NTESTABLE.  if( 
359d0 63 3d 3d 27 74 27 20 26 26 20 6e 3e 3d 38 20 26  c=='t' && n>=8 &
359e0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
359f0 30 5d 2c 20 22 74 65 73 74 63 74 72 6c 22 2c 20  0], "testctrl", 
35a00 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61  n)==0 ){.    sta
35a10 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
35a20 20 7b 0a 20 20 20 20 20 20 20 63 6f 6e 73 74 20   {.       const 
35a30 63 68 61 72 20 2a 7a 43 74 72 6c 4e 61 6d 65 3b  char *zCtrlName;
35a40 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20     /* Name of a 
35a50 74 65 73 74 2d 63 6f 6e 74 72 6f 6c 20 6f 70 74  test-control opt
35a60 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 69 6e  ion */.       in
35a70 74 20 63 74 72 6c 43 6f 64 65 3b 20 20 20 20 20  t ctrlCode;     
35a80 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65         /* Intege
35a90 72 20 63 6f 64 65 20 66 6f 72 20 74 68 61 74 20  r code for that 
35aa0 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  option */.      
35ab0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73   const char *zUs
35ac0 61 67 65 3b 20 20 20 20 20 20 2f 2a 20 55 73 61  age;      /* Usa
35ad0 67 65 20 6e 6f 74 65 73 20 2a 2f 0a 20 20 20 20  ge notes */.    
35ae0 7d 20 61 43 74 72 6c 5b 5d 20 3d 20 7b 0a 20 20  } aCtrl[] = {.  
35af0 20 20 20 20 7b 20 22 61 6c 77 61 79 73 22 2c 20      { "always", 
35b00 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
35b10 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41  TE_TESTCTRL_ALWA
35b20 59 53 2c 20 20 20 20 20 20 20 20 22 42 4f 4f 4c  YS,        "BOOL
35b30 45 41 4e 22 20 20 20 20 20 20 20 20 20 20 20 20  EAN"            
35b40 7d 2c 0a 20 20 20 20 20 20 7b 20 22 61 73 73 65  },.      { "asse
35b50 72 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  rt",            
35b60 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
35b70 5f 41 53 53 45 52 54 2c 20 20 20 20 20 20 20 20  _ASSERT,        
35b80 22 42 4f 4f 4c 45 41 4e 22 20 20 20 20 20 20 20  "BOOLEAN"       
35b90 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 7b 20       },.    /*{ 
35ba0 22 62 65 6e 69 67 6e 5f 6d 61 6c 6c 6f 63 5f 68  "benign_malloc_h
35bb0 6f 6f 6b 73 22 2c 53 51 4c 49 54 45 5f 54 45 53  ooks",SQLITE_TES
35bc0 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c  TCTRL_BENIGN_MAL
35bd0 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 22 22 20 20 20  LOC_HOOKS, ""   
35be0 20 20 20 20 20 20 20 7d 2c 2a 2f 0a 20 20 20 20         },*/.    
35bf0 2f 2a 7b 20 22 62 69 74 76 65 63 5f 74 65 73 74  /*{ "bitvec_test
35c00 22 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  ",        SQLITE
35c10 5f 54 45 53 54 43 54 52 4c 5f 42 49 54 56 45 43  _TESTCTRL_BITVEC
35c20 5f 54 45 53 54 2c 20 20 20 22 22 20 20 20 20 20  _TEST,   ""     
35c30 20 20 20 20 20 20 20 20 20 20 20 7d 2c 2a 2f 0a             },*/.
35c40 20 20 20 20 20 20 7b 20 22 62 79 74 65 6f 72 64        { "byteord
35c50 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 53 51  er",          SQ
35c60 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 59  LITE_TESTCTRL_BY
35c70 54 45 4f 52 44 45 52 2c 20 20 20 20 20 22 22 20  TEORDER,     "" 
35c80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c90 20 20 7d 2c 0a 20 20 20 20 2f 2a 7b 20 22 66 61    },.    /*{ "fa
35ca0 75 6c 74 5f 69 6e 73 74 61 6c 6c 22 2c 20 20 20  ult_install",   
35cb0 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54     SQLITE_TESTCT
35cc0 52 4c 5f 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c  RL_FAULT_INSTALL
35cd0 2c 20 22 22 20 20 20 20 20 20 20 20 20 20 20 20  , ""            
35ce0 20 20 20 20 7d 2c 20 2a 2f 0a 20 20 20 20 20 20      }, */.      
35cf0 7b 20 22 69 6d 70 6f 73 74 65 72 22 2c 20 20 20  { "imposter",   
35d00 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54          SQLITE_T
35d10 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52  ESTCTRL_IMPOSTER
35d20 2c 20 20 20 22 53 43 48 45 4d 41 20 4f 4e 2f 4f  ,   "SCHEMA ON/O
35d30 46 46 20 52 4f 4f 54 50 41 47 45 22 7d 2c 0a 23  FF ROOTPAGE"},.#
35d40 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 5f 4b  ifdef SQLITE_N_K
35d50 45 59 57 4f 52 44 0a 20 20 20 20 20 20 7b 20 22  EYWORD.      { "
35d60 69 73 6b 65 79 77 6f 72 64 22 2c 20 20 20 20 20  iskeyword",     
35d70 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54       SQLITE_TEST
35d80 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44 2c 20  CTRL_ISKEYWORD, 
35d90 20 20 20 20 22 49 44 45 4e 54 49 46 49 45 52 22      "IDENTIFIER"
35da0 20 20 20 20 20 20 20 20 20 7d 2c 0a 23 65 6e 64           },.#end
35db0 69 66 0a 20 20 20 20 20 20 7b 20 22 6c 6f 63 61  if.      { "loca
35dc0 6c 74 69 6d 65 5f 66 61 75 6c 74 22 2c 20 20 20  ltime_fault",   
35dd0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
35de0 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54  _LOCALTIME_FAULT
35df0 2c 22 42 4f 4f 4c 45 41 4e 22 20 20 20 20 20 20  ,"BOOLEAN"      
35e00 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
35e10 22 6e 65 76 65 72 5f 63 6f 72 72 75 70 74 22 2c  "never_corrupt",
35e20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53        SQLITE_TES
35e30 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52  TCTRL_NEVER_CORR
35e40 55 50 54 2c 20 22 42 4f 4f 4c 45 41 4e 22 20 20  UPT, "BOOLEAN"  
35e50 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
35e60 20 20 20 7b 20 22 6f 70 74 69 6d 69 7a 61 74 69     { "optimizati
35e70 6f 6e 73 22 2c 20 20 20 20 20 20 53 51 4c 49 54  ons",      SQLIT
35e80 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
35e90 49 5a 41 54 49 4f 4e 53 2c 20 22 44 49 53 41 42  IZATIONS, "DISAB
35ea0 4c 45 2d 4d 41 53 4b 22 20 20 20 20 20 20 20 7d  LE-MASK"       }
35eb0 2c 0a 23 69 66 64 65 66 20 59 59 43 4f 56 45 52  ,.#ifdef YYCOVER
35ec0 41 47 45 0a 20 20 20 20 20 20 7b 20 22 70 61 72  AGE.      { "par
35ed0 73 65 72 5f 63 6f 76 65 72 61 67 65 22 2c 20 20  ser_coverage",  
35ee0 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52    SQLITE_TESTCTR
35ef0 4c 5f 50 41 52 53 45 52 5f 43 4f 56 45 52 41 47  L_PARSER_COVERAG
35f00 45 2c 20 22 22 20 20 20 20 20 20 20 20 20 20 20  E, ""           
35f10 20 20 20 20 20 20 7d 2c 0a 23 65 6e 64 69 66 0a        },.#endif.
35f20 20 20 20 20 20 20 7b 20 22 70 65 6e 64 69 6e 67        { "pending
35f30 5f 62 79 74 65 22 2c 20 20 20 20 20 20 20 53 51  _byte",       SQ
35f40 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45  LITE_TESTCTRL_PE
35f50 4e 44 49 4e 47 5f 42 59 54 45 2c 20 20 22 4f 46  NDING_BYTE,  "OF
35f60 46 53 45 54 20 20 22 20 20 20 20 20 20 20 20 20  FSET  "         
35f70 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 70 72    },.      { "pr
35f80 6e 67 5f 72 65 73 65 74 22 2c 20 20 20 20 20 20  ng_reset",      
35f90 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54     SQLITE_TESTCT
35fa0 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 2c 20 20  RL_PRNG_RESET,  
35fb0 20 20 22 22 20 20 20 20 20 20 20 20 20 20 20 20    ""            
35fc0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
35fd0 7b 20 22 70 72 6e 67 5f 72 65 73 74 6f 72 65 22  { "prng_restore"
35fe0 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54  ,       SQLITE_T
35ff0 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53  ESTCTRL_PRNG_RES
36000 54 4f 52 45 2c 20 20 22 22 20 20 20 20 20 20 20  TORE,  ""       
36010 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
36020 20 20 20 20 20 7b 20 22 70 72 6e 67 5f 73 61 76       { "prng_sav
36030 65 22 2c 20 20 20 20 20 20 20 20 20 20 53 51 4c  e",          SQL
36040 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
36050 47 5f 53 41 56 45 2c 20 20 20 20 20 22 22 20 20  G_SAVE,     ""  
36060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36070 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 72 65 73   },.      { "res
36080 65 72 76 65 22 2c 20 20 20 20 20 20 20 20 20 20  erve",          
36090 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52    SQLITE_TESTCTR
360a0 4c 5f 52 45 53 45 52 56 45 2c 20 20 20 20 20 20  L_RESERVE,      
360b0 20 22 42 59 54 45 53 2d 4f 46 2d 52 45 53 45 52   "BYTES-OF-RESER
360c0 56 45 22 20 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a  VE"   },.    };.
360d0 20 20 20 20 69 6e 74 20 74 65 73 74 63 74 72 6c      int testctrl
360e0 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 69   = -1;.    int i
360f0 43 74 72 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69  Ctrl = -1;.    i
36100 6e 74 20 72 63 32 20 3d 20 30 3b 20 20 20 20 2f  nt rc2 = 0;    /
36110 2a 20 30 3a 20 75 73 61 67 65 2e 20 20 31 3a 20  * 0: usage.  1: 
36120 25 64 20 20 32 3a 20 25 78 20 20 33 3a 20 6e 6f  %d  2: %x  3: no
36130 2d 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 69  -output */.    i
36140 6e 74 20 69 73 4f 6b 20 3d 20 30 3b 0a 20 20 20  nt isOk = 0;.   
36150 20 69 6e 74 20 69 2c 20 6e 32 3b 0a 20 20 20 20   int i, n2;.    
36160 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6d 64  const char *zCmd
36170 20 3d 20 30 3b 0a 0a 20 20 20 20 6f 70 65 6e 5f   = 0;..    open_
36180 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 7a 43  db(p, 0);.    zC
36190 6d 64 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61  md = nArg>=2 ? a
361a0 7a 41 72 67 5b 31 5d 20 3a 20 22 68 65 6c 70 22  zArg[1] : "help"
361b0 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 72  ;..    /* The ar
361c0 67 75 6d 65 6e 74 20 63 61 6e 20 6f 70 74 69 6f  gument can optio
361d0 6e 61 6c 6c 79 20 62 65 67 69 6e 20 77 69 74 68  nally begin with
361e0 20 22 2d 22 20 6f 72 20 22 2d 2d 22 20 2a 2f 0a   "-" or "--" */.
361f0 20 20 20 20 69 66 28 20 7a 43 6d 64 5b 30 5d 3d      if( zCmd[0]=
36200 3d 27 2d 27 20 26 26 20 7a 43 6d 64 5b 31 5d 20  ='-' && zCmd[1] 
36210 29 7b 0a 20 20 20 20 20 20 7a 43 6d 64 2b 2b 3b  ){.      zCmd++;
36220 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6d 64 5b  .      if( zCmd[
36230 30 5d 3d 3d 27 2d 27 20 26 26 20 7a 43 6d 64 5b  0]=='-' && zCmd[
36240 31 5d 20 29 20 7a 43 6d 64 2b 2b 3b 0a 20 20 20  1] ) zCmd++;.   
36250 20 7d 0a 0a 20 20 20 20 2f 2a 20 2d 2d 68 65 6c   }..    /* --hel
36260 70 20 6c 69 73 74 73 20 61 6c 6c 20 74 65 73 74  p lists all test
36270 2d 63 6f 6e 74 72 6f 6c 73 20 2a 2f 0a 20 20 20  -controls */.   
36280 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64   if( strcmp(zCmd
36290 2c 22 68 65 6c 70 22 29 3d 3d 30 20 29 7b 0a 20  ,"help")==0 ){. 
362a0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
362b0 28 70 2d 3e 6f 75 74 2c 20 22 41 76 61 69 6c 61  (p->out, "Availa
362c0 62 6c 65 20 74 65 73 74 2d 63 6f 6e 74 72 6f 6c  ble test-control
362d0 73 3a 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f  s:\n");.      fo
362e0 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
362f0 7a 65 28 61 43 74 72 6c 29 3b 20 69 2b 2b 29 7b  ze(aCtrl); i++){
36300 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
36310 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 20  intf(p->out, "  
36320 2e 74 65 73 74 63 74 72 6c 20 25 73 20 25 73 5c  .testctrl %s %s\
36330 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
36340 20 20 20 20 20 20 20 20 61 43 74 72 6c 5b 69 5d          aCtrl[i]
36350 2e 7a 43 74 72 6c 4e 61 6d 65 2c 20 61 43 74 72  .zCtrlName, aCtr
36360 6c 5b 69 5d 2e 7a 55 73 61 67 65 29 3b 0a 20 20  l[i].zUsage);.  
36370 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
36380 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d   1;.      goto m
36390 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
363a0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
363b0 63 6f 6e 76 65 72 74 20 74 65 73 74 63 74 72 6c  convert testctrl
363c0 20 74 65 78 74 20 6f 70 74 69 6f 6e 20 74 6f 20   text option to 
363d0 76 61 6c 75 65 2e 20 61 6c 6c 6f 77 20 61 6e 79  value. allow any
363e0 20 75 6e 69 71 75 65 20 70 72 65 66 69 78 0a 20   unique prefix. 
363f0 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6f 70 74     ** of the opt
36400 69 6f 6e 20 6e 61 6d 65 2c 20 6f 72 20 61 20 6e  ion name, or a n
36410 75 6d 65 72 69 63 61 6c 20 76 61 6c 75 65 2e 20  umerical value. 
36420 2a 2f 0a 20 20 20 20 6e 32 20 3d 20 73 74 72 6c  */.    n2 = strl
36430 65 6e 33 30 28 7a 43 6d 64 29 3b 0a 20 20 20 20  en30(zCmd);.    
36440 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
36450 53 69 7a 65 28 61 43 74 72 6c 29 3b 20 69 2b 2b  Size(aCtrl); i++
36460 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
36470 6e 63 6d 70 28 7a 43 6d 64 2c 20 61 43 74 72 6c  ncmp(zCmd, aCtrl
36480 5b 69 5d 2e 7a 43 74 72 6c 4e 61 6d 65 2c 20 6e  [i].zCtrlName, n
36490 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  2)==0 ){.       
364a0 20 69 66 28 20 74 65 73 74 63 74 72 6c 3c 30 20   if( testctrl<0 
364b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  ){.          tes
364c0 74 63 74 72 6c 20 3d 20 61 43 74 72 6c 5b 69 5d  tctrl = aCtrl[i]
364d0 2e 63 74 72 6c 43 6f 64 65 3b 0a 20 20 20 20 20  .ctrlCode;.     
364e0 20 20 20 20 20 69 43 74 72 6c 20 3d 20 69 3b 0a       iCtrl = i;.
364f0 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
36500 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
36510 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
36520 72 6f 72 3a 20 61 6d 62 69 67 75 6f 75 73 20 74  ror: ambiguous t
36530 65 73 74 2d 63 6f 6e 74 72 6f 6c 3a 20 5c 22 25  est-control: \"%
36540 73 5c 22 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  s\"\n".         
36550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36560 20 20 20 20 20 22 55 73 65 20 5c 22 2e 74 65 73       "Use \".tes
36570 74 63 74 72 6c 20 2d 2d 68 65 6c 70 5c 22 20 66  tctrl --help\" f
36580 6f 72 20 68 65 6c 70 5c 6e 22 2c 20 7a 43 6d 64  or help\n", zCmd
36590 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
365a0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67  = 1;.          g
365b0 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
365c0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d  _exit;.        }
365d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
365e0 20 20 20 69 66 28 20 74 65 73 74 63 74 72 6c 3c     if( testctrl<
365f0 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  0 ){.      utf8_
36600 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
36610 72 72 6f 72 3a 20 75 6e 6b 6e 6f 77 6e 20 74 65  rror: unknown te
36620 73 74 2d 63 6f 6e 74 72 6f 6c 3a 20 25 73 5c 6e  st-control: %s\n
36630 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
36640 20 20 20 20 20 20 20 20 20 20 20 22 55 73 65 20             "Use 
36650 5c 22 2e 74 65 73 74 63 74 72 6c 20 2d 2d 68 65  \".testctrl --he
36660 6c 70 5c 22 20 66 6f 72 20 68 65 6c 70 5c 6e 22  lp\" for help\n"
36670 2c 20 7a 43 6d 64 29 3b 0a 20 20 20 20 7d 65 6c  , zCmd);.    }el
36680 73 65 7b 0a 20 20 20 20 20 20 73 77 69 74 63 68  se{.      switch
36690 28 74 65 73 74 63 74 72 6c 29 7b 0a 0a 20 20 20  (testctrl){..   
366a0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
366b0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74  test_control(int
366c0 2c 20 64 62 2c 20 69 6e 74 29 20 2a 2f 0a 20 20  , db, int) */.  
366d0 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
366e0 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
366f0 49 5a 41 54 49 4f 4e 53 3a 0a 20 20 20 20 20 20  IZATIONS:.      
36700 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
36710 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45 3a 0a  STCTRL_RESERVE:.
36720 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 41            if( nA
36730 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  rg==3 ){.       
36740 20 20 20 20 20 69 6e 74 20 6f 70 74 20 3d 20 28       int opt = (
36750 69 6e 74 29 73 74 72 74 6f 6c 28 61 7a 41 72 67  int)strtol(azArg
36760 5b 32 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  [2], 0, 0);.    
36770 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71          rc2 = sq
36780 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
36790 6f 6c 28 74 65 73 74 63 74 72 6c 2c 20 70 2d 3e  ol(testctrl, p->
367a0 64 62 2c 20 6f 70 74 29 3b 0a 20 20 20 20 20 20  db, opt);.      
367b0 20 20 20 20 20 20 69 73 4f 6b 20 3d 20 33 3b 0a        isOk = 3;.
367c0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
367d0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
367e0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
367f0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e  _test_control(in
36800 74 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 61  t) */.        ca
36810 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
36820 52 4c 5f 50 52 4e 47 5f 53 41 56 45 3a 0a 20 20  RL_PRNG_SAVE:.  
36830 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
36840 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f  E_TESTCTRL_PRNG_
36850 52 45 53 54 4f 52 45 3a 0a 20 20 20 20 20 20 20  RESTORE:.       
36860 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
36870 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54  TCTRL_PRNG_RESET
36880 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  :.        case S
36890 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42  QLITE_TESTCTRL_B
368a0 59 54 45 4f 52 44 45 52 3a 0a 20 20 20 20 20 20  YTEORDER:.      
368b0 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
368c0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
368d0 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73  c2 = sqlite3_tes
368e0 74 5f 63 6f 6e 74 72 6f 6c 28 74 65 73 74 63 74  t_control(testct
368f0 72 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rl);.           
36900 20 69 73 4f 6b 20 3d 20 74 65 73 74 63 74 72 6c   isOk = testctrl
36910 3d 3d 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  ==SQLITE_TESTCTR
36920 4c 5f 42 59 54 45 4f 52 44 45 52 20 3f 20 31 20  L_BYTEORDER ? 1 
36930 3a 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  : 3;.          }
36940 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
36950 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 71  ;..        /* sq
36960 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
36970 6f 6c 28 69 6e 74 2c 20 75 69 6e 74 29 20 2a 2f  ol(int, uint) */
36980 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
36990 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45  LITE_TESTCTRL_PE
369a0 4e 44 49 4e 47 5f 42 59 54 45 3a 0a 20 20 20 20  NDING_BYTE:.    
369b0 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d        if( nArg==
369c0 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  3 ){.           
369d0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6f 70   unsigned int op
369e0 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  t = (unsigned in
369f0 74 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61  t)integerValue(a
36a00 7a 41 72 67 5b 32 5d 29 3b 0a 20 20 20 20 20 20  zArg[2]);.      
36a10 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69        rc2 = sqli
36a20 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
36a30 28 74 65 73 74 63 74 72 6c 2c 20 6f 70 74 29 3b  (testctrl, opt);
36a40 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f  .            isO
36a50 6b 20 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20  k = 3;.         
36a60 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
36a70 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ak;..        /* 
36a80 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
36a90 74 72 6f 6c 28 69 6e 74 2c 20 69 6e 74 29 20 2a  trol(int, int) *
36aa0 2f 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  /.        case S
36ab0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
36ac0 53 53 45 52 54 3a 0a 20 20 20 20 20 20 20 20 63  SSERT:.        c
36ad0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
36ae0 54 52 4c 5f 41 4c 57 41 59 53 3a 0a 20 20 20 20  TRL_ALWAYS:.    
36af0 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d        if( nArg==
36b00 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  3 ){.           
36b10 20 69 6e 74 20 6f 70 74 20 3d 20 62 6f 6f 6c 65   int opt = boole
36b20 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 32 5d  anValue(azArg[2]
36b30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
36b40 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73  c2 = sqlite3_tes
36b50 74 5f 63 6f 6e 74 72 6f 6c 28 74 65 73 74 63 74  t_control(testct
36b60 72 6c 2c 20 6f 70 74 29 3b 0a 20 20 20 20 20 20  rl, opt);.      
36b70 20 20 20 20 20 20 69 73 4f 6b 20 3d 20 31 3b 0a        isOk = 1;.
36b80 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
36b90 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
36ba0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
36bb0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e  _test_control(in
36bc0 74 2c 20 69 6e 74 29 20 2a 2f 0a 20 20 20 20 20  t, int) */.     
36bd0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
36be0 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d  ESTCTRL_LOCALTIM
36bf0 45 5f 46 41 55 4c 54 3a 0a 20 20 20 20 20 20 20  E_FAULT:.       
36c00 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
36c10 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52  TCTRL_NEVER_CORR
36c20 55 50 54 3a 0a 20 20 20 20 20 20 20 20 20 20 69  UPT:.          i
36c30 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20 20  f( nArg==3 ){.  
36c40 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70            int op
36c50 74 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  t = booleanValue
36c60 28 61 7a 41 72 67 5b 32 5d 29 3b 0a 20 20 20 20  (azArg[2]);.    
36c70 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71          rc2 = sq
36c80 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
36c90 6f 6c 28 74 65 73 74 63 74 72 6c 2c 20 6f 70 74  ol(testctrl, opt
36ca0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
36cb0 73 4f 6b 20 3d 20 33 3b 0a 20 20 20 20 20 20 20  sOk = 3;.       
36cc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62     }.          b
36cd0 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 2f  reak;..        /
36ce0 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  * sqlite3_test_c
36cf0 6f 6e 74 72 6f 6c 28 69 6e 74 2c 20 63 68 61 72  ontrol(int, char
36d00 20 2a 29 20 2a 2f 0a 23 69 66 64 65 66 20 53 51   *) */.#ifdef SQ
36d10 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20  LITE_N_KEYWORD. 
36d20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
36d30 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45  TE_TESTCTRL_ISKE
36d40 59 57 4f 52 44 3a 0a 20 20 20 20 20 20 20 20 20  YWORD:.         
36d50 20 69 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b 0a   if( nArg==3 ){.
36d60 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
36d70 74 20 63 68 61 72 20 2a 6f 70 74 20 3d 20 61 7a  t char *opt = az
36d80 41 72 67 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20  Arg[2];.        
36d90 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
36da0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 74  3_test_control(t
36db0 65 73 74 63 74 72 6c 2c 20 6f 70 74 29 3b 0a 20  estctrl, opt);. 
36dc0 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 6b 20             isOk 
36dd0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
36de0 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
36df0 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  ;.#endif..      
36e00 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
36e10 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 3a  STCTRL_IMPOSTER:
36e20 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
36e30 41 72 67 3d 3d 35 20 29 7b 0a 20 20 20 20 20 20  Arg==5 ){.      
36e40 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69        rc2 = sqli
36e50 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
36e60 28 74 65 73 74 63 74 72 6c 2c 20 70 2d 3e 64 62  (testctrl, p->db
36e70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
36e80 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 41 72              azAr
36e90 67 5b 32 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  g[2],.          
36ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36eb0 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41  integerValue(azA
36ec0 72 67 5b 33 5d 29 2c 0a 20 20 20 20 20 20 20 20  rg[3]),.        
36ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36ee0 20 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61    integerValue(a
36ef0 7a 41 72 67 5b 34 5d 29 29 3b 0a 20 20 20 20 20  zArg[4]));.     
36f00 20 20 20 20 20 20 20 69 73 4f 6b 20 3d 20 33 3b         isOk = 3;
36f10 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
36f20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 23         break;..#
36f30 69 66 64 65 66 20 59 59 43 4f 56 45 52 41 47 45  ifdef YYCOVERAGE
36f40 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
36f50 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 41  LITE_TESTCTRL_PA
36f60 52 53 45 52 5f 43 4f 56 45 52 41 47 45 3a 0a 20  RSER_COVERAGE:. 
36f70 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 41 72           if( nAr
36f80 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20  g==2 ){.        
36f90 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74      sqlite3_test
36fa0 5f 63 6f 6e 74 72 6f 6c 28 74 65 73 74 63 74 72  _control(testctr
36fb0 6c 2c 20 70 2d 3e 6f 75 74 29 3b 0a 20 20 20 20  l, p->out);.    
36fc0 20 20 20 20 20 20 20 20 69 73 4f 6b 20 3d 20 33          isOk = 3
36fd0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65  ;.          }.#e
36fe0 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20  ndif.      }.   
36ff0 20 7d 0a 20 20 20 20 69 66 28 20 69 73 4f 6b 3d   }.    if( isOk=
37000 3d 30 20 26 26 20 69 43 74 72 6c 3e 3d 30 20 29  =0 && iCtrl>=0 )
37010 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
37020 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 55 73 61  ntf(p->out, "Usa
37030 67 65 3a 20 2e 74 65 73 74 63 74 72 6c 20 25 73  ge: .testctrl %s
37040 20 25 73 5c 6e 22 2c 20 7a 43 6d 64 2c 20 61 43   %s\n", zCmd, aC
37050 74 72 6c 5b 69 43 74 72 6c 5d 2e 7a 55 73 61 67  trl[iCtrl].zUsag
37060 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  e);.      rc = 1
37070 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
37080 69 73 4f 6b 3d 3d 31 20 29 7b 0a 20 20 20 20 20  isOk==1 ){.     
37090 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
370a0 75 74 2c 20 22 25 64 5c 6e 22 2c 20 72 63 32 29  ut, "%d\n", rc2)
370b0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
370c0 69 73 4f 6b 3d 3d 32 20 29 7b 0a 20 20 20 20 20  isOk==2 ){.     
370d0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
370e0 75 74 2c 20 22 30 78 25 30 38 78 5c 6e 22 2c 20  ut, "0x%08x\n", 
370f0 72 63 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  rc2);.    }.  }e
37100 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  lse.#endif /* !d
37110 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 55 4e  efined(SQLITE_UN
37120 54 45 53 54 41 42 4c 45 29 20 2a 2f 0a 0a 20 20  TESTABLE) */..  
37130 69 66 28 20 63 3d 3d 27 74 27 20 26 26 20 6e 3e  if( c=='t' && n>
37140 34 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  4 && strncmp(azA
37150 72 67 5b 30 5d 2c 20 22 74 69 6d 65 6f 75 74 22  rg[0], "timeout"
37160 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f  , n)==0 ){.    o
37170 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
37180 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74    sqlite3_busy_t
37190 69 6d 65 6f 75 74 28 70 2d 3e 64 62 2c 20 6e 41  imeout(p->db, nA
371a0 72 67 3e 3d 32 20 3f 20 28 69 6e 74 29 69 6e 74  rg>=2 ? (int)int
371b0 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b  egerValue(azArg[
371c0 31 5d 29 20 3a 20 30 29 3b 0a 20 20 7d 65 6c 73  1]) : 0);.  }els
371d0 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 74 27 20  e..  if( c=='t' 
371e0 26 26 20 6e 3e 3d 35 20 26 26 20 73 74 72 6e 63  && n>=5 && strnc
371f0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 74 69  mp(azArg[0], "ti
37200 6d 65 72 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  mer", n)==0 ){. 
37210 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
37220 7b 0a 20 20 20 20 20 20 65 6e 61 62 6c 65 54 69  {.      enableTi
37230 6d 65 72 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c  mer = booleanVal
37240 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ue(azArg[1]);.  
37250 20 20 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69      if( enableTi
37260 6d 65 72 20 26 26 20 21 48 41 53 5f 54 49 4d 45  mer && !HAS_TIME
37270 52 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  R ){.        raw
37280 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
37290 22 45 72 72 6f 72 3a 20 74 69 6d 65 72 20 6e 6f  "Error: timer no
372a0 74 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74  t available on t
372b0 68 69 73 20 73 79 73 74 65 6d 2e 5c 6e 22 29 3b  his system.\n");
372c0 0a 20 20 20 20 20 20 20 20 65 6e 61 62 6c 65 54  .        enableT
372d0 69 6d 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  imer = 0;.      
372e0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
372f0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
37300 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 74  derr, "Usage: .t
37310 69 6d 65 72 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b  imer on|off\n");
37320 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
37330 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
37340 69 66 28 20 63 3d 3d 27 74 27 20 26 26 20 73 74  if( c=='t' && st
37350 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
37360 22 74 72 61 63 65 22 2c 20 6e 29 3d 3d 30 20 29  "trace", n)==0 )
37370 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  {.    open_db(p,
37380 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72   0);.    if( nAr
37390 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 61  g!=2 ){.      ra
373a0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
373b0 20 22 55 73 61 67 65 3a 20 2e 74 72 61 63 65 20   "Usage: .trace 
373c0 46 49 4c 45 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20  FILE|off\n");.  
373d0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
373e0 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
373f0 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  and_exit;.    }.
37400 20 20 20 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f      output_file_
37410 63 6c 6f 73 65 28 70 2d 3e 74 72 61 63 65 4f 75  close(p->traceOu
37420 74 29 3b 0a 20 20 20 20 70 2d 3e 74 72 61 63 65  t);.    p->trace
37430 4f 75 74 20 3d 20 6f 75 74 70 75 74 5f 66 69 6c  Out = output_fil
37440 65 5f 6f 70 65 6e 28 61 7a 41 72 67 5b 31 5d 29  e_open(azArg[1])
37450 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
37460 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
37470 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
37480 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
37490 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 69 66  NG_POINT).    if
374a0 28 20 70 2d 3e 74 72 61 63 65 4f 75 74 3d 3d 30  ( p->traceOut==0
374b0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
374c0 33 5f 74 72 61 63 65 5f 76 32 28 70 2d 3e 64 62  3_trace_v2(p->db
374d0 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
374e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
374f0 69 74 65 33 5f 74 72 61 63 65 5f 76 32 28 70 2d  ite3_trace_v2(p-
37500 3e 64 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 43  >db, SQLITE_TRAC
37510 45 5f 53 54 4d 54 2c 20 73 71 6c 5f 74 72 61 63  E_STMT, sql_trac
37520 65 5f 63 61 6c 6c 62 61 63 6b 2c 70 2d 3e 74 72  e_callback,p->tr
37530 61 63 65 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 23  aceOut);.    }.#
37540 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 0a 0a 23  endif.  }else..#
37550 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41  if SQLITE_USER_A
37560 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20  UTHENTICATION.  
37570 69 66 28 20 63 3d 3d 27 75 27 20 26 26 20 73 74  if( c=='u' && st
37580 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
37590 22 75 73 65 72 22 2c 20 6e 29 3d 3d 30 20 29 7b  "user", n)==0 ){
375a0 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20  .    if( nArg<2 
375b0 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
375c0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
375d0 67 65 3a 20 2e 75 73 65 72 20 53 55 42 43 4f 4d  ge: .user SUBCOM
375e0 4d 41 4e 44 20 2e 2e 2e 5c 6e 22 29 3b 0a 20 20  MAND ...\n");.  
375f0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
37600 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
37610 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  and_exit;.    }.
37620 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
37630 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  );.    i