/ Hex Artifact Content
Login

Artifact c2231d96fc059e2a6c86d67571db0dc7e029de25553a42c3334a6ef4c8e92484:


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 7a 20 2a 2f 22 2c 20  ntf("/* %z */", 
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 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
57a0: 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73  SQL function:  s
57b0: 68 65 6c 6c 5f 61 64 64 5f 73 63 68 65 6d 61 28  hell_add_schema(
57c0: 53 2c 58 29 0a 2a 2a 0a 2a 2a 20 41 64 64 20 74  S,X).**.** Add t
57d0: 68 65 20 73 63 68 65 6d 61 20 6e 61 6d 65 20 58  he schema name X
57e0: 20 74 6f 20 74 68 65 20 43 52 45 41 54 45 20 73   to the CREATE s
57f0: 74 61 74 65 6d 65 6e 74 20 69 6e 20 53 20 61 6e  tatement in S an
5800: 64 20 72 65 74 75 72 6e 20 74 68 65 20 72 65 73  d return the res
5810: 75 6c 74 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65 73  ult..** Examples
5820: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41 54  :.**.**    CREAT
5830: 45 20 54 41 42 4c 45 20 74 31 28 78 29 20 20 20  E TABLE t1(x)   
5840: 2d 3e 20 20 20 43 52 45 41 54 45 20 54 41 42 4c  ->   CREATE TABL
5850: 45 20 78 79 7a 2e 74 31 28 78 29 3b 0a 2a 2a 0a  E xyz.t1(x);.**.
5860: 2a 2a 20 41 6c 73 6f 20 77 6f 72 6b 73 20 6f 6e  ** Also works on
5870: 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41 54 45  .**.**    CREATE
5880: 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20 43 52 45   INDEX.**    CRE
5890: 41 54 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58  ATE UNIQUE INDEX
58a0: 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20 56 49  .**    CREATE VI
58b0: 45 57 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20  EW.**    CREATE 
58c0: 54 52 49 47 47 45 52 0a 2a 2a 20 20 20 20 43 52  TRIGGER.**    CR
58d0: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42  EATE VIRTUAL TAB
58e0: 4c 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 55 44  LE.**.** This UD
58f0: 46 20 69 73 20 75 73 65 64 20 62 79 20 74 68 65  F is used by the
5900: 20 2e 73 63 68 65 6d 61 20 63 6f 6d 6d 61 6e 64   .schema command
5910: 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 73   to insert the s
5920: 63 68 65 6d 61 20 6e 61 6d 65 20 6f 66 0a 2a 2a  chema name of.**
5930: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
5940: 73 65 73 20 69 6e 74 6f 20 74 68 65 20 6d 69 64  ses into the mid
5950: 64 6c 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74  dle of the sqlit
5960: 65 5f 6d 61 73 74 65 72 2e 73 71 6c 20 66 69 65  e_master.sql fie
5970: 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ld..*/.static vo
5980: 69 64 20 73 68 65 6c 6c 41 64 64 53 63 68 65 6d  id shellAddSchem
5990: 61 4e 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33  aName(.  sqlite3
59a0: 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 0a  _context *pCtx,.
59b0: 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20 73 71    int nVal,.  sq
59c0: 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70  lite3_value **ap
59d0: 56 61 6c 0a 29 7b 0a 20 20 73 74 61 74 69 63 20  Val.){.  static 
59e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 50 72 65  const char *aPre
59f0: 66 69 78 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 22  fix[] = {.     "
5a00: 54 41 42 4c 45 22 2c 0a 20 20 20 20 20 22 49 4e  TABLE",.     "IN
5a10: 44 45 58 22 2c 0a 20 20 20 20 20 22 55 4e 49 51  DEX",.     "UNIQ
5a20: 55 45 20 49 4e 44 45 58 22 2c 0a 20 20 20 20 20  UE INDEX",.     
5a30: 22 56 49 45 57 22 2c 0a 20 20 20 20 20 22 54 52  "VIEW",.     "TR
5a40: 49 47 47 45 52 22 2c 0a 20 20 20 20 20 22 56 49  IGGER",.     "VI
5a50: 52 54 55 41 4c 20 54 41 42 4c 45 22 0a 20 20 7d  RTUAL TABLE".  }
5a60: 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20  ;.  int i = 0;. 
5a70: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e   const char *zIn
5a80: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
5a90: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
5aa0: 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20  xt(apVal[0]);.  
5ab0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 63 68  const char *zSch
5ac0: 65 6d 61 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ema = (const cha
5ad0: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
5ae0: 5f 74 65 78 74 28 61 70 56 61 6c 5b 31 5d 29 3b  _text(apVal[1]);
5af0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
5b00: 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  Name = (const ch
5b10: 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
5b20: 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 32 5d 29  e_text(apVal[2])
5b30: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
5b40: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78  = sqlite3_contex
5b50: 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78  t_db_handle(pCtx
5b60: 29 3b 0a 20 20 69 66 28 20 7a 49 6e 21 3d 30 20  );.  if( zIn!=0 
5b70: 26 26 20 73 74 72 6e 63 6d 70 28 7a 49 6e 2c 20  && strncmp(zIn, 
5b80: 22 43 52 45 41 54 45 20 22 2c 20 37 29 3d 3d 30  "CREATE ", 7)==0
5b90: 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   ){.    for(i=0;
5ba0: 20 69 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28   i<(int)(sizeof(
5bb0: 61 50 72 65 66 69 78 29 2f 73 69 7a 65 6f 66 28  aPrefix)/sizeof(
5bc0: 61 50 72 65 66 69 78 5b 30 5d 29 29 3b 20 69 2b  aPrefix[0])); i+
5bd0: 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20  +){.      int n 
5be0: 3d 20 73 74 72 6c 65 6e 33 30 28 61 50 72 65 66  = strlen30(aPref
5bf0: 69 78 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66  ix[i]);.      if
5c00: 28 20 73 74 72 6e 63 6d 70 28 7a 49 6e 2b 37 2c  ( strncmp(zIn+7,
5c10: 20 61 50 72 65 66 69 78 5b 69 5d 2c 20 6e 29 3d   aPrefix[i], n)=
5c20: 3d 30 20 26 26 20 7a 49 6e 5b 6e 2b 37 5d 3d 3d  =0 && zIn[n+7]==
5c30: 27 20 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ' ' ){.        c
5c40: 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20  har *z = 0;.    
5c50: 20 20 20 20 63 68 61 72 20 2a 7a 46 61 6b 65 20      char *zFake 
5c60: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28  = 0;.        if(
5c70: 20 7a 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20   zSchema ){.    
5c80: 20 20 20 20 20 20 63 68 61 72 20 63 51 75 6f 74        char cQuot
5c90: 65 20 3d 20 71 75 6f 74 65 43 68 61 72 28 7a 53  e = quoteChar(zS
5ca0: 63 68 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20  chema);.        
5cb0: 20 20 69 66 28 20 63 51 75 6f 74 65 20 26 26 20    if( cQuote && 
5cc0: 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
5cd0: 7a 53 63 68 65 6d 61 2c 22 74 65 6d 70 22 29 21  zSchema,"temp")!
5ce0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
5cf0: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
5d00: 72 69 6e 74 66 28 22 25 2e 2a 73 20 5c 22 25 77  rintf("%.*s \"%w
5d10: 5c 22 2e 25 73 22 2c 20 6e 2b 37 2c 20 7a 49 6e  \".%s", n+7, zIn
5d20: 2c 20 7a 53 63 68 65 6d 61 2c 20 7a 49 6e 2b 6e  , zSchema, zIn+n
5d30: 2b 38 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  +8);.          }
5d40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
5d50: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
5d60: 72 69 6e 74 66 28 22 25 2e 2a 73 20 25 73 2e 25  rintf("%.*s %s.%
5d70: 73 22 2c 20 6e 2b 37 2c 20 7a 49 6e 2c 20 7a 53  s", n+7, zIn, zS
5d80: 63 68 65 6d 61 2c 20 7a 49 6e 2b 6e 2b 38 29 3b  chema, zIn+n+8);
5d90: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
5da0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
5db0: 66 28 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20  f( zName.       
5dc0: 20 20 26 26 20 61 50 72 65 66 69 78 5b 69 5d 5b    && aPrefix[i][
5dd0: 30 5d 3d 3d 27 56 27 0a 20 20 20 20 20 20 20 20  0]=='V'.        
5de0: 20 26 26 20 28 7a 46 61 6b 65 20 3d 20 73 68 65   && (zFake = she
5df0: 6c 6c 46 61 6b 65 53 63 68 65 6d 61 28 64 62 2c  llFakeSchema(db,
5e00: 20 7a 53 63 68 65 6d 61 2c 20 7a 4e 61 6d 65 29   zSchema, zName)
5e10: 29 21 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a  )!=0.        ){.
5e20: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 3d            if( z=
5e30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
5e40: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
5e50: 72 69 6e 74 66 28 22 25 73 5c 6e 2f 2a 20 25 7a  rintf("%s\n/* %z
5e60: 20 2a 2f 22 2c 20 7a 49 6e 2c 20 7a 46 61 6b 65   */", zIn, zFake
5e70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
5e80: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
5e90: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
5ea0: 6e 74 66 28 22 25 7a 5c 6e 2f 2a 20 25 7a 20 2a  ntf("%z\n/* %z *
5eb0: 2f 22 2c 20 7a 2c 20 7a 46 61 6b 65 29 3b 0a 20  /", z, zFake);. 
5ec0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
5ed0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
5ee0: 20 7a 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20   z ){.          
5ef0: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
5f00: 65 78 74 28 70 43 74 78 2c 20 7a 2c 20 2d 31 2c  ext(pCtx, z, -1,
5f10: 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a   sqlite3_free);.
5f20: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
5f30: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5f40: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
5f50: 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76  sqlite3_result_v
5f60: 61 6c 75 65 28 70 43 74 78 2c 20 61 70 56 61 6c  alue(pCtx, apVal
5f70: 5b 30 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  [0]);.}../*.** T
5f80: 68 65 20 73 6f 75 72 63 65 20 63 6f 64 65 20 66  he source code f
5f90: 6f 72 20 73 65 76 65 72 61 6c 20 72 75 6e 2d 74  or several run-t
5fa0: 69 6d 65 20 6c 6f 61 64 61 62 6c 65 20 65 78 74  ime loadable ext
5fb0: 65 6e 73 69 6f 6e 73 20 69 73 20 69 6e 73 65 72  ensions is inser
5fc0: 74 65 64 0a 2a 2a 20 62 65 6c 6f 77 20 62 79 20  ted.** below by 
5fd0: 74 68 65 20 2e 2e 2f 74 6f 6f 6c 2f 6d 6b 73 68  the ../tool/mksh
5fe0: 65 6c 6c 63 2e 74 63 6c 20 73 63 72 69 70 74 2e  ellc.tcl script.
5ff0: 20 20 42 65 66 6f 72 65 20 70 72 6f 63 65 73 73    Before process
6000: 69 6e 67 20 74 68 61 74 20 69 6e 63 6c 75 64 65  ing that include
6010: 64 0a 2a 2a 20 63 6f 64 65 2c 20 77 65 20 6e 65  d.** code, we ne
6020: 65 64 20 74 6f 20 6f 76 65 72 72 69 64 65 20 73  ed to override s
6030: 6f 6d 65 20 6d 61 63 72 6f 73 20 74 6f 20 6d 61  ome macros to ma
6040: 6b 65 20 74 68 65 20 69 6e 63 6c 75 64 65 64 20  ke the included 
6050: 70 72 6f 67 72 61 6d 20 63 6f 64 65 0a 2a 2a 20  program code.** 
6060: 77 6f 72 6b 20 68 65 72 65 20 69 6e 20 74 68 65  work here in the
6070: 20 6d 69 64 64 6c 65 20 6f 66 20 74 68 69 73 20   middle of this 
6080: 72 65 67 75 6c 61 72 20 70 72 6f 67 72 61 6d 2e  regular program.
6090: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49  .*/.#define SQLI
60a0: 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49  TE_EXTENSION_INI
60b0: 54 31 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54  T1.#define SQLIT
60c0: 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54  E_EXTENSION_INIT
60d0: 32 28 58 29 20 28 76 6f 69 64 29 28 58 29 0a 0a  2(X) (void)(X)..
60e0: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e  #if defined(_WIN
60f0: 33 32 29 20 26 26 20 64 65 66 69 6e 65 64 28 5f  32) && defined(_
6100: 4d 53 43 5f 56 45 52 29 0a 49 4e 43 4c 55 44 45  MSC_VER).INCLUDE
6110: 20 74 65 73 74 5f 77 69 6e 64 69 72 65 6e 74 2e   test_windirent.
6120: 63 0a 23 64 65 66 69 6e 65 20 64 69 72 65 6e 74  c.#define dirent
6130: 20 44 49 52 45 4e 54 0a 23 65 6e 64 69 66 0a 49   DIRENT.#endif.I
6140: 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69  NCLUDE ../ext/mi
6150: 73 63 2f 73 68 61 74 68 72 65 65 2e 63 0a 49 4e  sc/shathree.c.IN
6160: 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73  CLUDE ../ext/mis
6170: 63 2f 66 69 6c 65 69 6f 2e 63 0a 49 4e 43 4c 55  c/fileio.c.INCLU
6180: 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 63  DE ../ext/misc/c
6190: 6f 6d 70 6c 65 74 69 6f 6e 2e 63 0a 23 69 66 64  ompletion.c.#ifd
61a0: 65 66 20 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a  ef SQLITE_HAVE_Z
61b0: 4c 49 42 0a 49 4e 43 4c 55 44 45 20 2e 2e 2f 65  LIB.INCLUDE ../e
61c0: 78 74 2f 6d 69 73 63 2f 7a 69 70 66 69 6c 65 2e  xt/misc/zipfile.
61d0: 63 0a 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74  c.INCLUDE ../ext
61e0: 2f 6d 69 73 63 2f 73 71 6c 61 72 2e 63 0a 23 65  /misc/sqlar.c.#e
61f0: 6e 64 69 66 0a 49 4e 43 4c 55 44 45 20 2e 2e 2f  ndif.INCLUDE ../
6200: 65 78 74 2f 65 78 70 65 72 74 2f 73 71 6c 69 74  ext/expert/sqlit
6210: 65 33 65 78 70 65 72 74 2e 68 0a 49 4e 43 4c 55  e3expert.h.INCLU
6220: 44 45 20 2e 2e 2f 65 78 74 2f 65 78 70 65 72 74  DE ../ext/expert
6230: 2f 73 71 6c 69 74 65 33 65 78 70 65 72 74 2e 63  /sqlite3expert.c
6240: 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  ..#if defined(SQ
6250: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53  LITE_ENABLE_SESS
6260: 49 4f 4e 29 0a 2f 2a 0a 2a 2a 20 53 74 61 74 65  ION)./*.** State
6270: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72   information for
6280: 20 61 20 73 69 6e 67 6c 65 20 6f 70 65 6e 20 73   a single open s
6290: 65 73 73 69 6f 6e 0a 2a 2f 0a 74 79 70 65 64 65  ession.*/.typede
62a0: 66 20 73 74 72 75 63 74 20 4f 70 65 6e 53 65 73  f struct OpenSes
62b0: 73 69 6f 6e 20 4f 70 65 6e 53 65 73 73 69 6f 6e  sion OpenSession
62c0: 3b 0a 73 74 72 75 63 74 20 4f 70 65 6e 53 65 73  ;.struct OpenSes
62d0: 73 69 6f 6e 20 7b 0a 20 20 63 68 61 72 20 2a 7a  sion {.  char *z
62e0: 4e 61 6d 65 3b 20 20 20 20 20 20 20 20 20 20 20  Name;           
62f0: 20 20 2f 2a 20 53 79 6d 62 6f 6c 69 63 20 6e 61    /* Symbolic na
6300: 6d 65 20 66 6f 72 20 74 68 69 73 20 73 65 73 73  me for this sess
6310: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 46 69  ion */.  int nFi
6320: 6c 74 65 72 3b 20 20 20 20 20 20 20 20 20 20 20  lter;           
6330: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 78    /* Number of x
6340: 46 69 6c 74 65 72 20 72 65 6a 65 63 74 69 6f 6e  Filter rejection
6350: 20 47 4c 4f 42 20 70 61 74 74 65 72 6e 73 20 2a   GLOB patterns *
6360: 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 46 69 6c  /.  char **azFil
6370: 74 65 72 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ter;         /* 
6380: 41 72 72 61 79 20 6f 66 20 78 46 69 6c 74 65 72  Array of xFilter
6390: 20 72 65 6a 65 63 74 69 6f 6e 20 47 4c 4f 42 20   rejection GLOB 
63a0: 70 61 74 74 65 72 6e 73 20 2a 2f 0a 20 20 73 71  patterns */.  sq
63b0: 6c 69 74 65 33 5f 73 65 73 73 69 6f 6e 20 2a 70  lite3_session *p
63c0: 3b 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6f 70  ;      /* The op
63d0: 65 6e 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 7d 3b  en session */.};
63e0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 53  .#endif../*.** S
63f0: 68 65 6c 6c 20 6f 75 74 70 75 74 20 6d 6f 64 65  hell output mode
6400: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 72 6f   information fro
6410: 6d 20 62 65 66 6f 72 65 20 22 2e 65 78 70 6c 61  m before ".expla
6420: 69 6e 20 6f 6e 22 2c 0a 2a 2a 20 73 61 76 65 64  in on",.** saved
6430: 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20   so that it can 
6440: 62 65 20 72 65 73 74 6f 72 65 64 20 62 79 20 22  be restored by "
6450: 2e 65 78 70 6c 61 69 6e 20 6f 66 66 22 0a 2a 2f  .explain off".*/
6460: 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20  .typedef struct 
6470: 53 61 76 65 64 4d 6f 64 65 49 6e 66 6f 20 53 61  SavedModeInfo Sa
6480: 76 65 64 4d 6f 64 65 49 6e 66 6f 3b 0a 73 74 72  vedModeInfo;.str
6490: 75 63 74 20 53 61 76 65 64 4d 6f 64 65 49 6e 66  uct SavedModeInf
64a0: 6f 20 7b 0a 20 20 69 6e 74 20 76 61 6c 69 64 3b  o {.  int valid;
64b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 73 20            /* Is 
64c0: 74 68 65 72 65 20 6c 65 67 69 74 20 64 61 74 61  there legit data
64d0: 20 69 6e 20 68 65 72 65 3f 20 2a 2f 0a 20 20 69   in here? */.  i
64e0: 6e 74 20 6d 6f 64 65 3b 20 20 20 20 20 20 20 20  nt mode;        
64f0: 20 20 20 2f 2a 20 4d 6f 64 65 20 70 72 69 6f 72     /* Mode prior
6500: 20 74 6f 20 22 2e 65 78 70 6c 61 69 6e 20 6f 6e   to ".explain on
6510: 22 20 2a 2f 0a 20 20 69 6e 74 20 73 68 6f 77 48  " */.  int showH
6520: 65 61 64 65 72 3b 20 20 20 20 20 2f 2a 20 54 68  eader;     /* Th
6530: 65 20 22 2e 68 65 61 64 65 72 22 20 73 65 74 74  e ".header" sett
6540: 69 6e 67 20 70 72 69 6f 72 20 74 6f 20 22 2e 65  ing prior to ".e
6550: 78 70 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20  xplain on" */.  
6560: 69 6e 74 20 63 6f 6c 57 69 64 74 68 5b 31 30 30  int colWidth[100
6570: 5d 3b 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 77 69  ];  /* Column wi
6580: 64 74 68 73 20 70 72 69 6f 72 20 74 6f 20 22 2e  dths prior to ".
6590: 65 78 70 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 7d  explain on" */.}
65a0: 3b 0a 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  ;..typedef struc
65b0: 74 20 45 78 70 65 72 74 49 6e 66 6f 20 45 78 70  t ExpertInfo Exp
65c0: 65 72 74 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20  ertInfo;.struct 
65d0: 45 78 70 65 72 74 49 6e 66 6f 20 7b 0a 20 20 73  ExpertInfo {.  s
65e0: 71 6c 69 74 65 33 65 78 70 65 72 74 20 2a 70 45  qlite3expert *pE
65f0: 78 70 65 72 74 3b 0a 20 20 69 6e 74 20 62 56 65  xpert;.  int bVe
6600: 72 62 6f 73 65 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  rbose;.};../*.**
6610: 20 53 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69   State informati
6620: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 64 61 74  on about the dat
6630: 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e  abase connection
6640: 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e   is contained in
6650: 20 61 6e 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20   an.** instance 
6660: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
6670: 20 73 74 72 75 63 74 75 72 65 2e 0a 2a 2f 0a 74   structure..*/.t
6680: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 53 68  ypedef struct Sh
6690: 65 6c 6c 53 74 61 74 65 20 53 68 65 6c 6c 53 74  ellState ShellSt
66a0: 61 74 65 3b 0a 73 74 72 75 63 74 20 53 68 65 6c  ate;.struct Shel
66b0: 6c 53 74 61 74 65 20 7b 0a 20 20 73 71 6c 69 74  lState {.  sqlit
66c0: 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20  e3 *db;         
66d0: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
66e0: 65 20 2a 2f 0a 20 20 75 38 20 61 75 74 6f 45 78  e */.  u8 autoEx
66f0: 70 6c 61 69 6e 3b 20 20 20 20 20 20 20 20 2f 2a  plain;        /*
6700: 20 41 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 74   Automatically t
6710: 75 72 6e 20 6f 6e 20 2e 65 78 70 6c 61 69 6e 20  urn on .explain 
6720: 6d 6f 64 65 20 2a 2f 0a 20 20 75 38 20 61 75 74  mode */.  u8 aut
6730: 6f 45 51 50 3b 20 20 20 20 20 20 20 20 20 20 20  oEQP;           
6740: 20 2f 2a 20 52 75 6e 20 45 58 50 4c 41 49 4e 20   /* Run EXPLAIN 
6750: 51 55 45 52 59 20 50 4c 41 4e 20 70 72 69 6f 72  QUERY PLAN prior
6760: 20 74 6f 20 73 65 61 63 68 20 53 51 4c 20 73 74   to seach SQL st
6770: 6d 74 20 2a 2f 0a 20 20 75 38 20 73 74 61 74 73  mt */.  u8 stats
6780: 4f 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  On;            /
6790: 2a 20 54 72 75 65 20 74 6f 20 64 69 73 70 6c 61  * True to displa
67a0: 79 20 6d 65 6d 6f 72 79 20 73 74 61 74 73 20 62  y memory stats b
67b0: 65 66 6f 72 65 20 65 61 63 68 20 66 69 6e 61 6c  efore each final
67c0: 69 7a 65 20 2a 2f 0a 20 20 75 38 20 73 63 61 6e  ize */.  u8 scan
67d0: 73 74 61 74 73 4f 6e 3b 20 20 20 20 20 20 20 20  statsOn;        
67e0: 2f 2a 20 54 72 75 65 20 74 6f 20 64 69 73 70 6c  /* True to displ
67f0: 61 79 20 73 63 61 6e 20 73 74 61 74 73 20 62 65  ay scan stats be
6800: 66 6f 72 65 20 65 61 63 68 20 66 69 6e 61 6c 69  fore each finali
6810: 7a 65 20 2a 2f 0a 20 20 75 38 20 6f 70 65 6e 4d  ze */.  u8 openM
6820: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f  ode;           /
6830: 2a 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 4e 4f 52  * SHELL_OPEN_NOR
6840: 4d 41 4c 2c 20 5f 41 50 50 45 4e 44 56 46 53 2c  MAL, _APPENDVFS,
6850: 20 6f 72 20 5f 5a 49 50 46 49 4c 45 20 2a 2f 0a   or _ZIPFILE */.
6860: 20 20 69 6e 74 20 6f 75 74 43 6f 75 6e 74 3b 20    int outCount; 
6870: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 76 65           /* Reve
6880: 72 74 20 74 6f 20 73 74 64 6f 75 74 20 77 68 65  rt to stdout whe
6890: 6e 20 72 65 61 63 68 69 6e 67 20 7a 65 72 6f 20  n reaching zero 
68a0: 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20  */.  int cnt;   
68b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
68c0: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
68d0: 20 64 69 73 70 6c 61 79 65 64 20 73 6f 20 66 61   displayed so fa
68e0: 72 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 6f 75 74  r */.  FILE *out
68f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
6900: 20 57 72 69 74 65 20 72 65 73 75 6c 74 73 20 68   Write results h
6910: 65 72 65 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 74  ere */.  FILE *t
6920: 72 61 63 65 4f 75 74 3b 20 20 20 20 20 20 20 20  raceOut;        
6930: 2f 2a 20 4f 75 74 70 75 74 20 66 6f 72 20 73 71  /* Output for sq
6940: 6c 69 74 65 33 5f 74 72 61 63 65 28 29 20 2a 2f  lite3_trace() */
6950: 0a 20 20 69 6e 74 20 6e 45 72 72 3b 20 20 20 20  .  int nErr;    
6960: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6970: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65  ber of errors se
6980: 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64 65  en */.  int mode
6990: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
69a0: 2a 20 41 6e 20 6f 75 74 70 75 74 20 6d 6f 64 65  * An output mode
69b0: 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 69 6e   setting */.  in
69c0: 74 20 63 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  t cMode;        
69d0: 20 20 20 20 20 2f 2a 20 74 65 6d 70 6f 72 61 72       /* temporar
69e0: 79 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 66 6f  y output mode fo
69f0: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 71 75  r the current qu
6a00: 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 72  ery */.  int nor
6a10: 6d 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  malMode;        
6a20: 2f 2a 20 4f 75 74 70 75 74 20 6d 6f 64 65 20 62  /* Output mode b
6a30: 65 66 6f 72 65 20 22 2e 65 78 70 6c 61 69 6e 20  efore ".explain 
6a40: 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74 20 77 72 69  on" */.  int wri
6a50: 74 61 62 6c 65 53 63 68 65 6d 61 3b 20 20 20 20  tableSchema;    
6a60: 2f 2a 20 54 72 75 65 20 69 66 20 50 52 41 47 4d  /* True if PRAGM
6a70: 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
6a80: 61 3d 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 73 68  a=ON */.  int sh
6a90: 6f 77 48 65 61 64 65 72 3b 20 20 20 20 20 20 20  owHeader;       
6aa0: 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 68 6f 77   /* True to show
6ab0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 6e   column names in
6ac0: 20 4c 69 73 74 20 6f 72 20 43 6f 6c 75 6d 6e 20   List or Column 
6ad0: 6d 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  mode */.  int nC
6ae0: 68 65 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  heck;           
6af0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 22 2e   /* Number of ".
6b00: 63 68 65 63 6b 22 20 63 6f 6d 6d 61 6e 64 73 20  check" commands 
6b10: 72 75 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  run */.  unsigne
6b20: 64 20 73 68 65 6c 6c 46 6c 67 73 3b 20 20 20 20  d shellFlgs;    
6b30: 2f 2a 20 56 61 72 69 6f 75 73 20 66 6c 61 67 73  /* Various flags
6b40: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 65 73   */.  char *zDes
6b50: 74 54 61 62 6c 65 3b 20 20 20 20 20 20 2f 2a 20  tTable;      /* 
6b60: 4e 61 6d 65 20 6f 66 20 64 65 73 74 69 6e 61 74  Name of destinat
6b70: 69 6f 6e 20 74 61 62 6c 65 20 77 68 65 6e 20 4d  ion table when M
6b80: 4f 44 45 5f 49 6e 73 65 72 74 20 2a 2f 0a 20 20  ODE_Insert */.  
6b90: 63 68 61 72 20 7a 54 65 73 74 63 61 73 65 5b 33  char zTestcase[3
6ba0: 30 5d 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  0];    /* Name o
6bb0: 66 20 63 75 72 72 65 6e 74 20 74 65 73 74 20 63  f current test c
6bc0: 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f  ase */.  char co
6bd0: 6c 53 65 70 61 72 61 74 6f 72 5b 32 30 5d 3b 20  lSeparator[20]; 
6be0: 2f 2a 20 43 6f 6c 75 6d 6e 20 73 65 70 61 72 61  /* Column separa
6bf0: 74 6f 72 20 63 68 61 72 61 63 74 65 72 20 66 6f  tor character fo
6c00: 72 20 73 65 76 65 72 61 6c 20 6d 6f 64 65 73 20  r several modes 
6c10: 2a 2f 0a 20 20 63 68 61 72 20 72 6f 77 53 65 70  */.  char rowSep
6c20: 61 72 61 74 6f 72 5b 32 30 5d 3b 20 2f 2a 20 52  arator[20]; /* R
6c30: 6f 77 20 73 65 70 61 72 61 74 6f 72 20 63 68 61  ow separator cha
6c40: 72 61 63 74 65 72 20 66 6f 72 20 4d 4f 44 45 5f  racter for MODE_
6c50: 41 73 63 69 69 20 2a 2f 0a 20 20 69 6e 74 20 63  Ascii */.  int c
6c60: 6f 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20 20 20  olWidth[100];   
6c70: 20 20 2f 2a 20 52 65 71 75 65 73 74 65 64 20 77    /* Requested w
6c80: 69 64 74 68 20 6f 66 20 65 61 63 68 20 63 6f 6c  idth of each col
6c90: 75 6d 6e 20 77 68 65 6e 20 69 6e 20 63 6f 6c 75  umn when in colu
6ca0: 6d 6e 20 6d 6f 64 65 2a 2f 0a 20 20 69 6e 74 20  mn mode*/.  int 
6cb0: 61 63 74 75 61 6c 57 69 64 74 68 5b 31 30 30 5d  actualWidth[100]
6cc0: 3b 20 20 2f 2a 20 41 63 74 75 61 6c 20 77 69 64  ;  /* Actual wid
6cd0: 74 68 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d  th of each colum
6ce0: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 6e 75 6c 6c  n */.  char null
6cf0: 56 61 6c 75 65 5b 32 30 5d 3b 20 20 20 20 2f 2a  Value[20];    /*
6d00: 20 54 68 65 20 74 65 78 74 20 74 6f 20 70 72 69   The text to pri
6d10: 6e 74 20 77 68 65 6e 20 61 20 4e 55 4c 4c 20 63  nt when a NULL c
6d20: 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f 6d 0a 20  omes back from. 
6d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6d40: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64          ** the d
6d50: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61  atabase */.  cha
6d60: 72 20 6f 75 74 66 69 6c 65 5b 46 49 4c 45 4e 41  r outfile[FILENA
6d70: 4d 45 5f 4d 41 58 5d 3b 20 2f 2a 20 46 69 6c 65  ME_MAX]; /* File
6d80: 6e 61 6d 65 20 66 6f 72 20 2a 6f 75 74 20 2a 2f  name for *out */
6d90: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6da0: 44 62 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 2f  DbFilename;    /
6db0: 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * name of the da
6dc0: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
6dd0: 20 63 68 61 72 20 2a 7a 46 72 65 65 4f 6e 43 6c   char *zFreeOnCl
6de0: 6f 73 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ose;         /* 
6df0: 46 69 6c 65 6e 61 6d 65 20 74 6f 20 66 72 65 65  Filename to free
6e00: 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f   when closing */
6e10: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6e20: 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Vfs;           /
6e30: 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53 20 74 6f  * Name of VFS to
6e40: 20 75 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65   use */.  sqlite
6e50: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20  3_stmt *pStmt;  
6e60: 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 74 61 74   /* Current stat
6e70: 65 6d 65 6e 74 20 69 66 20 61 6e 79 2e 20 2a 2f  ement if any. */
6e80: 0a 20 20 46 49 4c 45 20 2a 70 4c 6f 67 3b 20 20  .  FILE *pLog;  
6e90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
6ea0: 74 65 20 6c 6f 67 20 6f 75 74 70 75 74 20 68 65  te log output he
6eb0: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 49  re */.  int *aiI
6ec0: 6e 64 65 6e 74 3b 20 20 20 20 20 20 20 20 20 2f  ndent;         /
6ed0: 2a 20 41 72 72 61 79 20 6f 66 20 69 6e 64 65 6e  * Array of inden
6ee0: 74 73 20 75 73 65 64 20 69 6e 20 4d 4f 44 45 5f  ts used in MODE_
6ef0: 45 78 70 6c 61 69 6e 20 2a 2f 0a 20 20 69 6e 74  Explain */.  int
6f00: 20 6e 49 6e 64 65 6e 74 3b 20 20 20 20 20 20 20   nIndent;       
6f10: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
6f20: 72 72 61 79 20 61 69 49 6e 64 65 6e 74 5b 5d 20  rray aiIndent[] 
6f30: 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65 6e 74  */.  int iIndent
6f40: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;           /* I
6f50: 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20  ndex of current 
6f60: 6f 70 20 69 6e 20 61 69 49 6e 64 65 6e 74 5b 5d  op in aiIndent[]
6f70: 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
6f80: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
6f90: 53 53 49 4f 4e 29 0a 20 20 69 6e 74 20 6e 53 65  SSION).  int nSe
6fa0: 73 73 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  ssion;          
6fb0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6fc0: 61 63 74 69 76 65 20 73 65 73 73 69 6f 6e 73 20  active sessions 
6fd0: 2a 2f 0a 20 20 4f 70 65 6e 53 65 73 73 69 6f 6e  */.  OpenSession
6fe0: 20 61 53 65 73 73 69 6f 6e 5b 34 5d 3b 20 20 2f   aSession[4];  /
6ff0: 2a 20 41 72 72 61 79 20 6f 66 20 73 65 73 73 69  * Array of sessi
7000: 6f 6e 73 2e 20 20 5b 30 5d 20 69 73 20 69 6e 20  ons.  [0] is in 
7010: 66 6f 63 75 73 2e 20 2a 2f 0a 23 65 6e 64 69 66  focus. */.#endif
7020: 0a 20 20 45 78 70 65 72 74 49 6e 66 6f 20 65 78  .  ExpertInfo ex
7030: 70 65 72 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  pert;        /* 
7040: 56 61 6c 69 64 20 69 66 20 70 72 65 76 69 6f 75  Valid if previou
7050: 73 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20 22 2e  s command was ".
7060: 65 78 70 65 72 74 20 4f 50 54 2e 2e 2e 22 20 2a  expert OPT..." *
7070: 2f 0a 7d 3b 0a 0a 0a 2f 2a 20 41 6c 6c 6f 77 65  /.};.../* Allowe
7080: 64 20 76 61 6c 75 65 73 20 66 6f 72 20 53 68 65  d values for She
7090: 6c 6c 53 74 61 74 65 2e 61 75 74 6f 45 51 50 0a  llState.autoEQP.
70a0: 2a 2f 0a 23 64 65 66 69 6e 65 20 41 55 54 4f 45  */.#define AUTOE
70b0: 51 50 5f 6f 66 66 20 20 20 20 20 20 30 0a 23 64  QP_off      0.#d
70c0: 65 66 69 6e 65 20 41 55 54 4f 45 51 50 5f 6f 6e  efine AUTOEQP_on
70d0: 20 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65         1.#define
70e0: 20 41 55 54 4f 45 51 50 5f 74 72 69 67 67 65 72   AUTOEQP_trigger
70f0: 20 20 32 0a 23 64 65 66 69 6e 65 20 41 55 54 4f    2.#define AUTO
7100: 45 51 50 5f 66 75 6c 6c 20 20 20 20 20 33 0a 0a  EQP_full     3..
7110: 2f 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c 75 65  /* Allowed value
7120: 73 20 66 6f 72 20 53 68 65 6c 6c 53 74 61 74 65  s for ShellState
7130: 2e 6f 70 65 6e 4d 6f 64 65 0a 2a 2f 0a 23 64 65  .openMode.*/.#de
7140: 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f  fine SHELL_OPEN_
7150: 55 4e 53 50 45 43 20 20 20 20 20 30 20 20 20 20  UNSPEC     0    
7160: 20 20 2f 2a 20 4e 6f 20 6f 70 65 6e 2d 6d 6f 64    /* No open-mod
7170: 65 20 73 70 65 63 69 66 69 65 64 20 2a 2f 0a 23  e specified */.#
7180: 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45  define SHELL_OPE
7190: 4e 5f 4e 4f 52 4d 41 4c 20 20 20 20 20 31 20 20  N_NORMAL     1  
71a0: 20 20 20 20 2f 2a 20 4e 6f 72 6d 61 6c 20 64 61      /* Normal da
71b0: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 23  tabase file */.#
71c0: 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 4f 50 45  define SHELL_OPE
71d0: 4e 5f 41 50 50 45 4e 44 56 46 53 20 20 32 20 20  N_APPENDVFS  2  
71e0: 20 20 20 20 2f 2a 20 55 73 65 20 61 70 70 65 6e      /* Use appen
71f0: 64 76 66 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20  dvfs */.#define 
7200: 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50 46 49  SHELL_OPEN_ZIPFI
7210: 4c 45 20 20 20 20 33 20 20 20 20 20 20 2f 2a 20  LE    3      /* 
7220: 55 73 65 20 74 68 65 20 7a 69 70 66 69 6c 65 20  Use the zipfile 
7230: 76 69 72 74 75 61 6c 20 74 61 62 6c 65 20 2a 2f  virtual table */
7240: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72  ../*.** These ar
7250: 65 20 74 68 65 20 61 6c 6c 6f 77 65 64 20 73 68  e the allowed sh
7260: 65 6c 6c 46 6c 67 73 20 76 61 6c 75 65 73 0a 2a  ellFlgs values.*
7270: 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f  /.#define SHFLG_
7280: 50 61 67 65 63 61 63 68 65 20 20 20 20 20 20 30  Pagecache      0
7290: 78 30 30 30 30 30 30 30 31 20 2f 2a 20 54 68 65  x00000001 /* The
72a0: 20 2d 2d 70 61 67 65 63 61 63 68 65 20 6f 70 74   --pagecache opt
72b0: 69 6f 6e 20 69 73 20 75 73 65 64 20 2a 2f 0a 23  ion is used */.#
72c0: 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 4c 6f 6f  define SHFLG_Loo
72d0: 6b 61 73 69 64 65 20 20 20 20 20 20 30 78 30 30  kaside      0x00
72e0: 30 30 30 30 30 32 20 2f 2a 20 4c 6f 6f 6b 61 73  000002 /* Lookas
72f0: 69 64 65 20 6d 65 6d 6f 72 79 20 69 73 20 75 73  ide memory is us
7300: 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48  ed */.#define SH
7310: 46 4c 47 5f 42 61 63 6b 73 6c 61 73 68 20 20 20  FLG_Backslash   
7320: 20 20 20 30 78 30 30 30 30 30 30 30 34 20 2f 2a     0x00000004 /*
7330: 20 54 68 65 20 2d 2d 62 61 63 6b 73 6c 61 73 68   The --backslash
7340: 20 6f 70 74 69 6f 6e 20 69 73 20 75 73 65 64 20   option is used 
7350: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47  */.#define SHFLG
7360: 5f 50 72 65 73 65 72 76 65 52 6f 77 69 64 20 20  _PreserveRowid  
7370: 30 78 30 30 30 30 30 30 30 38 20 2f 2a 20 2e 64  0x00000008 /* .d
7380: 75 6d 70 20 70 72 65 73 65 72 76 65 73 20 72 6f  ump preserves ro
7390: 77 69 64 20 76 61 6c 75 65 73 20 2a 2f 0a 23 64  wid values */.#d
73a0: 65 66 69 6e 65 20 53 48 46 4c 47 5f 4e 65 77 6c  efine SHFLG_Newl
73b0: 69 6e 65 73 20 20 20 20 20 20 20 30 78 30 30 30  ines       0x000
73c0: 30 30 30 31 30 20 2f 2a 20 2e 64 75 6d 70 20 2d  00010 /* .dump -
73d0: 2d 6e 65 77 6c 69 6e 65 20 66 6c 61 67 20 2a 2f  -newline flag */
73e0: 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 43  .#define SHFLG_C
73f0: 6f 75 6e 74 43 68 61 6e 67 65 73 20 20 20 30 78  ountChanges   0x
7400: 30 30 30 30 30 30 32 30 20 2f 2a 20 2e 63 68 61  00000020 /* .cha
7410: 6e 67 65 73 20 73 65 74 74 69 6e 67 20 2a 2f 0a  nges setting */.
7420: 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 45 63  #define SHFLG_Ec
7430: 68 6f 20 20 20 20 20 20 20 20 20 20 20 30 78 30  ho           0x0
7440: 30 30 30 30 30 34 30 20 2f 2a 20 2e 65 63 68 6f  0000040 /* .echo
7450: 20 6f 72 20 2d 2d 65 63 68 6f 20 73 65 74 74 69   or --echo setti
7460: 6e 67 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63  ng */../*.** Mac
7470: 72 6f 73 20 66 6f 72 20 74 65 73 74 69 6e 67 20  ros for testing 
7480: 61 6e 64 20 73 65 74 74 69 6e 67 20 73 68 65 6c  and setting shel
7490: 6c 46 6c 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65  lFlgs.*/.#define
74a0: 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 50 2c   ShellHasFlag(P,
74b0: 58 29 20 20 20 20 28 28 28 50 29 2d 3e 73 68 65  X)    (((P)->she
74c0: 6c 6c 46 6c 67 73 20 26 20 28 58 29 29 21 3d 30  llFlgs & (X))!=0
74d0: 29 0a 23 64 65 66 69 6e 65 20 53 68 65 6c 6c 53  ).#define ShellS
74e0: 65 74 46 6c 61 67 28 50 2c 58 29 20 20 20 20 28  etFlag(P,X)    (
74f0: 28 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 7c 3d  (P)->shellFlgs|=
7500: 28 58 29 29 0a 23 64 65 66 69 6e 65 20 53 68 65  (X)).#define She
7510: 6c 6c 43 6c 65 61 72 46 6c 61 67 28 50 2c 58 29  llClearFlag(P,X)
7520: 20 20 28 28 50 29 2d 3e 73 68 65 6c 6c 46 6c 67    ((P)->shellFlg
7530: 73 26 3d 28 7e 28 58 29 29 29 0a 0a 2f 2a 0a 2a  s&=(~(X)))../*.*
7540: 2a 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20  * These are the 
7550: 61 6c 6c 6f 77 65 64 20 6d 6f 64 65 73 2e 0a 2a  allowed modes..*
7560: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 4c  /.#define MODE_L
7570: 69 6e 65 20 20 20 20 20 30 20 20 2f 2a 20 4f 6e  ine     0  /* On
7580: 65 20 63 6f 6c 75 6d 6e 20 70 65 72 20 6c 69 6e  e column per lin
7590: 65 2e 20 20 42 6c 61 6e 6b 20 6c 69 6e 65 20 62  e.  Blank line b
75a0: 65 74 77 65 65 6e 20 72 65 63 6f 72 64 73 20 2a  etween records *
75b0: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 43  /.#define MODE_C
75c0: 6f 6c 75 6d 6e 20 20 20 31 20 20 2f 2a 20 4f 6e  olumn   1  /* On
75d0: 65 20 72 65 63 6f 72 64 20 70 65 72 20 6c 69 6e  e record per lin
75e0: 65 20 69 6e 20 6e 65 61 74 20 63 6f 6c 75 6d 6e  e in neat column
75f0: 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44  s */.#define MOD
7600: 45 5f 4c 69 73 74 20 20 20 20 20 32 20 20 2f 2a  E_List     2  /*
7610: 20 4f 6e 65 20 72 65 63 6f 72 64 20 70 65 72 20   One record per 
7620: 6c 69 6e 65 20 77 69 74 68 20 61 20 73 65 70 61  line with a sepa
7630: 72 61 74 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65  rator */.#define
7640: 20 4d 4f 44 45 5f 53 65 6d 69 20 20 20 20 20 33   MODE_Semi     3
7650: 20 20 2f 2a 20 53 61 6d 65 20 61 73 20 4d 4f 44    /* Same as MOD
7660: 45 5f 4c 69 73 74 20 62 75 74 20 61 70 70 65 6e  E_List but appen
7670: 64 20 22 3b 22 20 74 6f 20 65 61 63 68 20 6c 69  d ";" to each li
7680: 6e 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  ne */.#define MO
7690: 44 45 5f 48 74 6d 6c 20 20 20 20 20 34 20 20 2f  DE_Html     4  /
76a0: 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 58 48  * Generate an XH
76b0: 54 4d 4c 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65  TML table */.#de
76c0: 66 69 6e 65 20 4d 4f 44 45 5f 49 6e 73 65 72 74  fine MODE_Insert
76d0: 20 20 20 35 20 20 2f 2a 20 47 65 6e 65 72 61 74     5  /* Generat
76e0: 65 20 53 51 4c 20 22 69 6e 73 65 72 74 22 20 73  e SQL "insert" s
76f0: 74 61 74 65 6d 65 6e 74 73 20 2a 2f 0a 23 64 65  tatements */.#de
7700: 66 69 6e 65 20 4d 4f 44 45 5f 51 75 6f 74 65 20  fine MODE_Quote 
7710: 20 20 20 36 20 20 2f 2a 20 51 75 6f 74 65 20 76     6  /* Quote v
7720: 61 6c 75 65 73 20 61 73 20 66 6f 72 20 53 51 4c  alues as for SQL
7730: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
7740: 5f 54 63 6c 20 20 20 20 20 20 37 20 20 2f 2a 20  _Tcl      7  /* 
7750: 47 65 6e 65 72 61 74 65 20 41 4e 53 49 2d 43 20  Generate ANSI-C 
7760: 6f 72 20 54 43 4c 20 71 75 6f 74 65 64 20 65 6c  or TCL quoted el
7770: 65 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e  ements */.#defin
7780: 65 20 4d 4f 44 45 5f 43 73 76 20 20 20 20 20 20  e MODE_Csv      
7790: 38 20 20 2f 2a 20 51 75 6f 74 65 20 73 74 72 69  8  /* Quote stri
77a0: 6e 67 73 2c 20 6e 75 6d 62 65 72 73 20 61 72 65  ngs, numbers are
77b0: 20 70 6c 61 69 6e 20 2a 2f 0a 23 64 65 66 69 6e   plain */.#defin
77c0: 65 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 20  e MODE_Explain  
77d0: 39 20 20 2f 2a 20 4c 69 6b 65 20 4d 4f 44 45 5f  9  /* Like MODE_
77e0: 43 6f 6c 75 6d 6e 2c 20 62 75 74 20 64 6f 20 6e  Column, but do n
77f0: 6f 74 20 74 72 75 6e 63 61 74 65 20 64 61 74 61  ot truncate data
7800: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
7810: 5f 41 73 63 69 69 20 20 20 31 30 20 20 2f 2a 20  _Ascii   10  /* 
7820: 55 73 65 20 41 53 43 49 49 20 75 6e 69 74 20 61  Use ASCII unit a
7830: 6e 64 20 72 65 63 6f 72 64 20 73 65 70 61 72 61  nd record separa
7840: 74 6f 72 73 20 28 30 78 31 46 2f 30 78 31 45 29  tors (0x1F/0x1E)
7850: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45   */.#define MODE
7860: 5f 50 72 65 74 74 79 20 20 31 31 20 20 2f 2a 20  _Pretty  11  /* 
7870: 50 72 65 74 74 79 2d 70 72 69 6e 74 20 73 63 68  Pretty-print sch
7880: 65 6d 61 73 20 2a 2f 0a 0a 73 74 61 74 69 63 20  emas */..static 
7890: 63 6f 6e 73 74 20 63 68 61 72 20 2a 6d 6f 64 65  const char *mode
78a0: 44 65 73 63 72 5b 5d 20 3d 20 7b 0a 20 20 22 6c  Descr[] = {.  "l
78b0: 69 6e 65 22 2c 0a 20 20 22 63 6f 6c 75 6d 6e 22  ine",.  "column"
78c0: 2c 0a 20 20 22 6c 69 73 74 22 2c 0a 20 20 22 73  ,.  "list",.  "s
78d0: 65 6d 69 22 2c 0a 20 20 22 68 74 6d 6c 22 2c 0a  emi",.  "html",.
78e0: 20 20 22 69 6e 73 65 72 74 22 2c 0a 20 20 22 71    "insert",.  "q
78f0: 75 6f 74 65 22 2c 0a 20 20 22 74 63 6c 22 2c 0a  uote",.  "tcl",.
7900: 20 20 22 63 73 76 22 2c 0a 20 20 22 65 78 70 6c    "csv",.  "expl
7910: 61 69 6e 22 2c 0a 20 20 22 61 73 63 69 69 22 2c  ain",.  "ascii",
7920: 0a 20 20 22 70 72 65 74 74 79 70 72 69 6e 74 22  .  "prettyprint"
7930: 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73  ,.};../*.** Thes
7940: 65 20 61 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e  e are the column
7950: 2f 72 6f 77 2f 6c 69 6e 65 20 73 65 70 61 72 61  /row/line separa
7960: 74 6f 72 73 20 75 73 65 64 20 62 79 20 74 68 65  tors used by the
7970: 20 76 61 72 69 6f 75 73 0a 2a 2a 20 69 6d 70 6f   various.** impo
7980: 72 74 2f 65 78 70 6f 72 74 20 6d 6f 64 65 73 2e  rt/export modes.
7990: 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 45 50 5f  .*/.#define SEP_
79a0: 43 6f 6c 75 6d 6e 20 20 20 20 22 7c 22 0a 23 64  Column    "|".#d
79b0: 65 66 69 6e 65 20 53 45 50 5f 52 6f 77 20 20 20  efine SEP_Row   
79c0: 20 20 20 20 22 5c 6e 22 0a 23 64 65 66 69 6e 65      "\n".#define
79d0: 20 53 45 50 5f 54 61 62 20 20 20 20 20 20 20 22   SEP_Tab       "
79e0: 5c 74 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f  \t".#define SEP_
79f0: 53 70 61 63 65 20 20 20 20 20 22 20 22 0a 23 64  Space     " ".#d
7a00: 65 66 69 6e 65 20 53 45 50 5f 43 6f 6d 6d 61 20  efine SEP_Comma 
7a10: 20 20 20 20 22 2c 22 0a 23 64 65 66 69 6e 65 20      ",".#define 
7a20: 53 45 50 5f 43 72 4c 66 20 20 20 20 20 20 22 5c  SEP_CrLf      "\
7a30: 72 5c 6e 22 0a 23 64 65 66 69 6e 65 20 53 45 50  r\n".#define SEP
7a40: 5f 55 6e 69 74 20 20 20 20 20 20 22 5c 78 31 46  _Unit      "\x1F
7a50: 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 52 65  ".#define SEP_Re
7a60: 63 6f 72 64 20 20 20 20 22 5c 78 31 45 22 0a 0a  cord    "\x1E"..
7a70: 2f 2a 0a 2a 2a 20 4e 75 6d 62 65 72 20 6f 66 20  /*.** Number of 
7a80: 65 6c 65 6d 65 6e 74 73 20 69 6e 20 61 6e 20 61  elements in an a
7a90: 72 72 61 79 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  rray.*/.#define 
7aa0: 41 72 72 61 79 53 69 7a 65 28 58 29 20 20 28 69  ArraySize(X)  (i
7ab0: 6e 74 29 28 73 69 7a 65 6f 66 28 58 29 2f 73 69  nt)(sizeof(X)/si
7ac0: 7a 65 6f 66 28 58 5b 30 5d 29 29 0a 0a 2f 2a 0a  zeof(X[0]))../*.
7ad0: 2a 2a 20 41 20 63 61 6c 6c 62 61 63 6b 20 66 6f  ** A callback fo
7ae0: 72 20 74 68 65 20 73 71 6c 69 74 65 33 5f 6c 6f  r the sqlite3_lo
7af0: 67 28 29 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a  g() interface..*
7b00: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68  /.static void sh
7b10: 65 6c 6c 4c 6f 67 28 76 6f 69 64 20 2a 70 41 72  ellLog(void *pAr
7b20: 67 2c 20 69 6e 74 20 69 45 72 72 43 6f 64 65 2c  g, int iErrCode,
7b30: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73   const char *zMs
7b40: 67 29 7b 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  g){.  ShellState
7b50: 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61 74   *p = (ShellStat
7b60: 65 2a 29 70 41 72 67 3b 0a 20 20 69 66 28 20 70  e*)pArg;.  if( p
7b70: 2d 3e 70 4c 6f 67 3d 3d 30 20 29 20 72 65 74 75  ->pLog==0 ) retu
7b80: 72 6e 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74  rn;.  utf8_print
7b90: 66 28 70 2d 3e 70 4c 6f 67 2c 20 22 28 25 64 29  f(p->pLog, "(%d)
7ba0: 20 25 73 5c 6e 22 2c 20 69 45 72 72 43 6f 64 65   %s\n", iErrCode
7bb0: 2c 20 7a 4d 73 67 29 3b 0a 20 20 66 66 6c 75 73  , zMsg);.  fflus
7bc0: 68 28 70 2d 3e 70 4c 6f 67 29 3b 0a 7d 0a 0a 2f  h(p->pLog);.}../
7bd0: 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20  *.** Output the 
7be0: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73 20  given string as 
7bf0: 61 20 68 65 78 2d 65 6e 63 6f 64 65 64 20 62 6c  a hex-encoded bl
7c00: 6f 62 20 28 65 67 2e 20 58 27 31 32 33 34 27 20  ob (eg. X'1234' 
7c10: 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ).*/.static void
7c20: 20 6f 75 74 70 75 74 5f 68 65 78 5f 62 6c 6f 62   output_hex_blob
7c30: 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73  (FILE *out, cons
7c40: 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62 2c 20 69  t void *pBlob, i
7c50: 6e 74 20 6e 42 6c 6f 62 29 7b 0a 20 20 69 6e 74  nt nBlob){.  int
7c60: 20 69 3b 0a 20 20 63 68 61 72 20 2a 7a 42 6c 6f   i;.  char *zBlo
7c70: 62 20 3d 20 28 63 68 61 72 20 2a 29 70 42 6c 6f  b = (char *)pBlo
7c80: 62 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28  b;.  raw_printf(
7c90: 6f 75 74 2c 22 58 27 22 29 3b 0a 20 20 66 6f 72  out,"X'");.  for
7ca0: 28 69 3d 30 3b 20 69 3c 6e 42 6c 6f 62 3b 20 69  (i=0; i<nBlob; i
7cb0: 2b 2b 29 7b 20 72 61 77 5f 70 72 69 6e 74 66 28  ++){ raw_printf(
7cc0: 6f 75 74 2c 22 25 30 32 78 22 2c 7a 42 6c 6f 62  out,"%02x",zBlob
7cd0: 5b 69 5d 26 30 78 66 66 29 3b 20 7d 0a 20 20 72  [i]&0xff); }.  r
7ce0: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 27  aw_printf(out,"'
7cf0: 22 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e  ");.}../*.** Fin
7d00: 64 20 61 20 73 74 72 69 6e 67 20 74 68 61 74 20  d a string that 
7d10: 69 73 20 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 79  is not found any
7d20: 77 68 65 72 65 20 69 6e 20 7a 5b 5d 2e 20 20 52  where in z[].  R
7d30: 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a  eturn a pointer.
7d40: 2a 2a 20 74 6f 20 74 68 61 74 20 73 74 72 69 6e  ** to that strin
7d50: 67 2e 0a 2a 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  g..**.** Try to 
7d60: 75 73 65 20 7a 41 20 61 6e 64 20 7a 42 20 66 69  use zA and zB fi
7d70: 72 73 74 2e 20 20 49 66 20 62 6f 74 68 20 6f 66  rst.  If both of
7d80: 20 74 68 6f 73 65 20 61 72 65 20 61 6c 72 65 61   those are alrea
7d90: 64 79 20 66 6f 75 6e 64 20 69 6e 20 7a 5b 5d 0a  dy found in z[].
7da0: 2a 2a 20 74 68 65 6e 20 6d 61 6b 65 20 75 70 20  ** then make up 
7db0: 73 6f 6d 65 20 73 74 72 69 6e 67 20 61 6e 64 20  some string and 
7dc0: 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20  store it in the 
7dd0: 62 75 66 66 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a  buffer zBuf..*/.
7de0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61  static const cha
7df0: 72 20 2a 75 6e 75 73 65 64 5f 73 74 72 69 6e 67  r *unused_string
7e00: 28 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  (.  const char *
7e10: 7a 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  z,              
7e20: 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 20        /* Result 
7e30: 6d 75 73 74 20 6e 6f 74 20 61 70 70 65 61 72 20  must not appear 
7e40: 61 6e 79 77 68 65 72 65 20 69 6e 20 7a 20 2a 2f  anywhere in z */
7e50: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
7e60: 41 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  A, const char *z
7e70: 42 2c 20 20 20 2f 2a 20 54 72 79 20 74 68 65 73  B,   /* Try thes
7e80: 65 20 66 69 72 73 74 20 2a 2f 0a 20 20 63 68 61  e first */.  cha
7e90: 72 20 2a 7a 42 75 66 20 20 20 20 20 20 20 20 20  r *zBuf         
7ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7eb0: 2a 20 53 70 61 63 65 20 74 6f 20 73 74 6f 72 65  * Space to store
7ec0: 20 61 20 67 65 6e 65 72 61 74 65 64 20 73 74 72   a generated str
7ed0: 69 6e 67 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69  ing */.){.  unsi
7ee0: 67 6e 65 64 20 69 20 3d 20 30 3b 0a 20 20 69 66  gned i = 0;.  if
7ef0: 28 20 73 74 72 73 74 72 28 7a 2c 20 7a 41 29 3d  ( strstr(z, zA)=
7f00: 3d 30 20 29 20 72 65 74 75 72 6e 20 7a 41 3b 0a  =0 ) return zA;.
7f10: 20 20 69 66 28 20 73 74 72 73 74 72 28 7a 2c 20    if( strstr(z, 
7f20: 7a 42 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  zB)==0 ) return 
7f30: 7a 42 3b 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71  zB;.  do{.    sq
7f40: 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 32  lite3_snprintf(2
7f50: 30 2c 7a 42 75 66 2c 22 28 25 73 25 75 29 22 2c  0,zBuf,"(%s%u)",
7f60: 20 7a 41 2c 20 69 2b 2b 29 3b 0a 20 20 7d 77 68   zA, i++);.  }wh
7f70: 69 6c 65 28 20 73 74 72 73 74 72 28 7a 2c 7a 42  ile( strstr(z,zB
7f80: 75 66 29 21 3d 30 20 29 3b 0a 20 20 72 65 74 75  uf)!=0 );.  retu
7f90: 72 6e 20 7a 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn zBuf;.}../*.*
7fa0: 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67 69 76  * Output the giv
7fb0: 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20 71  en string as a q
7fc0: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 75 73 69  uoted string usi
7fd0: 6e 67 20 53 51 4c 20 71 75 6f 74 69 6e 67 20 63  ng SQL quoting c
7fe0: 6f 6e 76 65 6e 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a  onventions..**.*
7ff0: 2a 20 53 65 65 20 61 6c 73 6f 3a 20 6f 75 74 70  * See also: outp
8000: 75 74 5f 71 75 6f 74 65 64 5f 65 73 63 61 70 65  ut_quoted_escape
8010: 64 5f 73 74 72 69 6e 67 28 29 0a 2a 2f 0a 73 74  d_string().*/.st
8020: 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74  atic void output
8030: 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 46  _quoted_string(F
8040: 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20  ILE *out, const 
8050: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20  char *z){.  int 
8060: 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20 73  i;.  char c;.  s
8070: 65 74 42 69 6e 61 72 79 4d 6f 64 65 28 6f 75 74  etBinaryMode(out
8080: 2c 20 31 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  , 1);.  for(i=0;
8090: 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26   (c = z[i])!=0 &
80a0: 26 20 63 21 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b  & c!='\''; i++){
80b0: 7d 0a 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a  }.  if( c==0 ){.
80c0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
80d0: 6f 75 74 2c 22 27 25 73 27 22 2c 7a 29 3b 0a 20  out,"'%s'",z);. 
80e0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 61 77 5f   }else{.    raw_
80f0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29  printf(out, "'")
8100: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20  ;.    while( *z 
8110: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  ){.      for(i=0
8120: 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20  ; (c = z[i])!=0 
8130: 26 26 20 63 21 3d 27 5c 27 27 3b 20 69 2b 2b 29  && c!='\''; i++)
8140: 7b 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  {}.      if( c==
8150: 27 5c 27 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20  '\'' ) i++;.    
8160: 20 20 69 66 28 20 69 20 29 7b 0a 20 20 20 20 20    if( i ){.     
8170: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f     utf8_printf(o
8180: 75 74 2c 20 22 25 2e 2a 73 22 2c 20 69 2c 20 7a  ut, "%.*s", i, z
8190: 29 3b 0a 20 20 20 20 20 20 20 20 7a 20 2b 3d 20  );.        z += 
81a0: 69 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  i;.      }.     
81b0: 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 7b 0a   if( c=='\'' ){.
81c0: 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
81d0: 74 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20  tf(out, "'");.  
81e0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
81f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
8200: 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ( c==0 ){.      
8210: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
8220: 0a 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20  .      z++;.    
8230: 7d 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  }.    raw_printf
8240: 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 7d 0a  (out, "'");.  }.
8250: 20 20 73 65 74 54 65 78 74 4d 6f 64 65 28 6f 75    setTextMode(ou
8260: 74 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  t, 1);.}../*.** 
8270: 4f 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e  Output the given
8280: 20 73 74 72 69 6e 67 20 61 73 20 61 20 71 75 6f   string as a quo
8290: 74 65 64 20 73 74 72 69 6e 67 20 75 73 69 6e 67  ted string using
82a0: 20 53 51 4c 20 71 75 6f 74 69 6e 67 20 63 6f 6e   SQL quoting con
82b0: 76 65 6e 74 69 6f 6e 73 2e 0a 2a 2a 20 41 64 64  ventions..** Add
82c0: 69 74 69 6f 6e 61 6c 6c 6c 79 20 2c 20 65 73 63  itionallly , esc
82d0: 61 70 65 20 74 68 65 20 22 5c 6e 22 20 61 6e 64  ape the "\n" and
82e0: 20 22 5c 72 22 20 63 68 61 72 61 63 74 65 72 73   "\r" characters
82f0: 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 64 6f   so that they do
8300: 20 6e 6f 74 0a 2a 2a 20 67 65 74 20 63 6f 72 72   not.** get corr
8310: 75 70 74 65 64 20 62 79 20 65 6e 64 2d 6f 66 2d  upted by end-of-
8320: 6c 69 6e 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e  line translation
8330: 20 66 61 63 69 6c 69 74 69 65 73 20 69 6e 20 73   facilities in s
8340: 6f 6d 65 20 6f 70 65 72 61 74 69 6e 67 0a 2a 2a  ome operating.**
8350: 20 73 79 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20   systems..**.** 
8360: 54 68 69 73 20 69 73 20 6c 69 6b 65 20 6f 75 74  This is like out
8370: 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e  put_quoted_strin
8380: 67 28 29 20 62 75 74 20 77 69 74 68 20 74 68 65  g() but with the
8390: 20 61 64 64 69 74 69 6f 6e 20 6f 66 20 74 68 65   addition of the
83a0: 20 5c 72 5c 6e 0a 2a 2a 20 65 73 63 61 70 65 20   \r\n.** escape 
83b0: 6d 65 63 68 61 6e 69 73 6d 2e 0a 2a 2f 0a 73 74  mechanism..*/.st
83c0: 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74  atic void output
83d0: 5f 71 75 6f 74 65 64 5f 65 73 63 61 70 65 64 5f  _quoted_escaped_
83e0: 73 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74  string(FILE *out
83f0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  , const char *z)
8400: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68 61  {.  int i;.  cha
8410: 72 20 63 3b 0a 20 20 73 65 74 42 69 6e 61 72 79  r c;.  setBinary
8420: 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a 20 20  Mode(out, 1);.  
8430: 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 5b  for(i=0; (c = z[
8440: 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 27  i])!=0 && c!='\'
8450: 27 20 26 26 20 63 21 3d 27 5c 6e 27 20 26 26 20  ' && c!='\n' && 
8460: 63 21 3d 27 5c 72 27 3b 20 69 2b 2b 29 7b 7d 0a  c!='\r'; i++){}.
8470: 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20    if( c==0 ){.  
8480: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
8490: 74 2c 22 27 25 73 27 22 2c 7a 29 3b 0a 20 20 7d  t,"'%s'",z);.  }
84a0: 65 6c 73 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20  else{.    const 
84b0: 63 68 61 72 20 2a 7a 4e 4c 20 3d 20 30 3b 0a 20  char *zNL = 0;. 
84c0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
84d0: 43 52 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  CR = 0;.    int 
84e0: 6e 4e 4c 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  nNL = 0;.    int
84f0: 20 6e 43 52 20 3d 20 30 3b 0a 20 20 20 20 63 68   nCR = 0;.    ch
8500: 61 72 20 7a 42 75 66 31 5b 32 30 5d 2c 20 7a 42  ar zBuf1[20], zB
8510: 75 66 32 5b 32 30 5d 3b 0a 20 20 20 20 66 6f 72  uf2[20];.    for
8520: 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29  (i=0; z[i]; i++)
8530: 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 69 5d  {.      if( z[i]
8540: 3d 3d 27 5c 6e 27 20 29 20 6e 4e 4c 2b 2b 3b 0a  =='\n' ) nNL++;.
8550: 20 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d        if( z[i]==
8560: 27 5c 72 27 20 29 20 6e 43 52 2b 2b 3b 0a 20 20  '\r' ) nCR++;.  
8570: 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 4e 4c 20    }.    if( nNL 
8580: 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
8590: 6e 74 66 28 6f 75 74 2c 20 22 72 65 70 6c 61 63  ntf(out, "replac
85a0: 65 28 22 29 3b 0a 20 20 20 20 20 20 7a 4e 4c 20  e(");.      zNL 
85b0: 3d 20 75 6e 75 73 65 64 5f 73 74 72 69 6e 67 28  = unused_string(
85c0: 7a 2c 20 22 5c 5c 6e 22 2c 20 22 5c 5c 30 31 32  z, "\\n", "\\012
85d0: 22 2c 20 7a 42 75 66 31 29 3b 0a 20 20 20 20 7d  ", zBuf1);.    }
85e0: 0a 20 20 20 20 69 66 28 20 6e 43 52 20 29 7b 0a  .    if( nCR ){.
85f0: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
8600: 28 6f 75 74 2c 20 22 72 65 70 6c 61 63 65 28 22  (out, "replace("
8610: 29 3b 0a 20 20 20 20 20 20 7a 43 52 20 3d 20 75  );.      zCR = u
8620: 6e 75 73 65 64 5f 73 74 72 69 6e 67 28 7a 2c 20  nused_string(z, 
8630: 22 5c 5c 72 22 2c 20 22 5c 5c 30 31 35 22 2c 20  "\\r", "\\015", 
8640: 7a 42 75 66 32 29 3b 0a 20 20 20 20 7d 0a 20 20  zBuf2);.    }.  
8650: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
8660: 2c 20 22 27 22 29 3b 0a 20 20 20 20 77 68 69 6c  , "'");.    whil
8670: 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 20 20 66  e( *z ){.      f
8680: 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a 5b 69  or(i=0; (c = z[i
8690: 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 5c 6e 27  ])!=0 && c!='\n'
86a0: 20 26 26 20 63 21 3d 27 5c 72 27 20 26 26 20 63   && c!='\r' && c
86b0: 21 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20  !='\''; i++){}. 
86c0: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27 27       if( c=='\''
86d0: 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66   ) i++;.      if
86e0: 28 20 69 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ( i ){.        u
86f0: 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  tf8_printf(out, 
8700: 22 25 2e 2a 73 22 2c 20 69 2c 20 7a 29 3b 0a 20  "%.*s", i, z);. 
8710: 20 20 20 20 20 20 20 7a 20 2b 3d 20 69 3b 0a 20         z += i;. 
8720: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
8730: 20 63 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20   c=='\'' ){.    
8740: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
8750: 75 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 20 20  ut, "'");.      
8760: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
8770: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
8780: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 72  =0 ){.        br
8790: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
87a0: 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66     z++;.      if
87b0: 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20  ( c=='\n' ){.   
87c0: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
87d0: 6f 75 74 2c 20 22 25 73 22 2c 20 7a 4e 4c 29 3b  out, "%s", zNL);
87e0: 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75  .        continu
87f0: 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  e;.      }.     
8800: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
8810: 20 22 25 73 22 2c 20 7a 43 52 29 3b 0a 20 20 20   "%s", zCR);.   
8820: 20 7d 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74   }.    raw_print
8830: 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20  f(out, "'");.   
8840: 20 69 66 28 20 6e 43 52 20 29 7b 0a 20 20 20 20   if( nCR ){.    
8850: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
8860: 2c 20 22 2c 27 25 73 27 2c 63 68 61 72 28 31 33  , ",'%s',char(13
8870: 29 29 22 2c 20 7a 43 52 29 3b 0a 20 20 20 20 7d  ))", zCR);.    }
8880: 0a 20 20 20 20 69 66 28 20 6e 4e 4c 20 29 7b 0a  .    if( nNL ){.
8890: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
88a0: 28 6f 75 74 2c 20 22 2c 27 25 73 27 2c 63 68 61  (out, ",'%s',cha
88b0: 72 28 31 30 29 29 22 2c 20 7a 4e 4c 29 3b 0a 20  r(10))", zNL);. 
88c0: 20 20 20 7d 0a 20 20 7d 0a 20 20 73 65 74 54 65     }.  }.  setTe
88d0: 78 74 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a  xtMode(out, 1);.
88e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20  }../*.** Output 
88f0: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
8900: 20 61 73 20 61 20 71 75 6f 74 65 64 20 61 63 63   as a quoted acc
8910: 6f 72 64 69 6e 67 20 74 6f 20 43 20 6f 72 20 54  ording to C or T
8920: 43 4c 20 71 75 6f 74 69 6e 67 20 72 75 6c 65 73  CL quoting rules
8930: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
8940: 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67   output_c_string
8950: 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73  (FILE *out, cons
8960: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 75 6e  t char *z){.  un
8970: 73 69 67 6e 65 64 20 69 6e 74 20 63 3b 0a 20 20  signed int c;.  
8980: 66 70 75 74 63 28 27 22 27 2c 20 6f 75 74 29 3b  fputc('"', out);
8990: 0a 20 20 77 68 69 6c 65 28 20 28 63 20 3d 20 2a  .  while( (c = *
89a0: 28 7a 2b 2b 29 29 21 3d 30 20 29 7b 0a 20 20 20  (z++))!=0 ){.   
89b0: 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a   if( c=='\\' ){.
89c0: 20 20 20 20 20 20 66 70 75 74 63 28 63 2c 20 6f        fputc(c, o
89d0: 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63  ut);.      fputc
89e0: 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65  (c, out);.    }e
89f0: 6c 73 65 20 69 66 28 20 63 3d 3d 27 22 27 20 29  lse if( c=='"' )
8a00: 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 5c  {.      fputc('\
8a10: 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20  \', out);.      
8a20: 66 70 75 74 63 28 27 22 27 2c 20 6f 75 74 29 3b  fputc('"', out);
8a30: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
8a40: 3d 3d 27 5c 74 27 20 29 7b 0a 20 20 20 20 20 20  =='\t' ){.      
8a50: 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29  fputc('\\', out)
8a60: 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 74  ;.      fputc('t
8a70: 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c  ', out);.    }el
8a80: 73 65 20 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29  se if( c=='\n' )
8a90: 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 5c  {.      fputc('\
8aa0: 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20 20  \', out);.      
8ab0: 66 70 75 74 63 28 27 6e 27 2c 20 6f 75 74 29 3b  fputc('n', out);
8ac0: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
8ad0: 3d 3d 27 5c 72 27 20 29 7b 0a 20 20 20 20 20 20  =='\r' ){.      
8ae0: 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29  fputc('\\', out)
8af0: 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27 72  ;.      fputc('r
8b00: 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c  ', out);.    }el
8b10: 73 65 20 69 66 28 20 21 69 73 70 72 69 6e 74 28  se if( !isprint(
8b20: 63 26 30 78 66 66 29 20 29 7b 0a 20 20 20 20 20  c&0xff) ){.     
8b30: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
8b40: 20 22 5c 5c 25 30 33 6f 22 2c 20 63 26 30 78 66   "\\%03o", c&0xf
8b50: 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  f);.    }else{. 
8b60: 20 20 20 20 20 66 70 75 74 63 28 63 2c 20 6f 75       fputc(c, ou
8b70: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  t);.    }.  }.  
8b80: 66 70 75 74 63 28 27 22 27 2c 20 6f 75 74 29 3b  fputc('"', out);
8b90: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74  .}../*.** Output
8ba0: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
8bb0: 67 20 77 69 74 68 20 63 68 61 72 61 63 74 65 72  g with character
8bc0: 73 20 74 68 61 74 20 61 72 65 20 73 70 65 63 69  s that are speci
8bd0: 61 6c 20 74 6f 0a 2a 2a 20 48 54 4d 4c 20 65 73  al to.** HTML es
8be0: 63 61 70 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  caped..*/.static
8bf0: 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 68 74 6d   void output_htm
8c00: 6c 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f  l_string(FILE *o
8c10: 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ut, const char *
8c20: 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  z){.  int i;.  i
8c30: 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 22 22  f( z==0 ) z = ""
8c40: 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b  ;.  while( *z ){
8c50: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 20 20  .    for(i=0;   
8c60: 7a 5b 69 5d 0a 20 20 20 20 20 20 20 20 20 20 20  z[i].           
8c70: 20 26 26 20 7a 5b 69 5d 21 3d 27 3c 27 0a 20 20   && z[i]!='<'.  
8c80: 20 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69            && z[i
8c90: 5d 21 3d 27 26 27 0a 20 20 20 20 20 20 20 20 20  ]!='&'.         
8ca0: 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 3e 27 0a     && z[i]!='>'.
8cb0: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 7a              && z
8cc0: 5b 69 5d 21 3d 27 5c 22 27 0a 20 20 20 20 20 20  [i]!='\"'.      
8cd0: 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27        && z[i]!='
8ce0: 5c 27 27 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b  \'';.        i++
8cf0: 29 7b 7d 0a 20 20 20 20 69 66 28 20 69 3e 30 20  ){}.    if( i>0 
8d00: 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
8d10: 69 6e 74 66 28 6f 75 74 2c 22 25 2e 2a 73 22 2c  intf(out,"%.*s",
8d20: 69 2c 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  i,z);.    }.    
8d30: 69 66 28 20 7a 5b 69 5d 3d 3d 27 3c 27 20 29 7b  if( z[i]=='<' ){
8d40: 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
8d50: 66 28 6f 75 74 2c 22 26 6c 74 3b 22 29 3b 0a 20  f(out,"&lt;");. 
8d60: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69     }else if( z[i
8d70: 5d 3d 3d 27 26 27 20 29 7b 0a 20 20 20 20 20 20  ]=='&' ){.      
8d80: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22  raw_printf(out,"
8d90: 26 61 6d 70 3b 22 29 3b 0a 20 20 20 20 7d 65 6c  &amp;");.    }el
8da0: 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 3e 27  se if( z[i]=='>'
8db0: 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
8dc0: 69 6e 74 66 28 6f 75 74 2c 22 26 67 74 3b 22 29  intf(out,"&gt;")
8dd0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8de0: 7a 5b 69 5d 3d 3d 27 5c 22 27 20 29 7b 0a 20 20  z[i]=='\"' ){.  
8df0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
8e00: 75 74 2c 22 26 71 75 6f 74 3b 22 29 3b 0a 20 20  ut,"&quot;");.  
8e10: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d    }else if( z[i]
8e20: 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20  =='\'' ){.      
8e30: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22  raw_printf(out,"
8e40: 26 23 33 39 3b 22 29 3b 0a 20 20 20 20 7d 65 6c  &#39;");.    }el
8e50: 73 65 7b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  se{.      break;
8e60: 0a 20 20 20 20 7d 0a 20 20 20 20 7a 20 2b 3d 20  .    }.    z += 
8e70: 69 20 2b 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  i + 1;.  }.}../*
8e80: 0a 2a 2a 20 49 66 20 61 20 66 69 65 6c 64 20 63  .** If a field c
8e90: 6f 6e 74 61 69 6e 73 20 61 6e 79 20 63 68 61 72  ontains any char
8ea0: 61 63 74 65 72 20 69 64 65 6e 74 69 66 69 65 64  acter identified
8eb0: 20 62 79 20 61 20 31 20 69 6e 20 74 68 65 20 66   by a 1 in the f
8ec0: 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 61 72 72 61  ollowing.** arra
8ed0: 79 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72 69  y, then the stri
8ee0: 6e 67 20 6d 75 73 74 20 62 65 20 71 75 6f 74 65  ng must be quote
8ef0: 64 20 66 6f 72 20 43 53 56 2e 0a 2a 2f 0a 73 74  d for CSV..*/.st
8f00: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
8f10: 6e 65 65 64 43 73 76 51 75 6f 74 65 5b 5d 20 3d  needCsvQuote[] =
8f20: 20 7b 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c   {.  1, 1, 1, 1,
8f30: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31   1, 1, 1, 1,   1
8f40: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
8f50: 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31   1, 1,.  1, 1, 1
8f60: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
8f70: 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31     1, 1, 1, 1, 1
8f80: 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20  , 1, 1, 1,.  1, 
8f90: 30 2c 20 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 1, 0, 0, 0, 0
8fa0: 2c 20 31 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20  , 1,   0, 0, 0, 
8fb0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
8fc0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
8fd0: 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c  0, 0, 0,   0, 0,
8fe0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
8ff0: 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c  0,.  0, 0, 0, 0,
9000: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20 30   0, 0, 0, 0,   0
9010: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
9020: 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30   0, 0,.  0, 0, 0
9030: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
9040: 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30     0, 0, 0, 0, 0
9050: 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20  , 0, 0, 0,.  0, 
9060: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
9070: 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20  , 0,   0, 0, 0, 
9080: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20  0, 0, 0, 0, 0,. 
9090: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
90a0: 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c  0, 0, 0,   0, 0,
90b0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
90c0: 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  1,.  1, 1, 1, 1,
90d0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31   1, 1, 1, 1,   1
90e0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
90f0: 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31   1, 1,.  1, 1, 1
9100: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
9110: 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31     1, 1, 1, 1, 1
9120: 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20  , 1, 1, 1,.  1, 
9130: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
9140: 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20  , 1,   1, 1, 1, 
9150: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20  1, 1, 1, 1, 1,. 
9160: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
9170: 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c  1, 1, 1,   1, 1,
9180: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
9190: 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c  1,.  1, 1, 1, 1,
91a0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20 31   1, 1, 1, 1,   1
91b0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
91c0: 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31   1, 1,.  1, 1, 1
91d0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
91e0: 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31     1, 1, 1, 1, 1
91f0: 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20  , 1, 1, 1,.  1, 
9200: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
9210: 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20  , 1,   1, 1, 1, 
9220: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20  1, 1, 1, 1, 1,. 
9230: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
9240: 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c  1, 1, 1,   1, 1,
9250: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
9260: 31 2c 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74  1,.};../*.** Out
9270: 70 75 74 20 61 20 73 69 6e 67 6c 65 20 74 65 72  put a single ter
9280: 6d 20 6f 66 20 43 53 56 2e 20 20 41 63 74 75 61  m of CSV.  Actua
9290: 6c 6c 79 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  lly, p->colSepar
92a0: 61 74 6f 72 20 69 73 20 75 73 65 64 20 66 6f 72  ator is used for
92b0: 0a 2a 2a 20 74 68 65 20 73 65 70 61 72 61 74 6f  .** the separato
92c0: 72 2c 20 77 68 69 63 68 20 6d 61 79 20 6f 72 20  r, which may or 
92d0: 6d 61 79 20 6e 6f 74 20 62 65 20 61 20 63 6f 6d  may not be a com
92e0: 6d 61 2e 20 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75  ma.  p->nullValu
92f0: 65 20 69 73 0a 2a 2a 20 74 68 65 20 6e 75 6c 6c  e is.** the null
9300: 20 76 61 6c 75 65 2e 20 20 53 74 72 69 6e 67 73   value.  Strings
9310: 20 61 72 65 20 71 75 6f 74 65 64 20 69 66 20 6e   are quoted if n
9320: 65 63 65 73 73 61 72 79 2e 20 20 54 68 65 20 73  ecessary.  The s
9330: 65 70 61 72 61 74 6f 72 0a 2a 2a 20 69 73 20 6f  eparator.** is o
9340: 6e 6c 79 20 69 73 73 75 65 64 20 69 66 20 62 53  nly issued if bS
9350: 65 70 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73  ep is true..*/.s
9360: 74 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75  tatic void outpu
9370: 74 5f 63 73 76 28 53 68 65 6c 6c 53 74 61 74 65  t_csv(ShellState
9380: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
9390: 2a 7a 2c 20 69 6e 74 20 62 53 65 70 29 7b 0a 20  *z, int bSep){. 
93a0: 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 70 2d 3e   FILE *out = p->
93b0: 6f 75 74 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20  out;.  if( z==0 
93c0: 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
93d0: 74 66 28 6f 75 74 2c 22 25 73 22 2c 70 2d 3e 6e  tf(out,"%s",p->n
93e0: 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 7d 65 6c  ullValue);.  }el
93f0: 73 65 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  se{.    int i;. 
9400: 20 20 20 69 6e 74 20 6e 53 65 70 20 3d 20 73 74     int nSep = st
9410: 72 6c 65 6e 33 30 28 70 2d 3e 63 6f 6c 53 65 70  rlen30(p->colSep
9420: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 66 6f 72  arator);.    for
9430: 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29  (i=0; z[i]; i++)
9440: 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 65 64  {.      if( need
9450: 43 73 76 51 75 6f 74 65 5b 28 28 75 6e 73 69 67  CsvQuote[((unsig
9460: 6e 65 64 20 63 68 61 72 2a 29 7a 29 5b 69 5d 5d  ned char*)z)[i]]
9470: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 7a 5b  .         || (z[
9480: 69 5d 3d 3d 70 2d 3e 63 6f 6c 53 65 70 61 72 61  i]==p->colSepara
9490: 74 6f 72 5b 30 5d 20 26 26 0a 20 20 20 20 20 20  tor[0] &&.      
94a0: 20 20 20 20 20 20 20 28 6e 53 65 70 3d 3d 31 20         (nSep==1 
94b0: 7c 7c 20 6d 65 6d 63 6d 70 28 7a 2c 20 70 2d 3e  || memcmp(z, p->
94c0: 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 6e 53  colSeparator, nS
94d0: 65 70 29 3d 3d 30 29 29 20 29 7b 0a 20 20 20 20  ep)==0)) ){.    
94e0: 20 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20 20      i = 0;.     
94f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
9500: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
9510: 69 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68  i==0 ){.      ch
9520: 61 72 20 2a 7a 51 75 6f 74 65 64 20 3d 20 73 71  ar *zQuoted = sq
9530: 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 5c  lite3_mprintf("\
9540: 22 25 77 5c 22 22 2c 20 7a 29 3b 0a 20 20 20 20  "%w\"", z);.    
9550: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
9560: 74 2c 20 22 25 73 22 2c 20 7a 51 75 6f 74 65 64  t, "%s", zQuoted
9570: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9580: 5f 66 72 65 65 28 7a 51 75 6f 74 65 64 29 3b 0a  _free(zQuoted);.
9590: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
95a0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74   utf8_printf(out
95b0: 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20  , "%s", z);.    
95c0: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 62 53 65 70  }.  }.  if( bSep
95d0: 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
95e0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
95f0: 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
9600: 72 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  r);.  }.}../*.**
9610: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75   This routine ru
9620: 6e 73 20 77 68 65 6e 20 74 68 65 20 75 73 65 72  ns when the user
9630: 20 70 72 65 73 73 65 73 20 43 74 72 6c 2d 43 0a   presses Ctrl-C.
9640: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
9650: 6e 74 65 72 72 75 70 74 5f 68 61 6e 64 6c 65 72  nterrupt_handler
9660: 28 69 6e 74 20 4e 6f 74 55 73 65 64 29 7b 0a 20  (int NotUsed){. 
9670: 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45   UNUSED_PARAMETE
9680: 52 28 4e 6f 74 55 73 65 64 29 3b 0a 20 20 73 65  R(NotUsed);.  se
9690: 65 6e 49 6e 74 65 72 72 75 70 74 2b 2b 3b 0a 20  enInterrupt++;. 
96a0: 20 69 66 28 20 73 65 65 6e 49 6e 74 65 72 72 75   if( seenInterru
96b0: 70 74 3e 32 20 29 20 65 78 69 74 28 31 29 3b 0a  pt>2 ) exit(1);.
96c0: 20 20 69 66 28 20 67 6c 6f 62 61 6c 44 62 20 29    if( globalDb )
96d0: 20 73 71 6c 69 74 65 33 5f 69 6e 74 65 72 72 75   sqlite3_interru
96e0: 70 74 28 67 6c 6f 62 61 6c 44 62 29 3b 0a 7d 0a  pt(globalDb);.}.
96f0: 0a 23 69 66 20 28 64 65 66 69 6e 65 64 28 5f 57  .#if (defined(_W
9700: 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  IN32) || defined
9710: 28 57 49 4e 33 32 29 29 20 26 26 20 21 64 65 66  (WIN32)) && !def
9720: 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57 43 45 29  ined(_WIN32_WCE)
9730: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
9740: 69 6e 65 20 72 75 6e 73 20 66 6f 72 20 63 6f 6e  ine runs for con
9750: 73 6f 6c 65 20 65 76 65 6e 74 73 20 28 65 2e 67  sole events (e.g
9760: 2e 20 43 74 72 6c 2d 43 29 20 6f 6e 20 57 69 6e  . Ctrl-C) on Win
9770: 33 32 0a 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f  32.*/.static BOO
9780: 4c 20 57 49 4e 41 50 49 20 43 6f 6e 73 6f 6c 65  L WINAPI Console
9790: 43 74 72 6c 48 61 6e 64 6c 65 72 28 0a 20 20 44  CtrlHandler(.  D
97a0: 57 4f 52 44 20 64 77 43 74 72 6c 54 79 70 65 20  WORD dwCtrlType 
97b0: 2f 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 43 54  /* One of the CT
97c0: 52 4c 5f 2a 5f 45 56 45 4e 54 20 63 6f 6e 73 74  RL_*_EVENT const
97d0: 61 6e 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28  ants */.){.  if(
97e0: 20 64 77 43 74 72 6c 54 79 70 65 3d 3d 43 54 52   dwCtrlType==CTR
97f0: 4c 5f 43 5f 45 56 45 4e 54 20 29 7b 0a 20 20 20  L_C_EVENT ){.   
9800: 20 69 6e 74 65 72 72 75 70 74 5f 68 61 6e 64 6c   interrupt_handl
9810: 65 72 28 30 29 3b 0a 20 20 20 20 72 65 74 75 72  er(0);.    retur
9820: 6e 20 54 52 55 45 3b 0a 20 20 7d 0a 20 20 72 65  n TRUE;.  }.  re
9830: 74 75 72 6e 20 46 41 4c 53 45 3b 0a 7d 0a 23 65  turn FALSE;.}.#e
9840: 6e 64 69 66 0a 0a 23 69 66 6e 64 65 66 20 53 51  ndif..#ifndef SQ
9850: 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
9860: 49 5a 41 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 57 68  IZATION./*.** Wh
9870: 65 6e 20 74 68 65 20 22 2e 61 75 74 68 20 4f 4e  en the ".auth ON
9880: 22 20 69 73 20 73 65 74 2c 20 74 68 65 20 66 6f  " is set, the fo
9890: 6c 6c 6f 77 69 6e 67 20 61 75 74 68 6f 72 69 7a  llowing authoriz
98a0: 65 72 20 63 61 6c 6c 62 61 63 6b 20 69 73 0a 2a  er callback is.*
98b0: 2a 20 69 6e 76 6f 6b 65 64 2e 20 20 49 74 20 61  * invoked.  It a
98c0: 6c 77 61 79 73 20 72 65 74 75 72 6e 73 20 53 51  lways returns SQ
98d0: 4c 49 54 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74  LITE_OK..*/.stat
98e0: 69 63 20 69 6e 74 20 73 68 65 6c 6c 41 75 74 68  ic int shellAuth
98f0: 28 0a 20 20 76 6f 69 64 20 2a 70 43 6c 69 65 6e  (.  void *pClien
9900: 74 44 61 74 61 2c 0a 20 20 69 6e 74 20 6f 70 2c  tData,.  int op,
9910: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
9920: 41 31 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  A1,.  const char
9930: 20 2a 7a 41 32 2c 0a 20 20 63 6f 6e 73 74 20 63   *zA2,.  const c
9940: 68 61 72 20 2a 7a 41 33 2c 0a 20 20 63 6f 6e 73  har *zA3,.  cons
9950: 74 20 63 68 61 72 20 2a 7a 41 34 0a 29 7b 0a 20  t char *zA4.){. 
9960: 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d   ShellState *p =
9970: 20 28 53 68 65 6c 6c 53 74 61 74 65 2a 29 70 43   (ShellState*)pC
9980: 6c 69 65 6e 74 44 61 74 61 3b 0a 20 20 73 74 61  lientData;.  sta
9990: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
99a0: 61 7a 41 63 74 69 6f 6e 5b 5d 20 3d 20 7b 20 30  azAction[] = { 0
99b0: 2c 0a 20 20 20 20 20 22 43 52 45 41 54 45 5f 49  ,.     "CREATE_I
99c0: 4e 44 45 58 22 2c 20 20 20 20 20 20 20 20 20 22  NDEX",         "
99d0: 43 52 45 41 54 45 5f 54 41 42 4c 45 22 2c 20 20  CREATE_TABLE",  
99e0: 20 20 20 20 20 20 20 22 43 52 45 41 54 45 5f 54         "CREATE_T
99f0: 45 4d 50 5f 49 4e 44 45 58 22 2c 0a 20 20 20 20  EMP_INDEX",.    
9a00: 20 22 43 52 45 41 54 45 5f 54 45 4d 50 5f 54 41   "CREATE_TEMP_TA
9a10: 42 4c 45 22 2c 20 20 20 20 22 43 52 45 41 54 45  BLE",    "CREATE
9a20: 5f 54 45 4d 50 5f 54 52 49 47 47 45 52 22 2c 20  _TEMP_TRIGGER", 
9a30: 20 22 43 52 45 41 54 45 5f 54 45 4d 50 5f 56 49   "CREATE_TEMP_VI
9a40: 45 57 22 2c 0a 20 20 20 20 20 22 43 52 45 41 54  EW",.     "CREAT
9a50: 45 5f 54 52 49 47 47 45 52 22 2c 20 20 20 20 20  E_TRIGGER",     
9a60: 20 20 22 43 52 45 41 54 45 5f 56 49 45 57 22 2c    "CREATE_VIEW",
9a70: 20 20 20 20 20 20 20 20 20 20 22 44 45 4c 45 54            "DELET
9a80: 45 22 2c 0a 20 20 20 20 20 22 44 52 4f 50 5f 49  E",.     "DROP_I
9a90: 4e 44 45 58 22 2c 20 20 20 20 20 20 20 20 20 20  NDEX",          
9aa0: 20 22 44 52 4f 50 5f 54 41 42 4c 45 22 2c 20 20   "DROP_TABLE",  
9ab0: 20 20 20 20 20 20 20 20 20 22 44 52 4f 50 5f 54           "DROP_T
9ac0: 45 4d 50 5f 49 4e 44 45 58 22 2c 0a 20 20 20 20  EMP_INDEX",.    
9ad0: 20 22 44 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c   "DROP_TEMP_TABL
9ae0: 45 22 2c 20 20 20 20 20 20 22 44 52 4f 50 5f 54  E",      "DROP_T
9af0: 45 4d 50 5f 54 52 49 47 47 45 52 22 2c 20 20 20  EMP_TRIGGER",   
9b00: 20 22 44 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57   "DROP_TEMP_VIEW
9b10: 22 2c 0a 20 20 20 20 20 22 44 52 4f 50 5f 54 52  ",.     "DROP_TR
9b20: 49 47 47 45 52 22 2c 20 20 20 20 20 20 20 20 20  IGGER",         
9b30: 22 44 52 4f 50 5f 56 49 45 57 22 2c 20 20 20 20  "DROP_VIEW",    
9b40: 20 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 22          "INSERT"
9b50: 2c 0a 20 20 20 20 20 22 50 52 41 47 4d 41 22 2c  ,.     "PRAGMA",
9b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
9b70: 52 45 41 44 22 2c 20 20 20 20 20 20 20 20 20 20  READ",          
9b80: 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 22 2c         "SELECT",
9b90: 0a 20 20 20 20 20 22 54 52 41 4e 53 41 43 54 49  .     "TRANSACTI
9ba0: 4f 4e 22 2c 20 20 20 20 20 20 20 20 20 20 22 55  ON",          "U
9bb0: 50 44 41 54 45 22 2c 20 20 20 20 20 20 20 20 20  PDATE",         
9bc0: 20 20 20 20 20 20 22 41 54 54 41 43 48 22 2c 0a        "ATTACH",.
9bd0: 20 20 20 20 20 22 44 45 54 41 43 48 22 2c 20 20       "DETACH",  
9be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 41 4c               "AL
9bf0: 54 45 52 5f 54 41 42 4c 45 22 2c 20 20 20 20 20  TER_TABLE",     
9c00: 20 20 20 20 20 22 52 45 49 4e 44 45 58 22 2c 0a       "REINDEX",.
9c10: 20 20 20 20 20 22 41 4e 41 4c 59 5a 45 22 2c 20       "ANALYZE", 
9c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 43 52               "CR
9c30: 45 41 54 45 5f 56 54 41 42 4c 45 22 2c 20 20 20  EATE_VTABLE",   
9c40: 20 20 20 20 20 22 44 52 4f 50 5f 56 54 41 42 4c       "DROP_VTABL
9c50: 45 22 2c 0a 20 20 20 20 20 22 46 55 4e 43 54 49  E",.     "FUNCTI
9c60: 4f 4e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ON",            
9c70: 20 22 53 41 56 45 50 4f 49 4e 54 22 2c 20 20 20   "SAVEPOINT",   
9c80: 20 20 20 20 20 20 20 20 20 22 52 45 43 55 52 53           "RECURS
9c90: 49 56 45 22 0a 20 20 7d 3b 0a 20 20 69 6e 74 20  IVE".  };.  int 
9ca0: 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  i;.  const char 
9cb0: 2a 61 7a 5b 34 5d 3b 0a 20 20 61 7a 5b 30 5d 20  *az[4];.  az[0] 
9cc0: 3d 20 7a 41 31 3b 0a 20 20 61 7a 5b 31 5d 20 3d  = zA1;.  az[1] =
9cd0: 20 7a 41 32 3b 0a 20 20 61 7a 5b 32 5d 20 3d 20   zA2;.  az[2] = 
9ce0: 7a 41 33 3b 0a 20 20 61 7a 5b 33 5d 20 3d 20 7a  zA3;.  az[3] = z
9cf0: 41 34 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e 74  A4;.  utf8_print
9d00: 66 28 70 2d 3e 6f 75 74 2c 20 22 61 75 74 68 6f  f(p->out, "autho
9d10: 72 69 7a 65 72 3a 20 25 73 22 2c 20 61 7a 41 63  rizer: %s", azAc
9d20: 74 69 6f 6e 5b 6f 70 5d 29 3b 0a 20 20 66 6f 72  tion[op]);.  for
9d30: 28 69 3d 30 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b  (i=0; i<4; i++){
9d40: 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
9d50: 70 2d 3e 6f 75 74 2c 20 22 20 22 29 3b 0a 20 20  p->out, " ");.  
9d60: 20 20 69 66 28 20 61 7a 5b 69 5d 20 29 7b 0a 20    if( az[i] ){. 
9d70: 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73 74       output_c_st
9d80: 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 5b  ring(p->out, az[
9d90: 69 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  i]);.    }else{.
9da0: 20 20 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 4e 55 4c 4c 22 29  (p->out, "NULL")
9dc0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 61  ;.    }.  }.  ra
9dd0: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
9de0: 20 22 5c 6e 22 29 3b 0a 20 20 72 65 74 75 72 6e   "\n");.  return
9df0: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65   SQLITE_OK;.}.#e
9e00: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  ndif../*.** Prin
9e10: 74 20 61 20 73 63 68 65 6d 61 20 73 74 61 74 65  t a schema state
9e20: 6d 65 6e 74 2e 20 20 50 61 72 74 20 6f 66 20 4d  ment.  Part of M
9e30: 4f 44 45 5f 53 65 6d 69 20 61 6e 64 20 4d 4f 44  ODE_Semi and MOD
9e40: 45 5f 50 72 65 74 74 79 20 6f 75 74 70 75 74 2e  E_Pretty output.
9e50: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
9e60: 69 6e 65 20 63 6f 6e 76 65 72 74 73 20 73 6f 6d  ine converts som
9e70: 65 20 43 52 45 41 54 45 20 54 41 42 4c 45 20 73  e CREATE TABLE s
9e80: 74 61 74 65 6d 65 6e 74 73 20 66 6f 72 20 73 68  tatements for sh
9e90: 61 64 6f 77 20 74 61 62 6c 65 73 0a 2a 2a 20 69  adow tables.** i
9ea0: 6e 20 46 54 53 33 2f 34 2f 35 20 69 6e 74 6f 20  n FTS3/4/5 into 
9eb0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20  CREATE TABLE IF 
9ec0: 4e 4f 54 20 45 58 49 53 54 53 20 73 74 61 74 65  NOT EXISTS state
9ed0: 6d 65 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ments..*/.static
9ee0: 20 76 6f 69 64 20 70 72 69 6e 74 53 63 68 65 6d   void printSchem
9ef0: 61 4c 69 6e 65 28 46 49 4c 45 20 2a 6f 75 74 2c  aLine(FILE *out,
9f00: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
9f10: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 69  const char *zTai
9f20: 6c 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  l){.  if( sqlite
9f30: 33 5f 73 74 72 67 6c 6f 62 28 22 43 52 45 41 54  3_strglob("CREAT
9f40: 45 20 54 41 42 4c 45 20 5b 27 5c 22 5d 2a 22 2c  E TABLE ['\"]*",
9f50: 20 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74   z)==0 ){.    ut
9f60: 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  f8_printf(out, "
9f70: 43 52 45 41 54 45 20 54 41 42 4c 45 20 49 46 20  CREATE TABLE IF 
9f80: 4e 4f 54 20 45 58 49 53 54 53 20 25 73 25 73 22  NOT EXISTS %s%s"
9f90: 2c 20 7a 2b 31 33 2c 20 7a 54 61 69 6c 29 3b 0a  , z+13, zTail);.
9fa0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 75 74 66    }else{.    utf
9fb0: 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  8_printf(out, "%
9fc0: 73 25 73 22 2c 20 7a 2c 20 7a 54 61 69 6c 29 3b  s%s", z, zTail);
9fd0: 0a 20 20 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f  .  }.}.static vo
9fe0: 69 64 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69  id printSchemaLi
9ff0: 6e 65 4e 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63  neN(FILE *out, c
a000: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 63  har *z, int n, c
a010: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c  onst char *zTail
a020: 29 7b 0a 20 20 63 68 61 72 20 63 20 3d 20 7a 5b  ){.  char c = z[
a030: 6e 5d 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a  n];.  z[n] = 0;.
a040: 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e    printSchemaLin
a050: 65 28 6f 75 74 2c 20 7a 2c 20 7a 54 61 69 6c 29  e(out, z, zTail)
a060: 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 63 3b 0a 7d 0a  ;.  z[n] = c;.}.
a070: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72  ./*.** Return tr
a080: 75 65 20 69 66 20 73 74 72 69 6e 67 20 7a 5b 5d  ue if string z[]
a090: 20 68 61 73 20 6e 6f 74 68 69 6e 67 20 62 75 74   has nothing but
a0a0: 20 77 68 69 74 65 73 70 61 63 65 20 61 6e 64 20   whitespace and 
a0b0: 63 6f 6d 6d 65 6e 74 73 20 74 6f 20 74 68 65 0a  comments to the.
a0c0: 2a 2a 20 65 6e 64 20 6f 66 20 74 68 65 20 66 69  ** end of the fi
a0d0: 72 73 74 20 6c 69 6e 65 2e 0a 2a 2f 0a 73 74 61  rst line..*/.sta
a0e0: 74 69 63 20 69 6e 74 20 77 73 54 6f 45 6f 6c 28  tic int wsToEol(
a0f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
a100: 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69    int i;.  for(i
a110: 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a  =0; z[i]; i++){.
a120: 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c      if( z[i]=='\
a130: 6e 27 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  n' ) return 1;. 
a140: 20 20 20 69 66 28 20 49 73 53 70 61 63 65 28 7a     if( IsSpace(z
a150: 5b 69 5d 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  [i]) ) continue;
a160: 0a 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  .    if( z[i]=='
a170: 2d 27 20 26 26 20 7a 5b 69 2b 31 5d 3d 3d 27 2d  -' && z[i+1]=='-
a180: 27 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  ' ) return 1;.  
a190: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
a1a0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 20 20    return 1;.}.  
a1b0: 20 20 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69    ../*.** This i
a1c0: 73 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72  s the callback r
a1d0: 6f 75 74 69 6e 65 20 74 68 61 74 20 74 68 65 20  outine that the 
a1e0: 73 68 65 6c 6c 0a 2a 2a 20 69 6e 76 6f 6b 65 73  shell.** invokes
a1f0: 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66   for each row of
a200: 20 61 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e   a query result.
a210: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
a220: 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 28 0a 20  hell_callback(. 
a230: 20 76 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 69   void *pArg,.  i
a240: 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20  nt nArg,        
a250: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 72 65 73  /* Number of res
a260: 75 6c 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20  ult columns */. 
a270: 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20   char **azArg,  
a280: 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 65 61 63    /* Text of eac
a290: 68 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 20  h result column 
a2a0: 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f  */.  char **azCo
a2b0: 6c 2c 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20  l,    /* Column 
a2c0: 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 2a  names */.  int *
a2d0: 61 69 54 79 70 65 20 20 20 20 20 20 2f 2a 20 43  aiType      /* C
a2e0: 6f 6c 75 6d 6e 20 74 79 70 65 73 20 2a 2f 0a 29  olumn types */.)
a2f0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 53 68 65  {.  int i;.  She
a300: 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53 68  llState *p = (Sh
a310: 65 6c 6c 53 74 61 74 65 2a 29 70 41 72 67 3b 0a  ellState*)pArg;.
a320: 0a 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20  .  if( azArg==0 
a330: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77  ) return 0;.  sw
a340: 69 74 63 68 28 20 70 2d 3e 63 4d 6f 64 65 20 29  itch( p->cMode )
a350: 7b 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  {.    case MODE_
a360: 4c 69 6e 65 3a 20 7b 0a 20 20 20 20 20 20 69 6e  Line: {.      in
a370: 74 20 77 20 3d 20 35 3b 0a 20 20 20 20 20 20 69  t w = 5;.      i
a380: 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72  f( azArg==0 ) br
a390: 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  eak;.      for(i
a3a0: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
a3b0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65  {.        int le
a3c0: 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 43  n = strlen30(azC
a3d0: 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d  ol[i] ? azCol[i]
a3e0: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20   : "");.        
a3f0: 69 66 28 20 6c 65 6e 3e 77 20 29 20 77 20 3d 20  if( len>w ) w = 
a400: 6c 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  len;.      }.   
a410: 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3e     if( p->cnt++>
a420: 30 20 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28  0 ) utf8_printf(
a430: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
a440: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a  >rowSeparator);.
a450: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
a460: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
a470: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
a480: 28 70 2d 3e 6f 75 74 2c 22 25 2a 73 20 3d 20 25  (p->out,"%*s = %
a490: 73 25 73 22 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69  s%s", w, azCol[i
a4a0: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
a4b0: 20 20 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a     azArg[i] ? az
a4c0: 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c  Arg[i] : p->null
a4d0: 56 61 6c 75 65 2c 20 70 2d 3e 72 6f 77 53 65 70  Value, p->rowSep
a4e0: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d  arator);.      }
a4f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a500: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44    }.    case MOD
a510: 45 5f 45 78 70 6c 61 69 6e 3a 0a 20 20 20 20 63  E_Explain:.    c
a520: 61 73 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 3a  ase MODE_Column:
a530: 20 7b 0a 20 20 20 20 20 20 73 74 61 74 69 63 20   {.      static 
a540: 63 6f 6e 73 74 20 69 6e 74 20 61 45 78 70 6c 61  const int aExpla
a550: 69 6e 57 69 64 74 68 73 5b 5d 20 3d 20 7b 34 2c  inWidths[] = {4,
a560: 20 31 33 2c 20 34 2c 20 34 2c 20 34 2c 20 31 33   13, 4, 4, 4, 13
a570: 2c 20 32 2c 20 31 33 7d 3b 0a 20 20 20 20 20 20  , 2, 13};.      
a580: 63 6f 6e 73 74 20 69 6e 74 20 2a 63 6f 6c 57 69  const int *colWi
a590: 64 74 68 3b 0a 20 20 20 20 20 20 69 6e 74 20 73  dth;.      int s
a5a0: 68 6f 77 48 64 72 3b 0a 20 20 20 20 20 20 63 68  howHdr;.      ch
a5b0: 61 72 20 2a 72 6f 77 53 65 70 3b 0a 20 20 20 20  ar *rowSep;.    
a5c0: 20 20 69 66 28 20 70 2d 3e 63 4d 6f 64 65 3d 3d    if( p->cMode==
a5d0: 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 20 29 7b 0a 20  MODE_Column ){. 
a5e0: 20 20 20 20 20 20 20 63 6f 6c 57 69 64 74 68 20         colWidth 
a5f0: 3d 20 70 2d 3e 63 6f 6c 57 69 64 74 68 3b 0a 20  = p->colWidth;. 
a600: 20 20 20 20 20 20 20 73 68 6f 77 48 64 72 20 3d         showHdr =
a610: 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 3b 0a   p->showHeader;.
a620: 20 20 20 20 20 20 20 20 72 6f 77 53 65 70 20 3d          rowSep =
a630: 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
a640: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
a650: 20 20 20 20 20 20 20 63 6f 6c 57 69 64 74 68 20         colWidth 
a660: 3d 20 61 45 78 70 6c 61 69 6e 57 69 64 74 68 73  = aExplainWidths
a670: 3b 0a 20 20 20 20 20 20 20 20 73 68 6f 77 48 64  ;.        showHd
a680: 72 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  r = 1;.        r
a690: 6f 77 53 65 70 20 3d 20 53 45 50 5f 52 6f 77 3b  owSep = SEP_Row;
a6a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
a6b0: 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 29  f( p->cnt++==0 )
a6c0: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
a6d0: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
a6e0: 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 77  .          int w
a6f0: 2c 20 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 69  , n;.          i
a700: 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70  f( i<ArraySize(p
a710: 2d 3e 63 6f 6c 57 69 64 74 68 29 20 29 7b 0a 20  ->colWidth) ){. 
a720: 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20 63             w = c
a730: 6f 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20  olWidth[i];.    
a740: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
a750: 20 20 20 20 20 20 20 20 20 77 20 3d 20 30 3b 0a           w = 0;.
a760: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
a770: 20 20 20 20 20 20 69 66 28 20 77 3d 3d 30 20 29        if( w==0 )
a780: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 20  {.            w 
a790: 3d 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a 43  = strlenChar(azC
a7a0: 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d  ol[i] ? azCol[i]
a7b0: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20   : "");.        
a7c0: 20 20 20 20 69 66 28 20 77 3c 31 30 20 29 20 77      if( w<10 ) w
a7d0: 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 20   = 10;.         
a7e0: 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 43 68 61     n = strlenCha
a7f0: 72 28 61 7a 41 72 67 20 26 26 20 61 7a 41 72 67  r(azArg && azArg
a800: 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a  [i] ? azArg[i] :
a810: 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a   p->nullValue);.
a820: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
a830: 77 3c 6e 20 29 20 77 20 3d 20 6e 3b 0a 20 20 20  w<n ) w = n;.   
a840: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a850: 20 20 20 69 66 28 20 69 3c 41 72 72 61 79 53 69     if( i<ArraySi
a860: 7a 65 28 70 2d 3e 61 63 74 75 61 6c 57 69 64 74  ze(p->actualWidt
a870: 68 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  h) ){.          
a880: 20 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68    p->actualWidth
a890: 5b 69 5d 20 3d 20 77 3b 0a 20 20 20 20 20 20 20  [i] = w;.       
a8a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69     }.          i
a8b0: 66 28 20 73 68 6f 77 48 64 72 20 29 7b 0a 20 20  f( showHdr ){.  
a8c0: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 77            utf8_w
a8d0: 69 64 74 68 5f 70 72 69 6e 74 28 70 2d 3e 6f 75  idth_print(p->ou
a8e0: 74 2c 20 77 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b  t, w, azCol[i]);
a8f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66  .            utf
a900: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
a910: 20 22 25 73 22 2c 20 69 3d 3d 6e 41 72 67 2d 31   "%s", i==nArg-1
a920: 20 3f 20 72 6f 77 53 65 70 20 3a 20 22 20 20 22   ? rowSep : "  "
a930: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
a940: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a950: 20 69 66 28 20 73 68 6f 77 48 64 72 20 29 7b 0a   if( showHdr ){.
a960: 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
a970: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
a980: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
a990: 20 77 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   w;.            
a9a0: 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28  if( i<ArraySize(
a9b0: 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20  p->actualWidth) 
a9c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
a9d0: 20 20 77 20 3d 20 70 2d 3e 61 63 74 75 61 6c 57    w = p->actualW
a9e0: 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20  idth[i];.       
a9f0: 20 20 20 20 20 20 20 20 69 66 28 20 77 3c 30 20          if( w<0 
aa00: 29 20 77 20 3d 20 2d 77 3b 0a 20 20 20 20 20 20  ) w = -w;.      
aa10: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
aa20: 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20              w = 
aa30: 31 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  10;.            
aa40: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74  }.            ut
aa50: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
aa60: 2c 22 25 2d 2a 2e 2a 73 25 73 22 2c 77 2c 77 2c  ,"%-*.*s%s",w,w,
aa70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
aa80: 20 20 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      "-----------
aa90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aaa0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
aab0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 22  ---------------"
aac0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
aad0: 20 20 20 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d      "-----------
aae0: 2d 2d 2d 2d 2d 2d 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 22  ---------------"
ab10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ab20: 20 20 20 20 20 20 69 3d 3d 6e 41 72 67 2d 31 20        i==nArg-1 
ab30: 3f 20 72 6f 77 53 65 70 20 3a 20 22 20 20 22 29  ? rowSep : "  ")
ab40: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
ab50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
ab60: 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d        if( azArg=
ab70: 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
ab80: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
ab90: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
aba0: 20 69 6e 74 20 77 3b 0a 20 20 20 20 20 20 20 20   int w;.        
abb0: 69 66 28 20 69 3c 41 72 72 61 79 53 69 7a 65 28  if( i<ArraySize(
abc0: 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 29 20  p->actualWidth) 
abd0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 77 20  ){.           w 
abe0: 3d 20 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68  = p->actualWidth
abf0: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  [i];.        }el
ac00: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 77  se{.           w
ac10: 20 3d 20 31 30 3b 0a 20 20 20 20 20 20 20 20 7d   = 10;.        }
ac20: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 2d 3e  .        if( p->
ac30: 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c  cMode==MODE_Expl
ac40: 61 69 6e 20 26 26 20 61 7a 41 72 67 5b 69 5d 20  ain && azArg[i] 
ac50: 26 26 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a  && strlenChar(az
ac60: 41 72 67 5b 69 5d 29 3e 77 20 29 7b 0a 20 20 20  Arg[i])>w ){.   
ac70: 20 20 20 20 20 20 20 77 20 3d 20 73 74 72 6c 65         w = strle
ac80: 6e 43 68 61 72 28 61 7a 41 72 67 5b 69 5d 29 3b  nChar(azArg[i]);
ac90: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
aca0: 20 20 20 69 66 28 20 69 3d 3d 31 20 26 26 20 70     if( i==1 && p
acb0: 2d 3e 61 69 49 6e 64 65 6e 74 20 26 26 20 70 2d  ->aiIndent && p-
acc0: 3e 70 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20  >pStmt ){.      
acd0: 20 20 20 20 69 66 28 20 70 2d 3e 69 49 6e 64 65      if( p->iInde
ace0: 6e 74 3c 70 2d 3e 6e 49 6e 64 65 6e 74 20 29 7b  nt<p->nIndent ){
acf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66  .            utf
ad00: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
ad10: 20 22 25 2a 2e 73 22 2c 20 70 2d 3e 61 69 49 6e   "%*.s", p->aiIn
ad20: 64 65 6e 74 5b 70 2d 3e 69 49 6e 64 65 6e 74 5d  dent[p->iIndent]
ad30: 2c 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20 20  , "");.         
ad40: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 2d 3e   }.          p->
ad50: 69 49 6e 64 65 6e 74 2b 2b 3b 0a 20 20 20 20 20  iIndent++;.     
ad60: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66     }.        utf
ad70: 38 5f 77 69 64 74 68 5f 70 72 69 6e 74 28 70 2d  8_width_print(p-
ad80: 3e 6f 75 74 2c 20 77 2c 20 61 7a 41 72 67 5b 69  >out, w, azArg[i
ad90: 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70  ] ? azArg[i] : p
ada0: 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20  ->nullValue);.  
adb0: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
adc0: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
add0: 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f 77 53  i==nArg-1 ? rowS
ade0: 65 70 20 3a 20 22 20 20 22 29 3b 0a 20 20 20 20  ep : "  ");.    
adf0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
ae00: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
ae10: 4d 4f 44 45 5f 53 65 6d 69 3a 20 7b 20 20 20 2f  MODE_Semi: {   /
ae20: 2a 20 2e 73 63 68 65 6d 61 20 61 6e 64 20 2e 66  * .schema and .f
ae30: 75 6c 6c 73 63 68 65 6d 61 20 6f 75 74 70 75 74  ullschema output
ae40: 20 2a 2f 0a 20 20 20 20 20 20 70 72 69 6e 74 53   */.      printS
ae50: 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75 74  chemaLine(p->out
ae60: 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 22 3b 5c 6e  , azArg[0], ";\n
ae70: 22 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ");.      break;
ae80: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
ae90: 4d 4f 44 45 5f 50 72 65 74 74 79 3a 20 7b 20 20  MODE_Pretty: {  
aea0: 2f 2a 20 2e 73 63 68 65 6d 61 20 61 6e 64 20 2e  /* .schema and .
aeb0: 66 75 6c 6c 73 63 68 65 6d 61 20 77 69 74 68 20  fullschema with 
aec0: 2d 2d 69 6e 64 65 6e 74 20 2a 2f 0a 20 20 20 20  --indent */.    
aed0: 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 20    char *z;.     
aee0: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 69 6e   int j;.      in
aef0: 74 20 6e 50 61 72 65 6e 20 3d 20 30 3b 0a 20 20  t nParen = 0;.  
af00: 20 20 20 20 63 68 61 72 20 63 45 6e 64 20 3d 20      char cEnd = 
af10: 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63 3b  0;.      char c;
af20: 0a 20 20 20 20 20 20 69 6e 74 20 6e 4c 69 6e 65  .      int nLine
af30: 20 3d 20 30 3b 0a 20 20 20 20 20 20 61 73 73 65   = 0;.      asse
af40: 72 74 28 20 6e 41 72 67 3d 3d 31 20 29 3b 0a 20  rt( nArg==1 );. 
af50: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b 30       if( azArg[0
af60: 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  ]==0 ) break;.  
af70: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
af80: 73 74 72 6c 69 6b 65 28 22 43 52 45 41 54 45 20  strlike("CREATE 
af90: 56 49 45 57 25 22 2c 20 61 7a 41 72 67 5b 30 5d  VIEW%", azArg[0]
afa0: 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 7c  , 0)==0.       |
afb0: 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b  | sqlite3_strlik
afc0: 65 28 22 43 52 45 41 54 45 20 54 52 49 47 25 22  e("CREATE TRIG%"
afd0: 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 30 29 3d 3d  , azArg[0], 0)==
afe0: 30 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20  0.      ){.     
aff0: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
b000: 2d 3e 6f 75 74 2c 20 22 25 73 3b 5c 6e 22 2c 20  ->out, "%s;\n", 
b010: 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20  azArg[0]);.     
b020: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b030: 7d 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  }.      z = sqli
b040: 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
b050: 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20  , azArg[0]);.   
b060: 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20     j = 0;.      
b070: 66 6f 72 28 69 3d 30 3b 20 49 73 53 70 61 63 65  for(i=0; IsSpace
b080: 28 7a 5b 69 5d 29 3b 20 69 2b 2b 29 7b 7d 0a 20  (z[i]); i++){}. 
b090: 20 20 20 20 20 66 6f 72 28 3b 20 28 63 20 3d 20       for(; (c = 
b0a0: 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a  z[i])!=0; i++){.
b0b0: 20 20 20 20 20 20 20 20 69 66 28 20 49 73 53 70          if( IsSp
b0c0: 61 63 65 28 63 29 20 29 7b 0a 20 20 20 20 20 20  ace(c) ){.      
b0d0: 20 20 20 20 69 66 28 20 7a 5b 6a 2d 31 5d 3d 3d      if( z[j-1]==
b0e0: 27 5c 72 27 20 29 20 7a 5b 6a 2d 31 5d 20 3d 20  '\r' ) z[j-1] = 
b0f0: 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20 20 20  '\n';.          
b100: 69 66 28 20 49 73 53 70 61 63 65 28 7a 5b 6a 2d  if( IsSpace(z[j-
b110: 31 5d 29 20 7c 7c 20 7a 5b 6a 2d 31 5d 3d 3d 27  1]) || z[j-1]=='
b120: 28 27 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  (' ) continue;. 
b130: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
b140: 20 28 63 3d 3d 27 28 27 20 7c 7c 20 63 3d 3d 27   (c=='(' || c=='
b150: 29 27 29 20 26 26 20 6a 3e 30 20 26 26 20 49 73  )') && j>0 && Is
b160: 53 70 61 63 65 28 7a 5b 6a 2d 31 5d 29 20 29 7b  Space(z[j-1]) ){
b170: 0a 20 20 20 20 20 20 20 20 20 20 6a 2d 2d 3b 0a  .          j--;.
b180: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b190: 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20    z[j++] = c;.  
b1a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c      }.      whil
b1b0: 65 28 20 6a 3e 30 20 26 26 20 49 73 53 70 61 63  e( j>0 && IsSpac
b1c0: 65 28 7a 5b 6a 2d 31 5d 29 20 29 7b 20 6a 2d 2d  e(z[j-1]) ){ j--
b1d0: 3b 20 7d 0a 20 20 20 20 20 20 7a 5b 6a 5d 20 3d  ; }.      z[j] =
b1e0: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74   0;.      if( st
b1f0: 72 6c 65 6e 33 30 28 7a 29 3e 3d 37 39 20 29 7b  rlen30(z)>=79 ){
b200: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 6a  .        for(i=j
b210: 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d  =0; (c = z[i])!=
b220: 30 3b 20 69 2b 2b 29 7b 20 20 2f 2a 20 43 6f 70  0; i++){  /* Cop
b230: 79 20 63 68 61 6e 67 65 73 20 66 72 6f 6d 20 7a  y changes from z
b240: 5b 69 5d 20 62 61 63 6b 20 74 6f 20 7a 5b 6a 5d  [i] back to z[j]
b250: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
b260: 28 20 63 3d 3d 63 45 6e 64 20 29 7b 0a 20 20 20  ( c==cEnd ){.   
b270: 20 20 20 20 20 20 20 20 20 63 45 6e 64 20 3d 20           cEnd = 
b280: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  0;.          }el
b290: 73 65 20 69 66 28 20 63 3d 3d 27 22 27 20 7c 7c  se if( c=='"' ||
b2a0: 20 63 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27   c=='\'' || c=='
b2b0: 60 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  `' ){.          
b2c0: 20 20 63 45 6e 64 20 3d 20 63 3b 0a 20 20 20 20    cEnd = c;.    
b2d0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
b2e0: 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20  c=='[' ){.      
b2f0: 20 20 20 20 20 20 63 45 6e 64 20 3d 20 27 5d 27        cEnd = ']'
b300: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
b310: 65 20 69 66 28 20 63 3d 3d 27 2d 27 20 26 26 20  e if( c=='-' && 
b320: 7a 5b 69 2b 31 5d 3d 3d 27 2d 27 20 29 7b 0a 20  z[i+1]=='-' ){. 
b330: 20 20 20 20 20 20 20 20 20 20 20 63 45 6e 64 20             cEnd 
b340: 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 20 20  = '\n';.        
b350: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
b360: 28 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  (' ){.          
b370: 20 20 6e 50 61 72 65 6e 2b 2b 3b 0a 20 20 20 20    nParen++;.    
b380: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
b390: 63 3d 3d 27 29 27 20 29 7b 0a 20 20 20 20 20 20  c==')' ){.      
b3a0: 20 20 20 20 20 20 6e 50 61 72 65 6e 2d 2d 3b 0a        nParen--;.
b3b0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
b3c0: 6e 4c 69 6e 65 3e 30 20 26 26 20 6e 50 61 72 65  nLine>0 && nPare
b3d0: 6e 3d 3d 30 20 26 26 20 6a 3e 30 20 29 7b 0a 20  n==0 && j>0 ){. 
b3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72 69               pri
b3f0: 6e 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28 70 2d  ntSchemaLineN(p-
b400: 3e 6f 75 74 2c 20 7a 2c 20 6a 2c 20 22 5c 6e 22  >out, z, j, "\n"
b410: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
b420: 20 6a 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   j = 0;.        
b430: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
b440: 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 5b 6a 2b  }.          z[j+
b450: 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  +] = c;.        
b460: 20 20 69 66 28 20 6e 50 61 72 65 6e 3d 3d 31 20    if( nParen==1 
b470: 26 26 20 63 45 6e 64 3d 3d 30 0a 20 20 20 20 20  && cEnd==0.     
b480: 20 20 20 20 20 20 26 26 20 28 63 3d 3d 27 28 27        && (c=='('
b490: 20 7c 7c 20 63 3d 3d 27 5c 6e 27 20 7c 7c 20 28   || c=='\n' || (
b4a0: 63 3d 3d 27 2c 27 20 26 26 20 21 77 73 54 6f 45  c==',' && !wsToE
b4b0: 6f 6c 28 7a 2b 69 2b 31 29 29 29 0a 20 20 20 20  ol(z+i+1))).    
b4c0: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
b4d0: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27       if( c=='\n'
b4e0: 20 29 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20   ) j--;.        
b4f0: 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c      printSchemaL
b500: 69 6e 65 4e 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20  ineN(p->out, z, 
b510: 6a 2c 20 22 5c 6e 20 20 22 29 3b 0a 20 20 20 20  j, "\n  ");.    
b520: 20 20 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20          j = 0;. 
b530: 20 20 20 20 20 20 20 20 20 20 20 6e 4c 69 6e 65             nLine
b540: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
b550: 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a  while( IsSpace(z
b560: 5b 69 2b 31 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d  [i+1]) ){ i++; }
b570: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
b580: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
b590: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [j] = 0;.      }
b5a0: 0a 20 20 20 20 20 20 70 72 69 6e 74 53 63 68 65  .      printSche
b5b0: 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20 7a  maLine(p->out, z
b5c0: 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20  , ";\n");.      
b5d0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
b5e0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b5f0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44    }.    case MOD
b600: 45 5f 4c 69 73 74 3a 20 7b 0a 20 20 20 20 20 20  E_List: {.      
b610: 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20  if( p->cnt++==0 
b620: 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72  && p->showHeader
b630: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
b640: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
b650: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
b660: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
b670: 22 25 73 25 73 22 2c 61 7a 43 6f 6c 5b 69 5d 2c  "%s%s",azCol[i],
b680: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b690: 20 20 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 70     i==nArg-1 ? p
b6a0: 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 20 3a  ->rowSeparator :
b6b0: 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
b6c0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
b6d0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61     }.      if( a
b6e0: 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b  zArg==0 ) break;
b6f0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
b700: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
b710: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20        char *z = 
b720: 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20  azArg[i];.      
b730: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d    if( z==0 ) z =
b740: 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 3b 0a 20   p->nullValue;. 
b750: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
b760: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
b770: 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   z);.        if(
b780: 20 69 3c 6e 41 72 67 2d 31 20 29 7b 0a 20 20 20   i<nArg-1 ){.   
b790: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
b7a0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
b7b0: 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
b7c0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
b7d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
b7e0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
b7f0: 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61  "%s", p->rowSepa
b800: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  rator);.        
b810: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
b820: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
b830: 20 63 61 73 65 20 4d 4f 44 45 5f 48 74 6d 6c 3a   case MODE_Html:
b840: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   {.      if( p->
b850: 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73  cnt++==0 && p->s
b860: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
b870: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
b880: 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a  p->out,"<TR>");.
b890: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
b8a0: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
b8b0: 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
b8c0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 48 3e  ntf(p->out,"<TH>
b8d0: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75  ");.          ou
b8e0: 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67  tput_html_string
b8f0: 28 70 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69  (p->out, azCol[i
b900: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 61  ]);.          ra
b910: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
b920: 22 3c 2f 54 48 3e 5c 6e 22 29 3b 0a 20 20 20 20  "</TH>\n");.    
b930: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61      }.        ra
b940: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
b950: 22 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20  "</TR>\n");.    
b960: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a    }.      if( az
b970: 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Arg==0 ) break;.
b980: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
b990: 28 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b  (p->out,"<TR>");
b9a0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
b9b0: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
b9c0: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
b9d0: 28 70 2d 3e 6f 75 74 2c 22 3c 54 44 3e 22 29 3b  (p->out,"<TD>");
b9e0: 0a 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f  .        output_
b9f0: 68 74 6d 6c 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  html_string(p->o
ba00: 75 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61  ut, azArg[i] ? a
ba10: 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c  zArg[i] : p->nul
ba20: 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20  lValue);.       
ba30: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
ba40: 75 74 2c 22 3c 2f 54 44 3e 5c 6e 22 29 3b 0a 20  ut,"</TD>\n");. 
ba50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77       }.      raw
ba60: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
ba70: 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20  </TR>\n");.     
ba80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
ba90: 20 20 63 61 73 65 20 4d 4f 44 45 5f 54 63 6c 3a    case MODE_Tcl:
baa0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   {.      if( p->
bab0: 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73  cnt++==0 && p->s
bac0: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
bad0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
bae0: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
baf0: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73        output_c_s
bb00: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 61 7a 43  tring(p->out,azC
bb10: 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d  ol[i] ? azCol[i]
bb20: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20   : "");.        
bb30: 20 20 69 66 28 69 3c 6e 41 72 67 2d 31 29 20 75    if(i<nArg-1) u
bb40: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
bb50: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53  t, "%s", p->colS
bb60: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
bb70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66     }.        utf
bb80: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
bb90: 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70   "%s", p->rowSep
bba0: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d  arator);.      }
bbb0: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
bbc0: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
bbd0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
bbe0: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
bbf0: 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e    output_c_strin
bc00: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b  g(p->out, azArg[
bc10: 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20  i] ? azArg[i] : 
bc20: 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20  p->nullValue);. 
bc30: 20 20 20 20 20 20 20 69 66 28 69 3c 6e 41 72 67         if(i<nArg
bc40: 2d 31 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28  -1) utf8_printf(
bc50: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
bc60: 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a  >colSeparator);.
bc70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 74        }.      ut
bc80: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
bc90: 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65  , "%s", p->rowSe
bca0: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
bcb0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
bcc0: 20 63 61 73 65 20 4d 4f 44 45 5f 43 73 76 3a 20   case MODE_Csv: 
bcd0: 7b 0a 20 20 20 20 20 20 73 65 74 42 69 6e 61 72  {.      setBinar
bce0: 79 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29  yMode(p->out, 1)
bcf0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63  ;.      if( p->c
bd00: 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68  nt++==0 && p->sh
bd10: 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20  owHeader ){.    
bd20: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
bd30: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
bd40: 20 20 20 20 20 6f 75 74 70 75 74 5f 63 73 76 28       output_csv(
bd50: 70 2c 20 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a  p, azCol[i] ? az
bd60: 43 6f 6c 5b 69 5d 20 3a 20 22 22 2c 20 69 3c 6e  Col[i] : "", i<n
bd70: 41 72 67 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  Arg-1);.        
bd80: 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  }.        utf8_p
bd90: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
bda0: 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  s", p->rowSepara
bdb0: 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tor);.      }.  
bdc0: 20 20 20 20 69 66 28 20 6e 41 72 67 3e 30 20 29      if( nArg>0 )
bdd0: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
bde0: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
bdf0: 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75  .          outpu
be00: 74 5f 63 73 76 28 70 2c 20 61 7a 41 72 67 5b 69  t_csv(p, azArg[i
be10: 5d 2c 20 69 3c 6e 41 72 67 2d 31 29 3b 0a 20 20  ], i<nArg-1);.  
be20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
be30: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
be40: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77  ut, "%s", p->row
be50: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
be60: 20 20 7d 0a 20 20 20 20 20 20 73 65 74 54 65 78    }.      setTex
be70: 74 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29  tMode(p->out, 1)
be80: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
be90: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
bea0: 44 45 5f 49 6e 73 65 72 74 3a 20 7b 0a 20 20 20  DE_Insert: {.   
beb0: 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20     if( azArg==0 
bec0: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 75  ) break;.      u
bed0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
bee0: 74 2c 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25  t,"INSERT INTO %
bef0: 73 22 2c 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65  s",p->zDestTable
bf00: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
bf10: 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20  showHeader ){.  
bf20: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
bf30: 28 70 2d 3e 6f 75 74 2c 22 28 22 29 3b 0a 20 20  (p->out,"(");.  
bf40: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
bf50: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
bf60: 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29         if( i>0 )
bf70: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
bf80: 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20  ut, ",");.      
bf90: 20 20 20 20 69 66 28 20 71 75 6f 74 65 43 68 61      if( quoteCha
bfa0: 72 28 61 7a 43 6f 6c 5b 69 5d 29 20 29 7b 0a 20  r(azCol[i]) ){. 
bfb0: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
bfc0: 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  *z = sqlite3_mpr
bfd0: 69 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c 20 61  intf("\"%w\"", a
bfe0: 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zCol[i]);.      
bff0: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
c000: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
c010: 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  z);.            
c020: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
c030: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
c040: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 61  {.            ra
c050: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
c060: 20 22 25 73 22 2c 20 61 7a 43 6f 6c 5b 69 5d 29   "%s", azCol[i])
c070: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
c080: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
c090: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
c0a0: 74 2c 22 29 22 29 3b 0a 20 20 20 20 20 20 7d 0a  t,")");.      }.
c0b0: 20 20 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a        p->cnt++;.
c0c0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
c0d0: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
c0e0: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
c0f0: 70 2d 3e 6f 75 74 2c 20 69 3e 30 20 3f 20 22 2c  p->out, i>0 ? ",
c100: 22 20 3a 20 22 20 56 41 4c 55 45 53 28 22 29 3b  " : " VALUES(");
c110: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 61 7a  .        if( (az
c120: 41 72 67 5b 69 5d 3d 3d 30 29 20 7c 7c 20 28 61  Arg[i]==0) || (a
c130: 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b  iType && aiType[
c140: 69 5d 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29  i]==SQLITE_NULL)
c150: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74   ){.          ut
c160: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
c170: 2c 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20  ,"NULL");.      
c180: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79    }else if( aiTy
c190: 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d  pe && aiType[i]=
c1a0: 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a  =SQLITE_TEXT ){.
c1b0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 53 68            if( Sh
c1c0: 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20 53 48  ellHasFlag(p, SH
c1d0: 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29 20 29 7b  FLG_Newlines) ){
c1e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 75 74  .            out
c1f0: 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e  put_quoted_strin
c200: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b  g(p->out, azArg[
c210: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  i]);.          }
c220: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
c230: 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f    output_quoted_
c240: 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28 70  escaped_string(p
c250: 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29  ->out, azArg[i])
c260: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
c270: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
c280: 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65  aiType && aiType
c290: 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  [i]==SQLITE_INTE
c2a0: 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20  GER ){.         
c2b0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
c2c0: 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b  out,"%s", azArg[
c2d0: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  i]);.        }el
c2e0: 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26  se if( aiType &&
c2f0: 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49   aiType[i]==SQLI
c300: 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20  TE_FLOAT ){.    
c310: 20 20 20 20 20 20 63 68 61 72 20 7a 5b 35 30 5d        char z[50]
c320: 3b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75 62  ;.          doub
c330: 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 63  le r = sqlite3_c
c340: 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 2d 3e  olumn_double(p->
c350: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
c360: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
c370: 72 69 6e 74 66 28 35 30 2c 7a 2c 22 25 21 2e 32  rintf(50,z,"%!.2
c380: 30 67 22 2c 20 72 29 3b 0a 20 20 20 20 20 20 20  0g", r);.       
c390: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
c3a0: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a  >out, "%s", z);.
c3b0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
c3c0: 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79  ( aiType && aiTy
c3d0: 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 42 4c  pe[i]==SQLITE_BL
c3e0: 4f 42 20 26 26 20 70 2d 3e 70 53 74 6d 74 20 29  OB && p->pStmt )
c3f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  {.          cons
c400: 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62 20 3d 20  t void *pBlob = 
c410: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
c420: 6c 6f 62 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29  lob(p->pStmt, i)
c430: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
c440: 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f  nBlob = sqlite3_
c450: 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 2d 3e  column_bytes(p->
c460: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
c470: 20 20 20 20 20 6f 75 74 70 75 74 5f 68 65 78 5f       output_hex_
c480: 62 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20 70 42 6c  blob(p->out, pBl
c490: 6f 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 20 20  ob, nBlob);.    
c4a0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73      }else if( is
c4b0: 4e 75 6d 62 65 72 28 61 7a 41 72 67 5b 69 5d 2c  Number(azArg[i],
c4c0: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   0) ){.         
c4d0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
c4e0: 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b  out,"%s", azArg[
c4f0: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  i]);.        }el
c500: 73 65 20 69 66 28 20 53 68 65 6c 6c 48 61 73 46  se if( ShellHasF
c510: 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65 77  lag(p, SHFLG_New
c520: 6c 69 6e 65 73 29 20 29 7b 0a 20 20 20 20 20 20  lines) ){.      
c530: 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65      output_quote
c540: 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c  d_string(p->out,
c550: 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20   azArg[i]);.    
c560: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c570: 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74       output_quot
c580: 65 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e  ed_escaped_strin
c590: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b  g(p->out, azArg[
c5a0: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
c5b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77       }.      raw
c5c0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
c5d0: 29 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72  );\n");.      br
c5e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
c5f0: 61 73 65 20 4d 4f 44 45 5f 51 75 6f 74 65 3a 20  ase MODE_Quote: 
c600: 7b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72  {.      if( azAr
c610: 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  g==0 ) break;.  
c620: 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 3d 3d      if( p->cnt==
c630: 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64  0 && p->showHead
c640: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  er ){.        fo
c650: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
c660: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
c670: 66 28 20 69 3e 30 20 29 20 72 61 77 5f 70 72 69  f( i>0 ) raw_pri
c680: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 22 29  ntf(p->out, ",")
c690: 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70  ;.          outp
c6a0: 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67  ut_quoted_string
c6b0: 28 70 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69  (p->out, azCol[i
c6c0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
c6d0: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
c6e0: 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20  (p->out,"\n");. 
c6f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
c700: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72  cnt++;.      for
c710: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
c720: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
c730: 69 3e 30 20 29 20 72 61 77 5f 70 72 69 6e 74 66  i>0 ) raw_printf
c740: 28 70 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a 20  (p->out, ",");. 
c750: 20 20 20 20 20 20 20 69 66 28 20 28 61 7a 41 72         if( (azAr
c760: 67 5b 69 5d 3d 3d 30 29 20 7c 7c 20 28 61 69 54  g[i]==0) || (aiT
c770: 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d  ype && aiType[i]
c780: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29  ==SQLITE_NULL) )
c790: 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
c7a0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
c7b0: 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 20 20  NULL");.        
c7c0: 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65  }else if( aiType
c7d0: 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53   && aiType[i]==S
c7e0: 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20  QLITE_TEXT ){.  
c7f0: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71          output_q
c800: 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e  uoted_string(p->
c810: 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  out, azArg[i]);.
c820: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
c830: 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79  ( aiType && aiTy
c840: 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e  pe[i]==SQLITE_IN
c850: 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20  TEGER ){.       
c860: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
c870: 2d 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72  ->out,"%s", azAr
c880: 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  g[i]);.        }
c890: 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20  else if( aiType 
c8a0: 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51  && aiType[i]==SQ
c8b0: 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20  LITE_FLOAT ){.  
c8c0: 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 5b 35          char z[5
c8d0: 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 6f  0];.          do
c8e0: 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33  uble r = sqlite3
c8f0: 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70  _column_double(p
c900: 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  ->pStmt, i);.   
c910: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
c920: 6e 70 72 69 6e 74 66 28 35 30 2c 7a 2c 22 25 21  nprintf(50,z,"%!
c930: 2e 32 30 67 22 2c 20 72 29 3b 0a 20 20 20 20 20  .20g", r);.     
c940: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
c950: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29  p->out, "%s", z)
c960: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
c970: 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69  if( aiType && ai
c980: 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f  Type[i]==SQLITE_
c990: 42 4c 4f 42 20 26 26 20 70 2d 3e 70 53 74 6d 74  BLOB && p->pStmt
c9a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   ){.          co
c9b0: 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62 20  nst void *pBlob 
c9c0: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
c9d0: 5f 62 6c 6f 62 28 70 2d 3e 70 53 74 6d 74 2c 20  _blob(p->pStmt, 
c9e0: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  i);.          in
c9f0: 74 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65  t nBlob = sqlite
ca00: 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
ca10: 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  ->pStmt, i);.   
ca20: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68 65         output_he
ca30: 78 5f 62 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20 70  x_blob(p->out, p
ca40: 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20  Blob, nBlob);.  
ca50: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
ca60: 69 73 4e 75 6d 62 65 72 28 61 7a 41 72 67 5b 69  isNumber(azArg[i
ca70: 5d 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  ], 0) ){.       
ca80: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
ca90: 2d 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72  ->out,"%s", azAr
caa0: 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  g[i]);.        }
cab0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
cac0: 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74  output_quoted_st
cad0: 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41  ring(p->out, azA
cae0: 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
caf0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
cb00: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
cb10: 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62  t,"\n");.      b
cb20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
cb30: 63 61 73 65 20 4d 4f 44 45 5f 41 73 63 69 69 3a  case MODE_Ascii:
cb40: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   {.      if( p->
cb50: 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73  cnt++==0 && p->s
cb60: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
cb70: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
cb80: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
cb90: 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 20        if( i>0 ) 
cba0: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
cbb0: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c  ut, "%s", p->col
cbc0: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
cbd0: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
cbe0: 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 61 7a  f(p->out,"%s",az
cbf0: 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69  Col[i] ? azCol[i
cc00: 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20  ] : "");.       
cc10: 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f   }.        utf8_
cc20: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
cc30: 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  %s", p->rowSepar
cc40: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ator);.      }. 
cc50: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d       if( azArg==
cc60: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
cc70: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
cc80: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
cc90: 69 66 28 20 69 3e 30 20 29 20 75 74 66 38 5f 70  if( i>0 ) utf8_p
cca0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
ccb0: 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61  s", p->colSepara
ccc0: 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 75 74  tor);.        ut
ccd0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
cce0: 2c 22 25 73 22 2c 61 7a 41 72 67 5b 69 5d 20 3f  ,"%s",azArg[i] ?
ccf0: 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e   azArg[i] : p->n
cd00: 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  ullValue);.     
cd10: 20 7d 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72   }.      utf8_pr
cd20: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
cd30: 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ", p->rowSeparat
cd40: 6f 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  or);.      break
cd50: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
cd60: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
cd70: 20 54 68 69 73 20 69 73 20 74 68 65 20 63 61 6c   This is the cal
cd80: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 74 68  lback routine th
cd90: 61 74 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69  at the SQLite li
cda0: 62 72 61 72 79 0a 2a 2a 20 69 6e 76 6f 6b 65 73  brary.** invokes
cdb0: 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66   for each row of
cdc0: 20 61 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e   a query result.
cdd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
cde0: 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41  allback(void *pA
cdf0: 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68  rg, int nArg, ch
ce00: 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72  ar **azArg, char
ce10: 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20 20 2f 2a 20   **azCol){.  /* 
ce20: 73 69 6e 63 65 20 77 65 20 64 6f 6e 27 74 20 68  since we don't h
ce30: 61 76 65 20 74 79 70 65 20 69 6e 66 6f 2c 20 63  ave type info, c
ce40: 61 6c 6c 20 74 68 65 20 73 68 65 6c 6c 5f 63 61  all the shell_ca
ce50: 6c 6c 62 61 63 6b 20 77 69 74 68 20 61 20 4e 55  llback with a NU
ce60: 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a 20 20 72 65  LL value */.  re
ce70: 74 75 72 6e 20 73 68 65 6c 6c 5f 63 61 6c 6c 62  turn shell_callb
ce80: 61 63 6b 28 70 41 72 67 2c 20 6e 41 72 67 2c 20  ack(pArg, nArg, 
ce90: 61 7a 41 72 67 2c 20 61 7a 43 6f 6c 2c 20 4e 55  azArg, azCol, NU
cea0: 4c 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  LL);.}../*.** Th
ceb0: 69 73 20 69 73 20 74 68 65 20 63 61 6c 6c 62 61  is is the callba
cec0: 63 6b 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20  ck routine from 
ced0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 74  sqlite3_exec() t
cee0: 68 61 74 20 61 70 70 65 6e 64 73 20 61 6c 6c 0a  hat appends all.
cef0: 2a 2a 20 6f 75 74 70 75 74 20 6f 6e 74 6f 20 74  ** output onto t
cf00: 68 65 20 65 6e 64 20 6f 66 20 61 20 53 68 65 6c  he end of a Shel
cf10: 6c 54 65 78 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f  lText object..*/
cf20: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 70 74  .static int capt
cf30: 75 72 65 4f 75 74 70 75 74 43 61 6c 6c 62 61 63  ureOutputCallbac
cf40: 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e  k(void *pArg, in
cf50: 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61  t nArg, char **a
cf60: 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 29  zArg, char **az)
cf70: 7b 0a 20 20 53 68 65 6c 6c 54 65 78 74 20 2a 70  {.  ShellText *p
cf80: 20 3d 20 28 53 68 65 6c 6c 54 65 78 74 2a 29 70   = (ShellText*)p
cf90: 41 72 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Arg;.  int i;.  
cfa0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
cfb0: 28 61 7a 29 3b 0a 20 20 69 66 28 20 61 7a 41 72  (az);.  if( azAr
cfc0: 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  g==0 ) return 0;
cfd0: 0a 20 20 69 66 28 20 70 2d 3e 6e 20 29 20 61 70  .  if( p->n ) ap
cfe0: 70 65 6e 64 54 65 78 74 28 70 2c 20 22 7c 22 2c  pendText(p, "|",
cff0: 20 30 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   0);.  for(i=0; 
d000: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
d010: 20 20 69 66 28 20 69 20 29 20 61 70 70 65 6e 64    if( i ) append
d020: 54 65 78 74 28 70 2c 20 22 2c 22 2c 20 30 29 3b  Text(p, ",", 0);
d030: 0a 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b 69  .    if( azArg[i
d040: 5d 20 29 20 61 70 70 65 6e 64 54 65 78 74 28 70  ] ) appendText(p
d050: 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 30 29 3b 0a  , azArg[i], 0);.
d060: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
d070: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
d080: 65 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  e an appropriate
d090: 20 53 45 4c 46 54 45 53 54 20 74 61 62 6c 65 20   SELFTEST table 
d0a0: 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
d0b0: 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  base..*/.static 
d0c0: 76 6f 69 64 20 63 72 65 61 74 65 53 65 6c 66 74  void createSelft
d0d0: 65 73 74 54 61 62 6c 65 28 53 68 65 6c 6c 53 74  estTable(ShellSt
d0e0: 61 74 65 20 2a 70 29 7b 0a 20 20 63 68 61 72 20  ate *p){.  char 
d0f0: 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  *zErrMsg = 0;.  
d100: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
d110: 64 62 2c 0a 20 20 20 20 22 53 41 56 45 50 4f 49  db,.    "SAVEPOI
d120: 4e 54 20 73 65 6c 66 74 65 73 74 5f 69 6e 69 74  NT selftest_init
d130: 3b 5c 6e 22 0a 20 20 20 20 22 43 52 45 41 54 45  ;\n".    "CREATE
d140: 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58   TABLE IF NOT EX
d150: 49 53 54 53 20 73 65 6c 66 74 65 73 74 28 5c 6e  ISTS selftest(\n
d160: 22 0a 20 20 20 20 22 20 20 74 6e 6f 20 49 4e 54  ".    "  tno INT
d170: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
d180: 2c 5c 6e 22 20 20 20 2f 2a 20 54 65 73 74 20 6e  ,\n"   /* Test n
d190: 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 22 20 20  umber */.    "  
d1a0: 6f 70 20 54 45 58 54 2c 5c 6e 22 20 20 20 20 20  op TEXT,\n"     
d1b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
d1c0: 20 4f 70 65 72 61 74 6f 72 3a 20 20 6d 65 6d 6f   Operator:  memo
d1d0: 20 72 75 6e 20 2a 2f 0a 20 20 20 20 22 20 20 63   run */.    "  c
d1e0: 6d 64 20 54 45 58 54 2c 5c 6e 22 20 20 20 20 20  md TEXT,\n"     
d1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d200: 43 6f 6d 6d 61 6e 64 20 74 65 78 74 20 2a 2f 0a  Command text */.
d210: 20 20 20 20 22 20 20 61 6e 73 20 54 45 58 54 5c      "  ans TEXT\
d220: 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n"              
d230: 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65 64 20       /* Desired 
d240: 61 6e 73 77 65 72 20 2a 2f 0a 20 20 20 20 22 29  answer */.    ")
d250: 3b 22 0a 20 20 20 20 22 43 52 45 41 54 45 20 54  ;".    "CREATE T
d260: 45 4d 50 20 54 41 42 4c 45 20 5b 5f 73 68 65 6c  EMP TABLE [_shel
d270: 6c 24 73 65 6c 66 5d 28 6f 70 2c 63 6d 64 2c 61  l$self](op,cmd,a
d280: 6e 73 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53  ns);\n".    "INS
d290: 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c  ERT INTO [_shell
d2a0: 24 73 65 6c 66 5d 28 72 6f 77 69 64 2c 6f 70 2c  $self](rowid,op,
d2b0: 63 6d 64 29 5c 6e 22 0a 20 20 20 20 22 20 20 56  cmd)\n".    "  V
d2c0: 41 4c 55 45 53 28 63 6f 61 6c 65 73 63 65 28 28  ALUES(coalesce((
d2d0: 53 45 4c 45 43 54 20 28 6d 61 78 28 74 6e 6f 29  SELECT (max(tno)
d2e0: 2b 31 30 30 29 2f 31 30 20 46 52 4f 4d 20 73 65  +100)/10 FROM se
d2f0: 6c 66 74 65 73 74 29 2c 31 30 29 2c 5c 6e 22 0a  lftest),10),\n".
d300: 20 20 20 20 22 20 20 20 20 20 20 20 20 20 27 6d      "         'm
d310: 65 6d 6f 27 2c 27 54 65 73 74 73 20 67 65 6e 65  emo','Tests gene
d320: 72 61 74 65 64 20 62 79 20 2d 2d 69 6e 69 74 27  rated by --init'
d330: 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45 52  );\n".    "INSER
d340: 54 20 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24 73  T INTO [_shell$s
d350: 65 6c 66 5d 5c 6e 22 0a 20 20 20 20 22 20 20 53  elf]\n".    "  S
d360: 45 4c 45 43 54 20 27 72 75 6e 27 2c 5c 6e 22 0a  ELECT 'run',\n".
d370: 20 20 20 20 22 20 20 20 20 27 53 45 4c 45 43 54      "    'SELECT
d380: 20 68 65 78 28 73 68 61 33 5f 71 75 65 72 79 28   hex(sha3_query(
d390: 27 27 53 45 4c 45 43 54 20 74 79 70 65 2c 6e 61  ''SELECT type,na
d3a0: 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c 73 71 6c 20  me,tbl_name,sql 
d3b0: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
d3c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3d0: 20 20 20 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f     "FROM sqlite_
d3e0: 6d 61 73 74 65 72 20 4f 52 44 45 52 20 42 59 20  master ORDER BY 
d3f0: 32 27 27 2c 32 32 34 29 29 27 2c 5c 6e 22 0a 20  2'',224))',\n". 
d400: 20 20 20 22 20 20 20 20 68 65 78 28 73 68 61 33     "    hex(sha3
d410: 5f 71 75 65 72 79 28 27 53 45 4c 45 43 54 20 74  _query('SELECT t
d420: 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d  ype,name,tbl_nam
d430: 65 2c 73 71 6c 20 22 0a 20 20 20 20 20 20 20 20  e,sql ".        
d440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d450: 20 20 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d    "FROM sqlite_m
d460: 61 73 74 65 72 20 4f 52 44 45 52 20 42 59 20 32  aster ORDER BY 2
d470: 27 2c 32 32 34 29 29 3b 5c 6e 22 0a 20 20 20 20  ',224));\n".    
d480: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73  "INSERT INTO [_s
d490: 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20 20  hell$self]\n".  
d4a0: 20 20 22 20 20 53 45 4c 45 43 54 20 27 72 75 6e    "  SELECT 'run
d4b0: 27 2c 22 0a 20 20 20 20 22 20 20 20 20 27 53 45  ',".    "    'SE
d4c0: 4c 45 43 54 20 68 65 78 28 73 68 61 33 5f 71 75  LECT hex(sha3_qu
d4d0: 65 72 79 28 27 27 53 45 4c 45 43 54 20 2a 20 46  ery(''SELECT * F
d4e0: 52 4f 4d 20 5c 22 27 20 7c 7c 22 0a 20 20 20 20  ROM \"' ||".    
d4f0: 22 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28  "        printf(
d500: 27 25 77 27 2c 6e 61 6d 65 29 20 7c 7c 20 27 5c  '%w',name) || '\
d510: 22 20 4e 4f 54 20 49 4e 44 45 58 45 44 27 27 2c  " NOT INDEXED'',
d520: 32 32 34 29 29 27 2c 5c 6e 22 0a 20 20 20 20 22  224))',\n".    "
d530: 20 20 20 20 68 65 78 28 73 68 61 33 5f 71 75 65      hex(sha3_que
d540: 72 79 28 70 72 69 6e 74 66 28 27 53 45 4c 45 43  ry(printf('SELEC
d550: 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c 22 20  T * FROM \"%w\" 
d560: 4e 4f 54 20 49 4e 44 45 58 45 44 27 2c 6e 61 6d  NOT INDEXED',nam
d570: 65 29 2c 32 32 34 29 29 5c 6e 22 0a 20 20 20 20  e),224))\n".    
d580: 22 20 20 46 52 4f 4d 20 28 5c 6e 22 0a 20 20 20  "  FROM (\n".   
d590: 20 22 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d   "    SELECT nam
d5a0: 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  e FROM sqlite_ma
d5b0: 73 74 65 72 5c 6e 22 0a 20 20 20 20 22 20 20 20  ster\n".    "   
d5c0: 20 20 57 48 45 52 45 20 74 79 70 65 3d 27 74 61    WHERE type='ta
d5d0: 62 6c 65 27 5c 6e 22 0a 20 20 20 20 22 20 20 20  ble'\n".    "   
d5e0: 20 20 20 20 41 4e 44 20 6e 61 6d 65 3c 3e 27 73      AND name<>'s
d5f0: 65 6c 66 74 65 73 74 27 5c 6e 22 0a 20 20 20 20  elftest'\n".    
d600: 22 20 20 20 20 20 20 20 41 4e 44 20 63 6f 61 6c  "       AND coal
d610: 65 73 63 65 28 72 6f 6f 74 70 61 67 65 2c 30 29  esce(rootpage,0)
d620: 3e 30 5c 6e 22 0a 20 20 20 20 22 20 20 29 5c 6e  >0\n".    "  )\n
d630: 22 0a 20 20 20 20 22 20 4f 52 44 45 52 20 42 59  ".    " ORDER BY
d640: 20 6e 61 6d 65 3b 5c 6e 22 0a 20 20 20 20 22 49   name;\n".    "I
d650: 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65  NSERT INTO [_she
d660: 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20 20 20 20  ll$self]\n".    
d670: 22 20 20 56 41 4c 55 45 53 28 27 72 75 6e 27 2c  "  VALUES('run',
d680: 27 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74  'PRAGMA integrit
d690: 79 5f 63 68 65 63 6b 27 2c 27 6f 6b 27 29 3b 5c  y_check','ok');\
d6a0: 6e 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49  n".    "INSERT I
d6b0: 4e 54 4f 20 73 65 6c 66 74 65 73 74 28 74 6e 6f  NTO selftest(tno
d6c0: 2c 6f 70 2c 63 6d 64 2c 61 6e 73 29 22 0a 20 20  ,op,cmd,ans)".  
d6d0: 20 20 22 20 20 53 45 4c 45 43 54 20 72 6f 77 69    "  SELECT rowi
d6e0: 64 2a 31 30 2c 6f 70 2c 63 6d 64 2c 61 6e 73 20  d*10,op,cmd,ans 
d6f0: 46 52 4f 4d 20 5b 5f 73 68 65 6c 6c 24 73 65 6c  FROM [_shell$sel
d700: 66 5d 3b 5c 6e 22 0a 20 20 20 20 22 44 52 4f 50  f];\n".    "DROP
d710: 20 54 41 42 4c 45 20 5b 5f 73 68 65 6c 6c 24 73   TABLE [_shell$s
d720: 65 6c 66 5d 3b 22 0a 20 20 20 20 2c 30 2c 30 2c  elf];".    ,0,0,
d730: 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28  &zErrMsg);.  if(
d740: 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20   zErrMsg ){.    
d750: 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
d760: 72 72 2c 20 22 53 45 4c 46 54 45 53 54 20 69 6e  rr, "SELFTEST in
d770: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 61 69  itialization fai
d780: 6c 75 72 65 3a 20 25 73 5c 6e 22 2c 20 7a 45 72  lure: %s\n", zEr
d790: 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  rMsg);.    sqlit
d7a0: 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
d7b0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
d7c0: 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 52 45 4c  exec(p->db, "REL
d7d0: 45 41 53 45 20 73 65 6c 66 74 65 73 74 5f 69 6e  EASE selftest_in
d7e0: 69 74 22 2c 30 2c 30 2c 30 29 3b 0a 7d 0a 0a 0a  it",0,0,0);.}...
d7f0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65  /*.** Set the de
d800: 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20  stination table 
d810: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 53 68 65  field of the She
d820: 6c 6c 53 74 61 74 65 20 73 74 72 75 63 74 75 72  llState structur
d830: 65 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65  e to.** the name
d840: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 67 69   of the table gi
d850: 76 65 6e 2e 20 20 45 73 63 61 70 65 20 61 6e 79  ven.  Escape any
d860: 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72   quote character
d870: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 74 61 62 6c  s in the.** tabl
d880: 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  e name..*/.stati
d890: 63 20 76 6f 69 64 20 73 65 74 5f 74 61 62 6c 65  c void set_table
d8a0: 5f 6e 61 6d 65 28 53 68 65 6c 6c 53 74 61 74 65  _name(ShellState
d8b0: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
d8c0: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
d8d0: 2c 20 6e 3b 0a 20 20 63 68 61 72 20 63 51 75 6f  , n;.  char cQuo
d8e0: 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a  te;.  char *z;..
d8f0: 20 20 69 66 28 20 70 2d 3e 7a 44 65 73 74 54 61    if( p->zDestTa
d900: 62 6c 65 20 29 7b 0a 20 20 20 20 66 72 65 65 28  ble ){.    free(
d910: 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 29 3b 0a  p->zDestTable);.
d920: 20 20 20 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c      p->zDestTabl
d930: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
d940: 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75   zName==0 ) retu
d950: 72 6e 3b 0a 20 20 63 51 75 6f 74 65 20 3d 20 71  rn;.  cQuote = q
d960: 75 6f 74 65 43 68 61 72 28 7a 4e 61 6d 65 29 3b  uoteChar(zName);
d970: 0a 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28  .  n = strlen30(
d980: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 63 51  zName);.  if( cQ
d990: 75 6f 74 65 20 29 20 6e 20 2b 3d 20 6e 2b 32 3b  uote ) n += n+2;
d9a0: 0a 20 20 7a 20 3d 20 70 2d 3e 7a 44 65 73 74 54  .  z = p->zDestT
d9b0: 61 62 6c 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e  able = malloc( n
d9c0: 2b 31 20 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  +1 );.  if( z==0
d9d0: 20 29 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e   ){.    raw_prin
d9e0: 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
d9f0: 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c  : out of memory\
da00: 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29  n");.    exit(1)
da10: 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 30 3b 0a 20  ;.  }.  n = 0;. 
da20: 20 69 66 28 20 63 51 75 6f 74 65 20 29 20 7a 5b   if( cQuote ) z[
da30: 6e 2b 2b 5d 20 3d 20 63 51 75 6f 74 65 3b 0a 20  n++] = cQuote;. 
da40: 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b   for(i=0; zName[
da50: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 5b  i]; i++){.    z[
da60: 6e 2b 2b 5d 20 3d 20 7a 4e 61 6d 65 5b 69 5d 3b  n++] = zName[i];
da70: 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b 69  .    if( zName[i
da80: 5d 3d 3d 63 51 75 6f 74 65 20 29 20 7a 5b 6e 2b  ]==cQuote ) z[n+
da90: 2b 5d 20 3d 20 63 51 75 6f 74 65 3b 0a 20 20 7d  +] = cQuote;.  }
daa0: 0a 20 20 69 66 28 20 63 51 75 6f 74 65 20 29 20  .  if( cQuote ) 
dab0: 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75 6f 74 65 3b  z[n++] = cQuote;
dac0: 0a 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 7d 0a 0a  .  z[n] = 0;.}..
dad0: 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61  ./*.** Execute a
dae0: 20 71 75 65 72 79 20 73 74 61 74 65 6d 65 6e 74   query statement
daf0: 20 74 68 61 74 20 77 69 6c 6c 20 67 65 6e 65 72   that will gener
db00: 61 74 65 20 53 51 4c 20 6f 75 74 70 75 74 2e 20  ate SQL output. 
db10: 20 50 72 69 6e 74 0a 2a 2a 20 74 68 65 20 72 65   Print.** the re
db20: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2c 20 63 6f  sult columns, co
db30: 6d 6d 61 2d 73 65 70 61 72 61 74 65 64 2c 20 6f  mma-separated, o
db40: 6e 20 61 20 6c 69 6e 65 20 61 6e 64 20 74 68 65  n a line and the
db50: 6e 20 61 64 64 20 61 0a 2a 2a 20 73 65 6d 69 63  n add a.** semic
db60: 6f 6c 6f 6e 20 74 65 72 6d 69 6e 61 74 6f 72 20  olon terminator 
db70: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
db80: 61 74 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49  at line..**.** I
db90: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
dba0: 63 6f 6c 75 6d 6e 73 20 69 73 20 31 20 61 6e 64  columns is 1 and
dbb0: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 63 6f 6e   that column con
dbc0: 74 61 69 6e 73 20 74 65 78 74 20 22 2d 2d 22 0a  tains text "--".
dbd0: 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68  ** then write th
dbe0: 65 20 73 65 6d 69 63 6f 6c 6f 6e 20 6f 6e 20 61  e semicolon on a
dbf0: 20 73 65 70 61 72 61 74 65 20 6c 69 6e 65 2e 20   separate line. 
dc00: 20 54 68 61 74 20 77 61 79 2c 20 69 66 20 61 0a   That way, if a.
dc10: 2a 2a 20 22 2d 2d 22 20 63 6f 6d 6d 65 6e 74 20  ** "--" comment 
dc20: 6f 63 63 75 72 73 20 61 74 20 74 68 65 20 65 6e  occurs at the en
dc30: 64 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  d of the stateme
dc40: 6e 74 2c 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a  nt, the comment.
dc50: 2a 2a 20 77 6f 6e 27 74 20 63 6f 6e 73 75 6d 65  ** won't consume
dc60: 20 74 68 65 20 73 65 6d 69 63 6f 6c 6f 6e 20 74   the semicolon t
dc70: 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74  erminator..*/.st
dc80: 61 74 69 63 20 69 6e 74 20 72 75 6e 5f 74 61 62  atic int run_tab
dc90: 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28 0a 20  le_dump_query(. 
dca0: 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20   ShellState *p, 
dcb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65            /* Que
dcc0: 72 79 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ry context */.  
dcd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 6c  const char *zSel
dce0: 65 63 74 2c 20 20 20 20 20 2f 2a 20 53 45 4c 45  ect,     /* SELE
dcf0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  CT statement to 
dd00: 65 78 74 72 61 63 74 20 63 6f 6e 74 65 6e 74 20  extract content 
dd10: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
dd20: 2a 7a 46 69 72 73 74 52 6f 77 20 20 20 20 2f 2a  *zFirstRow    /*
dd30: 20 50 72 69 6e 74 20 62 65 66 6f 72 65 20 66 69   Print before fi
dd40: 72 73 74 20 72 6f 77 2c 20 69 66 20 6e 6f 74 20  rst row, if not 
dd50: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  NULL */.){.  sql
dd60: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65  ite3_stmt *pSele
dd70: 63 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ct;.  int rc;.  
dd80: 69 6e 74 20 6e 52 65 73 75 6c 74 3b 0a 20 20 69  int nResult;.  i
dd90: 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt i;.  const ch
dda0: 61 72 20 2a 7a 3b 0a 20 20 72 63 20 3d 20 73 71  ar *z;.  rc = sq
ddb0: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
ddc0: 28 70 2d 3e 64 62 2c 20 7a 53 65 6c 65 63 74 2c  (p->db, zSelect,
ddd0: 20 2d 31 2c 20 26 70 53 65 6c 65 63 74 2c 20 30   -1, &pSelect, 0
dde0: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
ddf0: 49 54 45 5f 4f 4b 20 7c 7c 20 21 70 53 65 6c 65  ITE_OK || !pSele
de00: 63 74 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  ct ){.    utf8_p
de10: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f  rintf(p->out, "/
de20: 2a 2a 2a 2a 20 45 52 52 4f 52 3a 20 28 25 64 29  **** ERROR: (%d)
de30: 20 25 73 20 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 72   %s *****/\n", r
de40: 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  c,.             
de50: 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73     sqlite3_errms
de60: 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 69  g(p->db));.    i
de70: 66 28 20 28 72 63 26 30 78 66 66 29 21 3d 53 51  f( (rc&0xff)!=SQ
de80: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 20 70  LITE_CORRUPT ) p
de90: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65  ->nErr++;.    re
dea0: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72  turn rc;.  }.  r
deb0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
dec0: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 6e 52 65  (pSelect);.  nRe
ded0: 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 5f 63  sult = sqlite3_c
dee0: 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 65 6c  olumn_count(pSel
def0: 65 63 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  ect);.  while( r
df00: 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  c==SQLITE_ROW ){
df10: 0a 20 20 20 20 69 66 28 20 7a 46 69 72 73 74 52  .    if( zFirstR
df20: 6f 77 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  ow ){.      utf8
df30: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
df40: 22 25 73 22 2c 20 7a 46 69 72 73 74 52 6f 77 29  "%s", zFirstRow)
df50: 3b 0a 20 20 20 20 20 20 7a 46 69 72 73 74 52 6f  ;.      zFirstRo
df60: 77 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  w = 0;.    }.   
df70: 20 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72   z = (const char
df80: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
df90: 5f 74 65 78 74 28 70 53 65 6c 65 63 74 2c 20 30  _text(pSelect, 0
dfa0: 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  );.    utf8_prin
dfb0: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
dfc0: 20 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31   z);.    for(i=1
dfd0: 3b 20 69 3c 6e 52 65 73 75 6c 74 3b 20 69 2b 2b  ; i<nResult; i++
dfe0: 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
dff0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 25  intf(p->out, ",%
e000: 73 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  s", sqlite3_colu
e010: 6d 6e 5f 74 65 78 74 28 70 53 65 6c 65 63 74 2c  mn_text(pSelect,
e020: 20 69 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   i));.    }.    
e030: 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 22  if( z==0 ) z = "
e040: 22 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 5b  ";.    while( z[
e050: 30 5d 20 26 26 20 28 7a 5b 30 5d 21 3d 27 2d 27  0] && (z[0]!='-'
e060: 20 7c 7c 20 7a 5b 31 5d 21 3d 27 2d 27 29 20 29   || z[1]!='-') )
e070: 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a 5b   z++;.    if( z[
e080: 30 5d 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  0] ){.      raw_
e090: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
e0a0: 5c 6e 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d 65 6c  \n;\n");.    }el
e0b0: 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
e0c0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 3b 5c  intf(p->out, ";\
e0d0: 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  n");.    }.    r
e0e0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
e0f0: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20  (pSelect);.  }. 
e100: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
e110: 6e 61 6c 69 7a 65 28 70 53 65 6c 65 63 74 29 3b  nalize(pSelect);
e120: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
e130: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 74 66 38  E_OK ){.    utf8
e140: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
e150: 22 2f 2a 2a 2a 2a 20 45 52 52 4f 52 3a 20 28 25  "/**** ERROR: (%
e160: 64 29 20 25 73 20 2a 2a 2a 2a 2a 2f 5c 6e 22 2c  d) %s *****/\n",
e170: 20 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20   rc,.           
e180: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72       sqlite3_err
e190: 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
e1a0: 20 69 66 28 20 28 72 63 26 30 78 66 66 29 21 3d   if( (rc&0xff)!=
e1b0: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29  SQLITE_CORRUPT )
e1c0: 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a   p->nErr++;.  }.
e1d0: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
e1e0: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73  /*.** Allocate s
e1f0: 70 61 63 65 20 61 6e 64 20 73 61 76 65 20 6f 66  pace and save of
e200: 66 20 63 75 72 72 65 6e 74 20 65 72 72 6f 72 20  f current error 
e210: 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  string..*/.stati
e220: 63 20 63 68 61 72 20 2a 73 61 76 65 5f 65 72 72  c char *save_err
e230: 5f 6d 73 67 28 0a 20 20 73 71 6c 69 74 65 33 20  _msg(.  sqlite3 
e240: 2a 64 62 20 20 20 20 20 20 20 20 20 20 20 20 2f  *db            /
e250: 2a 20 44 61 74 61 62 61 73 65 20 74 6f 20 71 75  * Database to qu
e260: 65 72 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ery */.){.  int 
e270: 6e 45 72 72 4d 73 67 20 3d 20 31 2b 73 74 72 6c  nErrMsg = 1+strl
e280: 65 6e 33 30 28 73 71 6c 69 74 65 33 5f 65 72 72  en30(sqlite3_err
e290: 6d 73 67 28 64 62 29 29 3b 0a 20 20 63 68 61 72  msg(db));.  char
e2a0: 20 2a 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69   *zErrMsg = sqli
e2b0: 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 45 72  te3_malloc64(nEr
e2c0: 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 7a 45 72  rMsg);.  if( zEr
e2d0: 72 4d 73 67 20 29 7b 0a 20 20 20 20 6d 65 6d 63  rMsg ){.    memc
e2e0: 70 79 28 7a 45 72 72 4d 73 67 2c 20 73 71 6c 69  py(zErrMsg, sqli
e2f0: 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20  te3_errmsg(db), 
e300: 6e 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20  nErrMsg);.  }.  
e310: 72 65 74 75 72 6e 20 7a 45 72 72 4d 73 67 3b 0a  return zErrMsg;.
e320: 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 6c 69 6e 75  }..#ifdef __linu
e330: 78 5f 5f 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  x__./*.** Attemp
e340: 74 20 74 6f 20 64 69 73 70 6c 61 79 20 49 2f 4f  t to display I/O
e350: 20 73 74 61 74 73 20 6f 6e 20 4c 69 6e 75 78 20   stats on Linux 
e360: 75 73 69 6e 67 20 2f 70 72 6f 63 2f 50 49 44 2f  using /proc/PID/
e370: 69 6f 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  io.*/.static voi
e380: 64 20 64 69 73 70 6c 61 79 4c 69 6e 75 78 49 6f  d displayLinuxIo
e390: 53 74 61 74 73 28 46 49 4c 45 20 2a 6f 75 74 29  Stats(FILE *out)
e3a0: 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20  {.  FILE *in;.  
e3b0: 63 68 61 72 20 7a 5b 32 30 30 5d 3b 0a 20 20 73  char z[200];.  s
e3c0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
e3d0: 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 2f  sizeof(z), z, "/
e3e0: 70 72 6f 63 2f 25 64 2f 69 6f 22 2c 20 67 65 74  proc/%d/io", get
e3f0: 70 69 64 28 29 29 3b 0a 20 20 69 6e 20 3d 20 66  pid());.  in = f
e400: 6f 70 65 6e 28 7a 2c 20 22 72 62 22 29 3b 0a 20  open(z, "rb");. 
e410: 20 69 66 28 20 69 6e 3d 3d 30 20 29 20 72 65 74   if( in==0 ) ret
e420: 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 66 67  urn;.  while( fg
e430: 65 74 73 28 7a 2c 20 73 69 7a 65 6f 66 28 7a 29  ets(z, sizeof(z)
e440: 2c 20 69 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20  , in)!=0 ){.    
e450: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
e460: 75 63 74 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73  uct {.      cons
e470: 74 20 63 68 61 72 20 2a 7a 50 61 74 74 65 72 6e  t char *zPattern
e480: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
e490: 61 72 20 2a 7a 44 65 73 63 3b 0a 20 20 20 20 7d  ar *zDesc;.    }
e4a0: 20 61 54 72 61 6e 73 5b 5d 20 3d 20 7b 0a 20 20   aTrans[] = {.  
e4b0: 20 20 20 20 7b 20 22 72 63 68 61 72 3a 20 22 2c      { "rchar: ",
e4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e4d0: 20 20 22 42 79 74 65 73 20 72 65 63 65 69 76 65    "Bytes receive
e4e0: 64 20 62 79 20 72 65 61 64 28 29 3a 22 20 7d 2c  d by read():" },
e4f0: 0a 20 20 20 20 20 20 7b 20 22 77 63 68 61 72 3a  .      { "wchar:
e500: 20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   ",             
e510: 20 20 20 20 20 22 42 79 74 65 73 20 73 65 6e 74       "Bytes sent
e520: 20 74 6f 20 77 72 69 74 65 28 29 3a 22 20 20 20   to write():"   
e530: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 73 79 73   },.      { "sys
e540: 63 72 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20  cr: ",          
e550: 20 20 20 20 20 20 20 20 22 52 65 61 64 28 29 20          "Read() 
e560: 73 79 73 74 65 6d 20 63 61 6c 6c 73 3a 22 20 20  system calls:"  
e570: 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
e580: 73 79 73 63 77 3a 20 22 2c 20 20 20 20 20 20 20  syscw: ",       
e590: 20 20 20 20 20 20 20 20 20 20 20 22 57 72 69 74             "Writ
e5a0: 65 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  e() system calls
e5b0: 3a 22 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20  :"     },.      
e5c0: 7b 20 22 72 65 61 64 5f 62 79 74 65 73 3a 20 22  { "read_bytes: "
e5d0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 22 42  ,             "B
e5e0: 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d 20 73  ytes read from s
e5f0: 74 6f 72 61 67 65 3a 22 20 20 7d 2c 0a 20 20 20  torage:"  },.   
e600: 20 20 20 7b 20 22 77 72 69 74 65 5f 62 79 74 65     { "write_byte
e610: 73 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20 20  s: ",           
e620: 20 22 42 79 74 65 73 20 77 72 69 74 74 65 6e 20   "Bytes written 
e630: 74 6f 20 73 74 6f 72 61 67 65 3a 22 20 7d 2c 0a  to storage:" },.
e640: 20 20 20 20 20 20 7b 20 22 63 61 6e 63 65 6c 6c        { "cancell
e650: 65 64 5f 77 72 69 74 65 5f 62 79 74 65 73 3a 20  ed_write_bytes: 
e660: 22 2c 20 20 22 43 61 6e 63 65 6c 6c 65 64 20 77  ",  "Cancelled w
e670: 72 69 74 65 20 62 79 74 65 73 3a 22 20 20 20 20  rite bytes:"    
e680: 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  },.    };.    in
e690: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
e6a0: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 54  ; i<ArraySize(aT
e6b0: 72 61 6e 73 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  rans); i++){.   
e6c0: 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65     int n = strle
e6d0: 6e 33 30 28 61 54 72 61 6e 73 5b 69 5d 2e 7a 50  n30(aTrans[i].zP
e6e0: 61 74 74 65 72 6e 29 3b 0a 20 20 20 20 20 20 69  attern);.      i
e6f0: 66 28 20 73 74 72 6e 63 6d 70 28 61 54 72 61 6e  f( strncmp(aTran
e700: 73 5b 69 5d 2e 7a 50 61 74 74 65 72 6e 2c 20 7a  s[i].zPattern, z
e710: 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  , n)==0 ){.     
e720: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f     utf8_printf(o
e730: 75 74 2c 20 22 25 2d 33 36 73 20 25 73 22 2c 20  ut, "%-36s %s", 
e740: 61 54 72 61 6e 73 5b 69 5d 2e 7a 44 65 73 63 2c  aTrans[i].zDesc,
e750: 20 26 7a 5b 6e 5d 29 3b 0a 20 20 20 20 20 20 20   &z[n]);.       
e760: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
e770: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 63 6c 6f      }.  }.  fclo
e780: 73 65 28 69 6e 29 3b 0a 7d 0a 23 65 6e 64 69 66  se(in);.}.#endif
e790: 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20  ../*.** Display 
e7a0: 61 20 73 69 6e 67 6c 65 20 6c 69 6e 65 20 6f 66  a single line of
e7b0: 20 73 74 61 74 75 73 20 75 73 69 6e 67 20 36 34   status using 64
e7c0: 2d 62 69 74 20 76 61 6c 75 65 73 2e 0a 2a 2f 0a  -bit values..*/.
e7d0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 69 73 70  static void disp
e7e0: 6c 61 79 53 74 61 74 4c 69 6e 65 28 0a 20 20 53  layStatLine(.  S
e7f0: 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 20 20  hellState *p,   
e800: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
e810: 73 68 65 6c 6c 20 63 6f 6e 74 65 78 74 20 2a 2f  shell context */
e820: 0a 20 20 63 68 61 72 20 2a 7a 4c 61 62 65 6c 2c  .  char *zLabel,
e830: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e840: 4c 61 62 65 6c 20 66 6f 72 20 74 68 69 73 20 6f  Label for this o
e850: 6e 65 20 6c 69 6e 65 20 2a 2f 0a 20 20 63 68 61  ne line */.  cha
e860: 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 20 20 20 20  r *zFormat,     
e870: 20 20 20 20 20 20 20 2f 2a 20 46 6f 72 6d 61 74         /* Format
e880: 20 66 6f 72 20 74 68 65 20 72 65 73 75 6c 74 20   for the result 
e890: 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61 74 75 73  */.  int iStatus
e8a0: 43 74 72 6c 2c 20 20 20 20 20 20 20 20 20 20 2f  Ctrl,          /
e8b0: 2a 20 57 68 69 63 68 20 73 74 61 74 75 73 20 74  * Which status t
e8c0: 6f 20 64 69 73 70 6c 61 79 20 2a 2f 0a 20 20 69  o display */.  i
e8d0: 6e 74 20 62 52 65 73 65 74 20 20 20 20 20 20 20  nt bReset       
e8e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
e8f0: 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 73 74   to reset the st
e900: 61 74 73 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  ats */.){.  sqli
e910: 74 65 33 5f 69 6e 74 36 34 20 69 43 75 72 20 3d  te3_int64 iCur =
e920: 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69   -1;.  sqlite3_i
e930: 6e 74 36 34 20 69 48 69 77 74 72 20 3d 20 2d 31  nt64 iHiwtr = -1
e940: 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 50 65 72 63  ;.  int i, nPerc
e950: 65 6e 74 3b 0a 20 20 63 68 61 72 20 7a 4c 69 6e  ent;.  char zLin
e960: 65 5b 32 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65  e[200];.  sqlite
e970: 33 5f 73 74 61 74 75 73 36 34 28 69 53 74 61 74  3_status64(iStat
e980: 75 73 43 74 72 6c 2c 20 26 69 43 75 72 2c 20 26  usCtrl, &iCur, &
e990: 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b  iHiwtr, bReset);
e9a0: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6e 50 65 72  .  for(i=0, nPer
e9b0: 63 65 6e 74 3d 30 3b 20 7a 46 6f 72 6d 61 74 5b  cent=0; zFormat[
e9c0: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  i]; i++){.    if
e9d0: 28 20 7a 46 6f 72 6d 61 74 5b 69 5d 3d 3d 27 25  ( zFormat[i]=='%
e9e0: 27 20 29 20 6e 50 65 72 63 65 6e 74 2b 2b 3b 0a  ' ) nPercent++;.
e9f0: 20 20 7d 0a 20 20 69 66 28 20 6e 50 65 72 63 65    }.  if( nPerce
ea00: 6e 74 3e 31 20 29 7b 0a 20 20 20 20 73 71 6c 69  nt>1 ){.    sqli
ea10: 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
ea20: 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 7a 4c 69 6e  eof(zLine), zLin
ea30: 65 2c 20 7a 46 6f 72 6d 61 74 2c 20 69 43 75 72  e, zFormat, iCur
ea40: 2c 20 69 48 69 77 74 72 29 3b 0a 20 20 7d 65 6c  , iHiwtr);.  }el
ea50: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  se{.    sqlite3_
ea60: 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
ea70: 7a 4c 69 6e 65 29 2c 20 7a 4c 69 6e 65 2c 20 7a  zLine), zLine, z
ea80: 46 6f 72 6d 61 74 2c 20 69 48 69 77 74 72 29 3b  Format, iHiwtr);
ea90: 0a 20 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74  .  }.  raw_print
eaa0: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 33 36 73  f(p->out, "%-36s
eab0: 20 25 73 5c 6e 22 2c 20 7a 4c 61 62 65 6c 2c 20   %s\n", zLabel, 
eac0: 7a 4c 69 6e 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  zLine);.}../*.**
ead0: 20 44 69 73 70 6c 61 79 20 6d 65 6d 6f 72 79 20   Display memory 
eae0: 73 74 61 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  stats..*/.static
eaf0: 20 69 6e 74 20 64 69 73 70 6c 61 79 5f 73 74 61   int display_sta
eb00: 74 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  ts(.  sqlite3 *d
eb10: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  b,              
eb20: 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 74 6f    /* Database to
eb30: 20 71 75 65 72 79 20 2a 2f 0a 20 20 53 68 65 6c   query */.  Shel
eb40: 6c 53 74 61 74 65 20 2a 70 41 72 67 2c 20 20 20  lState *pArg,   
eb50: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
eb60: 65 72 20 74 6f 20 53 68 65 6c 6c 53 74 61 74 65  er to ShellState
eb70: 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 73 65 74   */.  int bReset
eb80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eb90: 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73    /* True to res
eba0: 65 74 20 74 68 65 20 73 74 61 74 73 20 2a 2f 0a  et the stats */.
ebb0: 29 7b 0a 20 20 69 6e 74 20 69 43 75 72 3b 0a 20  ){.  int iCur;. 
ebc0: 20 69 6e 74 20 69 48 69 77 74 72 3b 0a 0a 20 20   int iHiwtr;..  
ebd0: 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67  if( pArg && pArg
ebe0: 2d 3e 6f 75 74 20 29 7b 0a 20 20 20 20 64 69 73  ->out ){.    dis
ebf0: 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72  playStatLine(pAr
ec00: 67 2c 20 22 4d 65 6d 6f 72 79 20 55 73 65 64 3a  g, "Memory Used:
ec10: 22 2c 0a 20 20 20 20 20 20 20 22 25 6c 6c 64 20  ",.       "%lld 
ec20: 28 6d 61 78 20 25 6c 6c 64 29 20 62 79 74 65 73  (max %lld) bytes
ec30: 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53  ", SQLITE_STATUS
ec40: 5f 4d 45 4d 4f 52 59 5f 55 53 45 44 2c 20 62 52  _MEMORY_USED, bR
ec50: 65 73 65 74 29 3b 0a 20 20 20 20 64 69 73 70 6c  eset);.    displ
ec60: 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c  ayStatLine(pArg,
ec70: 20 22 4e 75 6d 62 65 72 20 6f 66 20 4f 75 74 73   "Number of Outs
ec80: 74 61 6e 64 69 6e 67 20 41 6c 6c 6f 63 61 74 69  tanding Allocati
ec90: 6f 6e 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 25  ons:",.       "%
eca0: 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 22 2c  lld (max %lld)",
ecb0: 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d   SQLITE_STATUS_M
ecc0: 41 4c 4c 4f 43 5f 43 4f 55 4e 54 2c 20 62 52 65  ALLOC_COUNT, bRe
ecd0: 73 65 74 29 3b 0a 20 20 20 20 69 66 28 20 70 41  set);.    if( pA
ece0: 72 67 2d 3e 73 68 65 6c 6c 46 6c 67 73 20 26 20  rg->shellFlgs & 
ecf0: 53 48 46 4c 47 5f 50 61 67 65 63 61 63 68 65 20  SHFLG_Pagecache 
ed00: 29 7b 0a 20 20 20 20 20 20 64 69 73 70 6c 61 79  ){.      display
ed10: 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22  StatLine(pArg, "
ed20: 4e 75 6d 62 65 72 20 6f 66 20 50 63 61 63 68 65  Number of Pcache
ed30: 20 50 61 67 65 73 20 55 73 65 64 3a 22 2c 0a 20   Pages Used:",. 
ed40: 20 20 20 20 20 20 20 20 22 25 6c 6c 64 20 28 6d          "%lld (m
ed50: 61 78 20 25 6c 6c 64 29 20 70 61 67 65 73 22 2c  ax %lld) pages",
ed60: 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50   SQLITE_STATUS_P
ed70: 41 47 45 43 41 43 48 45 5f 55 53 45 44 2c 20 62  AGECACHE_USED, b
ed80: 52 65 73 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20  Reset);.    }.  
ed90: 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e    displayStatLin
eda0: 65 28 70 41 72 67 2c 20 22 4e 75 6d 62 65 72 20  e(pArg, "Number 
edb0: 6f 66 20 50 63 61 63 68 65 20 4f 76 65 72 66 6c  of Pcache Overfl
edc0: 6f 77 20 42 79 74 65 73 3a 22 2c 0a 20 20 20 20  ow Bytes:",.    
edd0: 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c     "%lld (max %l
ede0: 6c 64 29 20 62 79 74 65 73 22 2c 20 53 51 4c 49  ld) bytes", SQLI
edf0: 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45 43 41  TE_STATUS_PAGECA
ee00: 43 48 45 5f 4f 56 45 52 46 4c 4f 57 2c 20 62 52  CHE_OVERFLOW, bR
ee10: 65 73 65 74 29 3b 0a 20 20 20 20 64 69 73 70 6c  eset);.    displ
ee20: 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c  ayStatLine(pArg,
ee30: 20 22 4c 61 72 67 65 73 74 20 41 6c 6c 6f 63 61   "Largest Alloca
ee40: 74 69 6f 6e 3a 22 2c 0a 20 20 20 20 20 20 20 22  tion:",.       "
ee50: 25 6c 6c 64 20 62 79 74 65 73 22 2c 20 53 51 4c  %lld bytes", SQL
ee60: 49 54 45 5f 53 54 41 54 55 53 5f 4d 41 4c 4c 4f  ITE_STATUS_MALLO
ee70: 43 5f 53 49 5a 45 2c 20 62 52 65 73 65 74 29 3b  C_SIZE, bReset);
ee80: 0a 20 20 20 20 64 69 73 70 6c 61 79 53 74 61 74  .    displayStat
ee90: 4c 69 6e 65 28 70 41 72 67 2c 20 22 4c 61 72 67  Line(pArg, "Larg
eea0: 65 73 74 20 50 63 61 63 68 65 20 41 6c 6c 6f 63  est Pcache Alloc
eeb0: 61 74 69 6f 6e 3a 22 2c 0a 20 20 20 20 20 20 20  ation:",.       
eec0: 22 25 6c 6c 64 20 62 79 74 65 73 22 2c 20 53 51  "%lld bytes", SQ
eed0: 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47 45  LITE_STATUS_PAGE
eee0: 43 41 43 48 45 5f 53 49 5a 45 2c 20 62 52 65 73  CACHE_SIZE, bRes
eef0: 65 74 29 3b 0a 23 69 66 64 65 66 20 59 59 54 52  et);.#ifdef YYTR
ef00: 41 43 4b 4d 41 58 53 54 41 43 4b 44 45 50 54 48  ACKMAXSTACKDEPTH
ef10: 0a 20 20 20 20 64 69 73 70 6c 61 79 53 74 61 74  .    displayStat
ef20: 4c 69 6e 65 28 70 41 72 67 2c 20 22 44 65 65 70  Line(pArg, "Deep
ef30: 65 73 74 20 50 61 72 73 65 72 20 53 74 61 63 6b  est Parser Stack
ef40: 3a 22 2c 0a 20 20 20 20 20 20 20 22 25 6c 6c 64  :",.       "%lld
ef50: 20 28 6d 61 78 20 25 6c 6c 64 29 22 2c 20 53 51   (max %lld)", SQ
ef60: 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41 52 53  LITE_STATUS_PARS
ef70: 45 52 5f 53 54 41 43 4b 2c 20 62 52 65 73 65 74  ER_STACK, bReset
ef80: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 0a 20  );.#endif.  }.. 
ef90: 20 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72   if( pArg && pAr
efa0: 67 2d 3e 6f 75 74 20 26 26 20 64 62 20 29 7b 0a  g->out && db ){.
efb0: 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e 73 68      if( pArg->sh
efc0: 65 6c 6c 46 6c 67 73 20 26 20 53 48 46 4c 47 5f  ellFlgs & SHFLG_
efd0: 4c 6f 6f 6b 61 73 69 64 65 20 29 7b 0a 20 20 20  Lookaside ){.   
efe0: 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72     iHiwtr = iCur
eff0: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 73 71 6c   = -1;.      sql
f000: 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64  ite3_db_status(d
f010: 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  b, SQLITE_DBSTAT
f020: 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 55 53 45  US_LOOKASIDE_USE
f030: 44 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  D,.             
f040: 20 20 20 20 20 20 20 20 20 20 20 26 69 43 75 72             &iCur
f050: 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65  , &iHiwtr, bRese
f060: 74 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  t);.      raw_pr
f070: 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 0a  intf(pArg->out,.
f080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4c                "L
f090: 6f 6f 6b 61 73 69 64 65 20 53 6c 6f 74 73 20 55  ookaside Slots U
f0a0: 73 65 64 3a 20 20 20 20 20 20 20 20 20 20 20 20  sed:            
f0b0: 20 20 20 20 25 64 20 28 6d 61 78 20 25 64 29 5c      %d (max %d)\
f0c0: 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
f0d0: 20 20 69 43 75 72 2c 20 69 48 69 77 74 72 29 3b    iCur, iHiwtr);
f0e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64  .      sqlite3_d
f0f0: 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c  b_status(db, SQL
f100: 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f  ITE_DBSTATUS_LOO
f110: 4b 41 53 49 44 45 5f 48 49 54 2c 0a 20 20 20 20  KASIDE_HIT,.    
f120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f130: 20 20 20 20 26 69 43 75 72 2c 20 26 69 48 69 77      &iCur, &iHiw
f140: 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  tr, bReset);.   
f150: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
f160: 72 67 2d 3e 6f 75 74 2c 20 22 53 75 63 63 65 73  rg->out, "Succes
f170: 73 66 75 6c 20 6c 6f 6f 6b 61 73 69 64 65 20 61  sful lookaside a
f180: 74 74 65 6d 70 74 73 3a 20 20 20 20 20 20 20 25  ttempts:       %
f190: 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
f1a0: 20 20 20 20 69 48 69 77 74 72 29 3b 0a 20 20 20      iHiwtr);.   
f1b0: 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74     sqlite3_db_st
f1c0: 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f  atus(db, SQLITE_
f1d0: 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49  DBSTATUS_LOOKASI
f1e0: 44 45 5f 4d 49 53 53 5f 53 49 5a 45 2c 0a 20 20  DE_MISS_SIZE,.  
f1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f200: 20 20 20 20 20 20 26 69 43 75 72 2c 20 26 69 48        &iCur, &iH
f210: 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20  iwtr, bReset);. 
f220: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
f230: 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 6b  pArg->out, "Look
f240: 61 73 69 64 65 20 66 61 69 6c 75 72 65 73 20 64  aside failures d
f250: 75 65 20 74 6f 20 73 69 7a 65 3a 20 20 20 20 20  ue to size:     
f260: 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20   %d\n",.        
f270: 20 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a 20        iHiwtr);. 
f280: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f       sqlite3_db_
f290: 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54  status(db, SQLIT
f2a0: 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41  E_DBSTATUS_LOOKA
f2b0: 53 49 44 45 5f 4d 49 53 53 5f 46 55 4c 4c 2c 0a  SIDE_MISS_FULL,.
f2c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f2d0: 20 20 20 20 20 20 20 20 26 69 43 75 72 2c 20 26          &iCur, &
f2e0: 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b  iHiwtr, bReset);
f2f0: 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
f300: 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c 6f  f(pArg->out, "Lo
f310: 6f 6b 61 73 69 64 65 20 66 61 69 6c 75 72 65 73  okaside failures
f320: 20 64 75 65 20 74 6f 20 4f 4f 4d 3a 20 20 20 20   due to OOM:    
f330: 20 20 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20     %d\n",.      
f340: 20 20 20 20 20 20 20 20 69 48 69 77 74 72 29 3b          iHiwtr);
f350: 0a 20 20 20 20 7d 0a 20 20 20 20 69 48 69 77 74  .    }.    iHiwt
f360: 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20  r = iCur = -1;. 
f370: 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74     sqlite3_db_st
f380: 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f  atus(db, SQLITE_
f390: 44 42 53 54 41 54 55 53 5f 43 41 43 48 45 5f 55  DBSTATUS_CACHE_U
f3a0: 53 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69  SED, &iCur, &iHi
f3b0: 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  wtr, bReset);.  
f3c0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
f3d0: 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 72 20 48  g->out, "Pager H
f3e0: 65 61 70 20 55 73 61 67 65 3a 20 20 20 20 20 20  eap Usage:      
f3f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
f400: 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20   bytes\n",.     
f410: 20 20 20 20 20 20 20 69 43 75 72 29 3b 0a 20 20         iCur);.  
f420: 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
f430: 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -1;.    sqlite
f440: 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
f450: 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
f460: 43 41 43 48 45 5f 48 49 54 2c 20 26 69 43 75 72  CACHE_HIT, &iCur
f470: 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20  , &iHiwtr, 1);. 
f480: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
f490: 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63  rg->out, "Page c
f4a0: 61 63 68 65 20 68 69 74 73 3a 20 20 20 20 20 20  ache hits:      
f4b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
f4c0: 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20  d\n", iCur);.   
f4d0: 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
f4e0: 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
f4f0: 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53  _db_status(db, S
f500: 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43  QLITE_DBSTATUS_C
f510: 41 43 48 45 5f 4d 49 53 53 2c 20 26 69 43 75 72  ACHE_MISS, &iCur
f520: 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a 20  , &iHiwtr, 1);. 
f530: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
f540: 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20 63  rg->out, "Page c
f550: 61 63 68 65 20 6d 69 73 73 65 73 3a 20 20 20 20  ache misses:    
f560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25                 %
f570: 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20  d\n", iCur);.   
f580: 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
f590: 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
f5a0: 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53  _db_status(db, S
f5b0: 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 43  QLITE_DBSTATUS_C
f5c0: 41 43 48 45 5f 57 52 49 54 45 2c 20 26 69 43 75  ACHE_WRITE, &iCu
f5d0: 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29 3b 0a  r, &iHiwtr, 1);.
f5e0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
f5f0: 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65 20  Arg->out, "Page 
f600: 63 61 63 68 65 20 77 72 69 74 65 73 3a 20 20 20  cache writes:   
f610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f620: 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
f630: 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
f640: 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -1;.    sqlite
f650: 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
f660: 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
f670: 53 43 48 45 4d 41 5f 55 53 45 44 2c 20 26 69 43  SCHEMA_USED, &iC
f680: 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65  ur, &iHiwtr, bRe
f690: 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72  set);.    raw_pr
f6a0: 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
f6b0: 22 53 63 68 65 6d 61 20 48 65 61 70 20 55 73 61  "Schema Heap Usa
f6c0: 67 65 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ge:             
f6d0: 20 20 20 20 20 20 25 64 20 62 79 74 65 73 5c 6e        %d bytes\n
f6e0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ",.            i
f6f0: 43 75 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72  Cur);.    iHiwtr
f700: 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20   = iCur = -1;.  
f710: 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61    sqlite3_db_sta
f720: 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  tus(db, SQLITE_D
f730: 42 53 54 41 54 55 53 5f 53 54 4d 54 5f 55 53 45  BSTATUS_STMT_USE
f740: 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74  D, &iCur, &iHiwt
f750: 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20  r, bReset);.    
f760: 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  raw_printf(pArg-
f770: 3e 6f 75 74 2c 20 22 53 74 61 74 65 6d 65 6e 74  >out, "Statement
f780: 20 48 65 61 70 2f 4c 6f 6f 6b 61 73 69 64 65 20   Heap/Lookaside 
f790: 55 73 61 67 65 3a 20 20 20 20 20 20 25 64 20 62  Usage:      %d b
f7a0: 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  ytes\n",.       
f7b0: 20 20 20 20 20 69 43 75 72 29 3b 0a 20 20 7d 0a       iCur);.  }.
f7c0: 0a 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70  .  if( pArg && p
f7d0: 41 72 67 2d 3e 6f 75 74 20 26 26 20 64 62 20 26  Arg->out && db &
f7e0: 26 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 29 7b  & pArg->pStmt ){
f7f0: 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69  .    iCur = sqli
f800: 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28  te3_stmt_status(
f810: 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c  pArg->pStmt, SQL
f820: 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 46  ITE_STMTSTATUS_F
f830: 55 4c 4c 53 43 41 4e 5f 53 54 45 50 2c 0a 20 20  ULLSCAN_STEP,.  
f840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f850: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 52 65               bRe
f860: 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72  set);.    raw_pr
f870: 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
f880: 22 46 75 6c 6c 73 63 61 6e 20 53 74 65 70 73 3a  "Fullscan Steps:
f890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f8a0: 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75        %d\n", iCu
f8b0: 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73  r);.    iCur = s
f8c0: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74  qlite3_stmt_stat
f8d0: 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20  us(pArg->pStmt, 
f8e0: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
f8f0: 53 5f 53 4f 52 54 2c 20 62 52 65 73 65 74 29 3b  S_SORT, bReset);
f900: 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
f910: 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53 6f 72 74  pArg->out, "Sort
f920: 20 4f 70 65 72 61 74 69 6f 6e 73 3a 20 20 20 20   Operations:    
f930: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f940: 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20   %d\n", iCur);. 
f950: 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65     iCur = sqlite
f960: 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41  3_stmt_status(pA
f970: 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54  rg->pStmt, SQLIT
f980: 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 41 55 54  E_STMTSTATUS_AUT
f990: 4f 49 4e 44 45 58 2c 62 52 65 73 65 74 29 3b 0a  OINDEX,bReset);.
f9a0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
f9b0: 41 72 67 2d 3e 6f 75 74 2c 20 22 41 75 74 6f 69  Arg->out, "Autoi
f9c0: 6e 64 65 78 20 49 6e 73 65 72 74 73 3a 20 20 20  ndex Inserts:   
f9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f9e0: 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20  %d\n", iCur);.  
f9f0: 20 20 69 43 75 72 20 3d 20 73 71 6c 69 74 65 33    iCur = sqlite3
fa00: 5f 73 74 6d 74 5f 73 74 61 74 75 73 28 70 41 72  _stmt_status(pAr
fa10: 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c 49 54 45  g->pStmt, SQLITE
fa20: 5f 53 54 4d 54 53 54 41 54 55 53 5f 56 4d 5f 53  _STMTSTATUS_VM_S
fa30: 54 45 50 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  TEP, bReset);.  
fa40: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
fa50: 67 2d 3e 6f 75 74 2c 20 22 56 69 72 74 75 61 6c  g->out, "Virtual
fa60: 20 4d 61 63 68 69 6e 65 20 53 74 65 70 73 3a 20   Machine Steps: 
fa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64                %d
fa80: 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 7d 0a  \n", iCur);.  }.
fa90: 0a 23 69 66 64 65 66 20 5f 5f 6c 69 6e 75 78 5f  .#ifdef __linux_
faa0: 5f 0a 20 20 64 69 73 70 6c 61 79 4c 69 6e 75 78  _.  displayLinux
fab0: 49 6f 53 74 61 74 73 28 70 41 72 67 2d 3e 6f 75  IoStats(pArg->ou
fac0: 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 2f 2a  t);.#endif..  /*
fad0: 20 44 6f 20 6e 6f 74 20 72 65 6d 6f 76 65 20 74   Do not remove t
fae0: 68 69 73 20 6d 61 63 68 69 6e 65 20 72 65 61 64  his machine read
faf0: 61 62 6c 65 20 63 6f 6d 6d 65 6e 74 3a 20 65 78  able comment: ex
fb00: 74 72 61 2d 73 74 61 74 73 2d 6f 75 74 70 75 74  tra-stats-output
fb10: 2d 68 65 72 65 20 2a 2f 0a 0a 20 20 72 65 74 75  -here */..  retu
fb20: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  rn 0;.}../*.** D
fb30: 69 73 70 6c 61 79 20 73 63 61 6e 20 73 74 61 74  isplay scan stat
fb40: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
fb50: 64 20 64 69 73 70 6c 61 79 5f 73 63 61 6e 73 74  d display_scanst
fb60: 61 74 73 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ats(.  sqlite3 *
fb70: 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  db,             
fb80: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
fb90: 73 65 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20  se to query */. 
fba0: 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72   ShellState *pAr
fbb0: 67 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g               
fbc0: 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53   /* Pointer to S
fbd0: 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 29 7b 0a  hellState */.){.
fbe0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45  #ifndef SQLITE_E
fbf0: 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53  NABLE_STMT_SCANS
fc00: 54 41 54 55 53 0a 20 20 55 4e 55 53 45 44 5f 50  TATUS.  UNUSED_P
fc10: 41 52 41 4d 45 54 45 52 28 64 62 29 3b 0a 20 20  ARAMETER(db);.  
fc20: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
fc30: 28 70 41 72 67 29 3b 0a 23 65 6c 73 65 0a 20 20  (pArg);.#else.  
fc40: 69 6e 74 20 69 2c 20 6b 2c 20 6e 2c 20 6d 78 3b  int i, k, n, mx;
fc50: 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41  .  raw_printf(pA
fc60: 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d  rg->out, "------
fc70: 2d 2d 20 73 63 61 6e 73 74 61 74 73 20 2d 2d 2d  -- scanstats ---
fc80: 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20 6d 78 20  -----\n");.  mx 
fc90: 3d 20 30 3b 0a 20 20 66 6f 72 28 6b 3d 30 3b 20  = 0;.  for(k=0; 
fca0: 6b 3c 3d 6d 78 3b 20 6b 2b 2b 29 7b 0a 20 20 20  k<=mx; k++){.   
fcb0: 20 64 6f 75 62 6c 65 20 72 45 73 74 4c 6f 6f 70   double rEstLoop
fcc0: 20 3d 20 31 2e 30 3b 0a 20 20 20 20 66 6f 72 28   = 1.0;.    for(
fcd0: 69 3d 6e 3d 30 3b 20 31 3b 20 69 2b 2b 29 7b 0a  i=n=0; 1; i++){.
fce0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
fcf0: 6d 74 20 2a 70 20 3d 20 70 41 72 67 2d 3e 70 53  mt *p = pArg->pS
fd00: 74 6d 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  tmt;.      sqlit
fd10: 65 33 5f 69 6e 74 36 34 20 6e 4c 6f 6f 70 2c 20  e3_int64 nLoop, 
fd20: 6e 56 69 73 69 74 3b 0a 20 20 20 20 20 20 64 6f  nVisit;.      do
fd30: 75 62 6c 65 20 72 45 73 74 3b 0a 20 20 20 20 20  uble rEst;.     
fd40: 20 69 6e 74 20 69 53 69 64 3b 0a 20 20 20 20 20   int iSid;.     
fd50: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 78   const char *zEx
fd60: 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 69 66 28  plain;.      if(
fd70: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63   sqlite3_stmt_sc
fd80: 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53  anstatus(p, i, S
fd90: 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 4e  QLITE_SCANSTAT_N
fda0: 4c 4f 4f 50 2c 20 28 76 6f 69 64 2a 29 26 6e 4c  LOOP, (void*)&nL
fdb0: 6f 6f 70 29 20 29 7b 0a 20 20 20 20 20 20 20 20  oop) ){.        
fdc0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
fdd0: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
fde0: 74 5f 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20  t_scanstatus(p, 
fdf0: 69 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54  i, SQLITE_SCANST
fe00: 41 54 5f 53 45 4c 45 43 54 49 44 2c 20 28 76 6f  AT_SELECTID, (vo
fe10: 69 64 2a 29 26 69 53 69 64 29 3b 0a 20 20 20 20  id*)&iSid);.    
fe20: 20 20 69 66 28 20 69 53 69 64 3e 6d 78 20 29 20    if( iSid>mx ) 
fe30: 6d 78 20 3d 20 69 53 69 64 3b 0a 20 20 20 20 20  mx = iSid;.     
fe40: 20 69 66 28 20 69 53 69 64 21 3d 6b 20 29 20 63   if( iSid!=k ) c
fe50: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 69  ontinue;.      i
fe60: 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  f( n==0 ){.     
fe70: 20 20 20 72 45 73 74 4c 6f 6f 70 20 3d 20 28 64     rEstLoop = (d
fe80: 6f 75 62 6c 65 29 6e 4c 6f 6f 70 3b 0a 20 20 20  ouble)nLoop;.   
fe90: 20 20 20 20 20 69 66 28 20 6b 3e 30 20 29 20 72       if( k>0 ) r
fea0: 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e  aw_printf(pArg->
feb0: 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73  out, "-------- s
fec0: 75 62 71 75 65 72 79 20 25 64 20 2d 2d 2d 2d 2d  ubquery %d -----
fed0: 2d 2d 5c 6e 22 2c 20 6b 29 3b 0a 20 20 20 20 20  --\n", k);.     
fee0: 20 7d 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20   }.      n++;.  
fef0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
ff00: 5f 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69  _scanstatus(p, i
ff10: 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41  , SQLITE_SCANSTA
ff20: 54 5f 4e 56 49 53 49 54 2c 20 28 76 6f 69 64 2a  T_NVISIT, (void*
ff30: 29 26 6e 56 69 73 69 74 29 3b 0a 20 20 20 20 20  )&nVisit);.     
ff40: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63   sqlite3_stmt_sc
ff50: 61 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53  anstatus(p, i, S
ff60: 51 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 45  QLITE_SCANSTAT_E
ff70: 53 54 2c 20 28 76 6f 69 64 2a 29 26 72 45 73 74  ST, (void*)&rEst
ff80: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ff90: 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73  _stmt_scanstatus
ffa0: 28 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53 43  (p, i, SQLITE_SC
ffb0: 41 4e 53 54 41 54 5f 45 58 50 4c 41 49 4e 2c 20  ANSTAT_EXPLAIN, 
ffc0: 28 76 6f 69 64 2a 29 26 7a 45 78 70 6c 61 69 6e  (void*)&zExplain
ffd0: 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  );.      utf8_pr
ffe0: 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
fff0: 22 4c 6f 6f 70 20 25 32 64 3a 20 25 73 5c 6e 22  "Loop %2d: %s\n"
10000 2c 20 6e 2c 20 7a 45 78 70 6c 61 69 6e 29 3b 0a  , n, zExplain);.
10010 20 20 20 20 20 20 72 45 73 74 4c 6f 6f 70 20 2a        rEstLoop *
10020 3d 20 72 45 73 74 3b 0a 20 20 20 20 20 20 72 61  = rEst;.      ra
10030 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
10040 75 74 2c 0a 20 20 20 20 20 20 20 20 20 20 22 20  ut,.          " 
10050 20 20 20 20 20 20 20 20 6e 4c 6f 6f 70 3d 25 2d          nLoop=%-
10060 38 6c 6c 64 20 6e 52 6f 77 3d 25 2d 38 6c 6c 64  8lld nRow=%-8lld
10070 20 65 73 74 52 6f 77 3d 25 2d 38 6c 6c 64 20 65   estRow=%-8lld e
10080 73 74 52 6f 77 2f 4c 6f 6f 70 3d 25 2d 38 67 5c  stRow/Loop=%-8g\
10090 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 6e 4c  n",.          nL
100a0 6f 6f 70 2c 20 6e 56 69 73 69 74 2c 20 28 73 71  oop, nVisit, (sq
100b0 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 72 45 73  lite3_int64)(rEs
100c0 74 4c 6f 6f 70 2b 30 2e 35 29 2c 20 72 45 73 74  tLoop+0.5), rEst
100d0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d 0a  .      );.    }.
100e0 20 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74 66    }.  raw_printf
100f0 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d  (pArg->out, "---
10100 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
10110 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 23 65  --------\n");.#e
10120 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  ndif.}../*.** Pa
10130 72 61 6d 65 74 65 72 20 61 7a 41 72 72 61 79 20  rameter azArray 
10140 70 6f 69 6e 74 73 20 74 6f 20 61 20 7a 65 72 6f  points to a zero
10150 2d 74 65 72 6d 69 6e 61 74 65 64 20 61 72 72 61  -terminated arra
10160 79 20 6f 66 20 73 74 72 69 6e 67 73 2e 20 7a 53  y of strings. zS
10170 74 72 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 20  tr.** points to 
10180 61 20 73 69 6e 67 6c 65 20 6e 75 6c 2d 74 65 72  a single nul-ter
10190 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 2e 20  minated string. 
101a0 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20  Return non-zero 
101b0 69 66 20 7a 53 74 72 0a 2a 2a 20 69 73 20 65 71  if zStr.** is eq
101c0 75 61 6c 2c 20 61 63 63 6f 72 64 69 6e 67 20 74  ual, according t
101d0 6f 20 73 74 72 63 6d 70 28 29 2c 20 74 6f 20 61  o strcmp(), to a
101e0 6e 79 20 6f 66 20 74 68 65 20 73 74 72 69 6e 67  ny of the string
101f0 73 20 69 6e 20 74 68 65 20 61 72 72 61 79 2e 0a  s in the array..
10200 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c 20 72 65  ** Otherwise, re
10210 74 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2f 0a 73 74  turn zero..*/.st
10220 61 74 69 63 20 69 6e 74 20 73 74 72 5f 69 6e 5f  atic int str_in_
10230 61 72 72 61 79 28 63 6f 6e 73 74 20 63 68 61 72  array(const char
10240 20 2a 7a 53 74 72 2c 20 63 6f 6e 73 74 20 63 68   *zStr, const ch
10250 61 72 20 2a 2a 61 7a 41 72 72 61 79 29 7b 0a 20  ar **azArray){. 
10260 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
10270 30 3b 20 61 7a 41 72 72 61 79 5b 69 5d 3b 20 69  0; azArray[i]; i
10280 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 30 3d 3d  ++){.    if( 0==
10290 73 74 72 63 6d 70 28 7a 53 74 72 2c 20 61 7a 41  strcmp(zStr, azA
102a0 72 72 61 79 5b 69 5d 29 20 29 20 72 65 74 75 72  rray[i]) ) retur
102b0 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
102c0 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  n 0;.}../*.** If
102d0 20 63 6f 6d 70 69 6c 65 64 20 73 74 61 74 65 6d   compiled statem
102e0 65 6e 74 20 70 53 71 6c 20 61 70 70 65 61 72 73  ent pSql appears
102f0 20 74 6f 20 62 65 20 61 6e 20 45 58 50 4c 41 49   to be an EXPLAI
10300 4e 20 73 74 61 74 65 6d 65 6e 74 2c 20 61 6c 6c  N statement, all
10310 6f 63 61 74 65 0a 2a 2a 20 61 6e 64 20 70 6f 70  ocate.** and pop
10320 75 6c 61 74 65 20 74 68 65 20 53 68 65 6c 6c 53  ulate the ShellS
10330 74 61 74 65 2e 61 69 49 6e 64 65 6e 74 5b 5d 20  tate.aiIndent[] 
10340 61 72 72 61 79 20 77 69 74 68 20 74 68 65 20 6e  array with the n
10350 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 73 70 61 63  umber of.** spac
10360 65 73 20 65 61 63 68 20 6f 70 63 6f 64 65 20 73  es each opcode s
10370 68 6f 75 6c 64 20 62 65 20 69 6e 64 65 6e 74 65  hould be indente
10380 64 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 6f  d before it is o
10390 75 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  utput..**.** The
103a0 20 69 6e 64 65 6e 74 69 6e 67 20 72 75 6c 65 73   indenting rules
103b0 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20   are:.**.**     
103c0 2a 20 46 6f 72 20 65 61 63 68 20 22 4e 65 78 74  * For each "Next
103d0 22 2c 20 22 50 72 65 76 22 2c 20 22 56 4e 65 78  ", "Prev", "VNex
103e0 74 22 20 6f 72 20 22 56 50 72 65 76 22 20 69 6e  t" or "VPrev" in
103f0 73 74 72 75 63 74 69 6f 6e 2c 20 69 6e 64 65 6e  struction, inden
10400 74 0a 2a 2a 20 20 20 20 20 20 20 61 6c 6c 20 6f  t.**       all o
10410 70 63 6f 64 65 73 20 74 68 61 74 20 6f 63 63 75  pcodes that occu
10420 72 20 62 65 74 77 65 65 6e 20 74 68 65 20 70 32  r between the p2
10430 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69 6f   jump destinatio
10440 6e 20 61 6e 64 20 74 68 65 20 6f 70 63 6f 64 65  n and the opcode
10450 0a 2a 2a 20 20 20 20 20 20 20 69 74 73 65 6c 66  .**       itself
10460 20 62 79 20 32 20 73 70 61 63 65 73 2e 0a 2a 2a   by 2 spaces..**
10470 0a 2a 2a 20 20 20 20 20 2a 20 46 6f 72 20 65 61  .**     * For ea
10480 63 68 20 22 47 6f 74 6f 22 2c 20 69 66 20 74 68  ch "Goto", if th
10490 65 20 6a 75 6d 70 20 64 65 73 74 69 6e 61 74 69  e jump destinati
104a0 6f 6e 20 69 73 20 65 61 72 6c 69 65 72 20 69 6e  on is earlier in
104b0 20 74 68 65 20 70 72 6f 67 72 61 6d 0a 2a 2a 20   the program.** 
104c0 20 20 20 20 20 20 61 6e 64 20 65 6e 64 73 20 6f        and ends o
104d0 6e 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 20 20 20 20  n one of:.**    
104e0 20 20 20 20 20 20 59 69 65 6c 64 20 20 53 65 65        Yield  See
104f0 6b 47 74 20 20 53 65 65 6b 4c 74 20 20 52 6f 77  kGt  SeekLt  Row
10500 53 65 74 52 65 61 64 20 20 52 65 77 69 6e 64 0a  SetRead  Rewind.
10510 2a 2a 20 20 20 20 20 20 20 6f 72 20 69 66 20 74  **       or if t
10520 68 65 20 50 31 20 70 61 72 61 6d 65 74 65 72 20  he P1 parameter 
10530 69 73 20 6f 6e 65 20 69 6e 73 74 65 61 64 20 6f  is one instead o
10540 66 20 7a 65 72 6f 2c 0a 2a 2a 20 20 20 20 20 20  f zero,.**      
10550 20 74 68 65 6e 20 69 6e 64 65 6e 74 20 61 6c 6c   then indent all
10560 20 6f 70 63 6f 64 65 73 20 62 65 74 77 65 65 6e   opcodes between
10570 20 74 68 65 20 65 61 72 6c 69 65 72 20 69 6e 73   the earlier ins
10580 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 20 20 20 20  truction.**     
10590 20 20 61 6e 64 20 22 47 6f 74 6f 22 20 62 79 20    and "Goto" by 
105a0 32 20 73 70 61 63 65 73 2e 0a 2a 2f 0a 73 74 61  2 spaces..*/.sta
105b0 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
105c0 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28 53 68  _data_prepare(Sh
105d0 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 73 71 6c  ellState *p, sql
105e0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 29  ite3_stmt *pSql)
105f0 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  {.  const char *
10600 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20  zSql;           
10610 20 20 20 20 2f 2a 20 54 68 65 20 74 65 78 74 20      /* The text 
10620 6f 66 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  of the SQL state
10630 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ment */.  const 
10640 63 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20  char *z;        
10650 20 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65            /* Use
10660 64 20 74 6f 20 63 68 65 63 6b 20 69 66 20 74 68  d to check if th
10670 69 73 20 69 73 20 61 6e 20 45 58 50 4c 41 49 4e  is is an EXPLAIN
10680 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 62 59 69 65   */.  int *abYie
10690 6c 64 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ld = 0;         
106a0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
106b0 20 6f 70 20 69 73 20 61 6e 20 4f 50 5f 59 69 65   op is an OP_Yie
106c0 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c  ld */.  int nAll
106d0 6f 63 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  oc = 0;         
106e0 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63          /* Alloc
106f0 61 74 65 64 20 73 69 7a 65 20 6f 66 20 70 2d 3e  ated size of p->
10700 61 69 49 6e 64 65 6e 74 5b 5d 2c 20 61 62 59 69  aiIndent[], abYi
10710 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 69 4f 70  eld */.  int iOp
10720 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
10730 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65           /* Inde
10740 78 20 6f 66 20 6f 70 65 72 61 74 69 6f 6e 20 69  x of operation i
10750 6e 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 5d 20  n p->aiIndent[] 
10760 2a 2f 0a 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  */..  const char
10770 20 2a 61 7a 4e 65 78 74 5b 5d 20 3d 20 7b 20 22   *azNext[] = { "
10780 4e 65 78 74 22 2c 20 22 50 72 65 76 22 2c 20 22  Next", "Prev", "
10790 56 50 72 65 76 22 2c 20 22 56 4e 65 78 74 22 2c  VPrev", "VNext",
107a0 20 22 53 6f 72 74 65 72 4e 65 78 74 22 2c 0a 20   "SorterNext",. 
107b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
107c0 20 20 20 20 20 20 20 20 20 20 22 4e 65 78 74 49            "NextI
107d0 66 4f 70 65 6e 22 2c 20 22 50 72 65 76 49 66 4f  fOpen", "PrevIfO
107e0 70 65 6e 22 2c 20 30 20 7d 3b 0a 20 20 63 6f 6e  pen", 0 };.  con
107f0 73 74 20 63 68 61 72 20 2a 61 7a 59 69 65 6c 64  st char *azYield
10800 5b 5d 20 3d 20 7b 20 22 59 69 65 6c 64 22 2c 20  [] = { "Yield", 
10810 22 53 65 65 6b 4c 54 22 2c 20 22 53 65 65 6b 47  "SeekLT", "SeekG
10820 54 22 2c 20 22 52 6f 77 53 65 74 52 65 61 64 22  T", "RowSetRead"
10830 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 52                "R
10850 65 77 69 6e 64 22 2c 20 30 20 7d 3b 0a 20 20 63  ewind", 0 };.  c
10860 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 47 6f 74  onst char *azGot
10870 6f 5b 5d 20 3d 20 7b 20 22 47 6f 74 6f 22 2c 20  o[] = { "Goto", 
10880 30 20 7d 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74  0 };..  /* Try t
10890 6f 20 66 69 67 75 72 65 20 6f 75 74 20 69 66 20  o figure out if 
108a0 74 68 69 73 20 69 73 20 72 65 61 6c 6c 79 20 61  this is really a
108b0 6e 20 45 58 50 4c 41 49 4e 20 73 74 61 74 65 6d  n EXPLAIN statem
108c0 65 6e 74 2e 20 49 66 20 74 68 69 73 0a 20 20 2a  ent. If this.  *
108d0 2a 20 63 61 6e 6e 6f 74 20 62 65 20 76 65 72 69  * cannot be veri
108e0 66 69 65 64 2c 20 72 65 74 75 72 6e 20 65 61 72  fied, return ear
108f0 6c 79 2e 20 20 2a 2f 0a 20 20 69 66 28 20 73 71  ly.  */.  if( sq
10900 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
10910 6e 74 28 70 53 71 6c 29 21 3d 38 20 29 7b 0a 20  nt(pSql)!=8 ){. 
10920 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70 2d     p->cMode = p-
10930 3e 6d 6f 64 65 3b 0a 20 20 20 20 72 65 74 75 72  >mode;.    retur
10940 6e 3b 0a 20 20 7d 0a 20 20 7a 53 71 6c 20 3d 20  n;.  }.  zSql = 
10950 73 71 6c 69 74 65 33 5f 73 71 6c 28 70 53 71 6c  sqlite3_sql(pSql
10960 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  );.  if( zSql==0
10970 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72   ) return;.  for
10980 28 7a 3d 7a 53 71 6c 3b 20 2a 7a 3d 3d 27 20 27  (z=zSql; *z==' '
10990 20 7c 7c 20 2a 7a 3d 3d 27 5c 74 27 20 7c 7c 20   || *z=='\t' || 
109a0 2a 7a 3d 3d 27 5c 6e 27 20 7c 7c 20 2a 7a 3d 3d  *z=='\n' || *z==
109b0 27 5c 66 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 72 27  '\f' || *z=='\r'
109c0 3b 20 7a 2b 2b 29 3b 0a 20 20 69 66 28 20 73 71  ; z++);.  if( sq
109d0 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 7a  lite3_strnicmp(z
109e0 2c 20 22 65 78 70 6c 61 69 6e 22 2c 20 37 29 20  , "explain", 7) 
109f0 29 7b 0a 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20  ){.    p->cMode 
10a00 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 72  = p->mode;.    r
10a10 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20 20 66 6f  eturn;.  }..  fo
10a20 72 28 69 4f 70 3d 30 3b 20 53 51 4c 49 54 45 5f  r(iOp=0; SQLITE_
10a30 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65  ROW==sqlite3_ste
10a40 70 28 70 53 71 6c 29 3b 20 69 4f 70 2b 2b 29 7b  p(pSql); iOp++){
10a50 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
10a60 69 6e 74 20 69 41 64 64 72 20 3d 20 73 71 6c 69  int iAddr = sqli
10a70 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
10a80 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20 63 6f 6e  Sql, 0);.    con
10a90 73 74 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20 28  st char *zOp = (
10aa0 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
10ab0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
10ac0 70 53 71 6c 2c 20 31 29 3b 0a 0a 20 20 20 20 2f  pSql, 1);..    /
10ad0 2a 20 53 65 74 20 70 32 20 74 6f 20 74 68 65 20  * Set p2 to the 
10ae0 50 32 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  P2 field of the 
10af0 63 75 72 72 65 6e 74 20 6f 70 63 6f 64 65 2e 20  current opcode. 
10b00 54 68 65 6e 2c 20 61 73 73 75 6d 69 6e 67 20 74  Then, assuming t
10b10 68 61 74 0a 20 20 20 20 2a 2a 20 70 32 20 69 73  hat.    ** p2 is
10b20 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   an instruction 
10b30 61 64 64 72 65 73 73 2c 20 73 65 74 20 76 61 72  address, set var
10b40 69 61 62 6c 65 20 70 32 6f 70 20 74 6f 20 74 68  iable p2op to th
10b50 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61 74 0a  e index of that.
10b60 20 20 20 20 2a 2a 20 69 6e 73 74 72 75 63 74 69      ** instructi
10b70 6f 6e 20 69 6e 20 74 68 65 20 61 69 49 6e 64 65  on in the aiInde
10b80 6e 74 5b 5d 20 61 72 72 61 79 2e 20 70 32 20 61  nt[] array. p2 a
10b90 6e 64 20 70 32 6f 70 20 6d 61 79 20 62 65 20 64  nd p2op may be d
10ba0 69 66 66 65 72 65 6e 74 20 69 66 0a 20 20 20 20  ifferent if.    
10bb0 2a 2a 20 74 68 65 20 63 75 72 72 65 6e 74 20 69  ** the current i
10bc0 6e 73 74 72 75 63 74 69 6f 6e 20 69 73 20 70 61  nstruction is pa
10bd0 72 74 20 6f 66 20 61 20 73 75 62 2d 70 72 6f 67  rt of a sub-prog
10be0 72 61 6d 20 67 65 6e 65 72 61 74 65 64 20 62 79  ram generated by
10bf0 20 61 6e 0a 20 20 20 20 2a 2a 20 53 51 4c 20 74   an.    ** SQL t
10c00 72 69 67 67 65 72 20 6f 72 20 66 6f 72 65 69 67  rigger or foreig
10c10 6e 20 6b 65 79 2e 20 20 2a 2f 0a 20 20 20 20 69  n key.  */.    i
10c20 6e 74 20 70 32 20 3d 20 73 71 6c 69 74 65 33 5f  nt p2 = sqlite3_
10c30 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c  column_int(pSql,
10c40 20 33 29 3b 0a 20 20 20 20 69 6e 74 20 70 32 6f   3);.    int p2o
10c50 70 20 3d 20 28 70 32 20 2b 20 28 69 4f 70 2d 69  p = (p2 + (iOp-i
10c60 41 64 64 72 29 29 3b 0a 0a 20 20 20 20 2f 2a 20  Addr));..    /* 
10c70 47 72 6f 77 20 74 68 65 20 70 2d 3e 61 69 49 6e  Grow the p->aiIn
10c80 64 65 6e 74 20 61 72 72 61 79 20 61 73 20 72 65  dent array as re
10c90 71 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 69 66  quired */.    if
10ca0 28 20 69 4f 70 3e 3d 6e 41 6c 6c 6f 63 20 29 7b  ( iOp>=nAlloc ){
10cb0 0a 20 20 20 20 20 20 69 66 28 20 69 4f 70 3d 3d  .      if( iOp==
10cc0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  0 ){.        /* 
10cd0 44 6f 20 66 75 72 74 68 65 72 20 76 65 72 66 69  Do further verfi
10ce0 63 61 74 69 6f 6e 20 74 68 61 74 20 74 68 69 73  cation that this
10cf0 20 69 73 20 65 78 70 6c 61 69 6e 20 6f 75 74 70   is explain outp
10d00 75 74 2e 20 20 41 62 6f 72 74 20 69 66 0a 20 20  ut.  Abort if.  
10d10 20 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6e        ** it is n
10d20 6f 74 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74  ot */.        st
10d30 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
10d40 2a 65 78 70 6c 61 69 6e 43 6f 6c 73 5b 5d 20 3d  *explainCols[] =
10d50 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 22 61   {.           "a
10d60 64 64 72 22 2c 20 22 6f 70 63 6f 64 65 22 2c 20  ddr", "opcode", 
10d70 22 70 31 22 2c 20 22 70 32 22 2c 20 22 70 33 22  "p1", "p2", "p3"
10d80 2c 20 22 70 34 22 2c 20 22 70 35 22 2c 20 22 63  , "p4", "p5", "c
10d90 6f 6d 6d 65 6e 74 22 20 7d 3b 0a 20 20 20 20 20  omment" };.     
10da0 20 20 20 69 6e 74 20 6a 6a 3b 0a 20 20 20 20 20     int jj;.     
10db0 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20 6a 6a 3c     for(jj=0; jj<
10dc0 41 72 72 61 79 53 69 7a 65 28 65 78 70 6c 61 69  ArraySize(explai
10dd0 6e 43 6f 6c 73 29 3b 20 6a 6a 2b 2b 29 7b 0a 20  nCols); jj++){. 
10de0 20 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72           if( str
10df0 63 6d 70 28 73 71 6c 69 74 65 33 5f 63 6f 6c 75  cmp(sqlite3_colu
10e00 6d 6e 5f 6e 61 6d 65 28 70 53 71 6c 2c 6a 6a 29  mn_name(pSql,jj)
10e10 2c 65 78 70 6c 61 69 6e 43 6f 6c 73 5b 6a 6a 5d  ,explainCols[jj]
10e20 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
10e30 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 70      p->cMode = p
10e40 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20  ->mode;.        
10e50 20 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 65      sqlite3_rese
10e60 74 28 70 53 71 6c 29 3b 0a 20 20 20 20 20 20 20  t(pSql);.       
10e70 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20       return;.   
10e80 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10e90 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
10ea0 20 6e 41 6c 6c 6f 63 20 2b 3d 20 31 30 30 3b 0a   nAlloc += 100;.
10eb0 20 20 20 20 20 20 70 2d 3e 61 69 49 6e 64 65 6e        p->aiInden
10ec0 74 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74 65  t = (int*)sqlite
10ed0 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70 2d 3e 61  3_realloc64(p->a
10ee0 69 49 6e 64 65 6e 74 2c 20 6e 41 6c 6c 6f 63 2a  iIndent, nAlloc*
10ef0 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20  sizeof(int));.  
10f00 20 20 20 20 61 62 59 69 65 6c 64 20 3d 20 28 69      abYield = (i
10f10 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72 65 61 6c  nt*)sqlite3_real
10f20 6c 6f 63 36 34 28 61 62 59 69 65 6c 64 2c 20 6e  loc64(abYield, n
10f30 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 69 6e 74  Alloc*sizeof(int
10f40 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 62  ));.    }.    ab
10f50 59 69 65 6c 64 5b 69 4f 70 5d 20 3d 20 73 74 72  Yield[iOp] = str
10f60 5f 69 6e 5f 61 72 72 61 79 28 7a 4f 70 2c 20 61  _in_array(zOp, a
10f70 7a 59 69 65 6c 64 29 3b 0a 20 20 20 20 70 2d 3e  zYield);.    p->
10f80 61 69 49 6e 64 65 6e 74 5b 69 4f 70 5d 20 3d 20  aiIndent[iOp] = 
10f90 30 3b 0a 20 20 20 20 70 2d 3e 6e 49 6e 64 65 6e  0;.    p->nInden
10fa0 74 20 3d 20 69 4f 70 2b 31 3b 0a 0a 20 20 20 20  t = iOp+1;..    
10fb0 69 66 28 20 73 74 72 5f 69 6e 5f 61 72 72 61 79  if( str_in_array
10fc0 28 7a 4f 70 2c 20 61 7a 4e 65 78 74 29 20 29 7b  (zOp, azNext) ){
10fd0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 70 32 6f  .      for(i=p2o
10fe0 70 3b 20 69 3c 69 4f 70 3b 20 69 2b 2b 29 20 70  p; i<iOp; i++) p
10ff0 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 5d 20 2b 3d  ->aiIndent[i] +=
11000 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   2;.    }.    if
11010 28 20 73 74 72 5f 69 6e 5f 61 72 72 61 79 28 7a  ( str_in_array(z
11020 4f 70 2c 20 61 7a 47 6f 74 6f 29 20 26 26 20 70  Op, azGoto) && p
11030 32 6f 70 3c 70 2d 3e 6e 49 6e 64 65 6e 74 0a 20  2op<p->nIndent. 
11040 20 20 20 20 26 26 20 28 61 62 59 69 65 6c 64 5b      && (abYield[
11050 70 32 6f 70 5d 20 7c 7c 20 73 71 6c 69 74 65 33  p2op] || sqlite3
11060 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c  _column_int(pSql
11070 2c 20 32 29 29 0a 20 20 20 20 29 7b 0a 20 20 20  , 2)).    ){.   
11080 20 20 20 66 6f 72 28 69 3d 70 32 6f 70 3b 20 69     for(i=p2op; i
11090 3c 69 4f 70 3b 20 69 2b 2b 29 20 70 2d 3e 61 69  <iOp; i++) p->ai
110a0 49 6e 64 65 6e 74 5b 69 5d 20 2b 3d 20 32 3b 0a  Indent[i] += 2;.
110b0 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 70 2d 3e      }.  }..  p->
110c0 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20 73  iIndent = 0;.  s
110d0 71 6c 69 74 65 33 5f 66 72 65 65 28 61 62 59 69  qlite3_free(abYi
110e0 65 6c 64 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  eld);.  sqlite3_
110f0 72 65 73 65 74 28 70 53 71 6c 29 3b 0a 7d 0a 0a  reset(pSql);.}..
11100 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68 65 20 61  /*.** Free the a
11110 72 72 61 79 20 61 6c 6c 6f 63 61 74 65 64 20 62  rray allocated b
11120 79 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70  y explain_data_p
11130 72 65 70 61 72 65 28 29 2e 0a 2a 2f 0a 73 74 61  repare()..*/.sta
11140 74 69 63 20 76 6f 69 64 20 65 78 70 6c 61 69 6e  tic void explain
11150 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 53 68 65  _data_delete(She
11160 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 73  llState *p){.  s
11170 71 6c 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 61  qlite3_free(p->a
11180 69 49 6e 64 65 6e 74 29 3b 0a 20 20 70 2d 3e 61  iIndent);.  p->a
11190 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20 20 70  iIndent = 0;.  p
111a0 2d 3e 6e 49 6e 64 65 6e 74 20 3d 20 30 3b 0a 20  ->nIndent = 0;. 
111b0 20 70 2d 3e 69 49 6e 64 65 6e 74 20 3d 20 30 3b   p->iIndent = 0;
111c0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 61 62 6c  .}../*.** Disabl
111d0 65 20 61 6e 64 20 72 65 73 74 6f 72 65 20 2e 77  e and restore .w
111e0 68 65 72 65 74 72 61 63 65 20 61 6e 64 20 2e 73  heretrace and .s
111f0 65 6c 65 63 74 74 72 61 63 65 20 73 65 74 74 69  electtrace setti
11200 6e 67 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69  ngs..*/.#if defi
11210 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
11220 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
11230 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43  ITE_ENABLE_SELEC
11240 54 54 52 41 43 45 29 0a 65 78 74 65 72 6e 20 69  TTRACE).extern i
11250 6e 74 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  nt sqlite3Select
11260 54 72 61 63 65 3b 0a 73 74 61 74 69 63 20 69 6e  Trace;.static in
11270 74 20 73 61 76 65 64 53 65 6c 65 63 74 54 72 61  t savedSelectTra
11280 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64  ce;.#endif.#if d
11290 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
112a0 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28  BUG) && defined(
112b0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48  SQLITE_ENABLE_WH
112c0 45 52 45 54 52 41 43 45 29 0a 65 78 74 65 72 6e  ERETRACE).extern
112d0 20 69 6e 74 20 73 71 6c 69 74 65 33 57 68 65 72   int sqlite3Wher
112e0 65 54 72 61 63 65 3b 0a 73 74 61 74 69 63 20 69  eTrace;.static i
112f0 6e 74 20 73 61 76 65 64 57 68 65 72 65 54 72 61  nt savedWhereTra
11300 63 65 3b 0a 23 65 6e 64 69 66 0a 73 74 61 74 69  ce;.#endif.stati
11310 63 20 76 6f 69 64 20 64 69 73 61 62 6c 65 5f 64  c void disable_d
11320 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73  ebug_trace_modes
11330 28 76 6f 69 64 29 7b 0a 23 69 66 20 64 65 66 69  (void){.#if defi
11340 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47  ned(SQLITE_DEBUG
11350 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c  ) && defined(SQL
11360 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43  ITE_ENABLE_SELEC
11370 54 54 52 41 43 45 29 0a 20 20 73 61 76 65 64 53  TTRACE).  savedS
11380 65 6c 65 63 74 54 72 61 63 65 20 3d 20 73 71 6c  electTrace = sql
11390 69 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 3b  ite3SelectTrace;
113a0 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
113b0 54 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69  Trace = 0;.#endi
113c0 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
113d0 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64  LITE_DEBUG) && d
113e0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
113f0 41 42 4c 45 5f 57 48 45 52 45 54 52 41 43 45 29  ABLE_WHERETRACE)
11400 0a 20 20 73 61 76 65 64 57 68 65 72 65 54 72 61  .  savedWhereTra
11410 63 65 20 3d 20 73 71 6c 69 74 65 33 57 68 65 72  ce = sqlite3Wher
11420 65 54 72 61 63 65 3b 0a 20 20 73 71 6c 69 74 65  eTrace;.  sqlite
11430 33 57 68 65 72 65 54 72 61 63 65 20 3d 20 30 3b  3WhereTrace = 0;
11440 0a 23 65 6e 64 69 66 0a 7d 0a 73 74 61 74 69 63  .#endif.}.static
11450 20 76 6f 69 64 20 72 65 73 74 6f 72 65 5f 64 65   void restore_de
11460 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73 28  bug_trace_modes(
11470 76 6f 69 64 29 7b 0a 23 69 66 20 64 65 66 69 6e  void){.#if defin
11480 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
11490 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
114a0 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c 45 43 54  TE_ENABLE_SELECT
114b0 54 52 41 43 45 29 0a 20 20 73 71 6c 69 74 65 33  TRACE).  sqlite3
114c0 53 65 6c 65 63 74 54 72 61 63 65 20 3d 20 73 61  SelectTrace = sa
114d0 76 65 64 53 65 6c 65 63 74 54 72 61 63 65 3b 0a  vedSelectTrace;.
114e0 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e  #endif.#if defin
114f0 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29  ed(SQLITE_DEBUG)
11500 20 26 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49   && defined(SQLI
11510 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52 45 54  TE_ENABLE_WHERET
11520 52 41 43 45 29 0a 20 20 73 71 6c 69 74 65 33 57  RACE).  sqlite3W
11530 68 65 72 65 54 72 61 63 65 20 3d 20 73 61 76 65  hereTrace = save
11540 64 57 68 65 72 65 54 72 61 63 65 3b 0a 23 65 6e  dWhereTrace;.#en
11550 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e  dif.}../*.** Run
11560 20 61 20 70 72 65 70 61 72 65 64 20 73 74 61 74   a prepared stat
11570 65 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74 69 63 20  ement.*/.static 
11580 76 6f 69 64 20 65 78 65 63 5f 70 72 65 70 61 72  void exec_prepar
11590 65 64 5f 73 74 6d 74 28 0a 20 20 53 68 65 6c 6c  ed_stmt(.  Shell
115a0 53 74 61 74 65 20 2a 70 41 72 67 2c 20 20 20 20  State *pArg,    
115b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115c0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50              /* P
115d0 6f 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53  ointer to ShellS
115e0 74 61 74 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  tate */.  sqlite
115f0 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 2c 20 20  3_stmt *pStmt,  
11600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11610 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74             /* St
11620 61 74 6d 65 6e 74 20 74 6f 20 72 75 6e 20 2a 2f  atment to run */
11630 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61  .  int (*xCallba
11640 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68  ck)(void*,int,ch
11650 61 72 2a 2a 2c 63 68 61 72 2a 2a 2c 69 6e 74 2a  ar**,char**,int*
11660 29 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20  )   /* Callback 
11670 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29 7b 0a 20  function */.){. 
11680 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f 2a 20 70   int rc;..  /* p
11690 65 72 66 6f 72 6d 20 74 68 65 20 66 69 72 73 74  erform the first
116a0 20 73 74 65 70 2e 20 20 74 68 69 73 20 77 69 6c   step.  this wil
116b0 6c 20 74 65 6c 6c 20 75 73 20 69 66 20 77 65 0a  l tell us if we.
116c0 20 20 2a 2a 20 68 61 76 65 20 61 20 72 65 73 75    ** have a resu
116d0 6c 74 20 73 65 74 20 6f 72 20 6e 6f 74 20 61 6e  lt set or not an
116e0 64 20 68 6f 77 20 77 69 64 65 20 69 74 20 69 73  d how wide it is
116f0 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d 20 73 71  ..  */.  rc = sq
11700 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
11710 29 3b 0a 20 20 2f 2a 20 69 66 20 77 65 20 68 61  );.  /* if we ha
11720 76 65 20 61 20 72 65 73 75 6c 74 20 73 65 74 2e  ve a result set.
11730 2e 2e 20 2a 2f 0a 20 20 69 66 28 20 53 51 4c 49  .. */.  if( SQLI
11740 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b 0a  TE_ROW == rc ){.
11750 20 20 20 20 2f 2a 20 69 66 20 77 65 20 68 61 76      /* if we hav
11760 65 20 61 20 63 61 6c 6c 62 61 63 6b 2e 2e 2e 20  e a callback... 
11770 2a 2f 0a 20 20 20 20 69 66 28 20 78 43 61 6c 6c  */.    if( xCall
11780 62 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 2f 2a  back ){.      /*
11790 20 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20   allocate space 
117a0 66 6f 72 20 63 6f 6c 20 6e 61 6d 65 20 70 74 72  for col name ptr
117b0 2c 20 76 61 6c 75 65 20 70 74 72 2c 20 61 6e 64  , value ptr, and
117c0 20 74 79 70 65 20 2a 2f 0a 20 20 20 20 20 20 69   type */.      i
117d0 6e 74 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74 65  nt nCol = sqlite
117e0 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70  3_column_count(p
117f0 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 76 6f 69  Stmt);.      voi
11800 64 20 2a 70 44 61 74 61 20 3d 20 73 71 6c 69 74  d *pData = sqlit
11810 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 33 2a 6e 43  e3_malloc64(3*nC
11820 6f 6c 2a 73 69 7a 65 6f 66 28 63 6f 6e 73 74 20  ol*sizeof(const 
11830 63 68 61 72 2a 29 20 2b 20 31 29 3b 0a 20 20 20  char*) + 1);.   
11840 20 20 20 69 66 28 20 21 70 44 61 74 61 20 29 7b     if( !pData ){
11850 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
11860 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
11870 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
11880 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 73 20 3d   char **azCols =
11890 20 28 63 68 61 72 20 2a 2a 29 70 44 61 74 61 3b   (char **)pData;
118a0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73 20 6f        /* Names o
118b0 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  f result columns
118c0 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 68 61 72   */.        char
118d0 20 2a 2a 61 7a 56 61 6c 73 20 3d 20 26 61 7a 43   **azVals = &azC
118e0 6f 6c 73 5b 6e 43 6f 6c 5d 3b 20 20 20 20 20 20  ols[nCol];      
118f0 20 2f 2a 20 52 65 73 75 6c 74 73 20 2a 2f 0a 20   /* Results */. 
11900 20 20 20 20 20 20 20 69 6e 74 20 2a 61 69 54 79         int *aiTy
11910 70 65 73 20 3d 20 28 69 6e 74 20 2a 29 26 61 7a  pes = (int *)&az
11920 56 61 6c 73 5b 6e 43 6f 6c 5d 3b 20 2f 2a 20 52  Vals[nCol]; /* R
11930 65 73 75 6c 74 20 74 79 70 65 73 20 2a 2f 0a 20  esult types */. 
11940 20 20 20 20 20 20 20 69 6e 74 20 69 2c 20 78 3b         int i, x;
11950 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
11960 73 69 7a 65 6f 66 28 69 6e 74 29 20 3c 3d 20 73  sizeof(int) <= s
11970 69 7a 65 6f 66 28 63 68 61 72 20 2a 29 29 3b 0a  izeof(char *));.
11980 20 20 20 20 20 20 20 20 2f 2a 20 73 61 76 65 20          /* save 
11990 6f 66 66 20 70 74 72 73 20 74 6f 20 63 6f 6c 75  off ptrs to colu
119a0 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20  mn names */.    
119b0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
119c0 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
119d0 20 20 20 20 20 61 7a 43 6f 6c 73 5b 69 5d 20 3d       azCols[i] =
119e0 20 28 63 68 61 72 20 2a 29 73 71 6c 69 74 65 33   (char *)sqlite3
119f0 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 74  _column_name(pSt
11a00 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  mt, i);.        
11a10 7d 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a 20 20  }.        do{.  
11a20 20 20 20 20 20 20 20 20 2f 2a 20 65 78 74 72 61          /* extra
11a30 63 74 20 74 68 65 20 64 61 74 61 20 61 6e 64 20  ct the data and 
11a40 64 61 74 61 20 74 79 70 65 73 20 2a 2f 0a 20 20  data types */.  
11a50 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
11a60 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20   i<nCol; i++){. 
11a70 20 20 20 20 20 20 20 20 20 20 20 61 69 54 79 70             aiTyp
11a80 65 73 5b 69 5d 20 3d 20 78 20 3d 20 73 71 6c 69  es[i] = x = sqli
11a90 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79 70 65 28  te3_column_type(
11aa0 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
11ab0 20 20 20 20 20 20 20 69 66 28 20 78 3d 3d 53 51         if( x==SQ
11ac0 4c 49 54 45 5f 42 4c 4f 42 20 26 26 20 70 41 72  LITE_BLOB && pAr
11ad0 67 20 26 26 20 70 41 72 67 2d 3e 63 4d 6f 64 65  g && pArg->cMode
11ae0 3d 3d 4d 4f 44 45 5f 49 6e 73 65 72 74 20 29 7b  ==MODE_Insert ){
11af0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61  .              a
11b00 7a 56 61 6c 73 5b 69 5d 20 3d 20 22 22 3b 0a 20  zVals[i] = "";. 
11b10 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
11b20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
11b30 61 7a 56 61 6c 73 5b 69 5d 20 3d 20 28 63 68 61  azVals[i] = (cha
11b40 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
11b50 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 69 29  n_text(pStmt, i)
11b60 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
11b70 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
11b80 21 61 7a 56 61 6c 73 5b 69 5d 20 26 26 20 28 61  !azVals[i] && (a
11b90 69 54 79 70 65 73 5b 69 5d 21 3d 53 51 4c 49 54  iTypes[i]!=SQLIT
11ba0 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20  E_NULL) ){.     
11bb0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
11bc0 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20  LITE_NOMEM;.    
11bd0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
11be0 20 2f 2a 20 66 72 6f 6d 20 66 6f 72 20 2a 2f 0a   /* from for */.
11bf0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
11c00 20 20 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64          } /* end
11c10 20 66 6f 72 20 2a 2f 0a 0a 20 20 20 20 20 20 20   for */..       
11c20 20 20 20 2f 2a 20 69 66 20 64 61 74 61 20 61 6e     /* if data an
11c30 64 20 74 79 70 65 73 20 65 78 74 72 61 63 74 65  d types extracte
11c40 64 20 73 75 63 63 65 73 73 66 75 6c 6c 79 2e 2e  d successfully..
11c50 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  . */.          i
11c60 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 20 3d 3d  f( SQLITE_ROW ==
11c70 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
11c80 20 20 20 2f 2a 20 63 61 6c 6c 20 74 68 65 20 73     /* call the s
11c90 75 70 70 6c 69 65 64 20 63 61 6c 6c 62 61 63 6b  upplied callback
11ca0 20 77 69 74 68 20 74 68 65 20 72 65 73 75 6c 74   with the result
11cb0 20 72 6f 77 20 64 61 74 61 20 2a 2f 0a 20 20 20   row data */.   
11cc0 20 20 20 20 20 20 20 20 20 69 66 28 20 78 43 61           if( xCa
11cd0 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20 6e 43 6f  llback(pArg, nCo
11ce0 6c 2c 20 61 7a 56 61 6c 73 2c 20 61 7a 43 6f 6c  l, azVals, azCol
11cf0 73 2c 20 61 69 54 79 70 65 73 29 20 29 7b 0a 20  s, aiTypes) ){. 
11d00 20 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20               rc 
11d10 3d 20 53 51 4c 49 54 45 5f 41 42 4f 52 54 3b 0a  = SQLITE_ABORT;.
11d20 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
11d30 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
11d40 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74   rc = sqlite3_st
11d50 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ep(pStmt);.     
11d60 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
11d70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 77     }.        } w
11d80 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57  hile( SQLITE_ROW
11d90 20 3d 3d 20 72 63 20 29 3b 0a 20 20 20 20 20 20   == rc );.      
11da0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
11db0 44 61 74 61 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Data);.      }. 
11dc0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
11dd0 64 6f 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  do{.        rc =
11de0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
11df0 74 6d 74 29 3b 0a 20 20 20 20 20 20 7d 20 77 68  tmt);.      } wh
11e00 69 6c 65 28 20 72 63 20 3d 3d 20 53 51 4c 49 54  ile( rc == SQLIT
11e10 45 5f 52 4f 57 20 29 3b 0a 20 20 20 20 7d 0a 20  E_ROW );.    }. 
11e20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73   }.}../*.** This
11e30 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c   function is cal
11e40 6c 65 64 20 74 6f 20 70 72 6f 63 65 73 73 20 53  led to process S
11e50 51 4c 20 69 66 20 74 68 65 20 70 72 65 76 69 6f  QL if the previo
11e60 75 73 20 73 68 65 6c 6c 20 63 6f 6d 6d 61 6e 64  us shell command
11e70 0a 2a 2a 20 77 61 73 20 22 2e 65 78 70 65 72 74  .** was ".expert
11e80 22 2e 20 49 74 20 70 61 73 73 65 73 20 74 68 65  ". It passes the
11e90 20 53 51 4c 20 69 6e 20 74 68 65 20 73 65 63 6f   SQL in the seco
11ea0 6e 64 20 61 72 67 75 6d 65 6e 74 20 64 69 72 65  nd argument dire
11eb0 63 74 6c 79 20 74 6f 0a 2a 2a 20 74 68 65 20 73  ctly to.** the s
11ec0 71 6c 69 74 65 33 65 78 70 65 72 74 20 6f 62 6a  qlite3expert obj
11ed0 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 73 75  ect..**.** If su
11ee0 63 63 65 73 73 66 75 6c 2c 20 53 51 4c 49 54 45  ccessful, SQLITE
11ef0 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64 2e  _OK is returned.
11f00 20 4f 74 68 65 72 77 69 73 65 2c 20 61 6e 20 53   Otherwise, an S
11f10 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a 2a 20 63  QLite error.** c
11f20 6f 64 65 2e 20 49 6e 20 74 68 69 73 20 63 61 73  ode. In this cas
11f30 65 2c 20 28 2a 70 7a 45 72 72 29 20 6d 61 79 20  e, (*pzErr) may 
11f40 62 65 20 73 65 74 20 74 6f 20 70 6f 69 6e 74 20  be set to point 
11f50 74 6f 20 61 20 62 75 66 66 65 72 20 63 6f 6e 74  to a buffer cont
11f60 61 69 6e 69 6e 67 0a 2a 2a 20 61 6e 20 45 6e 67  aining.** an Eng
11f70 6c 69 73 68 20 6c 61 6e 67 75 61 67 65 20 65 72  lish language er
11f80 72 6f 72 20 6d 65 73 73 61 67 65 2e 20 49 74 20  ror message. It 
11f90 69 73 20 74 68 65 20 72 65 73 70 6f 6e 73 69 62  is the responsib
11fa0 69 6c 69 74 79 20 6f 66 20 74 68 65 0a 2a 2a 20  ility of the.** 
11fb0 63 61 6c 6c 65 72 20 74 6f 20 65 76 65 6e 74 75  caller to eventu
11fc0 61 6c 6c 79 20 66 72 65 65 20 74 68 69 73 20 62  ally free this b
11fd0 75 66 66 65 72 20 75 73 69 6e 67 20 73 71 6c 69  uffer using sqli
11fe0 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a 2f 0a 73  te3_free()..*/.s
11ff0 74 61 74 69 63 20 69 6e 74 20 65 78 70 65 72 74  tatic int expert
12000 48 61 6e 64 6c 65 53 51 4c 28 0a 20 20 53 68 65  HandleSQL(.  She
12010 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c  llState *pState,
12020 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
12030 7a 53 71 6c 2c 20 0a 20 20 63 68 61 72 20 2a 2a  zSql, .  char **
12040 70 7a 45 72 72 0a 29 7b 0a 20 20 61 73 73 65 72  pzErr.){.  asser
12050 74 28 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72  t( pState->exper
12060 74 2e 70 45 78 70 65 72 74 20 29 3b 0a 20 20 61  t.pExpert );.  a
12070 73 73 65 72 74 28 20 70 7a 45 72 72 3d 3d 30 20  ssert( pzErr==0 
12080 7c 7c 20 2a 70 7a 45 72 72 3d 3d 30 20 29 3b 0a  || *pzErr==0 );.
12090 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
120a0 5f 65 78 70 65 72 74 5f 73 71 6c 28 70 53 74 61  _expert_sql(pSta
120b0 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65  te->expert.pExpe
120c0 72 74 2c 20 7a 53 71 6c 2c 20 70 7a 45 72 72 29  rt, zSql, pzErr)
120d0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
120e0 66 75 6e 63 74 69 6f 6e 20 69 73 20 63 61 6c 6c  function is call
120f0 65 64 20 65 69 74 68 65 72 20 74 6f 20 73 69 6c  ed either to sil
12100 65 6e 74 6c 79 20 63 6c 65 61 6e 20 75 70 20 74  ently clean up t
12110 68 65 20 6f 62 6a 65 63 74 0a 2a 2a 20 63 72 65  he object.** cre
12120 61 74 65 64 20 62 79 20 74 68 65 20 22 2e 65 78  ated by the ".ex
12130 70 65 72 74 22 20 63 6f 6d 6d 61 6e 64 20 28 69  pert" command (i
12140 66 20 62 43 61 6e 63 65 6c 3d 3d 31 29 2c 20 6f  f bCancel==1), o
12150 72 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 20  r to generate a 
12160 0a 2a 2a 20 72 65 70 6f 72 74 20 66 72 6f 6d 20  .** report from 
12170 69 74 20 61 6e 64 20 74 68 65 6e 20 63 6c 65 61  it and then clea
12180 6e 20 69 74 20 75 70 20 28 69 66 20 62 43 61 6e  n it up (if bCan
12190 63 65 6c 3d 3d 30 29 2e 0a 2a 2a 0a 2a 2a 20 49  cel==0)..**.** I
121a0 66 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51  f successful, SQ
121b0 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72  LITE_OK is retur
121c0 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20  ned. Otherwise, 
121d0 61 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a  an SQLite error.
121e0 2a 2a 20 63 6f 64 65 2e 20 49 6e 20 74 68 69 73  ** code. In this
121f0 20 63 61 73 65 2c 20 28 2a 70 7a 45 72 72 29 20   case, (*pzErr) 
12200 6d 61 79 20 62 65 20 73 65 74 20 74 6f 20 70 6f  may be set to po
12210 69 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20  int to a buffer 
12220 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 61 6e  containing.** an
12230 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67   English languag
12240 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e  e error message.
12250 20 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f   It is the respo
12260 6e 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65  nsibility of the
12270 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76  .** caller to ev
12280 65 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68  entually free th
12290 69 73 20 62 75 66 66 65 72 20 75 73 69 6e 67 20  is buffer using 
122a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a  sqlite3_free()..
122b0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
122c0 70 65 72 74 46 69 6e 69 73 68 28 0a 20 20 53 68  pertFinish(.  Sh
122d0 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65  ellState *pState
122e0 2c 0a 20 20 69 6e 74 20 62 43 61 6e 63 65 6c 2c  ,.  int bCancel,
122f0 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a  .  char **pzErr.
12300 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51  ){.  int rc = SQ
12310 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71 6c 69 74  LITE_OK;.  sqlit
12320 65 33 65 78 70 65 72 74 20 2a 70 20 3d 20 70 53  e3expert *p = pS
12330 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78  tate->expert.pEx
12340 70 65 72 74 3b 0a 20 20 61 73 73 65 72 74 28 20  pert;.  assert( 
12350 70 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 62  p );.  assert( b
12360 43 61 6e 63 65 6c 20 7c 7c 20 70 7a 45 72 72 3d  Cancel || pzErr=
12370 3d 30 20 7c 7c 20 2a 70 7a 45 72 72 3d 3d 30 20  =0 || *pzErr==0 
12380 29 3b 0a 20 20 69 66 28 20 62 43 61 6e 63 65 6c  );.  if( bCancel
12390 3d 3d 30 20 29 7b 0a 20 20 20 20 46 49 4c 45 20  ==0 ){.    FILE 
123a0 2a 6f 75 74 20 3d 20 70 53 74 61 74 65 2d 3e 6f  *out = pState->o
123b0 75 74 3b 0a 20 20 20 20 69 6e 74 20 62 56 65 72  ut;.    int bVer
123c0 62 6f 73 65 20 3d 20 70 53 74 61 74 65 2d 3e 65  bose = pState->e
123d0 78 70 65 72 74 2e 62 56 65 72 62 6f 73 65 3b 0a  xpert.bVerbose;.
123e0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
123f0 33 5f 65 78 70 65 72 74 5f 61 6e 61 6c 79 7a 65  3_expert_analyze
12400 28 70 2c 20 70 7a 45 72 72 29 3b 0a 20 20 20 20  (p, pzErr);.    
12410 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  if( rc==SQLITE_O
12420 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  K ){.      int n
12430 51 75 65 72 79 20 3d 20 73 71 6c 69 74 65 33 5f  Query = sqlite3_
12440 65 78 70 65 72 74 5f 63 6f 75 6e 74 28 70 29 3b  expert_count(p);
12450 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20  .      int i;.. 
12460 20 20 20 20 20 69 66 28 20 62 56 65 72 62 6f 73       if( bVerbos
12470 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  e ){.        con
12480 73 74 20 63 68 61 72 20 2a 7a 43 61 6e 64 20 3d  st char *zCand =
12490 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f   sqlite3_expert_
124a0 72 65 70 6f 72 74 28 70 2c 30 2c 45 58 50 45 52  report(p,0,EXPER
124b0 54 5f 52 45 50 4f 52 54 5f 43 41 4e 44 49 44 41  T_REPORT_CANDIDA
124c0 54 45 53 29 3b 0a 20 20 20 20 20 20 20 20 72 61  TES);.        ra
124d0 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d  w_printf(out, "-
124e0 2d 20 43 61 6e 64 69 64 61 74 65 73 20 2d 2d 2d  - Candidates ---
124f0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12500 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a  ----------\n");.
12510 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
12520 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  tf(out, "%s\n", 
12530 7a 43 61 6e 64 29 3b 0a 20 20 20 20 20 20 7d 0a  zCand);.      }.
12540 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
12550 3c 6e 51 75 65 72 79 3b 20 69 2b 2b 29 7b 0a 20  <nQuery; i++){. 
12560 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
12570 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65  r *zSql = sqlite
12580 33 5f 65 78 70 65 72 74 5f 72 65 70 6f 72 74 28  3_expert_report(
12590 70 2c 20 69 2c 20 45 58 50 45 52 54 5f 52 45 50  p, i, EXPERT_REP
125a0 4f 52 54 5f 53 51 4c 29 3b 0a 20 20 20 20 20 20  ORT_SQL);.      
125b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
125c0 64 78 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70  dx = sqlite3_exp
125d0 65 72 74 5f 72 65 70 6f 72 74 28 70 2c 20 69 2c  ert_report(p, i,
125e0 20 45 58 50 45 52 54 5f 52 45 50 4f 52 54 5f 49   EXPERT_REPORT_I
125f0 4e 44 45 58 45 53 29 3b 0a 20 20 20 20 20 20 20  NDEXES);.       
12600 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 51   const char *zEQ
12610 50 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65  P = sqlite3_expe
12620 72 74 5f 72 65 70 6f 72 74 28 70 2c 20 69 2c 20  rt_report(p, i, 
12630 45 58 50 45 52 54 5f 52 45 50 4f 52 54 5f 50 4c  EXPERT_REPORT_PL
12640 41 4e 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  AN);.        if(
12650 20 7a 49 64 78 3d 3d 30 20 29 20 7a 49 64 78 20   zIdx==0 ) zIdx 
12660 3d 20 22 28 6e 6f 20 6e 65 77 20 69 6e 64 65 78  = "(no new index
12670 65 73 29 5c 6e 22 3b 0a 20 20 20 20 20 20 20 20  es)\n";.        
12680 69 66 28 20 62 56 65 72 62 6f 73 65 20 29 7b 0a  if( bVerbose ){.
12690 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
126a0 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 51 75  intf(out, "-- Qu
126b0 65 72 79 20 25 64 20 2d 2d 2d 2d 2d 2d 2d 2d 2d  ery %d ---------
126c0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
126d0 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 2c 69 2b 31 29 3b  -------\n",i+1);
126e0 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
126f0 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e  rintf(out, "%s\n
12700 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20  \n", zSql);.    
12710 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61      }.        ra
12720 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  w_printf(out, "%
12730 73 5c 6e 22 2c 20 7a 49 64 78 29 3b 0a 20 20 20  s\n", zIdx);.   
12740 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
12750 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 45 51  out, "%s\n", zEQ
12760 50 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  P);.      }.    
12770 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
12780 65 78 70 65 72 74 5f 64 65 73 74 72 6f 79 28 70  expert_destroy(p
12790 29 3b 0a 20 20 70 53 74 61 74 65 2d 3e 65 78 70  );.  pState->exp
127a0 65 72 74 2e 70 45 78 70 65 72 74 20 3d 20 30 3b  ert.pExpert = 0;
127b0 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
127c0 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20  ../*.** Execute 
127d0 61 20 73 74 61 74 65 6d 65 6e 74 20 6f 72 20 73  a statement or s
127e0 65 74 20 6f 66 20 73 74 61 74 65 6d 65 6e 74 73  et of statements
127f0 2e 20 20 50 72 69 6e 74 0a 2a 2a 20 61 6e 79 20  .  Print.** any 
12800 72 65 73 75 6c 74 20 72 6f 77 73 2f 63 6f 6c 75  result rows/colu
12810 6d 6e 73 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e  mns depending on
12820 20 74 68 65 20 63 75 72 72 65 6e 74 20 6d 6f 64   the current mod
12830 65 0a 2a 2a 20 73 65 74 20 76 69 61 20 74 68 65  e.** set via the
12840 20 73 75 70 70 6c 69 65 64 20 63 61 6c 6c 62 61   supplied callba
12850 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69  ck..**.** This i
12860 73 20 76 65 72 79 20 73 69 6d 69 6c 61 72 20 74  s very similar t
12870 6f 20 53 51 4c 69 74 65 27 73 20 62 75 69 6c 74  o SQLite's built
12880 2d 69 6e 20 73 71 6c 69 74 65 33 5f 65 78 65 63  -in sqlite3_exec
12890 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 65  ().** function e
128a0 78 63 65 70 74 20 69 74 20 74 61 6b 65 73 20 61  xcept it takes a
128b0 20 73 6c 69 67 68 74 6c 79 20 64 69 66 66 65 72   slightly differ
128c0 65 6e 74 20 63 61 6c 6c 62 61 63 6b 0a 2a 2a 20  ent callback.** 
128d0 61 6e 64 20 63 61 6c 6c 62 61 63 6b 20 64 61 74  and callback dat
128e0 61 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 73  a argument..*/.s
128f0 74 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f  tatic int shell_
12900 65 78 65 63 28 0a 20 20 73 71 6c 69 74 65 33 20  exec(.  sqlite3 
12910 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
12920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12930 20 20 2f 2a 20 41 6e 20 6f 70 65 6e 20 64 61 74    /* An open dat
12940 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  abase */.  const
12950 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 20 20 20   char *zSql,    
12960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12970 20 20 20 20 20 2f 2a 20 53 51 4c 20 74 6f 20 62       /* SQL to b
12980 65 20 65 76 61 6c 75 61 74 65 64 20 2a 2f 0a 20  e evaluated */. 
12990 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62 61 63 6b   int (*xCallback
129a0 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63 68 61 72  )(void*,int,char
129b0 2a 2a 2c 63 68 61 72 2a 2a 2c 69 6e 74 2a 29 2c  **,char**,int*),
129c0 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63 6b 20 66     /* Callback f
129d0 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  unction */.     
129e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
129f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12a00 20 20 20 20 20 20 20 2f 2a 20 28 6e 6f 74 20 74         /* (not t
12a10 68 65 20 73 61 6d 65 20 61 73 20 73 71 6c 69 74  he same as sqlit
12a20 65 33 5f 65 78 65 63 29 20 2a 2f 0a 20 20 53 68  e3_exec) */.  Sh
12a30 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 2c 20  ellState *pArg, 
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 2f 2a 20 50 6f 69 6e 74          /* Point
12a60 65 72 20 74 6f 20 53 68 65 6c 6c 53 74 61 74 65  er to ShellState
12a70 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45   */.  char **pzE
12a80 72 72 4d 73 67 20 20 20 20 20 20 20 20 20 20 20  rrMsg           
12a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12aa0 2f 2a 20 45 72 72 6f 72 20 6d 73 67 20 77 72 69  /* Error msg wri
12ab0 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a 29 7b 0a  tten here */.){.
12ac0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
12ad0 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20 20 20  pStmt = NULL;   
12ae0 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e 74 20 74    /* Statement t
12af0 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20 20  o execute. */.  
12b00 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
12b10 4f 4b 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  OK;             
12b20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64 65 20 2a  /* Return Code *
12b30 2f 0a 20 20 69 6e 74 20 72 63 32 3b 0a 20 20 63  /.  int rc2;.  c
12b40 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 65 66 74  onst char *zLeft
12b50 6f 76 65 72 3b 20 20 20 20 20 20 20 20 20 20 2f  over;          /
12b60 2a 20 54 61 69 6c 20 6f 66 20 75 6e 70 72 6f 63  * Tail of unproc
12b70 65 73 73 65 64 20 53 51 4c 20 2a 2f 0a 0a 20 20  essed SQL */..  
12b80 69 66 28 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a  if( pzErrMsg ){.
12b90 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20      *pzErrMsg = 
12ba0 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 20 20 69 66 28  NULL;.  }..  if(
12bb0 20 70 41 72 67 2d 3e 65 78 70 65 72 74 2e 70 45   pArg->expert.pE
12bc0 78 70 65 72 74 20 29 7b 0a 20 20 20 20 72 63 20  xpert ){.    rc 
12bd0 3d 20 65 78 70 65 72 74 48 61 6e 64 6c 65 53 51  = expertHandleSQ
12be0 4c 28 70 41 72 67 2c 20 7a 53 71 6c 2c 20 70 7a  L(pArg, zSql, pz
12bf0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 72 65 74  ErrMsg);.    ret
12c00 75 72 6e 20 65 78 70 65 72 74 46 69 6e 69 73 68  urn expertFinish
12c10 28 70 41 72 67 2c 20 28 72 63 21 3d 53 51 4c 49  (pArg, (rc!=SQLI
12c20 54 45 5f 4f 4b 29 2c 20 70 7a 45 72 72 4d 73 67  TE_OK), pzErrMsg
12c30 29 3b 0a 20 20 7d 0a 0a 20 20 77 68 69 6c 65 28  );.  }..  while(
12c40 20 7a 53 71 6c 5b 30 5d 20 26 26 20 28 53 51 4c   zSql[0] && (SQL
12c50 49 54 45 5f 4f 4b 20 3d 3d 20 72 63 29 20 29 7b  ITE_OK == rc) ){
12c60 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
12c70 74 20 63 68 61 72 20 2a 7a 53 74 6d 74 53 71 6c  t char *zStmtSql
12c80 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
12c90 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62  e3_prepare_v2(db
12ca0 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
12cb0 6d 74 2c 20 26 7a 4c 65 66 74 6f 76 65 72 29 3b  mt, &zLeftover);
12cc0 0a 20 20 20 20 69 66 28 20 53 51 4c 49 54 45 5f  .    if( SQLITE_
12cd0 4f 4b 20 21 3d 20 72 63 20 29 7b 0a 20 20 20 20  OK != rc ){.    
12ce0 20 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20 29    if( pzErrMsg )
12cf0 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a 45 72 72  {.        *pzErr
12d00 4d 73 67 20 3d 20 73 61 76 65 5f 65 72 72 5f 6d  Msg = save_err_m
12d10 73 67 28 64 62 29 3b 0a 20 20 20 20 20 20 7d 0a  sg(db);.      }.
12d20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
12d30 20 69 66 28 20 21 70 53 74 6d 74 20 29 7b 0a 20   if( !pStmt ){. 
12d40 20 20 20 20 20 20 20 2f 2a 20 74 68 69 73 20 68         /* this h
12d50 61 70 70 65 6e 73 20 66 6f 72 20 61 20 63 6f 6d  appens for a com
12d60 6d 65 6e 74 20 6f 72 20 77 68 69 74 65 2d 73 70  ment or white-sp
12d70 61 63 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 7a  ace */.        z
12d80 53 71 6c 20 3d 20 7a 4c 65 66 74 6f 76 65 72 3b  Sql = zLeftover;
12d90 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20  .        while( 
12da0 49 73 53 70 61 63 65 28 7a 53 71 6c 5b 30 5d 29  IsSpace(zSql[0])
12db0 20 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20   ) zSql++;.     
12dc0 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
12dd0 20 20 20 7d 0a 20 20 20 20 20 20 7a 53 74 6d 74     }.      zStmt
12de0 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73 71  Sql = sqlite3_sq
12df0 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  l(pStmt);.      
12e00 69 66 28 20 7a 53 74 6d 74 53 71 6c 3d 3d 30 20  if( zStmtSql==0 
12e10 29 20 7a 53 74 6d 74 53 71 6c 20 3d 20 22 22 3b  ) zStmtSql = "";
12e20 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 49 73  .      while( Is
12e30 53 70 61 63 65 28 7a 53 74 6d 74 53 71 6c 5b 30  Space(zStmtSql[0
12e40 5d 29 20 29 20 7a 53 74 6d 74 53 71 6c 2b 2b 3b  ]) ) zStmtSql++;
12e50 0a 0a 20 20 20 20 20 20 2f 2a 20 73 61 76 65 20  ..      /* save 
12e60 6f 66 66 20 74 68 65 20 70 72 65 70 61 72 65 64  off the prepared
12e70 20 73 74 61 74 6d 65 6e 74 20 68 61 6e 64 6c 65   statment handle
12e80 20 61 6e 64 20 72 65 73 65 74 20 72 6f 77 20 63   and reset row c
12e90 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20 20 69 66  ount */.      if
12ea0 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20  ( pArg ){.      
12eb0 20 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d 20    pArg->pStmt = 
12ec0 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 20 20 70  pStmt;.        p
12ed0 41 72 67 2d 3e 63 6e 74 20 3d 20 30 3b 0a 20 20  Arg->cnt = 0;.  
12ee0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20      }..      /* 
12ef0 65 63 68 6f 20 74 68 65 20 73 71 6c 20 73 74 61  echo the sql sta
12f00 74 65 6d 65 6e 74 20 69 66 20 65 63 68 6f 20 6f  tement if echo o
12f10 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70  n */.      if( p
12f20 41 72 67 20 26 26 20 53 68 65 6c 6c 48 61 73 46  Arg && ShellHasF
12f30 6c 61 67 28 70 41 72 67 2c 20 53 48 46 4c 47 5f  lag(pArg, SHFLG_
12f40 45 63 68 6f 29 20 29 7b 0a 20 20 20 20 20 20 20  Echo) ){.       
12f50 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72   utf8_printf(pAr
12f60 67 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  g->out, "%s\n", 
12f70 7a 53 74 6d 74 53 71 6c 20 3f 20 7a 53 74 6d 74  zStmtSql ? zStmt
12f80 53 71 6c 20 3a 20 7a 53 71 6c 29 3b 0a 20 20 20  Sql : zSql);.   
12f90 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53     }..      /* S
12fa0 68 6f 77 20 74 68 65 20 45 58 50 4c 41 49 4e 20  how the EXPLAIN 
12fb0 51 55 45 52 59 20 50 4c 41 4e 20 69 66 20 2e 65  QUERY PLAN if .e
12fc0 71 70 20 69 73 20 6f 6e 20 2a 2f 0a 20 20 20 20  qp is on */.    
12fd0 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70 41    if( pArg && pA
12fe0 72 67 2d 3e 61 75 74 6f 45 51 50 20 26 26 20 73  rg->autoEQP && s
12ff0 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22  qlite3_strlike("
13000 45 58 50 4c 41 49 4e 25 22 2c 7a 53 74 6d 74 53  EXPLAIN%",zStmtS
13010 71 6c 2c 30 29 21 3d 30 20 29 7b 0a 20 20 20 20  ql,0)!=0 ){.    
13020 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
13030 20 2a 70 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20   *pExplain;.    
13040 20 20 20 20 63 68 61 72 20 2a 7a 45 51 50 3b 0a      char *zEQP;.
13050 20 20 20 20 20 20 20 20 69 6e 74 20 74 72 69 67          int trig
13060 67 65 72 45 51 50 20 3d 20 30 3b 0a 20 20 20 20  gerEQP = 0;.    
13070 20 20 20 20 64 69 73 61 62 6c 65 5f 64 65 62 75      disable_debu
13080 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73 28 29 3b  g_trace_modes();
13090 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
130a0 5f 64 62 5f 63 6f 6e 66 69 67 28 64 62 2c 20 53  _db_config(db, S
130b0 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 54  QLITE_DBCONFIG_T
130c0 52 49 47 47 45 52 5f 45 51 50 2c 20 2d 31 2c 20  RIGGER_EQP, -1, 
130d0 26 74 72 69 67 67 65 72 45 51 50 29 3b 0a 20 20  &triggerEQP);.  
130e0 20 20 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e        if( pArg->
130f0 61 75 74 6f 45 51 50 3e 3d 41 55 54 4f 45 51 50  autoEQP>=AUTOEQP
13100 5f 74 72 69 67 67 65 72 20 29 7b 0a 20 20 20 20  _trigger ){.    
13110 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62        sqlite3_db
13120 5f 63 6f 6e 66 69 67 28 64 62 2c 20 53 51 4c 49  _config(db, SQLI
13130 54 45 5f 44 42 43 4f 4e 46 49 47 5f 54 52 49 47  TE_DBCONFIG_TRIG
13140 47 45 52 5f 45 51 50 2c 20 31 2c 20 30 29 3b 0a  GER_EQP, 1, 0);.
13150 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13160 20 20 7a 45 51 50 20 3d 20 73 71 6c 69 74 65 33    zEQP = sqlite3
13170 5f 6d 70 72 69 6e 74 66 28 22 45 58 50 4c 41 49  _mprintf("EXPLAI
13180 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 25 73 22  N QUERY PLAN %s"
13190 2c 20 7a 53 74 6d 74 53 71 6c 29 3b 0a 20 20 20  , zStmtSql);.   
131a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
131b0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c  3_prepare_v2(db,
131c0 20 7a 45 51 50 2c 20 2d 31 2c 20 26 70 45 78 70   zEQP, -1, &pExp
131d0 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lain, 0);.      
131e0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
131f0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _OK ){.         
13200 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f   while( sqlite3_
13210 73 74 65 70 28 70 45 78 70 6c 61 69 6e 29 3d 3d  step(pExplain)==
13220 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
13230 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
13240 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 22  intf(pArg->out,"
13250 2d 2d 45 51 50 2d 2d 20 25 64 2c 22 2c 73 71 6c  --EQP-- %d,",sql
13260 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
13270 70 45 78 70 6c 61 69 6e 2c 20 30 29 29 3b 0a 20  pExplain, 0));. 
13280 20 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70             raw_p
13290 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
132a0 22 25 64 2c 22 2c 20 73 71 6c 69 74 65 33 5f 63  "%d,", sqlite3_c
132b0 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61  olumn_int(pExpla
132c0 69 6e 2c 20 31 29 29 3b 0a 20 20 20 20 20 20 20  in, 1));.       
132d0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
132e0 70 41 72 67 2d 3e 6f 75 74 2c 22 25 64 2c 22 2c  pArg->out,"%d,",
132f0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
13300 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 32 29  int(pExplain, 2)
13310 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  );.            u
13320 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72 67 2d  tf8_printf(pArg-
13330 3e 6f 75 74 2c 22 25 73 5c 6e 22 2c 20 73 71 6c  >out,"%s\n", sql
13340 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
13350 28 70 45 78 70 6c 61 69 6e 2c 20 33 29 29 3b 0a  (pExplain, 3));.
13360 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
13370 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
13380 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
13390 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20  Explain);.      
133a0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
133b0 45 51 50 29 3b 0a 20 20 20 20 20 20 20 20 69 66  EQP);.        if
133c0 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 51 50 3e  ( pArg->autoEQP>
133d0 3d 41 55 54 4f 45 51 50 5f 66 75 6c 6c 20 29 7b  =AUTOEQP_full ){
133e0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c  .          /* Al
133f0 73 6f 20 64 6f 20 61 6e 20 45 58 50 4c 41 49 4e  so do an EXPLAIN
13400 20 66 6f 72 20 22 2e 65 71 70 20 66 75 6c 6c 22   for ".eqp full"
13410 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 20   mode */.       
13420 20 20 20 7a 45 51 50 20 3d 20 73 71 6c 69 74 65     zEQP = sqlite
13430 33 5f 6d 70 72 69 6e 74 66 28 22 45 58 50 4c 41  3_mprintf("EXPLA
13440 49 4e 20 25 73 22 2c 20 7a 53 74 6d 74 53 71 6c  IN %s", zStmtSql
13450 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
13460 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
13470 65 5f 76 32 28 64 62 2c 20 7a 45 51 50 2c 20 2d  e_v2(db, zEQP, -
13480 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20 30 29  1, &pExplain, 0)
13490 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
134a0 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
134b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 41 72  .            pAr
134c0 67 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f  g->cMode = MODE_
134d0 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 20  Explain;.       
134e0 20 20 20 20 20 65 78 70 6c 61 69 6e 5f 64 61 74       explain_dat
134f0 61 5f 70 72 65 70 61 72 65 28 70 41 72 67 2c 20  a_prepare(pArg, 
13500 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20  pExplain);.     
13510 20 20 20 20 20 20 20 65 78 65 63 5f 70 72 65 70         exec_prep
13520 61 72 65 64 5f 73 74 6d 74 28 70 41 72 67 2c 20  ared_stmt(pArg, 
13530 70 45 78 70 6c 61 69 6e 2c 20 78 43 61 6c 6c 62  pExplain, xCallb
13540 61 63 6b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ack);.          
13550 20 20 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 64    explain_data_d
13560 65 6c 65 74 65 28 70 41 72 67 29 3b 0a 20 20 20  elete(pArg);.   
13570 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13580 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
13590 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20  ize(pExplain);. 
135a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
135b0 5f 66 72 65 65 28 7a 45 51 50 29 3b 0a 20 20 20  _free(zEQP);.   
135c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
135d0 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67  qlite3_db_config
135e0 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f  (db, SQLITE_DBCO
135f0 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51 50  NFIG_TRIGGER_EQP
13600 2c 20 74 72 69 67 67 65 72 45 51 50 2c 20 30 29  , triggerEQP, 0)
13610 3b 0a 20 20 20 20 20 20 20 20 72 65 73 74 6f 72  ;.        restor
13620 65 5f 64 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f  e_debug_trace_mo
13630 64 65 73 28 29 3b 0a 20 20 20 20 20 20 7d 0a 0a  des();.      }..
13640 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20 29        if( pArg )
13650 7b 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e  {.        pArg->
13660 63 4d 6f 64 65 20 3d 20 70 41 72 67 2d 3e 6d 6f  cMode = pArg->mo
13670 64 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  de;.        if( 
13680 70 41 72 67 2d 3e 61 75 74 6f 45 78 70 6c 61 69  pArg->autoExplai
13690 6e 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71  n.         && sq
136a0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75  lite3_column_cou
136b0 6e 74 28 70 53 74 6d 74 29 3d 3d 38 0a 20 20 20  nt(pStmt)==8.   
136c0 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
136d0 5f 73 74 72 6c 69 6b 65 28 22 45 58 50 4c 41 49  _strlike("EXPLAI
136e0 4e 25 22 2c 20 7a 53 74 6d 74 53 71 6c 2c 30 29  N%", zStmtSql,0)
136f0 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20  ==0.        ){. 
13700 20 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e 63           pArg->c
13710 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c  Mode = MODE_Expl
13720 61 69 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  ain;.        }..
13730 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 74 68          /* If th
13740 65 20 73 68 65 6c 6c 20 69 73 20 63 75 72 72 65  e shell is curre
13750 6e 74 6c 79 20 69 6e 20 22 2e 65 78 70 6c 61 69  ntly in ".explai
13760 6e 22 20 6d 6f 64 65 2c 20 67 61 74 68 65 72 20  n" mode, gather 
13770 74 68 65 20 65 78 74 72 61 0a 20 20 20 20 20 20  the extra.      
13780 20 20 2a 2a 20 64 61 74 61 20 72 65 71 75 69 72    ** data requir
13790 65 64 20 74 6f 20 61 64 64 20 69 6e 64 65 6e 74  ed to add indent
137a0 73 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 2e  s to the output.
137b0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
137c0 41 72 67 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45  Arg->cMode==MODE
137d0 5f 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  _Explain ){.    
137e0 20 20 20 20 20 20 65 78 70 6c 61 69 6e 5f 64 61        explain_da
137f0 74 61 5f 70 72 65 70 61 72 65 28 70 41 72 67 2c  ta_prepare(pArg,
13800 20 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 20   pStmt);.       
13810 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
13820 20 20 65 78 65 63 5f 70 72 65 70 61 72 65 64 5f    exec_prepared_
13830 73 74 6d 74 28 70 41 72 67 2c 20 70 53 74 6d 74  stmt(pArg, pStmt
13840 2c 20 78 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20  , xCallback);.  
13850 20 20 20 20 65 78 70 6c 61 69 6e 5f 64 61 74 61      explain_data
13860 5f 64 65 6c 65 74 65 28 70 41 72 67 29 3b 0a 0a  _delete(pArg);..
13870 20 20 20 20 20 20 2f 2a 20 70 72 69 6e 74 20 75        /* print u
13880 73 61 67 65 20 73 74 61 74 73 20 69 66 20 73 74  sage stats if st
13890 61 74 73 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ats on */.      
138a0 69 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67  if( pArg && pArg
138b0 2d 3e 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20  ->statsOn ){.   
138c0 20 20 20 20 20 64 69 73 70 6c 61 79 5f 73 74 61       display_sta
138d0 74 73 28 64 62 2c 20 70 41 72 67 2c 20 30 29 3b  ts(db, pArg, 0);
138e0 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
138f0 2f 2a 20 70 72 69 6e 74 20 6c 6f 6f 70 2d 63 6f  /* print loop-co
13900 75 6e 74 65 72 73 20 69 66 20 72 65 71 75 69 72  unters if requir
13910 65 64 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ed */.      if( 
13920 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 73 63  pArg && pArg->sc
13930 61 6e 73 74 61 74 73 4f 6e 20 29 7b 0a 20 20 20  anstatsOn ){.   
13940 20 20 20 20 20 64 69 73 70 6c 61 79 5f 73 63 61       display_sca
13950 6e 73 74 61 74 73 28 64 62 2c 20 70 41 72 67 29  nstats(db, pArg)
13960 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
13970 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20 74 68 65   /* Finalize the
13980 20 73 74 61 74 65 6d 65 6e 74 20 6a 75 73 74 20   statement just 
13990 65 78 65 63 75 74 65 64 2e 20 49 66 20 74 68 69  executed. If thi
139a0 73 20 66 61 69 6c 73 2c 20 73 61 76 65 20 61 0a  s fails, save a.
139b0 20 20 20 20 20 20 2a 2a 20 63 6f 70 79 20 6f 66        ** copy of
139c0 20 74 68 65 20 65 72 72 6f 72 20 6d 65 73 73 61   the error messa
139d0 67 65 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 73  ge. Otherwise, s
139e0 65 74 20 7a 53 71 6c 20 74 6f 20 70 6f 69 6e 74  et zSql to point
139f0 20 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   to the.      **
13a00 20 6e 65 78 74 20 73 74 61 74 65 6d 65 6e 74 20   next statement 
13a10 74 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f 0a 20  to execute. */. 
13a20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
13a30 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
13a40 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  t);.      if( rc
13a50 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 20 29  !=SQLITE_NOMEM )
13a60 20 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20   rc = rc2;.     
13a70 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
13a80 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 53  OK ){.        zS
13a90 71 6c 20 3d 20 7a 4c 65 66 74 6f 76 65 72 3b 0a  ql = zLeftover;.
13aa0 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 49          while( I
13ab0 73 53 70 61 63 65 28 7a 53 71 6c 5b 30 5d 29 20  sSpace(zSql[0]) 
13ac0 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20 20 20 20  ) zSql++;.      
13ad0 7d 65 6c 73 65 20 69 66 28 20 70 7a 45 72 72 4d  }else if( pzErrM
13ae0 73 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70  sg ){.        *p
13af0 7a 45 72 72 4d 73 67 20 3d 20 73 61 76 65 5f 65  zErrMsg = save_e
13b00 72 72 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20 20  rr_msg(db);.    
13b10 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 63 6c    }..      /* cl
13b20 65 61 72 20 73 61 76 65 64 20 73 74 6d 74 20 68  ear saved stmt h
13b30 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20 20 20 69  andle */.      i
13b40 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20  f( pArg ){.     
13b50 20 20 20 70 41 72 67 2d 3e 70 53 74 6d 74 20 3d     pArg->pStmt =
13b60 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 7d 0a 20   NULL;.      }. 
13b70 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 65 6e 64 20     }.  } /* end 
13b80 77 68 69 6c 65 20 2a 2f 0a 0a 20 20 72 65 74 75  while */..  retu
13b90 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rn rc;.}../*.** 
13ba0 52 65 6c 65 61 73 65 20 6d 65 6d 6f 72 79 20 70  Release memory p
13bb0 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c 6f 63 61  reviously alloca
13bc0 74 65 64 20 62 79 20 74 61 62 6c 65 43 6f 6c 75  ted by tableColu
13bd0 6d 6e 4c 69 73 74 28 29 2e 0a 2a 2f 0a 73 74 61  mnList()..*/.sta
13be0 74 69 63 20 76 6f 69 64 20 66 72 65 65 43 6f 6c  tic void freeCol
13bf0 75 6d 6e 4c 69 73 74 28 63 68 61 72 20 2a 2a 61  umnList(char **a
13c00 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  zCol){.  int i;.
13c10 20 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c    for(i=1; azCol
13c20 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  [i]; i++){.    s
13c30 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 43 6f  qlite3_free(azCo
13c40 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 2f 2a 20  l[i]);.  }.  /* 
13c50 61 7a 43 6f 6c 5b 30 5d 20 69 73 20 61 20 73 74  azCol[0] is a st
13c60 61 74 69 63 20 73 74 72 69 6e 67 20 2a 2f 0a 20  atic string */. 
13c70 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a   sqlite3_free(az
13c80 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  Col);.}../*.** R
13c90 65 74 75 72 6e 20 61 20 6c 69 73 74 20 6f 66 20  eturn a list of 
13ca0 70 6f 69 6e 74 65 72 73 20 74 6f 20 73 74 72 69  pointers to stri
13cb0 6e 67 73 20 77 68 69 63 68 20 61 72 65 20 74 68  ngs which are th
13cc0 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 0a 2a  e names of all.*
13cd0 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 61 62  * columns in tab
13ce0 6c 65 20 7a 54 61 62 2e 20 20 20 54 68 65 20 6d  le zTab.   The m
13cf0 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64 20 74 68  emory to hold th
13d00 65 20 6e 61 6d 65 73 20 69 73 20 64 79 6e 61 6d  e names is dynam
13d10 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c 6f 63 61  ically.** alloca
13d20 74 65 64 20 61 6e 64 20 6d 75 73 74 20 62 65 20  ted and must be 
13d30 72 65 6c 65 61 73 65 64 20 62 79 20 74 68 65 20  released by the 
13d40 63 61 6c 6c 65 72 20 75 73 69 6e 67 20 61 20 73  caller using a s
13d50 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 0a 2a  ubsequent call.*
13d60 2a 20 74 6f 20 66 72 65 65 43 6f 6c 75 6d 6e 4c  * to freeColumnL
13d70 69 73 74 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  ist()..**.** The
13d80 20 61 7a 43 6f 6c 5b 30 5d 20 65 6e 74 72 79 20   azCol[0] entry 
13d90 69 73 20 75 73 75 61 6c 6c 79 20 4e 55 4c 4c 2e  is usually NULL.
13da0 20 20 48 6f 77 65 76 65 72 2c 20 69 66 20 7a 54    However, if zT
13db0 61 62 20 63 6f 6e 74 61 69 6e 73 20 61 20 72 6f  ab contains a ro
13dc0 77 69 64 0a 2a 2a 20 76 61 6c 75 65 20 74 68 61  wid.** value tha
13dd0 74 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 72  t needs to be pr
13de0 65 73 65 72 76 65 64 2c 20 74 68 65 6e 20 61 7a  eserved, then az
13df0 43 6f 6c 5b 30 5d 20 69 73 20 66 69 6c 6c 65 64  Col[0] is filled
13e00 20 69 6e 20 77 69 74 68 20 74 68 65 0a 2a 2a 20   in with the.** 
13e10 6e 61 6d 65 20 6f 66 20 74 68 65 20 72 6f 77 69  name of the rowi
13e20 64 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20  d column..**.** 
13e30 54 68 65 20 66 69 72 73 74 20 72 65 67 75 6c 61  The first regula
13e40 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  r column in the 
13e50 74 61 62 6c 65 20 69 73 20 61 7a 43 6f 6c 5b 31  table is azCol[1
13e60 5d 2e 20 20 54 68 65 20 6c 69 73 74 20 69 73 20  ].  The list is 
13e70 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a 20 62 79  terminated.** by
13e80 20 61 6e 20 65 6e 74 72 79 20 77 69 74 68 20 61   an entry with a
13e90 7a 43 6f 6c 5b 69 5d 3d 3d 30 2e 0a 2a 2f 0a 73  zCol[i]==0..*/.s
13ea0 74 61 74 69 63 20 63 68 61 72 20 2a 2a 74 61 62  tatic char **tab
13eb0 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 53 68 65  leColumnList(She
13ec0 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73  llState *p, cons
13ed0 74 20 63 68 61 72 20 2a 7a 54 61 62 29 7b 0a 20  t char *zTab){. 
13ee0 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 20 3d 20   char **azCol = 
13ef0 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  0;.  sqlite3_stm
13f00 74 20 2a 70 53 74 6d 74 3b 0a 20 20 63 68 61 72  t *pStmt;.  char
13f10 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74 20 6e 43   *zSql;.  int nC
13f20 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 41  ol = 0;.  int nA
13f30 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 69 6e 74 20  lloc = 0;.  int 
13f40 6e 50 4b 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  nPK = 0;       /
13f50 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50 52 49 4d  * Number of PRIM
13f60 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 73 20  ARY KEY columns 
13f70 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 69 73  seen */.  int is
13f80 49 50 4b 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20  IPK = 0;     /* 
13f90 54 72 75 65 20 69 66 20 6f 6e 65 20 50 52 49 4d  True if one PRIM
13fa0 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 6f  ARY KEY column o
13fb0 66 20 74 79 70 65 20 49 4e 54 45 47 45 52 20 2a  f type INTEGER *
13fc0 2f 0a 20 20 69 6e 74 20 70 72 65 73 65 72 76 65  /.  int preserve
13fd0 52 6f 77 69 64 20 3d 20 53 68 65 6c 6c 48 61 73  Rowid = ShellHas
13fe0 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 50 72  Flag(p, SHFLG_Pr
13ff0 65 73 65 72 76 65 52 6f 77 69 64 29 3b 0a 20 20  eserveRowid);.  
14000 69 6e 74 20 72 63 3b 0a 0a 20 20 7a 53 71 6c 20  int rc;..  zSql 
14010 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
14020 66 28 22 50 52 41 47 4d 41 20 74 61 62 6c 65 5f  f("PRAGMA table_
14030 69 6e 66 6f 3d 25 51 22 2c 20 7a 54 61 62 29 3b  info=%Q", zTab);
14040 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
14050 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
14060 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
14070 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74 65  mt, 0);.  sqlite
14080 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20  3_free(zSql);.  
14090 69 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20  if( rc ) return 
140a0 30 3b 0a 20 20 77 68 69 6c 65 28 20 73 71 6c 69  0;.  while( sqli
140b0 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
140c0 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
140d0 20 20 20 69 66 28 20 6e 43 6f 6c 3e 3d 6e 41 6c     if( nCol>=nAl
140e0 6c 6f 63 2d 32 20 29 7b 0a 20 20 20 20 20 20 6e  loc-2 ){.      n
140f0 41 6c 6c 6f 63 20 3d 20 6e 41 6c 6c 6f 63 2a 32  Alloc = nAlloc*2
14100 20 2b 20 6e 43 6f 6c 20 2b 20 31 30 3b 0a 20 20   + nCol + 10;.  
14110 20 20 20 20 61 7a 43 6f 6c 20 3d 20 73 71 6c 69      azCol = sqli
14120 74 65 33 5f 72 65 61 6c 6c 6f 63 28 61 7a 43 6f  te3_realloc(azCo
14130 6c 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66  l, nAlloc*sizeof
14140 28 61 7a 43 6f 6c 5b 30 5d 29 29 3b 0a 20 20 20  (azCol[0]));.   
14150 20 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20     if( azCol==0 
14160 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  ){.        raw_p
14170 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
14180 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d  rror: out of mem
14190 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  ory\n");.       
141a0 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20 20 20   exit(1);.      
141b0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61 7a 43 6f  }.    }.    azCo
141c0 6c 5b 2b 2b 6e 43 6f 6c 5d 20 3d 20 73 71 6c 69  l[++nCol] = sqli
141d0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
141e0 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
141f0 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29 29  _text(pStmt, 1))
14200 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
14210 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
14220 6d 74 2c 20 35 29 20 29 7b 0a 20 20 20 20 20 20  mt, 5) ){.      
14230 6e 50 4b 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  nPK++;.      if(
14240 20 6e 50 4b 3d 3d 31 0a 20 20 20 20 20 20 20 26   nPK==1.       &
14250 26 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  & sqlite3_stricm
14260 70 28 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  p((const char*)s
14270 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
14280 78 74 28 70 53 74 6d 74 2c 32 29 2c 0a 20 20 20  xt(pStmt,2),.   
14290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
142a0 20 20 20 20 20 20 20 22 49 4e 54 45 47 45 52 22         "INTEGER"
142b0 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b 0a 20 20  )==0.      ){.  
142c0 20 20 20 20 20 20 69 73 49 50 4b 20 3d 20 31 3b        isIPK = 1;
142d0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
142e0 20 20 20 20 20 20 69 73 49 50 4b 20 3d 20 30 3b        isIPK = 0;
142f0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
14300 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e   }.  sqlite3_fin
14310 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
14320 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 20 72  if( azCol==0 ) r
14330 65 74 75 72 6e 20 30 3b 0a 20 20 61 7a 43 6f 6c  eturn 0;.  azCol
14340 5b 30 5d 20 3d 20 30 3b 0a 20 20 61 7a 43 6f 6c  [0] = 0;.  azCol
14350 5b 6e 43 6f 6c 2b 31 5d 20 3d 20 30 3b 0a 0a 20  [nCol+1] = 0;.. 
14360 20 2f 2a 20 54 68 65 20 64 65 63 69 73 69 6f 6e   /* The decision
14370 20 6f 66 20 77 68 65 74 68 65 72 20 6f 72 20 6e   of whether or n
14380 6f 74 20 61 20 72 6f 77 69 64 20 72 65 61 6c 6c  ot a rowid reall
14390 79 20 6e 65 65 64 73 20 74 6f 20 62 65 20 70 72  y needs to be pr
143a0 65 73 65 72 76 65 64 0a 20 20 2a 2a 20 69 73 20  eserved.  ** is 
143b0 74 72 69 63 6b 79 2e 20 20 57 65 20 6e 65 76 65  tricky.  We neve
143c0 72 20 6e 65 65 64 20 74 6f 20 70 72 65 73 65 72  r need to preser
143d0 76 65 20 61 20 72 6f 77 69 64 20 66 6f 72 20 61  ve a rowid for a
143e0 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20 74   WITHOUT ROWID t
143f0 61 62 6c 65 0a 20 20 2a 2a 20 6f 72 20 61 20 74  able.  ** or a t
14400 61 62 6c 65 20 77 69 74 68 20 61 6e 20 49 4e 54  able with an INT
14410 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
14420 2e 20 20 57 65 20 61 72 65 20 75 6e 61 62 6c 65  .  We are unable
14430 20 74 6f 20 70 72 65 73 65 72 76 65 0a 20 20 2a   to preserve.  *
14440 2a 20 72 6f 77 69 64 73 20 6f 6e 20 74 61 62 6c  * rowids on tabl
14450 65 73 20 77 68 65 72 65 20 74 68 65 20 72 6f 77  es where the row
14460 69 64 20 69 73 20 69 6e 61 63 63 65 73 73 69 62  id is inaccessib
14470 6c 65 20 62 65 63 61 75 73 65 20 74 68 65 72 65  le because there
14480 20 61 72 65 20 6f 74 68 65 72 0a 20 20 2a 2a 20   are other.  ** 
14490 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74  columns in the t
144a0 61 62 6c 65 20 6e 61 6d 65 64 20 22 72 6f 77 69  able named "rowi
144b0 64 22 2c 20 22 5f 72 6f 77 69 64 5f 22 2c 20 61  d", "_rowid_", a
144c0 6e 64 20 22 6f 69 64 22 2e 0a 20 20 2a 2f 0a 20  nd "oid"..  */. 
144d0 20 69 66 28 20 70 72 65 73 65 72 76 65 52 6f 77   if( preserveRow
144e0 69 64 20 26 26 20 69 73 49 50 4b 20 29 7b 0a 20  id && isIPK ){. 
144f0 20 20 20 2f 2a 20 49 66 20 61 20 73 69 6e 67 6c     /* If a singl
14500 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f  e PRIMARY KEY co
14510 6c 75 6d 6e 20 77 69 74 68 20 74 79 70 65 20 49  lumn with type I
14520 4e 54 45 47 45 52 20 77 61 73 20 73 65 65 6e 2c  NTEGER was seen,
14530 20 74 68 65 6e 20 69 74 0a 20 20 20 20 2a 2a 20   then it.    ** 
14540 6d 69 67 68 74 20 62 65 20 61 6e 20 61 6c 69 73  might be an alis
14550 65 20 66 6f 72 20 74 68 65 20 52 4f 57 49 44 2e  e for the ROWID.
14560 20 20 42 75 74 20 69 74 20 6d 69 67 68 74 20 61    But it might a
14570 6c 73 6f 20 62 65 20 61 20 57 49 54 48 4f 55 54  lso be a WITHOUT
14580 20 52 4f 57 49 44 0a 20 20 20 20 2a 2a 20 74 61   ROWID.    ** ta
14590 62 6c 65 20 6f 72 20 61 20 49 4e 54 45 47 45 52  ble or a INTEGER
145a0 20 50 52 49 4d 41 52 59 20 4b 45 59 20 44 45 53   PRIMARY KEY DES
145b0 43 20 63 6f 6c 75 6d 6e 2c 20 6e 65 69 74 68 65  C column, neithe
145c0 72 20 6f 66 20 77 68 69 63 68 20 61 72 65 0a 20  r of which are. 
145d0 20 20 20 2a 2a 20 52 4f 57 49 44 20 61 6c 69 61     ** ROWID alia
145e0 73 65 73 2e 20 20 54 6f 20 64 69 73 74 69 6e 67  ses.  To disting
145f0 75 69 73 68 20 74 68 65 73 65 20 63 61 73 65 73  uish these cases
14600 2c 20 63 68 65 63 6b 20 74 6f 20 73 65 65 20 69  , check to see i
14610 66 0a 20 20 20 20 2a 2a 20 74 68 65 72 65 20 69  f.    ** there i
14620 73 20 61 20 22 70 6b 22 20 65 6e 74 72 79 20 69  s a "pk" entry i
14630 6e 20 22 50 52 41 47 4d 41 20 69 6e 64 65 78 5f  n "PRAGMA index_
14640 6c 69 73 74 22 2e 20 20 54 68 65 72 65 20 77 69  list".  There wi
14650 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 6e 6f 20  ll be.    ** no 
14660 22 70 6b 22 20 69 6e 64 65 78 20 69 66 20 74 68  "pk" index if th
14670 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 72 65  e PRIMARY KEY re
14680 61 6c 6c 79 20 69 73 20 61 6e 20 61 6c 69 61 73  ally is an alias
14690 20 66 6f 72 20 74 68 65 20 52 4f 57 49 44 2e 0a   for the ROWID..
146a0 20 20 20 20 2a 2f 0a 20 20 20 20 7a 53 71 6c 20      */.    zSql 
146b0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
146c0 66 28 22 53 45 4c 45 43 54 20 31 20 46 52 4f 4d  f("SELECT 1 FROM
146d0 20 70 72 61 67 6d 61 5f 69 6e 64 65 78 5f 6c 69   pragma_index_li
146e0 73 74 28 25 51 29 22 0a 20 20 20 20 20 20 20 20  st(%Q)".        
146f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14700 20 20 20 22 20 57 48 45 52 45 20 6f 72 69 67 69     " WHERE origi
14710 6e 3d 27 70 6b 27 22 2c 20 7a 54 61 62 29 3b 0a  n='pk'", zTab);.
14720 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
14730 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
14740 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
14750 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  tmt, 0);.    sql
14760 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
14770 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
14780 20 20 20 20 20 66 72 65 65 43 6f 6c 75 6d 6e 4c       freeColumnL
14790 69 73 74 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20  ist(azCol);.    
147a0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
147b0 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  }.    rc = sqlit
147c0 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a  e3_step(pStmt);.
147d0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
147e0 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
147f0 20 70 72 65 73 65 72 76 65 52 6f 77 69 64 20 3d   preserveRowid =
14800 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 3b   rc==SQLITE_ROW;
14810 0a 20 20 7d 0a 20 20 69 66 28 20 70 72 65 73 65  .  }.  if( prese
14820 72 76 65 52 6f 77 69 64 20 29 7b 0a 20 20 20 20  rveRowid ){.    
14830 2f 2a 20 4f 6e 6c 79 20 70 72 65 73 65 72 76 65  /* Only preserve
14840 20 74 68 65 20 72 6f 77 69 64 20 69 66 20 77 65   the rowid if we
14850 20 63 61 6e 20 66 69 6e 64 20 61 20 6e 61 6d 65   can find a name
14860 20 74 6f 20 75 73 65 20 66 6f 72 20 74 68 65 0a   to use for the.
14870 20 20 20 20 2a 2a 20 72 6f 77 69 64 20 2a 2f 0a      ** rowid */.
14880 20 20 20 20 73 74 61 74 69 63 20 63 68 61 72 20      static char 
14890 2a 61 7a 52 6f 77 69 64 5b 5d 20 3d 20 7b 20 22  *azRowid[] = { "
148a0 72 6f 77 69 64 22 2c 20 22 5f 72 6f 77 69 64 5f  rowid", "_rowid_
148b0 22 2c 20 22 6f 69 64 22 20 7d 3b 0a 20 20 20 20  ", "oid" };.    
148c0 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 66 6f  int i, j;.    fo
148d0 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a 2b 2b 29  r(j=0; j<3; j++)
148e0 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b  {.      for(i=1;
148f0 20 69 3c 3d 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a   i<=nCol; i++){.
14900 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
14910 74 65 33 5f 73 74 72 69 63 6d 70 28 61 7a 52 6f  te3_stricmp(azRo
14920 77 69 64 5b 6a 5d 2c 61 7a 43 6f 6c 5b 69 5d 29  wid[j],azCol[i])
14930 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
14940 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
14950 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20  >nCol ){.       
14960 20 2f 2a 20 41 74 20 74 68 69 73 20 70 6f 69 6e   /* At this poin
14970 74 2c 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  t, we know that 
14980 61 7a 52 6f 77 69 64 5b 6a 5d 20 69 73 20 6e 6f  azRowid[j] is no
14990 74 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 6e  t the name of an
149a0 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 72 64  y.        ** ord
149b0 69 6e 61 72 79 20 63 6f 6c 75 6d 6e 20 69 6e 20  inary column in 
149c0 74 68 65 20 74 61 62 6c 65 2e 20 20 56 65 72 69  the table.  Veri
149d0 66 79 20 74 68 61 74 20 61 7a 52 6f 77 69 64 5b  fy that azRowid[
149e0 6a 5d 20 69 73 20 61 20 76 61 6c 69 64 0a 20 20  j] is a valid.  
149f0 20 20 20 20 20 20 2a 2a 20 6e 61 6d 65 20 66 6f        ** name fo
14a00 72 20 74 68 65 20 72 6f 77 69 64 20 62 65 66 6f  r the rowid befo
14a10 72 65 20 61 64 64 69 6e 67 20 69 74 20 74 6f 20  re adding it to 
14a20 61 7a 43 6f 6c 5b 30 5d 2e 20 20 57 49 54 48 4f  azCol[0].  WITHO
14a30 55 54 20 52 4f 57 49 44 0a 20 20 20 20 20 20 20  UT ROWID.       
14a40 20 2a 2a 20 74 61 62 6c 65 73 20 77 69 6c 6c 20   ** tables will 
14a50 66 61 69 6c 20 74 68 69 73 20 6c 61 73 74 20 63  fail this last c
14a60 68 65 63 6b 20 2a 2f 0a 20 20 20 20 20 20 20 20  heck */.        
14a70 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61 62  rc = sqlite3_tab
14a80 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
14a90 74 61 28 70 2d 3e 64 62 2c 30 2c 7a 54 61 62 2c  ta(p->db,0,zTab,
14aa0 61 7a 52 6f 77 69 64 5b 6a 5d 2c 30 2c 30 2c 30  azRowid[j],0,0,0
14ab0 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 69  ,0,0);.        i
14ac0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
14ad0 20 29 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 61 7a   ) azCol[0] = az
14ae0 52 6f 77 69 64 5b 6a 5d 3b 0a 20 20 20 20 20 20  Rowid[j];.      
14af0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
14b00 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
14b10 75 72 6e 20 61 7a 43 6f 6c 3b 0a 7d 0a 0a 2f 2a  urn azCol;.}../*
14b20 0a 2a 2a 20 54 6f 67 67 6c 65 20 74 68 65 20 72  .** Toggle the r
14b30 65 76 65 72 73 65 5f 75 6e 6f 72 64 65 72 65 64  everse_unordered
14b40 5f 73 65 6c 65 63 74 73 20 73 65 74 74 69 6e 67  _selects setting
14b50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
14b60 20 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f 72 64   toggleSelectOrd
14b70 65 72 28 73 71 6c 69 74 65 33 20 2a 64 62 29 7b  er(sqlite3 *db){
14b80 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
14b90 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 6e  *pStmt = 0;.  in
14ba0 74 20 69 53 65 74 74 69 6e 67 20 3d 20 30 3b 0a  t iSetting = 0;.
14bb0 20 20 63 68 61 72 20 7a 53 74 6d 74 5b 31 30 30    char zStmt[100
14bc0 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65  ];.  sqlite3_pre
14bd0 70 61 72 65 5f 76 32 28 64 62 2c 20 22 50 52 41  pare_v2(db, "PRA
14be0 47 4d 41 20 72 65 76 65 72 73 65 5f 75 6e 6f 72  GMA reverse_unor
14bf0 64 65 72 65 64 5f 73 65 6c 65 63 74 73 22 2c 20  dered_selects", 
14c00 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
14c10 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
14c20 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
14c30 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 69 53 65  E_ROW ){.    iSe
14c40 74 74 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 5f  tting = sqlite3_
14c50 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74  column_int(pStmt
14c60 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  , 0);.  }.  sqli
14c70 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
14c80 6d 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 73  mt);.  sqlite3_s
14c90 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
14ca0 53 74 6d 74 29 2c 20 7a 53 74 6d 74 2c 0a 20 20  Stmt), zStmt,.  
14cb0 20 20 20 20 20 22 50 52 41 47 4d 41 20 72 65 76       "PRAGMA rev
14cc0 65 72 73 65 5f 75 6e 6f 72 64 65 72 65 64 5f 73  erse_unordered_s
14cd0 65 6c 65 63 74 73 28 25 64 29 22 2c 20 21 69 53  elects(%d)", !iS
14ce0 65 74 74 69 6e 67 29 3b 0a 20 20 73 71 6c 69 74  etting);.  sqlit
14cf0 65 33 5f 65 78 65 63 28 64 62 2c 20 7a 53 74 6d  e3_exec(db, zStm
14d00 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 7d 0a 0a  t, 0, 0, 0);.}..
14d10 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61 20  /*.** This is a 
14d20 64 69 66 66 65 72 65 6e 74 20 63 61 6c 6c 62 61  different callba
14d30 63 6b 20 72 6f 75 74 69 6e 65 20 75 73 65 64 20  ck routine used 
14d40 66 6f 72 20 64 75 6d 70 69 6e 67 20 74 68 65 20  for dumping the 
14d50 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20 45 61 63  database..** Eac
14d60 68 20 72 6f 77 20 72 65 63 65 69 76 65 64 20 62  h row received b
14d70 79 20 74 68 69 73 20 63 61 6c 6c 62 61 63 6b 20  y this callback 
14d80 63 6f 6e 73 69 73 74 73 20 6f 66 20 61 20 74 61  consists of a ta
14d90 62 6c 65 20 6e 61 6d 65 2c 0a 2a 2a 20 74 68 65  ble name,.** the
14da0 20 74 61 62 6c 65 20 74 79 70 65 20 28 22 69 6e   table type ("in
14db0 64 65 78 22 20 6f 72 20 22 74 61 62 6c 65 22 29  dex" or "table")
14dc0 20 61 6e 64 20 53 51 4c 20 74 6f 20 63 72 65 61   and SQL to crea
14dd0 74 65 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a  te the table..**
14de0 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
14df0 6f 75 6c 64 20 70 72 69 6e 74 20 74 65 78 74 20  ould print text 
14e00 73 75 66 66 69 63 69 65 6e 74 20 74 6f 20 72 65  sufficient to re
14e10 63 72 65 61 74 65 20 74 68 65 20 74 61 62 6c 65  create the table
14e20 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
14e30 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 28 76 6f  dump_callback(vo
14e40 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41  id *pArg, int nA
14e50 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67  rg, char **azArg
14e60 2c 20 63 68 61 72 20 2a 2a 61 7a 4e 6f 74 55 73  , char **azNotUs
14e70 65 64 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ed){.  int rc;. 
14e80 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
14e90 62 6c 65 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ble;.  const cha
14ea0 72 20 2a 7a 54 79 70 65 3b 0a 20 20 63 6f 6e 73  r *zType;.  cons
14eb0 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20  t char *zSql;.  
14ec0 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20  ShellState *p = 
14ed0 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 29 70 41  (ShellState *)pA
14ee0 72 67 3b 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41  rg;..  UNUSED_PA
14ef0 52 41 4d 45 54 45 52 28 61 7a 4e 6f 74 55 73 65  RAMETER(azNotUse
14f00 64 29 3b 0a 20 20 69 66 28 20 6e 41 72 67 21 3d  d);.  if( nArg!=
14f10 33 20 7c 7c 20 61 7a 41 72 67 3d 3d 30 20 29 20  3 || azArg==0 ) 
14f20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 54 61 62  return 0;.  zTab
14f30 6c 65 20 3d 20 61 7a 41 72 67 5b 30 5d 3b 0a 20  le = azArg[0];. 
14f40 20 7a 54 79 70 65 20 3d 20 61 7a 41 72 67 5b 31   zType = azArg[1
14f50 5d 3b 0a 20 20 7a 53 71 6c 20 3d 20 61 7a 41 72  ];.  zSql = azAr
14f60 67 5b 32 5d 3b 0a 0a 20 20 69 66 28 20 73 74 72  g[2];..  if( str
14f70 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c  cmp(zTable, "sql
14f80 69 74 65 5f 73 65 71 75 65 6e 63 65 22 29 3d 3d  ite_sequence")==
14f90 30 20 29 7b 0a 20 20 20 20 72 61 77 5f 70 72 69  0 ){.    raw_pri
14fa0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 44 45 4c  ntf(p->out, "DEL
14fb0 45 54 45 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  ETE FROM sqlite_
14fc0 73 65 71 75 65 6e 63 65 3b 5c 6e 22 29 3b 0a 20  sequence;\n");. 
14fd0 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
14fe0 65 33 5f 73 74 72 67 6c 6f 62 28 22 73 71 6c 69  e3_strglob("sqli
14ff0 74 65 5f 73 74 61 74 3f 22 2c 20 7a 54 61 62 6c  te_stat?", zTabl
15000 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61 77  e)==0 ){.    raw
15010 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
15020 22 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f  "ANALYZE sqlite_
15030 6d 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20 20 7d  master;\n");.  }
15040 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70  else if( strncmp
15050 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c 69 74 65  (zTable, "sqlite
15060 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a 20 20 20  _", 7)==0 ){.   
15070 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c   return 0;.  }el
15080 73 65 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a  se if( strncmp(z
15090 53 71 6c 2c 20 22 43 52 45 41 54 45 20 56 49 52  Sql, "CREATE VIR
150a0 54 55 41 4c 20 54 41 42 4c 45 22 2c 20 32 30 29  TUAL TABLE", 20)
150b0 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==0 ){.    char 
150c0 2a 7a 49 6e 73 3b 0a 20 20 20 20 69 66 28 20 21  *zIns;.    if( !
150d0 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d  p->writableSchem
150e0 61 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  a ){.      raw_p
150f0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50  rintf(p->out, "P
15100 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f 73  RAGMA writable_s
15110 63 68 65 6d 61 3d 4f 4e 3b 5c 6e 22 29 3b 0a 20  chema=ON;\n");. 
15120 20 20 20 20 20 70 2d 3e 77 72 69 74 61 62 6c 65       p->writable
15130 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20  Schema = 1;.    
15140 7d 0a 20 20 20 20 7a 49 6e 73 20 3d 20 73 71 6c  }.    zIns = sql
15150 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
15160 20 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54       "INSERT INT
15170 4f 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 28  O sqlite_master(
15180 74 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61  type,name,tbl_na
15190 6d 65 2c 72 6f 6f 74 70 61 67 65 2c 73 71 6c 29  me,rootpage,sql)
151a0 22 0a 20 20 20 20 20 20 20 22 56 41 4c 55 45 53  ".       "VALUES
151b0 28 27 74 61 62 6c 65 27 2c 27 25 71 27 2c 27 25  ('table','%q','%
151c0 71 27 2c 30 2c 27 25 71 27 29 3b 22 2c 0a 20 20  q',0,'%q');",.  
151d0 20 20 20 20 20 7a 54 61 62 6c 65 2c 20 7a 54 61       zTable, zTa
151e0 62 6c 65 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20  ble, zSql);.    
151f0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
15200 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 49 6e 73  ut, "%s\n", zIns
15210 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
15220 72 65 65 28 7a 49 6e 73 29 3b 0a 20 20 20 20 72  ree(zIns);.    r
15230 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65 6c 73 65  eturn 0;.  }else
15240 7b 0a 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d  {.    printSchem
15250 61 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20 7a 53  aLine(p->out, zS
15260 71 6c 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 7d 0a  ql, ";\n");.  }.
15270 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54  .  if( strcmp(zT
15280 79 70 65 2c 20 22 74 61 62 6c 65 22 29 3d 3d 30  ype, "table")==0
15290 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c 54 65 78   ){.    ShellTex
152a0 74 20 73 53 65 6c 65 63 74 3b 0a 20 20 20 20 53  t sSelect;.    S
152b0 68 65 6c 6c 54 65 78 74 20 73 54 61 62 6c 65 3b  hellText sTable;
152c0 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f  .    char **azCo
152d0 6c 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  l;.    int i;.  
152e0 20 20 63 68 61 72 20 2a 73 61 76 65 64 44 65 73    char *savedDes
152f0 74 54 61 62 6c 65 3b 0a 20 20 20 20 69 6e 74 20  tTable;.    int 
15300 73 61 76 65 64 4d 6f 64 65 3b 0a 0a 20 20 20 20  savedMode;..    
15310 61 7a 43 6f 6c 20 3d 20 74 61 62 6c 65 43 6f 6c  azCol = tableCol
15320 75 6d 6e 4c 69 73 74 28 70 2c 20 7a 54 61 62 6c  umnList(p, zTabl
15330 65 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 43 6f  e);.    if( azCo
15340 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  l==0 ){.      p-
15350 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72  >nErr++;.      r
15360 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 0a  eturn 0;.    }..
15370 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 71 75      /* Always qu
15380 6f 74 65 20 74 68 65 20 74 61 62 6c 65 20 6e 61  ote the table na
15390 6d 65 2c 20 65 76 65 6e 20 69 66 20 69 74 20 61  me, even if it a
153a0 70 70 65 61 72 73 20 74 6f 20 62 65 20 70 75 72  ppears to be pur
153b0 65 20 61 73 63 69 69 2c 0a 20 20 20 20 2a 2a 20  e ascii,.    ** 
153c0 69 6e 20 63 61 73 65 20 69 74 20 69 73 20 61 20  in case it is a 
153d0 6b 65 79 77 6f 72 64 2e 20 45 78 3a 20 20 49 4e  keyword. Ex:  IN
153e0 53 45 52 54 20 49 4e 54 4f 20 22 74 61 62 6c 65  SERT INTO "table
153f0 22 20 2e 2e 2e 20 2a 2f 0a 20 20 20 20 69 6e 69  " ... */.    ini
15400 74 54 65 78 74 28 26 73 54 61 62 6c 65 29 3b 0a  tText(&sTable);.
15410 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
15420 73 54 61 62 6c 65 2c 20 7a 54 61 62 6c 65 2c 20  sTable, zTable, 
15430 71 75 6f 74 65 43 68 61 72 28 7a 54 61 62 6c 65  quoteChar(zTable
15440 29 29 3b 0a 20 20 20 20 2f 2a 20 49 66 20 70 72  ));.    /* If pr
15450 65 73 65 72 76 69 6e 67 20 74 68 65 20 72 6f 77  eserving the row
15460 69 64 2c 20 61 64 64 20 61 20 63 6f 6c 75 6d 6e  id, add a column
15470 20 6c 69 73 74 20 61 66 74 65 72 20 74 68 65 20   list after the 
15480 74 61 62 6c 65 20 6e 61 6d 65 2e 0a 20 20 20 20  table name..    
15490 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64  ** In other word
154a0 73 3a 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f  s:  "INSERT INTO
154b0 20 74 61 62 28 72 6f 77 69 64 2c 61 2c 62 2c 63   tab(rowid,a,b,c
154c0 2c 2e 2e 2e 29 20 56 41 4c 55 45 53 28 2e 2e 2e  ,...) VALUES(...
154d0 29 22 0a 20 20 20 20 2a 2a 20 69 6e 73 74 65 61  )".    ** instea
154e0 64 20 6f 66 20 74 68 65 20 75 73 75 61 6c 20 22  d of the usual "
154f0 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 61 62 20  INSERT INTO tab 
15500 56 41 4c 55 45 53 28 2e 2e 2e 29 22 2e 0a 20 20  VALUES(...)"..  
15510 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 7a 43    */.    if( azC
15520 6f 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20 61  ol[0] ){.      a
15530 70 70 65 6e 64 54 65 78 74 28 26 73 54 61 62 6c  ppendText(&sTabl
15540 65 2c 20 22 28 22 2c 20 30 29 3b 0a 20 20 20 20  e, "(", 0);.    
15550 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 54    appendText(&sT
15560 61 62 6c 65 2c 20 61 7a 43 6f 6c 5b 30 5d 2c 20  able, azCol[0], 
15570 30 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  0);.      for(i=
15580 31 3b 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b  1; azCol[i]; i++
15590 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  ){.        appen
155a0 64 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20 22  dText(&sTable, "
155b0 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ,", 0);.        
155c0 61 70 70 65 6e 64 54 65 78 74 28 26 73 54 61 62  appendText(&sTab
155d0 6c 65 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 71 75  le, azCol[i], qu
155e0 6f 74 65 43 68 61 72 28 61 7a 43 6f 6c 5b 69 5d  oteChar(azCol[i]
155f0 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
15600 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 54    appendText(&sT
15610 61 62 6c 65 2c 20 22 29 22 2c 20 30 29 3b 0a 20  able, ")", 0);. 
15620 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 42 75 69     }..    /* Bui
15630 6c 64 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  ld an appropriat
15640 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
15650 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 69 74 54 65  nt */.    initTe
15660 78 74 28 26 73 53 65 6c 65 63 74 29 3b 0a 20 20  xt(&sSelect);.  
15670 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
15680 65 6c 65 63 74 2c 20 22 53 45 4c 45 43 54 20 22  elect, "SELECT "
15690 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 61 7a  , 0);.    if( az
156a0 43 6f 6c 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  Col[0] ){.      
156b0 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
156c0 65 63 74 2c 20 61 7a 43 6f 6c 5b 30 5d 2c 20 30  ect, azCol[0], 0
156d0 29 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54  );.      appendT
156e0 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 2c  ext(&sSelect, ",
156f0 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ", 0);.    }.   
15700 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b   for(i=1; azCol[
15710 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
15720 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
15730 65 63 74 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 20 71  ect, azCol[i], q
15740 75 6f 74 65 43 68 61 72 28 61 7a 43 6f 6c 5b 69  uoteChar(azCol[i
15750 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  ]));.      if( a
15760 7a 43 6f 6c 5b 69 2b 31 5d 20 29 7b 0a 20 20 20  zCol[i+1] ){.   
15770 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
15780 26 73 53 65 6c 65 63 74 2c 20 22 2c 22 2c 20 30  &sSelect, ",", 0
15790 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
157a0 0a 20 20 20 20 66 72 65 65 43 6f 6c 75 6d 6e 4c  .    freeColumnL
157b0 69 73 74 28 61 7a 43 6f 6c 29 3b 0a 20 20 20 20  ist(azCol);.    
157c0 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
157d0 65 63 74 2c 20 22 20 46 52 4f 4d 20 22 2c 20 30  ect, " FROM ", 0
157e0 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78  );.    appendTex
157f0 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 54 61 62  t(&sSelect, zTab
15800 6c 65 2c 20 71 75 6f 74 65 43 68 61 72 28 7a 54  le, quoteChar(zT
15810 61 62 6c 65 29 29 3b 0a 0a 20 20 20 20 73 61 76  able));..    sav
15820 65 64 44 65 73 74 54 61 62 6c 65 20 3d 20 70 2d  edDestTable = p-
15830 3e 7a 44 65 73 74 54 61 62 6c 65 3b 0a 20 20 20  >zDestTable;.   
15840 20 73 61 76 65 64 4d 6f 64 65 20 3d 20 70 2d 3e   savedMode = p->
15850 6d 6f 64 65 3b 0a 20 20 20 20 70 2d 3e 7a 44 65  mode;.    p->zDe
15860 73 74 54 61 62 6c 65 20 3d 20 73 54 61 62 6c 65  stTable = sTable
15870 2e 7a 3b 0a 20 20 20 20 70 2d 3e 6d 6f 64 65 20  .z;.    p->mode 
15880 3d 20 70 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f 44  = p->cMode = MOD
15890 45 5f 49 6e 73 65 72 74 3b 0a 20 20 20 20 72 63  E_Insert;.    rc
158a0 20 3d 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2d   = shell_exec(p-
158b0 3e 64 62 2c 20 73 53 65 6c 65 63 74 2e 7a 2c 20  >db, sSelect.z, 
158c0 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20  shell_callback, 
158d0 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 28  p, 0);.    if( (
158e0 72 63 26 30 78 66 66 29 3d 3d 53 51 4c 49 54 45  rc&0xff)==SQLITE
158f0 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20 20 20 20  _CORRUPT ){.    
15900 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
15910 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f  out, "/****** CO
15920 52 52 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a  RRUPTION ERROR *
15930 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20  ******/\n");.   
15940 20 20 20 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f     toggleSelectO
15950 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20 20  rder(p->db);.   
15960 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2d     shell_exec(p-
15970 3e 64 62 2c 20 73 53 65 6c 65 63 74 2e 7a 2c 20  >db, sSelect.z, 
15980 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20  shell_callback, 
15990 70 2c 20 30 29 3b 0a 20 20 20 20 20 20 74 6f 67  p, 0);.      tog
159a0 67 6c 65 53 65 6c 65 63 74 4f 72 64 65 72 28 70  gleSelectOrder(p
159b0 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 20  ->db);.    }.   
159c0 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d   p->zDestTable =
159d0 20 73 61 76 65 64 44 65 73 74 54 61 62 6c 65 3b   savedDestTable;
159e0 0a 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 73  .    p->mode = s
159f0 61 76 65 64 4d 6f 64 65 3b 0a 20 20 20 20 66 72  avedMode;.    fr
15a00 65 65 54 65 78 74 28 26 73 54 61 62 6c 65 29 3b  eeText(&sTable);
15a10 0a 20 20 20 20 66 72 65 65 54 65 78 74 28 26 73  .    freeText(&s
15a20 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 69 66 28  Select);.    if(
15a30 20 72 63 20 29 20 70 2d 3e 6e 45 72 72 2b 2b 3b   rc ) p->nErr++;
15a40 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
15a50 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e 20 7a 51  .}../*.** Run zQ
15a60 75 65 72 79 2e 20 20 55 73 65 20 64 75 6d 70 5f  uery.  Use dump_
15a70 63 61 6c 6c 62 61 63 6b 28 29 20 61 73 20 74 68  callback() as th
15a80 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69  e callback routi
15a90 6e 65 20 73 6f 20 74 68 61 74 0a 2a 2a 20 74 68  ne so that.** th
15aa0 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 74 68  e contents of th
15ab0 65 20 71 75 65 72 79 20 61 72 65 20 6f 75 74 70  e query are outp
15ac0 75 74 20 61 73 20 53 51 4c 20 73 74 61 74 65 6d  ut as SQL statem
15ad0 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 77  ents..**.** If w
15ae0 65 20 67 65 74 20 61 20 53 51 4c 49 54 45 5f 43  e get a SQLITE_C
15af0 4f 52 52 55 50 54 20 65 72 72 6f 72 2c 20 72 65  ORRUPT error, re
15b00 72 75 6e 20 74 68 65 20 71 75 65 72 79 20 61 66  run the query af
15b10 74 65 72 20 61 70 70 65 6e 64 69 6e 67 0a 2a 2a  ter appending.**
15b20 20 22 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64   "ORDER BY rowid
15b30 20 44 45 53 43 22 20 74 6f 20 74 68 65 20 65 6e   DESC" to the en
15b40 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
15b50 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70   run_schema_dump
15b60 5f 71 75 65 72 79 28 0a 20 20 53 68 65 6c 6c 53  _query(.  ShellS
15b70 74 61 74 65 20 2a 70 2c 0a 20 20 63 6f 6e 73 74  tate *p,.  const
15b80 20 63 68 61 72 20 2a 7a 51 75 65 72 79 0a 29 7b   char *zQuery.){
15b90 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 68 61  .  int rc;.  cha
15ba0 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a 20 20 72  r *zErr = 0;.  r
15bb0 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
15bc0 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20  (p->db, zQuery, 
15bd0 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 2c 20 70  dump_callback, p
15be0 2c 20 26 7a 45 72 72 29 3b 0a 20 20 69 66 28 20  , &zErr);.  if( 
15bf0 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  rc==SQLITE_CORRU
15c00 50 54 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  PT ){.    char *
15c10 7a 51 32 3b 0a 20 20 20 20 69 6e 74 20 6c 65 6e  zQ2;.    int len
15c20 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 51 75 65   = strlen30(zQue
15c30 72 79 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69  ry);.    raw_pri
15c40 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a  ntf(p->out, "/**
15c50 2a 2a 2a 2a 20 43 4f 52 52 55 50 54 49 4f 4e 20  **** CORRUPTION 
15c60 45 52 52 4f 52 20 2a 2a 2a 2a 2a 2a 2a 2f 5c 6e  ERROR *******/\n
15c70 22 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 72 72  ");.    if( zErr
15c80 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
15c90 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f  rintf(p->out, "/
15ca0 2a 2a 2a 2a 2a 2a 20 25 73 20 2a 2a 2a 2a 2a 2a  ****** %s ******
15cb0 2f 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20  /\n", zErr);.   
15cc0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
15cd0 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 7a 45 72  zErr);.      zEr
15ce0 72 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  r = 0;.    }.   
15cf0 20 7a 51 32 20 3d 20 6d 61 6c 6c 6f 63 28 20 6c   zQ2 = malloc( l
15d00 65 6e 2b 31 30 30 20 29 3b 0a 20 20 20 20 69 66  en+100 );.    if
15d10 28 20 7a 51 32 3d 3d 30 20 29 20 72 65 74 75 72  ( zQ2==0 ) retur
15d20 6e 20 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65  n rc;.    sqlite
15d30 33 5f 73 6e 70 72 69 6e 74 66 28 6c 65 6e 2b 31  3_snprintf(len+1
15d40 30 30 2c 20 7a 51 32 2c 20 22 25 73 20 4f 52 44  00, zQ2, "%s ORD
15d50 45 52 20 42 59 20 72 6f 77 69 64 20 44 45 53 43  ER BY rowid DESC
15d60 22 2c 20 7a 51 75 65 72 79 29 3b 0a 20 20 20 20  ", zQuery);.    
15d70 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
15d80 63 28 70 2d 3e 64 62 2c 20 7a 51 32 2c 20 64 75  c(p->db, zQ2, du
15d90 6d 70 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2c 20  mp_callback, p, 
15da0 26 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20  &zErr);.    if( 
15db0 72 63 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  rc ){.      utf8
15dc0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
15dd0 22 2f 2a 2a 2a 2a 2a 2a 20 45 52 52 4f 52 3a 20  "/****** ERROR: 
15de0 25 73 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 7a  %s ******/\n", z
15df0 45 72 72 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Err);.    }else{
15e00 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49  .      rc = SQLI
15e10 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20 20 20 20  TE_CORRUPT;.    
15e20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
15e30 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 66 72  ee(zErr);.    fr
15e40 65 65 28 7a 51 32 29 3b 0a 20 20 7d 0a 20 20 72  ee(zQ2);.  }.  r
15e50 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
15e60 2a 2a 20 54 65 78 74 20 6f 66 20 61 20 68 65 6c  ** Text of a hel
15e70 70 20 6d 65 73 73 61 67 65 0a 2a 2f 0a 73 74 61  p message.*/.sta
15e80 74 69 63 20 63 68 61 72 20 7a 48 65 6c 70 5b 5d  tic char zHelp[]
15e90 20 3d 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53   =.#if defined(S
15ea0 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 29  QLITE_HAVE_ZLIB)
15eb0 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c   && !defined(SQL
15ec0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
15ed0 54 41 42 4c 45 29 0a 20 20 22 2e 61 72 63 68 69  TABLE).  ".archi
15ee0 76 65 20 2e 2e 2e 20 20 20 20 20 20 20 20 20 20  ve ...          
15ef0 20 4d 61 6e 61 67 65 20 53 51 4c 20 61 72 63 68   Manage SQL arch
15f00 69 76 65 73 3a 20 5c 22 2e 61 72 63 68 69 76 65  ives: \".archive
15f10 20 2d 2d 68 65 6c 70 5c 22 20 66 6f 72 20 64 65   --help\" for de
15f20 74 61 69 6c 73 5c 6e 22 0a 23 65 6e 64 69 66 0a  tails\n".#endif.
15f30 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
15f40 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
15f50 4e 0a 20 20 22 2e 61 75 74 68 20 4f 4e 7c 4f 46  N.  ".auth ON|OF
15f60 46 20 20 20 20 20 20 20 20 20 20 20 53 68 6f 77  F           Show
15f70 20 61 75 74 68 6f 72 69 7a 65 72 20 63 61 6c 6c   authorizer call
15f80 62 61 63 6b 73 5c 6e 22 0a 23 65 6e 64 69 66 0a  backs\n".#endif.
15f90 20 20 22 2e 62 61 63 6b 75 70 20 3f 44 42 3f 20    ".backup ?DB? 
15fa0 46 49 4c 45 20 20 20 20 20 20 42 61 63 6b 75 70  FILE      Backup
15fb0 20 44 42 20 28 64 65 66 61 75 6c 74 20 5c 22 6d   DB (default \"m
15fc0 61 69 6e 5c 22 29 20 74 6f 20 46 49 4c 45 5c 6e  ain\") to FILE\n
15fd0 22 0a 20 20 22 2e 62 61 69 6c 20 6f 6e 7c 6f 66  ".  ".bail on|of
15fe0 66 20 20 20 20 20 20 20 20 20 20 20 53 74 6f 70  f           Stop
15ff0 20 61 66 74 65 72 20 68 69 74 74 69 6e 67 20 61   after hitting a
16000 6e 20 65 72 72 6f 72 2e 20 20 44 65 66 61 75 6c  n error.  Defaul
16010 74 20 4f 46 46 5c 6e 22 0a 20 20 22 2e 62 69 6e  t OFF\n".  ".bin
16020 61 72 79 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20  ary on|off      
16030 20 20 20 54 75 72 6e 20 62 69 6e 61 72 79 20 6f     Turn binary o
16040 75 74 70 75 74 20 6f 6e 20 6f 72 20 6f 66 66 2e  utput on or off.
16050 20 20 44 65 66 61 75 6c 74 20 4f 46 46 5c 6e 22    Default OFF\n"
16060 0a 20 20 22 2e 63 64 20 44 49 52 45 43 54 4f 52  .  ".cd DIRECTOR
16070 59 20 20 20 20 20 20 20 20 20 20 43 68 61 6e 67  Y          Chang
16080 65 20 74 68 65 20 77 6f 72 6b 69 6e 67 20 64 69  e the working di
16090 72 65 63 74 6f 72 79 20 74 6f 20 44 49 52 45 43  rectory to DIREC
160a0 54 4f 52 59 5c 6e 22 0a 20 20 22 2e 63 68 61 6e  TORY\n".  ".chan
160b0 67 65 73 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20  ges on|off      
160c0 20 20 53 68 6f 77 20 6e 75 6d 62 65 72 20 6f 66    Show number of
160d0 20 72 6f 77 73 20 63 68 61 6e 67 65 64 20 62 79   rows changed by
160e0 20 53 51 4c 5c 6e 22 0a 20 20 22 2e 63 68 65 63   SQL\n".  ".chec
160f0 6b 20 47 4c 4f 42 20 20 20 20 20 20 20 20 20 20  k GLOB          
16100 20 20 46 61 69 6c 20 69 66 20 6f 75 74 70 75 74    Fail if output
16110 20 73 69 6e 63 65 20 2e 74 65 73 74 63 61 73 65   since .testcase
16120 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 5c   does not match\
16130 6e 22 0a 20 20 22 2e 63 6c 6f 6e 65 20 4e 45 57  n".  ".clone NEW
16140 44 42 20 20 20 20 20 20 20 20 20 20 20 43 6c 6f  DB           Clo
16150 6e 65 20 64 61 74 61 20 69 6e 74 6f 20 4e 45 57  ne data into NEW
16160 44 42 20 66 72 6f 6d 20 74 68 65 20 65 78 69 73  DB from the exis
16170 74 69 6e 67 20 64 61 74 61 62 61 73 65 5c 6e 22  ting database\n"
16180 0a 20 20 22 2e 64 61 74 61 62 61 73 65 73 20 20  .  ".databases  
16190 20 20 20 20 20 20 20 20 20 20 20 4c 69 73 74 20             List 
161a0 6e 61 6d 65 73 20 61 6e 64 20 66 69 6c 65 73 20  names and files 
161b0 6f 66 20 61 74 74 61 63 68 65 64 20 64 61 74 61  of attached data
161c0 62 61 73 65 73 5c 6e 22 0a 20 20 22 2e 64 62 69  bases\n".  ".dbi
161d0 6e 66 6f 20 3f 44 42 3f 20 20 20 20 20 20 20 20  nfo ?DB?        
161e0 20 20 20 53 68 6f 77 20 73 74 61 74 75 73 20 69     Show status i
161f0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
16200 20 74 68 65 20 64 61 74 61 62 61 73 65 5c 6e 22   the database\n"
16210 0a 20 20 22 2e 64 75 6d 70 20 3f 54 41 42 4c 45  .  ".dump ?TABLE
16220 3f 20 2e 2e 2e 20 20 20 20 20 20 44 75 6d 70 20  ? ...      Dump 
16230 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20  the database in 
16240 61 6e 20 53 51 4c 20 74 65 78 74 20 66 6f 72 6d  an SQL text form
16250 61 74 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  at\n".  "       
16260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16270 20 20 49 66 20 54 41 42 4c 45 20 73 70 65 63 69    If TABLE speci
16280 66 69 65 64 2c 20 6f 6e 6c 79 20 64 75 6d 70 20  fied, only dump 
16290 74 61 62 6c 65 73 20 6d 61 74 63 68 69 6e 67 5c  tables matching\
162a0 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
162b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c                 L
162c0 49 4b 45 20 70 61 74 74 65 72 6e 20 54 41 42 4c  IKE pattern TABL
162d0 45 2e 5c 6e 22 0a 20 20 22 2e 65 63 68 6f 20 6f  E.\n".  ".echo o
162e0 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20 20  n|off           
162f0 54 75 72 6e 20 63 6f 6d 6d 61 6e 64 20 65 63 68  Turn command ech
16300 6f 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20  o on or off\n". 
16310 20 22 2e 65 71 70 20 6f 6e 7c 6f 66 66 7c 66 75   ".eqp on|off|fu
16320 6c 6c 20 20 20 20 20 20 20 45 6e 61 62 6c 65 20  ll       Enable 
16330 6f 72 20 64 69 73 61 62 6c 65 20 61 75 74 6f 6d  or disable autom
16340 61 74 69 63 20 45 58 50 4c 41 49 4e 20 51 55 45  atic EXPLAIN QUE
16350 52 59 20 50 4c 41 4e 5c 6e 22 0a 20 20 22 2e 65  RY PLAN\n".  ".e
16360 78 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20  xit             
16370 20 20 20 20 20 45 78 69 74 20 74 68 69 73 20 70       Exit this p
16380 72 6f 67 72 61 6d 5c 6e 22 0a 20 20 22 2e 65 78  rogram\n".  ".ex
16390 70 65 72 74 20 20 20 20 20 20 20 20 20 20 20 20  pert            
163a0 20 20 20 20 45 58 50 45 52 49 4d 45 4e 54 41 4c      EXPERIMENTAL
163b0 2e 20 53 75 67 67 65 73 74 20 69 6e 64 65 78 65  . Suggest indexe
163c0 73 20 66 6f 72 20 73 70 65 63 69 66 69 65 64 20  s for specified 
163d0 71 75 65 72 69 65 73 5c 6e 22 0a 2f 2a 20 42 65  queries\n"./* Be
163e0 63 61 75 73 65 20 65 78 70 6c 61 69 6e 20 6d 6f  cause explain mo
163f0 64 65 20 63 6f 6d 65 73 20 6f 6e 20 61 75 74 6f  de comes on auto
16400 6d 61 74 69 63 61 6c 6c 79 20 6e 6f 77 2c 20 74  matically now, t
16410 68 65 20 22 2e 65 78 70 6c 61 69 6e 22 20 6d 6f  he ".explain" mo
16420 64 65 0a 2a 2a 20 69 73 20 72 65 6d 6f 76 65 64  de.** is removed
16430 20 66 72 6f 6d 20 74 68 65 20 68 65 6c 70 20 73   from the help s
16440 63 72 65 65 6e 2e 20 20 49 74 20 69 73 20 73 74  creen.  It is st
16450 69 6c 6c 20 73 75 70 70 6f 72 74 65 64 20 66 6f  ill supported fo
16460 72 20 6c 65 67 61 63 79 2c 20 68 6f 77 65 76 65  r legacy, howeve
16470 72 20 2a 2f 0a 2f 2a 22 2e 65 78 70 6c 61 69 6e  r */./*".explain
16480 20 3f 6f 6e 7c 6f 66 66 7c 61 75 74 6f 3f 20 54   ?on|off|auto? T
16490 75 72 6e 20 45 58 50 4c 41 49 4e 20 6f 75 74 70  urn EXPLAIN outp
164a0 75 74 20 6d 6f 64 65 20 6f 6e 20 6f 72 20 6f 66  ut mode on or of
164b0 66 20 6f 72 20 74 6f 20 61 75 74 6f 6d 61 74 69  f or to automati
164c0 63 5c 6e 22 2a 2f 0a 20 20 22 2e 66 75 6c 6c 73  c\n"*/.  ".fulls
164d0 63 68 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e 74 3f  chema ?--indent?
164e0 20 53 68 6f 77 20 73 63 68 65 6d 61 20 61 6e 64   Show schema and
164f0 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20   the content of 
16500 73 71 6c 69 74 65 5f 73 74 61 74 20 74 61 62 6c  sqlite_stat tabl
16510 65 73 5c 6e 22 0a 20 20 22 2e 68 65 61 64 65 72  es\n".  ".header
16520 73 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20  s on|off        
16530 54 75 72 6e 20 64 69 73 70 6c 61 79 20 6f 66 20  Turn display of 
16540 68 65 61 64 65 72 73 20 6f 6e 20 6f 72 20 6f 66  headers on or of
16550 66 5c 6e 22 0a 20 20 22 2e 68 65 6c 70 20 20 20  f\n".  ".help   
16560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
16570 68 6f 77 20 74 68 69 73 20 6d 65 73 73 61 67 65  how this message
16580 5c 6e 22 0a 20 20 22 2e 69 6d 70 6f 72 74 20 46  \n".  ".import F
16590 49 4c 45 20 54 41 42 4c 45 20 20 20 20 20 49 6d  ILE TABLE     Im
165a0 70 6f 72 74 20 64 61 74 61 20 66 72 6f 6d 20 46  port data from F
165b0 49 4c 45 20 69 6e 74 6f 20 54 41 42 4c 45 5c 6e  ILE into TABLE\n
165c0 22 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ".#ifndef SQLITE
165d0 5f 4f 4d 49 54 5f 54 45 53 54 5f 43 4f 4e 54 52  _OMIT_TEST_CONTR
165e0 4f 4c 0a 20 20 22 2e 69 6d 70 6f 73 74 65 72 20  OL.  ".imposter 
165f0 49 4e 44 45 58 20 54 41 42 4c 45 20 20 43 72 65  INDEX TABLE  Cre
16600 61 74 65 20 69 6d 70 6f 73 74 65 72 20 74 61 62  ate imposter tab
16610 6c 65 20 54 41 42 4c 45 20 6f 6e 20 69 6e 64 65  le TABLE on inde
16620 78 20 49 4e 44 45 58 5c 6e 22 0a 23 65 6e 64 69  x INDEX\n".#endi
16630 66 0a 20 20 22 2e 69 6e 64 65 78 65 73 20 3f 54  f.  ".indexes ?T
16640 41 42 4c 45 3f 20 20 20 20 20 20 20 53 68 6f 77  ABLE?       Show
16650 20 6e 61 6d 65 73 20 6f 66 20 61 6c 6c 20 69 6e   names of all in
16660 64 65 78 65 73 5c 6e 22 0a 20 20 22 20 20 20 20  dexes\n".  "    
16670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16680 20 20 20 20 20 49 66 20 54 41 42 4c 45 20 73 70       If TABLE sp
16690 65 63 69 66 69 65 64 2c 20 6f 6e 6c 79 20 73 68  ecified, only sh
166a0 6f 77 20 69 6e 64 65 78 65 73 20 66 6f 72 20 74  ow indexes for t
166b0 61 62 6c 65 73 5c 6e 22 0a 20 20 22 20 20 20 20  ables\n".  "    
166c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166d0 20 20 20 20 20 6d 61 74 63 68 69 6e 67 20 4c 49       matching LI
166e0 4b 45 20 70 61 74 74 65 72 6e 20 54 41 42 4c 45  KE pattern TABLE
166f0 2e 5c 6e 22 0a 23 69 66 64 65 66 20 53 51 4c 49  .\n".#ifdef SQLI
16700 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
16710 45 0a 20 20 22 2e 69 6f 74 72 61 63 65 20 46 49  E.  ".iotrace FI
16720 4c 45 20 20 20 20 20 20 20 20 20 20 45 6e 61 62  LE          Enab
16730 6c 65 20 49 2f 4f 20 64 69 61 67 6e 6f 73 74 69  le I/O diagnosti
16740 63 20 6c 6f 67 67 69 6e 67 20 74 6f 20 46 49 4c  c logging to FIL
16750 45 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e  E\n".#endif.  ".
16760 6c 69 6d 69 74 20 3f 4c 49 4d 49 54 3f 20 3f 56  limit ?LIMIT? ?V
16770 41 4c 3f 20 20 20 44 69 73 70 6c 61 79 20 6f 72  AL?   Display or
16780 20 63 68 61 6e 67 65 20 74 68 65 20 76 61 6c 75   change the valu
16790 65 20 6f 66 20 61 6e 20 53 51 4c 49 54 45 5f 4c  e of an SQLITE_L
167a0 49 4d 49 54 5c 6e 22 0a 20 20 22 2e 6c 69 6e 74  IMIT\n".  ".lint
167b0 20 4f 50 54 49 4f 4e 53 20 20 20 20 20 20 20 20   OPTIONS        
167c0 20 20 52 65 70 6f 72 74 20 70 6f 74 65 6e 74 69    Report potenti
167d0 61 6c 20 73 63 68 65 6d 61 20 69 73 73 75 65 73  al schema issues
167e0 2e 20 4f 70 74 69 6f 6e 73 3a 5c 6e 22 0a 20 20  . Options:\n".  
167f0 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
16800 20 20 20 20 20 20 20 20 20 20 66 6b 65 79 2d 69            fkey-i
16810 6e 64 65 78 65 73 20 20 20 20 20 46 69 6e 64 20  ndexes     Find 
16820 6d 69 73 73 69 6e 67 20 66 6f 72 65 69 67 6e 20  missing foreign 
16830 6b 65 79 20 69 6e 64 65 78 65 73 5c 6e 22 0a 23  key indexes\n".#
16840 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
16850 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53 49 4f  IT_LOAD_EXTENSIO
16860 4e 0a 20 20 22 2e 6c 6f 61 64 20 46 49 4c 45 20  N.  ".load FILE 
16870 3f 45 4e 54 52 59 3f 20 20 20 20 20 4c 6f 61 64  ?ENTRY?     Load
16880 20 61 6e 20 65 78 74 65 6e 73 69 6f 6e 20 6c 69   an extension li
16890 62 72 61 72 79 5c 6e 22 0a 23 65 6e 64 69 66 0a  brary\n".#endif.
168a0 20 20 22 2e 6c 6f 67 20 46 49 4c 45 7c 6f 66 66    ".log FILE|off
168b0 20 20 20 20 20 20 20 20 20 20 54 75 72 6e 20 6c            Turn l
168c0 6f 67 67 69 6e 67 20 6f 6e 20 6f 72 20 6f 66 66  ogging on or off
168d0 2e 20 20 46 49 4c 45 20 63 61 6e 20 62 65 20 73  .  FILE can be s
168e0 74 64 65 72 72 2f 73 74 64 6f 75 74 5c 6e 22 0a  tderr/stdout\n".
168f0 20 20 22 2e 6d 6f 64 65 20 4d 4f 44 45 20 3f 54    ".mode MODE ?T
16900 41 42 4c 45 3f 20 20 20 20 20 53 65 74 20 6f 75  ABLE?     Set ou
16910 74 70 75 74 20 6d 6f 64 65 20 77 68 65 72 65 20  tput mode where 
16920 4d 4f 44 45 20 69 73 20 6f 6e 65 20 6f 66 3a 5c  MODE is one of:\
16930 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
16940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
16950 73 63 69 69 20 20 20 20 43 6f 6c 75 6d 6e 73 2f  scii    Columns/
16960 72 6f 77 73 20 64 65 6c 69 6d 69 74 65 64 20 62  rows delimited b
16970 79 20 30 78 31 46 20 61 6e 64 20 30 78 31 45 5c  y 0x1F and 0x1E\
16980 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
16990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
169a0 73 76 20 20 20 20 20 20 43 6f 6d 6d 61 2d 73 65  sv      Comma-se
169b0 70 61 72 61 74 65 64 20 76 61 6c 75 65 73 5c 6e  parated values\n
169c0 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
169d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
169e0 6c 75 6d 6e 20 20 20 4c 65 66 74 2d 61 6c 69 67  lumn   Left-alig
169f0 6e 65 64 20 63 6f 6c 75 6d 6e 73 2e 20 20 28 53  ned columns.  (S
16a00 65 65 20 2e 77 69 64 74 68 29 5c 6e 22 0a 20 20  ee .width)\n".  
16a10 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
16a20 20 20 20 20 20 20 20 20 20 20 68 74 6d 6c 20 20            html  
16a30 20 20 20 48 54 4d 4c 20 3c 74 61 62 6c 65 3e 20     HTML <table> 
16a40 63 6f 64 65 5c 6e 22 0a 20 20 22 20 20 20 20 20  code\n".  "     
16a50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a60 20 20 20 20 69 6e 73 65 72 74 20 20 20 53 51 4c      insert   SQL
16a70 20 69 6e 73 65 72 74 20 73 74 61 74 65 6d 65 6e   insert statemen
16a80 74 73 20 66 6f 72 20 54 41 42 4c 45 5c 6e 22 0a  ts for TABLE\n".
16a90 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
16aa0 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 6e 65              line
16ab0 20 20 20 20 20 4f 6e 65 20 76 61 6c 75 65 20 70       One value p
16ac0 65 72 20 6c 69 6e 65 5c 6e 22 0a 20 20 22 20 20  er line\n".  "  
16ad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ae0 20 20 20 20 20 20 20 6c 69 73 74 20 20 20 20 20         list     
16af0 56 61 6c 75 65 73 20 64 65 6c 69 6d 69 74 65 64  Values delimited
16b00 20 62 79 20 5c 22 7c 5c 22 5c 6e 22 0a 20 20 22   by \"|\"\n".  "
16b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b20 20 20 20 20 20 20 20 20 20 71 75 6f 74 65 20 20           quote  
16b30 20 20 45 73 63 61 70 65 20 61 6e 73 77 65 72 73    Escape answers
16b40 20 61 73 20 66 6f 72 20 53 51 4c 5c 6e 22 0a 20   as for SQL\n". 
16b50 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
16b60 20 20 20 20 20 20 20 20 20 20 20 74 61 62 73 20             tabs 
16b70 20 20 20 20 54 61 62 2d 73 65 70 61 72 61 74 65      Tab-separate
16b80 64 20 76 61 6c 75 65 73 5c 6e 22 0a 20 20 22 20  d values\n".  " 
16b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ba0 20 20 20 20 20 20 20 20 74 63 6c 20 20 20 20 20          tcl     
16bb0 20 54 43 4c 20 6c 69 73 74 20 65 6c 65 6d 65 6e   TCL list elemen
16bc0 74 73 5c 6e 22 0a 20 20 22 2e 6e 75 6c 6c 76 61  ts\n".  ".nullva
16bd0 6c 75 65 20 53 54 52 49 4e 47 20 20 20 20 20 20  lue STRING      
16be0 55 73 65 20 53 54 52 49 4e 47 20 69 6e 20 70 6c  Use STRING in pl
16bf0 61 63 65 20 6f 66 20 4e 55 4c 4c 20 76 61 6c 75  ace of NULL valu
16c00 65 73 5c 6e 22 0a 20 20 22 2e 6f 6e 63 65 20 46  es\n".  ".once F
16c10 49 4c 45 4e 41 4d 45 20 20 20 20 20 20 20 20 20  ILENAME         
16c20 4f 75 74 70 75 74 20 66 6f 72 20 74 68 65 20 6e  Output for the n
16c30 65 78 74 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20  ext SQL command 
16c40 6f 6e 6c 79 20 74 6f 20 46 49 4c 45 4e 41 4d 45  only to FILENAME
16c50 5c 6e 22 0a 20 20 22 2e 6f 70 65 6e 20 3f 4f 50  \n".  ".open ?OP
16c60 54 49 4f 4e 53 3f 20 3f 46 49 4c 45 3f 20 43 6c  TIONS? ?FILE? Cl
16c70 6f 73 65 20 65 78 69 73 74 69 6e 67 20 64 61 74  ose existing dat
16c80 61 62 61 73 65 20 61 6e 64 20 72 65 6f 70 65 6e  abase and reopen
16c90 20 46 49 4c 45 5c 6e 22 0a 20 20 22 20 20 20 20   FILE\n".  "    
16ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16cb0 20 20 20 20 20 54 68 65 20 2d 2d 6e 65 77 20 6f       The --new o
16cc0 70 74 69 6f 6e 20 73 74 61 72 74 73 20 77 69 74  ption starts wit
16cd0 68 20 61 6e 20 65 6d 70 74 79 20 66 69 6c 65 5c  h an empty file\
16ce0 6e 22 0a 20 20 22 2e 6f 75 74 70 75 74 20 3f 46  n".  ".output ?F
16cf0 49 4c 45 4e 41 4d 45 3f 20 20 20 20 20 53 65 6e  ILENAME?     Sen
16d00 64 20 6f 75 74 70 75 74 20 74 6f 20 46 49 4c 45  d output to FILE
16d10 4e 41 4d 45 20 6f 72 20 73 74 64 6f 75 74 5c 6e  NAME or stdout\n
16d20 22 0a 20 20 22 2e 70 72 69 6e 74 20 53 54 52 49  ".  ".print STRI
16d30 4e 47 2e 2e 2e 20 20 20 20 20 20 20 50 72 69 6e  NG...       Prin
16d40 74 20 6c 69 74 65 72 61 6c 20 53 54 52 49 4e 47  t literal STRING
16d50 5c 6e 22 0a 20 20 22 2e 70 72 6f 6d 70 74 20 4d  \n".  ".prompt M
16d60 41 49 4e 20 43 4f 4e 54 49 4e 55 45 20 20 52 65  AIN CONTINUE  Re
16d70 70 6c 61 63 65 20 74 68 65 20 73 74 61 6e 64 61  place the standa
16d80 72 64 20 70 72 6f 6d 70 74 73 5c 6e 22 0a 20 20  rd prompts\n".  
16d90 22 2e 71 75 69 74 20 20 20 20 20 20 20 20 20 20  ".quit          
16da0 20 20 20 20 20 20 20 20 45 78 69 74 20 74 68 69          Exit thi
16db0 73 20 70 72 6f 67 72 61 6d 5c 6e 22 0a 20 20 22  s program\n".  "
16dc0 2e 72 65 61 64 20 46 49 4c 45 4e 41 4d 45 20 20  .read FILENAME  
16dd0 20 20 20 20 20 20 20 45 78 65 63 75 74 65 20 53         Execute S
16de0 51 4c 20 69 6e 20 46 49 4c 45 4e 41 4d 45 5c 6e  QL in FILENAME\n
16df0 22 0a 20 20 22 2e 72 65 73 74 6f 72 65 20 3f 44  ".  ".restore ?D
16e00 42 3f 20 46 49 4c 45 20 20 20 20 20 52 65 73 74  B? FILE     Rest
16e10 6f 72 65 20 63 6f 6e 74 65 6e 74 20 6f 66 20 44  ore content of D
16e20 42 20 28 64 65 66 61 75 6c 74 20 5c 22 6d 61 69  B (default \"mai
16e30 6e 5c 22 29 20 66 72 6f 6d 20 46 49 4c 45 5c 6e  n\") from FILE\n
16e40 22 0a 20 20 22 2e 73 61 76 65 20 46 49 4c 45 20  ".  ".save FILE 
16e50 20 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74              Writ
16e60 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 61 74 61  e in-memory data
16e70 62 61 73 65 20 69 6e 74 6f 20 46 49 4c 45 5c 6e  base into FILE\n
16e80 22 0a 20 20 22 2e 73 63 61 6e 73 74 61 74 73 20  ".  ".scanstats 
16e90 6f 6e 7c 6f 66 66 20 20 20 20 20 20 54 75 72 6e  on|off      Turn
16ea0 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63   sqlite3_stmt_sc
16eb0 61 6e 73 74 61 74 75 73 28 29 20 6d 65 74 72 69  anstatus() metri
16ec0 63 73 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a  cs on or off\n".
16ed0 20 20 22 2e 73 63 68 65 6d 61 20 3f 50 41 54 54    ".schema ?PATT
16ee0 45 52 4e 3f 20 20 20 20 20 20 53 68 6f 77 20 74  ERN?      Show t
16ef0 68 65 20 43 52 45 41 54 45 20 73 74 61 74 65 6d  he CREATE statem
16f00 65 6e 74 73 20 6d 61 74 63 68 69 6e 67 20 50 41  ents matching PA
16f10 54 54 45 52 4e 5c 6e 22 0a 20 20 22 20 20 20 20  TTERN\n".  "    
16f20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f30 20 20 20 20 20 20 41 64 64 20 2d 2d 69 6e 64 65        Add --inde
16f40 6e 74 20 66 6f 72 20 70 72 65 74 74 79 2d 70 72  nt for pretty-pr
16f50 69 6e 74 69 6e 67 5c 6e 22 0a 20 20 22 2e 73 65  inting\n".  ".se
16f60 6c 66 74 65 73 74 20 3f 2d 2d 69 6e 69 74 3f 20  lftest ?--init? 
16f70 20 20 20 20 52 75 6e 20 74 65 73 74 73 20 64 65      Run tests de
16f80 66 69 6e 65 64 20 69 6e 20 74 68 65 20 53 45 4c  fined in the SEL
16f90 46 54 45 53 54 20 74 61 62 6c 65 5c 6e 22 0a 20  FTEST table\n". 
16fa0 20 22 2e 73 65 70 61 72 61 74 6f 72 20 43 4f 4c   ".separator COL
16fb0 20 3f 52 4f 57 3f 20 20 20 43 68 61 6e 67 65 20   ?ROW?   Change 
16fc0 74 68 65 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72  the column separ
16fd0 61 74 6f 72 20 61 6e 64 20 6f 70 74 69 6f 6e 61  ator and optiona
16fe0 6c 6c 79 20 74 68 65 20 72 6f 77 5c 6e 22 0a 20  lly the row\n". 
16ff0 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
17000 20 20 20 20 20 20 20 20 20 20 20 73 65 70 61 72             separ
17010 61 74 6f 72 20 66 6f 72 20 62 6f 74 68 20 74 68  ator for both th
17020 65 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 61 6e  e output mode an
17030 64 20 2e 69 6d 70 6f 72 74 5c 6e 22 0a 23 69 66  d .import\n".#if
17040 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
17050 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a  ENABLE_SESSION).
17060 20 20 22 2e 73 65 73 73 69 6f 6e 20 43 4d 44 20    ".session CMD 
17070 2e 2e 2e 20 20 20 20 20 20 20 43 72 65 61 74 65  ...       Create
17080 20 6f 72 20 63 6f 6e 74 72 6f 6c 20 73 65 73 73   or control sess
17090 69 6f 6e 73 5c 6e 22 0a 23 65 6e 64 69 66 0a 20  ions\n".#endif. 
170a0 20 22 2e 73 68 61 33 73 75 6d 20 3f 4f 50 54 49   ".sha3sum ?OPTI
170b0 4f 4e 53 2e 2e 2e 3f 20 20 43 6f 6d 70 75 74 65  ONS...?  Compute
170c0 20 61 20 53 48 41 33 20 68 61 73 68 20 6f 66 20   a SHA3 hash of 
170d0 64 61 74 61 62 61 73 65 20 63 6f 6e 74 65 6e 74  database content
170e0 5c 6e 22 0a 20 20 22 2e 73 68 65 6c 6c 20 43 4d  \n".  ".shell CM
170f0 44 20 41 52 47 53 2e 2e 2e 20 20 20 20 20 52 75  D ARGS...     Ru
17100 6e 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20 69 6e  n CMD ARGS... in
17110 20 61 20 73 79 73 74 65 6d 20 73 68 65 6c 6c 5c   a system shell\
17120 6e 22 0a 20 20 22 2e 73 68 6f 77 20 20 20 20 20  n".  ".show     
17130 20 20 20 20 20 20 20 20 20 20 20 20 20 53 68 6f               Sho
17140 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61  w the current va
17150 6c 75 65 73 20 66 6f 72 20 76 61 72 69 6f 75 73  lues for various
17160 20 73 65 74 74 69 6e 67 73 5c 6e 22 0a 20 20 22   settings\n".  "
17170 2e 73 74 61 74 73 20 3f 6f 6e 7c 6f 66 66 3f 20  .stats ?on|off? 
17180 20 20 20 20 20 20 20 53 68 6f 77 20 73 74 61 74         Show stat
17190 73 20 6f 72 20 74 75 72 6e 20 73 74 61 74 73 20  s or turn stats 
171a0 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20 22  on or off\n".  "
171b0 2e 73 79 73 74 65 6d 20 43 4d 44 20 41 52 47 53  .system CMD ARGS
171c0 2e 2e 2e 20 20 20 20 52 75 6e 20 43 4d 44 20 41  ...    Run CMD A
171d0 52 47 53 2e 2e 2e 20 69 6e 20 61 20 73 79 73 74  RGS... in a syst
171e0 65 6d 20 73 68 65 6c 6c 5c 6e 22 0a 20 20 22 2e  em shell\n".  ".
171f0 74 61 62 6c 65 73 20 3f 54 41 42 4c 45 3f 20 20  tables ?TABLE?  
17200 20 20 20 20 20 20 4c 69 73 74 20 6e 61 6d 65 73        List names
17210 20 6f 66 20 74 61 62 6c 65 73 5c 6e 22 0a 20 20   of tables\n".  
17220 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
17230 20 20 20 20 20 20 20 20 20 20 49 66 20 54 41 42            If TAB
17240 4c 45 20 73 70 65 63 69 66 69 65 64 2c 20 6f 6e  LE specified, on
17250 6c 79 20 6c 69 73 74 20 74 61 62 6c 65 73 20 6d  ly list tables m
17260 61 74 63 68 69 6e 67 5c 6e 22 0a 20 20 22 20 20  atching\n".  "  
17270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17280 20 20 20 20 20 20 20 4c 49 4b 45 20 70 61 74 74         LIKE patt
17290 65 72 6e 20 54 41 42 4c 45 2e 5c 6e 22 0a 20 20  ern TABLE.\n".  
172a0 22 2e 74 65 73 74 63 61 73 65 20 4e 41 4d 45 20  ".testcase NAME 
172b0 20 20 20 20 20 20 20 20 42 65 67 69 6e 20 72 65          Begin re
172c0 64 69 72 65 63 74 69 6e 67 20 6f 75 74 70 75 74  directing output
172d0 20 74 6f 20 27 74 65 73 74 63 61 73 65 2d 6f 75   to 'testcase-ou
172e0 74 2e 74 78 74 27 5c 6e 22 0a 20 20 22 2e 74 69  t.txt'\n".  ".ti
172f0 6d 65 6f 75 74 20 4d 53 20 20 20 20 20 20 20 20  meout MS        
17300 20 20 20 20 54 72 79 20 6f 70 65 6e 69 6e 67 20      Try opening 
17310 6c 6f 63 6b 65 64 20 74 61 62 6c 65 73 20 66 6f  locked tables fo
17320 72 20 4d 53 20 6d 69 6c 6c 69 73 65 63 6f 6e 64  r MS millisecond
17330 73 5c 6e 22 0a 20 20 22 2e 74 69 6d 65 72 20 6f  s\n".  ".timer o
17340 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20 54  n|off          T
17350 75 72 6e 20 53 51 4c 20 74 69 6d 65 72 20 6f 6e  urn SQL timer on
17360 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20 22 2e 74   or off\n".  ".t
17370 72 61 63 65 20 46 49 4c 45 7c 6f 66 66 20 20 20  race FILE|off   
17380 20 20 20 20 20 4f 75 74 70 75 74 20 65 61 63 68       Output each
17390 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 61   SQL statement a
173a0 73 20 69 74 20 69 73 20 72 75 6e 5c 6e 22 0a 20  s it is run\n". 
173b0 20 22 2e 76 66 73 69 6e 66 6f 20 3f 41 55 58 3f   ".vfsinfo ?AUX?
173c0 20 20 20 20 20 20 20 20 20 49 6e 66 6f 72 6d 61           Informa
173d0 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 74  tion about the t
173e0 6f 70 2d 6c 65 76 65 6c 20 56 46 53 5c 6e 22 0a  op-level VFS\n".
173f0 20 20 22 2e 76 66 73 6c 69 73 74 20 20 20 20 20    ".vfslist     
17400 20 20 20 20 20 20 20 20 20 20 4c 69 73 74 20 61            List a
17410 6c 6c 20 61 76 61 69 6c 61 62 6c 65 20 56 46 53  ll available VFS
17420 65 73 5c 6e 22 0a 20 20 22 2e 76 66 73 6e 61 6d  es\n".  ".vfsnam
17430 65 20 3f 41 55 58 3f 20 20 20 20 20 20 20 20 20  e ?AUX?         
17440 50 72 69 6e 74 20 74 68 65 20 6e 61 6d 65 20 6f  Print the name o
17450 66 20 74 68 65 20 56 46 53 20 73 74 61 63 6b 5c  f the VFS stack\
17460 6e 22 0a 20 20 22 2e 77 69 64 74 68 20 4e 55 4d  n".  ".width NUM
17470 31 20 4e 55 4d 32 20 2e 2e 2e 20 20 20 53 65 74  1 NUM2 ...   Set
17480 20 63 6f 6c 75 6d 6e 20 77 69 64 74 68 73 20 66   column widths f
17490 6f 72 20 5c 22 63 6f 6c 75 6d 6e 5c 22 20 6d 6f  or \"column\" mo
174a0 64 65 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  de\n".  "       
174b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
174c0 20 20 4e 65 67 61 74 69 76 65 20 76 61 6c 75 65    Negative value
174d0 73 20 72 69 67 68 74 2d 6a 75 73 74 69 66 79 5c  s right-justify\
174e0 6e 22 0a 3b 0a 0a 23 69 66 20 64 65 66 69 6e 65  n".;..#if define
174f0 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  d(SQLITE_ENABLE_
17500 53 45 53 53 49 4f 4e 29 0a 2f 2a 0a 2a 2a 20 50  SESSION)./*.** P
17510 72 69 6e 74 20 68 65 6c 70 20 69 6e 66 6f 72 6d  rint help inform
17520 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 22 2e  ation for the ".
17530 73 65 73 73 69 6f 6e 73 22 20 63 6f 6d 6d 61 6e  sessions" comman
17540 64 0a 2a 2f 0a 76 6f 69 64 20 73 65 73 73 69 6f  d.*/.void sessio
17550 6e 5f 68 65 6c 70 28 53 68 65 6c 6c 53 74 61 74  n_help(ShellStat
17560 65 20 2a 70 29 7b 0a 20 20 72 61 77 5f 70 72 69  e *p){.  raw_pri
17570 6e 74 66 28 70 2d 3e 6f 75 74 2c 0a 20 20 20 20  ntf(p->out,.    
17580 22 2e 73 65 73 73 69 6f 6e 20 3f 4e 41 4d 45 3f  ".session ?NAME?
17590 20 53 55 42 43 4f 4d 4d 41 4e 44 20 3f 41 52 47   SUBCOMMAND ?ARG
175a0 53 2e 2e 2e 3f 5c 6e 22 0a 20 20 20 20 22 49 66  S...?\n".    "If
175b0 20 3f 4e 41 4d 45 3f 20 69 73 20 6f 6d 69 74 74   ?NAME? is omitt
175c0 65 64 2c 20 74 68 65 20 66 69 72 73 74 20 64 65  ed, the first de
175d0 66 69 6e 65 64 20 73 65 73 73 69 6f 6e 20 69 73  fined session is
175e0 20 75 73 65 64 2e 5c 6e 22 0a 20 20 20 20 22 53   used.\n".    "S
175f0 75 62 63 6f 6d 6d 61 6e 64 73 3a 5c 6e 22 0a 20  ubcommands:\n". 
17600 20 20 20 22 20 20 20 61 74 74 61 63 68 20 54 41     "   attach TA
17610 42 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  BLE             
17620 41 74 74 61 63 68 20 54 41 42 4c 45 5c 6e 22 0a  Attach TABLE\n".
17630 20 20 20 20 22 20 20 20 63 68 61 6e 67 65 73 65      "   changese
17640 74 20 46 49 4c 45 20 20 20 20 20 20 20 20 20 20  t FILE          
17650 20 57 72 69 74 65 20 61 20 63 68 61 6e 67 65 73   Write a changes
17660 65 74 20 69 6e 74 6f 20 46 49 4c 45 5c 6e 22 0a  et into FILE\n".
17670 20 20 20 20 22 20 20 20 63 6c 6f 73 65 20 20 20      "   close   
17680 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17690 20 43 6c 6f 73 65 20 6f 6e 65 20 73 65 73 73 69   Close one sessi
176a0 6f 6e 5c 6e 22 0a 20 20 20 20 22 20 20 20 65 6e  on\n".    "   en
176b0 61 62 6c 65 20 3f 42 4f 4f 4c 45 41 4e 3f 20 20  able ?BOOLEAN?  
176c0 20 20 20 20 20 20 20 53 65 74 20 6f 72 20 71 75         Set or qu
176d0 65 72 79 20 74 68 65 20 65 6e 61 62 6c 65 20 62  ery the enable b
176e0 69 74 5c 6e 22 0a 20 20 20 20 22 20 20 20 66 69  it\n".    "   fi
176f0 6c 74 65 72 20 47 4c 4f 42 2e 2e 2e 20 20 20 20  lter GLOB...    
17700 20 20 20 20 20 20 20 52 65 6a 65 63 74 20 74 61         Reject ta
17710 62 6c 65 73 20 6d 61 74 63 68 69 6e 67 20 47 4c  bles matching GL
17720 4f 42 73 5c 6e 22 0a 20 20 20 20 22 20 20 20 69  OBs\n".    "   i
17730 6e 64 69 72 65 63 74 20 3f 42 4f 4f 4c 45 41 4e  ndirect ?BOOLEAN
17740 3f 20 20 20 20 20 20 20 4d 61 72 6b 20 6f 72 20  ?       Mark or 
17750 71 75 65 72 79 20 74 68 65 20 69 6e 64 69 72 65  query the indire
17760 63 74 20 73 74 61 74 75 73 5c 6e 22 0a 20 20 20  ct status\n".   
17770 20 22 20 20 20 69 73 65 6d 70 74 79 20 20 20 20   "   isempty    
17780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 51 75                Qu
17790 65 72 79 20 77 68 65 74 68 65 72 20 74 68 65 20  ery whether the 
177a0 73 65 73 73 69 6f 6e 20 69 73 20 65 6d 70 74 79  session is empty
177b0 5c 6e 22 0a 20 20 20 20 22 20 20 20 6c 69 73 74  \n".    "   list
177c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
177d0 20 20 20 20 20 4c 69 73 74 20 63 75 72 72 65 6e       List curren
177e0 74 6c 79 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e  tly open session
177f0 20 6e 61 6d 65 73 5c 6e 22 0a 20 20 20 20 22 20   names\n".    " 
17800 20 20 6f 70 65 6e 20 44 42 20 4e 41 4d 45 20 20    open DB NAME  
17810 20 20 20 20 20 20 20 20 20 20 20 4f 70 65 6e 20             Open 
17820 61 20 6e 65 77 20 73 65 73 73 69 6f 6e 20 6f 6e  a new session on
17830 20 44 42 5c 6e 22 0a 20 20 20 20 22 20 20 20 70   DB\n".    "   p
17840 61 74 63 68 73 65 74 20 46 49 4c 45 20 20 20 20  atchset FILE    
17850 20 20 20 20 20 20 20 20 57 72 69 74 65 20 61 20          Write a 
17860 70 61 74 63 68 73 65 74 20 69 6e 74 6f 20 46 49  patchset into FI
17870 4c 45 5c 6e 22 0a 20 20 29 3b 0a 7d 0a 23 65 6e  LE\n".  );.}.#en
17880 64 69 66 0a 0a 0a 2f 2a 20 46 6f 72 77 61 72 64  dif.../* Forward
17890 20 72 65 66 65 72 65 6e 63 65 20 2a 2f 0a 73 74   reference */.st
178a0 61 74 69 63 20 69 6e 74 20 70 72 6f 63 65 73 73  atic int process
178b0 5f 69 6e 70 75 74 28 53 68 65 6c 6c 53 74 61 74  _input(ShellStat
178c0 65 20 2a 70 2c 20 46 49 4c 45 20 2a 69 6e 29 3b  e *p, FILE *in);
178d0 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 74 68 65  ../*.** Read the
178e0 20 63 6f 6e 74 65 6e 74 20 6f 66 20 66 69 6c 65   content of file
178f0 20 7a 4e 61 6d 65 20 69 6e 74 6f 20 6d 65 6d 6f   zName into memo
17900 72 79 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d  ry obtained from
17910 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
17920 34 28 29 0a 2a 2a 20 61 6e 64 20 72 65 74 75 72  4().** and retur
17930 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
17940 68 65 20 62 75 66 66 65 72 2e 20 54 68 65 20 63  he buffer. The c
17950 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f 6e 73  aller is respons
17960 69 62 6c 65 20 66 6f 72 20 66 72 65 65 69 6e 67  ible for freeing
17970 0a 2a 2a 20 74 68 65 20 6d 65 6d 6f 72 79 2e 0a  .** the memory..
17980 2a 2a 0a 2a 2a 20 49 66 20 70 61 72 61 6d 65 74  **.** If paramet
17990 65 72 20 70 6e 42 79 74 65 20 69 73 20 6e 6f 74  er pnByte is not
179a0 20 4e 55 4c 4c 2c 20 28 2a 70 6e 42 79 74 65 29   NULL, (*pnByte)
179b0 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 6e   is set to the n
179c0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 0a 2a  umber of bytes.*
179d0 2a 20 72 65 61 64 2e 0a 2a 2a 0a 2a 2a 20 46 6f  * read..**.** Fo
179e0 72 20 63 6f 6e 76 65 6e 69 65 6e 63 65 2c 20 61  r convenience, a
179f0 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 6f 72 20   nul-terminator 
17a00 62 79 74 65 20 69 73 20 61 6c 77 61 79 73 20 61  byte is always a
17a10 70 70 65 6e 64 65 64 20 74 6f 20 74 68 65 20 64  ppended to the d
17a20 61 74 61 20 72 65 61 64 0a 2a 2a 20 66 72 6f 6d  ata read.** from
17a30 20 74 68 65 20 66 69 6c 65 20 62 65 66 6f 72 65   the file before
17a40 20 74 68 65 20 62 75 66 66 65 72 20 69 73 20 72   the buffer is r
17a50 65 74 75 72 6e 65 64 2e 20 54 68 69 73 20 62 79  eturned. This by
17a60 74 65 20 69 73 20 6e 6f 74 20 69 6e 63 6c 75 64  te is not includ
17a70 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 66 69 6e  ed in.** the fin
17a80 61 6c 20 76 61 6c 75 65 20 6f 66 20 28 2a 70 6e  al value of (*pn
17a90 42 79 74 65 29 2c 20 69 66 20 61 70 70 6c 69 63  Byte), if applic
17aa0 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 4e 55 4c 4c  able..**.** NULL
17ab0 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
17ac0 61 6e 79 20 65 72 72 6f 72 20 69 73 20 65 6e 63  any error is enc
17ad0 6f 75 6e 74 65 72 65 64 2e 20 54 68 65 20 66 69  ountered. The fi
17ae0 6e 61 6c 20 76 61 6c 75 65 20 6f 66 20 2a 70 6e  nal value of *pn
17af0 42 79 74 65 0a 2a 2a 20 69 73 20 75 6e 64 65 66  Byte.** is undef
17b00 69 6e 65 64 20 69 6e 20 74 68 69 73 20 63 61 73  ined in this cas
17b10 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  e..*/.static cha
17b20 72 20 2a 72 65 61 64 46 69 6c 65 28 63 6f 6e 73  r *readFile(cons
17b30 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 69  t char *zName, i
17b40 6e 74 20 2a 70 6e 42 79 74 65 29 7b 0a 20 20 46  nt *pnByte){.  F
17b50 49 4c 45 20 2a 69 6e 20 3d 20 66 6f 70 65 6e 28  ILE *in = fopen(
17b60 7a 4e 61 6d 65 2c 20 22 72 62 22 29 3b 0a 20 20  zName, "rb");.  
17b70 6c 6f 6e 67 20 6e 49 6e 3b 0a 20 20 73 69 7a 65  long nIn;.  size
17b80 5f 74 20 6e 52 65 61 64 3b 0a 20 20 63 68 61 72  _t nRead;.  char
17b90 20 2a 70 42 75 66 3b 0a 20 20 69 66 28 20 69 6e   *pBuf;.  if( in
17ba0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
17bb0 20 20 66 73 65 65 6b 28 69 6e 2c 20 30 2c 20 53    fseek(in, 0, S
17bc0 45 45 4b 5f 45 4e 44 29 3b 0a 20 20 6e 49 6e 20  EEK_END);.  nIn 
17bd0 3d 20 66 74 65 6c 6c 28 69 6e 29 3b 0a 20 20 72  = ftell(in);.  r
17be0 65 77 69 6e 64 28 69 6e 29 3b 0a 20 20 70 42 75  ewind(in);.  pBu
17bf0 66 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  f = sqlite3_mall
17c00 6f 63 36 34 28 20 6e 49 6e 2b 31 20 29 3b 0a 20  oc64( nIn+1 );. 
17c10 20 69 66 28 20 70 42 75 66 3d 3d 30 20 29 20 72   if( pBuf==0 ) r
17c20 65 74 75 72 6e 20 30 3b 0a 20 20 6e 52 65 61 64  eturn 0;.  nRead
17c30 20 3d 20 66 72 65 61 64 28 70 42 75 66 2c 20 6e   = fread(pBuf, n
17c40 49 6e 2c 20 31 2c 20 69 6e 29 3b 0a 20 20 66 63  In, 1, in);.  fc
17c50 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 69 66 28 20  lose(in);.  if( 
17c60 6e 52 65 61 64 21 3d 31 20 29 7b 0a 20 20 20 20  nRead!=1 ){.    
17c70 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 42 75  sqlite3_free(pBu
17c80 66 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  f);.    return 0
17c90 3b 0a 20 20 7d 0a 20 20 70 42 75 66 5b 6e 49 6e  ;.  }.  pBuf[nIn
17ca0 5d 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 6e 42  ] = 0;.  if( pnB
17cb0 79 74 65 20 29 20 2a 70 6e 42 79 74 65 20 3d 20  yte ) *pnByte = 
17cc0 6e 49 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70 42  nIn;.  return pB
17cd0 75 66 3b 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e  uf;.}..#if defin
17ce0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
17cf0 5f 53 45 53 53 49 4f 4e 29 0a 2f 2a 0a 2a 2a 20  _SESSION)./*.** 
17d00 43 6c 6f 73 65 20 61 20 73 69 6e 67 6c 65 20 4f  Close a single O
17d10 70 65 6e 53 65 73 73 69 6f 6e 20 6f 62 6a 65 63  penSession objec
17d20 74 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c  t and release al
17d30 6c 20 6f 66 20 69 74 73 20 61 73 73 6f 63 69 61  l of its associa
17d40 74 65 64 0a 2a 2a 20 72 65 73 6f 75 72 63 65 73  ted.** resources
17d50 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
17d60 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 28 4f   session_close(O
17d70 70 65 6e 53 65 73 73 69 6f 6e 20 2a 70 53 65 73  penSession *pSes
17d80 73 69 6f 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  sion){.  int i;.
17d90 20 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e    sqlite3session
17da0 5f 64 65 6c 65 74 65 28 70 53 65 73 73 69 6f 6e  _delete(pSession
17db0 2d 3e 70 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ->p);.  sqlite3_
17dc0 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e 7a  free(pSession->z
17dd0 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 69 3d 30  Name);.  for(i=0
17de0 3b 20 69 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e 46  ; i<pSession->nF
17df0 69 6c 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  ilter; i++){.   
17e00 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53   sqlite3_free(pS
17e10 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72  ession->azFilter
17e20 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  [i]);.  }.  sqli
17e30 74 65 33 5f 66 72 65 65 28 70 53 65 73 73 69 6f  te3_free(pSessio
17e40 6e 2d 3e 61 7a 46 69 6c 74 65 72 29 3b 0a 20 20  n->azFilter);.  
17e50 6d 65 6d 73 65 74 28 70 53 65 73 73 69 6f 6e 2c  memset(pSession,
17e60 20 30 2c 20 73 69 7a 65 6f 66 28 4f 70 65 6e 53   0, sizeof(OpenS
17e70 65 73 73 69 6f 6e 29 29 3b 0a 7d 0a 23 65 6e 64  ession));.}.#end
17e80 69 66 0a 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  if../*.** Close 
17e90 61 6c 6c 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20  all OpenSession 
17ea0 6f 62 6a 65 63 74 73 20 61 6e 64 20 72 65 6c 65  objects and rele
17eb0 61 73 65 20 61 6c 6c 20 61 73 73 6f 63 69 61 74  ase all associat
17ec0 65 64 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f  ed resources..*/
17ed0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
17ee0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49  ITE_ENABLE_SESSI
17ef0 4f 4e 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ON).static void 
17f00 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c  session_close_al
17f10 6c 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29  l(ShellState *p)
17f20 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
17f30 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 65 73 73  (i=0; i<p->nSess
17f40 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  ion; i++){.    s
17f50 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 28 26 70 2d  ession_close(&p-
17f60 3e 61 53 65 73 73 69 6f 6e 5b 69 5d 29 3b 0a 20  >aSession[i]);. 
17f70 20 7d 0a 20 20 70 2d 3e 6e 53 65 73 73 69 6f 6e   }.  p->nSession
17f80 20 3d 20 30 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20   = 0;.}.#else.# 
17f90 64 65 66 69 6e 65 20 73 65 73 73 69 6f 6e 5f 63  define session_c
17fa0 6c 6f 73 65 5f 61 6c 6c 28 58 29 0a 23 65 6e 64  lose_all(X).#end
17fb0 69 66 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d  if../*.** Implem
17fc0 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  entation of the 
17fd0 78 46 69 6c 74 65 72 20 66 75 6e 63 74 69 6f 6e  xFilter function
17fe0 20 66 6f 72 20 61 6e 20 6f 70 65 6e 20 73 65 73   for an open ses
17ff0 73 69 6f 6e 2e 20 20 4f 6d 69 74 0a 2a 2a 20 61  sion.  Omit.** a
18000 6e 79 20 74 61 62 6c 65 73 20 6e 61 6d 65 64 20  ny tables named 
18010 62 79 20 22 2e 73 65 73 73 69 6f 6e 20 66 69 6c  by ".session fil
18020 74 65 72 22 20 62 75 74 20 6c 65 74 20 61 6c 6c  ter" but let all
18030 20 6f 74 68 65 72 20 74 61 62 6c 65 20 74 68 72   other table thr
18040 6f 75 67 68 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  ough..*/.#if def
18050 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
18060 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 73 74 61 74  LE_SESSION).stat
18070 69 63 20 69 6e 74 20 73 65 73 73 69 6f 6e 5f 66  ic int session_f
18080 69 6c 74 65 72 28 76 6f 69 64 20 2a 70 43 74 78  ilter(void *pCtx
18090 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  , const char *zT
180a0 61 62 29 7b 0a 20 20 4f 70 65 6e 53 65 73 73 69  ab){.  OpenSessi
180b0 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 20 3d 20 28  on *pSession = (
180c0 4f 70 65 6e 53 65 73 73 69 6f 6e 2a 29 70 43 74  OpenSession*)pCt
180d0 78 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f  x;.  int i;.  fo
180e0 72 28 69 3d 30 3b 20 69 3c 70 53 65 73 73 69 6f  r(i=0; i<pSessio
180f0 6e 2d 3e 6e 46 69 6c 74 65 72 3b 20 69 2b 2b 29  n->nFilter; i++)
18100 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
18110 33 5f 73 74 72 67 6c 6f 62 28 70 53 65 73 73 69  3_strglob(pSessi
18120 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 69 5d 2c  on->azFilter[i],
18130 20 7a 54 61 62 29 3d 3d 30 20 29 20 72 65 74 75   zTab)==0 ) retu
18140 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75  rn 0;.  }.  retu
18150 72 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 1;.}.#endif..
18160 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 64 65 64  /*.** Try to ded
18170 75 63 65 20 74 68 65 20 74 79 70 65 20 6f 66 20  uce the type of 
18180 66 69 6c 65 20 66 6f 72 20 7a 4e 61 6d 65 20 62  file for zName b
18190 61 73 65 64 20 6f 6e 20 69 74 73 20 63 6f 6e 74  ased on its cont
181a0 65 6e 74 2e 20 20 52 65 74 75 72 6e 0a 2a 2a 20  ent.  Return.** 
181b0 6f 6e 65 20 6f 66 20 74 68 65 20 53 48 45 4c 4c  one of the SHELL
181c0 5f 4f 50 45 4e 5f 2a 20 63 6f 6e 73 74 61 6e 74  _OPEN_* constant
181d0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
181e0 20 64 65 64 75 63 65 44 61 74 61 62 61 73 65 54   deduceDatabaseT
181f0 79 70 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  ype(const char *
18200 7a 4e 61 6d 65 29 7b 0a 20 20 46 49 4c 45 20 2a  zName){.  FILE *
18210 66 20 3d 20 66 6f 70 65 6e 28 7a 4e 61 6d 65 2c  f = fopen(zName,
18220 20 22 72 62 22 29 3b 0a 20 20 73 69 7a 65 5f 74   "rb");.  size_t
18230 20 6e 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53   n;.  int rc = S
18240 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53 50 45 43  HELL_OPEN_UNSPEC
18250 3b 0a 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30  ;.  char zBuf[10
18260 30 5d 3b 0a 20 20 69 66 28 20 66 3d 3d 30 20 29  0];.  if( f==0 )
18270 20 72 65 74 75 72 6e 20 53 48 45 4c 4c 5f 4f 50   return SHELL_OP
18280 45 4e 5f 4e 4f 52 4d 41 4c 3b 0a 20 20 66 73 65  EN_NORMAL;.  fse
18290 65 6b 28 66 2c 20 2d 32 35 2c 20 53 45 45 4b 5f  ek(f, -25, SEEK_
182a0 45 4e 44 29 3b 0a 20 20 6e 20 3d 20 66 72 65 61  END);.  n = frea
182b0 64 28 7a 42 75 66 2c 20 32 35 2c 20 31 2c 20 66  d(zBuf, 25, 1, f
182c0 29 3b 0a 20 20 69 66 28 20 6e 3d 3d 31 20 26 26  );.  if( n==1 &&
182d0 20 6d 65 6d 63 6d 70 28 7a 42 75 66 2c 20 22 53   memcmp(zBuf, "S
182e0 74 61 72 74 2d 4f 66 2d 53 51 4c 69 74 65 33 2d  tart-Of-SQLite3-
182f0 22 2c 20 31 37 29 3d 3d 30 20 29 7b 0a 20 20 20  ", 17)==0 ){.   
18300 20 72 63 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e   rc = SHELL_OPEN
18310 5f 41 50 50 45 4e 44 56 46 53 3b 0a 20 20 7d 65  _APPENDVFS;.  }e
18320 6c 73 65 7b 0a 20 20 20 20 66 73 65 65 6b 28 66  lse{.    fseek(f
18330 2c 20 2d 32 32 2c 20 53 45 45 4b 5f 45 4e 44 29  , -22, SEEK_END)
18340 3b 0a 20 20 20 20 6e 20 3d 20 66 72 65 61 64 28  ;.    n = fread(
18350 7a 42 75 66 2c 20 32 32 2c 20 31 2c 20 66 29 3b  zBuf, 22, 1, f);
18360 0a 20 20 20 20 69 66 28 20 6e 3d 3d 31 20 26 26  .    if( n==1 &&
18370 20 7a 42 75 66 5b 30 5d 3d 3d 30 78 35 30 20 26   zBuf[0]==0x50 &
18380 26 20 7a 42 75 66 5b 31 5d 3d 3d 30 78 34 62 20  & zBuf[1]==0x4b 
18390 26 26 20 7a 42 75 66 5b 32 5d 3d 3d 30 78 30 35  && zBuf[2]==0x05
183a0 0a 20 20 20 20 20 20 20 26 26 20 7a 42 75 66 5b  .       && zBuf[
183b0 33 5d 3d 3d 30 78 30 36 20 29 7b 0a 20 20 20 20  3]==0x06 ){.    
183c0 20 20 72 63 20 3d 20 53 48 45 4c 4c 5f 4f 50 45    rc = SHELL_OPE
183d0 4e 5f 5a 49 50 46 49 4c 45 3b 0a 20 20 20 20 7d  N_ZIPFILE;.    }
183e0 0a 20 20 7d 0a 20 20 66 63 6c 6f 73 65 28 66 29  .  }.  fclose(f)
183f0 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 20 20  ;.  return rc;  
18400 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65 20 73  .}../*.** Make s
18410 75 72 65 20 74 68 65 20 64 61 74 61 62 61 73 65  ure the database
18420 20 69 73 20 6f 70 65 6e 2e 20 20 49 66 20 69 74   is open.  If it
18430 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20 6f 70   is not, then op
18440 65 6e 20 69 74 2e 20 20 49 66 0a 2a 2a 20 74 68  en it.  If.** th
18450 65 20 64 61 74 61 62 61 73 65 20 66 61 69 6c 73  e database fails
18460 20 74 6f 20 6f 70 65 6e 2c 20 70 72 69 6e 74 20   to open, print 
18470 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
18480 20 61 6e 64 20 65 78 69 74 2e 0a 2a 2f 0a 73 74   and exit..*/.st
18490 61 74 69 63 20 76 6f 69 64 20 6f 70 65 6e 5f 64  atic void open_d
184a0 62 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c  b(ShellState *p,
184b0 20 69 6e 74 20 6b 65 65 70 41 6c 69 76 65 29 7b   int keepAlive){
184c0 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20  .  if( p->db==0 
184d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  ){.    sqlite3_i
184e0 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20 20  nitialize();.   
184f0 20 69 66 28 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65   if( p->openMode
18500 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55 4e 53  ==SHELL_OPEN_UNS
18510 50 45 43 20 26 26 20 61 63 63 65 73 73 28 70 2d  PEC && access(p-
18520 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 30 29 3d  >zDbFilename,0)=
18530 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6f  =0 ){.      p->o
18540 70 65 6e 4d 6f 64 65 20 3d 20 64 65 64 75 63 65  penMode = deduce
18550 44 61 74 61 62 61 73 65 54 79 70 65 28 70 2d 3e  DatabaseType(p->
18560 7a 44 62 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  zDbFilename);.  
18570 20 20 7d 0a 20 20 20 20 73 77 69 74 63 68 28 20    }.    switch( 
18580 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 29 7b 0a 20  p->openMode ){. 
18590 20 20 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f       case SHELL_
185a0 4f 50 45 4e 5f 41 50 50 45 4e 44 56 46 53 3a 20  OPEN_APPENDVFS: 
185b0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
185c0 33 5f 6f 70 65 6e 5f 76 32 28 70 2d 3e 7a 44 62  3_open_v2(p->zDb
185d0 46 69 6c 65 6e 61 6d 65 2c 20 26 70 2d 3e 64 62  Filename, &p->db
185e0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 53 51  , .           SQ
185f0 4c 49 54 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52  LITE_OPEN_READWR
18600 49 54 45 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f  ITE|SQLITE_OPEN_
18610 43 52 45 41 54 45 2c 20 22 61 70 6e 64 76 66 73  CREATE, "apndvfs
18620 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  ");.        brea
18630 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
18640 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e   case SHELL_OPEN
18650 5f 5a 49 50 46 49 4c 45 3a 20 7b 0a 20 20 20 20  _ZIPFILE: {.    
18660 20 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e      sqlite3_open
18670 28 22 3a 6d 65 6d 6f 72 79 3a 22 2c 20 26 70 2d  (":memory:", &p-
18680 3e 64 62 29 3b 0a 20 20 20 20 20 20 20 20 62 72  >db);.        br
18690 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
186a0 20 20 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50     case SHELL_OP
186b0 45 4e 5f 55 4e 53 50 45 43 3a 0a 20 20 20 20 20  EN_UNSPEC:.     
186c0 20 63 61 73 65 20 53 48 45 4c 4c 5f 4f 50 45 4e   case SHELL_OPEN
186d0 5f 4e 4f 52 4d 41 4c 3a 20 7b 0a 20 20 20 20 20  _NORMAL: {.     
186e0 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28     sqlite3_open(
186f0 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20  p->zDbFilename, 
18700 26 70 2d 3e 64 62 29 3b 0a 20 20 20 20 20 20 20  &p->db);.       
18710 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
18720 20 20 20 20 7d 0a 20 20 20 20 67 6c 6f 62 61 6c      }.    global
18730 44 62 20 3d 20 70 2d 3e 64 62 3b 0a 20 20 20 20  Db = p->db;.    
18740 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20 7c 7c 20  if( p->db==0 || 
18750 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71 6c 69 74  SQLITE_OK!=sqlit
18760 65 33 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62  e3_errcode(p->db
18770 29 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  ) ){.      utf8_
18780 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
18790 72 72 6f 72 3a 20 75 6e 61 62 6c 65 20 74 6f 20  rror: unable to 
187a0 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 5c 22  open database \"
187b0 25 73 5c 22 3a 20 25 73 5c 6e 22 2c 0a 20 20 20  %s\": %s\n",.   
187c0 20 20 20 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c         p->zDbFil
187d0 65 6e 61 6d 65 2c 20 73 71 6c 69 74 65 33 5f 65  ename, sqlite3_e
187e0 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
187f0 20 20 20 20 20 69 66 28 20 6b 65 65 70 41 6c 69       if( keepAli
18800 76 65 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 20  ve ) return;.   
18810 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20 20     exit(1);.    
18820 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
18830 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e  _OMIT_LOAD_EXTEN
18840 53 49 4f 4e 0a 20 20 20 20 73 71 6c 69 74 65 33  SION.    sqlite3
18850 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f 65 78 74  _enable_load_ext
18860 65 6e 73 69 6f 6e 28 70 2d 3e 64 62 2c 20 31 29  ension(p->db, 1)
18870 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
18880 69 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e 69 74  ite3_fileio_init
18890 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20  (p->db, 0, 0);. 
188a0 20 20 20 73 71 6c 69 74 65 33 5f 73 68 61 74 68     sqlite3_shath
188b0 72 65 65 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20  ree_init(p->db, 
188c0 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
188d0 65 33 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f 69 6e  e3_completion_in
188e0 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b  it(p->db, 0, 0);
188f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 48  .#ifdef SQLITE_H
18900 41 56 45 5f 5a 4c 49 42 0a 20 20 20 20 73 71 6c  AVE_ZLIB.    sql
18910 69 74 65 33 5f 7a 69 70 66 69 6c 65 5f 69 6e 69  ite3_zipfile_ini
18920 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a  t(p->db, 0, 0);.
18930 20 20 20 20 73 71 6c 69 74 65 33 5f 73 71 6c 61      sqlite3_sqla
18940 72 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c  r_init(p->db, 0,
18950 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   0);.#endif.    
18960 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f 66  sqlite3_create_f
18970 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20 22  unction(p->db, "
18980 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68 65 6d 61  shell_add_schema
18990 22 2c 20 33 2c 20 53 51 4c 49 54 45 5f 55 54 46  ", 3, SQLITE_UTF
189a0 38 2c 20 30 2c 0a 20 20 20 20 20 20 20 20 20 20  8, 0,.          
189b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
189c0 20 20 73 68 65 6c 6c 41 64 64 53 63 68 65 6d 61    shellAddSchema
189d0 4e 61 6d 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  Name, 0, 0);.   
189e0 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65 5f   sqlite3_create_
189f0 66 75 6e 63 74 69 6f 6e 28 70 2d 3e 64 62 2c 20  function(p->db, 
18a00 22 73 68 65 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63  "shell_module_sc
18a10 68 65 6d 61 22 2c 20 31 2c 20 53 51 4c 49 54 45  hema", 1, SQLITE
18a20 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20 20 20 20  _UTF8, 0,.      
18a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a40 20 20 20 20 20 20 73 68 65 6c 6c 4d 6f 64 75 6c        shellModul
18a50 65 53 63 68 65 6d 61 2c 20 30 2c 20 30 29 3b 0a  eSchema, 0, 0);.
18a60 20 20 20 20 69 66 28 20 70 2d 3e 6f 70 65 6e 4d      if( p->openM
18a70 6f 64 65 3d 3d 53 48 45 4c 4c 5f 4f 50 45 4e 5f  ode==SHELL_OPEN_
18a80 5a 49 50 46 49 4c 45 20 29 7b 0a 20 20 20 20 20  ZIPFILE ){.     
18a90 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71   char *zSql = sq
18aa0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
18ab0 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
18ac0 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 7a 69  VIRTUAL TABLE zi
18ad0 70 20 55 53 49 4e 47 20 7a 69 70 66 69 6c 65 28  p USING zipfile(
18ae0 25 51 29 3b 22 2c 20 70 2d 3e 7a 44 62 46 69 6c  %Q);", p->zDbFil
18af0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 73 71  ename);.      sq
18b00 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
18b10 2c 20 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 30 29  , zSql, 0, 0, 0)
18b20 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
18b30 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
18b40 7d 0a 20 20 7d 0a 7d 0a 0a 23 69 66 20 48 41 56  }.  }.}..#if HAV
18b50 45 5f 52 45 41 44 4c 49 4e 45 20 7c 7c 20 48 41  E_READLINE || HA
18b60 56 45 5f 45 44 49 54 4c 49 4e 45 0a 2f 2a 0a 2a  VE_EDITLINE./*.*
18b70 2a 20 52 65 61 64 6c 69 6e 65 20 63 6f 6d 70 6c  * Readline compl
18b80 65 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b 73 0a  etion callbacks.
18b90 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
18ba0 72 65 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74  readline_complet
18bb0 69 6f 6e 5f 67 65 6e 65 72 61 74 6f 72 28 63 6f  ion_generator(co
18bc0 6e 73 74 20 63 68 61 72 20 2a 74 65 78 74 2c 20  nst char *text, 
18bd0 69 6e 74 20 73 74 61 74 65 29 7b 0a 20 20 73 74  int state){.  st
18be0 61 74 69 63 20 73 71 6c 69 74 65 33 5f 73 74 6d  atic sqlite3_stm
18bf0 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
18c00 63 68 61 72 20 2a 7a 52 65 74 3b 0a 20 20 69 66  char *zRet;.  if
18c10 28 20 73 74 61 74 65 3d 3d 30 20 29 7b 0a 20 20  ( state==0 ){.  
18c20 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
18c30 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
18c40 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7a  ze(pStmt);.    z
18c50 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
18c60 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 44 49  rintf("SELECT DI
18c70 53 54 49 4e 43 54 20 63 61 6e 64 69 64 61 74 65  STINCT candidate
18c80 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 22   COLLATE nocase"
18c90 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18ca0 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 46              "  F
18cb0 52 4f 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e 28 25  ROM completion(%
18cc0 51 29 20 4f 52 44 45 52 20 42 59 20 31 22 2c 20  Q) ORDER BY 1", 
18cd0 74 65 78 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  text);.    sqlit
18ce0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 67 6c  e3_prepare_v2(gl
18cf0 6f 62 61 6c 44 62 2c 20 7a 53 71 6c 2c 20 2d 31  obalDb, zSql, -1
18d00 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
18d10 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
18d20 53 71 6c 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Sql);.  }.  if( 
18d30 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
18d40 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20  mt)==SQLITE_ROW 
18d50 29 7b 0a 20 20 20 20 7a 52 65 74 20 3d 20 73 74  ){.    zRet = st
18d60 72 64 75 70 28 28 63 6f 6e 73 74 20 63 68 61 72  rdup((const char
18d70 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
18d80 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 29  _text(pStmt, 0))
18d90 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
18da0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
18db0 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 53 74 6d  pStmt);.    pStm
18dc0 74 20 3d 20 30 3b 0a 20 20 20 20 7a 52 65 74 20  t = 0;.    zRet 
18dd0 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
18de0 6e 20 7a 52 65 74 3b 0a 7d 0a 73 74 61 74 69 63  n zRet;.}.static
18df0 20 63 68 61 72 20 2a 2a 72 65 61 64 6c 69 6e 65   char **readline
18e00 5f 63 6f 6d 70 6c 65 74 69 6f 6e 28 63 6f 6e 73  _completion(cons
18e10 74 20 63 68 61 72 20 2a 7a 54 65 78 74 2c 20 69  t char *zText, i
18e20 6e 74 20 69 53 74 61 72 74 2c 20 69 6e 74 20 69  nt iStart, int i
18e30 45 6e 64 29 7b 0a 20 20 72 6c 5f 61 74 74 65 6d  End){.  rl_attem
18e40 70 74 65 64 5f 63 6f 6d 70 6c 65 74 69 6f 6e 5f  pted_completion_
18e50 6f 76 65 72 20 3d 20 31 3b 0a 20 20 72 65 74 75  over = 1;.  retu
18e60 72 6e 20 72 6c 5f 63 6f 6d 70 6c 65 74 69 6f 6e  rn rl_completion
18e70 5f 6d 61 74 63 68 65 73 28 7a 54 65 78 74 2c 20  _matches(zText, 
18e80 72 65 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74  readline_complet
18e90 69 6f 6e 5f 67 65 6e 65 72 61 74 6f 72 29 3b 0a  ion_generator);.
18ea0 7d 0a 0a 23 65 6c 69 66 20 48 41 56 45 5f 4c 49  }..#elif HAVE_LI
18eb0 4e 45 4e 4f 49 53 45 0a 2f 2a 0a 2a 2a 20 4c 69  NENOISE./*.** Li
18ec0 6e 65 6e 6f 69 73 65 20 63 6f 6d 70 6c 65 74 69  nenoise completi
18ed0 6f 6e 20 63 61 6c 6c 62 61 63 6b 0a 2a 2f 0a 73  on callback.*/.s
18ee0 74 61 74 69 63 20 76 6f 69 64 20 6c 69 6e 65 6e  tatic void linen
18ef0 6f 69 73 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e 28  oise_completion(
18f00 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69 6e  const char *zLin
18f10 65 2c 20 6c 69 6e 65 6e 6f 69 73 65 43 6f 6d 70  e, linenoiseComp
18f20 6c 65 74 69 6f 6e 73 20 2a 6c 63 29 7b 0a 20 20  letions *lc){.  
18f30 69 6e 74 20 6e 4c 69 6e 65 20 3d 20 73 74 72 6c  int nLine = strl
18f40 65 6e 33 30 28 7a 4c 69 6e 65 29 3b 0a 20 20 69  en30(zLine);.  i
18f50 6e 74 20 69 2c 20 69 53 74 61 72 74 3b 0a 20 20  nt i, iStart;.  
18f60 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
18f70 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20  tmt = 0;.  char 
18f80 2a 7a 53 71 6c 3b 0a 20 20 63 68 61 72 20 7a 42  *zSql;.  char zB
18f90 75 66 5b 31 30 30 30 5d 3b 0a 0a 20 20 69 66 28  uf[1000];..  if(
18fa0 20 6e 4c 69 6e 65 3e 73 69 7a 65 6f 66 28 7a 42   nLine>sizeof(zB
18fb0 75 66 29 2d 33 30 20 29 20 72 65 74 75 72 6e 3b  uf)-30 ) return;
18fc0 0a 20 20 69 66 28 20 7a 4c 69 6e 65 5b 30 5d 3d  .  if( zLine[0]=
18fd0 3d 27 2e 27 20 29 20 72 65 74 75 72 6e 3b 0a 20  ='.' ) return;. 
18fe0 20 66 6f 72 28 69 3d 6e 4c 69 6e 65 2d 31 3b 20   for(i=nLine-1; 
18ff0 69 3e 3d 30 20 26 26 20 28 69 73 61 6c 6e 75 6d  i>=0 && (isalnum
19000 28 7a 4c 69 6e 65 5b 69 5d 29 20 7c 7c 20 7a 4c  (zLine[i]) || zL
19010 69 6e 65 5b 69 5d 3d 3d 27 5f 27 29 3b 20 69 2d  ine[i]=='_'); i-
19020 2d 29 7b 7d 0a 20 20 69 66 28 20 69 3d 3d 6e 4c  -){}.  if( i==nL
19030 69 6e 65 2d 31 20 29 20 72 65 74 75 72 6e 3b 0a  ine-1 ) return;.
19040 20 20 69 53 74 61 72 74 20 3d 20 69 2b 31 3b 0a    iStart = i+1;.
19050 20 20 6d 65 6d 63 70 79 28 7a 42 75 66 2c 20 7a    memcpy(zBuf, z
19060 4c 69 6e 65 2c 20 69 53 74 61 72 74 29 3b 0a 20  Line, iStart);. 
19070 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
19080 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
19090 44 49 53 54 49 4e 43 54 20 63 61 6e 64 69 64 61  DISTINCT candida
190a0 74 65 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  te COLLATE nocas
190b0 65 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e".             
190c0 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 46              "  F
190d0 52 4f 4d 20 63 6f 6d 70 6c 65 74 69 6f 6e 28 25  ROM completion(%
190e0 51 2c 25 51 29 20 4f 52 44 45 52 20 42 59 20 31  Q,%Q) ORDER BY 1
190f0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
19100 20 20 20 20 20 20 20 20 20 20 20 20 26 7a 4c 69              &zLi
19110 6e 65 5b 69 53 74 61 72 74 5d 2c 20 7a 4c 69 6e  ne[iStart], zLin
19120 65 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70 72  e);.  sqlite3_pr
19130 65 70 61 72 65 5f 76 32 28 67 6c 6f 62 61 6c 44  epare_v2(globalD
19140 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
19150 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c 69 74  tmt, 0);.  sqlit
19160 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
19170 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 67 6c   sqlite3_exec(gl
19180 6f 62 61 6c 44 62 2c 20 22 50 52 41 47 4d 41 20  obalDb, "PRAGMA 
19190 70 61 67 65 5f 63 6f 75 6e 74 22 2c 20 30 2c 20  page_count", 0, 
191a0 30 2c 20 30 29 3b 20 2f 2a 20 4c 6f 61 64 20 74  0, 0); /* Load t
191b0 68 65 20 73 63 68 65 6d 61 20 2a 2f 0a 20 20 77  he schema */.  w
191c0 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74  hile( sqlite3_st
191d0 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
191e0 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e  E_ROW ){.    con
191f0 73 74 20 63 68 61 72 20 2a 7a 43 6f 6d 70 6c 65  st char *zComple
19200 74 69 6f 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68  tion = (const ch
19210 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
19220 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30  mn_text(pStmt, 0
19230 29 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6d 70  );.    int nComp
19240 6c 65 74 69 6f 6e 20 3d 20 73 71 6c 69 74 65 33  letion = sqlite3
19250 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53  _column_bytes(pS
19260 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  tmt, 0);.    if(
19270 20 69 53 74 61 72 74 2b 6e 43 6f 6d 70 6c 65 74   iStart+nComplet
19280 69 6f 6e 20 3c 20 73 69 7a 65 6f 66 28 7a 42 75  ion < sizeof(zBu
19290 66 29 2d 31 20 29 7b 0a 20 20 20 20 20 20 6d 65  f)-1 ){.      me
192a0 6d 63 70 79 28 7a 42 75 66 2b 69 53 74 61 72 74  mcpy(zBuf+iStart
192b0 2c 20 7a 43 6f 6d 70 6c 65 74 69 6f 6e 2c 20 6e  , zCompletion, n
192c0 43 6f 6d 70 6c 65 74 69 6f 6e 2b 31 29 3b 0a 20  Completion+1);. 
192d0 20 20 20 20 20 6c 69 6e 65 6e 6f 69 73 65 41 64       linenoiseAd
192e0 64 43 6f 6d 70 6c 65 74 69 6f 6e 28 6c 63 2c 20  dCompletion(lc, 
192f0 7a 42 75 66 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  zBuf);.    }.  }
19300 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
19310 69 7a 65 28 70 53 74 6d 74 29 3b 0a 7d 0a 23 65  ize(pStmt);.}.#e
19320 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 43  ndif../*.** Do C
19330 2d 6c 61 6e 67 75 61 67 65 20 73 74 79 6c 65 20  -language style 
19340 64 65 71 75 6f 74 69 6e 67 2e 0a 2a 2a 0a 2a 2a  dequoting..**.**
19350 20 20 20 20 5c 61 20 20 20 20 2d 3e 20 61 6c 61      \a    -> ala
19360 72 6d 0a 2a 2a 20 20 20 20 5c 62 20 20 20 20 2d  rm.**    \b    -
19370 3e 20 62 61 63 6b 73 70 61 63 65 0a 2a 2a 20 20  > backspace.**  
19380 20 20 5c 74 20 20 20 20 2d 3e 20 74 61 62 0a 2a    \t    -> tab.*
19390 2a 20 20 20 20 5c 6e 20 20 20 20 2d 3e 20 6e 65  *    \n    -> ne
193a0 77 6c 69 6e 65 0a 2a 2a 20 20 20 20 5c 76 20 20  wline.**    \v  
193b0 20 20 2d 3e 20 76 65 72 74 69 63 61 6c 20 74 61    -> vertical ta
193c0 62 0a 2a 2a 20 20 20 20 5c 66 20 20 20 20 2d 3e  b.**    \f    ->
193d0 20 66 6f 72 6d 20 66 65 65 64 0a 2a 2a 20 20 20   form feed.**   
193e0 20 5c 72 20 20 20 20 2d 3e 20 63 61 72 72 69 61   \r    -> carria
193f0 67 65 20 72 65 74 75 72 6e 0a 2a 2a 20 20 20 20  ge return.**    
19400 5c 73 20 20 20 20 2d 3e 20 73 70 61 63 65 0a 2a  \s    -> space.*
19410 2a 20 20 20 20 5c 22 20 20 20 20 2d 3e 20 22 0a  *    \"    -> ".
19420 2a 2a 20 20 20 20 5c 27 20 20 20 20 2d 3e 20 27  **    \'    -> '
19430 0a 2a 2a 20 20 20 20 5c 5c 20 20 20 20 2d 3e 20  .**    \\    -> 
19440 62 61 63 6b 73 6c 61 73 68 0a 2a 2a 20 20 20 20  backslash.**    
19450 5c 4e 4e 4e 20 20 2d 3e 20 61 73 63 69 69 20 63  \NNN  -> ascii c
19460 68 61 72 61 63 74 65 72 20 4e 4e 4e 20 69 6e 20  haracter NNN in 
19470 6f 63 74 61 6c 0a 2a 2f 0a 73 74 61 74 69 63 20  octal.*/.static 
19480 76 6f 69 64 20 72 65 73 6f 6c 76 65 5f 62 61 63  void resolve_bac
19490 6b 73 6c 61 73 68 65 73 28 63 68 61 72 20 2a 7a  kslashes(char *z
194a0 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20  ){.  int i, j;. 
194b0 20 63 68 61 72 20 63 3b 0a 20 20 77 68 69 6c 65   char c;.  while
194c0 28 20 2a 7a 20 26 26 20 2a 7a 21 3d 27 5c 5c 27  ( *z && *z!='\\'
194d0 20 29 20 7a 2b 2b 3b 0a 20 20 66 6f 72 28 69 3d   ) z++;.  for(i=
194e0 6a 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21  j=0; (c = z[i])!
194f0 3d 30 3b 20 69 2b 2b 2c 20 6a 2b 2b 29 7b 0a 20  =0; i++, j++){. 
19500 20 20 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20 26     if( c=='\\' &
19510 26 20 7a 5b 69 2b 31 5d 21 3d 30 20 29 7b 0a 20  & z[i+1]!=0 ){. 
19520 20 20 20 20 20 63 20 3d 20 7a 5b 2b 2b 69 5d 3b       c = z[++i];
19530 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 61  .      if( c=='a
19540 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
19550 20 27 5c 61 27 3b 0a 20 20 20 20 20 20 7d 65 6c   '\a';.      }el
19560 73 65 20 69 66 28 20 63 3d 3d 27 62 27 20 29 7b  se if( c=='b' ){
19570 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 62  .        c = '\b
19580 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
19590 66 28 20 63 3d 3d 27 74 27 20 29 7b 0a 20 20 20  f( c=='t' ){.   
195a0 20 20 20 20 20 63 20 3d 20 27 5c 74 27 3b 0a 20       c = '\t';. 
195b0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
195c0 3d 3d 27 6e 27 20 29 7b 0a 20 20 20 20 20 20 20  =='n' ){.       
195d0 20 63 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20   c = '\n';.     
195e0 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 76   }else if( c=='v
195f0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
19600 20 27 5c 76 27 3b 0a 20 20 20 20 20 20 7d 65 6c   '\v';.      }el
19610 73 65 20 69 66 28 20 63 3d 3d 27 66 27 20 29 7b  se if( c=='f' ){
19620 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 66  .        c = '\f
19630 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
19640 66 28 20 63 3d 3d 27 72 27 20 29 7b 0a 20 20 20  f( c=='r' ){.   
19650 20 20 20 20 20 63 20 3d 20 27 5c 72 27 3b 0a 20       c = '\r';. 
19660 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
19670 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20 20  =='"' ){.       
19680 20 63 20 3d 20 27 22 27 3b 0a 20 20 20 20 20 20   c = '"';.      
19690 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 27  }else if( c=='\'
196a0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
196b0 20 27 5c 27 27 3b 0a 20 20 20 20 20 20 7d 65 6c   '\'';.      }el
196c0 73 65 20 69 66 28 20 63 3d 3d 27 5c 5c 27 20 29  se if( c=='\\' )
196d0 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c  {.        c = '\
196e0 5c 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  \';.      }else 
196f0 69 66 28 20 63 3e 3d 27 30 27 20 26 26 20 63 3c  if( c>='0' && c<
19700 3d 27 37 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='7' ){.        
19710 63 20 2d 3d 20 27 30 27 3b 0a 20 20 20 20 20 20  c -= '0';.      
19720 20 20 69 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30    if( z[i+1]>='0
19730 27 20 26 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27  ' && z[i+1]<='7'
19740 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 2b   ){.          i+
19750 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 63 20 3d  +;.          c =
19760 20 28 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d 20 2d   (c<<3) + z[i] -
19770 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20 20 20   '0';.          
19780 69 66 28 20 7a 5b 69 2b 31 5d 3e 3d 27 30 27 20  if( z[i+1]>='0' 
19790 26 26 20 7a 5b 69 2b 31 5d 3c 3d 27 37 27 20 29  && z[i+1]<='7' )
197a0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 2b  {.            i+
197b0 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  +;.            c
197c0 20 3d 20 28 63 3c 3c 33 29 20 2b 20 7a 5b 69 5d   = (c<<3) + z[i]
197d0 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20 20 20   - '0';.        
197e0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
197f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
19800 7a 5b 6a 5d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20  z[j] = c;.  }.  
19810 69 66 28 20 6a 3c 69 20 29 20 7a 5b 6a 5d 20 3d  if( j<i ) z[j] =
19820 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
19830 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20 6f 66  urn the value of
19840 20 61 20 68 65 78 61 64 65 63 69 6d 61 6c 20 64   a hexadecimal d
19850 69 67 69 74 2e 20 20 52 65 74 75 72 6e 20 2d 31  igit.  Return -1
19860 20 69 66 20 74 68 65 20 69 6e 70 75 74 0a 2a 2a   if the input.**
19870 20 69 73 20 6e 6f 74 20 61 20 68 65 78 20 64 69   is not a hex di
19880 67 69 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  git..*/.static i
19890 6e 74 20 68 65 78 44 69 67 69 74 56 61 6c 75 65  nt hexDigitValue
198a0 28 63 68 61 72 20 63 29 7b 0a 20 20 69 66 28 20  (char c){.  if( 
198b0 63 3e 3d 27 30 27 20 26 26 20 63 3c 3d 27 39 27  c>='0' && c<='9'
198c0 20 29 20 72 65 74 75 72 6e 20 63 20 2d 20 27 30   ) return c - '0
198d0 27 3b 0a 20 20 69 66 28 20 63 3e 3d 27 61 27 20  ';.  if( c>='a' 
198e0 26 26 20 63 3c 3d 27 66 27 20 29 20 72 65 74 75  && c<='f' ) retu
198f0 72 6e 20 63 20 2d 20 27 61 27 20 2b 20 31 30 3b  rn c - 'a' + 10;
19900 0a 20 20 69 66 28 20 63 3e 3d 27 41 27 20 26 26  .  if( c>='A' &&
19910 20 63 3c 3d 27 46 27 20 29 20 72 65 74 75 72 6e   c<='F' ) return
19920 20 63 20 2d 20 27 41 27 20 2b 20 31 30 3b 0a 20   c - 'A' + 10;. 
19930 20 72 65 74 75 72 6e 20 2d 31 3b 0a 7d 0a 0a 2f   return -1;.}../
19940 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65 74 20 7a  *.** Interpret z
19950 41 72 67 20 61 73 20 61 6e 20 69 6e 74 65 67 65  Arg as an intege
19960 72 20 76 61 6c 75 65 2c 20 70 6f 73 73 69 62 6c  r value, possibl
19970 79 20 77 69 74 68 20 73 75 66 66 69 78 65 73 2e  y with suffixes.
19980 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74  .*/.static sqlit
19990 65 33 5f 69 6e 74 36 34 20 69 6e 74 65 67 65 72  e3_int64 integer
199a0 56 61 6c 75 65 28 63 6f 6e 73 74 20 63 68 61 72  Value(const char
199b0 20 2a 7a 41 72 67 29 7b 0a 20 20 73 71 6c 69 74   *zArg){.  sqlit
199c0 65 33 5f 69 6e 74 36 34 20 76 20 3d 20 30 3b 0a  e3_int64 v = 0;.
199d0 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
199e0 74 72 75 63 74 20 7b 20 63 68 61 72 20 2a 7a 53  truct { char *zS
199f0 75 66 66 69 78 3b 20 69 6e 74 20 69 4d 75 6c 74  uffix; int iMult
19a00 3b 20 7d 20 61 4d 75 6c 74 5b 5d 20 3d 20 7b 0a  ; } aMult[] = {.
19a10 20 20 20 20 7b 20 22 4b 69 42 22 2c 20 31 30 32      { "KiB", 102
19a20 34 20 7d 2c 0a 20 20 20 20 7b 20 22 4d 69 42 22  4 },.    { "MiB"
19a30 2c 20 31 30 32 34 2a 31 30 32 34 20 7d 2c 0a 20  , 1024*1024 },. 
19a40 20 20 20 7b 20 22 47 69 42 22 2c 20 31 30 32 34     { "GiB", 1024
19a50 2a 31 30 32 34 2a 31 30 32 34 20 7d 2c 0a 20 20  *1024*1024 },.  
19a60 20 20 7b 20 22 4b 42 22 2c 20 20 31 30 30 30 20    { "KB",  1000 
19a70 7d 2c 0a 20 20 20 20 7b 20 22 4d 42 22 2c 20 20  },.    { "MB",  
19a80 31 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b  1000000 },.    {
19a90 20 22 47 42 22 2c 20 20 31 30 30 30 30 30 30 30   "GB",  10000000
19aa0 30 30 20 7d 2c 0a 20 20 20 20 7b 20 22 4b 22 2c  00 },.    { "K",
19ab0 20 20 20 31 30 30 30 20 7d 2c 0a 20 20 20 20 7b     1000 },.    {
19ac0 20 22 4d 22 2c 20 20 20 31 30 30 30 30 30 30 20   "M",   1000000 
19ad0 7d 2c 0a 20 20 20 20 7b 20 22 47 22 2c 20 20 20  },.    { "G",   
19ae0 31 30 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20  1000000000 },.  
19af0 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  };.  int i;.  in
19b00 74 20 69 73 4e 65 67 20 3d 20 30 3b 0a 20 20 69  t isNeg = 0;.  i
19b10 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 2d 27 20  f( zArg[0]=='-' 
19b20 29 7b 0a 20 20 20 20 69 73 4e 65 67 20 3d 20 31  ){.    isNeg = 1
19b30 3b 0a 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20  ;.    zArg++;.  
19b40 7d 65 6c 73 65 20 69 66 28 20 7a 41 72 67 5b 30  }else if( zArg[0
19b50 5d 3d 3d 27 2b 27 20 29 7b 0a 20 20 20 20 7a 41  ]=='+' ){.    zA
19b60 72 67 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rg++;.  }.  if( 
19b70 7a 41 72 67 5b 30 5d 3d 3d 27 30 27 20 26 26 20  zArg[0]=='0' && 
19b80 7a 41 72 67 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a  zArg[1]=='x' ){.
19b90 20 20 20 20 69 6e 74 20 78 3b 0a 20 20 20 20 7a      int x;.    z
19ba0 41 72 67 20 2b 3d 20 32 3b 0a 20 20 20 20 77 68  Arg += 2;.    wh
19bb0 69 6c 65 28 20 28 78 20 3d 20 68 65 78 44 69 67  ile( (x = hexDig
19bc0 69 74 56 61 6c 75 65 28 7a 41 72 67 5b 30 5d 29  itValue(zArg[0])
19bd0 29 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20  )>=0 ){.      v 
19be0 3d 20 28 76 3c 3c 34 29 20 2b 20 78 3b 0a 20 20  = (v<<4) + x;.  
19bf0 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20 20 20      zArg++;.    
19c00 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 77  }.  }else{.    w
19c10 68 69 6c 65 28 20 49 73 44 69 67 69 74 28 7a 41  hile( IsDigit(zA
19c20 72 67 5b 30 5d 29 20 29 7b 0a 20 20 20 20 20 20  rg[0]) ){.      
19c30 76 20 3d 20 76 2a 31 30 20 2b 20 7a 41 72 67 5b  v = v*10 + zArg[
19c40 30 5d 20 2d 20 27 30 27 3b 0a 20 20 20 20 20 20  0] - '0';.      
19c50 7a 41 72 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20  zArg++;.    }.  
19c60 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41  }.  for(i=0; i<A
19c70 72 72 61 79 53 69 7a 65 28 61 4d 75 6c 74 29 3b  rraySize(aMult);
19c80 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73   i++){.    if( s
19c90 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 61  qlite3_stricmp(a
19ca0 4d 75 6c 74 5b 69 5d 2e 7a 53 75 66 66 69 78 2c  Mult[i].zSuffix,
19cb0 20 7a 41 72 67 29 3d 3d 30 20 29 7b 0a 20 20 20   zArg)==0 ){.   
19cc0 20 20 20 76 20 2a 3d 20 61 4d 75 6c 74 5b 69 5d     v *= aMult[i]
19cd0 2e 69 4d 75 6c 74 3b 0a 20 20 20 20 20 20 62 72  .iMult;.      br
19ce0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  eak;.    }.  }. 
19cf0 20 72 65 74 75 72 6e 20 69 73 4e 65 67 3f 20 2d   return isNeg? -
19d00 76 20 3a 20 76 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  v : v;.}../*.** 
19d10 49 6e 74 65 72 70 72 65 74 20 7a 41 72 67 20 61  Interpret zArg a
19d20 73 20 65 69 74 68 65 72 20 61 6e 20 69 6e 74 65  s either an inte
19d30 67 65 72 20 6f 72 20 61 20 62 6f 6f 6c 65 61 6e  ger or a boolean
19d40 20 76 61 6c 75 65 2e 20 20 52 65 74 75 72 6e 20   value.  Return 
19d50 31 20 6f 72 20 30 0a 2a 2a 20 66 6f 72 20 54 52  1 or 0.** for TR
19d60 55 45 20 61 6e 64 20 46 41 4c 53 45 2e 20 20 52  UE and FALSE.  R
19d70 65 74 75 72 6e 20 74 68 65 20 69 6e 74 65 67 65  eturn the intege
19d80 72 20 76 61 6c 75 65 20 69 66 20 61 70 70 72 6f  r value if appro
19d90 70 72 69 61 74 65 2e 0a 2a 2f 0a 73 74 61 74 69  priate..*/.stati
19da0 63 20 69 6e 74 20 62 6f 6f 6c 65 61 6e 56 61 6c  c int booleanVal
19db0 75 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ue(const char *z
19dc0 41 72 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Arg){.  int i;. 
19dd0 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 30   if( zArg[0]=='0
19de0 27 20 26 26 20 7a 41 72 67 5b 31 5d 3d 3d 27 78  ' && zArg[1]=='x
19df0 27 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 32  ' ){.    for(i=2
19e00 3b 20 68 65 78 44 69 67 69 74 56 61 6c 75 65 28  ; hexDigitValue(
19e10 7a 41 72 67 5b 69 5d 29 3e 3d 30 3b 20 69 2b 2b  zArg[i])>=0; i++
19e20 29 7b 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ){}.  }else{.   
19e30 20 66 6f 72 28 69 3d 30 3b 20 7a 41 72 67 5b 69   for(i=0; zArg[i
19e40 5d 3e 3d 27 30 27 20 26 26 20 7a 41 72 67 5b 69  ]>='0' && zArg[i
19e50 5d 3c 3d 27 39 27 3b 20 69 2b 2b 29 7b 7d 0a 20  ]<='9'; i++){}. 
19e60 20 7d 0a 20 20 69 66 28 20 69 3e 30 20 26 26 20   }.  if( i>0 && 
19e70 7a 41 72 67 5b 69 5d 3d 3d 30 20 29 20 72 65 74  zArg[i]==0 ) ret
19e80 75 72 6e 20 28 69 6e 74 29 28 69 6e 74 65 67 65  urn (int)(intege
19e90 72 56 61 6c 75 65 28 7a 41 72 67 29 20 26 20 30  rValue(zArg) & 0
19ea0 78 66 66 66 66 66 66 66 66 29 3b 0a 20 20 69 66  xffffffff);.  if
19eb0 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d  ( sqlite3_stricm
19ec0 70 28 7a 41 72 67 2c 20 22 6f 6e 22 29 3d 3d 30  p(zArg, "on")==0
19ed0 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69   || sqlite3_stri
19ee0 63 6d 70 28 7a 41 72 67 2c 22 79 65 73 22 29 3d  cmp(zArg,"yes")=
19ef0 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
19f00 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20 73 71   1;.  }.  if( sq
19f10 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41  lite3_stricmp(zA
19f20 72 67 2c 20 22 6f 66 66 22 29 3d 3d 30 20 7c 7c  rg, "off")==0 ||
19f30 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70   sqlite3_stricmp
19f40 28 7a 41 72 67 2c 22 6e 6f 22 29 3d 3d 30 20 29  (zArg,"no")==0 )
19f50 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
19f60 20 20 7d 0a 20 20 75 74 66 38 5f 70 72 69 6e 74    }.  utf8_print
19f70 66 28 73 74 64 65 72 72 2c 20 22 45 52 52 4f 52  f(stderr, "ERROR
19f80 3a 20 4e 6f 74 20 61 20 62 6f 6f 6c 65 61 6e 20  : Not a boolean 
19f90 76 61 6c 75 65 3a 20 5c 22 25 73 5c 22 2e 20 41  value: \"%s\". A
19fa0 73 73 75 6d 69 6e 67 20 5c 22 6e 6f 5c 22 2e 5c  ssuming \"no\".\
19fb0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 7a 41  n",.          zA
19fc0 72 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  rg);.  return 0;
19fd0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 6f 72  .}../*.** Set or
19fe0 20 63 6c 65 61 72 20 61 20 73 68 65 6c 6c 20 66   clear a shell f
19ff0 6c 61 67 20 61 63 63 6f 72 64 69 6e 67 20 74 6f  lag according to
1a000 20 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65   a boolean value
1a010 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
1a020 20 73 65 74 4f 72 43 6c 65 61 72 46 6c 61 67 28   setOrClearFlag(
1a030 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 75  ShellState *p, u
1a040 6e 73 69 67 6e 65 64 20 6d 46 6c 61 67 2c 20 63  nsigned mFlag, c
1a050 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 29  onst char *zArg)
1a060 7b 0a 20 20 69 66 28 20 62 6f 6f 6c 65 61 6e 56  {.  if( booleanV
1a070 61 6c 75 65 28 7a 41 72 67 29 20 29 7b 0a 20 20  alue(zArg) ){.  
1a080 20 20 53 68 65 6c 6c 53 65 74 46 6c 61 67 28 70    ShellSetFlag(p
1a090 2c 20 6d 46 6c 61 67 29 3b 0a 20 20 7d 65 6c 73  , mFlag);.  }els
1a0a0 65 7b 0a 20 20 20 20 53 68 65 6c 6c 43 6c 65 61  e{.    ShellClea
1a0b0 72 46 6c 61 67 28 70 2c 20 6d 46 6c 61 67 29 3b  rFlag(p, mFlag);
1a0c0 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c  .  }.}../*.** Cl
1a0d0 6f 73 65 20 61 6e 20 6f 75 74 70 75 74 20 66 69  ose an output fi
1a0e0 6c 65 2c 20 61 73 73 75 6d 69 6e 67 20 69 74 20  le, assuming it 
1a0f0 69 73 20 6e 6f 74 20 73 74 64 65 72 72 20 6f 72  is not stderr or
1a100 20 73 74 64 6f 75 74 0a 2a 2f 0a 73 74 61 74 69   stdout.*/.stati
1a110 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 66 69  c void output_fi
1a120 6c 65 5f 63 6c 6f 73 65 28 46 49 4c 45 20 2a 66  le_close(FILE *f
1a130 29 7b 0a 20 20 69 66 28 20 66 20 26 26 20 66 21  ){.  if( f && f!
1a140 3d 73 74 64 6f 75 74 20 26 26 20 66 21 3d 73 74  =stdout && f!=st
1a150 64 65 72 72 20 29 20 66 63 6c 6f 73 65 28 66 29  derr ) fclose(f)
1a160 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74  ;.}../*.** Try t
1a170 6f 20 6f 70 65 6e 20 61 6e 20 6f 75 74 70 75 74  o open an output
1a180 20 66 69 6c 65 2e 20 20 20 54 68 65 20 6e 61 6d   file.   The nam
1a190 65 73 20 22 73 74 64 6f 75 74 22 20 61 6e 64 20  es "stdout" and 
1a1a0 22 73 74 64 65 72 72 22 20 61 72 65 0a 2a 2a 20  "stderr" are.** 
1a1b0 72 65 63 6f 67 6e 69 7a 65 64 20 61 6e 64 20 64  recognized and d
1a1c0 6f 20 74 68 65 20 72 69 67 68 74 20 74 68 69 6e  o the right thin
1a1d0 67 2e 20 20 4e 55 4c 4c 20 69 73 20 72 65 74 75  g.  NULL is retu
1a1e0 72 6e 65 64 20 69 66 20 74 68 65 20 6f 75 74 70  rned if the outp
1a1f0 75 74 0a 2a 2a 20 66 69 6c 65 6e 61 6d 65 20 69  ut.** filename i
1a200 73 20 22 6f 66 66 22 2e 0a 2a 2f 0a 73 74 61 74  s "off"..*/.stat
1a210 69 63 20 46 49 4c 45 20 2a 6f 75 74 70 75 74 5f  ic FILE *output_
1a220 66 69 6c 65 5f 6f 70 65 6e 28 63 6f 6e 73 74 20  file_open(const 
1a230 63 68 61 72 20 2a 7a 46 69 6c 65 29 7b 0a 20 20  char *zFile){.  
1a240 46 49 4c 45 20 2a 66 3b 0a 20 20 69 66 28 20 73  FILE *f;.  if( s
1a250 74 72 63 6d 70 28 7a 46 69 6c 65 2c 22 73 74 64  trcmp(zFile,"std
1a260 6f 75 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  out")==0 ){.    
1a270 66 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 7d 65  f = stdout;.  }e
1a280 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
1a290 46 69 6c 65 2c 20 22 73 74 64 65 72 72 22 29 3d  File, "stderr")=
1a2a0 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d 20 73 74  =0 ){.    f = st
1a2b0 64 65 72 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66  derr;.  }else if
1a2c0 28 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20  ( strcmp(zFile, 
1a2d0 22 6f 66 66 22 29 3d 3d 30 20 29 7b 0a 20 20 20  "off")==0 ){.   
1a2e0 20 66 20 3d 20 30 3b 0a 20 20 7d 65 6c 73 65 7b   f = 0;.  }else{
1a2f0 0a 20 20 20 20 66 20 3d 20 66 6f 70 65 6e 28 7a  .    f = fopen(z
1a300 46 69 6c 65 2c 20 22 77 62 22 29 3b 0a 20 20 20  File, "wb");.   
1a310 20 69 66 28 20 66 3d 3d 30 20 29 7b 0a 20 20 20   if( f==0 ){.   
1a320 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
1a330 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63  tderr, "Error: c
1a340 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c  annot open \"%s\
1a350 22 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20  "\n", zFile);.  
1a360 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1a370 20 66 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69   f;.}..#if !defi
1a380 6e 65 64 28 53 51 4c 49 54 45 5f 55 4e 54 45 53  ned(SQLITE_UNTES
1a390 54 41 42 4c 45 29 0a 23 69 66 20 21 64 65 66 69  TABLE).#if !defi
1a3a0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
1a3b0 54 52 41 43 45 29 20 26 26 20 21 64 65 66 69 6e  TRACE) && !defin
1a3c0 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
1a3d0 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 2f  LOATING_POINT)./
1a3e0 2a 0a 2a 2a 20 41 20 72 6f 75 74 69 6e 65 20 66  *.** A routine f
1a3f0 6f 72 20 68 61 6e 64 6c 69 6e 67 20 6f 75 74 70  or handling outp
1a400 75 74 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f  ut from sqlite3_
1a410 74 72 61 63 65 28 29 2e 0a 2a 2f 0a 73 74 61 74  trace()..*/.stat
1a420 69 63 20 69 6e 74 20 73 71 6c 5f 74 72 61 63 65  ic int sql_trace
1a430 5f 63 61 6c 6c 62 61 63 6b 28 0a 20 20 75 6e 73  _callback(.  uns
1a440 69 67 6e 65 64 20 6d 54 79 70 65 2c 0a 20 20 76  igned mType,.  v
1a450 6f 69 64 20 2a 70 41 72 67 2c 0a 20 20 76 6f 69  oid *pArg,.  voi
1a460 64 20 2a 70 50 2c 0a 20 20 76 6f 69 64 20 2a 70  d *pP,.  void *p
1a470 58 0a 29 7b 0a 20 20 46 49 4c 45 20 2a 66 20 3d  X.){.  FILE *f =
1a480 20 28 46 49 4c 45 2a 29 70 41 72 67 3b 0a 20 20   (FILE*)pArg;.  
1a490 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
1a4a0 28 6d 54 79 70 65 29 3b 0a 20 20 55 4e 55 53 45  (mType);.  UNUSE
1a4b0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 50 29 3b  D_PARAMETER(pP);
1a4c0 0a 20 20 69 66 28 20 66 20 29 7b 0a 20 20 20 20  .  if( f ){.    
1a4d0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20  const char *z = 
1a4e0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 70 58 3b  (const char*)pX;
1a4f0 0a 20 20 20 20 69 6e 74 20 69 20 3d 20 73 74 72  .    int i = str
1a500 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 77 68  len30(z);.    wh
1a510 69 6c 65 28 20 69 3e 30 20 26 26 20 7a 5b 69 2d  ile( i>0 && z[i-
1a520 31 5d 3d 3d 27 3b 27 20 29 7b 20 69 2d 2d 3b 20  1]==';' ){ i--; 
1a530 7d 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  }.    utf8_print
1a540 66 28 66 2c 20 22 25 2e 2a 73 3b 5c 6e 22 2c 20  f(f, "%.*s;\n", 
1a550 69 2c 20 7a 29 3b 0a 20 20 7d 0a 20 20 72 65 74  i, z);.  }.  ret
1a560 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  urn 0;.}.#endif.
1a570 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20  #endif../*.** A 
1a580 6e 6f 2d 6f 70 20 72 6f 75 74 69 6e 65 20 74 68  no-op routine th
1a590 61 74 20 72 75 6e 73 20 77 69 74 68 20 74 68 65  at runs with the
1a5a0 20 22 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20 64   ".breakpoint" d
1a5b0 6f 63 2d 63 6f 6d 6d 61 6e 64 2e 20 20 54 68 69  oc-command.  Thi
1a5c0 73 20 69 73 0a 2a 2a 20 61 20 75 73 65 66 75 6c  s is.** a useful
1a5d0 20 73 70 6f 74 20 74 6f 20 73 65 74 20 61 20 64   spot to set a d
1a5e0 65 62 75 67 67 65 72 20 62 72 65 61 6b 70 6f 69  ebugger breakpoi
1a5f0 6e 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  nt..*/.static vo
1a600 69 64 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69  id test_breakpoi
1a610 6e 74 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  nt(void){.  stat
1a620 69 63 20 69 6e 74 20 6e 43 61 6c 6c 20 3d 20 30  ic int nCall = 0
1a630 3b 0a 20 20 6e 43 61 6c 6c 2b 2b 3b 0a 7d 0a 0a  ;.  nCall++;.}..
1a640 2f 2a 0a 2a 2a 20 41 6e 20 6f 62 6a 65 63 74 20  /*.** An object 
1a650 75 73 65 64 20 74 6f 20 72 65 61 64 20 61 20 43  used to read a C
1a660 53 56 20 61 6e 64 20 6f 74 68 65 72 20 66 69 6c  SV and other fil
1a670 65 73 20 66 6f 72 20 69 6d 70 6f 72 74 2e 0a 2a  es for import..*
1a680 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
1a690 20 49 6d 70 6f 72 74 43 74 78 20 49 6d 70 6f 72   ImportCtx Impor
1a6a0 74 43 74 78 3b 0a 73 74 72 75 63 74 20 49 6d 70  tCtx;.struct Imp
1a6b0 6f 72 74 43 74 78 20 7b 0a 20 20 63 6f 6e 73 74  ortCtx {.  const
1a6c0 20 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 2f   char *zFile;  /
1a6d0 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 69 6e  * Name of the in
1a6e0 70 75 74 20 66 69 6c 65 20 2a 2f 0a 20 20 46 49  put file */.  FI
1a6f0 4c 45 20 2a 69 6e 3b 20 20 20 20 20 20 20 20 20  LE *in;         
1a700 20 20 2f 2a 20 52 65 61 64 20 74 68 65 20 43 53    /* Read the CS
1a710 56 20 74 65 78 74 20 66 72 6f 6d 20 74 68 69 73  V text from this
1a720 20 69 6e 70 75 74 20 73 74 72 65 61 6d 20 2a 2f   input stream */
1a730 0a 20 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20  .  char *z;     
1a740 20 20 20 20 20 20 20 2f 2a 20 41 63 63 75 6d 75         /* Accumu
1a750 6c 61 74 65 64 20 74 65 78 74 20 66 6f 72 20 61  lated text for a
1a760 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20   field */.  int 
1a770 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n;              
1a780 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74  /* Number of byt
1a790 65 73 20 69 6e 20 7a 20 2a 2f 0a 20 20 69 6e 74  es in z */.  int
1a7a0 20 6e 41 6c 6c 6f 63 3b 20 20 20 20 20 20 20 20   nAlloc;        
1a7b0 20 2f 2a 20 53 70 61 63 65 20 61 6c 6c 6f 63 61   /* Space alloca
1a7c0 74 65 64 20 66 6f 72 20 7a 5b 5d 20 2a 2f 0a 20  ted for z[] */. 
1a7d0 20 69 6e 74 20 6e 4c 69 6e 65 3b 20 20 20 20 20   int nLine;     
1a7e0 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
1a7f0 6c 69 6e 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20  line number */. 
1a800 20 69 6e 74 20 62 4e 6f 74 46 69 72 73 74 3b 20   int bNotFirst; 
1a810 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
1a820 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 62 79 74 65  one or more byte
1a830 73 20 61 6c 72 65 61 64 79 20 72 65 61 64 20 2a  s already read *
1a840 2f 0a 20 20 69 6e 74 20 63 54 65 72 6d 3b 20 20  /.  int cTerm;  
1a850 20 20 20 20 20 20 20 20 2f 2a 20 43 68 61 72 61          /* Chara
1a860 63 74 65 72 20 74 68 61 74 20 74 65 72 6d 69 6e  cter that termin
1a870 61 74 65 64 20 74 68 65 20 6d 6f 73 74 20 72 65  ated the most re
1a880 63 65 6e 74 20 66 69 65 6c 64 20 2a 2f 0a 20 20  cent field */.  
1a890 69 6e 74 20 63 43 6f 6c 53 65 70 3b 20 20 20 20  int cColSep;    
1a8a0 20 20 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d      /* The colum
1a8b0 6e 20 73 65 70 61 72 61 74 6f 72 20 63 68 61 72  n separator char
1a8c0 61 63 74 65 72 2e 20 20 28 55 73 75 61 6c 6c 79  acter.  (Usually
1a8d0 20 22 2c 22 29 20 2a 2f 0a 20 20 69 6e 74 20 63   ",") */.  int c
1a8e0 52 6f 77 53 65 70 3b 20 20 20 20 20 20 20 20 2f  RowSep;        /
1a8f0 2a 20 54 68 65 20 72 6f 77 20 73 65 70 61 72 61  * The row separa
1a900 74 6f 72 20 63 68 61 72 61 63 74 65 72 2e 20 20  tor character.  
1a910 28 55 73 75 61 6c 6c 79 20 22 5c 6e 22 29 20 2a  (Usually "\n") *
1a920 2f 0a 7d 3b 0a 0a 2f 2a 20 41 70 70 65 6e 64 20  /.};../* Append 
1a930 61 20 73 69 6e 67 6c 65 20 62 79 74 65 20 74 6f  a single byte to
1a940 20 7a 5b 5d 20 2a 2f 0a 73 74 61 74 69 63 20 76   z[] */.static v
1a950 6f 69 64 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e  oid import_appen
1a960 64 5f 63 68 61 72 28 49 6d 70 6f 72 74 43 74 78  d_char(ImportCtx
1a970 20 2a 70 2c 20 69 6e 74 20 63 29 7b 0a 20 20 69   *p, int c){.  i
1a980 66 28 20 70 2d 3e 6e 2b 31 3e 3d 70 2d 3e 6e 41  f( p->n+1>=p->nA
1a990 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e  lloc ){.    p->n
1a9a0 41 6c 6c 6f 63 20 2b 3d 20 70 2d 3e 6e 41 6c 6c  Alloc += p->nAll
1a9b0 6f 63 20 2b 20 31 30 30 3b 0a 20 20 20 20 70 2d  oc + 100;.    p-
1a9c0 3e 7a 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  >z = sqlite3_rea
1a9d0 6c 6c 6f 63 36 34 28 70 2d 3e 7a 2c 20 70 2d 3e  lloc64(p->z, p->
1a9e0 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20 20 69 66 28  nAlloc);.    if(
1a9f0 20 70 2d 3e 7a 3d 3d 30 20 29 7b 0a 20 20 20 20   p->z==0 ){.    
1aa00 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
1aa10 65 72 72 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d  err, "out of mem
1aa20 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 65  ory\n");.      e
1aa30 78 69 74 28 31 29 3b 0a 20 20 20 20 7d 0a 20 20  xit(1);.    }.  
1aa40 7d 0a 20 20 70 2d 3e 7a 5b 70 2d 3e 6e 2b 2b 5d  }.  p->z[p->n++]
1aa50 20 3d 20 28 63 68 61 72 29 63 3b 0a 7d 0a 0a 2f   = (char)c;.}../
1aa60 2a 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20  * Read a single 
1aa70 66 69 65 6c 64 20 6f 66 20 43 53 56 20 74 65 78  field of CSV tex
1aa80 74 2e 20 20 43 6f 6d 70 61 74 69 62 6c 65 20 77  t.  Compatible w
1aa90 69 74 68 20 72 66 63 34 31 38 30 20 61 6e 64 20  ith rfc4180 and 
1aaa0 65 78 74 65 6e 64 65 64 0a 2a 2a 20 77 69 74 68  extended.** with
1aab0 20 74 68 65 20 6f 70 74 69 6f 6e 20 6f 66 20 68   the option of h
1aac0 61 76 69 6e 67 20 61 20 73 65 70 61 72 61 74 6f  aving a separato
1aad0 72 20 6f 74 68 65 72 20 74 68 61 6e 20 22 2c 22  r other than ","
1aae0 2e 0a 2a 2a 0a 2a 2a 20 20 20 2b 20 20 49 6e 70  ..**.**   +  Inp
1aaf0 75 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20 70 2d  ut comes from p-
1ab00 3e 69 6e 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f  >in..**   +  Sto
1ab10 72 65 20 72 65 73 75 6c 74 73 20 69 6e 20 70 2d  re results in p-
1ab20 3e 7a 20 6f 66 20 6c 65 6e 67 74 68 20 70 2d 3e  >z of length p->
1ab30 6e 2e 20 20 53 70 61 63 65 20 74 6f 20 68 6f 6c  n.  Space to hol
1ab40 64 20 70 2d 3e 7a 20 63 6f 6d 65 73 0a 2a 2a 20  d p->z comes.** 
1ab50 20 20 20 20 20 66 72 6f 6d 20 73 71 6c 69 74 65       from sqlite
1ab60 33 5f 6d 61 6c 6c 6f 63 36 34 28 29 2e 0a 2a 2a  3_malloc64()..**
1ab70 20 20 20 2b 20 20 55 73 65 20 70 2d 3e 63 53 65     +  Use p->cSe
1ab80 70 20 61 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20  p as the column 
1ab90 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68 65 20  separator.  The 
1aba0 64 65 66 61 75 6c 74 20 69 73 20 22 2c 22 2e 0a  default is ","..
1abb0 2a 2a 20 20 20 2b 20 20 55 73 65 20 70 2d 3e 72  **   +  Use p->r
1abc0 53 65 70 20 61 73 20 74 68 65 20 72 6f 77 20 73  Sep as the row s
1abd0 65 70 61 72 61 74 6f 72 2e 20 20 54 68 65 20 64  eparator.  The d
1abe0 65 66 61 75 6c 74 20 69 73 20 22 5c 6e 22 2e 0a  efault is "\n"..
1abf0 2a 2a 20 20 20 2b 20 20 4b 65 65 70 20 74 72 61  **   +  Keep tra
1ac00 63 6b 20 6f 66 20 74 68 65 20 6c 69 6e 65 20 6e  ck of the line n
1ac10 75 6d 62 65 72 20 69 6e 20 70 2d 3e 6e 4c 69 6e  umber in p->nLin
1ac20 65 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65  e..**   +  Store
1ac30 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20 74   the character t
1ac40 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 20 74  hat terminates t
1ac50 68 65 20 66 69 65 6c 64 20 69 6e 20 70 2d 3e 63  he field in p->c
1ac60 54 65 72 6d 2e 20 20 53 74 6f 72 65 0a 2a 2a 20  Term.  Store.** 
1ac70 20 20 20 20 20 45 4f 46 20 6f 6e 20 65 6e 64 2d       EOF on end-
1ac80 6f 66 2d 66 69 6c 65 2e 0a 2a 2a 20 20 20 2b 20  of-file..**   + 
1ac90 20 52 65 70 6f 72 74 20 73 79 6e 74 61 78 20 65   Report syntax e
1aca0 72 72 6f 72 73 20 6f 6e 20 73 74 64 65 72 72 0a  rrors on stderr.
1acb0 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
1acc0 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 63 73 76  SQLITE_CDECL csv
1acd0 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 28  _read_one_field(
1ace0 49 6d 70 6f 72 74 43 74 78 20 2a 70 29 7b 0a 20  ImportCtx *p){. 
1acf0 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20 63 53   int c;.  int cS
1ad00 65 70 20 3d 20 70 2d 3e 63 43 6f 6c 53 65 70 3b  ep = p->cColSep;
1ad10 0a 20 20 69 6e 74 20 72 53 65 70 20 3d 20 70 2d  .  int rSep = p-
1ad20 3e 63 52 6f 77 53 65 70 3b 0a 20 20 70 2d 3e 6e  >cRowSep;.  p->n
1ad30 20 3d 20 30 3b 0a 20 20 63 20 3d 20 66 67 65 74   = 0;.  c = fget
1ad40 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 69 66 28 20  c(p->in);.  if( 
1ad50 63 3d 3d 45 4f 46 20 7c 7c 20 73 65 65 6e 49 6e  c==EOF || seenIn
1ad60 74 65 72 72 75 70 74 20 29 7b 0a 20 20 20 20 70  terrupt ){.    p
1ad70 2d 3e 63 54 65 72 6d 20 3d 20 45 4f 46 3b 0a 20  ->cTerm = EOF;. 
1ad80 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1ad90 0a 20 20 69 66 28 20 63 3d 3d 27 22 27 20 29 7b  .  if( c=='"' ){
1ada0 0a 20 20 20 20 69 6e 74 20 70 63 2c 20 70 70 63  .    int pc, ppc
1adb0 3b 0a 20 20 20 20 69 6e 74 20 73 74 61 72 74 4c  ;.    int startL
1adc0 69 6e 65 20 3d 20 70 2d 3e 6e 4c 69 6e 65 3b 0a  ine = p->nLine;.
1add0 20 20 20 20 69 6e 74 20 63 51 75 6f 74 65 20 3d      int cQuote =
1ade0 20 63 3b 0a 20 20 20 20 70 63 20 3d 20 70 70 63   c;.    pc = ppc
1adf0 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
1ae00 20 31 20 29 7b 0a 20 20 20 20 20 20 63 20 3d 20   1 ){.      c = 
1ae10 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20  fgetc(p->in);.  
1ae20 20 20 20 20 69 66 28 20 63 3d 3d 72 53 65 70 20      if( c==rSep 
1ae30 29 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20  ) p->nLine++;.  
1ae40 20 20 20 20 69 66 28 20 63 3d 3d 63 51 75 6f 74      if( c==cQuot
1ae50 65 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  e ){.        if(
1ae60 20 70 63 3d 3d 63 51 75 6f 74 65 20 29 7b 0a 20   pc==cQuote ){. 
1ae70 20 20 20 20 20 20 20 20 20 70 63 20 3d 20 30 3b           pc = 0;
1ae80 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69  .          conti
1ae90 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
1aea0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
1aeb0 20 28 63 3d 3d 63 53 65 70 20 26 26 20 70 63 3d   (c==cSep && pc=
1aec0 3d 63 51 75 6f 74 65 29 0a 20 20 20 20 20 20 20  =cQuote).       
1aed0 7c 7c 20 28 63 3d 3d 72 53 65 70 20 26 26 20 70  || (c==rSep && p
1aee0 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20 20 20  c==cQuote).     
1aef0 20 20 7c 7c 20 28 63 3d 3d 72 53 65 70 20 26 26    || (c==rSep &&
1af00 20 70 63 3d 3d 27 5c 72 27 20 26 26 20 70 70 63   pc=='\r' && ppc
1af10 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20 20 20 20  ==cQuote).      
1af20 20 7c 7c 20 28 63 3d 3d 45 4f 46 20 26 26 20 70   || (c==EOF && p
1af30 63 3d 3d 63 51 75 6f 74 65 29 0a 20 20 20 20 20  c==cQuote).     
1af40 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 20   ){.        do{ 
1af50 70 2d 3e 6e 2d 2d 3b 20 7d 77 68 69 6c 65 28 20  p->n--; }while( 
1af60 70 2d 3e 7a 5b 70 2d 3e 6e 5d 21 3d 63 51 75 6f  p->z[p->n]!=cQuo
1af70 74 65 20 29 3b 0a 20 20 20 20 20 20 20 20 70 2d  te );.        p-
1af80 3e 63 54 65 72 6d 20 3d 20 63 3b 0a 20 20 20 20  >cTerm = c;.    
1af90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
1afa0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 63 3d   }.      if( pc=
1afb0 3d 63 51 75 6f 74 65 20 26 26 20 63 21 3d 27 5c  =cQuote && c!='\
1afc0 72 27 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  r' ){.        ut
1afd0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
1afe0 2c 20 22 25 73 3a 25 64 3a 20 75 6e 65 73 63 61  , "%s:%d: unesca
1aff0 70 65 64 20 25 63 20 63 68 61 72 61 63 74 65 72  ped %c character
1b000 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1b010 20 20 20 20 20 70 2d 3e 7a 46 69 6c 65 2c 20 70       p->zFile, p
1b020 2d 3e 6e 4c 69 6e 65 2c 20 63 51 75 6f 74 65 29  ->nLine, cQuote)
1b030 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1b040 69 66 28 20 63 3d 3d 45 4f 46 20 29 7b 0a 20 20  if( c==EOF ){.  
1b050 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
1b060 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64  f(stderr, "%s:%d
1b070 3a 20 75 6e 74 65 72 6d 69 6e 61 74 65 64 20 25  : unterminated %
1b080 63 2d 71 75 6f 74 65 64 20 66 69 65 6c 64 5c 6e  c-quoted field\n
1b090 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
1b0a0 20 20 20 70 2d 3e 7a 46 69 6c 65 2c 20 73 74 61     p->zFile, sta
1b0b0 72 74 4c 69 6e 65 2c 20 63 51 75 6f 74 65 29 3b  rtLine, cQuote);
1b0c0 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 54 65 72  .        p->cTer
1b0d0 6d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 62  m = c;.        b
1b0e0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1b0f0 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e      import_appen
1b100 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20  d_char(p, c);.  
1b110 20 20 20 20 70 70 63 20 3d 20 70 63 3b 0a 20 20      ppc = pc;.  
1b120 20 20 20 20 70 63 20 3d 20 63 3b 0a 20 20 20 20      pc = c;.    
1b130 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  }.  }else{.    /
1b140 2a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  * If this is the
1b150 20 66 69 72 73 74 20 66 69 65 6c 64 20 62 65 69   first field bei
1b160 6e 67 20 70 61 72 73 65 64 20 61 6e 64 20 69 74  ng parsed and it
1b170 20 62 65 67 69 6e 73 20 77 69 74 68 20 74 68 65   begins with the
1b180 0a 20 20 20 20 2a 2a 20 55 54 46 2d 38 20 42 4f  .    ** UTF-8 BO
1b190 4d 20 20 28 30 78 45 46 20 42 42 20 42 46 29 20  M  (0xEF BB BF) 
1b1a0 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 42 4f  then skip the BO
1b1b0 4d 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 63 26  M */.    if( (c&
1b1c0 30 78 66 66 29 3d 3d 30 78 65 66 20 26 26 20 70  0xff)==0xef && p
1b1d0 2d 3e 62 4e 6f 74 46 69 72 73 74 3d 3d 30 20 29  ->bNotFirst==0 )
1b1e0 7b 0a 20 20 20 20 20 20 69 6d 70 6f 72 74 5f 61  {.      import_a
1b1f0 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63 29  ppend_char(p, c)
1b200 3b 0a 20 20 20 20 20 20 63 20 3d 20 66 67 65 74  ;.      c = fget
1b210 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20  c(p->in);.      
1b220 69 66 28 20 28 63 26 30 78 66 66 29 3d 3d 30 78  if( (c&0xff)==0x
1b230 62 62 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6d  bb ){.        im
1b240 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72  port_append_char
1b250 28 70 2c 20 63 29 3b 0a 20 20 20 20 20 20 20 20  (p, c);.        
1b260 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29  c = fgetc(p->in)
1b270 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 63  ;.        if( (c
1b280 26 30 78 66 66 29 3d 3d 30 78 62 66 20 29 7b 0a  &0xff)==0xbf ){.
1b290 20 20 20 20 20 20 20 20 20 20 70 2d 3e 62 4e 6f            p->bNo
1b2a0 74 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 20 20  tFirst = 1;.    
1b2b0 20 20 20 20 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a        p->n = 0;.
1b2c0 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
1b2d0 20 63 73 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69   csv_read_one_fi
1b2e0 65 6c 64 28 70 29 3b 0a 20 20 20 20 20 20 20 20  eld(p);.        
1b2f0 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
1b300 20 20 20 20 77 68 69 6c 65 28 20 63 21 3d 45 4f      while( c!=EO
1b310 46 20 26 26 20 63 21 3d 63 53 65 70 20 26 26 20  F && c!=cSep && 
1b320 63 21 3d 72 53 65 70 20 29 7b 0a 20 20 20 20 20  c!=rSep ){.     
1b330 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63   import_append_c
1b340 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20  har(p, c);.     
1b350 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e   c = fgetc(p->in
1b360 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
1b370 20 63 3d 3d 72 53 65 70 20 29 7b 0a 20 20 20 20   c==rSep ){.    
1b380 20 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20    p->nLine++;.  
1b390 20 20 20 20 69 66 28 20 70 2d 3e 6e 3e 30 20 26      if( p->n>0 &
1b3a0 26 20 70 2d 3e 7a 5b 70 2d 3e 6e 2d 31 5d 3d 3d  & p->z[p->n-1]==
1b3b0 27 5c 72 27 20 29 20 70 2d 3e 6e 2d 2d 3b 0a 20  '\r' ) p->n--;. 
1b3c0 20 20 20 7d 0a 20 20 20 20 70 2d 3e 63 54 65 72     }.    p->cTer
1b3d0 6d 20 3d 20 63 3b 0a 20 20 7d 0a 20 20 69 66 28  m = c;.  }.  if(
1b3e0 20 70 2d 3e 7a 20 29 20 70 2d 3e 7a 5b 70 2d 3e   p->z ) p->z[p->
1b3f0 6e 5d 20 3d 20 30 3b 0a 20 20 70 2d 3e 62 4e 6f  n] = 0;.  p->bNo
1b400 74 46 69 72 73 74 20 3d 20 31 3b 0a 20 20 72 65  tFirst = 1;.  re
1b410 74 75 72 6e 20 70 2d 3e 7a 3b 0a 7d 0a 0a 2f 2a  turn p->z;.}../*
1b420 20 52 65 61 64 20 61 20 73 69 6e 67 6c 65 20 66   Read a single f
1b430 69 65 6c 64 20 6f 66 20 41 53 43 49 49 20 64 65  ield of ASCII de
1b440 6c 69 6d 69 74 65 64 20 74 65 78 74 2e 0a 2a 2a  limited text..**
1b450 0a 2a 2a 20 20 20 2b 20 20 49 6e 70 75 74 20 63  .**   +  Input c
1b460 6f 6d 65 73 20 66 72 6f 6d 20 70 2d 3e 69 6e 2e  omes from p->in.
1b470 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65 20 72  .**   +  Store r
1b480 65 73 75 6c 74 73 20 69 6e 20 70 2d 3e 7a 20 6f  esults in p->z o
1b490 66 20 6c 65 6e 67 74 68 20 70 2d 3e 6e 2e 20 20  f length p->n.  
1b4a0 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 70 2d  Space to hold p-
1b4b0 3e 7a 20 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20  >z comes.**     
1b4c0 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
1b4d0 6c 6c 6f 63 36 34 28 29 2e 0a 2a 2a 20 20 20 2b  lloc64()..**   +
1b4e0 20 20 55 73 65 20 70 2d 3e 63 53 65 70 20 61 73    Use p->cSep as
1b4f0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 73 65 70 61   the column sepa
1b500 72 61 74 6f 72 2e 20 20 54 68 65 20 64 65 66 61  rator.  The defa
1b510 75 6c 74 20 69 73 20 22 5c 78 31 46 22 2e 0a 2a  ult is "\x1F"..*
1b520 2a 20 20 20 2b 20 20 55 73 65 20 70 2d 3e 72 53  *   +  Use p->rS
1b530 65 70 20 61 73 20 74 68 65 20 72 6f 77 20 73 65  ep as the row se
1b540 70 61 72 61 74 6f 72 2e 20 20 54 68 65 20 64 65  parator.  The de
1b550 66 61 75 6c 74 20 69 73 20 22 5c 78 31 45 22 2e  fault is "\x1E".
1b560 0a 2a 2a 20 20 20 2b 20 20 4b 65 65 70 20 74 72  .**   +  Keep tr
1b570 61 63 6b 20 6f 66 20 74 68 65 20 72 6f 77 20 6e  ack of the row n
1b580 75 6d 62 65 72 20 69 6e 20 70 2d 3e 6e 4c 69 6e  umber in p->nLin
1b590 65 2e 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65  e..**   +  Store
1b5a0 20 74 68 65 20 63 68 61 72 61 63 74 65 72 20 74   the character t
1b5b0 68 61 74 20 74 65 72 6d 69 6e 61 74 65 73 20 74  hat terminates t
1b5c0 68 65 20 66 69 65 6c 64 20 69 6e 20 70 2d 3e 63  he field in p->c
1b5d0 54 65 72 6d 2e 20 20 53 74 6f 72 65 0a 2a 2a 20  Term.  Store.** 
1b5e0 20 20 20 20 20 45 4f 46 20 6f 6e 20 65 6e 64 2d       EOF on end-
1b5f0 6f 66 2d 66 69 6c 65 2e 0a 2a 2a 20 20 20 2b 20  of-file..**   + 
1b600 20 52 65 70 6f 72 74 20 73 79 6e 74 61 78 20 65   Report syntax e
1b610 72 72 6f 72 73 20 6f 6e 20 73 74 64 65 72 72 0a  rrors on stderr.
1b620 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a  */.static char *
1b630 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 61 73 63  SQLITE_CDECL asc
1b640 69 69 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c  ii_read_one_fiel
1b650 64 28 49 6d 70 6f 72 74 43 74 78 20 2a 70 29 7b  d(ImportCtx *p){
1b660 0a 20 20 69 6e 74 20 63 3b 0a 20 20 69 6e 74 20  .  int c;.  int 
1b670 63 53 65 70 20 3d 20 70 2d 3e 63 43 6f 6c 53 65  cSep = p->cColSe
1b680 70 3b 0a 20 20 69 6e 74 20 72 53 65 70 20 3d 20  p;.  int rSep = 
1b690 70 2d 3e 63 52 6f 77 53 65 70 3b 0a 20 20 70 2d  p->cRowSep;.  p-
1b6a0 3e 6e 20 3d 20 30 3b 0a 20 20 63 20 3d 20 66 67  >n = 0;.  c = fg
1b6b0 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 69 66  etc(p->in);.  if
1b6c0 28 20 63 3d 3d 45 4f 46 20 7c 7c 20 73 65 65 6e  ( c==EOF || seen
1b6d0 49 6e 74 65 72 72 75 70 74 20 29 7b 0a 20 20 20  Interrupt ){.   
1b6e0 20 70 2d 3e 63 54 65 72 6d 20 3d 20 45 4f 46 3b   p->cTerm = EOF;
1b6f0 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1b700 20 7d 0a 20 20 77 68 69 6c 65 28 20 63 21 3d 45   }.  while( c!=E
1b710 4f 46 20 26 26 20 63 21 3d 63 53 65 70 20 26 26  OF && c!=cSep &&
1b720 20 63 21 3d 72 53 65 70 20 29 7b 0a 20 20 20 20   c!=rSep ){.    
1b730 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68  import_append_ch
1b740 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 63 20  ar(p, c);.    c 
1b750 3d 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a  = fgetc(p->in);.
1b760 20 20 7d 0a 20 20 69 66 28 20 63 3d 3d 72 53 65    }.  if( c==rSe
1b770 70 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 4c 69 6e  p ){.    p->nLin
1b780 65 2b 2b 3b 0a 20 20 7d 0a 20 20 70 2d 3e 63 54  e++;.  }.  p->cT
1b790 65 72 6d 20 3d 20 63 3b 0a 20 20 69 66 28 20 70  erm = c;.  if( p
1b7a0 2d 3e 7a 20 29 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d  ->z ) p->z[p->n]
1b7b0 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70   = 0;.  return p
1b7c0 2d 3e 7a 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72  ->z;.}../*.** Tr
1b7d0 79 20 74 6f 20 74 72 61 6e 73 66 65 72 20 64 61  y to transfer da
1b7e0 74 61 20 66 6f 72 20 74 61 62 6c 65 20 7a 54 61  ta for table zTa
1b7f0 62 6c 65 2e 20 20 49 66 20 61 6e 20 65 72 72 6f  ble.  If an erro
1b800 72 20 69 73 20 73 65 65 6e 20 77 68 69 6c 65 0a  r is seen while.
1b810 2a 2a 20 6d 6f 76 69 6e 67 20 66 6f 72 77 61 72  ** moving forwar
1b820 64 2c 20 74 72 79 20 74 6f 20 67 6f 20 62 61 63  d, try to go bac
1b830 6b 77 61 72 64 73 2e 20 20 54 68 65 20 62 61 63  kwards.  The bac
1b840 6b 77 61 72 64 73 20 6d 6f 76 65 6d 65 6e 74 20  kwards movement 
1b850 77 6f 6e 27 74 0a 2a 2a 20 77 6f 72 6b 20 66 6f  won't.** work fo
1b860 72 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 20  r WITHOUT ROWID 
1b870 74 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  tables..*/.stati
1b880 63 20 76 6f 69 64 20 74 72 79 54 6f 43 6c 6f 6e  c void tryToClon
1b890 65 44 61 74 61 28 0a 20 20 53 68 65 6c 6c 53 74  eData(.  ShellSt
1b8a0 61 74 65 20 2a 70 2c 0a 20 20 73 71 6c 69 74 65  ate *p,.  sqlite
1b8b0 33 20 2a 6e 65 77 44 62 2c 0a 20 20 63 6f 6e 73  3 *newDb,.  cons
1b8c0 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 0a 29  t char *zTable.)
1b8d0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  {.  sqlite3_stmt
1b8e0 20 2a 70 51 75 65 72 79 20 3d 20 30 3b 0a 20 20   *pQuery = 0;.  
1b8f0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 49  sqlite3_stmt *pI
1b900 6e 73 65 72 74 20 3d 20 30 3b 0a 20 20 63 68 61  nsert = 0;.  cha
1b910 72 20 2a 7a 51 75 65 72 79 20 3d 20 30 3b 0a 20  r *zQuery = 0;. 
1b920 20 63 68 61 72 20 2a 7a 49 6e 73 65 72 74 20 3d   char *zInsert =
1b930 20 30 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20   0;.  int rc;.  
1b940 69 6e 74 20 69 2c 20 6a 2c 20 6e 3b 0a 20 20 69  int i, j, n;.  i
1b950 6e 74 20 6e 54 61 62 6c 65 20 3d 20 73 74 72 6c  nt nTable = strl
1b960 65 6e 33 30 28 7a 54 61 62 6c 65 29 3b 0a 20 20  en30(zTable);.  
1b970 69 6e 74 20 6b 20 3d 20 30 3b 0a 20 20 69 6e 74  int k = 0;.  int
1b980 20 63 6e 74 20 3d 20 30 3b 0a 20 20 63 6f 6e 73   cnt = 0;.  cons
1b990 74 20 69 6e 74 20 73 70 69 6e 52 61 74 65 20 3d  t int spinRate =
1b9a0 20 31 30 30 30 30 3b 0a 0a 20 20 7a 51 75 65 72   10000;..  zQuer
1b9b0 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  y = sqlite3_mpri
1b9c0 6e 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52  ntf("SELECT * FR
1b9d0 4f 4d 20 5c 22 25 77 5c 22 22 2c 20 7a 54 61 62  OM \"%w\"", zTab
1b9e0 6c 65 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69  le);.  rc = sqli
1b9f0 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
1ba00 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31  ->db, zQuery, -1
1ba10 2c 20 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20  , &pQuery, 0);. 
1ba20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75   if( rc ){.    u
1ba30 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
1ba40 72 2c 20 22 45 72 72 6f 72 20 25 64 3a 20 25 73  r, "Error %d: %s
1ba50 20 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20   on [%s]\n",.   
1ba60 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1ba70 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64  _extended_errcod
1ba80 65 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65  e(p->db), sqlite
1ba90 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c  3_errmsg(p->db),
1baa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75  .            zQu
1bab0 65 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  ery);.    goto e
1bac0 6e 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20 20  nd_data_xfer;.  
1bad0 7d 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f  }.  n = sqlite3_
1bae0 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 51 75  column_count(pQu
1baf0 65 72 79 29 3b 0a 20 20 7a 49 6e 73 65 72 74 20  ery);.  zInsert 
1bb00 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
1bb10 36 34 28 32 30 30 20 2b 20 6e 54 61 62 6c 65 20  64(200 + nTable 
1bb20 2b 20 6e 2a 33 29 3b 0a 20 20 69 66 28 20 7a 49  + n*3);.  if( zI
1bb30 6e 73 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20  nsert==0 ){.    
1bb40 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
1bb50 72 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  r, "out of memor
1bb60 79 5c 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20  y\n");.    goto 
1bb70 65 6e 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20  end_data_xfer;. 
1bb80 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70   }.  sqlite3_snp
1bb90 72 69 6e 74 66 28 32 30 30 2b 6e 54 61 62 6c 65  rintf(200+nTable
1bba0 2c 7a 49 6e 73 65 72 74 2c 0a 20 20 20 20 20 20  ,zInsert,.      
1bbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 49 4e               "IN
1bbc0 53 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49  SERT OR IGNORE I
1bbd0 4e 54 4f 20 5c 22 25 73 5c 22 20 56 41 4c 55 45  NTO \"%s\" VALUE
1bbe0 53 28 3f 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20  S(?", zTable);. 
1bbf0 20 69 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 49   i = strlen30(zI
1bc00 6e 73 65 72 74 29 3b 0a 20 20 66 6f 72 28 6a 3d  nsert);.  for(j=
1bc10 31 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29 7b 0a 20 20  1; j<n; j++){.  
1bc20 20 20 6d 65 6d 63 70 79 28 7a 49 6e 73 65 72 74    memcpy(zInsert
1bc30 2b 69 2c 20 22 2c 3f 22 2c 20 32 29 3b 0a 20 20  +i, ",?", 2);.  
1bc40 20 20 69 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20 20    i += 2;.  }.  
1bc50 6d 65 6d 63 70 79 28 7a 49 6e 73 65 72 74 2b 69  memcpy(zInsert+i
1bc60 2c 20 22 29 3b 22 2c 20 33 29 3b 0a 20 20 72 63  , ");", 3);.  rc
1bc70 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
1bc80 72 65 5f 76 32 28 6e 65 77 44 62 2c 20 7a 49 6e  re_v2(newDb, zIn
1bc90 73 65 72 74 2c 20 2d 31 2c 20 26 70 49 6e 73 65  sert, -1, &pInse
1bca0 72 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63  rt, 0);.  if( rc
1bcb0 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
1bcc0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
1bcd0 6f 72 20 25 64 3a 20 25 73 20 6f 6e 20 5b 25 73  or %d: %s on [%s
1bce0 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ]\n",.          
1bcf0 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64    sqlite3_extend
1bd00 65 64 5f 65 72 72 63 6f 64 65 28 6e 65 77 44 62  ed_errcode(newDb
1bd10 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ), sqlite3_errms
1bd20 67 28 6e 65 77 44 62 29 2c 0a 20 20 20 20 20 20  g(newDb),.      
1bd30 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20        zQuery);. 
1bd40 20 20 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74 61     goto end_data
1bd50 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20 66 6f 72  _xfer;.  }.  for
1bd60 28 6b 3d 30 3b 20 6b 3c 32 3b 20 6b 2b 2b 29 7b  (k=0; k<2; k++){
1bd70 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72 63 20  .    while( (rc 
1bd80 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
1bd90 51 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45 5f  Query))==SQLITE_
1bda0 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ROW ){.      for
1bdb0 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b  (i=0; i<n; i++){
1bdc0 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28  .        switch(
1bdd0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1bde0 74 79 70 65 28 70 51 75 65 72 79 2c 20 69 29 20  type(pQuery, i) 
1bdf0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61 73  ){.          cas
1be00 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20 7b  e SQLITE_NULL: {
1be10 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1be20 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70  ite3_bind_null(p
1be30 49 6e 73 65 72 74 2c 20 69 2b 31 29 3b 0a 20 20  Insert, i+1);.  
1be40 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1be50 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1be60 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
1be70 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TE_INTEGER: {.  
1be80 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1be90 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 49 6e  3_bind_int64(pIn
1bea0 73 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74  sert, i+1, sqlit
1beb0 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34 28  e3_column_int64(
1bec0 70 51 75 65 72 79 2c 69 29 29 3b 0a 20 20 20 20  pQuery,i));.    
1bed0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1bee0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1bef0 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
1bf00 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20 20  _FLOAT: {.      
1bf10 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
1bf20 6e 64 5f 64 6f 75 62 6c 65 28 70 49 6e 73 65 72  nd_double(pInser
1bf30 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f  t, i+1, sqlite3_
1bf40 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 51  column_double(pQ
1bf50 75 65 72 79 2c 69 29 29 3b 0a 20 20 20 20 20 20  uery,i));.      
1bf60 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1bf70 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1bf80 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
1bf90 45 58 54 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  EXT: {.         
1bfa0 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
1bfb0 74 65 78 74 28 70 49 6e 73 65 72 74 2c 20 69 2b  text(pInsert, i+
1bfc0 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1,.             
1bfd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bfe0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
1bff0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
1c000 28 70 51 75 65 72 79 2c 69 29 2c 0a 20 20 20 20  (pQuery,i),.    
1c010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c020 20 20 20 20 20 20 20 20 20 2d 31 2c 20 53 51 4c           -1, SQL
1c030 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
1c040 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1c050 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1c060 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
1c070 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20  E_BLOB: {.      
1c080 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69        sqlite3_bi
1c090 6e 64 5f 62 6c 6f 62 28 70 49 6e 73 65 72 74 2c  nd_blob(pInsert,
1c0a0 20 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63 6f   i+1, sqlite3_co
1c0b0 6c 75 6d 6e 5f 62 6c 6f 62 28 70 51 75 65 72 79  lumn_blob(pQuery
1c0c0 2c 69 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ,i),.           
1c0d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0f0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
1c100 62 79 74 65 73 28 70 51 75 65 72 79 2c 69 29 2c  bytes(pQuery,i),
1c110 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c130 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
1c140 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20  ITE_STATIC);.   
1c150 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1c160 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1c170 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a      }.      } /*
1c180 20 45 6e 64 20 66 6f 72 20 2a 2f 0a 20 20 20 20   End for */.    
1c190 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73    rc = sqlite3_s
1c1a0 74 65 70 28 70 49 6e 73 65 72 74 29 3b 0a 20 20  tep(pInsert);.  
1c1b0 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49      if( rc!=SQLI
1c1c0 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51 4c  TE_OK && rc!=SQL
1c1d0 49 54 45 5f 52 4f 57 20 26 26 20 72 63 21 3d 53  ITE_ROW && rc!=S
1c1e0 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
1c1f0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
1c200 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
1c210 20 25 64 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69   %d: %s\n", sqli
1c220 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72  te3_extended_err
1c230 63 6f 64 65 28 6e 65 77 44 62 29 2c 0a 20 20 20  code(newDb),.   
1c240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c250 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72       sqlite3_err
1c260 6d 73 67 28 6e 65 77 44 62 29 29 3b 0a 20 20 20  msg(newDb));.   
1c270 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1c280 65 33 5f 72 65 73 65 74 28 70 49 6e 73 65 72 74  e3_reset(pInsert
1c290 29 3b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a  );.      cnt++;.
1c2a0 20 20 20 20 20 20 69 66 28 20 28 63 6e 74 25 73        if( (cnt%s
1c2b0 70 69 6e 52 61 74 65 29 3d 3d 30 20 29 7b 0a 20  pinRate)==0 ){. 
1c2c0 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25         printf("%
1c2d0 63 5c 62 22 2c 20 22 7c 2f 2d 5c 5c 22 5b 28 63  c\b", "|/-\\"[(c
1c2e0 6e 74 2f 73 70 69 6e 52 61 74 65 29 25 34 5d 29  nt/spinRate)%4])
1c2f0 3b 0a 20 20 20 20 20 20 20 20 66 66 6c 75 73 68  ;.        fflush
1c300 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20  (stdout);.      
1c310 7d 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 77  }.    } /* End w
1c320 68 69 6c 65 20 2a 2f 0a 20 20 20 20 69 66 28 20  hile */.    if( 
1c330 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
1c340 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 71 6c  ) break;.    sql
1c350 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51  ite3_finalize(pQ
1c360 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  uery);.    sqlit
1c370 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b  e3_free(zQuery);
1c380 0a 20 20 20 20 7a 51 75 65 72 79 20 3d 20 73 71  .    zQuery = sq
1c390 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
1c3a0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25  ELECT * FROM \"%
1c3b0 77 5c 22 20 4f 52 44 45 52 20 42 59 20 72 6f 77  w\" ORDER BY row
1c3c0 69 64 20 44 45 53 43 3b 22 2c 0a 20 20 20 20 20  id DESC;",.     
1c3d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c3e0 20 20 20 20 20 20 20 20 7a 54 61 62 6c 65 29 3b          zTable);
1c3f0 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1c400 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
1c410 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20  db, zQuery, -1, 
1c420 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20  &pQuery, 0);.   
1c430 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
1c440 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
1c450 65 72 72 2c 20 22 57 61 72 6e 69 6e 67 3a 20 63  err, "Warning: c
1c460 61 6e 6e 6f 74 20 73 74 65 70 20 5c 22 25 73 5c  annot step \"%s\
1c470 22 20 62 61 63 6b 77 61 72 64 73 22 2c 20 7a 54  " backwards", zT
1c480 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72 65  able);.      bre
1c490 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a  ak;.    }.  } /*
1c4a0 20 45 6e 64 20 66 6f 72 28 6b 3d 30 2e 2e 2e 29   End for(k=0...)
1c4b0 20 2a 2f 0a 0a 65 6e 64 5f 64 61 74 61 5f 78 66   */..end_data_xf
1c4c0 65 72 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66 69  er:.  sqlite3_fi
1c4d0 6e 61 6c 69 7a 65 28 70 51 75 65 72 79 29 3b 0a  nalize(pQuery);.
1c4e0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
1c4f0 7a 65 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 73  ze(pInsert);.  s
1c500 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65  qlite3_free(zQue
1c510 72 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66  ry);.  sqlite3_f
1c520 72 65 65 28 7a 49 6e 73 65 72 74 29 3b 0a 7d 0a  ree(zInsert);.}.
1c530 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 74  ../*.** Try to t
1c540 72 61 6e 73 66 65 72 20 61 6c 6c 20 72 6f 77 73  ransfer all rows
1c550 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 20 74   of the schema t
1c560 68 61 74 20 6d 61 74 63 68 20 7a 57 68 65 72 65  hat match zWhere
1c570 2e 20 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20 72  .  For.** each r
1c580 6f 77 2c 20 69 6e 76 6f 6b 65 20 78 46 6f 72 45  ow, invoke xForE
1c590 61 63 68 28 29 20 6f 6e 20 74 68 65 20 6f 62 6a  ach() on the obj
1c5a0 65 63 74 20 64 65 66 69 6e 65 64 20 62 79 20 74  ect defined by t
1c5b0 68 61 74 20 72 6f 77 2e 0a 2a 2a 20 49 66 20 61  hat row..** If a
1c5c0 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f 75  n error is encou
1c5d0 6e 74 65 72 65 64 20 77 68 69 6c 65 20 6d 6f 76  ntered while mov
1c5e0 69 6e 67 20 66 6f 72 77 61 72 64 20 74 68 72 6f  ing forward thro
1c5f0 75 67 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69 74  ugh the.** sqlit
1c600 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2c 20  e_master table, 
1c610 74 72 79 20 61 67 61 69 6e 20 6d 6f 76 69 6e 67  try again moving
1c620 20 62 61 63 6b 77 61 72 64 73 2e 0a 2a 2f 0a 73   backwards..*/.s
1c630 74 61 74 69 63 20 76 6f 69 64 20 74 72 79 54 6f  tatic void tryTo
1c640 43 6c 6f 6e 65 53 63 68 65 6d 61 28 0a 20 20 53  CloneSchema(.  S
1c650 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20 20  hellState *p,.  
1c660 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62 2c 0a  sqlite3 *newDb,.
1c670 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 57    const char *zW
1c680 68 65 72 65 2c 0a 20 20 76 6f 69 64 20 28 2a 78  here,.  void (*x
1c690 46 6f 72 45 61 63 68 29 28 53 68 65 6c 6c 53 74  ForEach)(ShellSt
1c6a0 61 74 65 2a 2c 73 71 6c 69 74 65 33 2a 2c 63 6f  ate*,sqlite3*,co
1c6b0 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a 20 20  nst char*).){.  
1c6c0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 51  sqlite3_stmt *pQ
1c6d0 75 65 72 79 20 3d 20 30 3b 0a 20 20 63 68 61 72  uery = 0;.  char
1c6e0 20 2a 7a 51 75 65 72 79 20 3d 20 30 3b 0a 20 20   *zQuery = 0;.  
1c6f0 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20  int rc;.  const 
1c700 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
1c710 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 75 6e  Name;.  const un
1c720 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 53 71  signed char *zSq
1c730 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  l;.  char *zErrM
1c740 73 67 20 3d 20 30 3b 0a 0a 20 20 7a 51 75 65 72  sg = 0;..  zQuer
1c750 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  y = sqlite3_mpri
1c760 6e 74 66 28 22 53 45 4c 45 43 54 20 6e 61 6d 65  ntf("SELECT name
1c770 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74  , sql FROM sqlit
1c780 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20  e_master".      
1c790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c7a0 20 20 20 20 20 22 20 57 48 45 52 45 20 25 73 22       " WHERE %s"
1c7b0 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 72 63 20  , zWhere);.  rc 
1c7c0 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
1c7d0 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75 65  e_v2(p->db, zQue
1c7e0 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79 2c  ry, -1, &pQuery,
1c7f0 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29 7b   0);.  if( rc ){
1c800 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
1c810 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
1c820 20 28 25 64 29 20 25 73 20 6f 6e 20 5b 25 73 5d   (%d) %s on [%s]
1c830 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1c840 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
1c850 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64  _extended_errcod
1c860 65 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65  e(p->db), sqlite
1c870 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c  3_errmsg(p->db),
1c880 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c890 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20 20       zQuery);.  
1c8a0 20 20 67 6f 74 6f 20 65 6e 64 5f 73 63 68 65 6d    goto end_schem
1c8b0 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20 77 68  a_xfer;.  }.  wh
1c8c0 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74  ile( (rc = sqlit
1c8d0 65 33 5f 73 74 65 70 28 70 51 75 65 72 79 29 29  e3_step(pQuery))
1c8e0 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
1c8f0 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c 69      zName = sqli
1c900 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
1c910 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20 20  pQuery, 0);.    
1c920 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 63  zSql = sqlite3_c
1c930 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65 72  olumn_text(pQuer
1c940 79 2c 20 31 29 3b 0a 20 20 20 20 70 72 69 6e 74  y, 1);.    print
1c950 66 28 22 25 73 2e 2e 2e 20 22 2c 20 7a 4e 61 6d  f("%s... ", zNam
1c960 65 29 3b 20 66 66 6c 75 73 68 28 73 74 64 6f 75  e); fflush(stdou
1c970 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  t);.    sqlite3_
1c980 65 78 65 63 28 6e 65 77 44 62 2c 20 28 63 6f 6e  exec(newDb, (con
1c990 73 74 20 63 68 61 72 2a 29 7a 53 71 6c 2c 20 30  st char*)zSql, 0
1c9a0 2c 20 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a  , 0, &zErrMsg);.
1c9b0 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67 20      if( zErrMsg 
1c9c0 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
1c9d0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
1c9e0 72 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a 20 5b 25  ror: %s\nSQL: [%
1c9f0 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 2c 20  s]\n", zErrMsg, 
1ca00 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  zSql);.      sql
1ca10 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73  ite3_free(zErrMs
1ca20 67 29 3b 0a 20 20 20 20 20 20 7a 45 72 72 4d 73  g);.      zErrMs
1ca30 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  g = 0;.    }.   
1ca40 20 69 66 28 20 78 46 6f 72 45 61 63 68 20 29 7b   if( xForEach ){
1ca50 0a 20 20 20 20 20 20 78 46 6f 72 45 61 63 68 28  .      xForEach(
1ca60 70 2c 20 6e 65 77 44 62 2c 20 28 63 6f 6e 73 74  p, newDb, (const
1ca70 20 63 68 61 72 2a 29 7a 4e 61 6d 65 29 3b 0a 20   char*)zName);. 
1ca80 20 20 20 7d 0a 20 20 20 20 70 72 69 6e 74 66 28     }.    printf(
1ca90 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20 7d 0a 20  "done\n");.  }. 
1caa0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
1cab0 44 4f 4e 45 20 29 7b 0a 20 20 20 20 73 71 6c 69  DONE ){.    sqli
1cac0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51 75  te3_finalize(pQu
1cad0 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ery);.    sqlite
1cae0 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b 0a  3_free(zQuery);.
1caf0 20 20 20 20 7a 51 75 65 72 79 20 3d 20 73 71 6c      zQuery = sql
1cb00 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
1cb10 4c 45 43 54 20 6e 61 6d 65 2c 20 73 71 6c 20 46  LECT name, sql F
1cb20 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
1cb30 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r".             
1cb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb50 22 20 57 48 45 52 45 20 25 73 20 4f 52 44 45 52  " WHERE %s ORDER
1cb60 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22 2c   BY rowid DESC",
1cb70 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 72 63   zWhere);.    rc
1cb80 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
1cb90 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75  re_v2(p->db, zQu
1cba0 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79  ery, -1, &pQuery
1cbb0 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63  , 0);.    if( rc
1cbc0 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
1cbd0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
1cbe0 72 72 6f 72 3a 20 28 25 64 29 20 25 73 20 6f 6e  rror: (%d) %s on
1cbf0 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20   [%s]\n",.      
1cc00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cc10 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64  sqlite3_extended
1cc20 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29 2c  _errcode(p->db),
1cc30 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
1cc40 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20 20  p->db),.        
1cc50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 51                zQ
1cc60 75 65 72 79 29 3b 0a 20 20 20 20 20 20 67 6f 74  uery);.      got
1cc70 6f 20 65 6e 64 5f 73 63 68 65 6d 61 5f 78 66 65  o end_schema_xfe
1cc80 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69  r;.    }.    whi
1cc90 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65  le( (rc = sqlite
1cca0 33 5f 73 74 65 70 28 70 51 75 65 72 79 29 29 3d  3_step(pQuery))=
1ccb0 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
1ccc0 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c       zName = sql
1ccd0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
1cce0 28 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20  (pQuery, 0);.   
1ccf0 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
1cd00 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51  3_column_text(pQ
1cd10 75 65 72 79 2c 20 31 29 3b 0a 20 20 20 20 20 20  uery, 1);.      
1cd20 70 72 69 6e 74 66 28 22 25 73 2e 2e 2e 20 22 2c  printf("%s... ",
1cd30 20 7a 4e 61 6d 65 29 3b 20 66 66 6c 75 73 68 28   zName); fflush(
1cd40 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20 73  stdout);.      s
1cd50 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44  qlite3_exec(newD
1cd60 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29  b, (const char*)
1cd70 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45 72  zSql, 0, 0, &zEr
1cd80 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 69 66 28  rMsg);.      if(
1cd90 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20   zErrMsg ){.    
1cda0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
1cdb0 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
1cdc0 25 73 5c 6e 53 51 4c 3a 20 5b 25 73 5d 5c 6e 22  %s\nSQL: [%s]\n"
1cdd0 2c 20 7a 45 72 72 4d 73 67 2c 20 7a 53 71 6c 29  , zErrMsg, zSql)
1cde0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
1cdf0 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b  3_free(zErrMsg);
1ce00 0a 20 20 20 20 20 20 20 20 7a 45 72 72 4d 73 67  .        zErrMsg
1ce10 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
1ce20 20 20 20 20 69 66 28 20 78 46 6f 72 45 61 63 68      if( xForEach
1ce30 20 29 7b 0a 20 20 20 20 20 20 20 20 78 46 6f 72   ){.        xFor
1ce40 45 61 63 68 28 70 2c 20 6e 65 77 44 62 2c 20 28  Each(p, newDb, (
1ce50 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 4e 61 6d  const char*)zNam
1ce60 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
1ce70 20 20 70 72 69 6e 74 66 28 22 64 6f 6e 65 5c 6e    printf("done\n
1ce80 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 65 6e  ");.    }.  }.en
1ce90 64 5f 73 63 68 65 6d 61 5f 78 66 65 72 3a 0a 20  d_schema_xfer:. 
1cea0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
1ceb0 65 28 70 51 75 65 72 79 29 3b 0a 20 20 73 71 6c  e(pQuery);.  sql
1cec0 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79  ite3_free(zQuery
1ced0 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65 6e  );.}../*.** Open
1cee0 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65 20   a new database 
1cef0 66 69 6c 65 20 6e 61 6d 65 64 20 22 7a 4e 65 77  file named "zNew
1cf00 44 62 22 2e 20 20 54 72 79 20 74 6f 20 72 65 63  Db".  Try to rec
1cf10 6f 76 65 72 20 61 73 20 6d 75 63 68 20 69 6e 66  over as much inf
1cf20 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 61 73 20 70  ormation.** as p
1cf30 6f 73 73 69 62 6c 65 20 6f 75 74 20 6f 66 20 74  ossible out of t
1cf40 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
1cf50 20 28 77 68 69 63 68 20 6d 69 67 68 74 20 62 65   (which might be
1cf60 20 63 6f 72 72 75 70 74 29 20 61 6e 64 20 77 72   corrupt) and wr
1cf70 69 74 65 20 69 74 0a 2a 2a 20 69 6e 74 6f 20 7a  ite it.** into z
1cf80 4e 65 77 44 62 2e 0a 2a 2f 0a 73 74 61 74 69 63  NewDb..*/.static
1cf90 20 76 6f 69 64 20 74 72 79 54 6f 43 6c 6f 6e 65   void tryToClone
1cfa0 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20  (ShellState *p, 
1cfb0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65 77  const char *zNew
1cfc0 44 62 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  Db){.  int rc;. 
1cfd0 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62 20   sqlite3 *newDb 
1cfe0 3d 20 30 3b 0a 20 20 69 66 28 20 61 63 63 65 73  = 0;.  if( acces
1cff0 73 28 7a 4e 65 77 44 62 2c 30 29 3d 3d 30 20 29  s(zNewDb,0)==0 )
1d000 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
1d010 66 28 73 74 64 65 72 72 2c 20 22 46 69 6c 65 20  f(stderr, "File 
1d020 5c 22 25 73 5c 22 20 61 6c 72 65 61 64 79 20 65  \"%s\" already e
1d030 78 69 73 74 73 2e 5c 6e 22 2c 20 7a 4e 65 77 44  xists.\n", zNewD
1d040 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a  b);.    return;.
1d050 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74    }.  rc = sqlit
1d060 65 33 5f 6f 70 65 6e 28 7a 4e 65 77 44 62 2c 20  e3_open(zNewDb, 
1d070 26 6e 65 77 44 62 29 3b 0a 20 20 69 66 28 20 72  &newDb);.  if( r
1d080 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  c ){.    utf8_pr
1d090 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 43 61  intf(stderr, "Ca
1d0a0 6e 6e 6f 74 20 63 72 65 61 74 65 20 6f 75 74 70  nnot create outp
1d0b0 75 74 20 64 61 74 61 62 61 73 65 3a 20 25 73 5c  ut database: %s\
1d0c0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
1d0d0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 6e  sqlite3_errmsg(n
1d0e0 65 77 44 62 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  ewDb));.  }else{
1d0f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65  .    sqlite3_exe
1d100 63 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41  c(p->db, "PRAGMA
1d110 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61   writable_schema
1d120 3d 4f 4e 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b  =ON;", 0, 0, 0);
1d130 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65  .    sqlite3_exe
1d140 63 28 6e 65 77 44 62 2c 20 22 42 45 47 49 4e 20  c(newDb, "BEGIN 
1d150 45 58 43 4c 55 53 49 56 45 3b 22 2c 20 30 2c 20  EXCLUSIVE;", 0, 
1d160 30 2c 20 30 29 3b 0a 20 20 20 20 74 72 79 54 6f  0, 0);.    tryTo
1d170 43 6c 6f 6e 65 53 63 68 65 6d 61 28 70 2c 20 6e  CloneSchema(p, n
1d180 65 77 44 62 2c 20 22 74 79 70 65 3d 27 74 61 62  ewDb, "type='tab
1d190 6c 65 27 22 2c 20 74 72 79 54 6f 43 6c 6f 6e 65  le'", tryToClone
1d1a0 44 61 74 61 29 3b 0a 20 20 20 20 74 72 79 54 6f  Data);.    tryTo
1d1b0 43 6c 6f 6e 65 53 63 68 65 6d 61 28 70 2c 20 6e  CloneSchema(p, n
1d1c0 65 77 44 62 2c 20 22 74 79 70 65 21 3d 27 74 61  ewDb, "type!='ta
1d1d0 62 6c 65 27 22 2c 20 30 29 3b 0a 20 20 20 20 73  ble'", 0);.    s
1d1e0 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77 44  qlite3_exec(newD
1d1f0 62 2c 20 22 43 4f 4d 4d 49 54 3b 22 2c 20 30 2c  b, "COMMIT;", 0,
1d200 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
1d210 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
1d220 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65  "PRAGMA writable
1d230 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 22 2c 20 30  _schema=OFF;", 0
1d240 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  , 0, 0);.  }.  s
1d250 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 6e 65 77  qlite3_close(new
1d260 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68  Db);.}../*.** Ch
1d270 61 6e 67 65 20 74 68 65 20 6f 75 74 70 75 74 20  ange the output 
1d280 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 73 74 64  file back to std
1d290 6f 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  out.*/.static vo
1d2a0 69 64 20 6f 75 74 70 75 74 5f 72 65 73 65 74 28  id output_reset(
1d2b0 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a  ShellState *p){.
1d2c0 20 20 69 66 28 20 70 2d 3e 6f 75 74 66 69 6c 65    if( p->outfile
1d2d0 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69 66 6e  [0]=='|' ){.#ifn
1d2e0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
1d2f0 50 4f 50 45 4e 0a 20 20 20 20 70 63 6c 6f 73 65  POPEN.    pclose
1d300 28 70 2d 3e 6f 75 74 29 3b 0a 23 65 6e 64 69 66  (p->out);.#endif
1d310 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f 75  .  }else{.    ou
1d320 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65 28  tput_file_close(
1d330 70 2d 3e 6f 75 74 29 3b 0a 20 20 7d 0a 20 20 70  p->out);.  }.  p
1d340 2d 3e 6f 75 74 66 69 6c 65 5b 30 5d 20 3d 20 30  ->outfile[0] = 0
1d350 3b 0a 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64  ;.  p->out = std
1d360 6f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75  out;.}../*.** Ru
1d370 6e 20 61 6e 20 53 51 4c 20 63 6f 6d 6d 61 6e 64  n an SQL command
1d380 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
1d390 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20 72  single integer r
1d3a0 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  esult..*/.static
1d3b0 20 69 6e 74 20 64 62 5f 69 6e 74 28 53 68 65 6c   int db_int(Shel
1d3c0 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74  lState *p, const
1d3d0 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20 20   char *zSql){.  
1d3e0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1d3f0 74 6d 74 3b 0a 20 20 69 6e 74 20 72 65 73 20 3d  tmt;.  int res =
1d400 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70 72   0;.  sqlite3_pr
1d410 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20  epare_v2(p->db, 
1d420 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74  zSql, -1, &pStmt
1d430 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53 74 6d  , 0);.  if( pStm
1d440 74 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 65  t && sqlite3_ste
1d450 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
1d460 5f 52 4f 57 20 29 7b 0a 20 20 20 20 72 65 73 20  _ROW ){.    res 
1d470 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
1d480 5f 69 6e 74 28 70 53 74 6d 74 2c 30 29 3b 0a 20  _int(pStmt,0);. 
1d490 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e   }.  sqlite3_fin
1d4a0 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
1d4b0 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a 2f  return res;.}../
1d4c0 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20 32  *.** Convert a 2
1d4d0 2d 62 79 74 65 20 6f 72 20 34 2d 62 79 74 65 20  -byte or 4-byte 
1d4e0 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65 67  big-endian integ
1d4f0 65 72 20 69 6e 74 6f 20 61 20 6e 61 74 69 76 65  er into a native
1d500 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 73 74 61 74   integer.*/.stat
1d510 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  ic unsigned int 
1d520 67 65 74 32 62 79 74 65 49 6e 74 28 75 6e 73 69  get2byteInt(unsi
1d530 67 6e 65 64 20 63 68 61 72 20 2a 61 29 7b 0a 20  gned char *a){. 
1d540 20 72 65 74 75 72 6e 20 28 61 5b 30 5d 3c 3c 38   return (a[0]<<8
1d550 29 20 2b 20 61 5b 31 5d 3b 0a 7d 0a 73 74 61 74  ) + a[1];.}.stat
1d560 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20  ic unsigned int 
1d570 67 65 74 34 62 79 74 65 49 6e 74 28 75 6e 73 69  get4byteInt(unsi
1d580 67 6e 65 64 20 63 68 61 72 20 2a 61 29 7b 0a 20  gned char *a){. 
1d590 20 72 65 74 75 72 6e 20 28 61 5b 30 5d 3c 3c 32   return (a[0]<<2
1d5a0 34 29 20 2b 20 28 61 5b 31 5d 3c 3c 31 36 29 20  4) + (a[1]<<16) 
1d5b0 2b 20 28 61 5b 32 5d 3c 3c 38 29 20 2b 20 61 5b  + (a[2]<<8) + a[
1d5c0 33 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  3];.}../*.** Imp
1d5d0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 74  lementation of t
1d5e0 68 65 20 22 2e 69 6e 66 6f 22 20 63 6f 6d 6d 61  he ".info" comma
1d5f0 6e 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  nd..**.** Return
1d600 20 31 20 6f 6e 20 65 72 72 6f 72 2c 20 32 20 74   1 on error, 2 t
1d610 6f 20 65 78 69 74 2c 20 61 6e 64 20 30 20 6f 74  o exit, and 0 ot
1d620 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74  herwise..*/.stat
1d630 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f 64 62 69  ic int shell_dbi
1d640 6e 66 6f 5f 63 6f 6d 6d 61 6e 64 28 53 68 65 6c  nfo_command(Shel
1d650 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e 74 20 6e  lState *p, int n
1d660 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72  Arg, char **azAr
1d670 67 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  g){.  static con
1d680 73 74 20 73 74 72 75 63 74 20 7b 20 63 6f 6e 73  st struct { cons
1d690 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 69  t char *zName; i
1d6a0 6e 74 20 6f 66 73 74 3b 20 7d 20 61 46 69 65 6c  nt ofst; } aFiel
1d6b0 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20 22  d[] = {.     { "
1d6c0 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75 6e  file change coun
1d6d0 74 65 72 3a 22 2c 20 20 32 34 20 20 7d 2c 0a 20  ter:",  24  },. 
1d6e0 20 20 20 20 7b 20 22 64 61 74 61 62 61 73 65 20      { "database 
1d6f0 70 61 67 65 20 63 6f 75 6e 74 3a 22 2c 20 20 32  page count:",  2
1d700 38 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 72  8  },.     { "fr
1d710 65 65 6c 69 73 74 20 70 61 67 65 20 63 6f 75 6e  eelist page coun
1d720 74 3a 22 2c 20 20 33 36 20 20 7d 2c 0a 20 20 20  t:",  36  },.   
1d730 20 20 7b 20 22 73 63 68 65 6d 61 20 63 6f 6f 6b    { "schema cook
1d740 69 65 3a 22 2c 20 20 20 20 20 20 20 20 34 30 20  ie:",        40 
1d750 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63 68 65   },.     { "sche
1d760 6d 61 20 66 6f 72 6d 61 74 3a 22 2c 20 20 20 20  ma format:",    
1d770 20 20 20 20 34 34 20 20 7d 2c 0a 20 20 20 20 20      44  },.     
1d780 7b 20 22 64 65 66 61 75 6c 74 20 63 61 63 68 65  { "default cache
1d790 20 73 69 7a 65 3a 22 2c 20 20 20 34 38 20 20 7d   size:",   48  }
1d7a0 2c 0a 20 20 20 20 20 7b 20 22 61 75 74 6f 76 61  ,.     { "autova
1d7b0 63 75 75 6d 20 74 6f 70 20 72 6f 6f 74 3a 22 2c  cuum top root:",
1d7c0 20 20 35 32 20 20 7d 2c 0a 20 20 20 20 20 7b 20    52  },.     { 
1d7d0 22 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61 63  "incremental vac
1d7e0 75 75 6d 3a 22 2c 20 20 20 36 34 20 20 7d 2c 0a  uum:",   64  },.
1d7f0 20 20 20 20 20 7b 20 22 74 65 78 74 20 65 6e 63       { "text enc
1d800 6f 64 69 6e 67 3a 22 2c 20 20 20 20 20 20 20 20  oding:",        
1d810 35 36 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 75  56  },.     { "u
1d820 73 65 72 20 76 65 72 73 69 6f 6e 3a 22 2c 20 20  ser version:",  
1d830 20 20 20 20 20 20 20 36 30 20 20 7d 2c 0a 20 20         60  },.  
1d840 20 20 20 7b 20 22 61 70 70 6c 69 63 61 74 69 6f     { "applicatio
1d850 6e 20 69 64 3a 22 2c 20 20 20 20 20 20 20 36 38  n id:",       68
1d860 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 6f 66    },.     { "sof
1d870 74 77 61 72 65 20 76 65 72 73 69 6f 6e 3a 22 2c  tware version:",
1d880 20 20 20 20 20 39 36 20 20 7d 2c 0a 20 20 7d 3b       96  },.  };
1d890 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
1d8a0 73 74 72 75 63 74 20 7b 20 63 6f 6e 73 74 20 63  struct { const c
1d8b0 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 63 6f 6e 73  har *zName; cons
1d8c0 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 7d 20  t char *zSql; } 
1d8d0 61 51 75 65 72 79 5b 5d 20 3d 20 7b 0a 20 20 20  aQuery[] = {.   
1d8e0 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20 74    { "number of t
1d8f0 61 62 6c 65 73 3a 22 2c 0a 20 20 20 20 20 20 20  ables:",.       
1d900 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29  "SELECT count(*)
1d910 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20 74   FROM %s WHERE t
1d920 79 70 65 3d 27 74 61 62 6c 65 27 22 20 7d 2c 0a  ype='table'" },.
1d930 20 20 20 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f       { "number o
1d940 66 20 69 6e 64 65 78 65 73 3a 22 2c 0a 20 20 20  f indexes:",.   
1d950 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e      "SELECT coun
1d960 74 28 2a 29 20 46 52 4f 4d 20 25 73 20 57 48 45  t(*) FROM %s WHE
1d970 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22  RE type='index'"
1d980 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62   },.     { "numb
1d990 65 72 20 6f 66 20 74 72 69 67 67 65 72 73 3a 22  er of triggers:"
1d9a0 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  ,.       "SELECT
1d9b0 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25   count(*) FROM %
1d9c0 73 20 57 48 45 52 45 20 74 79 70 65 3d 27 74 72  s WHERE type='tr
1d9d0 69 67 67 65 72 27 22 20 7d 2c 0a 20 20 20 20 20  igger'" },.     
1d9e0 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20 76 69 65  { "number of vie
1d9f0 77 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45  ws:",.       "SE
1da00 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52  LECT count(*) FR
1da10 4f 4d 20 25 73 20 57 48 45 52 45 20 74 79 70 65  OM %s WHERE type
1da20 3d 27 76 69 65 77 27 22 20 7d 2c 0a 20 20 20 20  ='view'" },.    
1da30 20 7b 20 22 73 63 68 65 6d 61 20 73 69 7a 65 3a   { "schema size:
1da40 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43  ",.       "SELEC
1da50 54 20 74 6f 74 61 6c 28 6c 65 6e 67 74 68 28 73  T total(length(s
1da60 71 6c 29 29 20 46 52 4f 4d 20 25 73 22 20 7d 2c  ql)) FROM %s" },
1da70 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  .  };.  int i;. 
1da80 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 54 61   char *zSchemaTa
1da90 62 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62 20 3d  b;.  char *zDb =
1daa0 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72 67   nArg>=2 ? azArg
1dab0 5b 31 5d 20 3a 20 22 6d 61 69 6e 22 3b 0a 20 20  [1] : "main";.  
1dac0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
1dad0 74 6d 74 20 3d 20 30 3b 0a 20 20 75 6e 73 69 67  tmt = 0;.  unsig
1dae0 6e 65 64 20 63 68 61 72 20 61 48 64 72 5b 31 30  ned char aHdr[10
1daf0 30 5d 3b 0a 20 20 6f 70 65 6e 5f 64 62 28 70 2c  0];.  open_db(p,
1db00 20 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64 62   0);.  if( p->db
1db10 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
1db20 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72    sqlite3_prepar
1db30 65 5f 76 32 28 70 2d 3e 64 62 2c 22 53 45 4c 45  e_v2(p->db,"SELE
1db40 43 54 20 64 61 74 61 20 46 52 4f 4d 20 73 71 6c  CT data FROM sql
1db50 69 74 65 5f 64 62 70 61 67 65 28 3f 31 29 20 57  ite_dbpage(?1) W
1db60 48 45 52 45 20 70 67 6e 6f 3d 31 22 2c 0a 20 20  HERE pgno=1",.  
1db70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1db80 20 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30     -1, &pStmt, 0
1db90 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69 6e  );.  sqlite3_bin
1dba0 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 2c  d_text(pStmt, 1,
1dbb0 20 7a 44 62 2c 20 2d 31 2c 20 53 51 4c 49 54 45   zDb, -1, SQLITE
1dbc0 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28 20  _STATIC);.  if( 
1dbd0 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
1dbe0 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 0a  mt)==SQLITE_ROW.
1dbf0 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 63 6f     && sqlite3_co
1dc00 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74  lumn_bytes(pStmt
1dc10 2c 30 29 3e 31 30 30 0a 20 20 29 7b 0a 20 20 20  ,0)>100.  ){.   
1dc20 20 6d 65 6d 63 70 79 28 61 48 64 72 2c 20 73 71   memcpy(aHdr, sq
1dc30 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c 6f  lite3_column_blo
1dc40 62 28 70 53 74 6d 74 2c 30 29 2c 20 31 30 30 29  b(pStmt,0), 100)
1dc50 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  ;.    sqlite3_fi
1dc60 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
1dc70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 61 77 5f   }else{.    raw_
1dc80 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1dc90 75 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20 64  unable to read d
1dca0 61 74 61 62 61 73 65 20 68 65 61 64 65 72 5c 6e  atabase header\n
1dcb0 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ");.    sqlite3_
1dcc0 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
1dcd0 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
1dce0 20 7d 0a 20 20 69 20 3d 20 67 65 74 32 62 79 74   }.  i = get2byt
1dcf0 65 49 6e 74 28 61 48 64 72 2b 31 36 29 3b 0a 20  eInt(aHdr+16);. 
1dd00 20 69 66 28 20 69 3d 3d 31 20 29 20 69 20 3d 20   if( i==1 ) i = 
1dd10 36 35 35 33 36 3b 0a 20 20 75 74 66 38 5f 70 72  65536;.  utf8_pr
1dd20 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d  intf(p->out, "%-
1dd30 32 30 73 20 25 64 5c 6e 22 2c 20 22 64 61 74 61  20s %d\n", "data
1dd40 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 3a 22  base page size:"
1dd50 2c 20 69 29 3b 0a 20 20 75 74 66 38 5f 70 72 69  , i);.  utf8_pri
1dd60 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32  ntf(p->out, "%-2
1dd70 30 73 20 25 64 5c 6e 22 2c 20 22 77 72 69 74 65  0s %d\n", "write
1dd80 20 66 6f 72 6d 61 74 3a 22 2c 20 61 48 64 72 5b   format:", aHdr[
1dd90 31 38 5d 29 3b 0a 20 20 75 74 66 38 5f 70 72 69  18]);.  utf8_pri
1dda0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32  ntf(p->out, "%-2
1ddb0 30 73 20 25 64 5c 6e 22 2c 20 22 72 65 61 64 20  0s %d\n", "read 
1ddc0 66 6f 72 6d 61 74 3a 22 2c 20 61 48 64 72 5b 31  format:", aHdr[1
1ddd0 39 5d 29 3b 0a 20 20 75 74 66 38 5f 70 72 69 6e  9]);.  utf8_prin
1dde0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30  tf(p->out, "%-20
1ddf0 73 20 25 64 5c 6e 22 2c 20 22 72 65 73 65 72 76  s %d\n", "reserv
1de00 65 64 20 62 79 74 65 73 3a 22 2c 20 61 48 64 72  ed bytes:", aHdr
1de10 5b 32 30 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30  [20]);.  for(i=0
1de20 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 46  ; i<ArraySize(aF
1de30 69 65 6c 64 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  ield); i++){.   
1de40 20 69 6e 74 20 6f 66 73 74 20 3d 20 61 46 69 65   int ofst = aFie
1de50 6c 64 5b 69 5d 2e 6f 66 73 74 3b 0a 20 20 20 20  ld[i].ofst;.    
1de60 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 76 61 6c  unsigned int val
1de70 20 3d 20 67 65 74 34 62 79 74 65 49 6e 74 28 61   = get4byteInt(a
1de80 48 64 72 20 2b 20 6f 66 73 74 29 3b 0a 20 20 20  Hdr + ofst);.   
1de90 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
1dea0 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 75 22 2c  out, "%-20s %u",
1deb0 20 61 46 69 65 6c 64 5b 69 5d 2e 7a 4e 61 6d 65   aField[i].zName
1dec0 2c 20 76 61 6c 29 3b 0a 20 20 20 20 73 77 69 74  , val);.    swit
1ded0 63 68 28 20 6f 66 73 74 20 29 7b 0a 20 20 20 20  ch( ofst ){.    
1dee0 20 20 63 61 73 65 20 35 36 3a 20 7b 0a 20 20 20    case 56: {.   
1def0 20 20 20 20 20 69 66 28 20 76 61 6c 3d 3d 31 20       if( val==1 
1df00 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e  ) raw_printf(p->
1df10 6f 75 74 2c 20 22 20 28 75 74 66 38 29 22 29 3b  out, " (utf8)");
1df20 0a 20 20 20 20 20 20 20 20 69 66 28 20 76 61 6c  .        if( val
1df30 3d 3d 32 20 29 20 72 61 77 5f 70 72 69 6e 74 66  ==2 ) raw_printf
1df40 28 70 2d 3e 6f 75 74 2c 20 22 20 28 75 74 66 31  (p->out, " (utf1
1df50 36 6c 65 29 22 29 3b 0a 20 20 20 20 20 20 20 20  6le)");.        
1df60 69 66 28 20 76 61 6c 3d 3d 33 20 29 20 72 61 77  if( val==3 ) raw
1df70 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
1df80 22 20 28 75 74 66 31 36 62 65 29 22 29 3b 0a 20  " (utf16be)");. 
1df90 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
1dfa0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
1dfb0 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d 0a 20  ut, "\n");.  }. 
1dfc0 20 69 66 28 20 7a 44 62 3d 3d 30 20 29 7b 0a 20   if( zDb==0 ){. 
1dfd0 20 20 20 7a 53 63 68 65 6d 61 54 61 62 20 3d 20     zSchemaTab = 
1dfe0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1dff0 22 6d 61 69 6e 2e 73 71 6c 69 74 65 5f 6d 61 73  "main.sqlite_mas
1e000 74 65 72 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69  ter");.  }else i
1e010 66 28 20 73 74 72 63 6d 70 28 7a 44 62 2c 22 74  f( strcmp(zDb,"t
1e020 65 6d 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  emp")==0 ){.    
1e030 7a 53 63 68 65 6d 61 54 61 62 20 3d 20 73 71 6c  zSchemaTab = sql
1e040 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
1e050 22 2c 20 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f  ", "sqlite_temp_
1e060 6d 61 73 74 65 72 22 29 3b 0a 20 20 7d 65 6c 73  master");.  }els
1e070 65 7b 0a 20 20 20 20 7a 53 63 68 65 6d 61 54 61  e{.    zSchemaTa
1e080 62 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  b = sqlite3_mpri
1e090 6e 74 66 28 22 5c 22 25 77 5c 22 2e 73 71 6c 69  ntf("\"%w\".sqli
1e0a0 74 65 5f 6d 61 73 74 65 72 22 2c 20 7a 44 62 29  te_master", zDb)
1e0b0 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b  ;.  }.  for(i=0;
1e0c0 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 51 75   i<ArraySize(aQu
1e0d0 65 72 79 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  ery); i++){.    
1e0e0 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c  char *zSql = sql
1e0f0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 51 75  ite3_mprintf(aQu
1e100 65 72 79 5b 69 5d 2e 7a 53 71 6c 2c 20 7a 53 63  ery[i].zSql, zSc
1e110 68 65 6d 61 54 61 62 29 3b 0a 20 20 20 20 69 6e  hemaTab);.    in
1e120 74 20 76 61 6c 20 3d 20 64 62 5f 69 6e 74 28 70  t val = db_int(p
1e130 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 73 71 6c  , zSql);.    sql
1e140 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
1e150 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
1e160 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20  (p->out, "%-20s 
1e170 25 64 5c 6e 22 2c 20 61 51 75 65 72 79 5b 69 5d  %d\n", aQuery[i]
1e180 2e 7a 4e 61 6d 65 2c 20 76 61 6c 29 3b 0a 20 20  .zName, val);.  
1e190 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  }.  sqlite3_free
1e1a0 28 7a 53 63 68 65 6d 61 54 61 62 29 3b 0a 20 20  (zSchemaTab);.  
1e1b0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
1e1c0 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63 75 72  ** Print the cur
1e1d0 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 72 72  rent sqlite3_err
1e1e0 6d 73 67 28 29 20 76 61 6c 75 65 20 74 6f 20 73  msg() value to s
1e1f0 74 64 65 72 72 20 61 6e 64 20 72 65 74 75 72 6e  tderr and return
1e200 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   1..*/.static in
1e210 74 20 73 68 65 6c 6c 44 61 74 61 62 61 73 65 45  t shellDatabaseE
1e220 72 72 6f 72 28 73 71 6c 69 74 65 33 20 2a 64 62  rror(sqlite3 *db
1e230 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
1e240 2a 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33 5f  *zErr = sqlite3_
1e250 65 72 72 6d 73 67 28 64 62 29 3b 0a 20 20 75 74  errmsg(db);.  ut
1e260 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
1e270 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  , "Error: %s\n",
1e280 20 7a 45 72 72 29 3b 0a 20 20 72 65 74 75 72 6e   zErr);.  return
1e290 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69   1;.}../*.** Pri
1e2a0 6e 74 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65 6d  nt an out-of-mem
1e2b0 6f 72 79 20 6d 65 73 73 61 67 65 20 74 6f 20 73  ory message to s
1e2c0 74 64 65 72 72 20 61 6e 64 20 72 65 74 75 72 6e  tderr and return
1e2d0 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   1..*/.static in
1e2e0 74 20 73 68 65 6c 6c 4e 6f 6d 65 6d 45 72 72 6f  t shellNomemErro
1e2f0 72 28 76 6f 69 64 29 7b 0a 20 20 72 61 77 5f 70  r(void){.  raw_p
1e300 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
1e310 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d  rror: out of mem
1e320 6f 72 79 5c 6e 22 29 3b 0a 20 20 72 65 74 75 72  ory\n");.  retur
1e330 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  n 1;.}../*.** Co
1e340 6d 70 61 72 65 20 74 68 65 20 70 61 74 74 65 72  mpare the patter
1e350 6e 20 69 6e 20 7a 47 6c 6f 62 5b 5d 20 61 67 61  n in zGlob[] aga
1e360 69 6e 73 74 20 74 68 65 20 74 65 78 74 20 69 6e  inst the text in
1e370 20 7a 5b 5d 2e 20 20 52 65 74 75 72 6e 20 54 52   z[].  Return TR
1e380 55 45 0a 2a 2a 20 69 66 20 74 68 65 79 20 6d 61  UE.** if they ma
1e390 74 63 68 20 61 6e 64 20 46 41 4c 53 45 20 28 30  tch and FALSE (0
1e3a0 29 20 69 66 20 74 68 65 79 20 64 6f 20 6e 6f 74  ) if they do not
1e3b0 20 6d 61 74 63 68 2e 0a 2a 2a 0a 2a 2a 20 47 6c   match..**.** Gl
1e3c0 6f 62 62 69 6e 67 20 72 75 6c 65 73 3a 0a 2a 2a  obbing rules:.**
1e3d0 0a 2a 2a 20 20 20 20 20 20 27 2a 27 20 20 20 20  .**      '*'    
1e3e0 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79 20 73     Matches any s
1e3f0 65 71 75 65 6e 63 65 20 6f 66 20 7a 65 72 6f 20  equence of zero 
1e400 6f 72 20 6d 6f 72 65 20 63 68 61 72 61 63 74 65  or more characte
1e410 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27  rs..**.**      '
1e420 3f 27 20 20 20 20 20 20 20 4d 61 74 63 68 65 73  ?'       Matches
1e430 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 68 61   exactly one cha
1e440 72 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20 20  racter..**.**   
1e450 20 20 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d 61 74    [...]      Mat
1e460 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63 74  ches one charact
1e470 65 72 20 66 72 6f 6d 20 74 68 65 20 65 6e 63 6c  er from the encl
1e480 6f 73 65 64 20 6c 69 73 74 20 6f 66 0a 2a 2a 20  osed list of.** 
1e490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
1e4a0 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a 2a  haracters..**.**
1e4b0 20 20 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20 20 20       [^...]     
1e4c0 4d 61 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72  Matches one char
1e4d0 61 63 74 65 72 20 6e 6f 74 20 69 6e 20 74 68 65  acter not in the
1e4e0 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74 2e 0a   enclosed list..
1e4f0 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 23 27 20 20  **.**      '#'  
1e500 20 20 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79       Matches any
1e510 20 73 65 71 75 65 6e 63 65 20 6f 66 20 6f 6e 65   sequence of one
1e520 20 6f 72 20 6d 6f 72 65 20 64 69 67 69 74 73 20   or more digits 
1e530 77 69 74 68 20 61 6e 0a 2a 2a 20 20 20 20 20 20  with an.**      
1e540 20 20 20 20 20 20 20 20 20 20 6f 70 74 69 6f 6e            option
1e550 61 6c 20 2b 20 6f 72 20 2d 20 73 69 67 6e 20 69  al + or - sign i
1e560 6e 20 66 72 6f 6e 74 0a 2a 2a 0a 2a 2a 20 20 20  n front.**.**   
1e570 20 20 20 27 20 27 20 20 20 20 20 20 20 41 6e 79     ' '       Any
1e580 20 73 70 61 6e 20 6f 66 20 77 68 69 74 65 73 70   span of whitesp
1e590 61 63 65 20 6d 61 74 63 68 65 73 20 61 6e 79 20  ace matches any 
1e5a0 6f 74 68 65 72 20 73 70 61 6e 20 6f 66 0a 2a 2a  other span of.**
1e5b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1e5c0 77 68 69 74 65 73 70 61 63 65 2e 0a 2a 2a 0a 2a  whitespace..**.*
1e5d0 2a 20 45 78 74 72 61 20 77 68 69 74 65 73 70 61  * Extra whitespa
1e5e0 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f 66  ce at the end of
1e5f0 20 7a 5b 5d 20 69 73 20 69 67 6e 6f 72 65 64 2e   z[] is ignored.
1e600 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 74  .*/.static int t
1e610 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 63 6f 6e  estcase_glob(con
1e620 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62 2c 20  st char *zGlob, 
1e630 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
1e640 20 20 69 6e 74 20 63 2c 20 63 32 3b 0a 20 20 69    int c, c2;.  i
1e650 6e 74 20 69 6e 76 65 72 74 3b 0a 20 20 69 6e 74  nt invert;.  int
1e660 20 73 65 65 6e 3b 0a 0a 20 20 77 68 69 6c 65 28   seen;..  while(
1e670 20 28 63 20 3d 20 28 2a 28 7a 47 6c 6f 62 2b 2b   (c = (*(zGlob++
1e680 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  )))!=0 ){.    if
1e690 28 20 49 73 53 70 61 63 65 28 63 29 20 29 7b 0a  ( IsSpace(c) ){.
1e6a0 20 20 20 20 20 20 69 66 28 20 21 49 73 53 70 61        if( !IsSpa
1e6b0 63 65 28 2a 7a 29 20 29 20 72 65 74 75 72 6e 20  ce(*z) ) return 
1e6c0 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  0;.      while( 
1e6d0 49 73 53 70 61 63 65 28 2a 7a 47 6c 6f 62 29 20  IsSpace(*zGlob) 
1e6e0 29 20 7a 47 6c 6f 62 2b 2b 3b 0a 20 20 20 20 20  ) zGlob++;.     
1e6f0 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28   while( IsSpace(
1e700 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 7d  *z) ) z++;.    }
1e710 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 2a 27 20  else if( c=='*' 
1e720 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20  ){.      while( 
1e730 28 63 3d 28 2a 28 7a 47 6c 6f 62 2b 2b 29 29 29  (c=(*(zGlob++)))
1e740 20 3d 3d 20 27 2a 27 20 7c 7c 20 63 3d 3d 27 3f   == '*' || c=='?
1e750 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ' ){.        if(
1e760 20 63 3d 3d 27 3f 27 20 26 26 20 28 2a 28 7a 2b   c=='?' && (*(z+
1e770 2b 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  +))==0 ) return 
1e780 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
1e790 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
1e7a0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
1e7b0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
1e7c0 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 20  =='[' ){.       
1e7d0 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 74 65   while( *z && te
1e7e0 73 74 63 61 73 65 5f 67 6c 6f 62 28 7a 47 6c 6f  stcase_glob(zGlo
1e7f0 62 2d 31 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20 20  b-1,z)==0 ){.   
1e800 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20         z++;.    
1e810 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
1e820 74 75 72 6e 20 28 2a 7a 29 21 3d 30 3b 0a 20 20  turn (*z)!=0;.  
1e830 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69 6c      }.      whil
1e840 65 28 20 28 63 32 20 3d 20 28 2a 28 7a 2b 2b 29  e( (c2 = (*(z++)
1e850 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
1e860 20 77 68 69 6c 65 28 20 63 32 21 3d 63 20 29 7b   while( c2!=c ){
1e870 0a 20 20 20 20 20 20 20 20 20 20 63 32 20 3d 20  .          c2 = 
1e880 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20  *(z++);.        
1e890 20 20 69 66 28 20 63 32 3d 3d 30 20 29 20 72 65    if( c2==0 ) re
1e8a0 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
1e8b0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 74 65  }.        if( te
1e8c0 73 74 63 61 73 65 5f 67 6c 6f 62 28 7a 47 6c 6f  stcase_glob(zGlo
1e8d0 62 2c 7a 29 20 29 20 72 65 74 75 72 6e 20 31 3b  b,z) ) return 1;
1e8e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1e8f0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c  eturn 0;.    }el
1e900 73 65 20 69 66 28 20 63 3d 3d 27 3f 27 20 29 7b  se if( c=='?' ){
1e910 0a 20 20 20 20 20 20 69 66 28 20 28 2a 28 7a 2b  .      if( (*(z+
1e920 2b 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  +))==0 ) return 
1e930 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
1e940 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20   c=='[' ){.     
1e950 20 69 6e 74 20 70 72 69 6f 72 5f 63 20 3d 20 30   int prior_c = 0
1e960 3b 0a 20 20 20 20 20 20 73 65 65 6e 20 3d 20 30  ;.      seen = 0
1e970 3b 0a 20 20 20 20 20 20 69 6e 76 65 72 74 20 3d  ;.      invert =
1e980 20 30 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a 28   0;.      c = *(
1e990 7a 2b 2b 29 3b 0a 20 20 20 20 20 20 69 66 28 20  z++);.      if( 
1e9a0 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  c==0 ) return 0;
1e9b0 0a 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47  .      c2 = *(zG
1e9c0 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 69 66  lob++);.      if
1e9d0 28 20 63 32 3d 3d 27 5e 27 20 29 7b 0a 20 20 20  ( c2=='^' ){.   
1e9e0 20 20 20 20 20 69 6e 76 65 72 74 20 3d 20 31 3b       invert = 1;
1e9f0 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a 28  .        c2 = *(
1ea00 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20  zGlob++);.      
1ea10 7d 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d 3d  }.      if( c2==
1ea20 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ']' ){.        i
1ea30 66 28 20 63 3d 3d 27 5d 27 20 29 20 73 65 65 6e  f( c==']' ) seen
1ea40 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 32   = 1;.        c2
1ea50 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20   = *(zGlob++);. 
1ea60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69       }.      whi
1ea70 6c 65 28 20 63 32 20 26 26 20 63 32 21 3d 27 5d  le( c2 && c2!=']
1ea80 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ' ){.        if(
1ea90 20 63 32 3d 3d 27 2d 27 20 26 26 20 7a 47 6c 6f   c2=='-' && zGlo
1eaa0 62 5b 30 5d 21 3d 27 5d 27 20 26 26 20 7a 47 6c  b[0]!=']' && zGl
1eab0 6f 62 5b 30 5d 21 3d 30 20 26 26 20 70 72 69 6f  ob[0]!=0 && prio
1eac0 72 5f 63 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  r_c>0 ){.       
1ead0 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b     c2 = *(zGlob+
1eae0 2b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +);.          if
1eaf0 28 20 63 3e 3d 70 72 69 6f 72 5f 63 20 26 26 20  ( c>=prior_c && 
1eb00 63 3c 3d 63 32 20 29 20 73 65 65 6e 20 3d 20 31  c<=c2 ) seen = 1
1eb10 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6f  ;.          prio
1eb20 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  r_c = 0;.       
1eb30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1eb40 20 20 69 66 28 20 63 3d 3d 63 32 20 29 7b 0a 20    if( c==c2 ){. 
1eb50 20 20 20 20 20 20 20 20 20 20 20 73 65 65 6e 20             seen 
1eb60 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
1eb70 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6f 72  .          prior
1eb80 5f 63 20 3d 20 63 32 3b 0a 20 20 20 20 20 20 20  _c = c2;.       
1eb90 20 7d 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20   }.        c2 = 
1eba0 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20  *(zGlob++);.    
1ebb0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 32    }.      if( c2
1ebc0 3d 3d 30 20 7c 7c 20 28 73 65 65 6e 20 5e 20 69  ==0 || (seen ^ i
1ebd0 6e 76 65 72 74 29 3d 3d 30 20 29 20 72 65 74 75  nvert)==0 ) retu
1ebe0 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20  rn 0;.    }else 
1ebf0 69 66 28 20 63 3d 3d 27 23 27 20 29 7b 0a 20 20  if( c=='#' ){.  
1ec00 20 20 20 20 69 66 28 20 28 7a 5b 30 5d 3d 3d 27      if( (z[0]=='
1ec10 2d 27 20 7c 7c 20 7a 5b 30 5d 3d 3d 27 2b 27 29  -' || z[0]=='+')
1ec20 20 26 26 20 49 73 44 69 67 69 74 28 7a 5b 31 5d   && IsDigit(z[1]
1ec30 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69  ) ) z++;.      i
1ec40 66 28 20 21 49 73 44 69 67 69 74 28 7a 5b 30 5d  f( !IsDigit(z[0]
1ec50 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
1ec60 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 77      z++;.      w
1ec70 68 69 6c 65 28 20 49 73 44 69 67 69 74 28 7a 5b  hile( IsDigit(z[
1ec80 30 5d 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20  0]) ){ z++; }.  
1ec90 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 69    }else{.      i
1eca0 66 28 20 63 21 3d 28 2a 28 7a 2b 2b 29 29 20 29  f( c!=(*(z++)) )
1ecb0 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
1ecc0 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 49 73  .  }.  while( Is
1ecd0 53 70 61 63 65 28 2a 7a 29 20 29 7b 20 7a 2b 2b  Space(*z) ){ z++
1ece0 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a 3d  ; }.  return *z=
1ecf0 3d 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43 6f  =0;.}.../*.** Co
1ed00 6d 70 61 72 65 20 74 68 65 20 73 74 72 69 6e 67  mpare the string
1ed10 20 61 73 20 61 20 63 6f 6d 6d 61 6e 64 2d 6c 69   as a command-li
1ed20 6e 65 20 6f 70 74 69 6f 6e 20 77 69 74 68 20 65  ne option with e
1ed30 69 74 68 65 72 20 6f 6e 65 20 6f 72 20 74 77 6f  ither one or two
1ed40 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 22 2d 22 20  .** initial "-" 
1ed50 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73  characters..*/.s
1ed60 74 61 74 69 63 20 69 6e 74 20 6f 70 74 69 6f 6e  tatic int option
1ed70 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61 72  Match(const char
1ed80 20 2a 7a 53 74 72 2c 20 63 6f 6e 73 74 20 63 68   *zStr, const ch
1ed90 61 72 20 2a 7a 4f 70 74 29 7b 0a 20 20 69 66 28  ar *zOpt){.  if(
1eda0 20 7a 53 74 72 5b 30 5d 21 3d 27 2d 27 20 29 20   zStr[0]!='-' ) 
1edb0 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 53 74 72  return 0;.  zStr
1edc0 2b 2b 3b 0a 20 20 69 66 28 20 7a 53 74 72 5b 30  ++;.  if( zStr[0
1edd0 5d 3d 3d 27 2d 27 20 29 20 7a 53 74 72 2b 2b 3b  ]=='-' ) zStr++;
1ede0 0a 20 20 72 65 74 75 72 6e 20 73 74 72 63 6d 70  .  return strcmp
1edf0 28 7a 53 74 72 2c 20 7a 4f 70 74 29 3d 3d 30 3b  (zStr, zOpt)==0;
1ee00 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65  .}../*.** Delete
1ee10 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74 20   a file..*/.int 
1ee20 73 68 65 6c 6c 44 65 6c 65 74 65 46 69 6c 65 28  shellDeleteFile(
1ee30 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
1ee40 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 72 63  ename){.  int rc
1ee50 3b 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32 0a  ;.#ifdef _WIN32.
1ee60 20 20 77 63 68 61 72 5f 74 20 2a 7a 20 3d 20 73    wchar_t *z = s
1ee70 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66  qlite3_win32_utf
1ee80 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 7a 46 69  8_to_unicode(zFi
1ee90 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 63 20 3d 20  lename);.  rc = 
1eea0 5f 77 75 6e 6c 69 6e 6b 28 7a 29 3b 0a 20 20 73  _wunlink(z);.  s
1eeb0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
1eec0 23 65 6c 73 65 0a 20 20 72 63 20 3d 20 75 6e 6c  #else.  rc = unl
1eed0 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b 0a  ink(zFilename);.
1eee0 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20  #endif.  return 
1eef0 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  rc;.}.../*.** Th
1ef00 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e  e implementation
1ef10 20 6f 66 20 53 51 4c 20 73 63 61 6c 61 72 20 66   of SQL scalar f
1ef20 75 6e 63 74 69 6f 6e 20 66 6b 65 79 5f 63 6f 6c  unction fkey_col
1ef30 6c 61 74 65 5f 63 6c 61 75 73 65 28 29 2c 20 75  late_clause(), u
1ef40 73 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 22 2e  sed.** by the ".
1ef50 6c 69 6e 74 20 66 6b 65 79 2d 69 6e 64 65 78 65  lint fkey-indexe
1ef60 73 22 20 63 6f 6d 6d 61 6e 64 2e 20 54 68 69 73  s" command. This
1ef70 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f 6e   scalar function
1ef80 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 63 61   is always.** ca
1ef90 6c 6c 65 64 20 77 69 74 68 20 66 6f 75 72 20 61  lled with four a
1efa0 72 67 75 6d 65 6e 74 73 20 2d 20 74 68 65 20 70  rguments - the p
1efb0 61 72 65 6e 74 20 74 61 62 6c 65 20 6e 61 6d 65  arent table name
1efc0 2c 20 74 68 65 20 70 61 72 65 6e 74 20 63 6f 6c  , the parent col
1efd0 75 6d 6e 20 6e 61 6d 65 2c 0a 2a 2a 20 74 68 65  umn name,.** the
1efe0 20 63 68 69 6c 64 20 74 61 62 6c 65 20 6e 61 6d   child table nam
1eff0 65 20 61 6e 64 20 74 68 65 20 63 68 69 6c 64 20  e and the child 
1f000 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2a 0a  column name..**.
1f010 2a 2a 20 20 20 66 6b 65 79 5f 63 6f 6c 6c 61 74  **   fkey_collat
1f020 65 5f 63 6c 61 75 73 65 28 27 70 61 72 65 6e 74  e_clause('parent
1f030 2d 74 61 62 27 2c 20 27 70 61 72 65 6e 74 2d 63  -tab', 'parent-c
1f040 6f 6c 27 2c 20 27 63 68 69 6c 64 2d 74 61 62 27  ol', 'child-tab'
1f050 2c 20 27 63 68 69 6c 64 2d 63 6f 6c 27 29 0a 2a  , 'child-col').*
1f060 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20 6f  *.** If either o
1f070 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62 6c  f the named tabl
1f080 65 73 20 6f 72 20 63 6f 6c 75 6d 6e 73 20 64 6f  es or columns do
1f090 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 69 73   not exist, this
1f0a0 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65 74   function.** ret
1f0b0 75 72 6e 73 20 61 6e 20 65 6d 70 74 79 20 73 74  urns an empty st
1f0c0 72 69 6e 67 2e 20 41 6e 20 65 6d 70 74 79 20 73  ring. An empty s
1f0d0 74 72 69 6e 67 20 69 73 20 61 6c 73 6f 20 72 65  tring is also re
1f0e0 74 75 72 6e 65 64 20 69 66 20 62 6f 74 68 20 74  turned if both t
1f0f0 61 62 6c 65 73 0a 2a 2a 20 61 6e 64 20 63 6f 6c  ables.** and col
1f100 75 6d 6e 73 20 65 78 69 73 74 20 62 75 74 20 68  umns exist but h
1f110 61 76 65 20 74 68 65 20 73 61 6d 65 20 64 65 66  ave the same def
1f120 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 73  ault collation s
1f130 65 71 75 65 6e 63 65 2e 20 4f 72 2c 0a 2a 2a 20  equence. Or,.** 
1f140 69 66 20 62 6f 74 68 20 65 78 69 73 74 20 62 75  if both exist bu
1f150 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  t the default co
1f160 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
1f170 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74 2c  s are different,
1f180 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69 6f   this.** functio
1f190 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73 74  n returns the st
1f1a0 72 69 6e 67 20 22 20 43 4f 4c 4c 41 54 45 20 3c  ring " COLLATE <
1f1b0 70 61 72 65 6e 74 2d 63 6f 6c 6c 61 74 69 6f 6e  parent-collation
1f1c0 3e 22 2c 20 77 68 65 72 65 0a 2a 2a 20 3c 70 61  >", where.** <pa
1f1d0 72 65 6e 74 2d 63 6f 6c 6c 61 74 69 6f 6e 3e 20  rent-collation> 
1f1e0 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 63  is the default c
1f1f0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1f200 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74 20  e of the parent 
1f210 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74 69  column..*/.stati
1f220 63 20 76 6f 69 64 20 73 68 65 6c 6c 46 6b 65 79  c void shellFkey
1f230 43 6f 6c 6c 61 74 65 43 6c 61 75 73 65 28 0a 20  CollateClause(. 
1f240 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
1f250 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 56   *pCtx,.  int nV
1f260 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61  al,.  sqlite3_va
1f270 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20  lue **apVal.){. 
1f280 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73   sqlite3 *db = s
1f290 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64  qlite3_context_d
1f2a0 62 5f 68 61 6e 64 6c 65 28 70 43 74 78 29 3b 0a  b_handle(pCtx);.
1f2b0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
1f2c0 61 72 65 6e 74 3b 0a 20 20 63 6f 6e 73 74 20 63  arent;.  const c
1f2d0 68 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6c 3b  har *zParentCol;
1f2e0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1f2f0 50 61 72 65 6e 74 53 65 71 3b 0a 20 20 63 6f 6e  ParentSeq;.  con
1f300 73 74 20 63 68 61 72 20 2a 7a 43 68 69 6c 64 3b  st char *zChild;
1f310 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1f320 43 68 69 6c 64 43 6f 6c 3b 0a 20 20 63 6f 6e 73  ChildCol;.  cons
1f330 74 20 63 68 61 72 20 2a 7a 43 68 69 6c 64 53 65  t char *zChildSe
1f340 71 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 69 74 69  q = 0;  /* Initi
1f350 61 6c 69 7a 65 20 74 6f 20 61 76 6f 69 64 20 66  alize to avoid f
1f360 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77 61  alse-positive wa
1f370 72 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 72  rning */.  int r
1f380 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e 56  c;..  assert( nV
1f390 61 6c 3d 3d 34 20 29 3b 0a 20 20 7a 50 61 72 65  al==4 );.  zPare
1f3a0 6e 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  nt = (const char
1f3b0 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
1f3c0 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a  text(apVal[0]);.
1f3d0 20 20 7a 50 61 72 65 6e 74 43 6f 6c 20 3d 20 28    zParentCol = (
1f3e0 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
1f3f0 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
1f400 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 7a 43 68 69  pVal[1]);.  zChi
1f410 6c 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ld = (const char
1f420 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
1f430 74 65 78 74 28 61 70 56 61 6c 5b 32 5d 29 3b 0a  text(apVal[2]);.
1f440 20 20 7a 43 68 69 6c 64 43 6f 6c 20 3d 20 28 63    zChildCol = (c
1f450 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
1f460 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70  e3_value_text(ap
1f470 56 61 6c 5b 33 5d 29 3b 0a 0a 20 20 73 71 6c 69  Val[3]);..  sqli
1f480 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74 28  te3_result_text(
1f490 70 43 74 78 2c 20 22 22 2c 20 2d 31 2c 20 53 51  pCtx, "", -1, SQ
1f4a0 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
1f4b0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61 62  rc = sqlite3_tab
1f4c0 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61  le_column_metada
1f4d0 74 61 28 0a 20 20 20 20 20 20 64 62 2c 20 22 6d  ta(.      db, "m
1f4e0 61 69 6e 22 2c 20 7a 50 61 72 65 6e 74 2c 20 7a  ain", zParent, z
1f4f0 50 61 72 65 6e 74 43 6f 6c 2c 20 30 2c 20 26 7a  ParentCol, 0, &z
1f500 50 61 72 65 6e 74 53 65 71 2c 20 30 2c 20 30 2c  ParentSeq, 0, 0,
1f510 20 30 0a 20 20 29 3b 0a 20 20 69 66 28 20 72 63   0.  );.  if( rc
1f520 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
1f530 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
1f540 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
1f550 61 64 61 74 61 28 0a 20 20 20 20 20 20 20 20 64  adata(.        d
1f560 62 2c 20 22 6d 61 69 6e 22 2c 20 7a 43 68 69 6c  b, "main", zChil
1f570 64 2c 20 7a 43 68 69 6c 64 43 6f 6c 2c 20 30 2c  d, zChildCol, 0,
1f580 20 26 7a 43 68 69 6c 64 53 65 71 2c 20 30 2c 20   &zChildSeq, 0, 
1f590 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d 0a  0, 0.    );.  }.
1f5a0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1f5b0 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65 33 5f  E_OK && sqlite3_
1f5c0 73 74 72 69 63 6d 70 28 7a 50 61 72 65 6e 74 53  stricmp(zParentS
1f5d0 65 71 2c 20 7a 43 68 69 6c 64 53 65 71 29 20 29  eq, zChildSeq) )
1f5e0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20  {.    char *z = 
1f5f0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1f600 22 20 43 4f 4c 4c 41 54 45 20 25 73 22 2c 20 7a  " COLLATE %s", z
1f610 50 61 72 65 6e 74 53 65 71 29 3b 0a 20 20 20 20  ParentSeq);.    
1f620 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74  sqlite3_result_t
1f630 65 78 74 28 70 43 74 78 2c 20 7a 2c 20 2d 31 2c  ext(pCtx, z, -1,
1f640 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
1f650 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  T);.    sqlite3_
1f660 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 7d 0a 0a  free(z);.  }.}..
1f670 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c 65  ./*.** The imple
1f680 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 64 6f 74  mentation of dot
1f690 2d 63 6f 6d 6d 61 6e 64 20 22 2e 6c 69 6e 74 20  -command ".lint 
1f6a0 66 6b 65 79 2d 69 6e 64 65 78 65 73 22 2e 0a 2a  fkey-indexes"..*
1f6b0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 69 6e  /.static int lin
1f6c0 74 46 6b 65 79 49 6e 64 65 78 65 73 28 0a 20 20  tFkeyIndexes(.  
1f6d0 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61  ShellState *pSta
1f6e0 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
1f6f0 2f 2a 20 43 75 72 72 65 6e 74 20 73 68 65 6c 6c  /* Current shell
1f700 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20   tool state */. 
1f710 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20   char **azArg,  
1f720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f730 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67   /* Array of arg
1f740 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f  uments passed to
1f750 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a   dot command */.
1f760 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20    int nArg      
1f770 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f780 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
1f790 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b  ntries in azArg[
1f7a0 5d 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65  ] */.){.  sqlite
1f7b0 33 20 2a 64 62 20 3d 20 70 53 74 61 74 65 2d 3e  3 *db = pState->
1f7c0 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74  db;       /* Dat
1f7d0 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 6f 20  abase handle to 
1f7e0 71 75 65 72 79 20 22 6d 61 69 6e 22 20 64 62 20  query "main" db 
1f7f0 6f 66 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 6f 75  of */.  FILE *ou
1f800 74 20 3d 20 70 53 74 61 74 65 2d 3e 6f 75 74 3b  t = pState->out;
1f810 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 65 61          /* Strea
1f820 6d 20 74 6f 20 77 72 69 74 65 20 6e 6f 6e 2d 65  m to write non-e
1f830 72 72 6f 72 20 6f 75 74 70 75 74 20 74 6f 20 2a  rror output to *
1f840 2f 0a 20 20 69 6e 74 20 62 56 65 72 62 6f 73 65  /.  int bVerbose
1f850 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1f860 20 20 20 20 2f 2a 20 49 66 20 2d 76 65 72 62 6f      /* If -verbo
1f870 73 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a 2f  se is present */
1f880 0a 20 20 69 6e 74 20 62 47 72 6f 75 70 42 79 50  .  int bGroupByP
1f890 61 72 65 6e 74 20 3d 20 30 3b 20 20 20 20 20 20  arent = 0;      
1f8a0 20 20 20 2f 2a 20 49 66 20 2d 67 72 6f 75 70 62     /* If -groupb
1f8b0 79 70 61 72 65 6e 74 20 69 73 20 70 72 65 73 65  yparent is prese
1f8c0 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20  nt */.  int i;  
1f8d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f8e0 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 69 74          /* To it
1f8f0 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61 7a  erate through az
1f900 41 72 67 5b 5d 20 2a 2f 0a 20 20 63 6f 6e 73 74  Arg[] */.  const
1f910 20 63 68 61 72 20 2a 7a 49 6e 64 65 6e 74 20 3d   char *zIndent =
1f920 20 22 22 3b 20 20 20 20 20 20 20 2f 2a 20 48 6f   "";       /* Ho
1f930 77 20 6d 75 63 68 20 74 6f 20 69 6e 64 65 6e 74  w much to indent
1f940 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 62 79   CREATE INDEX by
1f950 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20   */.  int rc;   
1f960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1f970 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
1f980 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65  code */.  sqlite
1f990 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30  3_stmt *pSql = 0
1f9a0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d  ;         /* Com
1f9b0 70 69 6c 65 64 20 76 65 72 73 69 6f 6e 20 6f 66  piled version of
1f9c0 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 62   SQL statement b
1f9d0 65 6c 6f 77 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20  elow */..  /*.  
1f9e0 2a 2a 20 54 68 69 73 20 53 45 4c 45 43 54 20 73  ** This SELECT s
1f9f0 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73  tatement returns
1fa00 20 6f 6e 65 20 72 6f 77 20 66 6f 72 20 65 61 63   one row for eac
1fa10 68 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  h foreign key co
1fa20 6e 73 74 72 61 69 6e 74 0a 20 20 2a 2a 20 69 6e  nstraint.  ** in
1fa30 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66 20 74   the schema of t
1fa40 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73 65  he main database
1fa50 2e 20 54 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  . The column val
1fa60 75 65 73 20 61 72 65 3a 0a 20 20 2a 2a 0a 20 20  ues are:.  **.  
1fa70 2a 2a 20 30 2e 20 54 68 65 20 74 65 78 74 20 6f  ** 0. The text o
1fa80 66 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d 65  f an SQL stateme
1fa90 6e 74 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a 20  nt similar to:. 
1faa0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 22 45   **.  **      "E
1fab0 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
1fac0 4e 20 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20  N SELECT 1 FROM 
1fad0 63 68 69 6c 64 5f 74 61 62 6c 65 20 57 48 45 52  child_table WHER
1fae0 45 20 63 68 69 6c 64 5f 6b 65 79 3d 3f 22 0a 20  E child_key=?". 
1faf0 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 54 68 69 73   **.  **    This
1fb00 20 53 45 4c 45 43 54 20 69 73 20 73 69 6d 69 6c   SELECT is simil
1fb10 61 72 20 74 6f 20 74 68 65 20 6f 6e 65 20 74 68  ar to the one th
1fb20 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e 20 6b  at the foreign k
1fb30 65 79 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  eys implementati
1fb40 6f 6e 0a 20 20 2a 2a 20 20 20 20 6e 65 65 64 73  on.  **    needs
1fb50 20 74 6f 20 72 75 6e 20 69 6e 74 65 72 6e 61 6c   to run internal
1fb60 6c 79 20 6f 6e 20 63 68 69 6c 64 20 74 61 62 6c  ly on child tabl
1fb70 65 73 2e 20 49 66 20 74 68 65 72 65 20 69 73 20  es. If there is 
1fb80 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 61  an index that ca
1fb90 6e 0a 20 20 2a 2a 20 20 20 20 62 65 20 75 73 65  n.  **    be use
1fba0 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74 68  d to optimize th
1fbb0 69 73 20 71 75 65 72 79 2c 20 74 68 65 6e 20 69  is query, then i
1fbc0 74 20 63 61 6e 20 61 6c 73 6f 20 62 65 20 75 73  t can also be us
1fbd0 65 64 20 62 79 20 74 68 65 20 46 4b 0a 20 20 2a  ed by the FK.  *
1fbe0 2a 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74 61 74  *    implementat
1fbf0 69 6f 6e 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20  ion to optimize 
1fc00 44 45 4c 45 54 45 20 6f 72 20 55 50 44 41 54 45  DELETE or UPDATE
1fc10 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 20 74   statements on t
1fc20 68 65 20 70 61 72 65 6e 74 0a 20 20 2a 2a 20 20  he parent.  **  
1fc30 20 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20 20    table..  **.  
1fc40 2a 2a 20 31 2e 20 41 20 47 4c 4f 42 20 70 61 74  ** 1. A GLOB pat
1fc50 74 65 72 6e 20 73 75 69 74 61 62 6c 65 20 66 6f  tern suitable fo
1fc60 72 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  r sqlite3_strglo
1fc70 62 28 29 2e 20 49 66 20 74 68 65 20 70 6c 61 6e  b(). If the plan
1fc80 20 6f 75 74 70 75 74 20 62 79 0a 20 20 2a 2a 20   output by.  ** 
1fc90 20 20 20 74 68 65 20 45 58 50 4c 41 49 4e 20 51     the EXPLAIN Q
1fca0 55 45 52 59 20 50 4c 41 4e 20 63 6f 6d 6d 61 6e  UERY PLAN comman
1fcb0 64 20 6d 61 74 63 68 65 73 20 74 68 69 73 20 70  d matches this p
1fcc0 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 74 68 65  attern, then the
1fcd0 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 20 20 20   schema.  **    
1fce0 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 64 65  contains an inde
1fcf0 78 20 74 68 61 74 20 63 61 6e 20 62 65 20 75 73  x that can be us
1fd00 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74  ed to optimize t
1fd10 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2a 0a 20  he query..  **. 
1fd20 20 2a 2a 20 32 2e 20 48 75 6d 61 6e 20 72 65 61   ** 2. Human rea
1fd30 64 61 62 6c 65 20 74 65 78 74 20 74 68 61 74 20  dable text that 
1fd40 64 65 73 63 72 69 62 65 73 20 74 68 65 20 63 68  describes the ch
1fd50 69 6c 64 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  ild table and co
1fd60 6c 75 6d 6e 73 2e 20 65 2e 67 2e 0a 20 20 2a 2a  lumns. e.g..  **
1fd70 0a 20 20 2a 2a 20 20 20 20 20 20 20 22 63 68 69  .  **       "chi
1fd80 6c 64 5f 74 61 62 6c 65 28 63 68 69 6c 64 5f 6b  ld_table(child_k
1fd90 65 79 31 2c 20 63 68 69 6c 64 5f 6b 65 79 32 29  ey1, child_key2)
1fda0 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 33 2e 20 48  ".  **.  ** 3. H
1fdb0 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 74 65  uman readable te
1fdc0 78 74 20 74 68 61 74 20 64 65 73 63 72 69 62 65  xt that describe
1fdd0 73 20 74 68 65 20 70 61 72 65 6e 74 20 74 61 62  s the parent tab
1fde0 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 2e 20  le and columns. 
1fdf0 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  e.g..  **.  **  
1fe00 20 20 20 20 20 22 70 61 72 65 6e 74 5f 74 61 62       "parent_tab
1fe10 6c 65 28 70 61 72 65 6e 74 5f 6b 65 79 31 2c 20  le(parent_key1, 
1fe20 70 61 72 65 6e 74 5f 6b 65 79 32 29 22 0a 20 20  parent_key2)".  
1fe30 2a 2a 0a 20 20 2a 2a 20 34 2e 20 41 20 66 75 6c  **.  ** 4. A ful
1fe40 6c 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 73  l CREATE INDEX s
1fe50 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 61 6e 20  tatement for an 
1fe60 69 6e 64 65 78 20 74 68 61 74 20 63 6f 75 6c 64  index that could
1fe70 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20 2a 2a   be used to.  **
1fe80 20 20 20 20 6f 70 74 69 6d 69 7a 65 20 44 45 4c      optimize DEL
1fe90 45 54 45 20 6f 72 20 55 50 44 41 54 45 20 73 74  ETE or UPDATE st
1fea0 61 74 65 6d 65 6e 74 73 20 6f 6e 20 74 68 65 20  atements on the 
1feb0 70 61 72 65 6e 74 20 74 61 62 6c 65 2e 20 65 2e  parent table. e.
1fec0 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20  g..  **.  **    
1fed0 20 20 20 22 43 52 45 41 54 45 20 49 4e 44 45 58     "CREATE INDEX
1fee0 20 63 68 69 6c 64 5f 74 61 62 6c 65 5f 63 68 69   child_table_chi
1fef0 6c 64 5f 6b 65 79 20 4f 4e 20 63 68 69 6c 64 5f  ld_key ON child_
1ff00 74 61 62 6c 65 28 63 68 69 6c 64 5f 6b 65 79 29  table(child_key)
1ff10 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 35 2e 20 54  ".  **.  ** 5. T
1ff20 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 70  he name of the p
1ff30 61 72 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20 2a  arent table..  *
1ff40 2a 0a 20 20 2a 2a 20 54 68 65 73 65 20 73 69 78  *.  ** These six
1ff50 20 76 61 6c 75 65 73 20 61 72 65 20 75 73 65 64   values are used
1ff60 20 62 79 20 74 68 65 20 43 20 6c 6f 67 69 63 20   by the C logic 
1ff70 62 65 6c 6f 77 20 74 6f 20 67 65 6e 65 72 61 74  below to generat
1ff80 65 20 74 68 65 20 72 65 70 6f 72 74 2e 0a 20 20  e the report..  
1ff90 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
1ffa0 2a 7a 53 71 6c 20 3d 0a 20 20 22 53 45 4c 45 43  *zSql =.  "SELEC
1ffb0 54 20 22 0a 20 20 20 20 22 20 20 20 20 20 27 45  T ".    "     'E
1ffc0 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
1ffd0 4e 20 53 45 4c 45 43 54 20 31 20 46 52 4f 4d 20  N SELECT 1 FROM 
1ffe0 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61 6d  ' || quote(s.nam
1fff0 65 29 20 7c 7c 20 27 20 57 48 45 52 45 20 27 22  e) || ' WHERE '"
20000 0a 20 20 20 20 22 20 20 7c 7c 20 67 72 6f 75 70  .    "  || group
20010 5f 63 6f 6e 63 61 74 28 71 75 6f 74 65 28 73 2e  _concat(quote(s.
20020 6e 61 6d 65 29 20 7c 7c 20 27 2e 27 20 7c 7c 20  name) || '.' || 
20030 71 75 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d 29 20  quote(f.[from]) 
20040 7c 7c 20 27 3d 3f 27 20 22 0a 20 20 20 20 22 20  || '=?' ".    " 
20050 20 7c 7c 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65   || fkey_collate
20060 5f 63 6c 61 75 73 65 28 22 0a 20 20 20 20 22 20  _clause(".    " 
20070 20 20 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d 2c        f.[table],
20080 20 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f 5d   COALESCE(f.[to]
20090 2c 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73 2e 6e  , p.[name]), s.n
200a0 61 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29 2c 27  ame, f.[from]),'
200b0 20 41 4e 44 20 27 29 22 0a 20 20 20 20 22 2c 20   AND ')".    ", 
200c0 22 0a 20 20 20 20 22 20 20 20 20 20 27 53 45 41  ".    "     'SEA
200d0 52 43 48 20 54 41 42 4c 45 20 27 20 7c 7c 20 73  RCH TABLE ' || s
200e0 2e 6e 61 6d 65 20 7c 7c 20 27 20 55 53 49 4e 47  .name || ' USING
200f0 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58 2a   COVERING INDEX*
20100 28 27 22 0a 20 20 20 20 22 20 20 7c 7c 20 67 72  ('".    "  || gr
20110 6f 75 70 5f 63 6f 6e 63 61 74 28 27 2a 3d 3f 27  oup_concat('*=?'
20120 2c 20 27 20 41 4e 44 20 27 29 20 7c 7c 20 27 29  , ' AND ') || ')
20130 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20 20  '".    ", ".    
20140 22 20 20 20 20 20 73 2e 6e 61 6d 65 20 20 7c 7c  "     s.name  ||
20150 20 27 28 27 20 7c 7c 20 67 72 6f 75 70 5f 63 6f   '(' || group_co
20160 6e 63 61 74 28 66 2e 5b 66 72 6f 6d 5d 2c 20 20  ncat(f.[from],  
20170 27 2c 20 27 29 20 7c 7c 20 27 29 27 22 0a 20 20  ', ') || ')'".  
20180 20 20 22 2c 20 22 0a 20 20 20 20 22 20 20 20 20    ", ".    "    
20190 20 66 2e 5b 74 61 62 6c 65 5d 20 7c 7c 20 27 28   f.[table] || '(
201a0 27 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61  ' || group_conca
201b0 74 28 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f  t(COALESCE(f.[to
201c0 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 29 20 7c 7c  ], p.[name])) ||
201d0 20 27 29 27 22 0a 20 20 20 20 22 2c 20 22 0a 20   ')'".    ", ". 
201e0 20 20 20 22 20 20 20 20 20 27 43 52 45 41 54 45     "     'CREATE
201f0 20 49 4e 44 45 58 20 27 20 7c 7c 20 71 75 6f 74   INDEX ' || quot
20200 65 28 73 2e 6e 61 6d 65 20 7c 7c 27 5f 27 7c 7c  e(s.name ||'_'||
20210 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 66 2e   group_concat(f.
20220 5b 66 72 6f 6d 5d 2c 20 27 5f 27 29 29 22 0a 20  [from], '_'))". 
20230 20 20 20 22 20 20 7c 7c 20 27 20 4f 4e 20 27 20     "  || ' ON ' 
20240 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61 6d 65 29  || quote(s.name)
20250 20 7c 7c 20 27 28 27 22 0a 20 20 20 20 22 20 20   || '('".    "  
20260 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  || group_concat(
20270 71 75 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d 29 20  quote(f.[from]) 
20280 7c 7c 22 0a 20 20 20 20 22 20 20 20 20 20 20 20  ||".    "       
20290 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c   fkey_collate_cl
202a0 61 75 73 65 28 22 0a 20 20 20 20 22 20 20 20 20  ause(".    "    
202b0 20 20 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d 2c        f.[table],
202c0 20 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f 5d   COALESCE(f.[to]
202d0 2c 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73 2e 6e  , p.[name]), s.n
202e0 61 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29 2c 20  ame, f.[from]), 
202f0 27 2c 20 27 29 22 0a 20 20 20 20 22 20 20 7c 7c  ', ')".    "  ||
20300 20 27 29 3b 27 22 0a 20 20 20 20 22 2c 20 22 0a   ');'".    ", ".
20310 20 20 20 20 22 20 20 20 20 20 66 2e 5b 74 61 62      "     f.[tab
20320 6c 65 5d 20 22 0a 20 20 20 20 22 46 52 4f 4d 20  le] ".    "FROM 
20330 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 41 53  sqlite_master AS
20340 20 73 2c 20 70 72 61 67 6d 61 5f 66 6f 72 65 69   s, pragma_forei
20350 67 6e 5f 6b 65 79 5f 6c 69 73 74 28 73 2e 6e 61  gn_key_list(s.na
20360 6d 65 29 20 41 53 20 66 20 22 0a 20 20 20 20 22  me) AS f ".    "
20370 4c 45 46 54 20 4a 4f 49 4e 20 70 72 61 67 6d 61  LEFT JOIN pragma
20380 5f 74 61 62 6c 65 5f 69 6e 66 6f 20 41 53 20 70  _table_info AS p
20390 20 4f 4e 20 28 70 6b 2d 31 3d 73 65 71 20 41 4e   ON (pk-1=seq AN
203a0 44 20 70 2e 61 72 67 3d 66 2e 5b 74 61 62 6c 65  D p.arg=f.[table
203b0 5d 29 20 22 0a 20 20 20 20 22 47 52 4f 55 50 20  ]) ".    "GROUP 
203c0 42 59 20 73 2e 6e 61 6d 65 2c 20 66 2e 69 64 20  BY s.name, f.id 
203d0 22 0a 20 20 20 20 22 4f 52 44 45 52 20 42 59 20  ".    "ORDER BY 
203e0 28 43 41 53 45 20 57 48 45 4e 20 3f 20 54 48 45  (CASE WHEN ? THE
203f0 4e 20 66 2e 5b 74 61 62 6c 65 5d 20 45 4c 53 45  N f.[table] ELSE
20400 20 73 2e 6e 61 6d 65 20 45 4e 44 29 22 0a 20 20   s.name END)".  
20410 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
20420 7a 47 6c 6f 62 49 50 4b 20 3d 20 22 53 45 41 52  zGlobIPK = "SEAR
20430 43 48 20 54 41 42 4c 45 20 2a 20 55 53 49 4e 47  CH TABLE * USING
20440 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
20450 20 4b 45 59 20 28 72 6f 77 69 64 3d 3f 29 22 3b   KEY (rowid=?)";
20460 0a 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 6e  ..  for(i=2; i<n
20470 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69  Arg; i++){.    i
20480 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28  nt n = strlen30(
20490 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 69  azArg[i]);.    i
204a0 66 28 20 6e 3e 31 20 26 26 20 73 71 6c 69 74 65  f( n>1 && sqlite
204b0 33 5f 73 74 72 6e 69 63 6d 70 28 22 2d 76 65 72  3_strnicmp("-ver
204c0 62 6f 73 65 22 2c 20 61 7a 41 72 67 5b 69 5d 2c  bose", azArg[i],
204d0 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20   n)==0 ){.      
204e0 62 56 65 72 62 6f 73 65 20 3d 20 31 3b 0a 20 20  bVerbose = 1;.  
204f0 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 28    }.    else if(
20500 20 6e 3e 31 20 26 26 20 73 71 6c 69 74 65 33 5f   n>1 && sqlite3_
20510 73 74 72 6e 69 63 6d 70 28 22 2d 67 72 6f 75 70  strnicmp("-group
20520 62 79 70 61 72 65 6e 74 22 2c 20 61 7a 41 72 67  byparent", azArg
20530 5b 69 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  [i], n)==0 ){.  
20540 20 20 20 20 62 47 72 6f 75 70 42 79 50 61 72 65      bGroupByPare
20550 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 7a 49  nt = 1;.      zI
20560 6e 64 65 6e 74 20 3d 20 22 20 20 20 20 22 3b 0a  ndent = "    ";.
20570 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 7b 0a      }.    else{.
20580 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
20590 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
205a0 20 25 73 20 25 73 20 3f 2d 76 65 72 62 6f 73 65   %s %s ?-verbose
205b0 3f 20 3f 2d 67 72 6f 75 70 62 79 70 61 72 65 6e  ? ?-groupbyparen
205c0 74 3f 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  t?\n",.         
205d0 20 61 7a 41 72 67 5b 30 5d 2c 20 61 7a 41 72 67   azArg[0], azArg
205e0 5b 31 5d 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  [1].      );.   
205f0 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
20600 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d 0a 20 20  _ERROR;.    }.  
20610 7d 0a 0a 20 20 2f 2a 20 52 65 67 69 73 74 65 72  }..  /* Register
20620 20 74 68 65 20 66 6b 65 79 5f 63 6f 6c 6c 61 74   the fkey_collat
20630 65 5f 63 6c 61 75 73 65 28 29 20 53 51 4c 20 66  e_clause() SQL f
20640 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 72 63 20  unction */.  rc 
20650 3d 20 73 71 6c 69 74 65 33 5f 63 72 65 61 74 65  = sqlite3_create
20660 5f 66 75 6e 63 74 69 6f 6e 28 64 62 2c 20 22 66  _function(db, "f
20670 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63 6c 61 75  key_collate_clau
20680 73 65 22 2c 20 34 2c 20 53 51 4c 49 54 45 5f 55  se", 4, SQLITE_U
20690 54 46 38 2c 0a 20 20 20 20 20 20 30 2c 20 73 68  TF8,.      0, sh
206a0 65 6c 6c 46 6b 65 79 43 6f 6c 6c 61 74 65 43 6c  ellFkeyCollateCl
206b0 61 75 73 65 2c 20 30 2c 20 30 0a 20 20 29 3b 0a  ause, 0, 0.  );.
206c0 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
206d0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 72 63 20  TE_OK ){.    rc 
206e0 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
206f0 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d  e_v2(db, zSql, -
20700 31 2c 20 26 70 53 71 6c 2c 20 30 29 3b 0a 20 20  1, &pSql, 0);.  
20710 7d 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  }.  if( rc==SQLI
20720 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
20730 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28 70 53  ite3_bind_int(pS
20740 71 6c 2c 20 31 2c 20 62 47 72 6f 75 70 42 79 50  ql, 1, bGroupByP
20750 61 72 65 6e 74 29 3b 0a 20 20 7d 0a 0a 20 20 69  arent);.  }..  i
20760 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
20770 20 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 32 3b   ){.    int rc2;
20780 0a 20 20 20 20 63 68 61 72 20 2a 7a 50 72 65 76  .    char *zPrev
20790 20 3d 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28   = 0;.    while(
207a0 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c   SQLITE_ROW==sql
207b0 69 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29 20  ite3_step(pSql) 
207c0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 72 65 73  ){.      int res
207d0 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 73 71 6c   = -1;.      sql
207e0 69 74 65 33 5f 73 74 6d 74 20 2a 70 45 78 70 6c  ite3_stmt *pExpl
207f0 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  ain = 0;.      c
20800 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 51 50 20  onst char *zEQP 
20810 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
20820 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
20830 78 74 28 70 53 71 6c 2c 20 30 29 3b 0a 20 20 20  xt(pSql, 0);.   
20840 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
20850 47 6c 6f 62 20 3d 20 28 63 6f 6e 73 74 20 63 68  Glob = (const ch
20860 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
20870 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 31 29  mn_text(pSql, 1)
20880 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
20890 61 72 20 2a 7a 46 72 6f 6d 20 3d 20 28 63 6f 6e  ar *zFrom = (con
208a0 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
208b0 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71  _column_text(pSq
208c0 6c 2c 20 32 29 3b 0a 20 20 20 20 20 20 63 6f 6e  l, 2);.      con
208d0 73 74 20 63 68 61 72 20 2a 7a 54 61 72 67 65 74  st char *zTarget
208e0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
208f0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
20900 65 78 74 28 70 53 71 6c 2c 20 33 29 3b 0a 20 20  ext(pSql, 3);.  
20910 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
20920 7a 43 49 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  zCI = (const cha
20930 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
20940 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 34 29 3b  n_text(pSql, 4);
20950 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
20960 72 20 2a 7a 50 61 72 65 6e 74 20 3d 20 28 63 6f  r *zParent = (co
20970 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
20980 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
20990 71 6c 2c 20 35 29 3b 0a 0a 20 20 20 20 20 20 72  ql, 5);..      r
209a0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
209b0 61 72 65 5f 76 32 28 64 62 2c 20 7a 45 51 50 2c  are_v2(db, zEQP,
209c0 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20   -1, &pExplain, 
209d0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  0);.      if( rc
209e0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 62 72  !=SQLITE_OK ) br
209f0 65 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 53  eak;.      if( S
20a00 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
20a10 65 33 5f 73 74 65 70 28 70 45 78 70 6c 61 69 6e  e3_step(pExplain
20a20 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e  ) ){.        con
20a30 73 74 20 63 68 61 72 20 2a 7a 50 6c 61 6e 20 3d  st char *zPlan =
20a40 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
20a50 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
20a60 74 28 70 45 78 70 6c 61 69 6e 2c 20 33 29 3b 0a  t(pExplain, 3);.
20a70 20 20 20 20 20 20 20 20 72 65 73 20 3d 20 28 0a          res = (.
20a80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 30 3d                0=
20a90 3d 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62  =sqlite3_strglob
20aa0 28 7a 47 6c 6f 62 2c 20 7a 50 6c 61 6e 29 0a 20  (zGlob, zPlan). 
20ab0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 30 3d 3d            || 0==
20ac0 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28  sqlite3_strglob(
20ad0 7a 47 6c 6f 62 49 50 4b 2c 20 7a 50 6c 61 6e 29  zGlobIPK, zPlan)
20ae0 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
20af0 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73    }.      rc = s
20b00 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
20b10 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20  pExplain);.     
20b20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
20b30 4f 4b 20 29 20 62 72 65 61 6b 3b 0a 0a 20 20 20  OK ) break;..   
20b40 20 20 20 69 66 28 20 72 65 73 3c 30 20 29 7b 0a     if( res<0 ){.
20b50 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
20b60 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
20b70 72 3a 20 69 6e 74 65 72 6e 61 6c 20 65 72 72 6f  r: internal erro
20b80 72 22 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  r");.        bre
20b90 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ak;.      }else{
20ba0 0a 20 20 20 20 20 20 20 20 69 66 28 20 62 47 72  .        if( bGr
20bb0 6f 75 70 42 79 50 61 72 65 6e 74 0a 20 20 20 20  oupByParent.    
20bc0 20 20 20 20 26 26 20 28 62 56 65 72 62 6f 73 65      && (bVerbose
20bd0 20 7c 7c 20 72 65 73 3d 3d 30 29 0a 20 20 20 20   || res==0).    
20be0 20 20 20 20 26 26 20 28 7a 50 72 65 76 3d 3d 30      && (zPrev==0
20bf0 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 69   || sqlite3_stri
20c00 63 6d 70 28 7a 50 61 72 65 6e 74 2c 20 7a 50 72  cmp(zParent, zPr
20c10 65 76 29 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  ev)).        ){.
20c20 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
20c30 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d 20 50 61  intf(out, "-- Pa
20c40 72 65 6e 74 20 74 61 62 6c 65 20 25 73 5c 6e 22  rent table %s\n"
20c50 2c 20 7a 50 61 72 65 6e 74 29 3b 0a 20 20 20 20  , zParent);.    
20c60 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
20c70 65 65 28 7a 50 72 65 76 29 3b 0a 20 20 20 20 20  ee(zPrev);.     
20c80 20 20 20 20 20 7a 50 72 65 76 20 3d 20 73 71 6c       zPrev = sql
20c90 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
20ca0 22 2c 20 7a 50 61 72 65 6e 74 29 3b 0a 20 20 20  ", zParent);.   
20cb0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
20cc0 69 66 28 20 72 65 73 3d 3d 30 20 29 7b 0a 20 20  if( res==0 ){.  
20cd0 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
20ce0 74 66 28 6f 75 74 2c 20 22 25 73 25 73 20 2d 2d  tf(out, "%s%s --
20cf0 3e 20 25 73 5c 6e 22 2c 20 7a 49 6e 64 65 6e 74  > %s\n", zIndent
20d00 2c 20 7a 43 49 2c 20 7a 54 61 72 67 65 74 29 3b  , zCI, zTarget);
20d10 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69  .        }else i
20d20 66 28 20 62 56 65 72 62 6f 73 65 20 29 7b 0a 20  f( bVerbose ){. 
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 2f 2a 20 6e  ntf(out, "%s/* n
20d50 6f 20 65 78 74 72 61 20 69 6e 64 65 78 65 73 20  o extra indexes 
20d60 72 65 71 75 69 72 65 64 20 66 6f 72 20 25 73 20  required for %s 
20d70 2d 3e 20 25 73 20 2a 2f 5c 6e 22 2c 0a 20 20 20  -> %s */\n",.   
20d80 20 20 20 20 20 20 20 20 20 20 20 7a 49 6e 64 65             zInde
20d90 6e 74 2c 20 7a 46 72 6f 6d 2c 20 7a 54 61 72 67  nt, zFrom, zTarg
20da0 65 74 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a  et.          );.
20db0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
20dc0 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  }.    }.    sqli
20dd0 74 65 33 5f 66 72 65 65 28 7a 50 72 65 76 29 3b  te3_free(zPrev);
20de0 0a 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ..    if( rc!=SQ
20df0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
20e00 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
20e10 72 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69  rr, "%s\n", sqli
20e20 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b  te3_errmsg(db));
20e30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 63 32 20  .    }..    rc2 
20e40 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
20e50 7a 65 28 70 53 71 6c 29 3b 0a 20 20 20 20 69 66  ze(pSql);.    if
20e60 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20e70 26 26 20 72 63 32 21 3d 53 51 4c 49 54 45 5f 4f  && rc2!=SQLITE_O
20e80 4b 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20  K ){.      rc = 
20e90 72 63 32 3b 0a 20 20 20 20 20 20 72 61 77 5f 70  rc2;.      raw_p
20ea0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25  rintf(stderr, "%
20eb0 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  s\n", sqlite3_er
20ec0 72 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 7d  rmsg(db));.    }
20ed0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 61  .  }else{.    ra
20ee0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
20ef0 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33   "%s\n", sqlite3
20f00 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
20f10 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  }..  return rc;.
20f20 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
20f30 6e 74 61 74 69 6f 6e 20 6f 66 20 22 2e 6c 69 6e  ntation of ".lin
20f40 74 22 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a  t" dot command..
20f50 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 69  */.static int li
20f60 6e 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a 20 20  ntDotCommand(.  
20f70 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61  ShellState *pSta
20f80 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  te,             
20f90 2f 2a 20 43 75 72 72 65 6e 74 20 73 68 65 6c 6c  /* Current shell
20fa0 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a 20   tool state */. 
20fb0 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20   char **azArg,  
20fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20fd0 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67   /* Array of arg
20fe0 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f  uments passed to
20ff0 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a   dot command */.
21000 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20 20 20    int nArg      
21010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21020 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
21030 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b  ntries in azArg[
21040 5d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 6e 3b  ] */.){.  int n;
21050 0a 20 20 6e 20 3d 20 28 6e 41 72 67 3e 3d 32 20  .  n = (nArg>=2 
21060 3f 20 73 74 72 6c 65 6e 33 30 28 61 7a 41 72 67  ? strlen30(azArg
21070 5b 31 5d 29 20 3a 20 30 29 3b 0a 20 20 69 66 28  [1]) : 0);.  if(
21080 20 6e 3c 31 20 7c 7c 20 73 71 6c 69 74 65 33 5f   n<1 || sqlite3_
21090 73 74 72 6e 69 63 6d 70 28 61 7a 41 72 67 5b 31  strnicmp(azArg[1
210a0 5d 2c 20 22 66 6b 65 79 2d 69 6e 64 65 78 65 73  ], "fkey-indexes
210b0 22 2c 20 6e 29 20 29 20 67 6f 74 6f 20 75 73 61  ", n) ) goto usa
210c0 67 65 3b 0a 20 20 72 65 74 75 72 6e 20 6c 69 6e  ge;.  return lin
210d0 74 46 6b 65 79 49 6e 64 65 78 65 73 28 70 53 74  tFkeyIndexes(pSt
210e0 61 74 65 2c 20 61 7a 41 72 67 2c 20 6e 41 72 67  ate, azArg, nArg
210f0 29 3b 0a 0a 20 75 73 61 67 65 3a 0a 20 20 72 61  );.. usage:.  ra
21100 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
21110 20 22 55 73 61 67 65 20 25 73 20 73 75 62 2d 63   "Usage %s sub-c
21120 6f 6d 6d 61 6e 64 20 3f 73 77 69 74 63 68 65 73  ommand ?switches
21130 2e 2e 2e 3f 5c 6e 22 2c 20 61 7a 41 72 67 5b 30  ...?\n", azArg[0
21140 5d 29 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66  ]);.  raw_printf
21150 28 73 74 64 65 72 72 2c 20 22 57 68 65 72 65 20  (stderr, "Where 
21160 73 75 62 2d 63 6f 6d 6d 61 6e 64 73 20 61 72 65  sub-commands are
21170 3a 5c 6e 22 29 3b 0a 20 20 72 61 77 5f 70 72 69  :\n");.  raw_pri
21180 6e 74 66 28 73 74 64 65 72 72 2c 20 22 20 20 20  ntf(stderr, "   
21190 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 5c 6e 22   fkey-indexes\n"
211a0 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49  );.  return SQLI
211b0 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 23 69 66  TE_ERROR;.}..#if
211c0 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
211d0 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42  _OMIT_VIRTUALTAB
211e0 4c 45 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  LE) && defined(S
211f0 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 29  QLITE_HAVE_ZLIB)
21200 0a 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ./**************
21210 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21220 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21230 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21240 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
21250 2a 2a 2a 0a 2a 2a 20 54 68 65 20 22 2e 61 72 63  ***.** The ".arc
21260 68 69 76 65 22 20 6f 72 20 22 2e 61 72 22 20 63  hive" or ".ar" c
21270 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69  ommand..*/.stati
21280 63 20 76 6f 69 64 20 73 68 65 6c 6c 50 72 65 70  c void shellPrep
21290 61 72 65 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  are(.  sqlite3 *
212a0 64 62 2c 20 0a 20 20 69 6e 74 20 2a 70 52 63 2c  db, .  int *pRc,
212b0 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
212c0 7a 53 71 6c 2c 20 0a 20 20 73 71 6c 69 74 65 33  zSql, .  sqlite3
212d0 5f 73 74 6d 74 20 2a 2a 70 70 53 74 6d 74 0a 29  _stmt **ppStmt.)
212e0 7b 0a 20 20 2a 70 70 53 74 6d 74 20 3d 20 30 3b  {.  *ppStmt = 0;
212f0 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c  .  if( *pRc==SQL
21300 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e  ITE_OK ){.    in
21310 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70  t rc = sqlite3_p
21320 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53  repare_v2(db, zS
21330 71 6c 2c 20 2d 31 2c 20 70 70 53 74 6d 74 2c 20  ql, -1, ppStmt, 
21340 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
21350 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
21360 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
21370 64 65 72 72 2c 20 22 73 71 6c 20 65 72 72 6f 72  derr, "sql error
21380 3a 20 25 73 20 28 25 64 29 5c 6e 22 2c 20 0a 20  : %s (%d)\n", . 
21390 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
213a0 5f 65 72 72 6d 73 67 28 64 62 29 2c 20 73 71 6c  _errmsg(db), sql
213b0 69 74 65 33 5f 65 72 72 63 6f 64 65 28 64 62 29  ite3_errcode(db)
213c0 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
213d0 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 20 20 7d  *pRc = rc;.    }
213e0 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
213f0 6f 69 64 20 73 68 65 6c 6c 50 72 65 70 61 72 65  oid shellPrepare
21400 50 72 69 6e 74 66 28 0a 20 20 73 71 6c 69 74 65  Printf(.  sqlite
21410 33 20 2a 64 62 2c 20 0a 20 20 69 6e 74 20 2a 70  3 *db, .  int *p
21420 52 63 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73  Rc, .  sqlite3_s
21430 74 6d 74 20 2a 2a 70 70 53 74 6d 74 2c 0a 20 20  tmt **ppStmt,.  
21440 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6d 74  const char *zFmt
21450 2c 20 0a 20 20 2e 2e 2e 0a 29 7b 0a 20 20 2a 70  , .  ....){.  *p
21460 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28  pStmt = 0;.  if(
21470 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b   *pRc==SQLITE_OK
21480 20 29 7b 0a 20 20 20 20 76 61 5f 6c 69 73 74 20   ){.    va_list 
21490 61 70 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b  ap;.    char *z;
214a0 0a 20 20 20 20 76 61 5f 73 74 61 72 74 28 61 70  .    va_start(ap
214b0 2c 20 7a 46 6d 74 29 3b 0a 20 20 20 20 7a 20 3d  , zFmt);.    z =
214c0 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74   sqlite3_vmprint
214d0 66 28 7a 46 6d 74 2c 20 61 70 29 3b 0a 20 20 20  f(zFmt, ap);.   
214e0 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20   if( z==0 ){.   
214f0 20 20 20 2a 70 52 63 20 3d 20 53 51 4c 49 54 45     *pRc = SQLITE
21500 5f 4e 4f 4d 45 4d 3b 0a 20 20 20 20 7d 65 6c 73  _NOMEM;.    }els
21510 65 7b 0a 20 20 20 20 20 20 73 68 65 6c 6c 50 72  e{.      shellPr
21520 65 70 61 72 65 28 64 62 2c 20 70 52 63 2c 20 7a  epare(db, pRc, z
21530 2c 20 70 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  , ppStmt);.     
21540 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
21550 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 73  ;.    }.  }.}..s
21560 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c  tatic void shell
21570 46 69 6e 61 6c 69 7a 65 28 0a 20 20 69 6e 74 20  Finalize(.  int 
21580 2a 70 52 63 2c 20 0a 20 20 73 71 6c 69 74 65 33  *pRc, .  sqlite3
21590 5f 73 74 6d 74 20 2a 70 53 74 6d 74 0a 29 7b 0a  _stmt *pStmt.){.
215a0 20 20 69 66 28 20 70 53 74 6d 74 20 29 7b 0a 20    if( pStmt ){. 
215b0 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d     sqlite3 *db =
215c0 20 73 71 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64   sqlite3_db_hand
215d0 6c 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69  le(pStmt);.    i
215e0 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  nt rc = sqlite3_
215f0 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
21600 0a 20 20 20 20 69 66 28 20 2a 70 52 63 3d 3d 53  .    if( *pRc==S
21610 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
21620 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
21630 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 72  _OK ){.        r
21640 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
21650 2c 20 22 53 51 4c 20 65 72 72 6f 72 3a 20 25 73  , "SQL error: %s
21660 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
21670 6d 73 67 28 64 62 29 29 3b 0a 20 20 20 20 20 20  msg(db));.      
21680 7d 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20 72  }.      *pRc = r
21690 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  c;.    }.  }.}..
216a0 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c  static void shel
216b0 6c 52 65 73 65 74 28 0a 20 20 69 6e 74 20 2a 70  lReset(.  int *p
216c0 52 63 2c 20 0a 20 20 73 71 6c 69 74 65 33 5f 73  Rc, .  sqlite3_s
216d0 74 6d 74 20 2a 70 53 74 6d 74 0a 29 7b 0a 20 20  tmt *pStmt.){.  
216e0 69 6e 74 20 72 63 20 3d 20 73 71 6c 69 74 65 33  int rc = sqlite3
216f0 5f 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20  _reset(pStmt);. 
21700 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54   if( *pRc==SQLIT
21710 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
21720 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
21730 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 20 2a  .      sqlite3 *
21740 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 64 62 5f  db = sqlite3_db_
21750 68 61 6e 64 6c 65 28 70 53 74 6d 74 29 3b 0a 20  handle(pStmt);. 
21760 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
21770 73 74 64 65 72 72 2c 20 22 53 51 4c 20 65 72 72  stderr, "SQL err
21780 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74  or: %s\n", sqlit
21790 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
217a0 20 20 20 20 7d 0a 20 20 20 20 2a 70 52 63 20 3d      }.    *pRc =
217b0 20 72 63 3b 0a 20 20 7d 0a 7d 0a 2f 2a 0a 2a 2a   rc;.  }.}./*.**
217c0 20 53 74 72 75 63 74 75 72 65 20 72 65 70 72 65   Structure repre
217d0 73 65 6e 74 69 6e 67 20 61 20 73 69 6e 67 6c 65  senting a single
217e0 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e 64 2e 0a   ".ar" command..
217f0 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
21800 74 20 41 72 43 6f 6d 6d 61 6e 64 20 41 72 43 6f  t ArCommand ArCo
21810 6d 6d 61 6e 64 3b 0a 73 74 72 75 63 74 20 41 72  mmand;.struct Ar
21820 43 6f 6d 6d 61 6e 64 20 7b 0a 20 20 69 6e 74 20  Command {.  int 
21830 65 43 6d 64 3b 20 20 20 20 20 20 20 20 20 20 20  eCmd;           
21840 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
21850 6e 20 41 52 5f 43 4d 44 5f 2a 20 76 61 6c 75 65  n AR_CMD_* value
21860 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
21870 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 20   *zFile;        
21880 20 20 20 20 20 20 2f 2a 20 2d 2d 66 69 6c 65 20        /* --file 
21890 61 72 67 75 6d 65 6e 74 2c 20 6f 72 20 4e 55 4c  argument, or NUL
218a0 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  L */.  const cha
218b0 72 20 2a 7a 44 69 72 3b 20 20 20 20 20 20 20 20  r *zDir;        
218c0 20 20 20 20 20 20 20 2f 2a 20 2d 2d 64 69 72 65         /* --dire
218d0 63 74 6f 72 79 20 61 72 67 75 6d 65 6e 74 2c 20  ctory argument, 
218e0 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74  or NULL */.  int
218f0 20 62 56 65 72 62 6f 73 65 3b 20 20 20 20 20 20   bVerbose;      
21900 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21910 54 72 75 65 20 69 66 20 2d 2d 76 65 72 62 6f 73  True if --verbos
21920 65 20 2a 2f 0a 20 20 69 6e 74 20 62 5a 69 70 3b  e */.  int bZip;
21930 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21940 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
21950 66 20 2d 2d 7a 69 70 20 2a 2f 0a 20 20 69 6e 74  f --zip */.  int
21960 20 6e 41 72 67 3b 20 20 20 20 20 20 20 20 20 20   nArg;          
21970 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
21980 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6d 6d 61 6e  Number of comman
21990 64 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  d arguments */. 
219a0 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 3b 20 20   char **azArg;  
219b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
219c0 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 63 6f 6d   /* Array of com
219d0 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 2a  mand arguments *
219e0 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e  /.};../*.** Prin
219f0 74 20 61 20 75 73 61 67 65 20 6d 65 73 73 61 67  t a usage messag
21a00 65 20 66 6f 72 20 74 68 65 20 2e 61 72 20 63 6f  e for the .ar co
21a10 6d 6d 61 6e 64 20 74 6f 20 73 74 64 65 72 72 20  mmand to stderr 
21a20 61 6e 64 20 72 65 74 75 72 6e 20 53 51 4c 49 54  and return SQLIT
21a30 45 5f 45 52 52 4f 52 2e 0a 2a 2f 0a 73 74 61 74  E_ERROR..*/.stat
21a40 69 63 20 69 6e 74 20 61 72 55 73 61 67 65 28 46  ic int arUsage(F
21a50 49 4c 45 20 2a 66 29 7b 0a 20 20 72 61 77 5f 70  ILE *f){.  raw_p
21a60 72 69 6e 74 66 28 66 2c 0a 22 5c 6e 22 0a 22 55  rintf(f,."\n"."U
21a70 73 61 67 65 3a 20 2e 61 72 20 5b 4f 50 54 49 4f  sage: .ar [OPTIO
21a80 4e 2e 2e 2e 5d 20 5b 46 49 4c 45 2e 2e 2e 5d 5c  N...] [FILE...]\
21a90 6e 22 0a 22 54 68 65 20 2e 61 72 20 63 6f 6d 6d  n"."The .ar comm
21aa0 61 6e 64 20 6d 61 6e 61 67 65 73 20 73 71 6c 61  and manages sqla
21ab0 72 20 61 72 63 68 69 76 65 73 2e 5c 6e 22 0a 22  r archives.\n"."
21ac0 5c 6e 22 0a 22 45 78 61 6d 70 6c 65 73 3a 5c 6e  \n"."Examples:\n
21ad0 22 0a 22 20 20 2e 61 72 20 2d 63 66 20 61 72 63  "."  .ar -cf arc
21ae0 68 69 76 65 2e 73 61 72 20 66 6f 6f 20 62 61 72  hive.sar foo bar
21af0 20 20 20 20 23 20 43 72 65 61 74 65 20 61 72 63      # Create arc
21b00 68 69 76 65 2e 73 61 72 20 66 72 6f 6d 20 66 69  hive.sar from fi
21b10 6c 65 73 20 66 6f 6f 20 61 6e 64 20 62 61 72 5c  les foo and bar\
21b20 6e 22 0a 22 20 20 2e 61 72 20 2d 74 66 20 61 72  n"."  .ar -tf ar
21b30 63 68 69 76 65 2e 73 61 72 20 20 20 20 20 20 20  chive.sar       
21b40 20 20 20 20 20 23 20 4c 69 73 74 20 6d 65 6d 62       # List memb
21b50 65 72 73 20 6f 66 20 61 72 63 68 69 76 65 2e 73  ers of archive.s
21b60 61 72 5c 6e 22 0a 22 20 20 2e 61 72 20 2d 78 76  ar\n"."  .ar -xv
21b70 66 20 61 72 63 68 69 76 65 2e 73 61 72 20 20 20  f archive.sar   
21b80 20 20 20 20 20 20 20 20 23 20 56 65 72 62 6f 73          # Verbos
21b90 65 6c 79 20 65 78 74 72 61 63 74 20 66 69 6c 65  ely extract file
21ba0 73 20 66 72 6f 6d 20 61 72 63 68 69 76 65 2e 73  s from archive.s
21bb0 61 72 5c 6e 22 0a 22 5c 6e 22 0a 22 45 61 63 68  ar\n"."\n"."Each
21bc0 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 6d 75   command line mu
21bd0 73 74 20 66 65 61 74 75 72 65 20 65 78 61 63 74  st feature exact
21be0 6c 79 20 6f 6e 65 20 63 6f 6d 6d 61 6e 64 20 6f  ly one command o
21bf0 70 74 69 6f 6e 3a 5c 6e 22 0a 22 20 20 2d 63 2c  ption:\n"."  -c,
21c00 20 2d 2d 63 72 65 61 74 65 20 20 20 20 20 20 20   --create       
21c10 20 20 20 20 20 20 20 20 43 72 65 61 74 65 20 61          Create a
21c20 20 6e 65 77 20 61 72 63 68 69 76 65 5c 6e 22 0a   new archive\n".
21c30 22 20 20 2d 75 2c 20 2d 2d 75 70 64 61 74 65 20  "  -u, --update 
21c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55 70                Up
21c50 64 61 74 65 20 6f 72 20 61 64 64 20 66 69 6c 65  date or add file
21c60 73 20 74 6f 20 61 6e 20 65 78 69 73 74 69 6e 67  s to an existing
21c70 20 61 72 63 68 69 76 65 5c 6e 22 0a 22 20 20 2d   archive\n"."  -
21c80 74 2c 20 2d 2d 6c 69 73 74 20 20 20 20 20 20 20  t, --list       
21c90 20 20 20 20 20 20 20 20 20 20 4c 69 73 74 20 63            List c
21ca0 6f 6e 74 65 6e 74 73 20 6f 66 20 61 72 63 68 69  ontents of archi
21cb0 76 65 5c 6e 22 0a 22 20 20 2d 78 2c 20 2d 2d 65  ve\n"."  -x, --e
21cc0 78 74 72 61 63 74 20 20 20 20 20 20 20 20 20 20  xtract          
21cd0 20 20 20 20 45 78 74 72 61 63 74 20 66 69 6c 65      Extract file
21ce0 73 20 66 72 6f 6d 20 61 72 63 68 69 76 65 5c 6e  s from archive\n
21cf0 22 0a 22 5c 6e 22 0a 22 41 6e 64 20 7a 65 72 6f  "."\n"."And zero
21d00 20 6f 72 20 6d 6f 72 65 20 6f 70 74 69 6f 6e 61   or more optiona
21d10 6c 20 6f 70 74 69 6f 6e 73 3a 5c 6e 22 0a 22 20  l options:\n"." 
21d20 20 2d 76 2c 20 2d 2d 76 65 72 62 6f 73 65 20 20   -v, --verbose  
21d30 20 20 20 20 20 20 20 20 20 20 20 20 50 72 69 6e              Prin
21d40 74 20 65 61 63 68 20 66 69 6c 65 6e 61 6d 65 20  t each filename 
21d50 61 73 20 69 74 20 69 73 20 70 72 6f 63 65 73 73  as it is process
21d60 65 64 5c 6e 22 0a 22 20 20 2d 66 20 46 49 4c 45  ed\n"."  -f FILE
21d70 2c 20 2d 2d 66 69 6c 65 20 46 49 4c 45 20 20 20  , --file FILE   
21d80 20 20 20 20 4f 70 65 72 61 74 65 20 6f 6e 20 61      Operate on a
21d90 72 63 68 69 76 65 20 46 49 4c 45 20 28 64 65 66  rchive FILE (def
21da0 61 75 6c 74 20 69 73 20 63 75 72 72 65 6e 74 20  ault is current 
21db0 64 62 29 5c 6e 22 0a 22 20 20 2d 43 20 44 49 52  db)\n"."  -C DIR
21dc0 2c 20 2d 2d 64 69 72 65 63 74 6f 72 79 20 44 49  , --directory DI
21dd0 52 20 20 20 20 43 68 61 6e 67 65 20 74 6f 20 64  R    Change to d
21de0 69 72 65 63 74 6f 72 79 20 44 49 52 20 74 6f 20  irectory DIR to 
21df0 72 65 61 64 2f 65 78 74 72 61 63 74 20 66 69 6c  read/extract fil
21e00 65 73 5c 6e 22 0a 22 5c 6e 22 0a 22 53 65 65 20  es\n"."\n"."See 
21e10 61 6c 73 6f 3a 20 68 74 74 70 3a 2f 2f 73 71 6c  also: http://sql
21e20 69 74 65 2e 6f 72 67 2f 63 6c 69 2e 68 74 6d 6c  ite.org/cli.html
21e30 23 73 71 6c 61 72 5f 61 72 63 68 69 76 65 5f 73  #sqlar_archive_s
21e40 75 70 70 6f 72 74 5c 6e 22 0a 22 5c 6e 22 0a 29  upport\n"."\n".)
21e50 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ;.  return SQLIT
21e60 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a  E_ERROR;.}../*.*
21e70 2a 20 50 72 69 6e 74 20 61 6e 20 65 72 72 6f 72  * Print an error
21e80 20 6d 65 73 73 61 67 65 20 66 6f 72 20 74 68 65   message for the
21e90 20 2e 61 72 20 63 6f 6d 6d 61 6e 64 20 74 6f 20   .ar command to 
21ea0 73 74 64 65 72 72 20 61 6e 64 20 72 65 74 75 72  stderr and retur
21eb0 6e 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52  n .** SQLITE_ERR
21ec0 4f 52 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OR..*/.static in
21ed0 74 20 61 72 45 72 72 6f 72 4d 73 67 28 63 6f 6e  t arErrorMsg(con
21ee0 73 74 20 63 68 61 72 20 2a 7a 46 6d 74 2c 20 2e  st char *zFmt, .
21ef0 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20 61  ..){.  va_list a
21f00 70 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  p;.  char *z;.  
21f10 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d  va_start(ap, zFm
21f20 74 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65  t);.  z = sqlite
21f30 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c  3_vmprintf(zFmt,
21f40 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64 28 61   ap);.  va_end(a
21f50 70 29 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66  p);.  raw_printf
21f60 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
21f70 20 25 73 20 28 74 72 79 20 5c 22 2e 61 72 20 2d   %s (try \".ar -
21f80 2d 68 65 6c 70 5c 22 29 5c 6e 22 2c 20 7a 29 3b  -help\")\n", z);
21f90 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
21fa0 7a 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51 4c  z);.  return SQL
21fb0 49 54 45 5f 45 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a  ITE_ERROR;.}../*
21fc0 0a 2a 2a 20 56 61 6c 75 65 73 20 66 6f 72 20 41  .** Values for A
21fd0 72 43 6f 6d 6d 61 6e 64 2e 65 43 6d 64 2e 0a 2a  rCommand.eCmd..*
21fe0 2f 0a 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44  /.#define AR_CMD
21ff0 5f 43 52 45 41 54 45 20 20 20 20 20 20 20 31 0a  _CREATE       1.
22000 23 64 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 45  #define AR_CMD_E
22010 58 54 52 41 43 54 20 20 20 20 20 20 32 0a 23 64  XTRACT      2.#d
22020 65 66 69 6e 65 20 41 52 5f 43 4d 44 5f 4c 49 53  efine AR_CMD_LIS
22030 54 20 20 20 20 20 20 20 20 20 33 0a 23 64 65 66  T         3.#def
22040 69 6e 65 20 41 52 5f 43 4d 44 5f 55 50 44 41 54  ine AR_CMD_UPDAT
22050 45 20 20 20 20 20 20 20 34 0a 23 64 65 66 69 6e  E       4.#defin
22060 65 20 41 52 5f 43 4d 44 5f 48 45 4c 50 20 20 20  e AR_CMD_HELP   
22070 20 20 20 20 20 20 35 0a 0a 2f 2a 0a 2a 2a 20 4f        5../*.** O
22080 74 68 65 72 20 28 6e 6f 6e 2d 63 6f 6d 6d 61 6e  ther (non-comman
22090 64 29 20 73 77 69 74 63 68 65 73 2e 0a 2a 2f 0a  d) switches..*/.
220a0 23 64 65 66 69 6e 65 20 41 52 5f 53 57 49 54 43  #define AR_SWITC
220b0 48 5f 56 45 52 42 4f 53 45 20 20 20 36 0a 23 64  H_VERBOSE   6.#d
220c0 65 66 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f  efine AR_SWITCH_
220d0 46 49 4c 45 20 20 20 20 20 20 37 0a 23 64 65 66  FILE      7.#def
220e0 69 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 44 49  ine AR_SWITCH_DI
220f0 52 45 43 54 4f 52 59 20 38 0a 23 64 65 66 69 6e  RECTORY 8.#defin
22100 65 20 41 52 5f 53 57 49 54 43 48 5f 5a 49 50 20  e AR_SWITCH_ZIP 
22110 20 20 20 20 20 20 39 0a 0a 73 74 61 74 69 63 20        9..static 
22120 69 6e 74 20 61 72 50 72 6f 63 65 73 73 53 77 69  int arProcessSwi
22130 74 63 68 28 41 72 43 6f 6d 6d 61 6e 64 20 2a 70  tch(ArCommand *p
22140 41 72 2c 20 69 6e 74 20 65 53 77 69 74 63 68 2c  Ar, int eSwitch,
22150 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
22160 67 29 7b 0a 20 20 73 77 69 74 63 68 28 20 65 53  g){.  switch( eS
22170 77 69 74 63 68 20 29 7b 0a 20 20 20 20 63 61 73  witch ){.    cas
22180 65 20 41 52 5f 43 4d 44 5f 43 52 45 41 54 45 3a  e AR_CMD_CREATE:
22190 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44  .    case AR_CMD
221a0 5f 45 58 54 52 41 43 54 3a 0a 20 20 20 20 63 61  _EXTRACT:.    ca
221b0 73 65 20 41 52 5f 43 4d 44 5f 4c 49 53 54 3a 0a  se AR_CMD_LIST:.
221c0 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f      case AR_CMD_
221d0 55 50 44 41 54 45 3a 0a 20 20 20 20 63 61 73 65  UPDATE:.    case
221e0 20 41 52 5f 43 4d 44 5f 48 45 4c 50 3a 0a 20 20   AR_CMD_HELP:.  
221f0 20 20 20 20 69 66 28 20 70 41 72 2d 3e 65 43 6d      if( pAr->eCm
22200 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  d ){.        ret
22210 75 72 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 22  urn arErrorMsg("
22220 6d 75 6c 74 69 70 6c 65 20 63 6f 6d 6d 61 6e 64  multiple command
22230 20 6f 70 74 69 6f 6e 73 22 29 3b 0a 20 20 20 20   options");.    
22240 20 20 7d 0a 20 20 20 20 20 20 70 41 72 2d 3e 65    }.      pAr->e
22250 43 6d 64 20 3d 20 65 53 77 69 74 63 68 3b 0a 20  Cmd = eSwitch;. 
22260 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
22270 20 63 61 73 65 20 41 52 5f 53 57 49 54 43 48 5f   case AR_SWITCH_
22280 56 45 52 42 4f 53 45 3a 0a 20 20 20 20 20 20 70  VERBOSE:.      p
22290 41 72 2d 3e 62 56 65 72 62 6f 73 65 20 3d 20 31  Ar->bVerbose = 1
222a0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
222b0 20 20 20 63 61 73 65 20 41 52 5f 53 57 49 54 43     case AR_SWITC
222c0 48 5f 5a 49 50 3a 0a 20 20 20 20 20 20 70 41 72  H_ZIP:.      pAr
222d0 2d 3e 62 5a 69 70 20 3d 20 31 3b 0a 20 20 20 20  ->bZip = 1;.    
222e0 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61    break;..    ca
222f0 73 65 20 41 52 5f 53 57 49 54 43 48 5f 46 49 4c  se AR_SWITCH_FIL
22300 45 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 7a 46  E:.      pAr->zF
22310 69 6c 65 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20  ile = zArg;.    
22320 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
22330 65 20 41 52 5f 53 57 49 54 43 48 5f 44 49 52 45  e AR_SWITCH_DIRE
22340 43 54 4f 52 59 3a 0a 20 20 20 20 20 20 70 41 72  CTORY:.      pAr
22350 2d 3e 7a 44 69 72 20 3d 20 7a 41 72 67 3b 0a 20  ->zDir = zArg;. 
22360 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a       break;.  }.
22370 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
22380 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61  _OK;.}../*.** Pa
22390 72 73 65 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20  rse the command 
223a0 6c 69 6e 65 20 66 6f 72 20 61 6e 20 22 2e 61 72  line for an ".ar
223b0 22 20 63 6f 6d 6d 61 6e 64 2e 20 54 68 65 20 72  " command. The r
223c0 65 73 75 6c 74 73 20 61 72 65 20 77 72 69 74 74  esults are writt
223d0 65 6e 20 69 6e 74 6f 0a 2a 2a 20 73 74 72 75 63  en into.** struc
223e0 74 75 72 65 20 28 2a 70 41 72 29 2e 20 53 51 4c  ture (*pAr). SQL
223f0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
22400 65 64 20 69 66 20 74 68 65 20 63 6f 6d 6d 61 6e  ed if the comman
22410 64 20 6c 69 6e 65 20 69 73 20 70 61 72 73 65 64  d line is parsed
22420 0a 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 6c 79  .** successfully
22430 2c 20 6f 74 68 65 72 77 69 73 65 20 61 6e 20 65  , otherwise an e
22440 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73 20  rror message is 
22450 77 72 69 74 74 65 6e 20 74 6f 20 73 74 64 65 72  written to stder
22460 72 20 61 6e 64 20 0a 2a 2a 20 53 51 4c 49 54 45  r and .** SQLITE
22470 5f 45 52 52 4f 52 20 72 65 74 75 72 6e 65 64 2e  _ERROR returned.
22480 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
22490 72 50 61 72 73 65 43 6f 6d 6d 61 6e 64 28 0a 20  rParseCommand(. 
224a0 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20 20   char **azArg,  
224b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
224c0 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72 67   /* Array of arg
224d0 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74 6f  uments passed to
224e0 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a   dot command */.
224f0 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20    int nArg,     
22500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22510 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65    /* Number of e
22520 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67 5b  ntries in azArg[
22530 5d 20 2a 2f 0a 20 20 41 72 43 6f 6d 6d 61 6e 64  ] */.  ArCommand
22540 20 2a 70 41 72 20 20 20 20 20 20 20 20 20 20 20   *pAr           
22550 20 20 20 20 20 20 20 2f 2a 20 50 6f 70 75 6c 61         /* Popula
22560 74 65 20 74 68 69 73 20 6f 62 6a 65 63 74 20 2a  te this object *
22570 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 41 72  /.){.  struct Ar
22580 53 77 69 74 63 68 20 7b 0a 20 20 20 20 63 68 61  Switch {.    cha
22590 72 20 63 53 68 6f 72 74 3b 0a 20 20 20 20 63 6f  r cShort;.    co
225a0 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f 6e 67 3b  nst char *zLong;
225b0 0a 20 20 20 20 69 6e 74 20 65 53 77 69 74 63 68  .    int eSwitch
225c0 3b 0a 20 20 20 20 69 6e 74 20 62 41 72 67 3b 0a  ;.    int bArg;.
225d0 20 20 7d 20 61 53 77 69 74 63 68 5b 5d 20 3d 20    } aSwitch[] = 
225e0 7b 0a 20 20 20 20 7b 20 27 63 27 2c 20 22 63 72  {.    { 'c', "cr
225f0 65 61 74 65 22 2c 20 20 20 20 41 52 5f 43 4d 44  eate",    AR_CMD
22600 5f 43 52 45 41 54 45 2c 20 30 20 7d 2c 0a 20 20  _CREATE, 0 },.  
22610 20 20 7b 20 27 78 27 2c 20 22 65 78 74 72 61 63    { 'x', "extrac
22620 74 22 2c 20 20 20 41 52 5f 43 4d 44 5f 45 58 54  t",   AR_CMD_EXT
22630 52 41 43 54 2c 20 30 20 7d 2c 0a 20 20 20 20 7b  RACT, 0 },.    {
22640 20 27 74 27 2c 20 22 6c 69 73 74 22 2c 20 20 20   't', "list",   
22650 20 20 20 41 52 5f 43 4d 44 5f 4c 49 53 54 2c 20     AR_CMD_LIST, 
22660 30 20 7d 2c 0a 20 20 20 20 7b 20 27 75 27 2c 20  0 },.    { 'u', 
22670 22 75 70 64 61 74 65 22 2c 20 20 20 20 41 52 5f  "update",    AR_
22680 43 4d 44 5f 55 50 44 41 54 45 2c 20 30 20 7d 2c  CMD_UPDATE, 0 },
22690 0a 20 20 20 20 7b 20 27 68 27 2c 20 22 68 65 6c  .    { 'h', "hel
226a0 70 22 2c 20 20 20 20 20 20 41 52 5f 43 4d 44 5f  p",      AR_CMD_
226b0 48 45 4c 50 2c 20 30 20 7d 2c 0a 20 20 20 20 7b  HELP, 0 },.    {
226c0 20 27 76 27 2c 20 22 76 65 72 62 6f 73 65 22 2c   'v', "verbose",
226d0 20 20 20 41 52 5f 53 57 49 54 43 48 5f 56 45 52     AR_SWITCH_VER
226e0 42 4f 53 45 2c 20 30 20 7d 2c 0a 20 20 20 20 7b  BOSE, 0 },.    {
226f0 20 27 66 27 2c 20 22 66 69 6c 65 22 2c 20 20 20   'f', "file",   
22700 20 20 20 41 52 5f 53 57 49 54 43 48 5f 46 49 4c     AR_SWITCH_FIL
22710 45 2c 20 31 20 7d 2c 0a 20 20 20 20 7b 20 27 43  E, 1 },.    { 'C
22720 27 2c 20 22 64 69 72 65 63 74 6f 72 79 22 2c 20  ', "directory", 
22730 41 52 5f 53 57 49 54 43 48 5f 44 49 52 45 43 54  AR_SWITCH_DIRECT
22740 4f 52 59 2c 20 31 20 7d 2c 0a 20 20 20 20 7b 20  ORY, 1 },.    { 
22750 27 7a 27 2c 20 22 7a 69 70 22 2c 20 20 20 20 20  'z', "zip",     
22760 20 20 41 52 5f 53 57 49 54 43 48 5f 5a 49 50 2c    AR_SWITCH_ZIP,
22770 20 30 20 7d 0a 20 20 7d 3b 0a 20 20 69 6e 74 20   0 }.  };.  int 
22780 6e 53 77 69 74 63 68 20 3d 20 73 69 7a 65 6f 66  nSwitch = sizeof
22790 28 61 53 77 69 74 63 68 29 20 2f 20 73 69 7a 65  (aSwitch) / size
227a0 6f 66 28 73 74 72 75 63 74 20 41 72 53 77 69 74  of(struct ArSwit
227b0 63 68 29 3b 0a 20 20 73 74 72 75 63 74 20 41 72  ch);.  struct Ar
227c0 53 77 69 74 63 68 20 2a 70 45 6e 64 20 3d 20 26  Switch *pEnd = &
227d0 61 53 77 69 74 63 68 5b 6e 53 77 69 74 63 68 5d  aSwitch[nSwitch]
227e0 3b 0a 0a 20 20 69 66 28 20 6e 41 72 67 3c 3d 31  ;..  if( nArg<=1
227f0 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 61   ){.    return a
22800 72 55 73 61 67 65 28 73 74 64 65 72 72 29 3b 0a  rUsage(stderr);.
22810 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 63 68 61    }else{.    cha
22820 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 31 5d 3b  r *z = azArg[1];
22830 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 41 72 2c  .    memset(pAr,
22840 20 30 2c 20 73 69 7a 65 6f 66 28 41 72 43 6f 6d   0, sizeof(ArCom
22850 6d 61 6e 64 29 29 3b 0a 0a 20 20 20 20 69 66 28  mand));..    if(
22860 20 7a 5b 30 5d 21 3d 27 2d 27 20 29 7b 0a 20 20   z[0]!='-' ){.  
22870 20 20 20 20 2f 2a 20 54 72 61 64 69 74 69 6f 6e      /* Tradition
22880 61 6c 20 73 74 79 6c 65 20 5b 74 61 72 5d 20 69  al style [tar] i
22890 6e 76 6f 63 61 74 69 6f 6e 20 2a 2f 0a 20 20 20  nvocation */.   
228a0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
228b0 69 6e 74 20 69 41 72 67 20 3d 20 32 3b 0a 20 20  int iArg = 2;.  
228c0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a 5b 69      for(i=0; z[i
228d0 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  ]; i++){.       
228e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
228f0 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73  g = 0;.        s
22900 74 72 75 63 74 20 41 72 53 77 69 74 63 68 20 2a  truct ArSwitch *
22910 70 4f 70 74 3b 0a 20 20 20 20 20 20 20 20 66 6f  pOpt;.        fo
22920 72 28 70 4f 70 74 3d 26 61 53 77 69 74 63 68 5b  r(pOpt=&aSwitch[
22930 30 5d 3b 20 70 4f 70 74 3c 70 45 6e 64 3b 20 70  0]; pOpt<pEnd; p
22940 4f 70 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Opt++){.        
22950 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 70 4f 70 74    if( z[i]==pOpt
22960 2d 3e 63 53 68 6f 72 74 20 29 20 62 72 65 61 6b  ->cShort ) break
22970 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
22980 20 20 20 20 69 66 28 20 70 4f 70 74 3d 3d 70 45      if( pOpt==pE
22990 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  nd ){.          
229a0 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73  return arErrorMs
229b0 67 28 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64 20  g("unrecognized 
229c0 6f 70 74 69 6f 6e 3a 20 25 63 22 2c 20 7a 5b 69  option: %c", z[i
229d0 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
229e0 20 20 20 20 20 20 69 66 28 20 70 4f 70 74 2d 3e        if( pOpt->
229f0 62 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20  bArg ){.        
22a00 20 20 69 66 28 20 69 41 72 67 3e 3d 6e 41 72 67    if( iArg>=nArg
22a10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
22a20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d 73  return arErrorMs
22a30 67 28 22 6f 70 74 69 6f 6e 20 72 65 71 75 69 72  g("option requir
22a40 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20  es an argument: 
22a50 25 63 22 2c 7a 5b 69 5d 29 3b 0a 20 20 20 20 20  %c",z[i]);.     
22a60 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
22a70 20 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b 69 41   zArg = azArg[iA
22a80 72 67 2b 2b 5d 3b 0a 20 20 20 20 20 20 20 20 7d  rg++];.        }
22a90 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 72 50  .        if( arP
22aa0 72 6f 63 65 73 73 53 77 69 74 63 68 28 70 41 72  rocessSwitch(pAr
22ab0 2c 20 70 4f 70 74 2d 3e 65 53 77 69 74 63 68 2c  , pOpt->eSwitch,
22ac0 20 7a 41 72 67 29 20 29 20 72 65 74 75 72 6e 20   zArg) ) return 
22ad0 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20  SQLITE_ERROR;.  
22ae0 20 20 20 20 7d 0a 20 20 20 20 20 20 70 41 72 2d      }.      pAr-
22af0 3e 6e 41 72 67 20 3d 20 6e 41 72 67 2d 69 41 72  >nArg = nArg-iAr
22b00 67 3b 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  g;.      if( pAr
22b10 2d 3e 6e 41 72 67 3e 30 20 29 7b 0a 20 20 20 20  ->nArg>0 ){.    
22b20 20 20 20 20 70 41 72 2d 3e 61 7a 41 72 67 20 3d      pAr->azArg =
22b30 20 26 61 7a 41 72 67 5b 69 41 72 67 5d 3b 0a 20   &azArg[iArg];. 
22b40 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
22b50 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 6f 6e 2d 74  {.      /* Non-t
22b60 72 61 64 69 74 69 6f 6e 61 6c 20 69 6e 76 6f 63  raditional invoc
22b70 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ation */.      i
22b80 6e 74 20 69 41 72 67 3b 0a 20 20 20 20 20 20 66  nt iArg;.      f
22b90 6f 72 28 69 41 72 67 3d 31 3b 20 69 41 72 67 3c  or(iArg=1; iArg<
22ba0 6e 41 72 67 3b 20 69 41 72 67 2b 2b 29 7b 0a 20  nArg; iArg++){. 
22bb0 20 20 20 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20         int n;.  
22bc0 20 20 20 20 20 20 7a 20 3d 20 61 7a 41 72 67 5b        z = azArg[
22bd0 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20 20 69  iArg];.        i
22be0 66 28 20 7a 5b 30 5d 21 3d 27 2d 27 20 29 7b 0a  f( z[0]!='-' ){.
22bf0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 6c            /* All
22c00 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6d 6d 61   remaining comma
22c10 6e 64 20 6c 69 6e 65 20 77 6f 72 64 73 20 61 72  nd line words ar
22c20 65 20 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  e command argume
22c30 6e 74 73 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  nts. */.        
22c40 20 20 70 41 72 2d 3e 61 7a 41 72 67 20 3d 20 26    pAr->azArg = &
22c50 61 7a 41 72 67 5b 69 41 72 67 5d 3b 0a 20 20 20  azArg[iArg];.   
22c60 20 20 20 20 20 20 20 70 41 72 2d 3e 6e 41 72 67         pAr->nArg
22c70 20 3d 20 6e 41 72 67 2d 69 41 72 67 3b 0a 20 20   = nArg-iArg;.  
22c80 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
22c90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22ca0 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a 29   n = strlen30(z)
22cb0 3b 0a 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ;..        if( z
22cc0 5b 31 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20  [1]!='-' ){.    
22cd0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
22ce0 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20 6f 72         /* One or
22cf0 20 6d 6f 72 65 20 73 68 6f 72 74 20 6f 70 74 69   more short opti
22d00 6f 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ons */.         
22d10 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 3b 20 69   for(i=1; i<n; i
22d20 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
22d30 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72   const char *zAr
22d40 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  g = 0;.         
22d50 20 20 20 73 74 72 75 63 74 20 41 72 53 77 69 74     struct ArSwit
22d60 63 68 20 2a 70 4f 70 74 3b 0a 20 20 20 20 20 20  ch *pOpt;.      
22d70 20 20 20 20 20 20 66 6f 72 28 70 4f 70 74 3d 26        for(pOpt=&
22d80 61 53 77 69 74 63 68 5b 30 5d 3b 20 70 4f 70 74  aSwitch[0]; pOpt
22d90 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b 0a  <pEnd; pOpt++){.
22da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
22db0 28 20 7a 5b 69 5d 3d 3d 70 4f 70 74 2d 3e 63 53  ( z[i]==pOpt->cS
22dc0 68 6f 72 74 20 29 20 62 72 65 61 6b 3b 0a 20 20  hort ) break;.  
22dd0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22de0 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 74          if( pOpt
22df0 3d 3d 70 45 6e 64 20 29 7b 0a 20 20 20 20 20 20  ==pEnd ){.      
22e00 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61          return a
22e10 72 45 72 72 6f 72 4d 73 67 28 22 75 6e 72 65 63  rErrorMsg("unrec
22e20 6f 67 6e 69 7a 65 64 20 6f 70 74 69 6f 6e 3a 20  ognized option: 
22e30 25 63 5c 6e 22 2c 20 7a 5b 69 5d 29 3b 0a 20 20  %c\n", z[i]);.  
22e40 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
22e50 20 20 20 20 20 20 20 20 69 66 28 20 70 4f 70 74          if( pOpt
22e60 2d 3e 62 41 72 67 20 29 7b 0a 20 20 20 20 20 20  ->bArg ){.      
22e70 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 28 6e          if( i<(n
22e80 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  -1) ){.         
22e90 20 20 20 20 20 20 20 7a 41 72 67 20 3d 20 26 7a         zArg = &z
22ea0 5b 69 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 20  [i+1];.         
22eb0 20 20 20 20 20 20 20 69 20 3d 20 6e 3b 0a 20 20         i = n;.  
22ec0 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
22ed0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
22ee0 20 20 20 69 66 28 20 69 41 72 67 3e 3d 28 6e 41     if( iArg>=(nA
22ef0 72 67 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20  rg-1) ){.       
22f00 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
22f10 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 22 6f 70  n arErrorMsg("op
22f20 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e  tion requires an
22f30 20 61 72 67 75 6d 65 6e 74 3a 20 25 63 5c 6e 22   argument: %c\n"
22f40 2c 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ,z[i]);.        
22f50 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
22f60 20 20 20 20 20 20 20 20 20 20 7a 41 72 67 20 3d            zArg =
22f70 20 61 7a 41 72 67 5b 2b 2b 69 41 72 67 5d 3b 0a   azArg[++iArg];.
22f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
22f90 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
22fa0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 72            if( ar
22fb0 50 72 6f 63 65 73 73 53 77 69 74 63 68 28 70 41  ProcessSwitch(pA
22fc0 72 2c 20 70 4f 70 74 2d 3e 65 53 77 69 74 63 68  r, pOpt->eSwitch
22fd0 2c 20 7a 41 72 67 29 20 29 20 72 65 74 75 72 6e  , zArg) ) return
22fe0 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
22ff0 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23000 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 32     }else if( z[2
23010 5d 3d 3d 27 5c 30 27 20 29 7b 0a 20 20 20 20 20  ]=='\0' ){.     
23020 20 20 20 20 20 2f 2a 20 41 20 2d 2d 20 6f 70 74       /* A -- opt
23030 69 6f 6e 2c 20 69 6e 64 69 63 61 74 69 6e 67 20  ion, indicating 
23040 74 68 61 74 20 61 6c 6c 20 72 65 6d 61 69 6e 69  that all remaini
23050 6e 67 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  ng command line 
23060 77 6f 72 64 73 0a 20 20 20 20 20 20 20 20 20 20  words.          
23070 2a 2a 20 61 72 65 20 63 6f 6d 6d 61 6e 64 20 61  ** are command a
23080 72 67 75 6d 65 6e 74 73 2e 20 20 2a 2f 0a 20 20  rguments.  */.  
23090 20 20 20 20 20 20 20 20 70 41 72 2d 3e 61 7a 41          pAr->azA
230a0 72 67 20 3d 20 26 61 7a 41 72 67 5b 69 41 72 67  rg = &azArg[iArg
230b0 2b 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 70  +1];.          p
230c0 41 72 2d 3e 6e 41 72 67 20 3d 20 6e 41 72 67 2d  Ar->nArg = nArg-
230d0 69 41 72 67 2d 31 3b 0a 20 20 20 20 20 20 20 20  iArg-1;.        
230e0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
230f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
23100 20 20 2f 2a 20 41 20 6c 6f 6e 67 20 6f 70 74 69    /* A long opti
23110 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  on */.          
23120 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67  const char *zArg
23130 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
23140 20 20 2f 2a 20 41 72 67 75 6d 65 6e 74 20 66 6f    /* Argument fo
23150 72 20 6f 70 74 69 6f 6e 2c 20 69 66 20 61 6e 79  r option, if any
23160 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 74   */.          st
23170 72 75 63 74 20 41 72 53 77 69 74 63 68 20 2a 70  ruct ArSwitch *p
23180 4d 61 74 63 68 20 3d 20 30 3b 20 20 20 20 20 20  Match = 0;      
23190 2f 2a 20 4d 61 74 63 68 69 6e 67 20 6f 70 74 69  /* Matching opti
231a0 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  on */.          
231b0 73 74 72 75 63 74 20 41 72 53 77 69 74 63 68 20  struct ArSwitch 
231c0 2a 70 4f 70 74 3b 20 20 20 20 20 20 20 20 20 20  *pOpt;          
231d0 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 2a 2f    /* Iterator */
231e0 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 70  .          for(p
231f0 4f 70 74 3d 26 61 53 77 69 74 63 68 5b 30 5d 3b  Opt=&aSwitch[0];
23200 20 70 4f 70 74 3c 70 45 6e 64 3b 20 70 4f 70 74   pOpt<pEnd; pOpt
23210 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ++){.           
23220 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 6f   const char *zLo
23230 6e 67 20 3d 20 70 4f 70 74 2d 3e 7a 4c 6f 6e 67  ng = pOpt->zLong
23240 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
23250 28 20 28 6e 2d 32 29 3c 3d 73 74 72 6c 65 6e 33  ( (n-2)<=strlen3
23260 30 28 7a 4c 6f 6e 67 29 20 26 26 20 30 3d 3d 6d  0(zLong) && 0==m
23270 65 6d 63 6d 70 28 26 7a 5b 32 5d 2c 20 7a 4c 6f  emcmp(&z[2], zLo
23280 6e 67 2c 20 6e 2d 32 29 20 29 7b 0a 20 20 20 20  ng, n-2) ){.    
23290 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4d            if( pM
232a0 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20  atch ){.        
232b0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61          return a
232c0 72 45 72 72 6f 72 4d 73 67 28 22 61 6d 62 69 67  rErrorMsg("ambig
232d0 75 6f 75 73 20 6f 70 74 69 6f 6e 3a 20 25 73 22  uous option: %s"
232e0 2c 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ,z);.           
232f0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23300 20 20 20 20 20 20 20 20 20 20 70 4d 61 74 63 68            pMatch
23310 20 3d 20 70 4f 70 74 3b 0a 20 20 20 20 20 20 20   = pOpt;.       
23320 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
23330 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23340 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66   }..          if
23350 28 20 70 4d 61 74 63 68 3d 3d 30 20 29 7b 0a 20  ( pMatch==0 ){. 
23360 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
23370 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 22 75 6e  n arErrorMsg("un
23380 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74 69 6f  recognized optio
23390 6e 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20  n: %s", z);.    
233a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
233b0 20 20 69 66 28 20 70 4d 61 74 63 68 2d 3e 62 41    if( pMatch->bA
233c0 72 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rg ){.          
233d0 20 20 69 66 28 20 69 41 72 67 3e 3d 28 6e 41 72    if( iArg>=(nAr
233e0 67 2d 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20  g-1) ){.        
233f0 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72 45        return arE
23400 72 72 6f 72 4d 73 67 28 22 6f 70 74 69 6f 6e 20  rrorMsg("option 
23410 72 65 71 75 69 72 65 73 20 61 6e 20 61 72 67 75  requires an argu
23420 6d 65 6e 74 3a 20 25 73 22 2c 20 7a 29 3b 0a 20  ment: %s", z);. 
23430 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
23440 20 20 20 20 20 20 20 20 20 7a 41 72 67 20 3d 20           zArg = 
23450 61 7a 41 72 67 5b 2b 2b 69 41 72 67 5d 3b 0a 20  azArg[++iArg];. 
23460 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23470 20 20 20 20 20 69 66 28 20 61 72 50 72 6f 63 65       if( arProce
23480 73 73 53 77 69 74 63 68 28 70 41 72 2c 20 70 4d  ssSwitch(pAr, pM
23490 61 74 63 68 2d 3e 65 53 77 69 74 63 68 2c 20 7a  atch->eSwitch, z
234a0 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 53 51  Arg) ) return SQ
234b0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
234c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
234d0 20 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72    }.  }..  retur
234e0 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a  n SQLITE_OK;.}..
234f0 2f 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74  /*.** This funct
23500 69 6f 6e 20 61 73 73 75 6d 65 73 20 74 68 61 74  ion assumes that
23510 20 61 6c 6c 20 61 72 67 75 6d 65 6e 74 73 20 77   all arguments w
23520 69 74 68 69 6e 20 74 68 65 20 41 72 43 6f 6d 6d  ithin the ArComm
23530 61 6e 64 2e 61 7a 41 72 67 5b 5d 0a 2a 2a 20 61  and.azArg[].** a
23540 72 72 61 79 20 72 65 66 65 72 20 74 6f 20 61 72  rray refer to ar
23550 63 68 69 76 65 20 6d 65 6d 62 65 72 73 2c 20 61  chive members, a
23560 73 20 66 6f 72 20 74 68 65 20 2d 2d 65 78 74 72  s for the --extr
23570 61 63 74 20 6f 72 20 2d 2d 6c 69 73 74 20 63 6f  act or --list co
23580 6d 6d 61 6e 64 73 2e 20 0a 2a 2a 20 49 74 20 63  mmands. .** It c
23590 68 65 63 6b 73 20 74 68 61 74 20 65 61 63 68 20  hecks that each 
235a0 6f 66 20 74 68 65 6d 20 61 72 65 20 70 72 65 73  of them are pres
235b0 65 6e 74 2e 20 49 66 20 61 6e 79 20 73 70 65 63  ent. If any spec
235c0 69 66 69 65 64 20 66 69 6c 65 20 69 73 20 6e 6f  ified file is no
235d0 74 0a 2a 2a 20 70 72 65 73 65 6e 74 20 69 6e 20  t.** present in 
235e0 74 68 65 20 61 72 63 68 69 76 65 2c 20 61 6e 20  the archive, an 
235f0 65 72 72 6f 72 20 69 73 20 70 72 69 6e 74 65 64  error is printed
23600 20 74 6f 20 73 74 64 65 72 72 20 61 6e 64 20 61   to stderr and a
23610 6e 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 20  n error.** code 
23620 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
23630 69 73 65 2c 20 69 66 20 61 6c 6c 20 73 70 65 63  ise, if all spec
23640 69 66 69 65 64 20 61 72 67 75 6d 65 6e 74 73 20  ified arguments 
23650 61 72 65 20 70 72 65 73 65 6e 74 20 69 6e 0a 2a  are present in.*
23660 2a 20 74 68 65 20 61 72 63 68 69 76 65 2c 20 53  * the archive, S
23670 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75  QLITE_OK is retu
23680 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  rned..**.** This
23690 20 66 75 6e 63 74 69 6f 6e 20 73 74 72 69 70 73   function strips
236a0 20 61 6e 79 20 74 72 61 69 6c 69 6e 67 20 27 2f   any trailing '/
236b0 27 20 63 68 61 72 61 63 74 65 72 73 20 66 72 6f  ' characters fro
236c0 6d 20 65 61 63 68 20 61 72 67 75 6d 65 6e 74 2e  m each argument.
236d0 0a 2a 2a 20 54 68 69 73 20 69 73 20 63 6f 6e 73  .** This is cons
236e0 69 73 74 65 6e 74 20 77 69 74 68 20 74 68 65 20  istent with the 
236f0 77 61 79 20 74 68 65 20 5b 74 61 72 5d 20 63 6f  way the [tar] co
23700 6d 6d 61 6e 64 20 73 65 65 6d 73 20 74 6f 20 77  mmand seems to w
23710 6f 72 6b 20 6f 6e 0a 2a 2a 20 4c 69 6e 75 78 2e  ork on.** Linux.
23720 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61  .*/.static int a
23730 72 43 68 65 63 6b 45 6e 74 72 69 65 73 28 73 71  rCheckEntries(sq
23740 6c 69 74 65 33 20 2a 64 62 2c 20 41 72 43 6f 6d  lite3 *db, ArCom
23750 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20 69 6e  mand *pAr){.  in
23760 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b  t rc = SQLITE_OK
23770 3b 0a 20 20 69 66 28 20 70 41 72 2d 3e 6e 41 72  ;.  if( pAr->nAr
23780 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  g ){.    int i;.
23790 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
237a0 20 2a 70 54 65 73 74 20 3d 20 30 3b 0a 0a 20 20   *pTest = 0;..  
237b0 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50 72    shellPreparePr
237c0 69 6e 74 66 28 64 62 2c 20 26 72 63 2c 20 26 70  intf(db, &rc, &p
237d0 54 65 73 74 2c 20 22 53 45 4c 45 43 54 20 6e 61  Test, "SELECT na
237e0 6d 65 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45  me FROM %s WHERE
237f0 20 6e 61 6d 65 3d 3f 31 22 2c 20 0a 20 20 20 20   name=?1", .    
23800 20 20 20 20 70 41 72 2d 3e 62 5a 69 70 20 3f 20      pAr->bZip ? 
23810 22 7a 69 70 66 69 6c 65 28 3f 32 29 22 20 3a 20  "zipfile(?2)" : 
23820 22 73 71 6c 61 72 22 0a 20 20 20 20 29 3b 0a 20  "sqlar".    );. 
23830 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
23840 45 5f 4f 4b 20 26 26 20 70 41 72 2d 3e 62 5a 69  E_OK && pAr->bZi
23850 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  p ){.      sqlit
23860 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 54 65  e3_bind_text(pTe
23870 73 74 2c 20 32 2c 20 70 41 72 2d 3e 7a 46 69 6c  st, 2, pAr->zFil
23880 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52  e, -1, SQLITE_TR
23890 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 0a  ANSIENT);.    }.
238a0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
238b0 41 72 2d 3e 6e 41 72 67 20 26 26 20 72 63 3d 3d  Ar->nArg && rc==
238c0 53 51 4c 49 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b  SQLITE_OK; i++){
238d0 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  .      char *z =
238e0 20 70 41 72 2d 3e 61 7a 41 72 67 5b 69 5d 3b 0a   pAr->azArg[i];.
238f0 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74        int n = st
23900 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 20  rlen30(z);.     
23910 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3b 0a 20 20   int bOk = 0;.  
23920 20 20 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26      while( n>0 &
23930 26 20 7a 5b 6e 2d 31 5d 3d 3d 27 2f 27 20 29 20  & z[n-1]=='/' ) 
23940 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 5b 6e 5d 20  n--;.      z[n] 
23950 3d 20 27 5c 30 27 3b 0a 20 20 20 20 20 20 73 71  = '\0';.      sq
23960 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
23970 70 54 65 73 74 2c 20 31 2c 20 7a 2c 20 2d 31 2c  pTest, 1, z, -1,
23980 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
23990 0a 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54  .      if( SQLIT
239a0 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
239b0 74 65 70 28 70 54 65 73 74 29 20 29 7b 0a 20 20  tep(pTest) ){.  
239c0 20 20 20 20 20 20 62 4f 6b 20 3d 20 31 3b 0a 20        bOk = 1;. 
239d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 68 65       }.      she
239e0 6c 6c 52 65 73 65 74 28 26 72 63 2c 20 70 54 65  llReset(&rc, pTe
239f0 73 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  st);.      if( r
23a00 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
23a10 62 4f 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  bOk==0 ){.      
23a20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
23a30 65 72 72 2c 20 22 6e 6f 74 20 66 6f 75 6e 64 20  err, "not found 
23a40 69 6e 20 61 72 63 68 69 76 65 3a 20 25 73 5c 6e  in archive: %s\n
23a50 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 72  ", z);.        r
23a60 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
23a70 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
23a80 20 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a      shellFinaliz
23a90 65 28 26 72 63 2c 20 70 54 65 73 74 29 3b 0a 20  e(&rc, pTest);. 
23aa0 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   }..  return rc;
23ab0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 6f 72 6d 61 74  .}../*.** Format
23ac0 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   a WHERE clause 
23ad0 74 68 61 74 20 63 61 6e 20 62 65 20 75 73 65 64  that can be used
23ae0 20 61 67 61 69 6e 73 74 20 74 68 65 20 22 73 71   against the "sq
23af0 6c 61 72 22 20 74 61 62 6c 65 20 74 6f 0a 2a 2a  lar" table to.**
23b00 20 69 64 65 6e 74 69 66 79 20 61 6c 6c 20 61 72   identify all ar
23b10 63 68 69 76 65 20 6d 65 6d 62 65 72 73 20 74 68  chive members th
23b20 61 74 20 6d 61 74 63 68 20 74 68 65 20 63 6f 6d  at match the com
23b30 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 68  mand arguments h
23b40 65 6c 64 0a 2a 2a 20 69 6e 20 28 2a 70 41 72 29  eld.** in (*pAr)
23b50 2e 20 4c 65 61 76 65 20 74 68 69 73 20 57 48 45  . Leave this WHE
23b60 52 45 20 63 6c 61 75 73 65 20 69 6e 20 28 2a 70  RE clause in (*p
23b70 7a 57 68 65 72 65 29 20 62 65 66 6f 72 65 20 72  zWhere) before r
23b80 65 74 75 72 6e 69 6e 67 2e 0a 2a 2a 20 54 68 65  eturning..** The
23b90 20 63 61 6c 6c 65 72 20 69 73 20 72 65 73 70 6f   caller is respo
23ba0 6e 73 69 62 6c 65 20 66 6f 72 20 65 76 65 6e 74  nsible for event
23bb0 75 61 6c 6c 79 20 63 61 6c 6c 69 6e 67 20 73 71  ually calling sq
23bc0 6c 69 74 65 33 5f 66 72 65 65 28 29 20 6f 6e 0a  lite3_free() on.
23bd0 2a 2a 20 61 6e 79 20 6e 6f 6e 2d 4e 55 4c 4c 20  ** any non-NULL 
23be0 28 2a 70 7a 57 68 65 72 65 29 20 76 61 6c 75 65  (*pzWhere) value
23bf0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
23c00 20 61 72 57 68 65 72 65 43 6c 61 75 73 65 28 0a   arWhereClause(.
23c10 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 41    int *pRc, .  A
23c20 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 0a  rCommand *pAr, .
23c30 20 20 63 68 61 72 20 2a 2a 70 7a 57 68 65 72 65    char **pzWhere
23c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23c50 20 20 2f 2a 20 4f 55 54 3a 20 4e 65 77 20 57 48    /* OUT: New WH
23c60 45 52 45 20 63 6c 61 75 73 65 20 2a 2f 0a 29 7b  ERE clause */.){
23c70 0a 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20  .  char *zWhere 
23c80 3d 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d  = 0;.  if( *pRc=
23c90 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
23ca0 20 20 69 66 28 20 70 41 72 2d 3e 6e 41 72 67 3d    if( pAr->nArg=
23cb0 3d 30 20 29 7b 0a 20 20 20 20 20 20 7a 57 68 65  =0 ){.      zWhe
23cc0 72 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  re = sqlite3_mpr
23cd0 69 6e 74 66 28 22 31 22 29 3b 0a 20 20 20 20 7d  intf("1");.    }
23ce0 65 6c 73 65 7b 0a 20 20 20 20 20 20 69 6e 74 20  else{.      int 
23cf0 69 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  i;.      const c
23d00 68 61 72 20 2a 7a 53 65 70 20 3d 20 22 22 3b 0a  har *zSep = "";.
23d10 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
23d20 3c 70 41 72 2d 3e 6e 41 72 67 3b 20 69 2b 2b 29  <pAr->nArg; i++)
23d30 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
23d40 63 68 61 72 20 2a 7a 20 3d 20 70 41 72 2d 3e 61  char *z = pAr->a
23d50 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 20  zArg[i];.       
23d60 20 7a 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65   zWhere = sqlite
23d70 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
23d80 20 20 20 20 20 20 20 22 25 7a 25 73 20 6e 61 6d         "%z%s nam
23d90 65 20 3d 20 27 25 71 27 20 4f 52 20 6e 61 6d 65  e = '%q' OR name
23da0 20 42 45 54 57 45 45 4e 20 27 25 71 2f 27 20 41   BETWEEN '%q/' A
23db0 4e 44 20 27 25 71 30 27 22 2c 20 0a 20 20 20 20  ND '%q0'", .    
23dc0 20 20 20 20 20 20 20 20 7a 57 68 65 72 65 2c 20          zWhere, 
23dd0 7a 53 65 70 2c 20 7a 2c 20 7a 2c 20 7a 0a 20 20  zSep, z, z, z.  
23de0 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20            );.   
23df0 20 20 20 20 20 69 66 28 20 7a 57 68 65 72 65 3d       if( zWhere=
23e00 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
23e10 2a 70 52 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f  *pRc = SQLITE_NO
23e20 4d 45 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 62  MEM;.          b
23e30 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
23e40 20 20 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22          zSep = "
23e50 20 4f 52 20 22 3b 0a 20 20 20 20 20 20 7d 0a 20   OR ";.      }. 
23e60 20 20 20 7d 0a 20 20 7d 0a 20 20 2a 70 7a 57 68     }.  }.  *pzWh
23e70 65 72 65 20 3d 20 7a 57 68 65 72 65 3b 0a 7d 0a  ere = zWhere;.}.
23e80 0a 2f 2a 0a 2a 2a 20 41 72 67 75 6d 65 6e 74 20  ./*.** Argument 
23e90 7a 4d 6f 64 65 20 6d 75 73 74 20 70 6f 69 6e 74  zMode must point
23ea0 20 74 6f 20 61 20 62 75 66 66 65 72 20 61 74 20   to a buffer at 
23eb0 6c 65 61 73 74 20 31 31 20 62 79 74 65 73 20 69  least 11 bytes i
23ec0 6e 20 73 69 7a 65 2e 20 54 68 69 73 0a 2a 2a 20  n size. This.** 
23ed0 66 75 6e 63 74 69 6f 6e 20 70 6f 70 75 6c 61 74  function populat
23ee0 65 73 20 74 68 69 73 20 62 75 66 66 65 72 20 77  es this buffer w
23ef0 69 74 68 20 74 68 65 20 73 74 72 69 6e 67 20 69  ith the string i
23f00 6e 74 65 72 70 72 65 74 61 74 69 6f 6e 20 6f 66  nterpretation of
23f10 0a 2a 2a 20 74 68 65 20 75 6e 69 78 20 66 69 6c  .** the unix fil
23f20 65 20 6d 6f 64 65 20 70 61 73 73 65 64 20 61 73  e mode passed as
23f30 20 74 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75   the second argu
23f40 6d 65 6e 74 20 28 65 2e 67 2e 20 22 64 72 77 78  ment (e.g. "drwx
23f50 72 2d 78 72 2d 78 22 29 2e 0a 2a 2f 0a 73 74 61  r-xr-x")..*/.sta
23f60 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 4d 6f  tic void shellMo
23f70 64 65 54 6f 53 74 72 69 6e 67 28 63 68 61 72 20  deToString(char 
23f80 2a 7a 4d 6f 64 65 2c 20 69 6e 74 20 6d 6f 64 65  *zMode, int mode
23f90 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 2f  ){.  int i;..  /
23fa0 2a 20 4d 61 67 69 63 20 6e 75 6d 62 65 72 73 20  * Magic numbers 
23fb0 63 6f 70 69 65 64 20 66 72 6f 6d 20 5b 6d 61 6e  copied from [man
23fc0 20 32 20 73 74 61 74 5d 20 2a 2f 0a 20 20 69 66   2 stat] */.  if
23fd0 28 20 6d 6f 64 65 20 26 20 30 30 34 30 30 30 30  ( mode & 0040000
23fe0 20 29 7b 0a 20 20 20 20 7a 4d 6f 64 65 5b 30 5d   ){.    zMode[0]
23ff0 20 3d 20 27 64 27 3b 0a 20 20 7d 65 6c 73 65 20   = 'd';.  }else 
24000 69 66 28 20 28 6d 6f 64 65 20 26 20 30 31 32 30  if( (mode & 0120
24010 30 30 30 29 3d 3d 30 31 32 30 30 30 30 20 29 7b  000)==0120000 ){
24020 0a 20 20 20 20 7a 4d 6f 64 65 5b 30 5d 20 3d 20  .    zMode[0] = 
24030 27 6c 27 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  'l';.  }else{.  
24040 20 20 7a 4d 6f 64 65 5b 30 5d 20 3d 20 27 2d 27    zMode[0] = '-'
24050 3b 0a 20 20 7d 0a 0a 20 20 66 6f 72 28 69 3d 30  ;.  }..  for(i=0
24060 3b 20 69 3c 33 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<3; i++){.   
24070 20 69 6e 74 20 6d 20 3d 20 28 6d 6f 64 65 20 3e   int m = (mode >
24080 3e 20 28 28 32 2d 69 29 2a 33 29 29 3b 0a 20 20  > ((2-i)*3));.  
24090 20 20 63 68 61 72 20 2a 61 20 3d 20 26 7a 4d 6f    char *a = &zMo
240a0 64 65 5b 31 20 2b 20 69 2a 33 5d 3b 0a 20 20 20  de[1 + i*3];.   
240b0 20 61 5b 30 5d 20 3d 20 28 6d 20 26 20 30 78 34   a[0] = (m & 0x4
240c0 29 20 3f 20 27 72 27 20 3a 20 27 2d 27 3b 0a 20  ) ? 'r' : '-';. 
240d0 20 20 20 61 5b 31 5d 20 3d 20 28 6d 20 26 20 30     a[1] = (m & 0
240e0 78 32 29 20 3f 20 27 77 27 20 3a 20 27 2d 27 3b  x2) ? 'w' : '-';
240f0 0a 20 20 20 20 61 5b 32 5d 20 3d 20 28 6d 20 26  .    a[2] = (m &
24100 20 30 78 31 29 20 3f 20 27 78 27 20 3a 20 27 2d   0x1) ? 'x' : '-
24110 27 3b 0a 20 20 7d 0a 20 20 7a 4d 6f 64 65 5b 31  ';.  }.  zMode[1
24120 30 5d 20 3d 20 27 5c 30 27 3b 0a 7d 0a 0a 2f 2a  0] = '\0';.}../*
24130 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
24140 6f 6e 20 6f 66 20 2e 61 72 20 22 6c 69 73 54 22  on of .ar "lisT"
24150 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a 73 74   command. .*/.st
24160 61 74 69 63 20 69 6e 74 20 61 72 4c 69 73 74 43  atic int arListC
24170 6f 6d 6d 61 6e 64 28 53 68 65 6c 6c 53 74 61 74  ommand(ShellStat
24180 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 20 2a 64  e *p, sqlite3 *d
24190 62 2c 20 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41  b, ArCommand *pA
241a0 72 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  r){.  const char
241b0 20 2a 7a 53 71 6c 20 3d 20 22 53 45 4c 45 43 54   *zSql = "SELECT
241c0 20 25 73 20 46 52 4f 4d 20 25 73 20 57 48 45 52   %s FROM %s WHER
241d0 45 20 25 73 22 3b 20 0a 20 20 63 6f 6e 73 74 20  E %s"; .  const 
241e0 63 68 61 72 20 2a 7a 54 62 6c 20 3d 20 28 70 41  char *zTbl = (pA
241f0 72 2d 3e 62 5a 69 70 20 3f 20 22 7a 69 70 66 69  r->bZip ? "zipfi
24200 6c 65 28 3f 29 22 20 3a 20 22 73 71 6c 61 72 22  le(?)" : "sqlar"
24210 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  );.  const char 
24220 2a 61 7a 43 6f 6c 73 5b 5d 20 3d 20 7b 0a 20 20  *azCols[] = {.  
24230 20 20 22 6e 61 6d 65 22 2c 0a 20 20 20 20 22 6d    "name",.    "m
24240 6f 64 65 2c 20 73 7a 2c 20 64 61 74 65 74 69 6d  ode, sz, datetim
24250 65 28 6d 74 69 6d 65 2c 20 27 75 6e 69 78 65 70  e(mtime, 'unixep
24260 6f 63 68 27 29 2c 20 6e 61 6d 65 22 0a 20 20 7d  och'), name".  }
24270 3b 0a 0a 20 20 63 68 61 72 20 2a 7a 57 68 65 72  ;..  char *zWher
24280 65 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33  e = 0;.  sqlite3
24290 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30 3b  _stmt *pSql = 0;
242a0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 72 63  .  int rc;..  rc
242b0 20 3d 20 61 72 43 68 65 63 6b 45 6e 74 72 69 65   = arCheckEntrie
242c0 73 28 64 62 2c 20 70 41 72 29 3b 0a 20 20 61 72  s(db, pAr);.  ar
242d0 57 68 65 72 65 43 6c 61 75 73 65 28 26 72 63 2c  WhereClause(&rc,
242e0 20 70 41 72 2c 20 26 7a 57 68 65 72 65 29 3b 0a   pAr, &zWhere);.
242f0 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 50  .  shellPrepareP
24300 72 69 6e 74 66 28 64 62 2c 20 26 72 63 2c 20 26  rintf(db, &rc, &
24310 70 53 71 6c 2c 20 7a 53 71 6c 2c 20 61 7a 43 6f  pSql, zSql, azCo
24320 6c 73 5b 70 41 72 2d 3e 62 56 65 72 62 6f 73 65  ls[pAr->bVerbose
24330 5d 2c 20 7a 54 62 6c 2c 20 7a 57 68 65 72 65 29  ], zTbl, zWhere)
24340 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ;.  if( rc==SQLI
24350 54 45 5f 4f 4b 20 26 26 20 70 41 72 2d 3e 62 5a  TE_OK && pAr->bZ
24360 69 70 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ip ){.    sqlite
24370 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 71 6c  3_bind_text(pSql
24380 2c 20 31 2c 20 70 41 72 2d 3e 7a 46 69 6c 65 2c  , 1, pAr->zFile,
24390 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e   -1, SQLITE_TRAN
243a0 53 49 45 4e 54 29 3b 0a 20 20 7d 0a 20 20 77 68  SIENT);.  }.  wh
243b0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
243c0 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
243d0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
243e0 53 71 6c 29 20 29 7b 0a 20 20 20 20 69 66 28 20  Sql) ){.    if( 
243f0 70 41 72 2d 3e 62 56 65 72 62 6f 73 65 20 29 7b  pAr->bVerbose ){
24400 0a 20 20 20 20 20 20 63 68 61 72 20 7a 4d 6f 64  .      char zMod
24410 65 5b 31 31 5d 3b 0a 20 20 20 20 20 20 73 68 65  e[11];.      she
24420 6c 6c 4d 6f 64 65 54 6f 53 74 72 69 6e 67 28 7a  llModeToString(z
24430 4d 6f 64 65 2c 20 73 71 6c 69 74 65 33 5f 63 6f  Mode, sqlite3_co
24440 6c 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 30  lumn_int(pSql, 0
24450 29 29 3b 0a 0a 20 20 20 20 20 20 72 61 77 5f 70  ));..      raw_p
24460 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
24470 73 20 25 20 31 30 64 20 20 25 73 20 20 25 73 5c  s % 10d  %s  %s\
24480 6e 22 2c 20 7a 4d 6f 64 65 2c 0a 20 20 20 20 20  n", zMode,.     
24490 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
244a0 75 6d 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 31 29  umn_int(pSql, 1)
244b0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  , .          sql
244c0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
244d0 28 70 53 71 6c 2c 20 32 29 2c 0a 20 20 20 20 20  (pSql, 2),.     
244e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c       sqlite3_col
244f0 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 33  umn_text(pSql, 3
24500 29 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  ).      );.    }
24510 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
24520 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
24530 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63  %s\n", sqlite3_c
24540 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
24550 20 30 29 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   0));.    }.  }.
24560 0a 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65  .  shellFinalize
24570 28 26 72 63 2c 20 70 53 71 6c 29 3b 0a 20 20 72  (&rc, pSql);.  r
24580 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a  eturn rc;.}.../*
24590 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
245a0 6f 6e 20 6f 66 20 2e 61 72 20 22 65 58 74 72 61  on of .ar "eXtra
245b0 63 74 22 20 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f  ct" command. .*/
245c0 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 45 78  .static int arEx
245d0 74 72 61 63 74 43 6f 6d 6d 61 6e 64 28 53 68 65  tractCommand(She
245e0 6c 6c 53 74 61 74 65 20 2a 70 2c 20 73 71 6c 69  llState *p, sqli
245f0 74 65 33 20 2a 64 62 2c 20 41 72 43 6f 6d 6d 61  te3 *db, ArComma
24600 6e 64 20 2a 70 41 72 29 7b 0a 20 20 63 6f 6e 73  nd *pAr){.  cons
24610 74 20 63 68 61 72 20 2a 7a 53 71 6c 31 20 3d 20  t char *zSql1 = 
24620 0a 20 20 20 20 22 53 45 4c 45 43 54 20 22 0a 20  .    "SELECT ". 
24630 20 20 20 22 20 20 3a 31 20 7c 7c 20 6e 61 6d 65     "  :1 || name
24640 2c 20 22 0a 20 20 20 20 22 20 20 77 72 69 74 65  , ".    "  write
24650 66 69 6c 65 28 3f 31 20 7c 7c 20 6e 61 6d 65 2c  file(?1 || name,
24660 20 25 73 2c 20 6d 6f 64 65 2c 20 6d 74 69 6d 65   %s, mode, mtime
24670 29 20 22 0a 20 20 20 20 22 46 52 4f 4d 20 25 73  ) ".    "FROM %s
24680 20 57 48 45 52 45 20 28 25 73 29 20 41 4e 44 20   WHERE (%s) AND 
24690 28 64 61 74 61 20 49 53 20 4e 55 4c 4c 20 4f 52  (data IS NULL OR
246a0 20 3f 32 20 3d 20 30 29 22 3b 0a 0a 20 20 63 6f   ?2 = 0)";..  co
246b0 6e 73 74 20 63 68 61 72 20 2a 61 7a 45 78 74 72  nst char *azExtr
246c0 61 41 72 67 5b 5d 20 3d 20 7b 20 0a 20 20 20 20  aArg[] = { .    
246d0 22 73 71 6c 61 72 5f 75 6e 63 6f 6d 70 72 65 73  "sqlar_uncompres
246e0 73 28 64 61 74 61 2c 20 73 7a 29 22 2c 0a 20 20  s(data, sz)",.  
246f0 20 20 22 7a 69 70 66 69 6c 65 5f 75 6e 63 6f 6d    "zipfile_uncom
24700 70 72 65 73 73 28 64 61 74 61 2c 20 73 7a 2c 20  press(data, sz, 
24710 6d 65 74 68 6f 64 29 22 0a 20 20 7d 3b 0a 20 20  method)".  };.  
24720 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 53 6f  const char *azSo
24730 75 72 63 65 5b 5d 20 3d 20 7b 0a 20 20 20 20 22  urce[] = {.    "
24740 73 71 6c 61 72 22 2c 20 22 7a 69 70 66 69 6c 65  sqlar", "zipfile
24750 28 3f 33 29 22 0a 20 20 7d 3b 0a 0a 0a 0a 20 20  (?3)".  };....  
24760 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
24770 71 6c 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 63  ql = 0;.  int rc
24780 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
24790 63 68 61 72 20 2a 7a 44 69 72 20 3d 20 30 3b 0a  char *zDir = 0;.
247a0 20 20 63 68 61 72 20 2a 7a 57 68 65 72 65 20 3d    char *zWhere =
247b0 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20   0;.  int i;..  
247c0 2f 2a 20 49 66 20 61 72 67 75 6d 65 6e 74 73 20  /* If arguments 
247d0 61 72 65 20 73 70 65 63 69 66 69 65 64 2c 20 63  are specified, c
247e0 68 65 63 6b 20 74 68 61 74 20 74 68 65 79 20 61  heck that they a
247f0 63 74 75 61 6c 6c 79 20 65 78 69 73 74 20 77 69  ctually exist wi
24800 74 68 69 6e 0a 20 20 2a 2a 20 74 68 65 20 61 72  thin.  ** the ar
24810 63 68 69 76 65 20 62 65 66 6f 72 65 20 70 72 6f  chive before pro
24820 63 65 65 64 69 6e 67 2e 20 41 6e 64 20 66 6f 72  ceeding. And for
24830 6d 75 6c 61 74 65 20 61 20 57 48 45 52 45 20 63  mulate a WHERE c
24840 6c 61 75 73 65 20 74 6f 0a 20 20 2a 2a 20 6d 61  lause to.  ** ma
24850 74 63 68 20 74 68 65 6d 2e 20 20 2a 2f 0a 20 20  tch them.  */.  
24860 72 63 20 3d 20 61 72 43 68 65 63 6b 45 6e 74 72  rc = arCheckEntr
24870 69 65 73 28 64 62 2c 20 70 41 72 29 3b 0a 20 20  ies(db, pAr);.  
24880 61 72 57 68 65 72 65 43 6c 61 75 73 65 28 26 72  arWhereClause(&r
24890 63 2c 20 70 41 72 2c 20 26 7a 57 68 65 72 65 29  c, pAr, &zWhere)
248a0 3b 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  ;..  if( rc==SQL
248b0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66  ITE_OK ){.    if
248c0 28 20 70 41 72 2d 3e 7a 44 69 72 20 29 7b 0a 20  ( pAr->zDir ){. 
248d0 20 20 20 20 20 7a 44 69 72 20 3d 20 73 71 6c 69       zDir = sqli
248e0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 2f  te3_mprintf("%s/
248f0 22 2c 20 70 41 72 2d 3e 7a 44 69 72 29 3b 0a 20  ", pAr->zDir);. 
24900 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24910 7a 44 69 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zDir = sqlite3_m
24920 70 72 69 6e 74 66 28 22 22 29 3b 0a 20 20 20 20  printf("");.    
24930 7d 0a 20 20 20 20 69 66 28 20 7a 44 69 72 3d 3d  }.    if( zDir==
24940 30 20 29 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  0 ) rc = SQLITE_
24950 4e 4f 4d 45 4d 3b 0a 20 20 7d 0a 0a 20 20 73 68  NOMEM;.  }..  sh
24960 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66  ellPreparePrintf
24970 28 64 62 2c 20 26 72 63 2c 20 26 70 53 71 6c 2c  (db, &rc, &pSql,
24980 20 7a 53 71 6c 31 2c 20 0a 20 20 20 20 20 20 61   zSql1, .      a
24990 7a 45 78 74 72 61 41 72 67 5b 70 41 72 2d 3e 62  zExtraArg[pAr->b
249a0 5a 69 70 5d 2c 20 61 7a 53 6f 75 72 63 65 5b 70  Zip], azSource[p
249b0 41 72 2d 3e 62 5a 69 70 5d 2c 20 7a 57 68 65 72  Ar->bZip], zWher
249c0 65 0a 20 20 29 3b 0a 0a 20 20 69 66 28 20 72 63  e.  );..  if( rc
249d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
249e0 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
249f0 74 65 78 74 28 70 53 71 6c 2c 20 31 2c 20 7a 44  text(pSql, 1, zD
24a00 69 72 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53  ir, -1, SQLITE_S
24a10 54 41 54 49 43 29 3b 0a 20 20 20 20 69 66 28 20  TATIC);.    if( 
24a20 70 41 72 2d 3e 62 5a 69 70 20 29 7b 0a 20 20 20  pAr->bZip ){.   
24a30 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
24a40 74 65 78 74 28 70 53 71 6c 2c 20 33 2c 20 70 41  text(pSql, 3, pA
24a50 72 2d 3e 7a 46 69 6c 65 2c 20 2d 31 2c 20 53 51  r->zFile, -1, SQ
24a60 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
24a70 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 75 6e 20    }..    /* Run 
24a80 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
24a90 6d 65 6e 74 20 74 77 69 63 65 2e 20 54 68 65 20  ment twice. The 
24aa0 66 69 72 73 74 20 74 69 6d 65 2c 20 77 72 69 74  first time, writ
24ab0 65 66 69 6c 65 28 29 20 69 73 20 63 61 6c 6c 65  efile() is calle
24ac0 64 0a 20 20 20 20 2a 2a 20 66 6f 72 20 61 6c 6c  d.    ** for all
24ad0 20 61 72 63 68 69 76 65 20 6d 65 6d 62 65 72 73   archive members
24ae0 20 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20   that should be 
24af0 65 78 74 72 61 63 74 65 64 2e 20 54 68 65 20 73  extracted. The s
24b00 65 63 6f 6e 64 20 74 69 6d 65 2c 0a 20 20 20 20  econd time,.    
24b10 2a 2a 20 6f 6e 6c 79 20 66 6f 72 20 74 68 65 20  ** only for the 
24b20 64 69 72 65 63 74 6f 72 69 65 73 2e 20 54 68 69  directories. Thi
24b30 73 20 69 73 20 62 65 63 61 75 73 65 20 74 68 65  s is because the
24b40 20 74 69 6d 65 73 74 61 6d 70 73 20 66 6f 72 0a   timestamps for.
24b50 20 20 20 20 2a 2a 20 65 78 74 72 61 63 74 65 64      ** extracted
24b60 20 64 69 72 65 63 74 6f 72 69 65 73 20 6d 75 73   directories mus
24b70 74 20 62 65 20 72 65 73 65 74 20 61 66 74 65 72  t be reset after
24b80 20 74 68 65 79 20 61 72 65 20 70 6f 70 75 6c 61   they are popula
24b90 74 65 64 20 28 61 73 0a 20 20 20 20 2a 2a 20 70  ted (as.    ** p
24ba0 6f 70 75 6c 61 74 69 6e 67 20 74 68 65 6d 20 63  opulating them c
24bb0 68 61 6e 67 65 73 20 74 68 65 20 74 69 6d 65 73  hanges the times
24bc0 74 61 6d 70 29 2e 20 20 2a 2f 0a 20 20 20 20 66  tamp).  */.    f
24bd0 6f 72 28 69 3d 30 3b 20 69 3c 32 3b 20 69 2b 2b  or(i=0; i<2; i++
24be0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
24bf0 5f 62 69 6e 64 5f 69 6e 74 28 70 53 71 6c 2c 20  _bind_int(pSql, 
24c00 32 2c 20 69 29 3b 0a 20 20 20 20 20 20 77 68 69  2, i);.      whi
24c10 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  le( rc==SQLITE_O
24c20 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57 3d  K && SQLITE_ROW=
24c30 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
24c40 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ql) ){.        i
24c50 66 28 20 69 3d 3d 30 20 26 26 20 70 41 72 2d 3e  f( i==0 && pAr->
24c60 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20  bVerbose ){.    
24c70 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
24c80 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  (p->out, "%s\n",
24c90 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
24ca0 74 65 78 74 28 70 53 71 6c 2c 20 30 29 29 3b 0a  text(pSql, 0));.
24cb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24cc0 7d 0a 20 20 20 20 20 20 73 68 65 6c 6c 52 65 73  }.      shellRes
24cd0 65 74 28 26 72 63 2c 20 70 53 71 6c 29 3b 0a 20  et(&rc, pSql);. 
24ce0 20 20 20 7d 0a 20 20 20 20 73 68 65 6c 6c 46 69     }.    shellFi
24cf0 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 53 71 6c  nalize(&rc, pSql
24d00 29 3b 0a 20 20 7d 0a 0a 20 20 73 71 6c 69 74 65  );.  }..  sqlite
24d10 33 5f 66 72 65 65 28 7a 44 69 72 29 3b 0a 20 20  3_free(zDir);.  
24d20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 57 68  sqlite3_free(zWh
24d30 65 72 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ere);.  return r
24d40 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  c;.}.../*.** Imp
24d50 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 2e  lementation of .
24d60 61 72 20 22 63 72 65 61 74 65 22 20 61 6e 64 20  ar "create" and 
24d70 22 75 70 64 61 74 65 22 20 63 6f 6d 6d 61 6e 64  "update" command
24d80 73 2e 0a 2a 2a 0a 2a 2a 20 43 72 65 61 74 65 20  s..**.** Create 
24d90 74 68 65 20 22 73 71 6c 61 72 22 20 74 61 62 6c  the "sqlar" tabl
24da0 65 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  e in the databas
24db0 65 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  e if it does not
24dc0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 0a   already exist..
24dd0 2a 2a 20 54 68 65 6e 20 61 64 64 20 65 61 63 68  ** Then add each
24de0 20 66 69 6c 65 20 69 6e 20 74 68 65 20 61 7a 46   file in the azF
24df0 69 6c 65 5b 5d 20 61 72 72 61 79 20 74 6f 20 74  ile[] array to t
24e00 68 65 20 61 72 63 68 69 76 65 2e 20 44 69 72 65  he archive. Dire
24e10 63 74 6f 72 69 65 73 0a 2a 2a 20 61 72 65 20 61  ctories.** are a
24e20 64 64 65 64 20 72 65 63 75 72 73 69 76 65 6c 79  dded recursively
24e30 2e 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 56  . If argument bV
24e40 65 72 62 6f 73 65 20 69 73 20 6e 6f 6e 2d 7a 65  erbose is non-ze
24e50 72 6f 2c 20 61 20 6d 65 73 73 61 67 65 20 69 73  ro, a message is
24e60 0a 2a 2a 20 70 72 69 6e 74 65 64 20 6f 6e 20 73  .** printed on s
24e70 74 64 6f 75 74 20 66 6f 72 20 65 61 63 68 20 66  tdout for each f
24e80 69 6c 65 20 61 72 63 68 69 76 65 64 2e 0a 2a 2a  ile archived..**
24e90 0a 2a 2a 20 54 68 65 20 63 72 65 61 74 65 20 63  .** The create c
24ea0 6f 6d 6d 61 6e 64 20 69 73 20 74 68 65 20 73 61  ommand is the sa
24eb0 6d 65 20 61 73 20 75 70 64 61 74 65 2c 20 65 78  me as update, ex
24ec0 63 65 70 74 20 74 68 61 74 20 69 74 20 64 72 6f  cept that it dro
24ed0 70 73 0a 2a 2a 20 61 6e 79 20 65 78 69 73 74 69  ps.** any existi
24ee0 6e 67 20 22 73 71 6c 61 72 22 20 74 61 62 6c 65  ng "sqlar" table
24ef0 20 62 65 66 6f 72 65 20 62 65 67 69 6e 6e 69 6e   before beginnin
24f00 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  g..*/.static int
24f10 20 61 72 43 72 65 61 74 65 55 70 64 61 74 65 28   arCreateUpdate(
24f20 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
24f30 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
24f40 20 20 20 2f 2a 20 53 68 65 6c 6c 20 73 74 61 74     /* Shell stat
24f50 65 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20 73  e pointer */.  s
24f60 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 41 72  qlite3 *db,.  Ar
24f70 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 20 20  Command *pAr,   
24f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24f90 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e   Command argumen
24fa0 74 73 20 61 6e 64 20 6f 70 74 69 6f 6e 73 20 2a  ts and options *
24fb0 2f 0a 20 20 69 6e 74 20 62 55 70 64 61 74 65 0a  /.  int bUpdate.
24fc0 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ){.  const char 
24fd0 2a 7a 53 71 6c 20 3d 20 22 53 45 4c 45 43 54 20  *zSql = "SELECT 
24fe0 6e 61 6d 65 2c 20 6d 6f 64 65 2c 20 6d 74 69 6d  name, mode, mtim
24ff0 65 2c 20 64 61 74 61 20 46 52 4f 4d 20 66 73 64  e, data FROM fsd
25000 69 72 28 3f 2c 20 3f 29 22 3b 0a 20 20 63 6f 6e  ir(?, ?)";.  con
25010 73 74 20 63 68 61 72 20 2a 7a 43 72 65 61 74 65  st char *zCreate
25020 20 3d 20 0a 20 20 20 20 20 20 22 43 52 45 41 54   = .      "CREAT
25030 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45  E TABLE IF NOT E
25040 58 49 53 54 53 20 73 71 6c 61 72 28 5c 6e 22 0a  XISTS sqlar(\n".
25050 20 20 20 20 20 20 22 20 20 6e 61 6d 65 20 54 45        "  name TE
25060 58 54 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20  XT PRIMARY KEY, 
25070 20 2d 2d 20 6e 61 6d 65 20 6f 66 20 74 68 65 20   -- name of the 
25080 66 69 6c 65 5c 6e 22 0a 20 20 20 20 20 20 22 20  file\n".      " 
25090 20 6d 6f 64 65 20 49 4e 54 2c 20 20 20 20 20 20   mode INT,      
250a0 20 20 20 20 20 20 20 20 20 2d 2d 20 61 63 63 65           -- acce
250b0 73 73 20 70 65 72 6d 69 73 73 69 6f 6e 73 5c 6e  ss permissions\n
250c0 22 0a 20 20 20 20 20 20 22 20 20 6d 74 69 6d 65  ".      "  mtime
250d0 20 49 4e 54 2c 20 20 20 20 20 20 20 20 20 20 20   INT,           
250e0 20 20 20 2d 2d 20 6c 61 73 74 20 6d 6f 64 69 66     -- last modif
250f0 69 63 61 74 69 6f 6e 20 74 69 6d 65 5c 6e 22 0a  ication time\n".
25100 20 20 20 20 20 20 22 20 20 73 7a 20 49 4e 54 2c        "  sz INT,
25110 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25120 20 2d 2d 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c   -- original fil
25130 65 20 73 69 7a 65 5c 6e 22 0a 20 20 20 20 20 20  e size\n".      
25140 22 20 20 64 61 74 61 20 42 4c 4f 42 20 20 20 20  "  data BLOB    
25150 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 63 6f             -- co
25160 6d 70 72 65 73 73 65 64 20 63 6f 6e 74 65 6e 74  mpressed content
25170 5c 6e 22 0a 20 20 20 20 20 20 22 29 22 3b 0a 20  \n".      ")";. 
25180 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 72   const char *zDr
25190 6f 70 20 3d 20 22 44 52 4f 50 20 54 41 42 4c 45  op = "DROP TABLE
251a0 20 49 46 20 45 58 49 53 54 53 20 73 71 6c 61 72   IF EXISTS sqlar
251b0 22 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  ";.  const char 
251c0 2a 7a 49 6e 73 65 72 74 20 3d 20 22 52 45 50 4c  *zInsert = "REPL
251d0 41 43 45 20 49 4e 54 4f 20 73 71 6c 61 72 20 56  ACE INTO sqlar V
251e0 41 4c 55 45 53 28 3f 2c 3f 2c 3f 2c 3f 2c 73 71  ALUES(?,?,?,?,sq
251f0 6c 61 72 5f 63 6f 6d 70 72 65 73 73 28 3f 29 29  lar_compress(?))
25200 22 3b 0a 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  ";..  sqlite3_st
25210 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 20 20  mt *pStmt = 0;  
25220 20 20 20 20 20 20 2f 2a 20 44 69 72 65 63 74 6f        /* Directo
25230 72 79 20 74 72 61 76 65 72 73 65 72 20 2a 2f 0a  ry traverser */.
25240 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
25250 70 49 6e 73 65 72 74 20 3d 20 30 3b 20 20 20 20  pInsert = 0;    
25260 20 20 2f 2a 20 43 6f 6d 70 69 6c 61 74 69 6f 6e    /* Compilation
25270 20 6f 66 20 7a 49 6e 73 65 72 74 20 2a 2f 0a 20   of zInsert */. 
25280 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
25290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252a0 20 2f 2a 20 46 6f 72 20 69 74 65 72 61 74 69 6e   /* For iteratin
252b0 67 20 74 68 72 6f 75 67 68 20 61 7a 46 69 6c 65  g through azFile
252c0 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  [] */.  int rc; 
252d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
252e0 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
252f0 6e 20 63 6f 64 65 20 2a 2f 0a 0a 20 20 61 73 73  n code */..  ass
25300 65 72 74 28 20 70 41 72 2d 3e 62 5a 69 70 3d 3d  ert( pAr->bZip==
25310 30 20 29 3b 0a 0a 20 20 72 63 20 3d 20 73 71 6c  0 );..  rc = sql
25320 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 22 53  ite3_exec(db, "S
25330 41 56 45 50 4f 49 4e 54 20 61 72 3b 22 2c 20 30  AVEPOINT ar;", 0
25340 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  , 0, 0);.  if( r
25350 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72  c!=SQLITE_OK ) r
25360 65 74 75 72 6e 20 72 63 3b 0a 0a 20 20 69 66 28  eturn rc;..  if(
25370 20 62 55 70 64 61 74 65 3d 3d 30 20 29 7b 0a 20   bUpdate==0 ){. 
25380 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
25390 65 78 65 63 28 64 62 2c 20 7a 44 72 6f 70 2c 20  exec(db, zDrop, 
253a0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 69 66  0, 0, 0);.    if
253b0 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
253c0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d  ) return rc;.  }
253d0 0a 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ..  rc = sqlite3
253e0 5f 65 78 65 63 28 64 62 2c 20 7a 43 72 65 61 74  _exec(db, zCreat
253f0 65 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 73  e, 0, 0, 0);.  s
25400 68 65 6c 6c 50 72 65 70 61 72 65 28 64 62 2c 20  hellPrepare(db, 
25410 26 72 63 2c 20 7a 49 6e 73 65 72 74 2c 20 26 70  &rc, zInsert, &p
25420 49 6e 73 65 72 74 29 3b 0a 20 20 73 68 65 6c 6c  Insert);.  shell
25430 50 72 65 70 61 72 65 28 64 62 2c 20 26 72 63 2c  Prepare(db, &rc,
25440 20 7a 53 71 6c 2c 20 26 70 53 74 6d 74 29 3b 0a   zSql, &pStmt);.
25450 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
25460 65 78 74 28 70 53 74 6d 74 2c 20 32 2c 20 70 41  ext(pStmt, 2, pA
25470 72 2d 3e 7a 44 69 72 2c 20 2d 31 2c 20 53 51 4c  r->zDir, -1, SQL
25480 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 0a 20 20  ITE_STATIC);..  
25490 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 72 2d 3e  for(i=0; i<pAr->
254a0 6e 41 72 67 20 26 26 20 72 63 3d 3d 53 51 4c 49  nArg && rc==SQLI
254b0 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20  TE_OK; i++){.   
254c0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
254d0 78 74 28 70 53 74 6d 74 2c 20 31 2c 20 70 41 72  xt(pStmt, 1, pAr
254e0 2d 3e 61 7a 41 72 67 5b 69 5d 2c 20 2d 31 2c 20  ->azArg[i], -1, 
254f0 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
25500 20 20 20 20 77 68 69 6c 65 28 20 72 63 3d 3d 53      while( rc==S
25510 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53 51 4c 49  QLITE_OK && SQLI
25520 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
25530 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
25540 20 20 20 20 20 69 6e 74 20 73 7a 3b 0a 20 20 20       int sz;.   
25550 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
25560 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  Name = (const ch
25570 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
25580 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30  mn_text(pStmt, 0
25590 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6d 6f 64  );.      int mod
255a0 65 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  e = sqlite3_colu
255b0 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 31 29  mn_int(pStmt, 1)
255c0 3b 0a 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64  ;.      unsigned
255d0 20 69 6e 74 20 6d 74 69 6d 65 20 3d 20 73 71 6c   int mtime = sql
255e0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
255f0 70 53 74 6d 74 2c 20 32 29 3b 0a 0a 20 20 20 20  pStmt, 2);..    
25600 20 20 69 66 28 20 70 41 72 2d 3e 62 56 65 72 62    if( pAr->bVerb
25610 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ose ){.        r
25620 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
25630 2c 20 22 25 73 5c 6e 22 2c 20 7a 4e 61 6d 65 29  , "%s\n", zName)
25640 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
25650 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
25660 78 74 28 70 49 6e 73 65 72 74 2c 20 31 2c 20 7a  xt(pInsert, 1, z
25670 4e 61 6d 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45  Name, -1, SQLITE
25680 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
25690 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74  sqlite3_bind_int
256a0 28 70 49 6e 73 65 72 74 2c 20 32 2c 20 6d 6f 64  (pInsert, 2, mod
256b0 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
256c0 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 49 6e  3_bind_int64(pIn
256d0 73 65 72 74 2c 20 33 2c 20 28 73 71 6c 69 74 65  sert, 3, (sqlite
256e0 33 5f 69 6e 74 36 34 29 6d 74 69 6d 65 29 3b 0a  3_int64)mtime);.
256f0 0a 20 20 20 20 20 20 69 66 28 20 53 5f 49 53 44  .      if( S_ISD
25700 49 52 28 6d 6f 64 65 29 20 29 7b 0a 20 20 20 20  IR(mode) ){.    
25710 20 20 20 20 73 7a 20 3d 20 30 3b 0a 20 20 20 20      sz = 0;.    
25720 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
25730 5f 6e 75 6c 6c 28 70 49 6e 73 65 72 74 2c 20 35  _null(pInsert, 5
25740 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
25750 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
25760 62 69 6e 64 5f 76 61 6c 75 65 28 70 49 6e 73 65  bind_value(pInse
25770 72 74 2c 20 35 2c 20 73 71 6c 69 74 65 33 5f 63  rt, 5, sqlite3_c
25780 6f 6c 75 6d 6e 5f 76 61 6c 75 65 28 70 53 74 6d  olumn_value(pStm
25790 74 2c 20 33 29 29 3b 0a 20 20 20 20 20 20 20 20  t, 3));.        
257a0 69 66 28 20 53 5f 49 53 4c 4e 4b 28 6d 6f 64 65  if( S_ISLNK(mode
257b0 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ) ){.          s
257c0 7a 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  z = -1;.        
257d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
257e0 20 73 7a 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f   sz = sqlite3_co
257f0 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d 74  lumn_bytes(pStmt
25800 2c 20 33 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 3);.        }.
25810 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 73        }..      s
25820 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e 74 28  qlite3_bind_int(
25830 70 49 6e 73 65 72 74 2c 20 34 2c 20 73 7a 29 3b  pInsert, 4, sz);
25840 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
25850 74 65 70 28 70 49 6e 73 65 72 74 29 3b 0a 20 20  tep(pInsert);.  
25860 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
25870 5f 72 65 73 65 74 28 70 49 6e 73 65 72 74 29 3b  _reset(pInsert);
25880 0a 20 20 20 20 7d 0a 20 20 20 20 73 68 65 6c 6c  .    }.    shell
25890 52 65 73 65 74 28 26 72 63 2c 20 70 53 74 6d 74  Reset(&rc, pStmt
258a0 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63  );.  }..  if( rc
258b0 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
258c0 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28     sqlite3_exec(
258d0 64 62 2c 20 22 52 4f 4c 4c 42 41 43 4b 20 54 4f  db, "ROLLBACK TO
258e0 20 61 72 3b 20 52 45 4c 45 41 53 45 20 61 72 3b   ar; RELEASE ar;
258f0 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  ", 0, 0, 0);.  }
25900 65 6c 73 65 7b 0a 20 20 20 20 72 63 20 3d 20 73  else{.    rc = s
25910 71 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20  qlite3_exec(db, 
25920 22 52 45 4c 45 41 53 45 20 61 72 3b 22 2c 20 30  "RELEASE ar;", 0
25930 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  , 0, 0);.  }.  s
25940 68 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63  hellFinalize(&rc
25950 2c 20 70 53 74 6d 74 29 3b 0a 20 20 73 68 65 6c  , pStmt);.  shel
25960 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70  lFinalize(&rc, p
25970 49 6e 73 65 72 74 29 3b 0a 20 20 72 65 74 75 72  Insert);.  retur
25980 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  n rc;.}../*.** I
25990 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
259a0 20 2e 61 72 20 22 43 72 65 61 74 65 22 20 63 6f   .ar "Create" co
259b0 6d 6d 61 6e 64 2e 20 0a 2a 2a 0a 2a 2a 20 43 72  mmand. .**.** Cr
259c0 65 61 74 65 20 74 68 65 20 22 73 71 6c 61 72 22  eate the "sqlar"
259d0 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 64 61   table in the da
259e0 74 61 62 61 73 65 20 69 66 20 69 74 20 64 6f 65  tabase if it doe
259f0 73 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78  s not already ex
25a00 69 73 74 2e 0a 2a 2a 20 54 68 65 6e 20 61 64 64  ist..** Then add
25a10 20 65 61 63 68 20 66 69 6c 65 20 69 6e 20 74 68   each file in th
25a20 65 20 61 7a 46 69 6c 65 5b 5d 20 61 72 72 61 79  e azFile[] array
25a30 20 74 6f 20 74 68 65 20 61 72 63 68 69 76 65 2e   to the archive.
25a40 20 44 69 72 65 63 74 6f 72 69 65 73 0a 2a 2a 20   Directories.** 
25a50 61 72 65 20 61 64 64 65 64 20 72 65 63 75 72 73  are added recurs
25a60 69 76 65 6c 79 2e 20 49 66 20 61 72 67 75 6d 65  ively. If argume
25a70 6e 74 20 62 56 65 72 62 6f 73 65 20 69 73 20 6e  nt bVerbose is n
25a80 6f 6e 2d 7a 65 72 6f 2c 20 61 20 6d 65 73 73 61  on-zero, a messa
25a90 67 65 20 69 73 0a 2a 2a 20 70 72 69 6e 74 65 64  ge is.** printed
25aa0 20 6f 6e 20 73 74 64 6f 75 74 20 66 6f 72 20 65   on stdout for e
25ab0 61 63 68 20 66 69 6c 65 20 61 72 63 68 69 76 65  ach file archive
25ac0 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
25ad0 20 61 72 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64   arCreateCommand
25ae0 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  (.  ShellState *
25af0 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
25b00 20 20 20 20 2f 2a 20 53 68 65 6c 6c 20 73 74 61      /* Shell sta
25b10 74 65 20 70 6f 69 6e 74 65 72 20 2a 2f 0a 20 20  te pointer */.  
25b20 73 71 6c 69 74 65 33 20 2a 64 62 2c 0a 20 20 41  sqlite3 *db,.  A
25b30 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 20 20 20  rCommand *pAr   
25b40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
25b50 2a 20 43 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65  * Command argume
25b60 6e 74 73 20 61 6e 64 20 6f 70 74 69 6f 6e 73 20  nts and options 
25b70 2a 2f 0a 29 7b 0a 20 20 72 65 74 75 72 6e 20 61  */.){.  return a
25b80 72 43 72 65 61 74 65 55 70 64 61 74 65 28 70 2c  rCreateUpdate(p,
25b90 20 64 62 2c 20 70 41 72 2c 20 30 29 3b 0a 7d 0a   db, pAr, 0);.}.
25ba0 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
25bb0 61 74 69 6f 6e 20 6f 66 20 2e 61 72 20 22 55 70  ation of .ar "Up
25bc0 64 61 74 65 22 20 63 6f 6d 6d 61 6e 64 2e 20 0a  date" command. .
25bd0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72  */.static int ar
25be0 55 70 64 61 74 65 43 6d 64 28 53 68 65 6c 6c 53  UpdateCmd(ShellS
25bf0 74 61 74 65 20 2a 70 2c 20 73 71 6c 69 74 65 33  tate *p, sqlite3
25c00 20 2a 64 62 2c 20 41 72 43 6f 6d 6d 61 6e 64 20   *db, ArCommand 
25c10 2a 70 41 72 29 7b 0a 20 20 72 65 74 75 72 6e 20  *pAr){.  return 
25c20 61 72 43 72 65 61 74 65 55 70 64 61 74 65 28 70  arCreateUpdate(p
25c30 2c 20 64 62 2c 20 70 41 72 2c 20 31 29 3b 0a 7d  , db, pAr, 1);.}
25c40 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  .../*.** Impleme
25c50 6e 74 61 74 69 6f 6e 20 6f 66 20 22 2e 61 72 22  ntation of ".ar"
25c60 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f   dot command..*/
25c70 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 44 6f  .static int arDo
25c80 74 43 6f 6d 6d 61 6e 64 28 0a 20 20 53 68 65 6c  tCommand(.  Shel
25c90 6c 53 74 61 74 65 20 2a 70 53 74 61 74 65 2c 20  lState *pState, 
25ca0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43              /* C
25cb0 75 72 72 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f  urrent shell too
25cc0 6c 20 73 74 61 74 65 20 2a 2f 0a 20 20 63 68 61  l state */.  cha
25cd0 72 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20 20  r **azArg,      
25ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
25cf0 41 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e  Array of argumen
25d00 74 73 20 70 61 73 73 65 64 20 74 6f 20 64 6f 74  ts passed to dot
25d10 20 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e   command */.  in
25d20 74 20 6e 41 72 67 20 20 20 20 20 20 20 20 20 20  t nArg          
25d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
25d40 20 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69   Number of entri
25d50 65 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f  es in azArg[] */
25d60 0a 29 7b 0a 20 20 41 72 43 6f 6d 6d 61 6e 64 20  .){.  ArCommand 
25d70 63 6d 64 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  cmd;.  int rc;. 
25d80 20 72 63 20 3d 20 61 72 50 61 72 73 65 43 6f 6d   rc = arParseCom
25d90 6d 61 6e 64 28 61 7a 41 72 67 2c 20 6e 41 72 67  mand(azArg, nArg
25da0 2c 20 26 63 6d 64 29 3b 0a 20 20 69 66 28 20 72  , &cmd);.  if( r
25db0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
25dc0 20 20 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20      sqlite3 *db 
25dd0 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
25de0 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 68 61    /* Database ha
25df0 6e 64 6c 65 20 74 6f 20 75 73 65 20 61 73 20 61  ndle to use as a
25e00 72 63 68 69 76 65 20 2a 2f 0a 0a 20 20 20 20 69  rchive */..    i
25e10 66 28 20 63 6d 64 2e 62 5a 69 70 20 29 7b 0a 20  f( cmd.bZip ){. 
25e20 20 20 20 20 20 69 66 28 20 63 6d 64 2e 7a 46 69       if( cmd.zFi
25e30 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  le==0 ){.       
25e40 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
25e50 72 72 2c 20 22 7a 69 70 20 66 6f 72 6d 61 74 20  rr, "zip format 
25e60 72 65 71 75 69 72 65 73 20 61 20 2d 2d 66 69 6c  requires a --fil
25e70 65 20 73 77 69 74 63 68 5c 6e 22 29 3b 0a 20 20  e switch\n");.  
25e80 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
25e90 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
25ea0 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28   }else.      if(
25eb0 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d   cmd.eCmd==AR_CM
25ec0 44 5f 43 52 45 41 54 45 20 7c 7c 20 63 6d 64 2e  D_CREATE || cmd.
25ed0 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 55 50 44  eCmd==AR_CMD_UPD
25ee0 41 54 45 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ATE ){.        r
25ef0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
25f00 2c 20 22 7a 69 70 20 61 72 63 68 69 76 65 73 20  , "zip archives 
25f10 61 72 65 20 72 65 61 64 2d 6f 6e 6c 79 5c 6e 22  are read-only\n"
25f20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
25f30 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a  n SQLITE_ERROR;.
25f40 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 64 62        }.      db
25f50 20 3d 20 70 53 74 61 74 65 2d 3e 64 62 3b 0a 20   = pState->db;. 
25f60 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 6d 64     }else if( cmd
25f70 2e 7a 46 69 6c 65 20 29 7b 0a 20 20 20 20 20 20  .zFile ){.      
25f80 69 6e 74 20 66 6c 61 67 73 3b 0a 20 20 20 20 20  int flags;.     
25f90 20 69 66 28 20 63 6d 64 2e 65 43 6d 64 3d 3d 41   if( cmd.eCmd==A
25fa0 52 5f 43 4d 44 5f 43 52 45 41 54 45 20 7c 7c 20  R_CMD_CREATE || 
25fb0 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44  cmd.eCmd==AR_CMD
25fc0 5f 55 50 44 41 54 45 20 29 7b 0a 20 20 20 20 20  _UPDATE ){.     
25fd0 20 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49 54     flags = SQLIT
25fe0 45 5f 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45  E_OPEN_READWRITE
25ff0 7c 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 43 52 45  |SQLITE_OPEN_CRE
26000 41 54 45 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ATE;.      }else
26010 7b 0a 20 20 20 20 20 20 20 20 66 6c 61 67 73 20  {.        flags 
26020 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e 5f 52 45  = SQLITE_OPEN_RE
26030 41 44 4f 4e 4c 59 3b 0a 20 20 20 20 20 20 7d 0a  ADONLY;.      }.
26040 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
26050 65 33 5f 6f 70 65 6e 5f 76 32 28 63 6d 64 2e 7a  e3_open_v2(cmd.z
26060 46 69 6c 65 2c 20 26 64 62 2c 20 66 6c 61 67 73  File, &db, flags
26070 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
26080 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
26090 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
260a0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 63 61 6e  ntf(stderr, "can
260b0 6e 6f 74 20 6f 70 65 6e 20 66 69 6c 65 3a 20 25  not open file: %
260c0 73 20 28 25 73 29 5c 6e 22 2c 20 0a 20 20 20 20  s (%s)\n", .    
260d0 20 20 20 20 20 20 20 20 63 6d 64 2e 7a 46 69 6c          cmd.zFil
260e0 65 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  e, sqlite3_errms
260f0 67 28 64 62 29 0a 20 20 20 20 20 20 20 20 29 3b  g(db).        );
26100 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
26110 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20  _close(db);.    
26120 20 20 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20      return rc;. 
26130 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
26140 69 74 65 33 5f 66 69 6c 65 69 6f 5f 69 6e 69 74  ite3_fileio_init
26150 28 64 62 2c 20 30 2c 20 30 29 3b 0a 23 69 66 64  (db, 0, 0);.#ifd
26160 65 66 20 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a  ef SQLITE_HAVE_Z
26170 4c 49 42 0a 20 20 20 20 20 20 73 71 6c 69 74 65  LIB.      sqlite
26180 33 5f 73 71 6c 61 72 5f 69 6e 69 74 28 64 62 2c  3_sqlar_init(db,
26190 20 30 2c 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20   0, 0);.#endif. 
261a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
261b0 64 62 20 3d 20 70 53 74 61 74 65 2d 3e 64 62 3b  db = pState->db;
261c0 0a 20 20 20 20 7d 0a 0a 20 20 20 20 73 77 69 74  .    }..    swit
261d0 63 68 28 20 63 6d 64 2e 65 43 6d 64 20 29 7b 0a  ch( cmd.eCmd ){.
261e0 20 20 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d        case AR_CM
261f0 44 5f 43 52 45 41 54 45 3a 0a 20 20 20 20 20 20  D_CREATE:.      
26200 20 20 72 63 20 3d 20 61 72 43 72 65 61 74 65 43    rc = arCreateC
26210 6f 6d 6d 61 6e 64 28 70 53 74 61 74 65 2c 20 64  ommand(pState, d
26220 62 2c 20 26 63 6d 64 29 3b 0a 20 20 20 20 20 20  b, &cmd);.      
26230 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
26240 63 61 73 65 20 41 52 5f 43 4d 44 5f 45 58 54 52  case AR_CMD_EXTR
26250 41 43 54 3a 0a 20 20 20 20 20 20 20 20 72 63 20  ACT:.        rc 
26260 3d 20 61 72 45 78 74 72 61 63 74 43 6f 6d 6d 61  = arExtractComma
26270 6e 64 28 70 53 74 61 74 65 2c 20 64 62 2c 20 26  nd(pState, db, &
26280 63 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72  cmd);.        br
26290 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65  eak;..      case
262a0 20 41 52 5f 43 4d 44 5f 4c 49 53 54 3a 0a 20 20   AR_CMD_LIST:.  
262b0 20 20 20 20 20 20 72 63 20 3d 20 61 72 4c 69 73        rc = arLis
262c0 74 43 6f 6d 6d 61 6e 64 28 70 53 74 61 74 65 2c  tCommand(pState,
262d0 20 64 62 2c 20 26 63 6d 64 29 3b 0a 20 20 20 20   db, &cmd);.    
262e0 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
262f0 20 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 48 45    case AR_CMD_HE
26300 4c 50 3a 0a 20 20 20 20 20 20 20 20 61 72 55 73  LP:.        arUs
26310 61 67 65 28 70 53 74 61 74 65 2d 3e 6f 75 74 29  age(pState->out)
26320 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
26330 0a 0a 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a  ..      default:
26340 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
26350 20 63 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d   cmd.eCmd==AR_CM
26360 44 5f 55 50 44 41 54 45 20 29 3b 0a 20 20 20 20  D_UPDATE );.    
26370 20 20 20 20 72 63 20 3d 20 61 72 55 70 64 61 74      rc = arUpdat
26380 65 43 6d 64 28 70 53 74 61 74 65 2c 20 64 62 2c  eCmd(pState, db,
26390 20 26 63 6d 64 29 3b 0a 20 20 20 20 20 20 20 20   &cmd);.        
263a0 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
263b0 20 20 69 66 28 20 63 6d 64 2e 7a 46 69 6c 65 20    if( cmd.zFile 
263c0 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
263d0 5f 63 6c 6f 73 65 28 64 62 29 3b 0a 20 20 20 20  _close(db);.    
263e0 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
263f0 72 63 3b 0a 7d 0a 2f 2a 20 45 6e 64 20 6f 66 20  rc;.}./* End of 
26400 74 68 65 20 22 2e 61 72 63 68 69 76 65 22 20 6f  the ".archive" o
26410 72 20 22 2e 61 72 22 20 63 6f 6d 6d 61 6e 64 20  r ".ar" command 
26420 6c 6f 67 69 63 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  logic.**********
26430 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26440 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26450 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26460 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
26470 2a 2a 2a 2a 2a 2a 2a 2a 2f 0a 23 65 6e 64 69 66  ********/.#endif
26480 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
26490 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
264a0 54 41 42 4c 45 29 20 26 26 20 64 65 66 69 6e 65  TABLE) && define
264b0 64 28 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c  d(SQLITE_HAVE_ZL
264c0 49 42 29 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 49 6d  IB) */../*.** Im
264d0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
264e0 22 2e 65 78 70 65 72 74 22 20 64 6f 74 20 63 6f  ".expert" dot co
264f0 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  mmand..*/.static
26500 20 69 6e 74 20 65 78 70 65 72 74 44 6f 74 43 6f   int expertDotCo
26510 6d 6d 61 6e 64 28 0a 20 20 53 68 65 6c 6c 53 74  mmand(.  ShellSt
26520 61 74 65 20 2a 70 53 74 61 74 65 2c 20 20 20 20  ate *pState,    
26530 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
26540 65 6e 74 20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73  ent shell tool s
26550 74 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a  tate */.  char *
26560 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20 20 20  *azArg,         
26570 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72 72            /* Arr
26580 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  ay of arguments 
26590 70 61 73 73 65 64 20 74 6f 20 64 6f 74 20 63 6f  passed to dot co
265a0 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  mmand */.  int n
265b0 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20 20  Arg             
265c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
265d0 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65 73 20  mber of entries 
265e0 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b  in azArg[] */.){
265f0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
26600 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a  TE_OK;.  char *z
26610 45 72 72 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69  Err = 0;.  int i
26620 3b 0a 20 20 69 6e 74 20 69 53 61 6d 70 6c 65 20  ;.  int iSample 
26630 3d 20 30 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  = 0;..  assert( 
26640 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70  pState->expert.p
26650 45 78 70 65 72 74 3d 3d 30 20 29 3b 0a 20 20 6d  Expert==0 );.  m
26660 65 6d 73 65 74 28 26 70 53 74 61 74 65 2d 3e 65  emset(&pState->e
26670 78 70 65 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66  xpert, 0, sizeof
26680 28 45 78 70 65 72 74 49 6e 66 6f 29 29 3b 0a 0a  (ExpertInfo));..
26690 20 20 66 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53    for(i=1; rc==S
266a0 51 4c 49 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 41  QLITE_OK && i<nA
266b0 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68  rg; i++){.    ch
266c0 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d  ar *z = azArg[i]
266d0 3b 0a 20 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20  ;.    int n;.   
266e0 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26   if( z[0]=='-' &
266f0 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b  & z[1]=='-' ) z+
26700 2b 3b 0a 20 20 20 20 6e 20 3d 20 73 74 72 6c 65  +;.    n = strle
26710 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69 66 28 20  n30(z);.    if( 
26720 6e 3e 3d 32 20 26 26 20 30 3d 3d 73 74 72 6e 63  n>=2 && 0==strnc
26730 6d 70 28 7a 2c 20 22 2d 76 65 72 62 6f 73 65 22  mp(z, "-verbose"
26740 2c 20 6e 29 20 29 7b 0a 20 20 20 20 20 20 70 53  , n) ){.      pS
26750 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 62 56 65  tate->expert.bVe
26760 72 62 6f 73 65 20 3d 20 31 3b 0a 20 20 20 20 7d  rbose = 1;.    }
26770 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 6e 3e  .    else if( n>
26780 3d 32 20 26 26 20 30 3d 3d 73 74 72 6e 63 6d 70  =2 && 0==strncmp
26790 28 7a 2c 20 22 2d 73 61 6d 70 6c 65 22 2c 20 6e  (z, "-sample", n
267a0 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  ) ){.      if( i
267b0 3d 3d 28 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20  ==(nArg-1) ){.  
267c0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
267d0 28 73 74 64 65 72 72 2c 20 22 6f 70 74 69 6f 6e  (stderr, "option
267e0 20 72 65 71 75 69 72 65 73 20 61 6e 20 61 72 67   requires an arg
267f0 75 6d 65 6e 74 3a 20 25 73 5c 6e 22 2c 20 7a 29  ument: %s\n", z)
26800 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53  ;.        rc = S
26810 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
26820 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26830 20 20 69 53 61 6d 70 6c 65 20 3d 20 28 69 6e 74    iSample = (int
26840 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a  )integerValue(az
26850 41 72 67 5b 2b 2b 69 5d 29 3b 0a 20 20 20 20 20  Arg[++i]);.     
26860 20 20 20 69 66 28 20 69 53 61 6d 70 6c 65 3c 30     if( iSample<0
26870 20 7c 7c 20 69 53 61 6d 70 6c 65 3e 31 30 30 20   || iSample>100 
26880 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  ){.          raw
26890 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
268a0 22 76 61 6c 75 65 20 6f 75 74 20 6f 66 20 72 61  "value out of ra
268b0 6e 67 65 3a 20 25 73 5c 6e 22 2c 20 61 7a 41 72  nge: %s\n", azAr
268c0 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  g[i]);.         
268d0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
268e0 4f 52 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  OR;.        }.  
268f0 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
26900 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
26910 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
26920 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20  unknown option: 
26930 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20  %s\n", z);.     
26940 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
26950 4f 52 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  OR;.    }.  }.. 
26960 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f   if( rc==SQLITE_
26970 4f 4b 20 29 7b 0a 20 20 20 20 70 53 74 61 74 65  OK ){.    pState
26980 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74  ->expert.pExpert
26990 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72   = sqlite3_exper
269a0 74 5f 6e 65 77 28 70 53 74 61 74 65 2d 3e 64 62  t_new(pState->db
269b0 2c 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 69 66  , &zErr);.    if
269c0 28 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74  ( pState->expert
269d0 2e 70 45 78 70 65 72 74 3d 3d 30 20 29 7b 0a 20  .pExpert==0 ){. 
269e0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
269f0 73 74 64 65 72 72 2c 20 22 73 71 6c 69 74 65 33  stderr, "sqlite3
26a00 5f 65 78 70 65 72 74 5f 6e 65 77 3a 20 25 73 5c  _expert_new: %s\
26a10 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 20  n", zErr);.     
26a20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
26a30 4f 52 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  OR;.    }else{. 
26a40 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 70       sqlite3_exp
26a50 65 72 74 5f 63 6f 6e 66 69 67 28 0a 20 20 20 20  ert_config(.    
26a60 20 20 20 20 20 20 70 53 74 61 74 65 2d 3e 65 78        pState->ex
26a70 70 65 72 74 2e 70 45 78 70 65 72 74 2c 20 45 58  pert.pExpert, EX
26a80 50 45 52 54 5f 43 4f 4e 46 49 47 5f 53 41 4d 50  PERT_CONFIG_SAMP
26a90 4c 45 2c 20 69 53 61 6d 70 6c 65 0a 20 20 20 20  LE, iSample.    
26aa0 20 20 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a    );.    }.  }..
26ab0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
26ac0 0a 2f 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 70  ./*.** If an inp
26ad0 75 74 20 6c 69 6e 65 20 62 65 67 69 6e 73 20 77  ut line begins w
26ae0 69 74 68 20 22 2e 22 20 74 68 65 6e 20 69 6e 76  ith "." then inv
26af0 6f 6b 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65  oke this routine
26b00 20 74 6f 0a 2a 2a 20 70 72 6f 63 65 73 73 20 74   to.** process t
26b10 68 61 74 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20  hat line..**.** 
26b20 52 65 74 75 72 6e 20 31 20 6f 6e 20 65 72 72 6f  Return 1 on erro
26b30 72 2c 20 32 20 74 6f 20 65 78 69 74 2c 20 61 6e  r, 2 to exit, an
26b40 64 20 30 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a  d 0 otherwise..*
26b50 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 6f 5f  /.static int do_
26b60 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 28 63 68 61  meta_command(cha
26b70 72 20 2a 7a 4c 69 6e 65 2c 20 53 68 65 6c 6c 53  r *zLine, ShellS
26b80 74 61 74 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tate *p){.  int 
26b90 68 20 3d 20 31 3b 0a 20 20 69 6e 74 20 6e 41 72  h = 1;.  int nAr
26ba0 67 20 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 2c 20  g = 0;.  int n, 
26bb0 63 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b  c;.  int rc = 0;
26bc0 0a 20 20 63 68 61 72 20 2a 61 7a 41 72 67 5b 35  .  char *azArg[5
26bd0 30 5d 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 65 78  0];..  if( p->ex
26be0 70 65 72 74 2e 70 45 78 70 65 72 74 20 29 7b 0a  pert.pExpert ){.
26bf0 20 20 20 20 65 78 70 65 72 74 46 69 6e 69 73 68      expertFinish
26c00 28 70 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a  (p, 1, 0);.  }..
26c10 20 20 2f 2a 20 50 61 72 73 65 20 74 68 65 20 69    /* Parse the i
26c20 6e 70 75 74 20 6c 69 6e 65 20 69 6e 74 6f 20 74  nput line into t
26c30 6f 6b 65 6e 73 2e 0a 20 20 2a 2f 0a 20 20 77 68  okens..  */.  wh
26c40 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20 26 26  ile( zLine[h] &&
26c50 20 6e 41 72 67 3c 41 72 72 61 79 53 69 7a 65 28   nArg<ArraySize(
26c60 61 7a 41 72 67 29 20 29 7b 0a 20 20 20 20 77 68  azArg) ){.    wh
26c70 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 4c 69  ile( IsSpace(zLi
26c80 6e 65 5b 68 5d 29 20 29 7b 20 68 2b 2b 3b 20 7d  ne[h]) ){ h++; }
26c90 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68  .    if( zLine[h
26ca0 5d 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  ]==0 ) break;.  
26cb0 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d    if( zLine[h]==
26cc0 27 5c 27 27 20 7c 7c 20 7a 4c 69 6e 65 5b 68 5d  '\'' || zLine[h]
26cd0 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20 20 69  =='"' ){.      i
26ce0 6e 74 20 64 65 6c 69 6d 20 3d 20 7a 4c 69 6e 65  nt delim = zLine
26cf0 5b 68 2b 2b 5d 3b 0a 20 20 20 20 20 20 61 7a 41  [h++];.      azA
26d00 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26 7a 4c  rg[nArg++] = &zL
26d10 69 6e 65 5b 68 5d 3b 0a 20 20 20 20 20 20 77 68  ine[h];.      wh
26d20 69 6c 65 28 20 7a 4c 69 6e 65 5b 68 5d 20 26 26  ile( zLine[h] &&
26d30 20 7a 4c 69 6e 65 5b 68 5d 21 3d 64 65 6c 69 6d   zLine[h]!=delim
26d40 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
26d50 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 5c 5c 27 20 26  zLine[h]=='\\' &
26d60 26 20 64 65 6c 69 6d 3d 3d 27 22 27 20 26 26 20  & delim=='"' && 
26d70 7a 4c 69 6e 65 5b 68 2b 31 5d 21 3d 30 20 29 20  zLine[h+1]!=0 ) 
26d80 68 2b 2b 3b 0a 20 20 20 20 20 20 20 20 68 2b 2b  h++;.        h++
26d90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
26da0 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 64 65  if( zLine[h]==de
26db0 6c 69 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  lim ){.        z
26dc0 4c 69 6e 65 5b 68 2b 2b 5d 20 3d 20 30 3b 0a 20  Line[h++] = 0;. 
26dd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
26de0 20 64 65 6c 69 6d 3d 3d 27 22 27 20 29 20 72 65   delim=='"' ) re
26df0 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68 65  solve_backslashe
26e00 73 28 61 7a 41 72 67 5b 6e 41 72 67 2d 31 5d 29  s(azArg[nArg-1])
26e10 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
26e20 20 20 20 61 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d     azArg[nArg++]
26e30 20 3d 20 26 7a 4c 69 6e 65 5b 68 5d 3b 0a 20 20   = &zLine[h];.  
26e40 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65      while( zLine
26e50 5b 68 5d 20 26 26 20 21 49 73 53 70 61 63 65 28  [h] && !IsSpace(
26e60 7a 4c 69 6e 65 5b 68 5d 29 20 29 7b 20 68 2b 2b  zLine[h]) ){ h++
26e70 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4c  ; }.      if( zL
26e80 69 6e 65 5b 68 5d 20 29 20 7a 4c 69 6e 65 5b 68  ine[h] ) zLine[h
26e90 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72  ++] = 0;.      r
26ea0 65 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68  esolve_backslash
26eb0 65 73 28 61 7a 41 72 67 5b 6e 41 72 67 2d 31 5d  es(azArg[nArg-1]
26ec0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  );.    }.  }..  
26ed0 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20 69  /* Process the i
26ee0 6e 70 75 74 20 6c 69 6e 65 2e 0a 20 20 2a 2f 0a  nput line..  */.
26ef0 20 20 69 66 28 20 6e 41 72 67 3d 3d 30 20 29 20    if( nArg==0 ) 
26f00 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 6e 6f 20  return 0; /* no 
26f10 74 6f 6b 65 6e 73 2c 20 6e 6f 20 65 72 72 6f 72  tokens, no error
26f20 20 2a 2f 0a 20 20 6e 20 3d 20 73 74 72 6c 65 6e   */.  n = strlen
26f30 33 30 28 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20  30(azArg[0]);.  
26f40 63 20 3d 20 61 7a 41 72 67 5b 30 5d 5b 30 5d 3b  c = azArg[0][0];
26f50 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
26f60 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
26f70 49 4f 4e 0a 20 20 69 66 28 20 63 3d 3d 27 61 27  ION.  if( c=='a'
26f80 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
26f90 67 5b 30 5d 2c 20 22 61 75 74 68 22 2c 20 6e 29  g[0], "auth", n)
26fa0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
26fb0 41 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg!=2 ){.      
26fc0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
26fd0 72 2c 20 22 55 73 61 67 65 3a 20 2e 61 75 74 68  r, "Usage: .auth
26fe0 20 4f 4e 7c 4f 46 46 5c 6e 22 29 3b 0a 20 20 20   ON|OFF\n");.   
26ff0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
27000 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
27010 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20  nd_exit;.    }. 
27020 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
27030 3b 0a 20 20 20 20 69 66 28 20 62 6f 6f 6c 65 61  ;.    if( boolea
27040 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29  nValue(azArg[1])
27050 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
27060 33 5f 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72  3_set_authorizer
27070 28 70 2d 3e 64 62 2c 20 73 68 65 6c 6c 41 75 74  (p->db, shellAut
27080 68 2c 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65  h, p);.    }else
27090 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
270a0 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70  set_authorizer(p
270b0 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ->db, 0, 0);.   
270c0 20 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69   }.  }else.#endi
270d0 66 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  f..#if !defined(
270e0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54  SQLITE_OMIT_VIRT
270f0 55 41 4c 54 41 42 4c 45 29 20 26 26 20 64 65 66  UALTABLE) && def
27100 69 6e 65 64 28 53 51 4c 49 54 45 5f 48 41 56 45  ined(SQLITE_HAVE
27110 5f 5a 4c 49 42 29 0a 20 20 69 66 28 20 63 3d 3d  _ZLIB).  if( c==
27120 27 61 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'a' && strncmp(a
27130 7a 41 72 67 5b 30 5d 2c 20 22 61 72 63 68 69 76  zArg[0], "archiv
27140 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  e", n)==0 ){.   
27150 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
27160 20 20 20 20 72 63 20 3d 20 61 72 44 6f 74 43 6f      rc = arDotCo
27170 6d 6d 61 6e 64 28 70 2c 20 61 7a 41 72 67 2c 20  mmand(p, azArg, 
27180 6e 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  nArg);.  }else.#
27190 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 28 63 3d  endif..  if( (c=
271a0 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20 26 26 20  ='b' && n>=3 && 
271b0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
271c0 2c 20 22 62 61 63 6b 75 70 22 2c 20 6e 29 3d 3d  , "backup", n)==
271d0 30 29 0a 20 20 20 7c 7c 20 28 63 3d 3d 27 73 27  0).   || (c=='s'
271e0 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
271f0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73  cmp(azArg[0], "s
27200 61 76 65 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 29  ave", n)==0).  )
27210 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
27220 20 2a 7a 44 65 73 74 46 69 6c 65 20 3d 20 30 3b   *zDestFile = 0;
27230 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
27240 2a 7a 44 62 20 3d 20 30 3b 0a 20 20 20 20 73 71  *zDb = 0;.    sq
27250 6c 69 74 65 33 20 2a 70 44 65 73 74 3b 0a 20 20  lite3 *pDest;.  
27260 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
27270 20 2a 70 42 61 63 6b 75 70 3b 0a 20 20 20 20 69   *pBackup;.    i
27280 6e 74 20 6a 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  nt j;.    for(j=
27290 31 3b 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 29 7b  1; j<nArg; j++){
272a0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
272b0 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b  r *z = azArg[j];
272c0 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d  .      if( z[0]=
272d0 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='-' ){.        
272e0 77 68 69 6c 65 28 20 7a 5b 30 5d 3d 3d 27 2d 27  while( z[0]=='-'
272f0 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20   ) z++;.        
27300 2f 2a 20 4e 6f 20 6f 70 74 69 6f 6e 73 20 74 6f  /* No options to
27310 20 70 72 6f 63 65 73 73 20 61 74 20 74 68 69 73   process at this
27320 20 74 69 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   time */.       
27330 20 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66   {.          utf
27340 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
27350 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e   "unknown option
27360 3a 20 25 73 5c 6e 22 2c 20 61 7a 41 72 67 5b 6a  : %s\n", azArg[j
27370 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  ]);.          re
27380 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
27390 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
273a0 28 20 7a 44 65 73 74 46 69 6c 65 3d 3d 30 20 29  ( zDestFile==0 )
273b0 7b 0a 20 20 20 20 20 20 20 20 7a 44 65 73 74 46  {.        zDestF
273c0 69 6c 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a  ile = azArg[j];.
273d0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
273e0 7a 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  zDb==0 ){.      
273f0 20 20 7a 44 62 20 3d 20 7a 44 65 73 74 46 69 6c    zDb = zDestFil
27400 65 3b 0a 20 20 20 20 20 20 20 20 7a 44 65 73 74  e;.        zDest
27410 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b  File = azArg[j];
27420 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
27430 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
27440 28 73 74 64 65 72 72 2c 20 22 74 6f 6f 20 6d 61  (stderr, "too ma
27450 6e 79 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  ny arguments to 
27460 2e 62 61 63 6b 75 70 5c 6e 22 29 3b 0a 20 20 20  .backup\n");.   
27470 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
27480 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
27490 20 69 66 28 20 7a 44 65 73 74 46 69 6c 65 3d 3d   if( zDestFile==
274a0 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  0 ){.      raw_p
274b0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6d  rintf(stderr, "m
274c0 69 73 73 69 6e 67 20 46 49 4c 45 4e 41 4d 45 20  issing FILENAME 
274d0 61 72 67 75 6d 65 6e 74 20 6f 6e 20 2e 62 61 63  argument on .bac
274e0 6b 75 70 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  kup\n");.      r
274f0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
27500 20 20 20 69 66 28 20 7a 44 62 3d 3d 30 20 29 20     if( zDb==0 ) 
27510 7a 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20  zDb = "main";.  
27520 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f    rc = sqlite3_o
27530 70 65 6e 28 7a 44 65 73 74 46 69 6c 65 2c 20 26  pen(zDestFile, &
27540 70 44 65 73 74 29 3b 0a 20 20 20 20 69 66 28 20  pDest);.    if( 
27550 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
27560 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
27570 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
27580 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c  r: cannot open \
27590 22 25 73 5c 22 5c 6e 22 2c 20 7a 44 65 73 74 46  "%s\"\n", zDestF
275a0 69 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ile);.      sqli
275b0 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29  te3_close(pDest)
275c0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
275d0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e  ;.    }.    open
275e0 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 70  _db(p, 0);.    p
275f0 42 61 63 6b 75 70 20 3d 20 73 71 6c 69 74 65 33  Backup = sqlite3
27600 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28 70 44 65  _backup_init(pDe
27610 73 74 2c 20 22 6d 61 69 6e 22 2c 20 70 2d 3e 64  st, "main", p->d
27620 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28  b, zDb);.    if(
27630 20 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20   pBackup==0 ){. 
27640 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
27650 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
27660 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f   %s\n", sqlite3_
27670 65 72 72 6d 73 67 28 70 44 65 73 74 29 29 3b 0a  errmsg(pDest));.
27680 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c        sqlite3_cl
27690 6f 73 65 28 70 44 65 73 74 29 3b 0a 20 20 20 20  ose(pDest);.    
276a0 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
276b0 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 20 28 72  }.    while(  (r
276c0 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  c = sqlite3_back
276d0 75 70 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c  up_step(pBackup,
276e0 31 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  100))==SQLITE_OK
276f0 20 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74 65 33   ){}.    sqlite3
27700 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70  _backup_finish(p
27710 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28  Backup);.    if(
27720 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
27730 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30   ){.      rc = 0
27740 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
27750 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
27760 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25  tderr, "Error: %
27770 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  s\n", sqlite3_er
27780 72 6d 73 67 28 70 44 65 73 74 29 29 3b 0a 20 20  rmsg(pDest));.  
27790 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
277a0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c  }.    sqlite3_cl
277b0 6f 73 65 28 70 44 65 73 74 29 3b 0a 20 20 7d 65  ose(pDest);.  }e
277c0 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 62  lse..  if( c=='b
277d0 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72  ' && n>=3 && str
277e0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
277f0 62 61 69 6c 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  bail", n)==0 ){.
27800 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
27810 29 7b 0a 20 20 20 20 20 20 62 61 69 6c 5f 6f 6e  ){.      bail_on
27820 5f 65 72 72 6f 72 20 3d 20 62 6f 6f 6c 65 61 6e  _error = boolean
27830 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b  Value(azArg[1]);
27840 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
27850 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
27860 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 62 61  err, "Usage: .ba
27870 69 6c 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20  il on|off\n");. 
27880 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
27890 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
278a0 28 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33  ( c=='b' && n>=3
278b0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
278c0 67 5b 30 5d 2c 20 22 62 69 6e 61 72 79 22 2c 20  g[0], "binary", 
278d0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  n)==0 ){.    if(
278e0 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
278f0 20 20 69 66 28 20 62 6f 6f 6c 65 61 6e 56 61 6c    if( booleanVal
27900 75 65 28 61 7a 41 72 67 5b 31 5d 29 20 29 7b 0a  ue(azArg[1]) ){.
27910 20 20 20 20 20 20 20 20 73 65 74 42 69 6e 61 72          setBinar
27920 79 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29  yMode(p->out, 1)
27930 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
27940 20 20 20 20 20 20 20 73 65 74 54 65 78 74 4d 6f         setTextMo
27950 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20  de(p->out, 1);. 
27960 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
27970 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
27980 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
27990 65 3a 20 2e 62 69 6e 61 72 79 20 6f 6e 7c 6f 66  e: .binary on|of
279a0 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  f\n");.      rc 
279b0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
279c0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63 27  se..  if( c=='c'
279d0 20 26 26 20 73 74 72 63 6d 70 28 61 7a 41 72 67   && strcmp(azArg
279e0 5b 30 5d 2c 22 63 64 22 29 3d 3d 30 20 29 7b 0a  [0],"cd")==0 ){.
279f0 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
27a00 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  ){.#if defined(_
27a10 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65  WIN32) || define
27a20 64 28 57 49 4e 33 32 29 0a 20 20 20 20 20 20 77  d(WIN32).      w
27a30 63 68 61 72 5f 74 20 2a 7a 20 3d 20 73 71 6c 69  char_t *z = sqli
27a40 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74  te3_win32_utf8_t
27a50 6f 5f 75 6e 69 63 6f 64 65 28 61 7a 41 72 67 5b  o_unicode(azArg[
27a60 31 5d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  1]);.      rc = 
27a70 21 53 65 74 43 75 72 72 65 6e 74 44 69 72 65 63  !SetCurrentDirec
27a80 74 6f 72 79 57 28 7a 29 3b 0a 20 20 20 20 20 20  toryW(z);.      
27a90 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
27aa0 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20  .#else.      rc 
27ab0 3d 20 63 68 64 69 72 28 61 7a 41 72 67 5b 31 5d  = chdir(azArg[1]
27ac0 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
27ad0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
27ae0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
27af0 64 65 72 72 2c 20 22 43 61 6e 6e 6f 74 20 63 68  derr, "Cannot ch
27b00 61 6e 67 65 20 74 6f 20 64 69 72 65 63 74 6f 72  ange to director
27b10 79 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41  y \"%s\"\n", azA
27b20 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[1]);.        
27b30 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  rc = 1;.      }.
27b40 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
27b50 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
27b60 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 63 64 20  rr, "Usage: .cd 
27b70 44 49 52 45 43 54 4f 52 59 5c 6e 22 29 3b 0a 20  DIRECTORY\n");. 
27b80 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
27b90 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a   }.  }else..  /*
27ba0 20 54 68 65 20 75 6e 64 6f 63 75 6d 65 6e 74 65   The undocumente
27bb0 64 20 22 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20  d ".breakpoint" 
27bc0 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20 61  command causes a
27bd0 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 6e 6f 2d   call to the no-
27be0 6f 70 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20  op.  ** routine 
27bf0 6e 61 6d 65 64 20 74 65 73 74 5f 62 72 65 61 6b  named test_break
27c00 70 6f 69 6e 74 28 29 2e 0a 20 20 2a 2f 0a 20 20  point()..  */.  
27c10 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e  if( c=='b' && n>
27c20 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =3 && strncmp(az
27c30 41 72 67 5b 30 5d 2c 20 22 62 72 65 61 6b 70 6f  Arg[0], "breakpo
27c40 69 6e 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  int", n)==0 ){. 
27c50 20 20 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69     test_breakpoi
27c60 6e 74 28 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  nt();.  }else.. 
27c70 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20 6e   if( c=='c' && n
27c80 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
27c90 7a 41 72 67 5b 30 5d 2c 20 22 63 68 61 6e 67 65  zArg[0], "change
27ca0 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  s", n)==0 ){.   
27cb0 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a   if( nArg==2 ){.
27cc0 20 20 20 20 20 20 73 65 74 4f 72 43 6c 65 61 72        setOrClear
27cd0 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 43 6f  Flag(p, SHFLG_Co
27ce0 75 6e 74 43 68 61 6e 67 65 73 2c 20 61 7a 41 72  untChanges, azAr
27cf0 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  g[1]);.    }else
27d00 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
27d10 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
27d20 65 3a 20 2e 63 68 61 6e 67 65 73 20 6f 6e 7c 6f  e: .changes on|o
27d30 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  ff\n");.      rc
27d40 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
27d50 6c 73 65 0a 0a 20 20 2f 2a 20 43 61 6e 63 65 6c  lse..  /* Cancel
27d60 20 6f 75 74 70 75 74 20 72 65 64 69 72 65 63 74   output redirect
27d70 69 6f 6e 2c 20 69 66 20 69 74 20 69 73 20 63 75  ion, if it is cu
27d80 72 72 65 6e 74 6c 79 20 73 65 74 20 28 62 79 20  rrently set (by 
27d90 2e 74 65 73 74 63 61 73 65 29 0a 20 20 2a 2a 20  .testcase).  ** 
27da0 54 68 65 6e 20 72 65 61 64 20 74 68 65 20 63 6f  Then read the co
27db0 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 74 65 73  ntent of the tes
27dc0 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 20 66 69  tcase-out.txt fi
27dd0 6c 65 20 61 6e 64 20 63 6f 6d 70 61 72 65 20 61  le and compare a
27de0 67 61 69 6e 73 74 0a 20 20 2a 2a 20 61 7a 41 72  gainst.  ** azAr
27df0 67 5b 31 5d 2e 20 20 49 66 20 74 68 65 72 65 20  g[1].  If there 
27e00 61 72 65 20 64 69 66 66 65 72 65 6e 63 65 73 2c  are differences,
27e10 20 72 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72   report an error
27e20 20 61 6e 64 20 65 78 69 74 2e 0a 20 20 2a 2f 0a   and exit..  */.
27e30 20 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20    if( c=='c' && 
27e40 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=3 && strncmp(
27e50 61 7a 41 72 67 5b 30 5d 2c 20 22 63 68 65 63 6b  azArg[0], "check
27e60 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
27e70 63 68 61 72 20 2a 7a 52 65 73 20 3d 20 30 3b 0a  char *zRes = 0;.
27e80 20 20 20 20 6f 75 74 70 75 74 5f 72 65 73 65 74      output_reset
27e90 28 70 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72  (p);.    if( nAr
27ea0 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 61  g!=2 ){.      ra
27eb0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
27ec0 20 22 55 73 61 67 65 3a 20 2e 63 68 65 63 6b 20   "Usage: .check 
27ed0 47 4c 4f 42 2d 50 41 54 54 45 52 4e 5c 6e 22 29  GLOB-PATTERN\n")
27ee0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 32 3b 0a  ;.      rc = 2;.
27ef0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 7a      }else if( (z
27f00 52 65 73 20 3d 20 72 65 61 64 46 69 6c 65 28 22  Res = readFile("
27f10 74 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74  testcase-out.txt
27f20 22 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20  ", 0))==0 ){.   
27f30 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
27f40 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61  derr, "Error: ca
27f50 6e 6e 6f 74 20 72 65 61 64 20 27 74 65 73 74 63  nnot read 'testc
27f60 61 73 65 2d 6f 75 74 2e 74 78 74 27 5c 6e 22 29  ase-out.txt'\n")
27f70 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 32 3b 0a  ;.      rc = 2;.
27f80 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 74 65      }else if( te
27f90 73 74 63 61 73 65 5f 67 6c 6f 62 28 61 7a 41 72  stcase_glob(azAr
27fa0 67 5b 31 5d 2c 7a 52 65 73 29 3d 3d 30 20 29 7b  g[1],zRes)==0 ){
27fb0 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
27fc0 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20  tf(stderr,.     
27fd0 20 20 20 20 20 20 20 20 20 20 20 20 22 74 65 73              "tes
27fe0 74 63 61 73 65 2d 25 73 20 46 41 49 4c 45 44 5c  tcase-%s FAILED\
27ff0 6e 20 45 78 70 65 63 74 65 64 3a 20 5b 25 73 5d  n Expected: [%s]
28000 5c 6e 20 20 20 20 20 20 47 6f 74 3a 20 5b 25 73  \n      Got: [%s
28010 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ]\n",.          
28020 20 20 20 20 20 20 20 70 2d 3e 7a 54 65 73 74 63         p->zTestc
28030 61 73 65 2c 20 61 7a 41 72 67 5b 31 5d 2c 20 7a  ase, azArg[1], z
28040 52 65 73 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  Res);.      rc =
28050 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
28060 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
28070 28 73 74 64 6f 75 74 2c 20 22 74 65 73 74 63 61  (stdout, "testca
28080 73 65 2d 25 73 20 6f 6b 5c 6e 22 2c 20 70 2d 3e  se-%s ok\n", p->
28090 7a 54 65 73 74 63 61 73 65 29 3b 0a 20 20 20 20  zTestcase);.    
280a0 20 20 70 2d 3e 6e 43 68 65 63 6b 2b 2b 3b 0a 20    p->nCheck++;. 
280b0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
280c0 5f 66 72 65 65 28 7a 52 65 73 29 3b 0a 20 20 7d  _free(zRes);.  }
280d0 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
280e0 63 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  c' && strncmp(az
280f0 41 72 67 5b 30 5d 2c 20 22 63 6c 6f 6e 65 22 2c  Arg[0], "clone",
28100 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   n)==0 ){.    if
28110 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20  ( nArg==2 ){.   
28120 20 20 20 74 72 79 54 6f 43 6c 6f 6e 65 28 70 2c     tryToClone(p,
28130 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
28140 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
28150 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
28160 22 55 73 61 67 65 3a 20 2e 63 6c 6f 6e 65 20 46  "Usage: .clone F
28170 49 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20 20  ILENAME\n");.   
28180 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
28190 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
281a0 63 3d 3d 27 64 27 20 26 26 20 6e 3e 31 20 26 26  c=='d' && n>1 &&
281b0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
281c0 5d 2c 20 22 64 61 74 61 62 61 73 65 73 22 2c 20  ], "databases", 
281d0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65  n)==0 ){.    She
281e0 6c 6c 53 74 61 74 65 20 64 61 74 61 3b 0a 20 20  llState data;.  
281f0 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
28200 3d 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62  = 0;.    open_db
28210 28 70 2c 20 30 29 3b 0a 20 20 20 20 6d 65 6d 63  (p, 0);.    memc
28220 70 79 28 26 64 61 74 61 2c 20 70 2c 20 73 69 7a  py(&data, p, siz
28230 65 6f 66 28 64 61 74 61 29 29 3b 0a 20 20 20 20  eof(data));.    
28240 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65 72 20  data.showHeader 
28250 3d 20 30 3b 0a 20 20 20 20 64 61 74 61 2e 63 4d  = 0;.    data.cM
28260 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20  ode = data.mode 
28270 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20  = MODE_List;.   
28280 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
28290 66 28 73 69 7a 65 6f 66 28 64 61 74 61 2e 63 6f  f(sizeof(data.co
282a0 6c 53 65 70 61 72 61 74 6f 72 29 2c 64 61 74 61  lSeparator),data
282b0 2e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 22 3a  .colSeparator,":
282c0 20 22 29 3b 0a 20 20 20 20 64 61 74 61 2e 63 6e   ");.    data.cn
282d0 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  t = 0;.    sqlit
282e0 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22  e3_exec(p->db, "
282f0 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 66 69 6c  SELECT name, fil
28300 65 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 64 61  e FROM pragma_da
28310 74 61 62 61 73 65 5f 6c 69 73 74 22 2c 0a 20 20  tabase_list",.  
28320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
28330 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20  allback, &data, 
28340 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69  &zErrMsg);.    i
28350 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  f( zErrMsg ){.  
28360 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
28370 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25  stderr,"Error: %
28380 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  s\n", zErrMsg);.
28390 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
283a0 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
283b0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
283c0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
283d0 63 3d 3d 27 64 27 20 26 26 20 73 74 72 6e 63 6d  c=='d' && strncm
283e0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64 62 69  p(azArg[0], "dbi
283f0 6e 66 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  nfo", n)==0 ){. 
28400 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f 64 62     rc = shell_db
28410 69 6e 66 6f 5f 63 6f 6d 6d 61 6e 64 28 70 2c 20  info_command(p, 
28420 6e 41 72 67 2c 20 61 7a 41 72 67 29 3b 0a 20 20  nArg, azArg);.  
28430 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
28440 27 64 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'd' && strncmp(a
28450 7a 41 72 67 5b 30 5d 2c 20 22 64 75 6d 70 22 2c  zArg[0], "dump",
28460 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f   n)==0 ){.    co
28470 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69 6b 65 20  nst char *zLike 
28480 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  = 0;.    int i;.
28490 20 20 20 20 69 6e 74 20 73 61 76 65 64 53 68 6f      int savedSho
284a0 77 48 65 61 64 65 72 20 3d 20 70 2d 3e 73 68 6f  wHeader = p->sho
284b0 77 48 65 61 64 65 72 3b 0a 20 20 20 20 53 68 65  wHeader;.    She
284c0 6c 6c 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 53  llClearFlag(p, S
284d0 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52 6f 77  HFLG_PreserveRow
284e0 69 64 7c 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65  id|SHFLG_Newline
284f0 73 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b  s);.    for(i=1;
28500 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
28510 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b 69       if( azArg[i
28520 5d 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  ][0]=='-' ){.   
28530 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
28540 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 2b 31 3b  *z = azArg[i]+1;
28550 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 30  .        if( z[0
28560 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20  ]=='-' ) z++;.  
28570 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
28580 28 7a 2c 22 70 72 65 73 65 72 76 65 2d 72 6f 77  (z,"preserve-row
28590 69 64 73 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64  ids")==0 ){.#ifd
285a0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
285b0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
285c0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
285d0 28 73 74 64 65 72 72 2c 20 22 54 68 65 20 2d 2d  (stderr, "The --
285e0 70 72 65 73 65 72 76 65 2d 72 6f 77 69 64 73 20  preserve-rowids 
285f0 6f 70 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f  option is not co
28600 6d 70 61 74 69 62 6c 65 22 0a 20 20 20 20 20 20  mpatible".      
28610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28620 20 20 20 20 20 20 20 22 20 77 69 74 68 20 53 51         " with SQ
28630 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
28640 4c 54 41 42 4c 45 5c 6e 22 29 3b 0a 20 20 20 20  LTABLE\n");.    
28650 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
28660 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74          goto met
28670 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
28680 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20  #else.          
28690 53 68 65 6c 6c 53 65 74 46 6c 61 67 28 70 2c 20  ShellSetFlag(p, 
286a0 53 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52 6f  SHFLG_PreserveRo
286b0 77 69 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  wid);.#endif.   
286c0 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20       }else.     
286d0 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c     if( strcmp(z,
286e0 22 6e 65 77 6c 69 6e 65 73 22 29 3d 3d 30 20 29  "newlines")==0 )
286f0 7b 0a 20 20 20 20 20 20 20 20 20 20 53 68 65 6c  {.          Shel
28700 6c 53 65 74 46 6c 61 67 28 70 2c 20 53 48 46 4c  lSetFlag(p, SHFL
28710 47 5f 4e 65 77 6c 69 6e 65 73 29 3b 0a 20 20 20  G_Newlines);.   
28720 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20       }else.     
28730 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72     {.          r
28740 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
28750 2c 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f  , "Unknown optio
28760 6e 20 5c 22 25 73 5c 22 20 6f 6e 20 5c 22 2e 64  n \"%s\" on \".d
28770 75 6d 70 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b  ump\"\n", azArg[
28780 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  i]);.          r
28790 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
287a0 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
287b0 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  nd_exit;.       
287c0 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
287d0 66 28 20 7a 4c 69 6b 65 20 29 7b 0a 20 20 20 20  f( zLike ){.    
287e0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
287f0 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
28800 64 75 6d 70 20 3f 2d 2d 70 72 65 73 65 72 76 65  dump ?--preserve
28810 2d 72 6f 77 69 64 73 3f 20 22 0a 20 20 20 20 20  -rowids? ".     
28820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28830 20 20 20 20 20 20 22 3f 2d 2d 6e 65 77 6c 69 6e        "?--newlin
28840 65 73 3f 20 3f 4c 49 4b 45 2d 50 41 54 54 45 52  es? ?LIKE-PATTER
28850 4e 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  N?\n");.        
28860 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
28870 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
28880 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 65  d_exit;.      }e
28890 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69  lse{.        zLi
288a0 6b 65 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20  ke = azArg[i];. 
288b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
288c0 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
288d0 20 20 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79      /* When play
288e0 69 6e 67 20 62 61 63 6b 20 61 20 22 64 75 6d 70  ing back a "dump
288f0 22 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6d  ", the content m
28900 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 61  ight appear in a
28910 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 77  n order.    ** w
28920 68 69 63 68 20 63 61 75 73 65 73 20 69 6d 6d 65  hich causes imme
28930 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65  diate foreign ke
28940 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f  y constraints to
28950 20 62 65 20 76 69 6f 6c 61 74 65 64 2e 0a 20 20   be violated..  
28960 20 20 2a 2a 20 53 6f 20 64 69 73 61 62 6c 65 20    ** So disable 
28970 66 6f 72 65 69 67 6e 2d 6b 65 79 20 63 6f 6e 73  foreign-key cons
28980 74 72 61 69 6e 74 20 65 6e 66 6f 72 63 65 6d 65  traint enforceme
28990 6e 74 20 74 6f 20 70 72 65 76 65 6e 74 20 70 72  nt to prevent pr
289a0 6f 62 6c 65 6d 73 2e 20 2a 2f 0a 20 20 20 20 72  oblems. */.    r
289b0 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
289c0 2c 20 22 50 52 41 47 4d 41 20 66 6f 72 65 69 67  , "PRAGMA foreig
289d0 6e 5f 6b 65 79 73 3d 4f 46 46 3b 5c 6e 22 29 3b  n_keys=OFF;\n");
289e0 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
289f0 70 2d 3e 6f 75 74 2c 20 22 42 45 47 49 4e 20 54  p->out, "BEGIN T
28a00 52 41 4e 53 41 43 54 49 4f 4e 3b 5c 6e 22 29 3b  RANSACTION;\n");
28a10 0a 20 20 20 20 70 2d 3e 77 72 69 74 61 62 6c 65  .    p->writable
28a20 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20  Schema = 0;.    
28a30 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20  p->showHeader = 
28a40 30 3b 0a 20 20 20 20 2f 2a 20 53 65 74 20 77 72  0;.    /* Set wr
28a50 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e  itable_schema=ON
28a60 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20   since doing so 
28a70 66 6f 72 63 65 73 20 53 51 4c 69 74 65 20 74 6f  forces SQLite to
28a80 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 20 20   initialize.    
28a90 2a 2a 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68  ** as much of th
28aa0 65 20 73 63 68 65 6d 61 20 61 73 20 69 74 20 63  e schema as it c
28ab0 61 6e 20 65 76 65 6e 20 69 66 20 74 68 65 20 73  an even if the s
28ac0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
28ad0 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 72  le is.    ** cor
28ae0 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  rupt. */.    sql
28af0 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
28b00 20 22 53 41 56 45 50 4f 49 4e 54 20 64 75 6d 70   "SAVEPOINT dump
28b10 3b 20 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c  ; PRAGMA writabl
28b20 65 5f 73 63 68 65 6d 61 3d 4f 4e 22 2c 20 30 2c  e_schema=ON", 0,
28b30 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 6e   0, 0);.    p->n
28b40 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Err = 0;.    if(
28b50 20 7a 4c 69 6b 65 3d 3d 30 20 29 7b 0a 20 20 20   zLike==0 ){.   
28b60 20 20 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75     run_schema_du
28b70 6d 70 5f 71 75 65 72 79 28 70 2c 0a 20 20 20 20  mp_query(p,.    
28b80 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65      "SELECT name
28b90 2c 20 74 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d  , type, sql FROM
28ba0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22   sqlite_master "
28bb0 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20  .        "WHERE 
28bc0 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44  sql NOT NULL AND
28bd0 20 74 79 70 65 3d 3d 27 74 61 62 6c 65 27 20 41   type=='table' A
28be0 4e 44 20 6e 61 6d 65 21 3d 27 73 71 6c 69 74 65  ND name!='sqlite
28bf0 5f 73 65 71 75 65 6e 63 65 27 22 0a 20 20 20 20  _sequence'".    
28c00 20 20 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 73    );.      run_s
28c10 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79  chema_dump_query
28c20 28 70 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c  (p,.        "SEL
28c30 45 43 54 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20  ECT name, type, 
28c40 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  sql FROM sqlite_
28c50 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 20  master ".       
28c60 20 22 57 48 45 52 45 20 6e 61 6d 65 3d 3d 27 73   "WHERE name=='s
28c70 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 27 22  qlite_sequence'"
28c80 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
28c90 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71  run_table_dump_q
28ca0 75 65 72 79 28 70 2c 0a 20 20 20 20 20 20 20 20  uery(p,.        
28cb0 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d  "SELECT sql FROM
28cc0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22   sqlite_master "
28cd0 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20  .        "WHERE 
28ce0 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44  sql NOT NULL AND
28cf0 20 74 79 70 65 20 49 4e 20 28 27 69 6e 64 65 78   type IN ('index
28d00 27 2c 27 74 72 69 67 67 65 72 27 2c 27 76 69 65  ','trigger','vie
28d10 77 27 29 22 2c 20 30 0a 20 20 20 20 20 20 29 3b  w')", 0.      );
28d20 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
28d30 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
28d40 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
28d50 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
28d60 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65      "SELECT name
28d70 2c 20 74 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d  , type, sql FROM
28d80 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22   sqlite_master "
28d90 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20  .        "WHERE 
28da0 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 25 51  tbl_name LIKE %Q
28db0 20 41 4e 44 20 74 79 70 65 3d 3d 27 74 61 62 6c   AND type=='tabl
28dc0 65 27 22 0a 20 20 20 20 20 20 20 20 22 20 20 41  e'".        "  A
28dd0 4e 44 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22  ND sql NOT NULL"
28de0 2c 20 7a 4c 69 6b 65 29 3b 0a 20 20 20 20 20 20  , zLike);.      
28df0 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f  run_schema_dump_
28e00 71 75 65 72 79 28 70 2c 7a 53 71 6c 29 3b 0a 20  query(p,zSql);. 
28e10 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
28e20 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 7a  e(zSql);.      z
28e30 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
28e40 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22  rintf(.        "
28e50 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20  SELECT sql FROM 
28e60 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a  sqlite_master ".
28e70 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20 73          "WHERE s
28e80 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22 0a 20 20 20  ql NOT NULL".   
28e90 20 20 20 20 20 22 20 20 41 4e 44 20 74 79 70 65       "  AND type
28ea0 20 49 4e 20 28 27 69 6e 64 65 78 27 2c 27 74 72   IN ('index','tr
28eb0 69 67 67 65 72 27 2c 27 76 69 65 77 27 29 22 0a  igger','view')".
28ec0 20 20 20 20 20 20 20 20 22 20 20 41 4e 44 20 74          "  AND t
28ed0 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 25 51 22  bl_name LIKE %Q"
28ee0 2c 20 7a 4c 69 6b 65 29 3b 0a 20 20 20 20 20 20  , zLike);.      
28ef0 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71  run_table_dump_q
28f00 75 65 72 79 28 70 2c 20 7a 53 71 6c 2c 20 30 29  uery(p, zSql, 0)
28f10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
28f20 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
28f30 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 77 72 69  }.    if( p->wri
28f40 74 61 62 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20  tableSchema ){. 
28f50 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
28f60 70 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20  p->out, "PRAGMA 
28f70 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d  writable_schema=
28f80 4f 46 46 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20  OFF;\n");.      
28f90 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d  p->writableSchem
28fa0 61 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  a = 0;.    }.   
28fb0 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
28fc0 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 77 72 69  >db, "PRAGMA wri
28fd0 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46  table_schema=OFF
28fe0 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ;", 0, 0, 0);.  
28ff0 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70    sqlite3_exec(p
29000 2d 3e 64 62 2c 20 22 52 45 4c 45 41 53 45 20 64  ->db, "RELEASE d
29010 75 6d 70 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b  ump;", 0, 0, 0);
29020 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
29030 70 2d 3e 6f 75 74 2c 20 70 2d 3e 6e 45 72 72 20  p->out, p->nErr 
29040 3f 20 22 52 4f 4c 4c 42 41 43 4b 3b 20 2d 2d 20  ? "ROLLBACK; -- 
29050 64 75 65 20 74 6f 20 65 72 72 6f 72 73 5c 6e 22  due to errors\n"
29060 20 3a 20 22 43 4f 4d 4d 49 54 3b 5c 6e 22 29 3b   : "COMMIT;\n");
29070 0a 20 20 20 20 70 2d 3e 73 68 6f 77 48 65 61 64  .    p->showHead
29080 65 72 20 3d 20 73 61 76 65 64 53 68 6f 77 48 65  er = savedShowHe
29090 61 64 65 72 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  ader;.  }else.. 
290a0 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73   if( c=='e' && s
290b0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
290c0 20 22 65 63 68 6f 22 2c 20 6e 29 3d 3d 30 20 29   "echo", n)==0 )
290d0 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  {.    if( nArg==
290e0 32 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4f 72  2 ){.      setOr
290f0 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 53 48 46  ClearFlag(p, SHF
29100 4c 47 5f 45 63 68 6f 2c 20 61 7a 41 72 67 5b 31  LG_Echo, azArg[1
29110 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
29120 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
29130 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
29140 2e 65 63 68 6f 20 6f 6e 7c 6f 66 66 5c 6e 22 29  .echo on|off\n")
29150 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
29160 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
29170 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73   if( c=='e' && s
29180 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
29190 20 22 65 71 70 22 2c 20 6e 29 3d 3d 30 20 29 7b   "eqp", n)==0 ){
291a0 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32  .    if( nArg==2
291b0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74   ){.      if( st
291c0 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 66  rcmp(azArg[1],"f
291d0 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ull")==0 ){.    
291e0 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50 20 3d      p->autoEQP =
291f0 20 41 55 54 4f 45 51 50 5f 66 75 6c 6c 3b 0a 20   AUTOEQP_full;. 
29200 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
29210 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  trcmp(azArg[1],"
29220 74 72 69 67 67 65 72 22 29 3d 3d 30 20 29 7b 0a  trigger")==0 ){.
29230 20 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45          p->autoE
29240 51 50 20 3d 20 41 55 54 4f 45 51 50 5f 74 72 69  QP = AUTOEQP_tri
29250 67 67 65 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73  gger;.      }els
29260 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 75  e{.        p->au
29270 74 6f 45 51 50 20 3d 20 62 6f 6f 6c 65 61 6e 56  toEQP = booleanV
29280 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a  alue(azArg[1]);.
29290 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
292a0 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
292b0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
292c0 67 65 3a 20 2e 65 71 70 20 6f 66 66 7c 6f 6e 7c  ge: .eqp off|on|
292d0 74 72 69 67 67 65 72 7c 66 75 6c 6c 5c 6e 22 29  trigger|full\n")
292e0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
292f0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
29300 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73   if( c=='e' && s
29310 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
29320 20 22 65 78 69 74 22 2c 20 6e 29 3d 3d 30 20 29   "exit", n)==0 )
29330 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 31  {.    if( nArg>1
29340 20 26 26 20 28 72 63 20 3d 20 28 69 6e 74 29 69   && (rc = (int)i
29350 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72  ntegerValue(azAr
29360 67 5b 31 5d 29 29 21 3d 30 20 29 20 65 78 69 74  g[1]))!=0 ) exit
29370 28 72 63 29 3b 0a 20 20 20 20 72 63 20 3d 20 32  (rc);.    rc = 2
29380 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20  ;.  }else..  /* 
29390 54 68 65 20 22 2e 65 78 70 6c 61 69 6e 22 20 63  The ".explain" c
293a0 6f 6d 6d 61 6e 64 20 69 73 20 61 75 74 6f 6d 61  ommand is automa
293b0 74 69 63 20 6e 6f 77 2e 20 20 49 74 20 69 73 20  tic now.  It is 
293c0 6c 61 72 67 65 6c 79 20 70 6f 69 6e 74 6c 65 73  largely pointles
293d0 73 2e 20 20 49 74 0a 20 20 2a 2a 20 72 65 74 61  s.  It.  ** reta
293e0 69 6e 65 64 20 70 75 72 65 6c 79 20 66 6f 72 20  ined purely for 
293f0 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
29400 69 62 69 6c 69 74 79 20 2a 2f 0a 20 20 69 66 28  ibility */.  if(
29410 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63   c=='e' && strnc
29420 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78  mp(azArg[0], "ex
29430 70 6c 61 69 6e 22 2c 20 6e 29 3d 3d 30 20 29 7b  plain", n)==0 ){
29440 0a 20 20 20 20 69 6e 74 20 76 61 6c 20 3d 20 31  .    int val = 1
29450 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 3d  ;.    if( nArg>=
29460 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  2 ){.      if( s
29470 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  trcmp(azArg[1],"
29480 61 75 74 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20  auto")==0 ){.   
29490 20 20 20 20 20 76 61 6c 20 3d 20 39 39 3b 0a 20       val = 99;. 
294a0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
294b0 20 20 20 20 76 61 6c 20 3d 20 20 62 6f 6f 6c 65      val =  boole
294c0 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d  anValue(azArg[1]
294d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
294e0 0a 20 20 20 20 69 66 28 20 76 61 6c 3d 3d 31 20  .    if( val==1 
294f0 26 26 20 70 2d 3e 6d 6f 64 65 21 3d 4d 4f 44 45  && p->mode!=MODE
29500 5f 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  _Explain ){.    
29510 20 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 20    p->normalMode 
29520 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20  = p->mode;.     
29530 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
29540 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 70  Explain;.      p
29550 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20 3d 20  ->autoExplain = 
29560 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
29570 20 76 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20   val==0 ){.     
29580 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f   if( p->mode==MO
29590 44 45 5f 45 78 70 6c 61 69 6e 20 29 20 70 2d 3e  DE_Explain ) p->
295a0 6d 6f 64 65 20 3d 20 70 2d 3e 6e 6f 72 6d 61 6c  mode = p->normal
295b0 4d 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e 61  Mode;.      p->a
295c0 75 74 6f 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a  utoExplain = 0;.
295d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 76 61      }else if( va
295e0 6c 3d 3d 39 39 20 29 7b 0a 20 20 20 20 20 20 69  l==99 ){.      i
295f0 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45  f( p->mode==MODE
29600 5f 45 78 70 6c 61 69 6e 20 29 20 70 2d 3e 6d 6f  _Explain ) p->mo
29610 64 65 20 3d 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f  de = p->normalMo
29620 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74  de;.      p->aut
29630 6f 45 78 70 6c 61 69 6e 20 3d 20 31 3b 0a 20 20  oExplain = 1;.  
29640 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
29650 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72  f( c=='e' && str
29660 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
29670 65 78 70 65 72 74 22 2c 20 6e 29 3d 3d 30 20 29  expert", n)==0 )
29680 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  {.    open_db(p,
29690 20 30 29 3b 0a 20 20 20 20 65 78 70 65 72 74 44   0);.    expertD
296a0 6f 74 43 6f 6d 6d 61 6e 64 28 70 2c 20 61 7a 41  otCommand(p, azA
296b0 72 67 2c 20 6e 41 72 67 29 3b 0a 20 20 7d 65 6c  rg, nArg);.  }el
296c0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 66 27  se..  if( c=='f'
296d0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
296e0 67 5b 30 5d 2c 20 22 66 75 6c 6c 73 63 68 65 6d  g[0], "fullschem
296f0 61 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  a", n)==0 ){.   
29700 20 53 68 65 6c 6c 53 74 61 74 65 20 64 61 74 61   ShellState data
29710 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72  ;.    char *zErr
29720 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  Msg = 0;.    int
29730 20 64 6f 53 74 61 74 73 20 3d 20 30 3b 0a 20 20   doStats = 0;.  
29740 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 2c 20    memcpy(&data, 
29750 70 2c 20 73 69 7a 65 6f 66 28 64 61 74 61 29 29  p, sizeof(data))
29760 3b 0a 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48  ;.    data.showH
29770 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 64  eader = 0;.    d
29780 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61  ata.cMode = data
29790 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 53 65 6d  .mode = MODE_Sem
297a0 69 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  i;.    if( nArg=
297b0 3d 32 20 26 26 20 6f 70 74 69 6f 6e 4d 61 74 63  =2 && optionMatc
297c0 68 28 61 7a 41 72 67 5b 31 5d 2c 20 22 69 6e 64  h(azArg[1], "ind
297d0 65 6e 74 22 29 20 29 7b 0a 20 20 20 20 20 20 64  ent") ){.      d
297e0 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61  ata.cMode = data
297f0 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 50 72 65  .mode = MODE_Pre
29800 74 74 79 3b 0a 20 20 20 20 20 20 6e 41 72 67 20  tty;.      nArg 
29810 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
29820 66 28 20 6e 41 72 67 21 3d 31 20 29 7b 0a 20 20  f( nArg!=1 ){.  
29830 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
29840 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
29850 66 75 6c 6c 73 63 68 65 6d 61 20 3f 2d 2d 69 6e  fullschema ?--in
29860 64 65 6e 74 3f 5c 6e 22 29 3b 0a 20 20 20 20 20  dent?\n");.     
29870 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67   rc = 1;.      g
29880 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
29890 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
298a0 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
298b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
298c0 5f 65 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20  _exec(p->db,.   
298d0 20 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20      "SELECT sql 
298e0 46 52 4f 4d 22 0a 20 20 20 20 20 20 20 22 20 20  FROM".       "  
298f0 28 53 45 4c 45 43 54 20 73 71 6c 20 73 71 6c 2c  (SELECT sql sql,
29900 20 74 79 70 65 20 74 79 70 65 2c 20 74 62 6c 5f   type type, tbl_
29910 6e 61 6d 65 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e  name tbl_name, n
29920 61 6d 65 20 6e 61 6d 65 2c 20 72 6f 77 69 64 20  ame name, rowid 
29930 78 22 0a 20 20 20 20 20 20 20 22 20 20 20 20 20  x".       "     
29940 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
29950 65 72 20 55 4e 49 4f 4e 20 41 4c 4c 22 0a 20 20  er UNION ALL".  
29960 20 20 20 20 20 22 20 20 20 53 45 4c 45 43 54 20       "   SELECT 
29970 73 71 6c 2c 20 74 79 70 65 2c 20 74 62 6c 5f 6e  sql, type, tbl_n
29980 61 6d 65 2c 20 6e 61 6d 65 2c 20 72 6f 77 69 64  ame, name, rowid
29990 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d   FROM sqlite_tem
299a0 70 5f 6d 61 73 74 65 72 29 20 22 0a 20 20 20 20  p_master) ".    
299b0 20 20 20 22 57 48 45 52 45 20 74 79 70 65 21 3d     "WHERE type!=
299c0 27 6d 65 74 61 27 20 41 4e 44 20 73 71 6c 20 4e  'meta' AND sql N
299d0 4f 54 4e 55 4c 4c 20 41 4e 44 20 6e 61 6d 65 20  OTNULL AND name 
299e0 4e 4f 54 20 4c 49 4b 45 20 27 73 71 6c 69 74 65  NOT LIKE 'sqlite
299f0 5f 25 27 20 22 0a 20 20 20 20 20 20 20 22 4f 52  _%' ".       "OR
29a00 44 45 52 20 42 59 20 72 6f 77 69 64 22 2c 0a 20  DER BY rowid",. 
29a10 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20        callback, 
29a20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 0a  &data, &zErrMsg.
29a30 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72      );.    if( r
29a40 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
29a50 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
29a60 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 20  mt *pStmt;.     
29a70 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
29a80 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 0a  epare_v2(p->db,.
29a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
29aa0 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f  SELECT rowid FRO
29ab0 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  M sqlite_master"
29ac0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
29ad0 22 20 57 48 45 52 45 20 6e 61 6d 65 20 47 4c 4f  " WHERE name GLO
29ae0 42 20 27 73 71 6c 69 74 65 5f 73 74 61 74 5b 31  B 'sqlite_stat[1
29af0 33 34 5d 27 22 2c 0a 20 20 20 20 20 20 20 20 20  34]'",.         
29b00 20 20 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74        -1, &pStmt
29b10 2c 20 30 29 3b 0a 20 20 20 20 20 20 64 6f 53 74  , 0);.      doSt
29b20 61 74 73 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  ats = sqlite3_st
29b30 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
29b40 45 5f 52 4f 57 3b 0a 20 20 20 20 20 20 73 71 6c  E_ROW;.      sql
29b50 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
29b60 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tmt);.    }.    
29b70 69 66 28 20 64 6f 53 74 61 74 73 3d 3d 30 20 29  if( doStats==0 )
29b80 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
29b90 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 20 4e  tf(p->out, "/* N
29ba0 6f 20 53 54 41 54 20 74 61 62 6c 65 73 20 61 76  o STAT tables av
29bb0 61 69 6c 61 62 6c 65 20 2a 2f 5c 6e 22 29 3b 0a  ailable */\n");.
29bc0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29bd0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
29be0 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20 73 71 6c  ut, "ANALYZE sql
29bf0 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e 22 29 3b  ite_master;\n");
29c00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65  .      sqlite3_e
29c10 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45  xec(p->db, "SELE
29c20 43 54 20 27 41 4e 41 4c 59 5a 45 20 73 71 6c 69  CT 'ANALYZE sqli
29c30 74 65 5f 6d 61 73 74 65 72 27 22 2c 0a 20 20 20  te_master'",.   
29c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29c50 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c  callback, &data,
29c60 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20   &zErrMsg);.    
29c70 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64    data.cMode = d
29c80 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f  ata.mode = MODE_
29c90 49 6e 73 65 72 74 3b 0a 20 20 20 20 20 20 64 61  Insert;.      da
29ca0 74 61 2e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20  ta.zDestTable = 
29cb0 22 73 71 6c 69 74 65 5f 73 74 61 74 31 22 3b 0a  "sqlite_stat1";.
29cc0 20 20 20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63        shell_exec
29cd0 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20  (p->db, "SELECT 
29ce0 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74  * FROM sqlite_st
29cf0 61 74 31 22 2c 0a 20 20 20 20 20 20 20 20 20 20  at1",.          
29d00 20 20 20 20 20 20 20 73 68 65 6c 6c 5f 63 61 6c         shell_cal
29d10 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 26 7a 45  lback, &data,&zE
29d20 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 64 61  rrMsg);.      da
29d30 74 61 2e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20  ta.zDestTable = 
29d40 22 73 71 6c 69 74 65 5f 73 74 61 74 33 22 3b 0a  "sqlite_stat3";.
29d50 20 20 20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63        shell_exec
29d60 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20  (p->db, "SELECT 
29d70 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74  * FROM sqlite_st
29d80 61 74 33 22 2c 0a 20 20 20 20 20 20 20 20 20 20  at3",.          
29d90 20 20 20 20 20 20 20 73 68 65 6c 6c 5f 63 61 6c         shell_cal
29da0 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 26 7a 45  lback, &data,&zE
29db0 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 64 61  rrMsg);.      da
29dc0 74 61 2e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20  ta.zDestTable = 
29dd0 22 73 71 6c 69 74 65 5f 73 74 61 74 34 22 3b 0a  "sqlite_stat4";.
29de0 20 20 20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63        shell_exec
29df0 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20  (p->db, "SELECT 
29e00 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74  * FROM sqlite_st
29e10 61 74 34 22 2c 0a 20 20 20 20 20 20 20 20 20 20  at4",.          
29e20 20 20 20 20 20 20 20 73 68 65 6c 6c 5f 63 61 6c         shell_cal
29e30 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a  lback, &data, &z
29e40 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72  ErrMsg);.      r
29e50 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
29e60 2c 20 22 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74  , "ANALYZE sqlit
29e70 65 5f 6d 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20  e_master;\n");. 
29e80 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
29e90 69 66 28 20 63 3d 3d 27 68 27 20 26 26 20 73 74  if( c=='h' && st
29ea0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
29eb0 22 68 65 61 64 65 72 73 22 2c 20 6e 29 3d 3d 30  "headers", n)==0
29ec0 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
29ed0 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==2 ){.      p->
29ee0 73 68 6f 77 48 65 61 64 65 72 20 3d 20 62 6f 6f  showHeader = boo
29ef0 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b  leanValue(azArg[
29f00 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1]);.    }else{.
29f10 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
29f20 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
29f30 20 2e 68 65 61 64 65 72 73 20 6f 6e 7c 6f 66 66   .headers on|off
29f40 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
29f50 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
29f60 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 68 27 20  e..  if( c=='h' 
29f70 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
29f80 5b 30 5d 2c 20 22 68 65 6c 70 22 2c 20 6e 29 3d  [0], "help", n)=
29f90 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  =0 ){.    utf8_p
29fa0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
29fb0 73 22 2c 20 7a 48 65 6c 70 29 3b 0a 20 20 7d 65  s", zHelp);.  }e
29fc0 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 69  lse..  if( c=='i
29fd0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
29fe0 72 67 5b 30 5d 2c 20 22 69 6d 70 6f 72 74 22 2c  rg[0], "import",
29ff0 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68   n)==0 ){.    ch
2a000 61 72 20 2a 7a 54 61 62 6c 65 3b 20 20 20 20 20  ar *zTable;     
2a010 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
2a020 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68  ert data into th
2a030 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  is table */.    
2a040 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20  char *zFile;    
2a050 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2a060 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 65  ame of file to e
2a070 78 74 72 61 20 63 6f 6e 74 65 6e 74 20 66 72 6f  xtra content fro
2a080 6d 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  m */.    sqlite3
2a090 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 4e  _stmt *pStmt = N
2a0a0 55 4c 4c 3b 20 2f 2a 20 41 20 73 74 61 74 65 6d  ULL; /* A statem
2a0b0 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ent */.    int n
2a0c0 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
2a0d0 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
2a0e0 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
2a0f0 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  he table */.    
2a100 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20  int nByte;      
2a110 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
2a120 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
2a130 6e 20 61 6e 20 53 51 4c 20 73 74 72 69 6e 67 20  n an SQL string 
2a140 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  */.    int i, j;
2a150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a160 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
2a170 65 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ers */.    int n
2a180 65 65 64 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20  eedCommit;      
2a190 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
2a1a0 6f 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c  o COMMIT or ROLL
2a1b0 42 41 43 4b 20 61 74 20 65 6e 64 20 2a 2f 0a 20  BACK at end */. 
2a1c0 20 20 20 69 6e 74 20 6e 53 65 70 3b 20 20 20 20     int nSep;    
2a1d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2a1e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
2a1f0 73 20 69 6e 20 70 2d 3e 63 6f 6c 53 65 70 61 72  s in p->colSepar
2a200 61 74 6f 72 5b 5d 20 2a 2f 0a 20 20 20 20 63 68  ator[] */.    ch
2a210 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20  ar *zSql;       
2a220 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
2a230 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  SQL statement */
2a240 0a 20 20 20 20 49 6d 70 6f 72 74 43 74 78 20 73  .    ImportCtx s
2a250 43 74 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ctx;            
2a260 20 2f 2a 20 52 65 61 64 65 72 20 63 6f 6e 74 65   /* Reader conte
2a270 78 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  xt */.    char *
2a280 28 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 2a 78  (SQLITE_CDECL *x
2a290 52 65 61 64 29 28 49 6d 70 6f 72 74 43 74 78 2a  Read)(ImportCtx*
2a2a0 29 3b 20 2f 2a 20 46 75 6e 63 20 74 6f 20 72 65  ); /* Func to re
2a2b0 61 64 20 6f 6e 65 20 76 61 6c 75 65 20 2a 2f 0a  ad one value */.
2a2c0 20 20 20 20 69 6e 74 20 28 53 51 4c 49 54 45 5f      int (SQLITE_
2a2d0 43 44 45 43 4c 20 2a 78 43 6c 6f 73 65 72 29 28  CDECL *xCloser)(
2a2e0 46 49 4c 45 2a 29 3b 20 20 20 20 20 20 2f 2a 20  FILE*);      /* 
2a2f0 46 75 6e 63 20 74 6f 20 63 6c 6f 73 65 20 66 69  Func to close fi
2a300 6c 65 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 6e  le */..    if( n
2a310 41 72 67 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  Arg!=3 ){.      
2a320 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2a330 72 2c 20 22 55 73 61 67 65 3a 20 2e 69 6d 70 6f  r, "Usage: .impo
2a340 72 74 20 46 49 4c 45 20 54 41 42 4c 45 5c 6e 22  rt FILE TABLE\n"
2a350 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  );.      goto me
2a360 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
2a370 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46 69 6c 65  .    }.    zFile
2a380 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20   = azArg[1];.   
2a390 20 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72 67 5b   zTable = azArg[
2a3a0 32 5d 3b 0a 20 20 20 20 73 65 65 6e 49 6e 74 65  2];.    seenInte
2a3b0 72 72 75 70 74 20 3d 20 30 3b 0a 20 20 20 20 6d  rrupt = 0;.    m
2a3c0 65 6d 73 65 74 28 26 73 43 74 78 2c 20 30 2c 20  emset(&sCtx, 0, 
2a3d0 73 69 7a 65 6f 66 28 73 43 74 78 29 29 3b 0a 20  sizeof(sCtx));. 
2a3e0 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
2a3f0 3b 0a 20 20 20 20 6e 53 65 70 20 3d 20 73 74 72  ;.    nSep = str
2a400 6c 65 6e 33 30 28 70 2d 3e 63 6f 6c 53 65 70 61  len30(p->colSepa
2a410 72 61 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  rator);.    if( 
2a420 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nSep==0 ){.     
2a430 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2a440 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rr,.            
2a450 20 20 20 20 20 22 45 72 72 6f 72 3a 20 6e 6f 6e       "Error: non
2a460 2d 6e 75 6c 6c 20 63 6f 6c 75 6d 6e 20 73 65 70  -null column sep
2a470 61 72 61 74 6f 72 20 72 65 71 75 69 72 65 64 20  arator required 
2a480 66 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a  for import\n");.
2a490 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2a4a0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 53      }.    if( nS
2a4b0 65 70 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 61  ep>1 ){.      ra
2a4c0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2a4d0 20 22 45 72 72 6f 72 3a 20 6d 75 6c 74 69 2d 63   "Error: multi-c
2a4e0 68 61 72 61 63 74 65 72 20 63 6f 6c 75 6d 6e 20  haracter column 
2a4f0 73 65 70 61 72 61 74 6f 72 73 20 6e 6f 74 20 61  separators not a
2a500 6c 6c 6f 77 65 64 22 0a 20 20 20 20 20 20 20 20  llowed".        
2a510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
2a520 66 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a  for import\n");.
2a530 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2a540 20 20 20 20 7d 0a 20 20 20 20 6e 53 65 70 20 3d      }.    nSep =
2a550 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 72 6f 77   strlen30(p->row
2a560 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
2a570 69 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a 20  if( nSep==0 ){. 
2a580 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2a590 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
2a5a0 6e 6f 6e 2d 6e 75 6c 6c 20 72 6f 77 20 73 65 70  non-null row sep
2a5b0 61 72 61 74 6f 72 20 72 65 71 75 69 72 65 64 20  arator required 
2a5c0 66 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a  for import\n");.
2a5d0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2a5e0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 53      }.    if( nS
2a5f0 65 70 3d 3d 32 20 26 26 20 70 2d 3e 6d 6f 64 65  ep==2 && p->mode
2a600 3d 3d 4d 4f 44 45 5f 43 73 76 20 26 26 20 73 74  ==MODE_Csv && st
2a610 72 63 6d 70 28 70 2d 3e 72 6f 77 53 65 70 61 72  rcmp(p->rowSepar
2a620 61 74 6f 72 2c 20 53 45 50 5f 43 72 4c 66 29 3d  ator, SEP_CrLf)=
2a630 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57  =0 ){.      /* W
2a640 68 65 6e 20 69 6d 70 6f 72 74 69 6e 67 20 43 53  hen importing CS
2a650 56 20 28 6f 6e 6c 79 29 2c 20 69 66 20 74 68 65  V (only), if the
2a660 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 20 69   row separator i
2a670 73 20 73 65 74 20 74 6f 20 74 68 65 0a 20 20 20  s set to the.   
2a680 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 6f 75     ** default ou
2a690 74 70 75 74 20 72 6f 77 20 73 65 70 61 72 61 74  tput row separat
2a6a0 6f 72 2c 20 63 68 61 6e 67 65 20 69 74 20 74 6f  or, change it to
2a6b0 20 74 68 65 20 64 65 66 61 75 6c 74 20 69 6e 70   the default inp
2a6c0 75 74 0a 20 20 20 20 20 20 2a 2a 20 72 6f 77 20  ut.      ** row 
2a6d0 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68 69 73  separator.  This
2a6e0 20 61 76 6f 69 64 73 20 68 61 76 69 6e 67 20 74   avoids having t
2a6f0 6f 20 6d 61 69 6e 74 61 69 6e 20 64 69 66 66 65  o maintain diffe
2a700 72 65 6e 74 20 69 6e 70 75 74 0a 20 20 20 20 20  rent input.     
2a710 20 2a 2a 20 61 6e 64 20 6f 75 74 70 75 74 20 72   ** and output r
2a720 6f 77 20 73 65 70 61 72 61 74 6f 72 73 2e 20 2a  ow separators. *
2a730 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  /.      sqlite3_
2a740 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
2a750 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
2a760 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
2a770 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20  r, SEP_Row);.   
2a780 20 20 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e     nSep = strlen
2a790 33 30 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  30(p->rowSeparat
2a7a0 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  or);.    }.    i
2a7b0 66 28 20 6e 53 65 70 3e 31 20 29 7b 0a 20 20 20  f( nSep>1 ){.   
2a7c0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2a7d0 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6d 75  derr, "Error: mu
2a7e0 6c 74 69 2d 63 68 61 72 61 63 74 65 72 20 72 6f  lti-character ro
2a7f0 77 20 73 65 70 61 72 61 74 6f 72 73 20 6e 6f 74  w separators not
2a800 20 61 6c 6c 6f 77 65 64 22 0a 20 20 20 20 20 20   allowed".      
2a810 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a820 22 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29  " for import\n")
2a830 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
2a840 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 43 74 78  ;.    }.    sCtx
2a850 2e 7a 46 69 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a  .zFile = zFile;.
2a860 20 20 20 20 73 43 74 78 2e 6e 4c 69 6e 65 20 3d      sCtx.nLine =
2a870 20 31 3b 0a 20 20 20 20 69 66 28 20 73 43 74 78   1;.    if( sCtx
2a880 2e 7a 46 69 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29  .zFile[0]=='|' )
2a890 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
2a8a0 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20 20 20 20 20  OMIT_POPEN.     
2a8b0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2a8c0 72 72 2c 20 22 45 72 72 6f 72 3a 20 70 69 70 65  rr, "Error: pipe
2a8d0 73 20 61 72 65 20 6e 6f 74 20 73 75 70 70 6f 72  s are not suppor
2a8e0 74 65 64 20 69 6e 20 74 68 69 73 20 4f 53 5c 6e  ted in this OS\n
2a8f0 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
2a900 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20   1;.#else.      
2a910 73 43 74 78 2e 69 6e 20 3d 20 70 6f 70 65 6e 28  sCtx.in = popen(
2a920 73 43 74 78 2e 7a 46 69 6c 65 2b 31 2c 20 22 72  sCtx.zFile+1, "r
2a930 22 29 3b 0a 20 20 20 20 20 20 73 43 74 78 2e 7a  ");.      sCtx.z
2a940 46 69 6c 65 20 3d 20 22 3c 70 69 70 65 3e 22 3b  File = "<pipe>";
2a950 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72 20 3d  .      xCloser =
2a960 20 70 63 6c 6f 73 65 3b 0a 23 65 6e 64 69 66 0a   pclose;.#endif.
2a970 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2a980 20 73 43 74 78 2e 69 6e 20 3d 20 66 6f 70 65 6e   sCtx.in = fopen
2a990 28 73 43 74 78 2e 7a 46 69 6c 65 2c 20 22 72 62  (sCtx.zFile, "rb
2a9a0 22 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65  ");.      xClose
2a9b0 72 20 3d 20 66 63 6c 6f 73 65 3b 0a 20 20 20 20  r = fclose;.    
2a9c0 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 6f 64  }.    if( p->mod
2a9d0 65 3d 3d 4d 4f 44 45 5f 41 73 63 69 69 20 29 7b  e==MODE_Ascii ){
2a9e0 0a 20 20 20 20 20 20 78 52 65 61 64 20 3d 20 61  .      xRead = a
2a9f0 73 63 69 69 5f 72 65 61 64 5f 6f 6e 65 5f 66 69  scii_read_one_fi
2aa00 65 6c 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  eld;.    }else{.
2aa10 20 20 20 20 20 20 78 52 65 61 64 20 3d 20 63 73        xRead = cs
2aa20 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64  v_read_one_field
2aa30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2aa40 73 43 74 78 2e 69 6e 3d 3d 30 20 29 7b 0a 20 20  sCtx.in==0 ){.  
2aa50 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2aa60 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
2aa70 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73  cannot open \"%s
2aa80 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20  \"\n", zFile);. 
2aa90 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2aaa0 20 20 20 7d 0a 20 20 20 20 73 43 74 78 2e 63 43     }.    sCtx.cC
2aab0 6f 6c 53 65 70 20 3d 20 70 2d 3e 63 6f 6c 53 65  olSep = p->colSe
2aac0 70 61 72 61 74 6f 72 5b 30 5d 3b 0a 20 20 20 20  parator[0];.    
2aad0 73 43 74 78 2e 63 52 6f 77 53 65 70 20 3d 20 70  sCtx.cRowSep = p
2aae0 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 5b 30  ->rowSeparator[0
2aaf0 5d 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  ];.    zSql = sq
2ab00 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
2ab10 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 25 73 22  ELECT * FROM %s"
2ab20 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69  , zTable);.    i
2ab30 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
2ab40 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2ab50 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6f  tderr, "Error: o
2ab60 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29  ut of memory\n")
2ab70 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28  ;.      xCloser(
2ab80 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20  sCtx.in);.      
2ab90 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
2aba0 20 20 20 20 6e 42 79 74 65 20 3d 20 73 74 72 6c      nByte = strl
2abb0 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20  en30(zSql);.    
2abc0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
2abd0 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a  pare_v2(p->db, z
2abe0 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
2abf0 20 30 29 3b 0a 20 20 20 20 69 6d 70 6f 72 74 5f   0);.    import_
2ac00 61 70 70 65 6e 64 5f 63 68 61 72 28 26 73 43 74  append_char(&sCt
2ac10 78 2c 20 30 29 3b 20 20 20 20 2f 2a 20 54 6f 20  x, 0);    /* To 
2ac20 65 6e 73 75 72 65 20 73 43 74 78 2e 7a 20 69 73  ensure sCtx.z is
2ac30 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20   allocated */.  
2ac40 20 20 69 66 28 20 72 63 20 26 26 20 73 71 6c 69    if( rc && sqli
2ac50 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 6e 6f 20  te3_strglob("no 
2ac60 73 75 63 68 20 74 61 62 6c 65 3a 20 2a 22 2c 20  such table: *", 
2ac70 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
2ac80 2d 3e 64 62 29 29 3d 3d 30 20 29 7b 0a 20 20 20  ->db))==0 ){.   
2ac90 20 20 20 63 68 61 72 20 2a 7a 43 72 65 61 74 65     char *zCreate
2aca0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2acb0 74 66 28 22 43 52 45 41 54 45 20 54 41 42 4c 45  tf("CREATE TABLE
2acc0 20 25 73 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20   %s", zTable);. 
2acd0 20 20 20 20 20 63 68 61 72 20 63 53 65 70 20 3d       char cSep =
2ace0 20 27 28 27 3b 0a 20 20 20 20 20 20 77 68 69 6c   '(';.      whil
2acf0 65 28 20 78 52 65 61 64 28 26 73 43 74 78 29 20  e( xRead(&sCtx) 
2ad00 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 72 65 61  ){.        zCrea
2ad10 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  te = sqlite3_mpr
2ad20 69 6e 74 66 28 22 25 7a 25 63 5c 6e 20 20 5c 22  intf("%z%c\n  \"
2ad30 25 77 5c 22 20 54 45 58 54 22 2c 20 7a 43 72 65  %w\" TEXT", zCre
2ad40 61 74 65 2c 20 63 53 65 70 2c 20 73 43 74 78 2e  ate, cSep, sCtx.
2ad50 7a 29 3b 0a 20 20 20 20 20 20 20 20 63 53 65 70  z);.        cSep
2ad60 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20 20   = ',';.        
2ad70 69 66 28 20 73 43 74 78 2e 63 54 65 72 6d 21 3d  if( sCtx.cTerm!=
2ad80 73 43 74 78 2e 63 43 6f 6c 53 65 70 20 29 20 62  sCtx.cColSep ) b
2ad90 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
2ada0 20 20 20 20 69 66 28 20 63 53 65 70 3d 3d 27 28      if( cSep=='(
2adb0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ' ){.        sql
2adc0 69 74 65 33 5f 66 72 65 65 28 7a 43 72 65 61 74  ite3_free(zCreat
2add0 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
2ade0 74 65 33 5f 66 72 65 65 28 73 43 74 78 2e 7a 29  te3_free(sCtx.z)
2adf0 3b 0a 20 20 20 20 20 20 20 20 78 43 6c 6f 73 65  ;.        xClose
2ae00 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20  r(sCtx.in);.    
2ae10 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2ae20 73 74 64 65 72 72 2c 22 25 73 3a 20 65 6d 70 74  stderr,"%s: empt
2ae30 79 20 66 69 6c 65 5c 6e 22 2c 20 73 43 74 78 2e  y file\n", sCtx.
2ae40 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  zFile);.        
2ae50 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
2ae60 7d 0a 20 20 20 20 20 20 7a 43 72 65 61 74 65 20  }.      zCreate 
2ae70 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2ae80 66 28 22 25 7a 5c 6e 29 22 2c 20 7a 43 72 65 61  f("%z\n)", zCrea
2ae90 74 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  te);.      rc = 
2aea0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
2aeb0 64 62 2c 20 7a 43 72 65 61 74 65 2c 20 30 2c 20  db, zCreate, 0, 
2aec0 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
2aed0 69 74 65 33 5f 66 72 65 65 28 7a 43 72 65 61 74  ite3_free(zCreat
2aee0 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
2aef0 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
2af00 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2af10 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 73  "CREATE TABLE %s
2af20 28 2e 2e 2e 29 20 66 61 69 6c 65 64 3a 20 25 73  (...) failed: %s
2af30 5c 6e 22 2c 20 7a 54 61 62 6c 65 2c 0a 20 20 20  \n", zTable,.   
2af40 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2af50 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
2af60 62 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  b));.        sql
2af70 69 74 65 33 5f 66 72 65 65 28 73 43 74 78 2e 7a  ite3_free(sCtx.z
2af80 29 3b 0a 20 20 20 20 20 20 20 20 78 43 6c 6f 73  );.        xClos
2af90 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20  er(sCtx.in);.   
2afa0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2afb0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
2afc0 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
2afd0 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c  e_v2(p->db, zSql
2afe0 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
2aff0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2b000 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
2b010 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2b020 20 20 20 20 69 66 20 28 70 53 74 6d 74 29 20 73      if (pStmt) s
2b030 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
2b040 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 75 74  pStmt);.      ut
2b050 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2b060 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20  ,"Error: %s\n", 
2b070 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
2b080 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 78 43  ->db));.      xC
2b090 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a  loser(sCtx.in);.
2b0a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2b0b0 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d      }.    nCol =
2b0c0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
2b0d0 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20  count(pStmt);.  
2b0e0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
2b0f0 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 70  ze(pStmt);.    p
2b100 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 69 66  Stmt = 0;.    if
2b110 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75  ( nCol==0 ) retu
2b120 72 6e 20 30 3b 20 2f 2a 20 6e 6f 20 63 6f 6c 75  rn 0; /* no colu
2b130 6d 6e 73 2c 20 6e 6f 20 65 72 72 6f 72 20 2a 2f  mns, no error */
2b140 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  .    zSql = sqli
2b150 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e 42  te3_malloc64( nB
2b160 79 74 65 2a 32 20 2b 20 32 30 20 2b 20 6e 43 6f  yte*2 + 20 + nCo
2b170 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  l*2 );.    if( z
2b180 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sql==0 ){.      
2b190 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2b1a0 72 2c 20 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f  r, "Error: out o
2b1b0 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20  f memory\n");.  
2b1c0 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78      xCloser(sCtx
2b1d0 2e 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75  .in);.      retu
2b1e0 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
2b1f0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2b200 28 6e 42 79 74 65 2b 32 30 2c 20 7a 53 71 6c 2c  (nByte+20, zSql,
2b210 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5c 22   "INSERT INTO \"
2b220 25 77 5c 22 20 56 41 4c 55 45 53 28 3f 22 2c 20  %w\" VALUES(?", 
2b230 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 6a 20 3d  zTable);.    j =
2b240 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b   strlen30(zSql);
2b250 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
2b260 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
2b270 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c    zSql[j++] = ',
2b280 27 3b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b  ';.      zSql[j+
2b290 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a  +] = '?';.    }.
2b2a0 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20      zSql[j++] = 
2b2b0 27 29 27 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d  ')';.    zSql[j]
2b2c0 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 0;.    rc = s
2b2d0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
2b2e0 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  2(p->db, zSql, -
2b2f0 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
2b300 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2b310 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  zSql);.    if( r
2b320 63 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  c ){.      utf8_
2b330 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2b340 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71  Error: %s\n", sq
2b350 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
2b360 64 62 29 29 3b 0a 20 20 20 20 20 20 69 66 20 28  db));.      if (
2b370 70 53 74 6d 74 29 20 73 71 6c 69 74 65 33 5f 66  pStmt) sqlite3_f
2b380 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
2b390 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43        xCloser(sC
2b3a0 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20 72 65  tx.in);.      re
2b3b0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
2b3c0 20 20 6e 65 65 64 43 6f 6d 6d 69 74 20 3d 20 73    needCommit = s
2b3d0 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63  qlite3_get_autoc
2b3e0 6f 6d 6d 69 74 28 70 2d 3e 64 62 29 3b 0a 20 20  ommit(p->db);.  
2b3f0 20 20 69 66 28 20 6e 65 65 64 43 6f 6d 6d 69 74    if( needCommit
2b400 20 29 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   ) sqlite3_exec(
2b410 70 2d 3e 64 62 2c 20 22 42 45 47 49 4e 22 2c 20  p->db, "BEGIN", 
2b420 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 64 6f  0, 0, 0);.    do
2b430 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 74 61 72  {.      int star
2b440 74 4c 69 6e 65 20 3d 20 73 43 74 78 2e 6e 4c 69  tLine = sCtx.nLi
2b450 6e 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ne;.      for(i=
2b460 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
2b470 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
2b480 20 3d 20 78 52 65 61 64 28 26 73 43 74 78 29 3b   = xRead(&sCtx);
2b490 0a 20 20 20 20 20 20 20 20 2f 2a 0a 20 20 20 20  .        /*.    
2b4a0 20 20 20 20 2a 2a 20 44 69 64 20 77 65 20 72 65      ** Did we re
2b4b0 61 63 68 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 20  ach end-of-file 
2b4c0 62 65 66 6f 72 65 20 66 69 6e 64 69 6e 67 20 61  before finding a
2b4d0 6e 79 20 63 6f 6c 75 6d 6e 73 3f 0a 20 20 20 20  ny columns?.    
2b4e0 20 20 20 20 2a 2a 20 49 66 20 73 6f 2c 20 73 74      ** If so, st
2b4f0 6f 70 20 69 6e 73 74 65 61 64 20 6f 66 20 4e 55  op instead of NU
2b500 4c 4c 20 66 69 6c 6c 69 6e 67 20 74 68 65 20 72  LL filling the r
2b510 65 6d 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 73  emaining columns
2b520 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2b530 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 26 26       if( z==0 &&
2b540 20 69 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20   i==0 ) break;. 
2b550 20 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20         /*.      
2b560 20 20 2a 2a 20 44 69 64 20 77 65 20 72 65 61 63    ** Did we reac
2b570 68 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 20 4f 52  h end-of-file OR
2b580 20 65 6e 64 2d 6f 66 2d 6c 69 6e 65 20 62 65 66   end-of-line bef
2b590 6f 72 65 20 66 69 6e 64 69 6e 67 20 61 6e 79 0a  ore finding any.
2b5a0 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d          ** colum
2b5b0 6e 73 20 69 6e 20 41 53 43 49 49 20 6d 6f 64 65  ns in ASCII mode
2b5c0 3f 20 20 49 66 20 73 6f 2c 20 73 74 6f 70 20 69  ?  If so, stop i
2b5d0 6e 73 74 65 61 64 20 6f 66 20 4e 55 4c 4c 20 66  nstead of NULL f
2b5e0 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  illing.        *
2b5f0 2a 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20  * the remaining 
2b600 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 20 20 20  columns..       
2b610 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
2b620 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 41 73  p->mode==MODE_As
2b630 63 69 69 20 26 26 20 28 7a 3d 3d 30 20 7c 7c 20  cii && (z==0 || 
2b640 7a 5b 30 5d 3d 3d 30 29 20 26 26 20 69 3d 3d 30  z[0]==0) && i==0
2b650 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
2b660 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
2b670 65 78 74 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20  ext(pStmt, i+1, 
2b680 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52  z, -1, SQLITE_TR
2b690 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20  ANSIENT);.      
2b6a0 20 20 69 66 28 20 69 3c 6e 43 6f 6c 2d 31 20 26    if( i<nCol-1 &
2b6b0 26 20 73 43 74 78 2e 63 54 65 72 6d 21 3d 73 43  & sCtx.cTerm!=sC
2b6c0 74 78 2e 63 43 6f 6c 53 65 70 20 29 7b 0a 20 20  tx.cColSep ){.  
2b6d0 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
2b6e0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a  ntf(stderr, "%s:
2b6f0 25 64 3a 20 65 78 70 65 63 74 65 64 20 25 64 20  %d: expected %d 
2b700 63 6f 6c 75 6d 6e 73 20 62 75 74 20 66 6f 75 6e  columns but foun
2b710 64 20 25 64 20 2d 20 22 0a 20 20 20 20 20 20 20  d %d - ".       
2b720 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b730 20 20 20 22 66 69 6c 6c 69 6e 67 20 74 68 65 20     "filling the 
2b740 72 65 73 74 20 77 69 74 68 20 4e 55 4c 4c 5c 6e  rest with NULL\n
2b750 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2b760 20 20 20 20 20 20 20 20 20 20 20 20 20 73 43 74               sCt
2b770 78 2e 7a 46 69 6c 65 2c 20 73 74 61 72 74 4c 69  x.zFile, startLi
2b780 6e 65 2c 20 6e 43 6f 6c 2c 20 69 2b 31 29 3b 0a  ne, nCol, i+1);.
2b790 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32            i += 2
2b7a0 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  ;.          whil
2b7b0 65 28 20 69 3c 3d 6e 43 6f 6c 20 29 7b 20 73 71  e( i<=nCol ){ sq
2b7c0 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28  lite3_bind_null(
2b7d0 70 53 74 6d 74 2c 20 69 29 3b 20 69 2b 2b 3b 20  pStmt, i); i++; 
2b7e0 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2b7f0 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 43    }.      if( sC
2b800 74 78 2e 63 54 65 72 6d 3d 3d 73 43 74 78 2e 63  tx.cTerm==sCtx.c
2b810 43 6f 6c 53 65 70 20 29 7b 0a 20 20 20 20 20 20  ColSep ){.      
2b820 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20    do{.          
2b830 78 52 65 61 64 28 26 73 43 74 78 29 3b 0a 20 20  xRead(&sCtx);.  
2b840 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20          i++;.   
2b850 20 20 20 20 20 7d 77 68 69 6c 65 28 20 73 43 74       }while( sCt
2b860 78 2e 63 54 65 72 6d 3d 3d 73 43 74 78 2e 63 43  x.cTerm==sCtx.cC
2b870 6f 6c 53 65 70 20 29 3b 0a 20 20 20 20 20 20 20  olSep );.       
2b880 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2b890 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 65 78 70  err, "%s:%d: exp
2b8a0 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73  ected %d columns
2b8b0 20 62 75 74 20 66 6f 75 6e 64 20 25 64 20 2d 20   but found %d - 
2b8c0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
2b8d0 20 20 20 20 20 20 20 20 20 20 22 65 78 74 72 61            "extra
2b8e0 73 20 69 67 6e 6f 72 65 64 5c 6e 22 2c 0a 20 20  s ignored\n",.  
2b8f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b900 20 20 20 20 20 20 73 43 74 78 2e 7a 46 69 6c 65        sCtx.zFile
2b910 2c 20 73 74 61 72 74 4c 69 6e 65 2c 20 6e 43 6f  , startLine, nCo
2b920 6c 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20  l, i);.      }. 
2b930 20 20 20 20 20 69 66 28 20 69 3e 3d 6e 43 6f 6c       if( i>=nCol
2b940 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2b950 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b  te3_step(pStmt);
2b960 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2b970 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
2b980 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
2b990 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2b9a0 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
2b9b0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2b9c0 25 73 3a 25 64 3a 20 49 4e 53 45 52 54 20 66 61  %s:%d: INSERT fa
2b9d0 69 6c 65 64 3a 20 25 73 5c 6e 22 2c 20 73 43 74  iled: %s\n", sCt
2b9e0 78 2e 7a 46 69 6c 65 2c 0a 20 20 20 20 20 20 20  x.zFile,.       
2b9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2ba00 74 61 72 74 4c 69 6e 65 2c 20 73 71 6c 69 74 65  tartLine, sqlite
2ba10 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29  3_errmsg(p->db))
2ba20 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2ba30 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20    }.    }while( 
2ba40 73 43 74 78 2e 63 54 65 72 6d 21 3d 45 4f 46 20  sCtx.cTerm!=EOF 
2ba50 29 3b 0a 0a 20 20 20 20 78 43 6c 6f 73 65 72 28  );..    xCloser(
2ba60 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 73 71  sCtx.in);.    sq
2ba70 6c 69 74 65 33 5f 66 72 65 65 28 73 43 74 78 2e  lite3_free(sCtx.
2ba80 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  z);.    sqlite3_
2ba90 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
2baa0 0a 20 20 20 20 69 66 28 20 6e 65 65 64 43 6f 6d  .    if( needCom
2bab0 6d 69 74 20 29 20 73 71 6c 69 74 65 33 5f 65 78  mit ) sqlite3_ex
2bac0 65 63 28 70 2d 3e 64 62 2c 20 22 43 4f 4d 4d 49  ec(p->db, "COMMI
2bad0 54 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  T", 0, 0, 0);.  
2bae0 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53  }else..#ifndef S
2baf0 51 4c 49 54 45 5f 55 4e 54 45 53 54 41 42 4c 45  QLITE_UNTESTABLE
2bb00 0a 20 20 69 66 28 20 63 3d 3d 27 69 27 20 26 26  .  if( c=='i' &&
2bb10 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2bb20 5d 2c 20 22 69 6d 70 6f 73 74 65 72 22 2c 20 6e  ], "imposter", n
2bb30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  )==0 ){.    char
2bb40 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 63 68 61 72   *zSql;.    char
2bb50 20 2a 7a 43 6f 6c 6c 69 73 74 20 3d 20 30 3b 0a   *zCollist = 0;.
2bb60 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
2bb70 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74   *pStmt;.    int
2bb80 20 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 69   tnum = 0;.    i
2bb90 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 6e 41  nt i;.    if( nA
2bba0 72 67 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 75  rg!=3 ){.      u
2bbb0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2bbc0 72 2c 20 22 55 73 61 67 65 3a 20 2e 69 6d 70 6f  r, "Usage: .impo
2bbd0 73 74 65 72 20 49 4e 44 45 58 20 49 4d 50 4f 53  ster INDEX IMPOS
2bbe0 54 45 52 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  TER\n");.      r
2bbf0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74  c = 1;.      got
2bc00 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
2bc10 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f  xit;.    }.    o
2bc20 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
2bc30 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
2bc40 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
2bc50 20 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20 73   rootpage FROM s
2bc60 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20  qlite_master".  
2bc70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc80 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45           " WHERE
2bc90 20 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74   name='%q' AND t
2bca0 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 20 61 7a  ype='index'", az
2bcb0 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 73 71 6c  Arg[1]);.    sql
2bcc0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
2bcd0 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  p->db, zSql, -1,
2bce0 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
2bcf0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
2bd00 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ql);.    if( sql
2bd10 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
2bd20 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
2bd30 20 20 20 20 20 20 74 6e 75 6d 20 3d 20 73 71 6c        tnum = sql
2bd40 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
2bd50 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d  pStmt, 0);.    }
2bd60 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
2bd70 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
2bd80 20 20 69 66 28 20 74 6e 75 6d 3d 3d 30 20 29 7b    if( tnum==0 ){
2bd90 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
2bda0 74 66 28 73 74 64 65 72 72 2c 20 22 6e 6f 20 73  tf(stderr, "no s
2bdb0 75 63 68 20 69 6e 64 65 78 3a 20 5c 22 25 73 5c  uch index: \"%s\
2bdc0 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  "\n", azArg[1]);
2bdd0 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
2bde0 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
2bdf0 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
2be00 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71   }.    zSql = sq
2be10 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50  lite3_mprintf("P
2be20 52 41 47 4d 41 20 69 6e 64 65 78 5f 78 69 6e 66  RAGMA index_xinf
2be30 6f 3d 27 25 71 27 22 2c 20 61 7a 41 72 67 5b 31  o='%q'", azArg[1
2be40 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ]);.    rc = sql
2be50 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
2be60 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  p->db, zSql, -1,
2be70 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
2be80 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
2be90 71 6c 29 3b 0a 20 20 20 20 69 20 3d 20 30 3b 0a  ql);.    i = 0;.
2bea0 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74      while( sqlit
2beb0 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
2bec0 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
2bed0 20 20 20 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b      char zLabel[
2bee0 32 30 5d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  20];.      const
2bef0 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 28 63   char *zCol = (c
2bf00 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
2bf10 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
2bf20 53 74 6d 74 2c 32 29 3b 0a 20 20 20 20 20 20 69  Stmt,2);.      i
2bf30 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 43  ++;.      if( zC
2bf40 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ol==0 ){.       
2bf50 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c   if( sqlite3_col
2bf60 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 31 29  umn_int(pStmt,1)
2bf70 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  ==-1 ){.        
2bf80 20 20 7a 43 6f 6c 20 3d 20 22 5f 52 4f 57 49 44    zCol = "_ROWID
2bf90 5f 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  _";.        }els
2bfa0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
2bfb0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
2bfc0 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 2c 7a 4c 61  zeof(zLabel),zLa
2bfd0 62 65 6c 2c 22 65 78 70 72 25 64 22 2c 69 29 3b  bel,"expr%d",i);
2bfe0 0a 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  .          zCol 
2bff0 3d 20 7a 4c 61 62 65 6c 3b 0a 20 20 20 20 20 20  = zLabel;.      
2c000 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2c010 20 20 69 66 28 20 7a 43 6f 6c 6c 69 73 74 3d 3d    if( zCollist==
2c020 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  0 ){.        zCo
2c030 6c 6c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 5f  llist = sqlite3_
2c040 6d 70 72 69 6e 74 66 28 22 5c 22 25 77 5c 22 22  mprintf("\"%w\""
2c050 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d  , zCol);.      }
2c060 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43  else{.        zC
2c070 6f 6c 6c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  ollist = sqlite3
2c080 5f 6d 70 72 69 6e 74 66 28 22 25 7a 2c 5c 22 25  _mprintf("%z,\"%
2c090 77 5c 22 22 2c 20 7a 43 6f 6c 6c 69 73 74 2c 20  w\"", zCollist, 
2c0a0 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  zCol);.      }. 
2c0b0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2c0c0 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
2c0d0 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c  ;.    zSql = sql
2c0e0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
2c0f0 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
2c100 54 41 42 4c 45 20 5c 22 25 77 5c 22 28 25 73 2c  TABLE \"%w\"(%s,
2c110 50 52 49 4d 41 52 59 20 4b 45 59 28 25 73 29 29  PRIMARY KEY(%s))
2c120 57 49 54 48 4f 55 54 20 52 4f 57 49 44 22 2c 0a  WITHOUT ROWID",.
2c130 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b            azArg[
2c140 32 5d 2c 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 43  2], zCollist, zC
2c150 6f 6c 6c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  ollist);.    sql
2c160 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c 6c 69  ite3_free(zColli
2c170 73 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  st);.    rc = sq
2c180 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
2c190 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
2c1a0 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e  RL_IMPOSTER, p->
2c1b0 64 62 2c 20 22 6d 61 69 6e 22 2c 20 31 2c 20 74  db, "main", 1, t
2c1c0 6e 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  num);.    if( rc
2c1d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2c1e0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2c1f0 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 53  3_exec(p->db, zS
2c200 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ql, 0, 0, 0);.  
2c210 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74      sqlite3_test
2c220 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
2c230 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45  TESTCTRL_IMPOSTE
2c240 52 2c 20 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22  R, p->db, "main"
2c250 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
2c260 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2c270 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2c280 65 72 72 2c 20 22 45 72 72 6f 72 20 69 6e 20 5b  err, "Error in [
2c290 25 73 5d 3a 20 25 73 5c 6e 22 2c 20 7a 53 71 6c  %s]: %s\n", zSql
2c2a0 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
2c2b0 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20  (p->db));.      
2c2c0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75  }else{.        u
2c2d0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 6f 75  tf8_printf(stdou
2c2e0 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 7a 53 71 6c  t, "%s;\n", zSql
2c2f0 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  );.        raw_p
2c300 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 0a 20 20  rintf(stdout,.  
2c310 20 20 20 20 20 20 20 20 20 22 57 41 52 4e 49 4e           "WARNIN
2c320 47 3a 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e  G: writing to an
2c330 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20   imposter table 
2c340 77 69 6c 6c 20 63 6f 72 72 75 70 74 20 74 68 65  will corrupt the
2c350 20 69 6e 64 65 78 21 5c 6e 22 0a 20 20 20 20 20   index!\n".     
2c360 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
2c370 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2c380 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
2c390 2c 20 22 53 51 4c 49 54 45 5f 54 45 53 54 43 54  , "SQLITE_TESTCT
2c3a0 52 4c 5f 49 4d 50 4f 53 54 45 52 20 72 65 74 75  RL_IMPOSTER retu
2c3b0 72 6e 73 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a  rns %d\n", rc);.
2c3c0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
2c3d0 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
2c3e0 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 65  free(zSql);.  }e
2c3f0 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  lse.#endif /* !d
2c400 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
2c410 49 54 5f 54 45 53 54 5f 43 4f 4e 54 52 4f 4c 29  IT_TEST_CONTROL)
2c420 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
2c430 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
2c440 45 0a 20 20 69 66 28 20 63 3d 3d 27 69 27 20 26  E.  if( c=='i' &
2c450 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2c460 30 5d 2c 20 22 69 6f 74 72 61 63 65 22 2c 20 6e  0], "iotrace", n
2c470 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 51 4c 49  )==0 ){.    SQLI
2c480 54 45 5f 41 50 49 20 65 78 74 65 72 6e 20 76 6f  TE_API extern vo
2c490 69 64 20 28 53 51 4c 49 54 45 5f 43 44 45 43 4c  id (SQLITE_CDECL
2c4a0 20 2a 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65   *sqlite3IoTrace
2c4b0 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 2e  )(const char*, .
2c4c0 2e 2e 29 3b 0a 20 20 20 20 69 66 28 20 69 6f 74  ..);.    if( iot
2c4d0 72 61 63 65 20 26 26 20 69 6f 74 72 61 63 65 21  race && iotrace!
2c4e0 3d 73 74 64 6f 75 74 20 29 20 66 63 6c 6f 73 65  =stdout ) fclose
2c4f0 28 69 6f 74 72 61 63 65 29 3b 0a 20 20 20 20 69  (iotrace);.    i
2c500 6f 74 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20  otrace = 0;.    
2c510 69 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20  if( nArg<2 ){.  
2c520 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61      sqlite3IoTra
2c530 63 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ce = 0;.    }els
2c540 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41  e if( strcmp(azA
2c550 72 67 5b 31 5d 2c 20 22 2d 22 29 3d 3d 30 20 29  rg[1], "-")==0 )
2c560 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49  {.      sqlite3I
2c570 6f 54 72 61 63 65 20 3d 20 69 6f 74 72 61 63 65  oTrace = iotrace
2c580 50 72 69 6e 74 66 3b 0a 20 20 20 20 20 20 69 6f  Printf;.      io
2c590 74 72 61 63 65 20 3d 20 73 74 64 6f 75 74 3b 0a  trace = stdout;.
2c5a0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c5b0 20 69 6f 74 72 61 63 65 20 3d 20 66 6f 70 65 6e   iotrace = fopen
2c5c0 28 61 7a 41 72 67 5b 31 5d 2c 20 22 77 22 29 3b  (azArg[1], "w");
2c5d0 0a 20 20 20 20 20 20 69 66 28 20 69 6f 74 72 61  .      if( iotra
2c5e0 63 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ce==0 ){.       
2c5f0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2c600 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  err, "Error: can
2c610 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c  not open \"%s\"\
2c620 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  n", azArg[1]);. 
2c630 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f         sqlite3Io
2c640 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20  Trace = 0;.     
2c650 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
2c660 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2c670 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 20 3d  sqlite3IoTrace =
2c680 20 69 6f 74 72 61 63 65 50 72 69 6e 74 66 3b 0a   iotracePrintf;.
2c690 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2c6a0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20  }else.#endif..  
2c6b0 69 66 28 20 63 3d 3d 27 6c 27 20 26 26 20 6e 3e  if( c=='l' && n>
2c6c0 3d 35 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =5 && strncmp(az
2c6d0 41 72 67 5b 30 5d 2c 20 22 6c 69 6d 69 74 73 22  Arg[0], "limits"
2c6e0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  , n)==0 ){.    s
2c6f0 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
2c700 63 74 20 7b 0a 20 20 20 20 20 20 20 63 6f 6e 73  ct {.       cons
2c710 74 20 63 68 61 72 20 2a 7a 4c 69 6d 69 74 4e 61  t char *zLimitNa
2c720 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me;   /* Name of
2c730 20 61 20 6c 69 6d 69 74 20 2a 2f 0a 20 20 20 20   a limit */.    
2c740 20 20 20 69 6e 74 20 6c 69 6d 69 74 43 6f 64 65     int limitCode
2c750 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2c760 49 6e 74 65 67 65 72 20 63 6f 64 65 20 66 6f 72  Integer code for
2c770 20 74 68 61 74 20 6c 69 6d 69 74 20 2a 2f 0a 20   that limit */. 
2c780 20 20 20 7d 20 61 4c 69 6d 69 74 5b 5d 20 3d 20     } aLimit[] = 
2c790 7b 0a 20 20 20 20 20 20 7b 20 22 6c 65 6e 67 74  {.      { "lengt
2c7a0 68 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  h",             
2c7b0 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
2c7c0 4c 45 4e 47 54 48 20 20 20 20 20 20 20 20 20 20  LENGTH          
2c7d0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2c7e0 20 20 20 7b 20 22 73 71 6c 5f 6c 65 6e 67 74 68     { "sql_length
2c7f0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 53 51  ",            SQ
2c800 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c  LITE_LIMIT_SQL_L
2c810 45 4e 47 54 48 20 20 20 20 20 20 20 20 20 20 20  ENGTH           
2c820 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
2c830 22 63 6f 6c 75 6d 6e 22 2c 20 20 20 20 20 20 20  "column",       
2c840 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
2c850 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 20 20 20 20  LIMIT_COLUMN    
2c860 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c870 7d 2c 0a 20 20 20 20 20 20 7b 20 22 65 78 70 72  },.      { "expr
2c880 5f 64 65 70 74 68 22 2c 20 20 20 20 20 20 20 20  _depth",        
2c890 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
2c8a0 5f 45 58 50 52 5f 44 45 50 54 48 20 20 20 20 20  _EXPR_DEPTH     
2c8b0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2c8c0 20 20 20 20 7b 20 22 63 6f 6d 70 6f 75 6e 64 5f      { "compound_
2c8d0 73 65 6c 65 63 74 22 2c 20 20 20 20 20 20 20 53  select",       S
2c8e0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50  QLITE_LIMIT_COMP
2c8f0 4f 55 4e 44 5f 53 45 4c 45 43 54 20 20 20 20 20  OUND_SELECT     
2c900 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
2c910 20 22 76 64 62 65 5f 6f 70 22 2c 20 20 20 20 20   "vdbe_op",     
2c920 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
2c930 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 20 20  _LIMIT_VDBE_OP  
2c940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c950 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 66 75 6e   },.      { "fun
2c960 63 74 69 6f 6e 5f 61 72 67 22 2c 20 20 20 20 20  ction_arg",     
2c970 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
2c980 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 20  T_FUNCTION_ARG  
2c990 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
2c9a0 20 20 20 20 20 7b 20 22 61 74 74 61 63 68 65 64       { "attached
2c9b0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2c9c0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54  SQLITE_LIMIT_ATT
2c9d0 41 43 48 45 44 20 20 20 20 20 20 20 20 20 20 20  ACHED           
2c9e0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
2c9f0 7b 20 22 6c 69 6b 65 5f 70 61 74 74 65 72 6e 5f  { "like_pattern_
2ca00 6c 65 6e 67 74 68 22 2c 20 20 20 53 51 4c 49 54  length",   SQLIT
2ca10 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54  E_LIMIT_LIKE_PAT
2ca20 54 45 52 4e 5f 4c 45 4e 47 54 48 20 20 20 20 20  TERN_LENGTH     
2ca30 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 76 61    },.      { "va
2ca40 72 69 61 62 6c 65 5f 6e 75 6d 62 65 72 22 2c 20  riable_number", 
2ca50 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
2ca60 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
2ca70 45 52 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  ER           },.
2ca80 20 20 20 20 20 20 7b 20 22 74 72 69 67 67 65 72        { "trigger
2ca90 5f 64 65 70 74 68 22 2c 20 20 20 20 20 20 20 20  _depth",        
2caa0 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52   SQLITE_LIMIT_TR
2cab0 49 47 47 45 52 5f 44 45 50 54 48 20 20 20 20 20  IGGER_DEPTH     
2cac0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
2cad0 20 7b 20 22 77 6f 72 6b 65 72 5f 74 68 72 65 61   { "worker_threa
2cae0 64 73 22 2c 20 20 20 20 20 20 20 20 53 51 4c 49  ds",        SQLI
2caf0 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f  TE_LIMIT_WORKER_
2cb00 54 48 52 45 41 44 53 20 20 20 20 20 20 20 20 20  THREADS         
2cb10 20 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20     },.    };.   
2cb20 20 69 6e 74 20 69 2c 20 6e 32 3b 0a 20 20 20 20   int i, n2;.    
2cb30 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
2cb40 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 31 20 29     if( nArg==1 )
2cb50 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
2cb60 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 4c 69   i<ArraySize(aLi
2cb70 6d 69 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mit); i++){.    
2cb80 20 20 20 20 70 72 69 6e 74 66 28 22 25 32 30 73      printf("%20s
2cb90 20 25 64 5c 6e 22 2c 20 61 4c 69 6d 69 74 5b 69   %d\n", aLimit[i
2cba0 5d 2e 7a 4c 69 6d 69 74 4e 61 6d 65 2c 0a 20 20  ].zLimitName,.  
2cbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2cbc0 69 74 65 33 5f 6c 69 6d 69 74 28 70 2d 3e 64 62  ite3_limit(p->db
2cbd0 2c 20 61 4c 69 6d 69 74 5b 69 5d 2e 6c 69 6d 69  , aLimit[i].limi
2cbe0 74 43 6f 64 65 2c 20 2d 31 29 29 3b 0a 20 20 20  tCode, -1));.   
2cbf0 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
2cc00 66 28 20 6e 41 72 67 3e 33 20 29 7b 0a 20 20 20  f( nArg>3 ){.   
2cc10 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2cc20 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 6c  derr, "Usage: .l
2cc30 69 6d 69 74 20 4e 41 4d 45 20 3f 4e 45 57 2d 56  imit NAME ?NEW-V
2cc40 41 4c 55 45 3f 5c 6e 22 29 3b 0a 20 20 20 20 20  ALUE?\n");.     
2cc50 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67   rc = 1;.      g
2cc60 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
2cc70 5f 65 78 69 74 3b 0a 20 20 20 20 7d 65 6c 73 65  _exit;.    }else
2cc80 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 69 6d  {.      int iLim
2cc90 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 6e  it = -1;.      n
2cca0 32 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 41  2 = strlen30(azA
2ccb0 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 66 6f  rg[1]);.      fo
2ccc0 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
2ccd0 7a 65 28 61 4c 69 6d 69 74 29 3b 20 69 2b 2b 29  ze(aLimit); i++)
2cce0 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
2ccf0 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 61  lite3_strnicmp(a
2cd00 4c 69 6d 69 74 5b 69 5d 2e 7a 4c 69 6d 69 74 4e  Limit[i].zLimitN
2cd10 61 6d 65 2c 20 61 7a 41 72 67 5b 31 5d 2c 20 6e  ame, azArg[1], n
2cd20 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  2)==0 ){.       
2cd30 20 20 20 69 66 28 20 69 4c 69 6d 69 74 3c 30 20     if( iLimit<0 
2cd40 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2cd50 4c 69 6d 69 74 20 3d 20 69 3b 0a 20 20 20 20 20  Limit = i;.     
2cd60 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2cd70 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
2cd80 6e 74 66 28 73 74 64 65 72 72 2c 20 22 61 6d 62  ntf(stderr, "amb
2cd90 69 67 75 6f 75 73 20 6c 69 6d 69 74 3a 20 5c 22  iguous limit: \"
2cda0 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31  %s\"\n", azArg[1
2cdb0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
2cdc0 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
2cdd0 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
2cde0 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
2cdf0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2ce00 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2ce10 69 66 28 20 69 4c 69 6d 69 74 3c 30 20 29 7b 0a  if( iLimit<0 ){.
2ce20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
2ce30 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e 6b  ntf(stderr, "unk
2ce40 6e 6f 77 6e 20 6c 69 6d 69 74 3a 20 5c 22 25 73  nown limit: \"%s
2ce50 5c 22 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20  \"\n".          
2ce60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 65                "e
2ce70 6e 74 65 72 20 5c 22 2e 6c 69 6d 69 74 73 5c 22  nter \".limits\"
2ce80 20 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e   with no argumen
2ce90 74 73 20 66 6f 72 20 61 20 6c 69 73 74 2e 5c 6e  ts for a list.\n
2cea0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2ceb0 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 41 72              azAr
2cec0 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 72  g[1]);.        r
2ced0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67  c = 1;.        g
2cee0 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
2cef0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  _exit;.      }. 
2cf00 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 33       if( nArg==3
2cf10 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2cf20 74 65 33 5f 6c 69 6d 69 74 28 70 2d 3e 64 62 2c  te3_limit(p->db,
2cf30 20 61 4c 69 6d 69 74 5b 69 4c 69 6d 69 74 5d 2e   aLimit[iLimit].
2cf40 6c 69 6d 69 74 43 6f 64 65 2c 0a 20 20 20 20 20  limitCode,.     
2cf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cf60 20 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c   (int)integerVal
2cf70 75 65 28 61 7a 41 72 67 5b 32 5d 29 29 3b 0a 20  ue(azArg[2]));. 
2cf80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 72 69       }.      pri
2cf90 6e 74 66 28 22 25 32 30 73 20 25 64 5c 6e 22 2c  ntf("%20s %d\n",
2cfa0 20 61 4c 69 6d 69 74 5b 69 4c 69 6d 69 74 5d 2e   aLimit[iLimit].
2cfb0 7a 4c 69 6d 69 74 4e 61 6d 65 2c 0a 20 20 20 20  zLimitName,.    
2cfc0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2cfd0 5f 6c 69 6d 69 74 28 70 2d 3e 64 62 2c 20 61 4c  _limit(p->db, aL
2cfe0 69 6d 69 74 5b 69 4c 69 6d 69 74 5d 2e 6c 69 6d  imit[iLimit].lim
2cff0 69 74 43 6f 64 65 2c 20 2d 31 29 29 3b 0a 20 20  itCode, -1));.  
2d000 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
2d010 66 28 20 63 3d 3d 27 6c 27 20 26 26 20 6e 3e 32  f( c=='l' && n>2
2d020 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2d030 67 5b 30 5d 2c 20 22 6c 69 6e 74 22 2c 20 6e 29  g[0], "lint", n)
2d040 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f  ==0 ){.    open_
2d050 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6c 69  db(p, 0);.    li
2d060 6e 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 70 2c 20  ntDotCommand(p, 
2d070 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b 0a 20 20  azArg, nArg);.  
2d080 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53  }else..#ifndef S
2d090 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
2d0a0 45 58 54 45 4e 53 49 4f 4e 0a 20 20 69 66 28 20  EXTENSION.  if( 
2d0b0 63 3d 3d 27 6c 27 20 26 26 20 73 74 72 6e 63 6d  c=='l' && strncm
2d0c0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 6f 61  p(azArg[0], "loa
2d0d0 64 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  d", n)==0 ){.   
2d0e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
2d0f0 6c 65 2c 20 2a 7a 50 72 6f 63 3b 0a 20 20 20 20  le, *zProc;.    
2d100 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
2d110 30 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3c  0;.    if( nArg<
2d120 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  2 ){.      raw_p
2d130 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
2d140 73 61 67 65 3a 20 2e 6c 6f 61 64 20 46 49 4c 45  sage: .load FILE
2d150 20 3f 45 4e 54 52 59 50 4f 49 4e 54 3f 5c 6e 22   ?ENTRYPOINT?\n"
2d160 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
2d170 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61  .      goto meta
2d180 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
2d190 20 20 20 7d 0a 20 20 20 20 7a 46 69 6c 65 20 3d     }.    zFile =
2d1a0 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 7a   azArg[1];.    z
2d1b0 50 72 6f 63 20 3d 20 6e 41 72 67 3e 3d 33 20 3f  Proc = nArg>=3 ?
2d1c0 20 61 7a 41 72 67 5b 32 5d 20 3a 20 30 3b 0a 20   azArg[2] : 0;. 
2d1d0 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
2d1e0 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2d1f0 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  e3_load_extensio
2d200 6e 28 70 2d 3e 64 62 2c 20 7a 46 69 6c 65 2c 20  n(p->db, zFile, 
2d210 7a 50 72 6f 63 2c 20 26 7a 45 72 72 4d 73 67 29  zProc, &zErrMsg)
2d220 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2d230 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2d240 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2d250 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c  err, "Error: %s\
2d260 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  n", zErrMsg);.  
2d270 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2d280 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  (zErrMsg);.     
2d290 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
2d2a0 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
2d2b0 20 69 66 28 20 63 3d 3d 27 6c 27 20 26 26 20 73   if( c=='l' && s
2d2c0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2d2d0 20 22 6c 6f 67 22 2c 20 6e 29 3d 3d 30 20 29 7b   "log", n)==0 ){
2d2e0 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 32  .    if( nArg!=2
2d2f0 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
2d300 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
2d310 61 67 65 3a 20 2e 6c 6f 67 20 46 49 4c 45 4e 41  age: .log FILENA
2d320 4d 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  ME\n");.      rc
2d330 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
2d340 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
2d350 72 20 2a 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67  r *zFile = azArg
2d360 5b 31 5d 3b 0a 20 20 20 20 20 20 6f 75 74 70 75  [1];.      outpu
2d370 74 5f 66 69 6c 65 5f 63 6c 6f 73 65 28 70 2d 3e  t_file_close(p->
2d380 70 4c 6f 67 29 3b 0a 20 20 20 20 20 20 70 2d 3e  pLog);.      p->
2d390 70 4c 6f 67 20 3d 20 6f 75 74 70 75 74 5f 66 69  pLog = output_fi
2d3a0 6c 65 5f 6f 70 65 6e 28 7a 46 69 6c 65 29 3b 0a  le_open(zFile);.
2d3b0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
2d3c0 20 69 66 28 20 63 3d 3d 27 6d 27 20 26 26 20 73   if( c=='m' && s
2d3d0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2d3e0 20 22 6d 6f 64 65 22 2c 20 6e 29 3d 3d 30 20 29   "mode", n)==0 )
2d3f0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
2d400 20 2a 7a 4d 6f 64 65 20 3d 20 6e 41 72 67 3e 3d   *zMode = nArg>=
2d410 32 20 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20 22  2 ? azArg[1] : "
2d420 22 3b 0a 20 20 20 20 69 6e 74 20 6e 32 20 3d 20  ";.    int n2 = 
2d430 73 74 72 6c 65 6e 33 30 28 7a 4d 6f 64 65 29 3b  strlen30(zMode);
2d440 0a 20 20 20 20 69 6e 74 20 63 32 20 3d 20 7a 4d  .    int c2 = zM
2d450 6f 64 65 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20  ode[0];.    if( 
2d460 63 32 3d 3d 27 6c 27 20 26 26 20 6e 32 3e 32 20  c2=='l' && n2>2 
2d470 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2d480 5b 31 5d 2c 22 6c 69 6e 65 73 22 2c 6e 32 29 3d  [1],"lines",n2)=
2d490 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d  =0 ){.      p->m
2d4a0 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 6e 65 3b  ode = MODE_Line;
2d4b0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
2d4c0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
2d4d0 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c  ->rowSeparator),
2d4e0 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
2d4f0 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20  , SEP_Row);.    
2d500 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 63  }else if( c2=='c
2d510 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
2d520 72 67 5b 31 5d 2c 22 63 6f 6c 75 6d 6e 73 22 2c  rg[1],"columns",
2d530 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n2)==0 ){.      
2d540 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43  p->mode = MODE_C
2d550 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 73 71 6c  olumn;.      sql
2d560 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
2d570 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72  zeof(p->rowSepar
2d580 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70  ator), p->rowSep
2d590 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29  arator, SEP_Row)
2d5a0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2d5b0 63 32 3d 3d 27 6c 27 20 26 26 20 6e 32 3e 32 20  c2=='l' && n2>2 
2d5c0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2d5d0 5b 31 5d 2c 22 6c 69 73 74 22 2c 6e 32 29 3d 3d  [1],"list",n2)==
2d5e0 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  0 ){.      p->mo
2d5f0 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a  de = MODE_List;.
2d600 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
2d610 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
2d620 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20  >colSeparator), 
2d630 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c  p->colSeparator,
2d640 20 53 45 50 5f 43 6f 6c 75 6d 6e 29 3b 0a 20 20   SEP_Column);.  
2d650 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2d660 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72  intf(sizeof(p->r
2d670 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d  owSeparator), p-
2d680 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53  >rowSeparator, S
2d690 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c  EP_Row);.    }el
2d6a0 73 65 20 69 66 28 20 63 32 3d 3d 27 68 27 20 26  se if( c2=='h' &
2d6b0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2d6c0 31 5d 2c 22 68 74 6d 6c 22 2c 6e 32 29 3d 3d 30  1],"html",n2)==0
2d6d0 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64   ){.      p->mod
2d6e0 65 20 3d 20 4d 4f 44 45 5f 48 74 6d 6c 3b 0a 20  e = MODE_Html;. 
2d6f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d     }else if( c2=
2d700 3d 27 74 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='t' && strncmp(
2d710 61 7a 41 72 67 5b 31 5d 2c 22 74 63 6c 22 2c 6e  azArg[1],"tcl",n
2d720 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  2)==0 ){.      p
2d730 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 54 63  ->mode = MODE_Tc
2d740 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  l;.      sqlite3
2d750 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
2d760 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72  (p->colSeparator
2d770 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  ), p->colSeparat
2d780 6f 72 2c 20 53 45 50 5f 53 70 61 63 65 29 3b 0a  or, SEP_Space);.
2d790 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
2d7a0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
2d7b0 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20  >rowSeparator), 
2d7c0 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c  p->rowSeparator,
2d7d0 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20 7d   SEP_Row);.    }
2d7e0 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 63 27  else if( c2=='c'
2d7f0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2d800 67 5b 31 5d 2c 22 63 73 76 22 2c 6e 32 29 3d 3d  g[1],"csv",n2)==
2d810 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  0 ){.      p->mo
2d820 64 65 20 3d 20 4d 4f 44 45 5f 43 73 76 3b 0a 20  de = MODE_Csv;. 
2d830 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
2d840 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
2d850 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70  colSeparator), p
2d860 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20  ->colSeparator, 
2d870 53 45 50 5f 43 6f 6d 6d 61 29 3b 0a 20 20 20 20  SEP_Comma);.    
2d880 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2d890 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77  tf(sizeof(p->row
2d8a0 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72  Separator), p->r
2d8b0 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50  owSeparator, SEP
2d8c0 5f 43 72 4c 66 29 3b 0a 20 20 20 20 7d 65 6c 73  _CrLf);.    }els
2d8d0 65 20 69 66 28 20 63 32 3d 3d 27 74 27 20 26 26  e if( c2=='t' &&
2d8e0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31   strncmp(azArg[1
2d8f0 5d 2c 22 74 61 62 73 22 2c 6e 32 29 3d 3d 30 20  ],"tabs",n2)==0 
2d900 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  ){.      p->mode
2d910 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20   = MODE_List;.  
2d920 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2d930 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63  intf(sizeof(p->c
2d940 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d  olSeparator), p-
2d950 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 53  >colSeparator, S
2d960 45 50 5f 54 61 62 29 3b 0a 20 20 20 20 7d 65 6c  EP_Tab);.    }el
2d970 73 65 20 69 66 28 20 63 32 3d 3d 27 69 27 20 26  se if( c2=='i' &
2d980 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2d990 31 5d 2c 22 69 6e 73 65 72 74 22 2c 6e 32 29 3d  1],"insert",n2)=
2d9a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d  =0 ){.      p->m
2d9b0 6f 64 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72  ode = MODE_Inser
2d9c0 74 3b 0a 20 20 20 20 20 20 73 65 74 5f 74 61 62  t;.      set_tab
2d9d0 6c 65 5f 6e 61 6d 65 28 70 2c 20 6e 41 72 67 3e  le_name(p, nArg>
2d9e0 3d 33 20 3f 20 61 7a 41 72 67 5b 32 5d 20 3a 20  =3 ? azArg[2] : 
2d9f0 22 74 61 62 6c 65 22 29 3b 0a 20 20 20 20 7d 65  "table");.    }e
2da00 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 71 27 20  lse if( c2=='q' 
2da10 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2da20 5b 31 5d 2c 22 71 75 6f 74 65 22 2c 6e 32 29 3d  [1],"quote",n2)=
2da30 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d  =0 ){.      p->m
2da40 6f 64 65 20 3d 20 4d 4f 44 45 5f 51 75 6f 74 65  ode = MODE_Quote
2da50 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2da60 63 32 3d 3d 27 61 27 20 26 26 20 73 74 72 6e 63  c2=='a' && strnc
2da70 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 61 73 63  mp(azArg[1],"asc
2da80 69 69 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  ii",n2)==0 ){.  
2da90 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f      p->mode = MO
2daa0 44 45 5f 41 73 63 69 69 3b 0a 20 20 20 20 20 20  DE_Ascii;.      
2dab0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2dac0 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65  (sizeof(p->colSe
2dad0 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c  parator), p->col
2dae0 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 55  Separator, SEP_U
2daf0 6e 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nit);.      sqli
2db00 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
2db10 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  eof(p->rowSepara
2db20 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61  tor), p->rowSepa
2db30 72 61 74 6f 72 2c 20 53 45 50 5f 52 65 63 6f 72  rator, SEP_Recor
2db40 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  d);.    }else if
2db50 28 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20  ( nArg==1 ){.   
2db60 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
2db70 3e 6f 75 74 2c 20 22 63 75 72 72 65 6e 74 20 6f  >out, "current o
2db80 75 74 70 75 74 20 6d 6f 64 65 3a 20 25 73 5c 6e  utput mode: %s\n
2db90 22 2c 20 6d 6f 64 65 44 65 73 63 72 5b 70 2d 3e  ", modeDescr[p->
2dba0 6d 6f 64 65 5d 29 3b 0a 20 20 20 20 7d 65 6c 73  mode]);.    }els
2dbb0 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
2dbc0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
2dbd0 6f 72 3a 20 6d 6f 64 65 20 73 68 6f 75 6c 64 20  or: mode should 
2dbe0 62 65 20 6f 6e 65 20 6f 66 3a 20 22 0a 20 20 20  be one of: ".   
2dbf0 20 20 20 20 20 20 22 61 73 63 69 69 20 63 6f 6c        "ascii col
2dc00 75 6d 6e 20 63 73 76 20 68 74 6d 6c 20 69 6e 73  umn csv html ins
2dc10 65 72 74 20 6c 69 6e 65 20 6c 69 73 74 20 71 75  ert line list qu
2dc20 6f 74 65 20 74 61 62 73 20 74 63 6c 5c 6e 22 29  ote tabs tcl\n")
2dc30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
2dc40 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 63 4d 6f      }.    p->cMo
2dc50 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20  de = p->mode;.  
2dc60 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
2dc70 27 6e 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'n' && strncmp(a
2dc80 7a 41 72 67 5b 30 5d 2c 20 22 6e 75 6c 6c 76 61  zArg[0], "nullva
2dc90 6c 75 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  lue", n)==0 ){. 
2dca0 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
2dcb0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
2dcc0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
2dcd0 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 2c 20 70  p->nullValue), p
2dce0 2d 3e 6e 75 6c 6c 56 61 6c 75 65 2c 0a 20 20 20  ->nullValue,.   
2dcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd00 20 20 20 20 22 25 2e 2a 73 22 2c 20 28 69 6e 74      "%.*s", (int
2dd10 29 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 6e 75  )ArraySize(p->nu
2dd20 6c 6c 56 61 6c 75 65 29 2d 31 2c 20 61 7a 41 72  llValue)-1, azAr
2dd30 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  g[1]);.    }else
2dd40 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2dd50 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
2dd60 65 3a 20 2e 6e 75 6c 6c 76 61 6c 75 65 20 53 54  e: .nullvalue ST
2dd70 52 49 4e 47 5c 6e 22 29 3b 0a 20 20 20 20 20 20  RING\n");.      
2dd80 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
2dd90 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
2dda0 27 6f 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'o' && strncmp(a
2ddb0 7a 41 72 67 5b 30 5d 2c 20 22 6f 70 65 6e 22 2c  zArg[0], "open",
2ddc0 20 6e 29 3d 3d 30 20 26 26 20 6e 3e 3d 32 20 29   n)==0 && n>=2 )
2ddd0 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e 65 77  {.    char *zNew
2dde0 46 69 6c 65 6e 61 6d 65 3b 20 20 2f 2a 20 4e 61  Filename;  /* Na
2ddf0 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
2de00 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20  se file to open 
2de10 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4e 61 6d 65  */.    int iName
2de20 20 3d 20 31 3b 20 20 20 20 20 20 20 2f 2a 20 49   = 1;       /* I
2de30 6e 64 65 78 20 69 6e 20 61 7a 41 72 67 5b 5d 20  ndex in azArg[] 
2de40 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d 65 20  of the filename 
2de50 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65 77 46 6c  */.    int newFl
2de60 61 67 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54  ag = 0;     /* T
2de70 72 75 65 20 74 6f 20 64 65 6c 65 74 65 20 66 69  rue to delete fi
2de80 6c 65 20 62 65 66 6f 72 65 20 6f 70 65 6e 69 6e  le before openin
2de90 67 20 2a 2f 0a 20 20 20 20 2f 2a 20 43 6c 6f 73  g */.    /* Clos
2dea0 65 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 64  e the existing d
2deb0 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 73  atabase */.    s
2dec0 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c 6c  ession_close_all
2ded0 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (p);.    sqlite3
2dee0 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 29 3b 0a 20  _close(p->db);. 
2def0 20 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20     p->db = 0;.  
2df00 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65    p->zDbFilename
2df10 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
2df20 33 5f 66 72 65 65 28 70 2d 3e 7a 46 72 65 65 4f  3_free(p->zFreeO
2df30 6e 43 6c 6f 73 65 29 3b 0a 20 20 20 20 70 2d 3e  nClose);.    p->
2df40 7a 46 72 65 65 4f 6e 43 6c 6f 73 65 20 3d 20 30  zFreeOnClose = 0
2df50 3b 0a 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64  ;.    p->openMod
2df60 65 20 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 55  e = SHELL_OPEN_U
2df70 4e 53 50 45 43 3b 0a 20 20 20 20 2f 2a 20 43 68  NSPEC;.    /* Ch
2df80 65 63 6b 20 66 6f 72 20 63 6f 6d 6d 61 6e 64 2d  eck for command-
2df90 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 73 20 2a  line arguments *
2dfa0 2f 0a 20 20 20 20 66 6f 72 28 69 4e 61 6d 65 3d  /.    for(iName=
2dfb0 31 3b 20 69 4e 61 6d 65 3c 6e 41 72 67 20 26 26  1; iName<nArg &&
2dfc0 20 61 7a 41 72 67 5b 69 4e 61 6d 65 5d 5b 30 5d   azArg[iName][0]
2dfd0 3d 3d 27 2d 27 3b 20 69 4e 61 6d 65 2b 2b 29 7b  =='-'; iName++){
2dfe0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
2dff0 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 4e 61  r *z = azArg[iNa
2e000 6d 65 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 6f  me];.      if( o
2e010 70 74 69 6f 6e 4d 61 74 63 68 28 7a 2c 22 6e 65  ptionMatch(z,"ne
2e020 77 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  w") ){.        n
2e030 65 77 46 6c 61 67 20 3d 20 31 3b 0a 23 69 66 64  ewFlag = 1;.#ifd
2e040 65 66 20 53 51 4c 49 54 45 5f 48 41 56 45 5f 5a  ef SQLITE_HAVE_Z
2e050 49 50 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  IP.      }else i
2e060 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 7a  f( optionMatch(z
2e070 2c 20 22 7a 69 70 22 29 20 29 7b 0a 20 20 20 20  , "zip") ){.    
2e080 20 20 20 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20      p->openMode 
2e090 3d 20 53 48 45 4c 4c 5f 4f 50 45 4e 5f 5a 49 50  = SHELL_OPEN_ZIP
2e0a0 46 49 4c 45 3b 0a 23 65 6e 64 69 66 0a 20 20 20  FILE;.#endif.   
2e0b0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 74     }else if( opt
2e0c0 69 6f 6e 4d 61 74 63 68 28 7a 2c 20 22 61 70 70  ionMatch(z, "app
2e0d0 65 6e 64 22 29 20 29 7b 0a 20 20 20 20 20 20 20  end") ){.       
2e0e0 20 70 2d 3e 6f 70 65 6e 4d 6f 64 65 20 3d 20 53   p->openMode = S
2e0f0 48 45 4c 4c 5f 4f 50 45 4e 5f 41 50 50 45 4e 44  HELL_OPEN_APPEND
2e100 56 46 53 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  VFS;.      }else
2e110 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29   if( z[0]=='-' )
2e120 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
2e130 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75  rintf(stderr, "u
2e140 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25  nknown option: %
2e150 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20  s\n", z);.      
2e160 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
2e170 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
2e180 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  and_exit;.      
2e190 7d 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49  }.    }.    /* I
2e1a0 66 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 73 20  f a filename is 
2e1b0 73 70 65 63 69 66 69 65 64 2c 20 74 72 79 20 74  specified, try t
2e1c0 6f 20 6f 70 65 6e 20 69 74 20 66 69 72 73 74 20  o open it first 
2e1d0 2a 2f 0a 20 20 20 20 7a 4e 65 77 46 69 6c 65 6e  */.    zNewFilen
2e1e0 61 6d 65 20 3d 20 6e 41 72 67 3e 69 4e 61 6d 65  ame = nArg>iName
2e1f0 20 3f 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   ? sqlite3_mprin
2e200 74 66 28 22 25 73 22 2c 20 61 7a 41 72 67 5b 69  tf("%s", azArg[i
2e210 4e 61 6d 65 5d 29 20 3a 20 30 3b 0a 20 20 20 20  Name]) : 0;.    
2e220 69 66 28 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65  if( zNewFilename
2e230 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65   ){.      if( ne
2e240 77 46 6c 61 67 20 29 20 73 68 65 6c 6c 44 65 6c  wFlag ) shellDel
2e250 65 74 65 46 69 6c 65 28 7a 4e 65 77 46 69 6c 65  eteFile(zNewFile
2e260 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e  name);.      p->
2e270 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 4e  zDbFilename = zN
2e280 65 77 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20  ewFilename;.    
2e290 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 31 29 3b    open_db(p, 1);
2e2a0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 64 62  .      if( p->db
2e2b0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ==0 ){.        u
2e2c0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2e2d0 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  r, "Error: canno
2e2e0 74 20 6f 70 65 6e 20 27 25 73 27 5c 6e 22 2c 20  t open '%s'\n", 
2e2f0 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 29 3b 0a 20  zNewFilename);. 
2e300 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2e310 72 65 65 28 7a 4e 65 77 46 69 6c 65 6e 61 6d 65  ree(zNewFilename
2e320 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2e330 20 20 20 20 20 20 20 20 70 2d 3e 7a 46 72 65 65          p->zFree
2e340 4f 6e 43 6c 6f 73 65 20 3d 20 7a 4e 65 77 46 69  OnClose = zNewFi
2e350 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a  lename;.      }.
2e360 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d      }.    if( p-
2e370 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  >db==0 ){.      
2e380 2f 2a 20 41 73 20 61 20 66 61 6c 6c 2d 62 61 63  /* As a fall-bac
2e390 6b 20 6f 70 65 6e 20 61 20 54 45 4d 50 20 64 61  k open a TEMP da
2e3a0 74 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20  tabase */.      
2e3b0 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d  p->zDbFilename =
2e3c0 20 30 3b 0a 20 20 20 20 20 20 6f 70 65 6e 5f 64   0;.      open_d
2e3d0 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20  b(p, 0);.    }. 
2e3e0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
2e3f0 3d 27 6f 27 0a 20 20 20 26 26 20 28 73 74 72 6e  ='o'.   && (strn
2e400 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f  cmp(azArg[0], "o
2e410 75 74 70 75 74 22 2c 20 6e 29 3d 3d 30 20 7c 7c  utput", n)==0 ||
2e420 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2e430 5d 2c 20 22 6f 6e 63 65 22 2c 20 6e 29 3d 3d 30  ], "once", n)==0
2e440 29 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ).  ){.    const
2e450 20 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 6e   char *zFile = n
2e460 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72 67 5b 31  Arg>=2 ? azArg[1
2e470 5d 20 3a 20 22 73 74 64 6f 75 74 22 3b 0a 20 20  ] : "stdout";.  
2e480 20 20 69 66 28 20 6e 41 72 67 3e 32 20 29 7b 0a    if( nArg>2 ){.
2e490 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2e4a0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
2e4b0 3a 20 2e 25 73 20 46 49 4c 45 5c 6e 22 2c 20 61  : .%s FILE\n", a
2e4c0 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20  zArg[0]);.      
2e4d0 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f  rc = 1;.      go
2e4e0 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
2e4f0 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  exit;.    }.    
2e500 69 66 28 20 6e 3e 31 20 26 26 20 73 74 72 6e 63  if( n>1 && strnc
2e510 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f 6e  mp(azArg[0], "on
2e520 63 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ce", n)==0 ){.  
2e530 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20 29      if( nArg<2 )
2e540 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
2e550 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
2e560 61 67 65 3a 20 2e 6f 6e 63 65 20 46 49 4c 45 5c  age: .once FILE\
2e570 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  n");.        rc 
2e580 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 1;.        got
2e590 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
2e5a0 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xit;.      }.   
2e5b0 20 20 20 70 2d 3e 6f 75 74 43 6f 75 6e 74 20 3d     p->outCount =
2e5c0 20 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   2;.    }else{. 
2e5d0 20 20 20 20 20 70 2d 3e 6f 75 74 43 6f 75 6e 74       p->outCount
2e5e0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
2e5f0 6f 75 74 70 75 74 5f 72 65 73 65 74 28 70 29 3b  output_reset(p);
2e600 0a 20 20 20 20 69 66 28 20 7a 46 69 6c 65 5b 30  .    if( zFile[0
2e610 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69 66 64 65 66  ]=='|' ){.#ifdef
2e620 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f 50   SQLITE_OMIT_POP
2e630 45 4e 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  EN.      raw_pri
2e640 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
2e650 6f 72 3a 20 70 69 70 65 73 20 61 72 65 20 6e 6f  or: pipes are no
2e660 74 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20 74  t supported in t
2e670 68 69 73 20 4f 53 5c 6e 22 29 3b 0a 20 20 20 20  his OS\n");.    
2e680 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
2e690 70 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b  p->out = stdout;
2e6a0 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 70 2d 3e  .#else.      p->
2e6b0 6f 75 74 20 3d 20 70 6f 70 65 6e 28 7a 46 69 6c  out = popen(zFil
2e6c0 65 20 2b 20 31 2c 20 22 77 22 29 3b 0a 20 20 20  e + 1, "w");.   
2e6d0 20 20 20 69 66 28 20 70 2d 3e 6f 75 74 3d 3d 30     if( p->out==0
2e6e0 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
2e6f0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  _printf(stderr,"
2e700 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70  Error: cannot op
2e710 65 6e 20 70 69 70 65 20 5c 22 25 73 5c 22 5c 6e  en pipe \"%s\"\n
2e720 22 2c 20 7a 46 69 6c 65 20 2b 20 31 29 3b 0a 20  ", zFile + 1);. 
2e730 20 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20         p->out = 
2e740 73 74 64 6f 75 74 3b 0a 20 20 20 20 20 20 20 20  stdout;.        
2e750 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  rc = 1;.      }e
2e760 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
2e770 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
2e780 7a 65 6f 66 28 70 2d 3e 6f 75 74 66 69 6c 65 29  zeof(p->outfile)
2e790 2c 20 70 2d 3e 6f 75 74 66 69 6c 65 2c 20 22 25  , p->outfile, "%
2e7a0 73 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20  s", zFile);.    
2e7b0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d    }.#endif.    }
2e7c0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6f  else{.      p->o
2e7d0 75 74 20 3d 20 6f 75 74 70 75 74 5f 66 69 6c 65  ut = output_file
2e7e0 5f 6f 70 65 6e 28 7a 46 69 6c 65 29 3b 0a 20 20  _open(zFile);.  
2e7f0 20 20 20 20 69 66 28 20 70 2d 3e 6f 75 74 3d 3d      if( p->out==
2e800 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  0 ){.        if(
2e810 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 22 6f   strcmp(zFile,"o
2e820 66 66 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ff")!=0 ){.     
2e830 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2e840 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20  (stderr,"Error: 
2e850 63 61 6e 6e 6f 74 20 77 72 69 74 65 20 74 6f 20  cannot write to 
2e860 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65  \"%s\"\n", zFile
2e870 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2e880 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74       p->out = st
2e890 64 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 72 63  dout;.        rc
2e8a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 20 65 6c   = 1;.      } el
2e8b0 73 65 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  se {.        sql
2e8c0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
2e8d0 7a 65 6f 66 28 70 2d 3e 6f 75 74 66 69 6c 65 29  zeof(p->outfile)
2e8e0 2c 20 70 2d 3e 6f 75 74 66 69 6c 65 2c 20 22 25  , p->outfile, "%
2e8f0 73 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20  s", zFile);.    
2e900 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
2e910 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 70 27 20  e..  if( c=='p' 
2e920 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63  && n>=3 && strnc
2e930 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 70 72  mp(azArg[0], "pr
2e940 69 6e 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  int", n)==0 ){. 
2e950 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f     int i;.    fo
2e960 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=1; i<nArg; i
2e970 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69  ++){.      if( i
2e980 3e 31 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28  >1 ) raw_printf(
2e990 70 2d 3e 6f 75 74 2c 20 22 20 22 29 3b 0a 20 20  p->out, " ");.  
2e9a0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2e9b0 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 61 7a  p->out, "%s", az
2e9c0 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20  Arg[i]);.    }. 
2e9d0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
2e9e0 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d  >out, "\n");.  }
2e9f0 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
2ea00 70 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  p' && strncmp(az
2ea10 41 72 67 5b 30 5d 2c 20 22 70 72 6f 6d 70 74 22  Arg[0], "prompt"
2ea20 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
2ea30 66 28 20 6e 41 72 67 20 3e 3d 20 32 29 20 7b 0a  f( nArg >= 2) {.
2ea40 20 20 20 20 20 20 73 74 72 6e 63 70 79 28 6d 61        strncpy(ma
2ea50 69 6e 50 72 6f 6d 70 74 2c 61 7a 41 72 67 5b 31  inPrompt,azArg[1
2ea60 5d 2c 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65  ],(int)ArraySize
2ea70 28 6d 61 69 6e 50 72 6f 6d 70 74 29 2d 31 29 3b  (mainPrompt)-1);
2ea80 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
2ea90 41 72 67 20 3e 3d 20 33 29 20 7b 0a 20 20 20 20  Arg >= 3) {.    
2eaa0 20 20 73 74 72 6e 63 70 79 28 63 6f 6e 74 69 6e    strncpy(contin
2eab0 75 65 50 72 6f 6d 70 74 2c 61 7a 41 72 67 5b 32  uePrompt,azArg[2
2eac0 5d 2c 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65  ],(int)ArraySize
2ead0 28 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 29  (continuePrompt)
2eae0 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  -1);.    }.  }el
2eaf0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 71 27  se..  if( c=='q'
2eb00 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2eb10 67 5b 30 5d 2c 20 22 71 75 69 74 22 2c 20 6e 29  g[0], "quit", n)
2eb20 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20  ==0 ){.    rc = 
2eb30 32 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  2;.  }else..  if
2eb40 28 20 63 3d 3d 27 72 27 20 26 26 20 6e 3e 3d 33  ( c=='r' && n>=3
2eb50 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2eb60 67 5b 30 5d 2c 20 22 72 65 61 64 22 2c 20 6e 29  g[0], "read", n)
2eb70 3d 3d 30 20 29 7b 0a 20 20 20 20 46 49 4c 45 20  ==0 ){.    FILE 
2eb80 2a 61 6c 74 3b 0a 20 20 20 20 69 66 28 20 6e 41  *alt;.    if( nA
2eb90 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72  rg!=2 ){.      r
2eba0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
2ebb0 2c 20 22 55 73 61 67 65 3a 20 2e 72 65 61 64 20  , "Usage: .read 
2ebc0 46 49 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20  FILE\n");.      
2ebd0 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f  rc = 1;.      go
2ebe0 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
2ebf0 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  exit;.    }.    
2ec00 61 6c 74 20 3d 20 66 6f 70 65 6e 28 61 7a 41 72  alt = fopen(azAr
2ec10 67 5b 31 5d 2c 20 22 72 62 22 29 3b 0a 20 20 20  g[1], "rb");.   
2ec20 20 69 66 28 20 61 6c 74 3d 3d 30 20 29 7b 0a 20   if( alt==0 ){. 
2ec30 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2ec40 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20  (stderr,"Error: 
2ec50 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73  cannot open \"%s
2ec60 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29  \"\n", azArg[1])
2ec70 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
2ec80 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2ec90 20 72 63 20 3d 20 70 72 6f 63 65 73 73 5f 69 6e   rc = process_in
2eca0 70 75 74 28 70 2c 20 61 6c 74 29 3b 0a 20 20 20  put(p, alt);.   
2ecb0 20 20 20 66 63 6c 6f 73 65 28 61 6c 74 29 3b 0a     fclose(alt);.
2ecc0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
2ecd0 20 69 66 28 20 63 3d 3d 27 72 27 20 26 26 20 6e   if( c=='r' && n
2ece0 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
2ecf0 7a 41 72 67 5b 30 5d 2c 20 22 72 65 73 74 6f 72  zArg[0], "restor
2ed00 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  e", n)==0 ){.   
2ed10 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 72   const char *zSr
2ed20 63 46 69 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74  cFile;.    const
2ed30 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 20 20   char *zDb;.    
2ed40 73 71 6c 69 74 65 33 20 2a 70 53 72 63 3b 0a 20  sqlite3 *pSrc;. 
2ed50 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75     sqlite3_backu
2ed60 70 20 2a 70 42 61 63 6b 75 70 3b 0a 20 20 20 20  p *pBackup;.    
2ed70 69 6e 74 20 6e 54 69 6d 65 6f 75 74 20 3d 20 30  int nTimeout = 0
2ed80 3b 0a 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  ;..    if( nArg=
2ed90 3d 32 20 29 7b 0a 20 20 20 20 20 20 7a 53 72 63  =2 ){.      zSrc
2eda0 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b  File = azArg[1];
2edb0 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 22 6d 61  .      zDb = "ma
2edc0 69 6e 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  in";.    }else i
2edd0 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20 20  f( nArg==3 ){.  
2ede0 20 20 20 20 7a 53 72 63 46 69 6c 65 20 3d 20 61      zSrcFile = a
2edf0 7a 41 72 67 5b 32 5d 3b 0a 20 20 20 20 20 20 7a  zArg[2];.      z
2ee00 44 62 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20  Db = azArg[1];. 
2ee10 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2ee20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2ee30 72 2c 20 22 55 73 61 67 65 3a 20 2e 72 65 73 74  r, "Usage: .rest
2ee40 6f 72 65 20 3f 44 42 3f 20 46 49 4c 45 5c 6e 22  ore ?DB? FILE\n"
2ee50 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
2ee60 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61  .      goto meta
2ee70 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
2ee80 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
2ee90 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 53 72 63 46  lite3_open(zSrcF
2eea0 69 6c 65 2c 20 26 70 53 72 63 29 3b 0a 20 20 20  ile, &pSrc);.   
2eeb0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
2eec0 4f 4b 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  OK ){.      utf8
2eed0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2eee0 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f  "Error: cannot o
2eef0 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a  pen \"%s\"\n", z
2ef00 53 72 63 46 69 6c 65 29 3b 0a 20 20 20 20 20 20  SrcFile);.      
2ef10 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 53  sqlite3_close(pS
2ef20 72 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  rc);.      retur
2ef30 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f  n 1;.    }.    o
2ef40 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
2ef50 20 20 70 42 61 63 6b 75 70 20 3d 20 73 71 6c 69    pBackup = sqli
2ef60 74 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28  te3_backup_init(
2ef70 70 2d 3e 64 62 2c 20 7a 44 62 2c 20 70 53 72 63  p->db, zDb, pSrc
2ef80 2c 20 22 6d 61 69 6e 22 29 3b 0a 20 20 20 20 69  , "main");.    i
2ef90 66 28 20 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b  f( pBackup==0 ){
2efa0 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
2efb0 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
2efc0 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  r: %s\n", sqlite
2efd0 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29  3_errmsg(p->db))
2efe0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2eff0 63 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 20  close(pSrc);.   
2f000 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
2f010 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72   }.    while( (r
2f020 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  c = sqlite3_back
2f030 75 70 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c  up_step(pBackup,
2f040 31 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  100))==SQLITE_OK
2f050 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 72 63  .          || rc
2f060 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 20 29  ==SQLITE_BUSY  )
2f070 7b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  {.      if( rc==
2f080 53 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20  SQLITE_BUSY ){. 
2f090 20 20 20 20 20 20 20 69 66 28 20 6e 54 69 6d 65         if( nTime
2f0a0 6f 75 74 2b 2b 20 3e 3d 20 33 20 29 20 62 72 65  out++ >= 3 ) bre
2f0b0 61 6b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ak;.        sqli
2f0c0 74 65 33 5f 73 6c 65 65 70 28 31 30 30 29 3b 0a  te3_sleep(100);.
2f0d0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2f0e0 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
2f0f0 5f 66 69 6e 69 73 68 28 70 42 61 63 6b 75 70 29  _finish(pBackup)
2f100 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51  ;.    if( rc==SQ
2f110 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20  LITE_DONE ){.   
2f120 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d     rc = 0;.    }
2f130 65 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c  else if( rc==SQL
2f140 49 54 45 5f 42 55 53 59 20 7c 7c 20 72 63 3d 3d  ITE_BUSY || rc==
2f150 53 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 29 7b  SQLITE_LOCKED ){
2f160 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
2f170 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
2f180 3a 20 73 6f 75 72 63 65 20 64 61 74 61 62 61 73  : source databas
2f190 65 20 69 73 20 62 75 73 79 5c 6e 22 29 3b 0a 20  e is busy\n");. 
2f1a0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
2f1b0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 74   }else{.      ut
2f1c0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2f1d0 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  , "Error: %s\n",
2f1e0 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
2f1f0 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 72  p->db));.      r
2f200 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  c = 1;.    }.   
2f210 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70   sqlite3_close(p
2f220 53 72 63 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 0a  Src);.  }else...
2f230 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20    if( c=='s' && 
2f240 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2f250 2c 20 22 73 63 61 6e 73 74 61 74 73 22 2c 20 6e  , "scanstats", n
2f260 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
2f270 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20  nArg==2 ){.     
2f280 20 70 2d 3e 73 63 61 6e 73 74 61 74 73 4f 6e 20   p->scanstatsOn 
2f290 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61  = booleanValue(a
2f2a0 7a 41 72 67 5b 31 5d 29 3b 0a 23 69 66 6e 64 65  zArg[1]);.#ifnde
2f2b0 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
2f2c0 53 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a  STMT_SCANSTATUS.
2f2d0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2f2e0 28 73 74 64 65 72 72 2c 20 22 57 61 72 6e 69 6e  (stderr, "Warnin
2f2f0 67 3a 20 2e 73 63 61 6e 73 74 61 74 73 20 6e 6f  g: .scanstats no
2f300 74 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74  t available in t
2f310 68 69 73 20 62 75 69 6c 64 2e 5c 6e 22 29 3b 0a  his build.\n");.
2f320 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65  #endif.    }else
2f330 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
2f340 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
2f350 65 3a 20 2e 73 63 61 6e 73 74 61 74 73 20 6f 6e  e: .scanstats on
2f360 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20  |off\n");.      
2f370 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
2f380 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
2f390 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  's' && strncmp(a
2f3a0 7a 41 72 67 5b 30 5d 2c 20 22 73 63 68 65 6d 61  zArg[0], "schema
2f3b0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
2f3c0 53 68 65 6c 6c 54 65 78 74 20 73 53 65 6c 65 63  ShellText sSelec
2f3d0 74 3b 0a 20 20 20 20 53 68 65 6c 6c 53 74 61 74  t;.    ShellStat
2f3e0 65 20 64 61 74 61 3b 0a 20 20 20 20 63 68 61 72  e data;.    char
2f3f0 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
2f400 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2f410 44 69 76 20 3d 20 22 28 22 3b 0a 20 20 20 20 63  Div = "(";.    c
2f420 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
2f430 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 53   = 0;.    int iS
2f440 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 69  chema = 0;.    i
2f450 6e 74 20 62 44 65 62 75 67 20 3d 20 30 3b 0a 20  nt bDebug = 0;. 
2f460 20 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 20 20     int ii;..    
2f470 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
2f480 20 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 2c     memcpy(&data,
2f490 20 70 2c 20 73 69 7a 65 6f 66 28 64 61 74 61 29   p, sizeof(data)
2f4a0 29 3b 0a 20 20 20 20 64 61 74 61 2e 73 68 6f 77  );.    data.show
2f4b0 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20  Header = 0;.    
2f4c0 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74  data.cMode = dat
2f4d0 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 53 65  a.mode = MODE_Se
2f4e0 6d 69 3b 0a 20 20 20 20 69 6e 69 74 54 65 78 74  mi;.    initText
2f4f0 28 26 73 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  (&sSelect);.    
2f500 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e 41 72  for(ii=1; ii<nAr
2f510 67 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  g; ii++){.      
2f520 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28  if( optionMatch(
2f530 61 7a 41 72 67 5b 69 69 5d 2c 22 69 6e 64 65 6e  azArg[ii],"inden
2f540 74 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 64  t") ){.        d
2f550 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61  ata.cMode = data
2f560 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 50 72 65  .mode = MODE_Pre
2f570 74 74 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  tty;.      }else
2f580 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68   if( optionMatch
2f590 28 61 7a 41 72 67 5b 69 69 5d 2c 22 64 65 62 75  (azArg[ii],"debu
2f5a0 67 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62  g") ){.        b
2f5b0 44 65 62 75 67 20 3d 20 31 3b 0a 20 20 20 20 20  Debug = 1;.     
2f5c0 20 7d 65 6c 73 65 20 69 66 28 20 7a 4e 61 6d 65   }else if( zName
2f5d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a  ==0 ){.        z
2f5e0 4e 61 6d 65 20 3d 20 61 7a 41 72 67 5b 69 69 5d  Name = azArg[ii]
2f5f0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2f600 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
2f610 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
2f620 3a 20 2e 73 63 68 65 6d 61 20 3f 2d 2d 69 6e 64  : .schema ?--ind
2f630 65 6e 74 3f 20 3f 4c 49 4b 45 2d 50 41 54 54 45  ent? ?LIKE-PATTE
2f640 52 4e 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  RN?\n");.       
2f650 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
2f660 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
2f670 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d  nd_exit;.      }
2f680 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
2f690 4e 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20  Name!=0 ){.     
2f6a0 20 69 6e 74 20 69 73 4d 61 73 74 65 72 20 3d 20   int isMaster = 
2f6b0 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28  sqlite3_strlike(
2f6c0 7a 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 6d  zName, "sqlite_m
2f6d0 61 73 74 65 72 22 2c 20 30 29 3d 3d 30 3b 0a 20  aster", 0)==0;. 
2f6e0 20 20 20 20 20 69 66 28 20 69 73 4d 61 73 74 65       if( isMaste
2f6f0 72 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72  r || sqlite3_str
2f700 6c 69 6b 65 28 7a 4e 61 6d 65 2c 22 73 71 6c 69  like(zName,"sqli
2f710 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 2c  te_temp_master",
2f720 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  0)==0 ){.       
2f730 20 63 68 61 72 20 2a 6e 65 77 5f 61 72 67 76 5b   char *new_argv[
2f740 32 5d 2c 20 2a 6e 65 77 5f 63 6f 6c 76 5b 32 5d  2], *new_colv[2]
2f750 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 61 72  ;.        new_ar
2f760 67 76 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f  gv[0] = sqlite3_
2f770 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20  mprintf(.       
2f780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2f790 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 73 20  CREATE TABLE %s 
2f7a0 28 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  (\n".           
2f7b0 20 20 20 20 20 20 20 20 20 20 20 22 20 20 74 79             "  ty
2f7c0 70 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20  pe text,\n".    
2f7d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f7e0 20 20 22 20 20 6e 61 6d 65 20 74 65 78 74 2c 5c    "  name text,\
2f7f0 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
2f800 20 20 20 20 20 20 20 20 20 22 20 20 74 62 6c 5f           "  tbl_
2f810 6e 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20  name text,\n".  
2f820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f830 20 20 20 20 22 20 20 72 6f 6f 74 70 61 67 65 20      "  rootpage 
2f840 69 6e 74 65 67 65 72 2c 5c 6e 22 0a 20 20 20 20  integer,\n".    
2f850 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f860 20 20 22 20 20 73 71 6c 20 74 65 78 74 5c 6e 22    "  sql text\n"
2f870 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f880 20 20 20 20 20 20 20 22 29 22 2c 20 69 73 4d 61         ")", isMa
2f890 73 74 65 72 20 3f 20 22 73 71 6c 69 74 65 5f 6d  ster ? "sqlite_m
2f8a0 61 73 74 65 72 22 20 3a 20 22 73 71 6c 69 74 65  aster" : "sqlite
2f8b0 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 29 3b 0a  _temp_master");.
2f8c0 20 20 20 20 20 20 20 20 6e 65 77 5f 61 72 67 76          new_argv
2f8d0 5b 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  [1] = 0;.       
2f8e0 20 6e 65 77 5f 63 6f 6c 76 5b 30 5d 20 3d 20 22   new_colv[0] = "
2f8f0 73 71 6c 22 3b 0a 20 20 20 20 20 20 20 20 6e 65  sql";.        ne
2f900 77 5f 63 6f 6c 76 5b 31 5d 20 3d 20 30 3b 0a 20  w_colv[1] = 0;. 
2f910 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 28         callback(
2f920 26 64 61 74 61 2c 20 31 2c 20 6e 65 77 5f 61 72  &data, 1, new_ar
2f930 67 76 2c 20 6e 65 77 5f 63 6f 6c 76 29 3b 0a 20  gv, new_colv);. 
2f940 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
2f950 72 65 65 28 6e 65 77 5f 61 72 67 76 5b 30 5d 29  ree(new_argv[0])
2f960 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2f970 20 20 20 20 69 66 28 20 7a 44 69 76 20 29 7b 0a      if( zDiv ){.
2f980 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
2f990 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
2f9a0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2f9b0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
2f9c0 64 62 2c 20 22 53 45 4c 45 43 54 20 6e 61 6d 65  db, "SELECT name
2f9d0 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 64 61 74   FROM pragma_dat
2f9e0 61 62 61 73 65 5f 6c 69 73 74 22 2c 0a 20 20 20  abase_list",.   
2f9f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fa00 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 26             -1, &
2fa10 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20  pStmt, 0);.     
2fa20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
2fa30 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2fa40 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25  tderr, "Error: %
2fa50 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  s\n", sqlite3_er
2fa60 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20  rmsg(p->db));.  
2fa70 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
2fa80 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
2fa90 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
2faa0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61         goto meta
2fab0 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
2fac0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 70 70       }.      app
2fad0 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
2fae0 2c 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52  , "SELECT sql FR
2faf0 4f 4d 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  OM", 0);.      i
2fb00 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20  Schema = 0;.    
2fb10 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33    while( sqlite3
2fb20 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51  _step(pStmt)==SQ
2fb30 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
2fb40 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2fb50 7a 44 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  zDb = (const cha
2fb60 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
2fb70 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29  n_text(pStmt, 0)
2fb80 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a  ;.        char z
2fb90 53 63 4e 75 6d 5b 33 30 5d 3b 0a 20 20 20 20 20  ScNum[30];.     
2fba0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2fbb0 6e 74 66 28 73 69 7a 65 6f 66 28 7a 53 63 4e 75  ntf(sizeof(zScNu
2fbc0 6d 29 2c 20 7a 53 63 4e 75 6d 2c 20 22 25 64 22  m), zScNum, "%d"
2fbd0 2c 20 2b 2b 69 53 63 68 65 6d 61 29 3b 0a 20 20  , ++iSchema);.  
2fbe0 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
2fbf0 28 26 73 53 65 6c 65 63 74 2c 20 7a 44 69 76 2c  (&sSelect, zDiv,
2fc00 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7a 44 69   0);.        zDi
2fc10 76 20 3d 20 22 20 55 4e 49 4f 4e 20 41 4c 4c 20  v = " UNION ALL 
2fc20 22 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  ";.        appen
2fc30 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
2fc40 22 53 45 4c 45 43 54 20 73 68 65 6c 6c 5f 61 64  "SELECT shell_ad
2fc50 64 5f 73 63 68 65 6d 61 28 73 71 6c 2c 22 2c 20  d_schema(sql,", 
2fc60 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
2fc70 73 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28  sqlite3_stricmp(
2fc80 7a 44 62 2c 20 22 6d 61 69 6e 22 29 21 3d 30 20  zDb, "main")!=0 
2fc90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 70  ){.          app
2fca0 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
2fcb0 2c 20 7a 44 62 2c 20 27 22 27 29 3b 0a 20 20 20  , zDb, '"');.   
2fcc0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2fcd0 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
2fce0 28 26 73 53 65 6c 65 63 74 2c 20 22 4e 55 4c 4c  (&sSelect, "NULL
2fcf0 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  ", 0);.        }
2fd00 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
2fd10 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 2c  ext(&sSelect, ",
2fd20 6e 61 6d 65 29 20 41 53 20 73 71 6c 2c 20 74 79  name) AS sql, ty
2fd30 70 65 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61  pe, tbl_name, na
2fd40 6d 65 2c 20 72 6f 77 69 64 2c 22 2c 20 30 29 3b  me, rowid,", 0);
2fd50 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
2fd60 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 53  ext(&sSelect, zS
2fd70 63 4e 75 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20  cNum, 0);.      
2fd80 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
2fd90 65 6c 65 63 74 2c 20 22 20 41 53 20 73 6e 75 6d  elect, " AS snum
2fda0 2c 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , ", 0);.       
2fdb0 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
2fdc0 6c 65 63 74 2c 20 7a 44 62 2c 20 27 5c 27 27 29  lect, zDb, '\'')
2fdd0 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ;.        append
2fde0 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22  Text(&sSelect, "
2fdf0 20 41 53 20 73 6e 61 6d 65 20 46 52 4f 4d 20 22   AS sname FROM "
2fe00 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70  , 0);.        ap
2fe10 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63  pendText(&sSelec
2fe20 74 2c 20 7a 44 62 2c 20 27 22 27 29 3b 0a 20 20  t, zDb, '"');.  
2fe30 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
2fe40 28 26 73 53 65 6c 65 63 74 2c 20 22 2e 73 71 6c  (&sSelect, ".sql
2fe50 69 74 65 5f 6d 61 73 74 65 72 22 2c 20 30 29 3b  ite_master", 0);
2fe60 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
2fe70 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
2fe80 70 53 74 6d 74 29 3b 0a 23 69 66 64 65 66 20 53  pStmt);.#ifdef S
2fe90 51 4c 49 54 45 5f 49 4e 54 52 4f 53 50 45 43 54  QLITE_INTROSPECT
2fea0 49 4f 4e 5f 50 52 41 47 4d 41 53 0a 20 20 20 20  ION_PRAGMAS.    
2feb0 20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20    if( zName ){. 
2fec0 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
2fed0 74 28 26 73 53 65 6c 65 63 74 2c 0a 20 20 20 20  t(&sSelect,.    
2fee0 20 20 20 20 20 20 20 22 20 55 4e 49 4f 4e 20 41         " UNION A
2fef0 4c 4c 20 53 45 4c 45 43 54 20 73 68 65 6c 6c 5f  LL SELECT shell_
2ff00 6d 6f 64 75 6c 65 5f 73 63 68 65 6d 61 28 6e 61  module_schema(na
2ff10 6d 65 29 2c 22 0a 20 20 20 20 20 20 20 20 20 20  me),".          
2ff20 20 22 20 27 74 61 62 6c 65 27 2c 20 6e 61 6d 65   " 'table', name
2ff30 2c 20 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20 39 65  , name, name, 9e
2ff40 2b 39 39 2c 20 27 6d 61 69 6e 27 20 46 52 4f 4d  +99, 'main' FROM
2ff50 20 70 72 61 67 6d 61 5f 6d 6f 64 75 6c 65 5f 6c   pragma_module_l
2ff60 69 73 74 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ist", 0);.      
2ff70 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 61  }.#endif.      a
2ff80 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
2ff90 63 74 2c 20 22 29 20 57 48 45 52 45 20 22 2c 20  ct, ") WHERE ", 
2ffa0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4e  0);.      if( zN
2ffb0 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ame ){.        c
2ffc0 68 61 72 20 2a 7a 51 61 72 67 20 3d 20 73 71 6c  har *zQarg = sql
2ffd0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 51  ite3_mprintf("%Q
2ffe0 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  ", zName);.     
2fff0 20 20 20 69 66 28 20 73 74 72 63 68 72 28 7a 4e     if( strchr(zN
30000 61 6d 65 2c 20 27 2e 27 29 20 29 7b 0a 20 20 20  ame, '.') ){.   
30010 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
30020 74 28 26 73 53 65 6c 65 63 74 2c 20 22 6c 6f 77  t(&sSelect, "low
30030 65 72 28 70 72 69 6e 74 66 28 27 25 73 2e 25 73  er(printf('%s.%s
30040 27 2c 73 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65  ',sname,tbl_name
30050 29 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ))", 0);.       
30060 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
30070 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
30080 65 6c 65 63 74 2c 20 22 6c 6f 77 65 72 28 74 62  elect, "lower(tb
30090 6c 5f 6e 61 6d 65 29 22 2c 20 30 29 3b 0a 20 20  l_name)", 0);.  
300a0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
300b0 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
300c0 65 63 74 2c 20 73 74 72 63 68 72 28 7a 4e 61 6d  ect, strchr(zNam
300d0 65 2c 20 27 2a 27 29 20 3f 20 22 20 47 4c 4f 42  e, '*') ? " GLOB
300e0 20 22 20 3a 20 22 20 4c 49 4b 45 20 22 2c 20 30   " : " LIKE ", 0
300f0 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  );.        appen
30100 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
30110 7a 51 61 72 67 2c 20 30 29 3b 0a 20 20 20 20 20  zQarg, 0);.     
30120 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
30130 53 65 6c 65 63 74 2c 20 22 20 41 4e 44 20 22 2c  Select, " AND ",
30140 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c   0);.        sql
30150 69 74 65 33 5f 66 72 65 65 28 7a 51 61 72 67 29  ite3_free(zQarg)
30160 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
30170 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
30180 65 63 74 2c 20 22 74 79 70 65 21 3d 27 6d 65 74  ect, "type!='met
30190 61 27 20 41 4e 44 20 73 71 6c 20 49 53 20 4e 4f  a' AND sql IS NO
301a0 54 20 4e 55 4c 4c 22 0a 20 20 20 20 20 20 20 20  T NULL".        
301b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
301c0 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 73 6e     " ORDER BY sn
301d0 75 6d 2c 20 72 6f 77 69 64 22 2c 20 30 29 3b 0a  um, rowid", 0);.
301e0 20 20 20 20 20 20 69 66 28 20 62 44 65 62 75 67        if( bDebug
301f0 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
30200 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
30210 22 53 51 4c 3a 20 25 73 3b 5c 6e 22 2c 20 73 53  "SQL: %s;\n", sS
30220 65 6c 65 63 74 2e 7a 29 3b 0a 20 20 20 20 20 20  elect.z);.      
30230 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72  }else{.        r
30240 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
30250 28 70 2d 3e 64 62 2c 20 73 53 65 6c 65 63 74 2e  (p->db, sSelect.
30260 7a 2c 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61  z, callback, &da
30270 74 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20  ta, &zErrMsg);. 
30280 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 72 65       }.      fre
30290 65 54 65 78 74 28 26 73 53 65 6c 65 63 74 29 3b  eText(&sSelect);
302a0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
302b0 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20  ErrMsg ){.      
302c0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
302d0 72 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  rr,"Error: %s\n"
302e0 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  , zErrMsg);.    
302f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
30300 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72  ErrMsg);.      r
30310 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 1;.    }else
30320 20 69 66 28 20 72 63 20 21 3d 20 53 51 4c 49 54   if( rc != SQLIT
30330 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 61  E_OK ){.      ra
30340 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
30350 22 45 72 72 6f 72 3a 20 71 75 65 72 79 69 6e 67  "Error: querying
30360 20 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74   schema informat
30370 69 6f 6e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  ion\n");.      r
30380 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 1;.    }else
30390 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a  {.      rc = 0;.
303a0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23      }.  }else..#
303b0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
303c0 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69  E_DEBUG) && defi
303d0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
303e0 45 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a 20  E_SELECTTRACE). 
303f0 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20 6e   if( c=='s' && n
30400 3d 3d 31 31 20 26 26 20 73 74 72 6e 63 6d 70 28  ==11 && strncmp(
30410 61 7a 41 72 67 5b 30 5d 2c 20 22 73 65 6c 65 63  azArg[0], "selec
30420 74 74 72 61 63 65 22 2c 20 6e 29 3d 3d 30 20 29  ttrace", n)==0 )
30430 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c  {.    sqlite3Sel
30440 65 63 74 54 72 61 63 65 20 3d 20 28 69 6e 74 29  ectTrace = (int)
30450 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41  integerValue(azA
30460 72 67 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 0a  rg[1]);.  }else.
30470 23 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69  #endif..#if defi
30480 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
30490 45 5f 53 45 53 53 49 4f 4e 29 0a 20 20 69 66 28  E_SESSION).  if(
304a0 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72 6e 63   c=='s' && strnc
304b0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22 73 65 73  mp(azArg[0],"ses
304c0 73 69 6f 6e 22 2c 6e 29 3d 3d 30 20 26 26 20 6e  sion",n)==0 && n
304d0 3e 3d 33 20 29 7b 0a 20 20 20 20 4f 70 65 6e 53  >=3 ){.    OpenS
304e0 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e  ession *pSession
304f0 20 3d 20 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b   = &p->aSession[
30500 30 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61  0];.    char **a
30510 7a 43 6d 64 20 3d 20 26 61 7a 41 72 67 5b 31 5d  zCmd = &azArg[1]
30520 3b 0a 20 20 20 20 69 6e 74 20 69 53 65 73 20 3d  ;.    int iSes =
30530 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6d 64   0;.    int nCmd
30540 20 3d 20 6e 41 72 67 20 2d 20 31 3b 0a 20 20 20   = nArg - 1;.   
30550 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20   int i;.    if( 
30560 6e 41 72 67 3c 3d 31 20 29 20 67 6f 74 6f 20 73  nArg<=1 ) goto s
30570 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72  ession_syntax_er
30580 72 6f 72 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62  ror;.    open_db
30590 28 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  (p, 0);.    if( 
305a0 6e 41 72 67 3e 3d 33 20 29 7b 0a 20 20 20 20 20  nArg>=3 ){.     
305b0 20 66 6f 72 28 69 53 65 73 3d 30 3b 20 69 53 65   for(iSes=0; iSe
305c0 73 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b 20 69  s<p->nSession; i
305d0 53 65 73 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  Ses++){.        
305e0 69 66 28 20 73 74 72 63 6d 70 28 70 2d 3e 61 53  if( strcmp(p->aS
305f0 65 73 73 69 6f 6e 5b 69 53 65 73 5d 2e 7a 4e 61  ession[iSes].zNa
30600 6d 65 2c 20 61 7a 41 72 67 5b 31 5d 29 3d 3d 30  me, azArg[1])==0
30610 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
30620 7d 0a 20 20 20 20 20 20 69 66 28 20 69 53 65 73  }.      if( iSes
30630 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a  <p->nSession ){.
30640 20 20 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e          pSession
30650 20 3d 20 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b   = &p->aSession[
30660 69 53 65 73 5d 3b 0a 20 20 20 20 20 20 20 20 61  iSes];.        a
30670 7a 43 6d 64 2b 2b 3b 0a 20 20 20 20 20 20 20 20  zCmd++;.        
30680 6e 43 6d 64 2d 2d 3b 0a 20 20 20 20 20 20 7d 65  nCmd--;.      }e
30690 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 53 65  lse{.        pSe
306a0 73 73 69 6f 6e 20 3d 20 26 70 2d 3e 61 53 65 73  ssion = &p->aSes
306b0 73 69 6f 6e 5b 30 5d 3b 0a 20 20 20 20 20 20 20  sion[0];.       
306c0 20 69 53 65 73 20 3d 20 30 3b 0a 20 20 20 20 20   iSes = 0;.     
306d0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
306e0 20 2e 73 65 73 73 69 6f 6e 20 61 74 74 61 63 68   .session attach
306f0 20 54 41 42 4c 45 0a 20 20 20 20 2a 2a 20 49 6e   TABLE.    ** In
30700 76 6f 6b 65 20 74 68 65 20 73 71 6c 69 74 65 33  voke the sqlite3
30710 73 65 73 73 69 6f 6e 5f 61 74 74 61 63 68 28 29  session_attach()
30720 20 69 6e 74 65 72 66 61 63 65 20 74 6f 20 61 74   interface to at
30730 74 61 63 68 20 61 20 70 61 72 74 69 63 75 6c 61  tach a particula
30740 72 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 73  r.    ** table s
30750 6f 20 74 68 61 74 20 69 74 20 69 73 20 6e 65 76  o that it is nev
30760 65 72 20 66 69 6c 74 65 72 65 64 2e 0a 20 20 20  er filtered..   
30770 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63   */.    if( strc
30780 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 61 74 74  mp(azCmd[0],"att
30790 61 63 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ach")==0 ){.    
307a0 20 20 69 66 28 20 6e 43 6d 64 21 3d 32 20 29 20    if( nCmd!=2 ) 
307b0 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e  goto session_syn
307c0 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  tax_error;.     
307d0 20 69 66 28 20 70 53 65 73 73 69 6f 6e 2d 3e 70   if( pSession->p
307e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ==0 ){.        s
307f0 65 73 73 69 6f 6e 5f 6e 6f 74 5f 6f 70 65 6e 3a  ession_not_open:
30800 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
30810 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 52 52  ntf(stderr, "ERR
30820 4f 52 3a 20 4e 6f 20 73 65 73 73 69 6f 6e 73 20  OR: No sessions 
30830 61 72 65 20 6f 70 65 6e 5c 6e 22 29 3b 0a 20 20  are open\n");.  
30840 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
30850 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 73     rc = sqlite3s
30860 65 73 73 69 6f 6e 5f 61 74 74 61 63 68 28 70 53  ession_attach(pS
30870 65 73 73 69 6f 6e 2d 3e 70 2c 20 61 7a 43 6d 64  ession->p, azCmd
30880 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  [1]);.        if
30890 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
308a0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
308b0 65 72 72 2c 20 22 45 52 52 4f 52 3a 20 73 71 6c  err, "ERROR: sql
308c0 69 74 65 33 73 65 73 73 69 6f 6e 5f 61 74 74 61  ite3session_atta
308d0 63 68 28 29 20 72 65 74 75 72 6e 73 20 25 64 5c  ch() returns %d\
308e0 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  n", rc);.       
308f0 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 20     rc = 0;.     
30900 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
30910 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e   }else..    /* .
30920 73 65 73 73 69 6f 6e 20 63 68 61 6e 67 65 73 65  session changese
30930 74 20 46 49 4c 45 0a 20 20 20 20 2a 2a 20 2e 73  t FILE.    ** .s
30940 65 73 73 69 6f 6e 20 70 61 74 63 68 73 65 74 20  ession patchset 
30950 46 49 4c 45 0a 20 20 20 20 2a 2a 20 57 72 69 74  FILE.    ** Writ
30960 65 20 61 20 63 68 61 6e 67 65 73 65 74 20 6f 72  e a changeset or
30970 20 70 61 74 63 68 73 65 74 20 69 6e 74 6f 20 61   patchset into a
30980 20 66 69 6c 65 2e 20 20 54 68 65 20 66 69 6c 65   file.  The file
30990 20 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 2e   is overwritten.
309a0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
309b0 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c  strcmp(azCmd[0],
309c0 22 63 68 61 6e 67 65 73 65 74 22 29 3d 3d 30 20  "changeset")==0 
309d0 7c 7c 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b  || strcmp(azCmd[
309e0 30 5d 2c 22 70 61 74 63 68 73 65 74 22 29 3d 3d  0],"patchset")==
309f0 30 20 29 7b 0a 20 20 20 20 20 20 46 49 4c 45 20  0 ){.      FILE 
30a00 2a 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20  *out = 0;.      
30a10 69 66 28 20 6e 43 6d 64 21 3d 32 20 29 20 67 6f  if( nCmd!=2 ) go
30a20 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61  to session_synta
30a30 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69  x_error;.      i
30a40 66 28 20 70 53 65 73 73 69 6f 6e 2d 3e 70 3d 3d  f( pSession->p==
30a50 30 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e  0 ) goto session
30a60 5f 6e 6f 74 5f 6f 70 65 6e 3b 0a 20 20 20 20 20  _not_open;.     
30a70 20 6f 75 74 20 3d 20 66 6f 70 65 6e 28 61 7a 43   out = fopen(azC
30a80 6d 64 5b 31 5d 2c 20 22 77 62 22 29 3b 0a 20 20  md[1], "wb");.  
30a90 20 20 20 20 69 66 28 20 6f 75 74 3d 3d 30 20 29      if( out==0 )
30aa0 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
30ab0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
30ac0 52 52 4f 52 3a 20 63 61 6e 6e 6f 74 20 6f 70 65  RROR: cannot ope
30ad0 6e 20 5c 22 25 73 5c 22 20 66 6f 72 20 77 72 69  n \"%s\" for wri
30ae0 74 69 6e 67 5c 6e 22 2c 20 61 7a 43 6d 64 5b 31  ting\n", azCmd[1
30af0 5d 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ]);.      }else{
30b00 0a 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 43  .        int szC
30b10 68 6e 67 3b 0a 20 20 20 20 20 20 20 20 76 6f 69  hng;.        voi
30b20 64 20 2a 70 43 68 6e 67 3b 0a 20 20 20 20 20 20  d *pChng;.      
30b30 20 20 69 66 28 20 61 7a 43 6d 64 5b 30 5d 5b 30    if( azCmd[0][0
30b40 5d 3d 3d 27 63 27 20 29 7b 0a 20 20 20 20 20 20  ]=='c' ){.      
30b50 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
30b60 73 65 73 73 69 6f 6e 5f 63 68 61 6e 67 65 73 65  session_changese
30b70 74 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 26  t(pSession->p, &
30b80 73 7a 43 68 6e 67 2c 20 26 70 43 68 6e 67 29 3b  szChng, &pChng);
30b90 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
30ba0 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
30bb0 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 70 61  qlite3session_pa
30bc0 74 63 68 73 65 74 28 70 53 65 73 73 69 6f 6e 2d  tchset(pSession-
30bd0 3e 70 2c 20 26 73 7a 43 68 6e 67 2c 20 26 70 43  >p, &szChng, &pC
30be0 68 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  hng);.        }.
30bf0 20 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29          if( rc )
30c00 7b 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6e  {.          prin
30c10 74 66 28 22 45 72 72 6f 72 3a 20 65 72 72 6f 72  tf("Error: error
30c20 20 63 6f 64 65 20 25 64 5c 6e 22 2c 20 72 63 29   code %d\n", rc)
30c30 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  ;.          rc =
30c40 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
30c50 20 20 20 20 20 20 69 66 28 20 70 43 68 6e 67 0a        if( pChng.
30c60 20 20 20 20 20 20 20 20 20 20 26 26 20 66 77 72            && fwr
30c70 69 74 65 28 70 43 68 6e 67 2c 20 73 7a 43 68 6e  ite(pChng, szChn
30c80 67 2c 20 31 2c 20 6f 75 74 29 21 3d 31 20 29 7b  g, 1, out)!=1 ){
30c90 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70  .          raw_p
30ca0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
30cb0 52 52 4f 52 3a 20 46 61 69 6c 65 64 20 74 6f 20  RROR: Failed to 
30cc0 77 72 69 74 65 20 65 6e 74 69 72 65 20 25 64 2d  write entire %d-
30cd0 62 79 74 65 20 6f 75 74 70 75 74 5c 6e 22 2c 0a  byte output\n",.
30ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30cf0 20 20 73 7a 43 68 6e 67 29 3b 0a 20 20 20 20 20    szChng);.     
30d00 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
30d10 69 74 65 33 5f 66 72 65 65 28 70 43 68 6e 67 29  ite3_free(pChng)
30d20 3b 0a 20 20 20 20 20 20 20 20 66 63 6c 6f 73 65  ;.        fclose
30d30 28 6f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  (out);.      }. 
30d40 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a     }else..    /*
30d50 20 2e 73 65 73 73 69 6f 6e 20 63 6c 6f 73 65 0a   .session close.
30d60 20 20 20 20 2a 2a 20 43 6c 6f 73 65 20 74 68 65      ** Close the
30d70 20 69 64 65 6e 74 69 66 69 65 64 20 73 65 73 73   identified sess
30d80 69 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ion.    */.    i
30d90 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b  f( strcmp(azCmd[
30da0 30 5d 2c 20 22 63 6c 6f 73 65 22 29 3d 3d 30 20  0], "close")==0 
30db0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6d  ){.      if( nCm
30dc0 64 21 3d 31 20 29 20 67 6f 74 6f 20 73 65 73 73  d!=1 ) goto sess
30dd0 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72  ion_syntax_error
30de0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  ;.      if( p->n
30df0 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20  Session ){.     
30e00 20 20 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65     session_close
30e10 28 70 53 65 73 73 69 6f 6e 29 3b 0a 20 20 20 20  (pSession);.    
30e20 20 20 20 20 70 2d 3e 61 53 65 73 73 69 6f 6e 5b      p->aSession[
30e30 69 53 65 73 5d 20 3d 20 70 2d 3e 61 53 65 73 73  iSes] = p->aSess
30e40 69 6f 6e 5b 2d 2d 70 2d 3e 6e 53 65 73 73 69 6f  ion[--p->nSessio
30e50 6e 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  n];.      }.    
30e60 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73  }else..    /* .s
30e70 65 73 73 69 6f 6e 20 65 6e 61 62 6c 65 20 3f 42  ession enable ?B
30e80 4f 4f 4c 45 41 4e 3f 0a 20 20 20 20 2a 2a 20 51  OOLEAN?.    ** Q
30e90 75 65 72 79 20 6f 72 20 73 65 74 20 74 68 65 20  uery or set the 
30ea0 65 6e 61 62 6c 65 20 66 6c 61 67 0a 20 20 20 20  enable flag.    
30eb0 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  */.    if( strcm
30ec0 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22 65 6e 61  p(azCmd[0], "ena
30ed0 62 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ble")==0 ){.    
30ee0 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20    int ii;.      
30ef0 69 66 28 20 6e 43 6d 64 3e 32 20 29 20 67 6f 74  if( nCmd>2 ) got
30f00 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78  o session_syntax
30f10 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 69  _error;.      ii
30f20 20 3d 20 6e 43 6d 64 3d 3d 31 20 3f 20 2d 31 20   = nCmd==1 ? -1 
30f30 3a 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61  : booleanValue(a
30f40 7a 43 6d 64 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zCmd[1]);.      
30f50 69 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20  if( p->nSession 
30f60 29 7b 0a 20 20 20 20 20 20 20 20 69 69 20 3d 20  ){.        ii = 
30f70 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 65  sqlite3session_e
30f80 6e 61 62 6c 65 28 70 53 65 73 73 69 6f 6e 2d 3e  nable(pSession->
30f90 70 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 20 20  p, ii);.        
30fa0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
30fb0 75 74 2c 20 22 73 65 73 73 69 6f 6e 20 25 73 20  ut, "session %s 
30fc0 65 6e 61 62 6c 65 20 66 6c 61 67 20 3d 20 25 64  enable flag = %d
30fd0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
30fe0 20 20 20 20 20 20 20 20 20 70 53 65 73 73 69 6f           pSessio
30ff0 6e 2d 3e 7a 4e 61 6d 65 2c 20 69 69 29 3b 0a 20  n->zName, ii);. 
31000 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
31010 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f  ..    /* .sessio
31020 6e 20 66 69 6c 74 65 72 20 47 4c 4f 42 20 2e 2e  n filter GLOB ..
31030 2e 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20 61 20  ...    ** Set a 
31040 6c 69 73 74 20 6f 66 20 47 4c 4f 42 20 70 61 74  list of GLOB pat
31050 74 65 72 6e 73 20 6f 66 20 74 61 62 6c 65 20 6e  terns of table n
31060 61 6d 65 73 20 74 6f 20 62 65 20 65 78 63 6c 75  ames to be exclu
31070 64 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ded..    */.    
31080 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64  if( strcmp(azCmd
31090 5b 30 5d 2c 20 22 66 69 6c 74 65 72 22 29 3d 3d  [0], "filter")==
310a0 30 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  0 ){.      int i
310b0 69 2c 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20  i, nByte;.      
310c0 69 66 28 20 6e 43 6d 64 3c 32 20 29 20 67 6f 74  if( nCmd<2 ) got
310d0 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78  o session_syntax
310e0 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 66  _error;.      if
310f0 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b  ( p->nSession ){
31100 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d  .        for(ii=
31110 30 3b 20 69 69 3c 70 53 65 73 73 69 6f 6e 2d 3e  0; ii<pSession->
31120 6e 46 69 6c 74 65 72 3b 20 69 69 2b 2b 29 7b 0a  nFilter; ii++){.
31130 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
31140 33 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d  3_free(pSession-
31150 3e 61 7a 46 69 6c 74 65 72 5b 69 69 5d 29 3b 0a  >azFilter[ii]);.
31160 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31170 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
31180 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65  Session->azFilte
31190 72 29 3b 0a 20 20 20 20 20 20 20 20 6e 42 79 74  r);.        nByt
311a0 65 20 3d 20 73 69 7a 65 6f 66 28 70 53 65 73 73  e = sizeof(pSess
311b0 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 30 5d  ion->azFilter[0]
311c0 29 2a 28 6e 43 6d 64 2d 31 29 3b 0a 20 20 20 20  )*(nCmd-1);.    
311d0 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 61 7a      pSession->az
311e0 46 69 6c 74 65 72 20 3d 20 73 71 6c 69 74 65 33  Filter = sqlite3
311f0 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29  _malloc( nByte )
31200 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53  ;.        if( pS
31210 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72  ession->azFilter
31220 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
31230 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
31240 72 72 2c 20 22 45 72 72 6f 72 3a 20 6f 75 74 20  rr, "Error: out 
31250 6f 72 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20  or memory\n");. 
31260 20 20 20 20 20 20 20 20 20 65 78 69 74 28 31 29           exit(1)
31270 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31280 20 20 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69      for(ii=1; ii
31290 3c 6e 43 6d 64 3b 20 69 69 2b 2b 29 7b 0a 20 20  <nCmd; ii++){.  
312a0 20 20 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e          pSession
312b0 2d 3e 61 7a 46 69 6c 74 65 72 5b 69 69 2d 31 5d  ->azFilter[ii-1]
312c0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
312d0 74 66 28 22 25 73 22 2c 20 61 7a 43 6d 64 5b 69  tf("%s", azCmd[i
312e0 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
312f0 20 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d         pSession-
31300 3e 6e 46 69 6c 74 65 72 20 3d 20 69 69 2d 31 3b  >nFilter = ii-1;
31310 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
31320 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73  se..    /* .sess
31330 69 6f 6e 20 69 6e 64 69 72 65 63 74 20 3f 42 4f  ion indirect ?BO
31340 4f 4c 45 41 4e 3f 0a 20 20 20 20 2a 2a 20 51 75  OLEAN?.    ** Qu
31350 65 72 79 20 6f 72 20 73 65 74 20 74 68 65 20 69  ery or set the i
31360 6e 64 69 72 65 63 74 20 66 6c 61 67 0a 20 20 20  ndirect flag.   
31370 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63   */.    if( strc
31380 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22 69 6e  mp(azCmd[0], "in
31390 64 69 72 65 63 74 22 29 3d 3d 30 20 29 7b 0a 20  direct")==0 ){. 
313a0 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
313b0 20 20 20 69 66 28 20 6e 43 6d 64 3e 32 20 29 20     if( nCmd>2 ) 
313c0 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e  goto session_syn
313d0 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20  tax_error;.     
313e0 20 69 69 20 3d 20 6e 43 6d 64 3d 3d 31 20 3f 20   ii = nCmd==1 ? 
313f0 2d 31 20 3a 20 62 6f 6f 6c 65 61 6e 56 61 6c 75  -1 : booleanValu
31400 65 28 61 7a 43 6d 64 5b 31 5d 29 3b 0a 20 20 20  e(azCmd[1]);.   
31410 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 73 73 69     if( p->nSessi
31420 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 69  on ){.        ii
31430 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f   = sqlite3sessio
31440 6e 5f 69 6e 64 69 72 65 63 74 28 70 53 65 73 73  n_indirect(pSess
31450 69 6f 6e 2d 3e 70 2c 20 69 69 29 3b 0a 20 20 20  ion->p, ii);.   
31460 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
31470 28 70 2d 3e 6f 75 74 2c 20 22 73 65 73 73 69 6f  (p->out, "sessio
31480 6e 20 25 73 20 69 6e 64 69 72 65 63 74 20 66 6c  n %s indirect fl
31490 61 67 20 3d 20 25 64 5c 6e 22 2c 0a 20 20 20 20  ag = %d\n",.    
314a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
314b0 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 2c  pSession->zName,
314c0 20 69 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20   ii);.      }.  
314d0 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20    }else..    /* 
314e0 2e 73 65 73 73 69 6f 6e 20 69 73 65 6d 70 74 79  .session isempty
314f0 0a 20 20 20 20 2a 2a 20 44 65 74 65 72 6d 69 6e  .    ** Determin
31500 65 20 69 66 20 74 68 65 20 73 65 73 73 69 6f 6e  e if the session
31510 20 69 73 20 65 6d 70 74 79 0a 20 20 20 20 2a 2f   is empty.    */
31520 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
31530 61 7a 43 6d 64 5b 30 5d 2c 20 22 69 73 65 6d 70  azCmd[0], "isemp
31540 74 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ty")==0 ){.     
31550 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 69   int ii;.      i
31560 66 28 20 6e 43 6d 64 21 3d 31 20 29 20 67 6f 74  f( nCmd!=1 ) got
31570 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78  o session_syntax
31580 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 66  _error;.      if
31590 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b  ( p->nSession ){
315a0 0a 20 20 20 20 20 20 20 20 69 69 20 3d 20 73 71  .        ii = sq
315b0 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 69 73 65  lite3session_ise
315c0 6d 70 74 79 28 70 53 65 73 73 69 6f 6e 2d 3e 70  mpty(pSession->p
315d0 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  );.        utf8_
315e0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
315f0 73 65 73 73 69 6f 6e 20 25 73 20 69 73 65 6d 70  session %s isemp
31600 74 79 20 66 6c 61 67 20 3d 20 25 64 5c 6e 22 2c  ty flag = %d\n",
31610 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
31620 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 7a       pSession->z
31630 4e 61 6d 65 2c 20 69 69 29 3b 0a 20 20 20 20 20  Name, ii);.     
31640 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20   }.    }else..  
31650 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 6c 69    /* .session li
31660 73 74 0a 20 20 20 20 2a 2a 20 4c 69 73 74 20 61  st.    ** List a
31670 6c 6c 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65  ll currently ope
31680 6e 20 73 65 73 73 69 6f 6e 73 0a 20 20 20 20 2a  n sessions.    *
31690 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  /.    if( strcmp
316a0 28 61 7a 43 6d 64 5b 30 5d 2c 22 6c 69 73 74 22  (azCmd[0],"list"
316b0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f  )==0 ){.      fo
316c0 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 65 73  r(i=0; i<p->nSes
316d0 73 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  sion; i++){.    
316e0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
316f0 70 2d 3e 6f 75 74 2c 20 22 25 64 20 25 73 5c 6e  p->out, "%d %s\n
31700 22 2c 20 69 2c 20 70 2d 3e 61 53 65 73 73 69 6f  ", i, p->aSessio
31710 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20  n[i].zName);.   
31720 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a     }.    }else..
31730 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20      /* .session 
31740 6f 70 65 6e 20 44 42 20 4e 41 4d 45 0a 20 20 20  open DB NAME.   
31750 20 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 73   ** Open a new s
31760 65 73 73 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41  ession called NA
31770 4d 45 20 6f 6e 20 74 68 65 20 61 74 74 61 63 68  ME on the attach
31780 65 64 20 64 61 74 61 62 61 73 65 20 44 42 2e 0a  ed database DB..
31790 20 20 20 20 2a 2a 20 44 42 20 69 73 20 6e 6f 72      ** DB is nor
317a0 6d 61 6c 6c 79 20 22 6d 61 69 6e 22 2e 0a 20 20  mally "main"..  
317b0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72    */.    if( str
317c0 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 6f 70  cmp(azCmd[0],"op
317d0 65 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  en")==0 ){.     
317e0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20   char *zName;.  
317f0 20 20 20 20 69 66 28 20 6e 43 6d 64 21 3d 33 20      if( nCmd!=3 
31800 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73  ) goto session_s
31810 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20  yntax_error;.   
31820 20 20 20 7a 4e 61 6d 65 20 3d 20 61 7a 43 6d 64     zName = azCmd
31830 5b 32 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a  [2];.      if( z
31840 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29 20 67 6f 74  Name[0]==0 ) got
31850 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78  o session_syntax
31860 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 66 6f  _error;.      fo
31870 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 65 73  r(i=0; i<p->nSes
31880 73 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  sion; i++){.    
31890 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 70      if( strcmp(p
318a0 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 5d 2e 7a 4e  ->aSession[i].zN
318b0 61 6d 65 2c 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b  ame,zName)==0 ){
318c0 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
318d0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
318e0 53 65 73 73 69 6f 6e 20 5c 22 25 73 5c 22 20 61  Session \"%s\" a
318f0 6c 72 65 61 64 79 20 65 78 69 73 74 73 5c 6e 22  lready exists\n"
31900 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
31910 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
31920 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
31930 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
31940 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 73 73      if( p->nSess
31950 69 6f 6e 3e 3d 41 72 72 61 79 53 69 7a 65 28 70  ion>=ArraySize(p
31960 2d 3e 61 53 65 73 73 69 6f 6e 29 20 29 7b 0a 20  ->aSession) ){. 
31970 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
31980 66 28 73 74 64 65 72 72 2c 20 22 4d 61 78 69 6d  f(stderr, "Maxim
31990 75 6d 20 6f 66 20 25 64 20 73 65 73 73 69 6f 6e  um of %d session
319a0 73 5c 6e 22 2c 20 41 72 72 61 79 53 69 7a 65 28  s\n", ArraySize(
319b0 70 2d 3e 61 53 65 73 73 69 6f 6e 29 29 3b 0a 20  p->aSession));. 
319c0 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61         goto meta
319d0 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
319e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 65       }.      pSe
319f0 73 73 69 6f 6e 20 3d 20 26 70 2d 3e 61 53 65 73  ssion = &p->aSes
31a00 73 69 6f 6e 5b 70 2d 3e 6e 53 65 73 73 69 6f 6e  sion[p->nSession
31a10 5d 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  ];.      rc = sq
31a20 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 63 72 65  lite3session_cre
31a30 61 74 65 28 70 2d 3e 64 62 2c 20 61 7a 43 6d 64  ate(p->db, azCmd
31a40 5b 31 5d 2c 20 26 70 53 65 73 73 69 6f 6e 2d 3e  [1], &pSession->
31a50 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  p);.      if( rc
31a60 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
31a70 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
31a80 43 61 6e 6e 6f 74 20 6f 70 65 6e 20 73 65 73 73  Cannot open sess
31a90 69 6f 6e 3a 20 65 72 72 6f 72 20 63 6f 64 65 3d  ion: error code=
31aa0 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20  %d\n", rc);.    
31ab0 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
31ac0 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
31ad0 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
31ae0 20 20 7d 0a 20 20 20 20 20 20 70 53 65 73 73 69    }.      pSessi
31af0 6f 6e 2d 3e 6e 46 69 6c 74 65 72 20 3d 20 30 3b  on->nFilter = 0;
31b00 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 73 65  .      sqlite3se
31b10 73 73 69 6f 6e 5f 74 61 62 6c 65 5f 66 69 6c 74  ssion_table_filt
31b20 65 72 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20  er(pSession->p, 
31b30 73 65 73 73 69 6f 6e 5f 66 69 6c 74 65 72 2c 20  session_filter, 
31b40 70 53 65 73 73 69 6f 6e 29 3b 0a 20 20 20 20 20  pSession);.     
31b50 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 2b 2b 3b 0a   p->nSession++;.
31b60 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e        pSession->
31b70 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f  zName = sqlite3_
31b80 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 4e  mprintf("%s", zN
31b90 61 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a  ame);.    }else.
31ba0 20 20 20 20 2f 2a 20 49 66 20 6e 6f 20 63 6f 6d      /* If no com
31bb0 6d 61 6e 64 20 6e 61 6d 65 20 6d 61 74 63 68 65  mand name matche
31bc0 73 2c 20 73 68 6f 77 20 61 20 73 79 6e 74 61 78  s, show a syntax
31bd0 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 73 65   error */.    se
31be0 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72  ssion_syntax_err
31bf0 6f 72 3a 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f  or:.    session_
31c00 68 65 6c 70 28 70 29 3b 0a 20 20 7d 65 6c 73 65  help(p);.  }else
31c10 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
31c20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f  SQLITE_DEBUG.  /
31c30 2a 20 55 6e 64 6f 63 75 6d 65 6e 74 65 64 20 63  * Undocumented c
31c40 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 69 6e 74 65  ommands for inte
31c50 72 6e 61 6c 20 74 65 73 74 69 6e 67 2e 20 20 53  rnal testing.  S
31c60 75 62 6a 65 63 74 20 74 6f 20 63 68 61 6e 67 65  ubject to change
31c70 0a 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 6e 6f  .  ** without no
31c80 74 69 63 65 2e 20 2a 2f 0a 20 20 69 66 28 20 63  tice. */.  if( c
31c90 3d 3d 27 73 27 20 26 26 20 6e 3e 3d 31 30 20 26  =='s' && n>=10 &
31ca0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
31cb0 30 5d 2c 20 22 73 65 6c 66 74 65 73 74 2d 22 2c  0], "selftest-",
31cc0 20 39 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   9)==0 ){.    if
31cd0 28 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  ( strncmp(azArg[
31ce0 30 5d 2b 39 2c 20 22 62 6f 6f 6c 65 61 6e 22 2c  0]+9, "boolean",
31cf0 20 6e 2d 39 29 3d 3d 30 20 29 7b 0a 20 20 20 20   n-9)==0 ){.    
31d00 20 20 69 6e 74 20 69 2c 20 76 3b 0a 20 20 20 20    int i, v;.    
31d10 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72    for(i=1; i<nAr
31d20 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
31d30 20 76 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75   v = booleanValu
31d40 65 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  e(azArg[i]);.   
31d50 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
31d60 28 70 2d 3e 6f 75 74 2c 20 22 25 73 3a 20 25 64  (p->out, "%s: %d
31d70 20 30 78 25 78 5c 6e 22 2c 20 61 7a 41 72 67 5b   0x%x\n", azArg[
31d80 69 5d 2c 20 76 2c 20 76 29 3b 0a 20 20 20 20 20  i], v, v);.     
31d90 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
31da0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
31db0 5d 2b 39 2c 20 22 69 6e 74 65 67 65 72 22 2c 20  ]+9, "integer", 
31dc0 6e 2d 39 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  n-9)==0 ){.     
31dd0 20 69 6e 74 20 69 3b 20 73 71 6c 69 74 65 33 5f   int i; sqlite3_
31de0 69 6e 74 36 34 20 76 3b 0a 20 20 20 20 20 20 66  int64 v;.      f
31df0 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20  or(i=1; i<nArg; 
31e00 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  i++){.        ch
31e10 61 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20  ar zBuf[200];.  
31e20 20 20 20 20 20 20 76 20 3d 20 69 6e 74 65 67 65        v = intege
31e30 72 56 61 6c 75 65 28 61 7a 41 72 67 5b 69 5d 29  rValue(azArg[i])
31e40 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
31e50 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
31e60 66 28 7a 42 75 66 29 2c 7a 42 75 66 2c 22 25 73  f(zBuf),zBuf,"%s
31e70 3a 20 25 6c 6c 64 20 30 78 25 6c 6c 78 5c 6e 22  : %lld 0x%llx\n"
31e80 2c 20 61 7a 41 72 67 5b 69 5d 2c 76 2c 76 29 3b  , azArg[i],v,v);
31e90 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
31ea0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
31eb0 22 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 20 20  ", zBuf);.      
31ec0 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  }.    }.  }else.
31ed0 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 3d  #endif..  if( c=
31ee0 3d 27 73 27 20 26 26 20 6e 3e 3d 34 20 26 26 20  ='s' && n>=4 && 
31ef0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
31f00 2c 22 73 65 6c 66 74 65 73 74 22 2c 6e 29 3d 3d  ,"selftest",n)==
31f10 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 49 73  0 ){.    int bIs
31f20 49 6e 69 74 20 3d 20 30 3b 20 20 20 20 20 20 20  Init = 0;       
31f30 20 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 69    /* True to ini
31f40 74 69 61 6c 69 7a 65 20 74 68 65 20 53 45 4c 46  tialize the SELF
31f50 54 45 53 54 20 74 61 62 6c 65 20 2a 2f 0a 20 20  TEST table */.  
31f60 20 20 69 6e 74 20 62 56 65 72 62 6f 73 65 20 3d    int bVerbose =
31f70 20 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 65   0;        /* Ve
31f80 72 62 6f 73 65 20 6f 75 74 70 75 74 20 2a 2f 0a  rbose output */.
31f90 20 20 20 20 69 6e 74 20 62 53 65 6c 66 74 65 73      int bSelftes
31fa0 74 45 78 69 73 74 73 3b 20 20 20 20 20 2f 2a 20  tExists;     /* 
31fb0 54 72 75 65 20 69 66 20 53 45 4c 46 54 45 53 54  True if SELFTEST
31fc0 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20   already exists 
31fd0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20 6b 3b  */.    int i, k;
31fe0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31ff0 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
32000 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 54 65 73   */.    int nTes
32010 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
32020 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65   /* Number of te
32030 73 74 73 20 72 75 6e 73 20 2a 2f 0a 20 20 20 20  sts runs */.    
32040 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20  int nErr = 0;   
32050 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
32060 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65  er of errors see
32070 6e 20 2a 2f 0a 20 20 20 20 53 68 65 6c 6c 54 65  n */.    ShellTe
32080 78 74 20 73 74 72 3b 20 20 20 20 20 20 20 20 20  xt str;         
32090 20 20 2f 2a 20 41 6e 73 77 65 72 20 66 6f 72 20    /* Answer for 
320a0 61 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 73  a query */.    s
320b0 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
320c0 6d 74 20 3d 20 30 3b 20 2f 2a 20 51 75 65 72 79  mt = 0; /* Query
320d0 20 61 67 61 69 6e 73 74 20 74 68 65 20 53 45 4c   against the SEL
320e0 46 54 45 53 54 20 74 61 62 6c 65 20 2a 2f 0a 0a  FTEST table */..
320f0 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 30 29      open_db(p,0)
32100 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  ;.    for(i=1; i
32110 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
32120 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
32130 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20   = azArg[i];.   
32140 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27     if( z[0]=='-'
32150 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20   && z[1]=='-' ) 
32160 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 73  z++;.      if( s
32170 74 72 63 6d 70 28 7a 2c 22 2d 69 6e 69 74 22 29  trcmp(z,"-init")
32180 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62  ==0 ){.        b
32190 49 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20  IsInit = 1;.    
321a0 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 69 66    }else.      if
321b0 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 76 22 29  ( strcmp(z,"-v")
321c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62  ==0 ){.        b
321d0 56 65 72 62 6f 73 65 2b 2b 3b 0a 20 20 20 20 20  Verbose++;.     
321e0 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 20   }else.      {. 
321f0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
32200 74 66 28 73 74 64 65 72 72 2c 20 22 55 6e 6b 6e  tf(stderr, "Unkn
32210 6f 77 6e 20 6f 70 74 69 6f 6e 20 5c 22 25 73 5c  own option \"%s\
32220 22 20 6f 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a  " on \"%s\"\n",.
32230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32240 20 20 20 20 61 7a 41 72 67 5b 69 5d 2c 20 61 7a      azArg[i], az
32250 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[0]);.       
32260 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
32270 72 72 2c 20 22 53 68 6f 75 6c 64 20 62 65 20 6f  rr, "Should be o
32280 6e 65 20 6f 66 3a 20 2d 2d 69 6e 69 74 20 2d 76  ne of: --init -v
32290 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63  \n");.        rc
322a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 1;.        go
322b0 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
322c0 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  exit;.      }.  
322d0 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69    }.    if( sqli
322e0 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
322f0 5f 6d 65 74 61 64 61 74 61 28 70 2d 3e 64 62 2c  _metadata(p->db,
32300 22 6d 61 69 6e 22 2c 22 73 65 6c 66 74 65 73 74  "main","selftest
32310 22 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 29 0a 20  ",0,0,0,0,0,0). 
32320 20 20 20 20 20 20 20 20 20 20 21 3d 20 53 51 4c            != SQL
32330 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
32340 62 53 65 6c 66 74 65 73 74 45 78 69 73 74 73 20  bSelftestExists 
32350 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 0;.    }else{.
32360 20 20 20 20 20 20 62 53 65 6c 66 74 65 73 74 45        bSelftestE
32370 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d  xists = 1;.    }
32380 0a 20 20 20 20 69 66 28 20 62 49 73 49 6e 69 74  .    if( bIsInit
32390 20 29 7b 0a 20 20 20 20 20 20 63 72 65 61 74 65   ){.      create
323a0 53 65 6c 66 74 65 73 74 54 61 62 6c 65 28 70 29  SelftestTable(p)
323b0 3b 0a 20 20 20 20 20 20 62 53 65 6c 66 74 65 73  ;.      bSelftes
323c0 74 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20  tExists = 1;.   
323d0 20 7d 0a 20 20 20 20 69 6e 69 74 54 65 78 74 28   }.    initText(
323e0 26 73 74 72 29 3b 0a 20 20 20 20 61 70 70 65 6e  &str);.    appen
323f0 64 54 65 78 74 28 26 73 74 72 2c 20 22 78 22 2c  dText(&str, "x",
32400 20 30 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 62   0);.    for(k=b
32410 53 65 6c 66 74 65 73 74 45 78 69 73 74 73 3b 20  SelftestExists; 
32420 6b 3e 3d 30 3b 20 6b 2d 2d 29 7b 0a 20 20 20 20  k>=0; k--){.    
32430 20 20 69 66 28 20 6b 3d 3d 31 20 29 7b 0a 20 20    if( k==1 ){.  
32440 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
32450 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
32460 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
32470 20 22 53 45 4c 45 43 54 20 74 6e 6f 2c 6f 70 2c   "SELECT tno,op,
32480 63 6d 64 2c 61 6e 73 20 46 52 4f 4d 20 73 65 6c  cmd,ans FROM sel
32490 66 74 65 73 74 20 4f 52 44 45 52 20 42 59 20 74  ftest ORDER BY t
324a0 6e 6f 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  no",.           
324b0 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
324c0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
324d0 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
324e0 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
324f0 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 22  >db,.          "
32500 56 41 4c 55 45 53 28 30 2c 27 6d 65 6d 6f 27 2c  VALUES(0,'memo',
32510 27 4d 69 73 73 69 6e 67 20 53 45 4c 46 54 45 53  'Missing SELFTES
32520 54 20 74 61 62 6c 65 20 2d 20 64 65 66 61 75 6c  T table - defaul
32530 74 20 63 68 65 63 6b 73 20 6f 6e 6c 79 27 2c 27  t checks only','
32540 27 29 2c 22 0a 20 20 20 20 20 20 20 20 20 20 22  '),".          "
32550 20 20 20 20 20 20 28 31 2c 27 72 75 6e 27 2c 27        (1,'run','
32560 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79  PRAGMA integrity
32570 5f 63 68 65 63 6b 27 2c 27 6f 6b 27 29 22 2c 0a  _check','ok')",.
32580 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 26 70            -1, &p
32590 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Stmt, 0);.      
325a0 7d 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29  }.      if( rc )
325b0 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
325c0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
325d0 72 6f 72 20 71 75 65 72 79 69 6e 67 20 74 68 65  ror querying the
325e0 20 73 65 6c 66 74 65 73 74 20 74 61 62 6c 65 5c   selftest table\
325f0 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  n");.        rc 
32600 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  = 1;.        sql
32610 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
32620 74 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 67 6f  tmt);.        go
32630 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
32640 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  exit;.      }.  
32650 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 73 71 6c      for(i=1; sql
32660 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
32670 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 3b 20 69 2b  ==SQLITE_ROW; i+
32680 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
32690 74 6e 6f 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  tno = sqlite3_co
326a0 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20  lumn_int(pStmt, 
326b0 30 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  0);.        cons
326c0 74 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20 28 63  t char *zOp = (c
326d0 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
326e0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
326f0 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20  Stmt, 1);.      
32700 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
32710 71 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  ql = (const char
32720 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
32730 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 32 29 3b  _text(pStmt, 2);
32740 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
32750 68 61 72 20 2a 7a 41 6e 73 20 3d 20 28 63 6f 6e  har *zAns = (con
32760 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
32770 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
32780 6d 74 2c 20 33 29 3b 0a 0a 20 20 20 20 20 20 20  mt, 3);..       
32790 20 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   k = 0;.        
327a0 69 66 28 20 62 56 65 72 62 6f 73 65 3e 30 20 29  if( bVerbose>0 )
327b0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  {.          char
327c0 20 2a 7a 51 75 6f 74 65 20 3d 20 73 71 6c 69 74   *zQuote = sqlit
327d0 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 71 22 2c  e3_mprintf("%q",
327e0 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20   zSql);.        
327f0 20 20 70 72 69 6e 74 66 28 22 25 64 3a 20 25 73    printf("%d: %s
32800 20 25 73 5c 6e 22 2c 20 74 6e 6f 2c 20 7a 4f 70   %s\n", tno, zOp
32810 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20  , zSql);.       
32820 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
32830 7a 51 75 6f 74 65 29 3b 0a 20 20 20 20 20 20 20  zQuote);.       
32840 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73   }.        if( s
32850 74 72 63 6d 70 28 7a 4f 70 2c 22 6d 65 6d 6f 22  trcmp(zOp,"memo"
32860 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
32870 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
32880 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 53  >out, "%s\n", zS
32890 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ql);.        }el
328a0 73 65 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  se.        if( s
328b0 74 72 63 6d 70 28 7a 4f 70 2c 22 72 75 6e 22 29  trcmp(zOp,"run")
328c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
328d0 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
328e0 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74   0;.          st
328f0 72 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  r.n = 0;.       
32900 20 20 20 73 74 72 2e 7a 5b 30 5d 20 3d 20 30 3b     str.z[0] = 0;
32910 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
32920 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
32930 64 62 2c 20 7a 53 71 6c 2c 20 63 61 70 74 75 72  db, zSql, captur
32940 65 4f 75 74 70 75 74 43 61 6c 6c 62 61 63 6b 2c  eOutputCallback,
32950 20 26 73 74 72 2c 20 26 7a 45 72 72 4d 73 67 29   &str, &zErrMsg)
32960 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 54 65 73  ;.          nTes
32970 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 69  t++;.          i
32980 66 28 20 62 56 65 72 62 6f 73 65 20 29 7b 0a 20  f( bVerbose ){. 
32990 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f             utf8_
329a0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
329b0 52 65 73 75 6c 74 3a 20 25 73 5c 6e 22 2c 20 73  Result: %s\n", s
329c0 74 72 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 20  tr.z);.         
329d0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
329e0 20 72 63 20 7c 7c 20 7a 45 72 72 4d 73 67 20 29   rc || zErrMsg )
329f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 45  {.            nE
32a00 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  rr++;.          
32a10 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
32a20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
32a30 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 3a 20 65  f(p->out, "%d: e
32a40 72 72 6f 72 2d 63 6f 64 65 2d 25 64 3a 20 25 73  rror-code-%d: %s
32a50 5c 6e 22 2c 20 74 6e 6f 2c 20 72 63 2c 20 7a 45  \n", tno, rc, zE
32a60 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20  rrMsg);.        
32a70 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
32a80 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  (zErrMsg);.     
32a90 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
32aa0 74 72 63 6d 70 28 7a 41 6e 73 2c 73 74 72 2e 7a  trcmp(zAns,str.z
32ab0 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
32ac0 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20      nErr++;.    
32ad0 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a          rc = 1;.
32ae0 20 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38              utf8
32af0 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
32b00 22 25 64 3a 20 45 78 70 65 63 74 65 64 3a 20 5b  "%d: Expected: [
32b10 25 73 5d 5c 6e 22 2c 20 74 6e 6f 2c 20 7a 41 6e  %s]\n", tno, zAn
32b20 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  s);.            
32b30 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
32b40 75 74 2c 20 22 25 64 3a 20 20 20 20 20 20 47 6f  ut, "%d:      Go
32b50 74 3a 20 5b 25 73 5d 5c 6e 22 2c 20 74 6e 6f 2c  t: [%s]\n", tno,
32b60 20 73 74 72 2e 7a 29 3b 0a 20 20 20 20 20 20 20   str.z);.       
32b70 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c     }.        }el
32b80 73 65 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  se.        {.   
32b90 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
32ba0 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20  tf(stderr,.     
32bb0 20 20 20 20 20 20 20 22 55 6e 6b 6e 6f 77 6e 20         "Unknown 
32bc0 6f 70 65 72 61 74 69 6f 6e 20 5c 22 25 73 5c 22  operation \"%s\"
32bd0 20 6f 6e 20 73 65 6c 66 74 65 73 74 20 6c 69 6e   on selftest lin
32be0 65 20 25 64 5c 6e 22 2c 20 7a 4f 70 2c 20 74 6e  e %d\n", zOp, tn
32bf0 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  o);.          rc
32c00 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
32c10 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
32c20 0a 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20  .      } /* End 
32c30 6c 6f 6f 70 20 6f 76 65 72 20 72 6f 77 73 20 6f  loop over rows o
32c40 66 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 53  f content from S
32c50 45 4c 46 54 45 53 54 20 2a 2f 0a 20 20 20 20 20  ELFTEST */.     
32c60 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
32c70 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 20  e(pStmt);.    } 
32c80 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20 6f 76 65 72  /* End loop over
32c90 20 6b 20 2a 2f 0a 20 20 20 20 66 72 65 65 54 65   k */.    freeTe
32ca0 78 74 28 26 73 74 72 29 3b 0a 20 20 20 20 75 74  xt(&str);.    ut
32cb0 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
32cc0 2c 20 22 25 64 20 65 72 72 6f 72 73 20 6f 75 74  , "%d errors out
32cd0 20 6f 66 20 25 64 20 74 65 73 74 73 5c 6e 22 2c   of %d tests\n",
32ce0 20 6e 45 72 72 2c 20 6e 54 65 73 74 29 3b 0a 20   nErr, nTest);. 
32cf0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
32d00 3d 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='s' && strncmp(
32d10 61 7a 41 72 67 5b 30 5d 2c 20 22 73 65 70 61 72  azArg[0], "separ
32d20 61 74 6f 72 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  ator", n)==0 ){.
32d30 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20 7c      if( nArg<2 |
32d40 7c 20 6e 41 72 67 3e 33 20 29 7b 0a 20 20 20 20  | nArg>3 ){.    
32d50 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
32d60 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73 65  err, "Usage: .se
32d70 70 61 72 61 74 6f 72 20 43 4f 4c 20 3f 52 4f 57  parator COL ?ROW
32d80 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  ?\n");.      rc 
32d90 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
32da0 66 28 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20 20  f( nArg>=2 ){.  
32db0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
32dc0 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63  intf(sizeof(p->c
32dd0 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d  olSeparator), p-
32de0 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 0a 20  >colSeparator,. 
32df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e00 20 20 20 20 20 20 22 25 2e 2a 73 22 2c 20 28 69        "%.*s", (i
32e10 6e 74 29 41 72 72 61 79 53 69 7a 65 28 70 2d 3e  nt)ArraySize(p->
32e20 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2d 31 2c  colSeparator)-1,
32e30 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
32e40 7d 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 3d  }.    if( nArg>=
32e50 33 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  3 ){.      sqlit
32e60 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
32e70 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  of(p->rowSeparat
32e80 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  or), p->rowSepar
32e90 61 74 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20  ator,.          
32ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25 2e               "%.
32eb0 2a 73 22 2c 20 28 69 6e 74 29 41 72 72 61 79 53  *s", (int)ArrayS
32ec0 69 7a 65 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  ize(p->rowSepara
32ed0 74 6f 72 29 2d 31 2c 20 61 7a 41 72 67 5b 32 5d  tor)-1, azArg[2]
32ee0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  );.    }.  }else
32ef0 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26  ..  if( c=='s' &
32f00 26 20 6e 3e 3d 34 20 26 26 20 73 74 72 6e 63 6d  & n>=4 && strncm
32f10 70 28 61 7a 41 72 67 5b 30 5d 2c 22 73 68 61 33  p(azArg[0],"sha3
32f20 73 75 6d 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20  sum",n)==0 ){.  
32f30 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c    const char *zL
32f40 69 6b 65 20 3d 20 30 3b 20 20 20 2f 2a 20 57 68  ike = 0;   /* Wh
32f50 69 63 68 20 74 61 62 6c 65 20 74 6f 20 63 68 65  ich table to che
32f60 63 6b 73 75 6d 2e 20 30 20 6d 65 61 6e 73 20 65  cksum. 0 means e
32f70 76 65 72 79 74 68 69 6e 67 20 2a 2f 0a 20 20 20  verything */.   
32f80 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
32f90 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
32fa0 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
32fb0 20 69 6e 74 20 62 53 63 68 65 6d 61 20 3d 20 30   int bSchema = 0
32fc0 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 73  ;         /* Als
32fd0 6f 20 68 61 73 68 20 74 68 65 20 73 63 68 65 6d  o hash the schem
32fe0 61 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 53 65  a */.    int bSe
32ff0 70 61 72 61 74 65 20 3d 20 30 3b 20 20 20 20 20  parate = 0;     
33000 20 20 2f 2a 20 48 61 73 68 20 65 61 63 68 20 74    /* Hash each t
33010 61 62 6c 65 20 73 65 70 61 72 61 74 65 6c 79 20  able separately 
33020 2a 2f 0a 20 20 20 20 69 6e 74 20 69 53 69 7a 65  */.    int iSize
33030 20 3d 20 32 32 34 3b 20 20 20 20 20 20 20 20 20   = 224;         
33040 2f 2a 20 48 61 73 68 20 61 6c 67 6f 72 69 74 68  /* Hash algorith
33050 6d 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20  m to use */.    
33060 69 6e 74 20 62 44 65 62 75 67 20 3d 20 30 3b 20  int bDebug = 0; 
33070 20 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79           /* Only
33080 20 73 68 6f 77 20 74 68 65 20 71 75 65 72 79 20   show the query 
33090 74 68 61 74 20 77 6f 75 6c 64 20 68 61 76 65 20  that would have 
330a0 72 75 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74  run */.    sqlit
330b0 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20  e3_stmt *pStmt; 
330c0 20 20 20 20 2f 2a 20 46 6f 72 20 71 75 65 72 79      /* For query
330d0 69 6e 67 20 74 61 62 6c 65 73 20 6e 61 6d 65 73  ing tables names
330e0 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   */.    char *zS
330f0 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ql;             
33100 20 2f 2a 20 53 51 4c 20 74 6f 20 62 65 20 72 75   /* SQL to be ru
33110 6e 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a  n */.    char *z
33120 53 65 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  Sep;            
33130 20 20 2f 2a 20 53 65 70 61 72 61 74 6f 72 20 2a    /* Separator *
33140 2f 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20  /.    ShellText 
33150 73 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 2f  sSql;          /
33160 2a 20 43 6f 6d 70 6c 65 74 65 20 53 51 4c 20 66  * Complete SQL f
33170 6f 72 20 74 68 65 20 71 75 65 72 79 20 74 6f 20  or the query to 
33180 72 75 6e 20 74 68 65 20 68 61 73 68 20 2a 2f 0a  run the hash */.
33190 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73 51      ShellText sQ
331a0 75 65 72 79 3b 20 20 20 20 20 20 20 20 2f 2a 20  uery;        /* 
331b0 53 65 74 20 6f 66 20 71 75 65 72 69 65 73 20 75  Set of queries u
331c0 73 65 64 20 74 6f 20 72 65 61 64 20 61 6c 6c 20  sed to read all 
331d0 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 20 20 6f  content */.    o
331e0 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
331f0 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72    for(i=1; i<nAr
33200 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63  g; i++){.      c
33210 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61  onst char *z = a
33220 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 69  zArg[i];.      i
33230 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a  f( z[0]=='-' ){.
33240 20 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20          z++;.   
33250 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27       if( z[0]=='
33260 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20  -' ) z++;.      
33270 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22    if( strcmp(z,"
33280 73 63 68 65 6d 61 22 29 3d 3d 30 20 29 7b 0a 20  schema")==0 ){. 
33290 20 20 20 20 20 20 20 20 20 62 53 63 68 65 6d 61           bSchema
332a0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 1;.        }e
332b0 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28 20  lse.        if( 
332c0 73 74 72 63 6d 70 28 7a 2c 22 73 68 61 33 2d 32  strcmp(z,"sha3-2
332d0 32 34 22 29 3d 3d 30 20 7c 7c 20 73 74 72 63 6d  24")==0 || strcm
332e0 70 28 7a 2c 22 73 68 61 33 2d 32 35 36 22 29 3d  p(z,"sha3-256")=
332f0 3d 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 73  =0.         || s
33300 74 72 63 6d 70 28 7a 2c 22 73 68 61 33 2d 33 38  trcmp(z,"sha3-38
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 35 31 32 22 29 3d 3d  (z,"sha3-512")==
33330 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  0.        ){.   
33340 20 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 61         iSize = a
33350 74 6f 69 28 26 7a 5b 35 5d 29 3b 0a 20 20 20 20  toi(&z[5]);.    
33360 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20      }else.      
33370 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22    if( strcmp(z,"
33380 64 65 62 75 67 22 29 3d 3d 30 20 29 7b 0a 20 20  debug")==0 ){.  
33390 20 20 20 20 20 20 20 20 62 44 65 62 75 67 20 3d          bDebug =
333a0 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73   1;.        }els
333b0 65 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  e.        {.    
333c0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
333d0 66 28 73 74 64 65 72 72 2c 20 22 55 6e 6b 6e 6f  f(stderr, "Unkno
333e0 77 6e 20 6f 70 74 69 6f 6e 20 5c 22 25 73 5c 22  wn option \"%s\"
333f0 20 6f 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20   on \"%s\"\n",. 
33400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33410 20 20 20 20 20 61 7a 41 72 67 5b 69 5d 2c 20 61       azArg[i], a
33420 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20  zArg[0]);.      
33430 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
33440 74 64 65 72 72 2c 20 22 53 68 6f 75 6c 64 20 62  tderr, "Should b
33450 65 20 6f 6e 65 20 6f 66 3a 20 2d 2d 73 63 68 65  e one of: --sche
33460 6d 61 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  ma".            
33470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33480 20 22 20 2d 2d 73 68 61 33 2d 32 32 34 20 2d 2d   " --sha3-224 --
33490 73 68 61 33 2d 32 35 35 20 2d 2d 73 68 61 33 2d  sha3-255 --sha3-
334a0 33 38 34 20 2d 2d 73 68 61 33 2d 35 31 32 5c 6e  384 --sha3-512\n
334b0 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ");.          rc
334c0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
334d0 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
334e0 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  d_exit;.        
334f0 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
33500 28 20 7a 4c 69 6b 65 20 29 7b 0a 20 20 20 20 20  ( zLike ){.     
33510 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
33520 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73  derr, "Usage: .s
33530 68 61 33 73 75 6d 20 3f 4f 50 54 49 4f 4e 53 3f  ha3sum ?OPTIONS?
33540 20 3f 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c   ?LIKE-PATTERN?\
33550 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  n");.        rc 
33560 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 1;.        got
33570 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
33580 78 69 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  xit;.      }else
33590 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6b 65 20  {.        zLike 
335a0 3d 20 7a 3b 0a 20 20 20 20 20 20 20 20 62 53 65  = z;.        bSe
335b0 70 61 72 61 74 65 20 3d 20 31 3b 0a 20 20 20 20  parate = 1;.    
335c0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
335d0 73 74 72 6c 69 6b 65 28 22 73 71 6c 69 74 65 5f  strlike("sqlite_
335e0 25 22 2c 20 7a 4c 69 6b 65 2c 20 30 29 3d 3d 30  %", zLike, 0)==0
335f0 20 29 20 62 53 63 68 65 6d 61 20 3d 20 31 3b 0a   ) bSchema = 1;.
33600 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
33610 20 20 69 66 28 20 62 53 63 68 65 6d 61 20 29 7b    if( bSchema ){
33620 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 22 53  .      zSql = "S
33630 45 4c 45 43 54 20 6c 6f 77 65 72 28 6e 61 6d 65  ELECT lower(name
33640 29 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  ) FROM sqlite_ma
33650 73 74 65 72 22 0a 20 20 20 20 20 20 20 20 20 20  ster".          
33660 20 20 20 22 20 57 48 45 52 45 20 74 79 70 65 3d     " WHERE type=
33670 27 74 61 62 6c 65 27 20 41 4e 44 20 63 6f 61 6c  'table' AND coal
33680 65 73 63 65 28 72 6f 6f 74 70 61 67 65 2c 30 29  esce(rootpage,0)
33690 3e 31 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  >1".            
336a0 20 22 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c   " UNION ALL SEL
336b0 45 43 54 20 27 73 71 6c 69 74 65 5f 6d 61 73 74  ECT 'sqlite_mast
336c0 65 72 27 22 0a 20 20 20 20 20 20 20 20 20 20 20  er'".           
336d0 20 20 22 20 4f 52 44 45 52 20 42 59 20 31 20 63    " ORDER BY 1 c
336e0 6f 6c 6c 61 74 65 20 6e 6f 63 61 73 65 22 3b 0a  ollate nocase";.
336f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
33700 20 7a 53 71 6c 20 3d 20 22 53 45 4c 45 43 54 20   zSql = "SELECT 
33710 6c 6f 77 65 72 28 6e 61 6d 65 29 20 46 52 4f 4d  lower(name) FROM
33720 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a   sqlite_master".
33730 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57               " W
33740 48 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c 65  HERE type='table
33750 27 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28 72  ' AND coalesce(r
33760 6f 6f 74 70 61 67 65 2c 30 29 3e 31 22 0a 20 20  ootpage,0)>1".  
33770 20 20 20 20 20 20 20 20 20 20 20 22 20 41 4e 44             " AND
33780 20 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27   name NOT LIKE '
33790 73 71 6c 69 74 65 5f 25 27 22 0a 20 20 20 20 20  sqlite_%'".     
337a0 20 20 20 20 20 20 20 20 22 20 4f 52 44 45 52 20          " ORDER 
337b0 42 59 20 31 20 63 6f 6c 6c 61 74 65 20 6e 6f 63  BY 1 collate noc
337c0 61 73 65 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ase";.    }.    
337d0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
337e0 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  v2(p->db, zSql, 
337f0 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
33800 20 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 51      initText(&sQ
33810 75 65 72 79 29 3b 0a 20 20 20 20 69 6e 69 74 54  uery);.    initT
33820 65 78 74 28 26 73 53 71 6c 29 3b 0a 20 20 20 20  ext(&sSql);.    
33830 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 71 6c  appendText(&sSql
33840 2c 20 22 57 49 54 48 20 5b 73 68 61 33 73 75 6d  , "WITH [sha3sum
33850 24 71 75 65 72 79 5d 28 61 2c 62 29 20 41 53 28  $query](a,b) AS(
33860 22 2c 30 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d  ",0);.    zSep =
33870 20 22 56 41 4c 55 45 53 28 22 3b 0a 20 20 20 20   "VALUES(";.    
33880 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f  while( SQLITE_RO
33890 57 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28  W==sqlite3_step(
338a0 70 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20  pStmt) ){.      
338b0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
338c0 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
338d0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
338e0 65 78 74 28 70 53 74 6d 74 2c 30 29 3b 0a 20 20  ext(pStmt,0);.  
338f0 20 20 20 20 69 66 28 20 7a 4c 69 6b 65 20 26 26      if( zLike &&
33900 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65   sqlite3_strlike
33910 28 7a 4c 69 6b 65 2c 20 7a 54 61 62 2c 20 30 29  (zLike, zTab, 0)
33920 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
33930 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d        if( strncm
33940 70 28 7a 54 61 62 2c 20 22 73 71 6c 69 74 65 5f  p(zTab, "sqlite_
33950 22 2c 37 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  ",7)!=0 ){.     
33960 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
33970 51 75 65 72 79 2c 22 53 45 4c 45 43 54 20 2a 20  Query,"SELECT * 
33980 46 52 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20  FROM ", 0);.    
33990 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
339a0 73 51 75 65 72 79 2c 7a 54 61 62 2c 27 22 27 29  sQuery,zTab,'"')
339b0 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ;.        append
339c0 54 65 78 74 28 26 73 51 75 65 72 79 2c 22 20 4e  Text(&sQuery," N
339d0 4f 54 20 49 4e 44 45 58 45 44 3b 22 2c 20 30 29  OT INDEXED;", 0)
339e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
339f0 28 20 73 74 72 63 6d 70 28 7a 54 61 62 2c 20 22  ( strcmp(zTab, "
33a00 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 29 3d  sqlite_master")=
33a10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70  =0 ){.        ap
33a20 70 65 6e 64 54 65 78 74 28 26 73 51 75 65 72 79  pendText(&sQuery
33a30 2c 22 53 45 4c 45 43 54 20 74 79 70 65 2c 6e 61  ,"SELECT type,na
33a40 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c 73 71 6c 20  me,tbl_name,sql 
33a50 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
33a60 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  er".            
33a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
33a80 20 4f 52 44 45 52 20 42 59 20 6e 61 6d 65 3b 22   ORDER BY name;"
33a90 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 0);.      }els
33aa0 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54 61  e if( strcmp(zTa
33ab0 62 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65  b, "sqlite_seque
33ac0 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nce")==0 ){.    
33ad0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
33ae0 73 51 75 65 72 79 2c 22 53 45 4c 45 43 54 20 6e  sQuery,"SELECT n
33af0 61 6d 65 2c 73 65 71 20 46 52 4f 4d 20 73 71 6c  ame,seq FROM sql
33b00 69 74 65 5f 73 65 71 75 65 6e 63 65 22 0a 20 20  ite_sequence".  
33b10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33b20 20 20 20 20 20 20 20 20 20 22 20 4f 52 44 45 52           " ORDER
33b30 20 42 59 20 6e 61 6d 65 3b 22 2c 20 30 29 3b 0a   BY name;", 0);.
33b40 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
33b50 73 74 72 63 6d 70 28 7a 54 61 62 2c 20 22 73 71  strcmp(zTab, "sq
33b60 6c 69 74 65 5f 73 74 61 74 31 22 29 3d 3d 30 20  lite_stat1")==0 
33b70 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  ){.        appen
33b80 64 54 65 78 74 28 26 73 51 75 65 72 79 2c 22 53  dText(&sQuery,"S
33b90 45 4c 45 43 54 20 74 62 6c 2c 69 64 78 2c 73 74  ELECT tbl,idx,st
33ba0 61 74 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73  at FROM sqlite_s
33bb0 74 61 74 31 22 0a 20 20 20 20 20 20 20 20 20 20  tat1".          
33bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33bd0 20 22 20 4f 52 44 45 52 20 42 59 20 74 62 6c 2c   " ORDER BY tbl,
33be0 69 64 78 3b 22 2c 20 30 29 3b 0a 20 20 20 20 20  idx;", 0);.     
33bf0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
33c00 70 28 7a 54 61 62 2c 20 22 73 71 6c 69 74 65 5f  p(zTab, "sqlite_
33c10 73 74 61 74 33 22 29 3d 3d 30 0a 20 20 20 20 20  stat3")==0.     
33c20 20 20 20 20 20 20 20 20 7c 7c 20 73 74 72 63 6d          || strcm
33c30 70 28 7a 54 61 62 2c 20 22 73 71 6c 69 74 65 5f  p(zTab, "sqlite_
33c40 73 74 61 74 34 22 29 3d 3d 30 20 29 7b 0a 20 20  stat4")==0 ){.  
33c50 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
33c60 28 26 73 51 75 65 72 79 2c 20 22 53 45 4c 45 43  (&sQuery, "SELEC
33c70 54 20 2a 20 46 52 4f 4d 20 22 2c 20 30 29 3b 0a  T * FROM ", 0);.
33c80 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
33c90 78 74 28 26 73 51 75 65 72 79 2c 20 7a 54 61 62  xt(&sQuery, zTab
33ca0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70  , 0);.        ap
33cb0 70 65 6e 64 54 65 78 74 28 26 73 51 75 65 72 79  pendText(&sQuery
33cc0 2c 20 22 20 4f 52 44 45 52 20 42 59 20 74 62 6c  , " ORDER BY tbl
33cd0 2c 20 69 64 78 2c 20 72 6f 77 69 64 3b 5c 6e 22  , idx, rowid;\n"
33ce0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
33cf0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
33d00 73 53 71 6c 2c 20 7a 53 65 70 2c 20 30 29 3b 0a  sSql, zSep, 0);.
33d10 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
33d20 28 26 73 53 71 6c 2c 20 73 51 75 65 72 79 2e 7a  (&sSql, sQuery.z
33d30 2c 20 27 5c 27 27 29 3b 0a 20 20 20 20 20 20 73  , '\'');.      s
33d40 51 75 65 72 79 2e 6e 20 3d 20 30 3b 0a 20 20 20  Query.n = 0;.   
33d50 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
33d60 53 71 6c 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20  Sql, ",", 0);.  
33d70 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
33d80 73 53 71 6c 2c 20 7a 54 61 62 2c 20 27 5c 27 27  sSql, zTab, '\''
33d90 29 3b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20  );.      zSep = 
33da0 22 29 2c 28 22 3b 0a 20 20 20 20 7d 0a 20 20 20  "),(";.    }.   
33db0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
33dc0 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66  e(pStmt);.    if
33dd0 28 20 62 53 65 70 61 72 61 74 65 20 29 7b 0a 20  ( bSeparate ){. 
33de0 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69       zSql = sqli
33df0 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
33e00 20 20 20 20 20 20 20 22 25 73 29 29 22 0a 20 20         "%s))".  
33e10 20 20 20 20 20 20 20 20 22 20 53 45 4c 45 43 54          " SELECT
33e20 20 6c 6f 77 65 72 28 68 65 78 28 73 68 61 33 5f   lower(hex(sha3_
33e30 71 75 65 72 79 28 61 2c 25 64 29 29 29 20 41 53  query(a,%d))) AS
33e40 20 68 61 73 68 2c 20 62 20 41 53 20 6c 61 62 65   hash, b AS labe
33e50 6c 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 20  l".          "  
33e60 20 46 52 4f 4d 20 5b 73 68 61 33 73 75 6d 24 71   FROM [sha3sum$q
33e70 75 65 72 79 5d 22 2c 0a 20 20 20 20 20 20 20 20  uery]",.        
33e80 20 20 73 53 71 6c 2e 7a 2c 20 69 53 69 7a 65 29    sSql.z, iSize)
33e90 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
33ea0 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
33eb0 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
33ec0 20 20 20 20 20 22 25 73 29 29 22 0a 20 20 20 20       "%s))".    
33ed0 20 20 20 20 20 20 22 20 53 45 4c 45 43 54 20 6c        " SELECT l
33ee0 6f 77 65 72 28 68 65 78 28 73 68 61 33 5f 71 75  ower(hex(sha3_qu
33ef0 65 72 79 28 67 72 6f 75 70 5f 63 6f 6e 63 61 74  ery(group_concat
33f00 28 61 2c 27 27 29 2c 25 64 29 29 29 20 41 53 20  (a,''),%d))) AS 
33f10 68 61 73 68 22 0a 20 20 20 20 20 20 20 20 20 20  hash".          
33f20 22 20 20 20 46 52 4f 4d 20 5b 73 68 61 33 73 75  "   FROM [sha3su
33f30 6d 24 71 75 65 72 79 5d 22 2c 0a 20 20 20 20 20  m$query]",.     
33f40 20 20 20 20 20 73 53 71 6c 2e 7a 2c 20 69 53 69       sSql.z, iSi
33f50 7a 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  ze);.    }.    f
33f60 72 65 65 54 65 78 74 28 26 73 51 75 65 72 79 29  reeText(&sQuery)
33f70 3b 0a 20 20 20 20 66 72 65 65 54 65 78 74 28 26  ;.    freeText(&
33f80 73 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 62  sSql);.    if( b
33f90 44 65 62 75 67 20 29 7b 0a 20 20 20 20 20 20 75  Debug ){.      u
33fa0 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
33fb0 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 53 71 6c 29  t, "%s\n", zSql)
33fc0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
33fd0 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2d     shell_exec(p-
33fe0 3e 64 62 2c 20 7a 53 71 6c 2c 20 73 68 65 6c 6c  >db, zSql, shell
33ff0 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2c 20 30 29  _callback, p, 0)
34000 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
34010 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
34020 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
34030 3d 3d 27 73 27 0a 20 20 20 26 26 20 28 73 74 72  =='s'.   && (str
34040 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
34050 73 68 65 6c 6c 22 2c 20 6e 29 3d 3d 30 20 7c 7c  shell", n)==0 ||
34060 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
34070 5d 2c 22 73 79 73 74 65 6d 22 2c 6e 29 3d 3d 30  ],"system",n)==0
34080 29 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ).  ){.    char 
34090 2a 7a 43 6d 64 3b 0a 20 20 20 20 69 6e 74 20 69  *zCmd;.    int i
340a0 2c 20 78 3b 0a 20 20 20 20 69 66 28 20 6e 41 72  , x;.    if( nAr
340b0 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77  g<2 ){.      raw
340c0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
340d0 22 55 73 61 67 65 3a 20 2e 73 79 73 74 65 6d 20  "Usage: .system 
340e0 43 4f 4d 4d 41 4e 44 5c 6e 22 29 3b 0a 20 20 20  COMMAND\n");.   
340f0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
34100 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
34110 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20  nd_exit;.    }. 
34120 20 20 20 7a 43 6d 64 20 3d 20 73 71 6c 69 74 65     zCmd = sqlite
34130 33 5f 6d 70 72 69 6e 74 66 28 73 74 72 63 68 72  3_mprintf(strchr
34140 28 61 7a 41 72 67 5b 31 5d 2c 27 20 27 29 3d 3d  (azArg[1],' ')==
34150 30 3f 22 25 73 22 3a 22 5c 22 25 73 5c 22 22 2c  0?"%s":"\"%s\"",
34160 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
34170 66 6f 72 28 69 3d 32 3b 20 69 3c 6e 41 72 67 3b  for(i=2; i<nArg;
34180 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 43 6d   i++){.      zCm
34190 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  d = sqlite3_mpri
341a0 6e 74 66 28 73 74 72 63 68 72 28 61 7a 41 72 67  ntf(strchr(azArg
341b0 5b 69 5d 2c 27 20 27 29 3d 3d 30 3f 22 25 7a 20  [i],' ')==0?"%z 
341c0 25 73 22 3a 22 25 7a 20 5c 22 25 73 5c 22 22 2c  %s":"%z \"%s\"",
341d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
341e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43                zC
341f0 6d 64 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  md, azArg[i]);. 
34200 20 20 20 7d 0a 20 20 20 20 78 20 3d 20 73 79 73     }.    x = sys
34210 74 65 6d 28 7a 43 6d 64 29 3b 0a 20 20 20 20 73  tem(zCmd);.    s
34220 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6d 64  qlite3_free(zCmd
34230 29 3b 0a 20 20 20 20 69 66 28 20 78 20 29 20 72  );.    if( x ) r
34240 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
34250 2c 20 22 53 79 73 74 65 6d 20 63 6f 6d 6d 61 6e  , "System comman
34260 64 20 72 65 74 75 72 6e 73 20 25 64 5c 6e 22 2c  d returns %d\n",
34270 20 78 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20   x);.  }else..  
34280 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20 73 74  if( c=='s' && st
34290 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
342a0 22 73 68 6f 77 22 2c 20 6e 29 3d 3d 30 20 29 7b  "show", n)==0 ){
342b0 0a 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73  .    static cons
342c0 74 20 63 68 61 72 20 2a 61 7a 42 6f 6f 6c 5b 5d  t char *azBool[]
342d0 20 3d 20 7b 20 22 6f 66 66 22 2c 20 22 6f 6e 22   = { "off", "on"
342e0 2c 20 22 74 72 69 67 67 65 72 22 2c 20 22 66 75  , "trigger", "fu
342f0 6c 6c 22 7d 3b 0a 20 20 20 20 69 6e 74 20 69 3b  ll"};.    int i;
34300 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 31  .    if( nArg!=1
34310 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
34320 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
34330 61 67 65 3a 20 2e 73 68 6f 77 5c 6e 22 29 3b 0a  age: .show\n");.
34340 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
34350 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
34360 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
34370 7d 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  }.    utf8_print
34380 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31 32 2e 31  f(p->out, "%12.1
34390 32 73 3a 20 25 73 5c 6e 22 2c 22 65 63 68 6f 22  2s: %s\n","echo"
343a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
343b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
343c0 20 20 20 20 61 7a 42 6f 6f 6c 5b 53 68 65 6c 6c      azBool[Shell
343d0 48 61 73 46 6c 61 67 28 70 2c 20 53 48 46 4c 47  HasFlag(p, SHFLG
343e0 5f 45 63 68 6f 29 5d 29 3b 0a 20 20 20 20 75 74  _Echo)]);.    ut
343f0 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
34400 2c 20 22 25 31 32 2e 31 32 73 3a 20 25 73 5c 6e  , "%12.12s: %s\n
34410 22 2c 22 65 71 70 22 2c 20 61 7a 42 6f 6f 6c 5b  ","eqp", azBool[
34420 70 2d 3e 61 75 74 6f 45 51 50 26 33 5d 29 3b 0a  p->autoEQP&3]);.
34430 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
34440 70 2d 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32 73  p->out, "%12.12s
34450 3a 20 25 73 5c 6e 22 2c 22 65 78 70 6c 61 69 6e  : %s\n","explain
34460 22 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 6d  ",.         p->m
34470 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69  ode==MODE_Explai
34480 6e 20 3f 20 22 6f 6e 22 20 3a 20 70 2d 3e 61 75  n ? "on" : p->au
34490 74 6f 45 78 70 6c 61 69 6e 20 3f 20 22 61 75 74  toExplain ? "aut
344a0 6f 22 20 3a 20 22 6f 66 66 22 29 3b 0a 20 20 20  o" : "off");.   
344b0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
344c0 6f 75 74 2c 22 25 31 32 2e 31 32 73 3a 20 25 73  out,"%12.12s: %s
344d0 5c 6e 22 2c 22 68 65 61 64 65 72 73 22 2c 20 61  \n","headers", a
344e0 7a 42 6f 6f 6c 5b 70 2d 3e 73 68 6f 77 48 65 61  zBool[p->showHea
344f0 64 65 72 21 3d 30 5d 29 3b 0a 20 20 20 20 75 74  der!=0]);.    ut
34500 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
34510 2c 20 22 25 31 32 2e 31 32 73 3a 20 25 73 5c 6e  , "%12.12s: %s\n
34520 22 2c 22 6d 6f 64 65 22 2c 20 6d 6f 64 65 44 65  ","mode", modeDe
34530 73 63 72 5b 70 2d 3e 6d 6f 64 65 5d 29 3b 0a 20  scr[p->mode]);. 
34540 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
34550 2d 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32 73 3a  ->out, "%12.12s:
34560 20 22 2c 20 22 6e 75 6c 6c 76 61 6c 75 65 22 29   ", "nullvalue")
34570 3b 0a 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63  ;.      output_c
34580 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20  _string(p->out, 
34590 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20  p->nullValue);. 
345a0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
345b0 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  p->out, "\n");. 
345c0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
345d0 2d 3e 6f 75 74 2c 22 25 31 32 2e 31 32 73 3a 20  ->out,"%12.12s: 
345e0 25 73 5c 6e 22 2c 22 6f 75 74 70 75 74 22 2c 0a  %s\n","output",.
345f0 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 6c              strl
34600 65 6e 33 30 28 70 2d 3e 6f 75 74 66 69 6c 65 29  en30(p->outfile)
34610 20 3f 20 70 2d 3e 6f 75 74 66 69 6c 65 20 3a 20   ? p->outfile : 
34620 22 73 74 64 6f 75 74 22 29 3b 0a 20 20 20 20 75  "stdout");.    u
34630 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
34640 74 2c 22 25 31 32 2e 31 32 73 3a 20 22 2c 20 22  t,"%12.12s: ", "
34650 63 6f 6c 73 65 70 61 72 61 74 6f 72 22 29 3b 0a  colseparator");.
34660 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73        output_c_s
34670 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 70 2d  tring(p->out, p-
34680 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a  >colSeparator);.
34690 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
346a0 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  (p->out, "\n");.
346b0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
346c0 70 2d 3e 6f 75 74 2c 22 25 31 32 2e 31 32 73 3a  p->out,"%12.12s:
346d0 20 22 2c 20 22 72 6f 77 73 65 70 61 72 61 74 6f   ", "rowseparato
346e0 72 22 29 3b 0a 20 20 20 20 20 20 6f 75 74 70 75  r");.      outpu
346f0 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75  t_c_string(p->ou
34700 74 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  t, p->rowSeparat
34710 6f 72 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70  or);.      raw_p
34720 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c  rintf(p->out, "\
34730 6e 22 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72  n");.    utf8_pr
34740 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31  intf(p->out, "%1
34750 32 2e 31 32 73 3a 20 25 73 5c 6e 22 2c 22 73 74  2.12s: %s\n","st
34760 61 74 73 22 2c 20 61 7a 42 6f 6f 6c 5b 70 2d 3e  ats", azBool[p->
34770 73 74 61 74 73 4f 6e 21 3d 30 5d 29 3b 0a 20 20  statsOn!=0]);.  
34780 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
34790 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32 73 3a 20  >out, "%12.12s: 
347a0 22 2c 20 22 77 69 64 74 68 22 29 3b 0a 20 20 20  ", "width");.   
347b0 20 66 6f 72 20 28 69 3d 30 3b 69 3c 28 69 6e 74   for (i=0;i<(int
347c0 29 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f  )ArraySize(p->co
347d0 6c 57 69 64 74 68 29 20 26 26 20 70 2d 3e 63 6f  lWidth) && p->co
347e0 6c 57 69 64 74 68 5b 69 5d 20 21 3d 20 30 3b 69  lWidth[i] != 0;i
347f0 2b 2b 29 20 7b 0a 20 20 20 20 20 20 72 61 77 5f  ++) {.      raw_
34800 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
34810 25 64 20 22 2c 20 70 2d 3e 63 6f 6c 57 69 64 74  %d ", p->colWidt
34820 68 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20  h[i]);.    }.   
34830 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
34840 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 75  ut, "\n");.    u
34850 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
34860 74 2c 20 22 25 31 32 2e 31 32 73 3a 20 25 73 5c  t, "%12.12s: %s\
34870 6e 22 2c 20 22 66 69 6c 65 6e 61 6d 65 22 2c 0a  n", "filename",.
34880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34890 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3f  p->zDbFilename ?
348a0 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20   p->zDbFilename 
348b0 3a 20 22 22 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  : "");.  }else..
348c0 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20    if( c=='s' && 
348d0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
348e0 2c 20 22 73 74 61 74 73 22 2c 20 6e 29 3d 3d 30  , "stats", n)==0
348f0 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
34900 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==2 ){.      p->
34910 73 74 61 74 73 4f 6e 20 3d 20 62 6f 6f 6c 65 61  statsOn = boolea
34920 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29  nValue(azArg[1])
34930 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
34940 6e 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20  nArg==1 ){.     
34950 20 64 69 73 70 6c 61 79 5f 73 74 61 74 73 28 70   display_stats(p
34960 2d 3e 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20  ->db, p, 0);.   
34970 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
34980 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
34990 20 22 55 73 61 67 65 3a 20 2e 73 74 61 74 73 20   "Usage: .stats 
349a0 3f 6f 6e 7c 6f 66 66 3f 5c 6e 22 29 3b 0a 20 20  ?on|off?\n");.  
349b0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
349c0 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
349d0 20 28 63 3d 3d 27 74 27 20 26 26 20 6e 3e 31 20   (c=='t' && n>1 
349e0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
349f0 5b 30 5d 2c 20 22 74 61 62 6c 65 73 22 2c 20 6e  [0], "tables", n
34a00 29 3d 3d 30 29 0a 20 20 20 7c 7c 20 28 63 3d 3d  )==0).   || (c==
34a10 27 69 27 20 26 26 20 28 73 74 72 6e 63 6d 70 28  'i' && (strncmp(
34a20 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6e 64 69 63  azArg[0], "indic
34a30 65 73 22 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 20  es", n)==0.     
34a40 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
34a50 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
34a60 20 22 69 6e 64 65 78 65 73 22 2c 20 6e 29 3d 3d   "indexes", n)==
34a70 30 29 20 29 0a 20 20 29 7b 0a 20 20 20 20 73 71  0) ).  ){.    sq
34a80 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
34a90 74 3b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 7a  t;.    char **az
34aa0 52 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20  Result;.    int 
34ab0 6e 52 6f 77 2c 20 6e 41 6c 6c 6f 63 3b 0a 20 20  nRow, nAlloc;.  
34ac0 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 53 68    int ii;.    Sh
34ad0 65 6c 6c 54 65 78 74 20 73 3b 0a 20 20 20 20 69  ellText s;.    i
34ae0 6e 69 74 54 65 78 74 28 26 73 29 3b 0a 20 20 20  nitText(&s);.   
34af0 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
34b00 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
34b10 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
34b20 62 2c 20 22 50 52 41 47 4d 41 20 64 61 74 61 62  b, "PRAGMA datab
34b30 61 73 65 5f 6c 69 73 74 22 2c 20 2d 31 2c 20 26  ase_list", -1, &
34b40 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69  pStmt, 0);.    i
34b50 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 73  f( rc ) return s
34b60 68 65 6c 6c 44 61 74 61 62 61 73 65 45 72 72 6f  hellDatabaseErro
34b70 72 28 70 2d 3e 64 62 29 3b 0a 0a 20 20 20 20 69  r(p->db);..    i
34b80 66 28 20 6e 41 72 67 3e 32 20 26 26 20 63 3d 3d  f( nArg>2 && c==
34b90 27 69 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  'i' ){.      /* 
34ba0 49 74 20 69 73 20 61 6e 20 68 69 73 74 6f 72 69  It is an histori
34bb0 63 61 6c 20 61 63 63 69 64 65 6e 74 20 74 68 61  cal accident tha
34bc0 74 20 74 68 65 20 2e 69 6e 64 65 78 65 73 20 63  t the .indexes c
34bd0 6f 6d 6d 61 6e 64 20 73 68 6f 77 73 20 61 6e 20  ommand shows an 
34be0 65 72 72 6f 72 0a 20 20 20 20 20 20 2a 2a 20 77  error.      ** w
34bf0 68 65 6e 20 63 61 6c 6c 65 64 20 77 69 74 68 20  hen called with 
34c00 74 68 65 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72  the wrong number
34c10 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 77 68   of arguments wh
34c20 65 72 65 61 73 20 74 68 65 20 2e 74 61 62 6c 65  ereas the .table
34c30 73 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 6d 61  s.      ** comma
34c40 6e 64 20 64 6f 65 73 20 6e 6f 74 2e 20 2a 2f 0a  nd does not. */.
34c50 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
34c60 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
34c70 20 2e 69 6e 64 65 78 65 73 20 3f 4c 49 4b 45 2d   .indexes ?LIKE-
34c80 50 41 54 54 45 52 4e 3f 5c 6e 22 29 3b 0a 20 20  PATTERN?\n");.  
34c90 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
34ca0 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
34cb0 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  and_exit;.    }.
34cc0 20 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 73 71      for(ii=0; sq
34cd0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
34ce0 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 3b 20 69  )==SQLITE_ROW; i
34cf0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73  i++){.      cons
34d00 74 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20  t char *zDbName 
34d10 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
34d20 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
34d30 78 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20  xt(pStmt, 1);.  
34d40 20 20 20 20 69 66 28 20 7a 44 62 4e 61 6d 65 3d      if( zDbName=
34d50 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
34d60 20 20 20 20 20 69 66 28 20 73 2e 7a 20 26 26 20       if( s.z && 
34d70 73 2e 7a 5b 30 5d 20 29 20 61 70 70 65 6e 64 54  s.z[0] ) appendT
34d80 65 78 74 28 26 73 2c 20 22 20 55 4e 49 4f 4e 20  ext(&s, " UNION 
34d90 41 4c 4c 20 22 2c 20 30 29 3b 0a 20 20 20 20 20  ALL ", 0);.     
34da0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
34db0 69 63 6d 70 28 7a 44 62 4e 61 6d 65 2c 20 22 6d  icmp(zDbName, "m
34dc0 61 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ain")==0 ){.    
34dd0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
34de0 73 2c 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20  s, "SELECT name 
34df0 46 52 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20  FROM ", 0);.    
34e00 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
34e10 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20   appendText(&s, 
34e20 22 53 45 4c 45 43 54 20 22 2c 20 30 29 3b 0a 20  "SELECT ", 0);. 
34e30 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
34e40 74 28 26 73 2c 20 7a 44 62 4e 61 6d 65 2c 20 27  t(&s, zDbName, '
34e50 5c 27 27 29 3b 0a 20 20 20 20 20 20 20 20 61 70  \'');.        ap
34e60 70 65 6e 64 54 65 78 74 28 26 73 2c 20 22 7c 7c  pendText(&s, "||
34e70 27 2e 27 7c 7c 6e 61 6d 65 20 46 52 4f 4d 20 22  '.'||name FROM "
34e80 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
34e90 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
34ea0 73 2c 20 7a 44 62 4e 61 6d 65 2c 20 27 22 27 29  s, zDbName, '"')
34eb0 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65  ;.      appendTe
34ec0 78 74 28 26 73 2c 20 22 2e 73 71 6c 69 74 65 5f  xt(&s, ".sqlite_
34ed0 6d 61 73 74 65 72 20 22 2c 20 30 29 3b 0a 20 20  master ", 0);.  
34ee0 20 20 20 20 69 66 28 20 63 3d 3d 27 74 27 20 29      if( c=='t' )
34ef0 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  {.        append
34f00 54 65 78 74 28 26 73 2c 22 20 57 48 45 52 45 20  Text(&s," WHERE 
34f10 74 79 70 65 20 49 4e 20 28 27 74 61 62 6c 65 27  type IN ('table'
34f20 2c 27 76 69 65 77 27 29 22 0a 20 20 20 20 20 20  ,'view')".      
34f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34f40 22 20 20 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54  "   AND name NOT
34f50 20 4c 49 4b 45 20 27 73 71 6c 69 74 65 5f 25 27   LIKE 'sqlite_%'
34f60 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
34f70 20 20 20 20 20 20 20 20 22 20 20 20 41 4e 44 20          "   AND 
34f80 6e 61 6d 65 20 4c 49 4b 45 20 3f 31 22 2c 20 30  name LIKE ?1", 0
34f90 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
34fa0 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
34fb0 78 74 28 26 73 2c 22 20 57 48 45 52 45 20 74 79  xt(&s," WHERE ty
34fc0 70 65 3d 27 69 6e 64 65 78 27 22 0a 20 20 20 20  pe='index'".    
34fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34fe0 20 20 22 20 20 20 41 4e 44 20 74 62 6c 5f 6e 61    "   AND tbl_na
34ff0 6d 65 20 4c 49 4b 45 20 3f 31 22 2c 20 30 29 3b  me LIKE ?1", 0);
35000 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
35010 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
35020 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
35030 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28  .    appendText(
35040 26 73 2c 20 22 20 4f 52 44 45 52 20 42 59 20 31  &s, " ORDER BY 1
35050 22 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20  ", 0);.    rc = 
35060 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
35070 76 32 28 70 2d 3e 64 62 2c 20 73 2e 7a 2c 20 2d  v2(p->db, s.z, -
35080 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
35090 20 20 20 66 72 65 65 54 65 78 74 28 26 73 29 3b     freeText(&s);
350a0 0a 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65  .    if( rc ) re
350b0 74 75 72 6e 20 73 68 65 6c 6c 44 61 74 61 62 61  turn shellDataba
350c0 73 65 45 72 72 6f 72 28 70 2d 3e 64 62 29 3b 0a  seError(p->db);.
350d0 0a 20 20 20 20 2f 2a 20 52 75 6e 20 74 68 65 20  .    /* Run the 
350e0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 70 72  SQL statement pr
350f0 65 70 61 72 65 64 20 62 79 20 74 68 65 20 61 62  epared by the ab
35100 6f 76 65 20 62 6c 6f 63 6b 2e 20 53 74 6f 72 65  ove block. Store
35110 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20   the results.   
35120 20 2a 2a 20 61 73 20 61 6e 20 61 72 72 61 79 20   ** as an array 
35130 6f 66 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65  of nul-terminate
35140 64 20 73 74 72 69 6e 67 73 20 69 6e 20 61 7a 52  d strings in azR
35150 65 73 75 6c 74 5b 5d 2e 20 20 2a 2f 0a 20 20 20  esult[].  */.   
35160 20 6e 52 6f 77 20 3d 20 6e 41 6c 6c 6f 63 20 3d   nRow = nAlloc =
35170 20 30 3b 0a 20 20 20 20 61 7a 52 65 73 75 6c 74   0;.    azResult
35180 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 41   = 0;.    if( nA
35190 72 67 3e 31 20 29 7b 0a 20 20 20 20 20 20 73 71  rg>1 ){.      sq
351a0 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28  lite3_bind_text(
351b0 70 53 74 6d 74 2c 20 31 2c 20 61 7a 41 72 67 5b  pStmt, 1, azArg[
351c0 31 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54  1], -1, SQLITE_T
351d0 52 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d  RANSIENT);.    }
351e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
351f0 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
35200 74 6d 74 2c 20 31 2c 20 22 25 22 2c 20 2d 31 2c  tmt, 1, "%", -1,
35210 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b   SQLITE_STATIC);
35220 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
35230 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
35240 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Stmt)==SQLITE_RO
35250 57 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e  W ){.      if( n
35260 52 6f 77 3e 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20  Row>=nAlloc ){. 
35270 20 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61 7a         char **az
35280 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  New;.        int
35290 20 6e 32 20 3d 20 6e 41 6c 6c 6f 63 2a 32 20 2b   n2 = nAlloc*2 +
352a0 20 31 30 3b 0a 20 20 20 20 20 20 20 20 61 7a 4e   10;.        azN
352b0 65 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61  ew = sqlite3_rea
352c0 6c 6c 6f 63 36 34 28 61 7a 52 65 73 75 6c 74 2c  lloc64(azResult,
352d0 20 73 69 7a 65 6f 66 28 61 7a 52 65 73 75 6c 74   sizeof(azResult
352e0 5b 30 5d 29 2a 6e 32 29 3b 0a 20 20 20 20 20 20  [0])*n2);.      
352f0 20 20 69 66 28 20 61 7a 4e 65 77 3d 3d 30 20 29    if( azNew==0 )
35300 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d  {.          rc =
35310 20 73 68 65 6c 6c 4e 6f 6d 65 6d 45 72 72 6f 72   shellNomemError
35320 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  ();.          br
35330 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
35340 20 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20 3d 20         nAlloc = 
35350 6e 32 3b 0a 20 20 20 20 20 20 20 20 61 7a 52 65  n2;.        azRe
35360 73 75 6c 74 20 3d 20 61 7a 4e 65 77 3b 0a 20 20  sult = azNew;.  
35370 20 20 20 20 7d 0a 20 20 20 20 20 20 61 7a 52 65      }.      azRe
35380 73 75 6c 74 5b 6e 52 6f 77 5d 20 3d 20 73 71 6c  sult[nRow] = sql
35390 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
353a0 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  ", sqlite3_colum
353b0 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29  n_text(pStmt, 0)
353c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d  );.      if( 0==
353d0 61 7a 52 65 73 75 6c 74 5b 6e 52 6f 77 5d 20 29  azResult[nRow] )
353e0 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
353f0 68 65 6c 6c 4e 6f 6d 65 6d 45 72 72 6f 72 28 29  hellNomemError()
35400 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
35410 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
35420 52 6f 77 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  Row++;.    }.   
35430 20 69 66 28 20 73 71 6c 69 74 65 33 5f 66 69 6e   if( sqlite3_fin
35440 61 6c 69 7a 65 28 70 53 74 6d 74 29 21 3d 53 51  alize(pStmt)!=SQ
35450 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
35460 20 72 63 20 3d 20 73 68 65 6c 6c 44 61 74 61 62   rc = shellDatab
35470 61 73 65 45 72 72 6f 72 28 70 2d 3e 64 62 29 3b  aseError(p->db);
35480 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50  .    }..    /* P
35490 72 65 74 74 79 2d 70 72 69 6e 74 20 74 68 65 20  retty-print the 
354a0 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 72 72 61  contents of arra
354b0 79 20 61 7a 52 65 73 75 6c 74 5b 5d 20 74 6f 20  y azResult[] to 
354c0 74 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20  the output */.  
354d0 20 20 69 66 28 20 72 63 3d 3d 30 20 26 26 20 6e    if( rc==0 && n
354e0 52 6f 77 3e 30 20 29 7b 0a 20 20 20 20 20 20 69  Row>0 ){.      i
354f0 6e 74 20 6c 65 6e 2c 20 6d 61 78 6c 65 6e 20 3d  nt len, maxlen =
35500 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c   0;.      int i,
35510 20 6a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50   j;.      int nP
35520 72 69 6e 74 43 6f 6c 2c 20 6e 50 72 69 6e 74 52  rintCol, nPrintR
35530 6f 77 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ow;.      for(i=
35540 30 3b 20 69 3c 6e 52 6f 77 3b 20 69 2b 2b 29 7b  0; i<nRow; i++){
35550 0a 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 73  .        len = s
35560 74 72 6c 65 6e 33 30 28 61 7a 52 65 73 75 6c 74  trlen30(azResult
35570 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66  [i]);.        if
35580 28 20 6c 65 6e 3e 6d 61 78 6c 65 6e 20 29 20 6d  ( len>maxlen ) m
35590 61 78 6c 65 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20  axlen = len;.   
355a0 20 20 20 7d 0a 20 20 20 20 20 20 6e 50 72 69 6e     }.      nPrin
355b0 74 43 6f 6c 20 3d 20 38 30 2f 28 6d 61 78 6c 65  tCol = 80/(maxle
355c0 6e 2b 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20  n+2);.      if( 
355d0 6e 50 72 69 6e 74 43 6f 6c 3c 31 20 29 20 6e 50  nPrintCol<1 ) nP
355e0 72 69 6e 74 43 6f 6c 20 3d 20 31 3b 0a 20 20 20  rintCol = 1;.   
355f0 20 20 20 6e 50 72 69 6e 74 52 6f 77 20 3d 20 28     nPrintRow = (
35600 6e 52 6f 77 20 2b 20 6e 50 72 69 6e 74 43 6f 6c  nRow + nPrintCol
35610 20 2d 20 31 29 2f 6e 50 72 69 6e 74 43 6f 6c 3b   - 1)/nPrintCol;
35620 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
35630 69 3c 6e 50 72 69 6e 74 52 6f 77 3b 20 69 2b 2b  i<nPrintRow; i++
35640 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a  ){.        for(j
35650 3d 69 3b 20 6a 3c 6e 52 6f 77 3b 20 6a 2b 3d 6e  =i; j<nRow; j+=n
35660 50 72 69 6e 74 52 6f 77 29 7b 0a 20 20 20 20 20  PrintRow){.     
35670 20 20 20 20 20 63 68 61 72 20 2a 7a 53 70 20 3d       char *zSp =
35680 20 6a 3c 6e 50 72 69 6e 74 52 6f 77 20 3f 20 22   j<nPrintRow ? "
35690 22 20 3a 20 22 20 20 22 3b 0a 20 20 20 20 20 20  " : "  ";.      
356a0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
356b0 70 2d 3e 6f 75 74 2c 20 22 25 73 25 2d 2a 73 22  p->out, "%s%-*s"
356c0 2c 20 7a 53 70 2c 20 6d 61 78 6c 65 6e 2c 0a 20  , zSp, maxlen,. 
356d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
356e0 20 20 20 20 20 61 7a 52 65 73 75 6c 74 5b 6a 5d       azResult[j]
356f0 20 3f 20 61 7a 52 65 73 75 6c 74 5b 6a 5d 3a 22   ? azResult[j]:"
35700 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ");.        }.  
35710 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
35720 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  (p->out, "\n");.
35730 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
35740 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c     for(ii=0; ii<
35750 6e 52 6f 77 3b 20 69 69 2b 2b 29 20 73 71 6c 69  nRow; ii++) sqli
35760 74 65 33 5f 66 72 65 65 28 61 7a 52 65 73 75 6c  te3_free(azResul
35770 74 5b 69 69 5d 29 3b 0a 20 20 20 20 73 71 6c 69  t[ii]);.    sqli
35780 74 65 33 5f 66 72 65 65 28 61 7a 52 65 73 75 6c  te3_free(azResul
35790 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f  t);.  }else..  /
357a0 2a 20 42 65 67 69 6e 20 72 65 64 69 72 65 63 74  * Begin redirect
357b0 69 6e 67 20 6f 75 74 70 75 74 20 74 6f 20 74 68  ing output to th
357c0 65 20 66 69 6c 65 20 22 74 65 73 74 63 61 73 65  e file "testcase
357d0 2d 6f 75 74 2e 74 78 74 22 20 2a 2f 0a 20 20 69  -out.txt" */.  i
357e0 66 28 20 63 3d 3d 27 74 27 20 26 26 20 73 74 72  f( c=='t' && str
357f0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22 74 65  cmp(azArg[0],"te
35800 73 74 63 61 73 65 22 29 3d 3d 30 20 29 7b 0a 20  stcase")==0 ){. 
35810 20 20 20 6f 75 74 70 75 74 5f 72 65 73 65 74 28     output_reset(
35820 70 29 3b 0a 20 20 20 20 70 2d 3e 6f 75 74 20 3d  p);.    p->out =
35830 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65   output_file_ope
35840 6e 28 22 74 65 73 74 63 61 73 65 2d 6f 75 74 2e  n("testcase-out.
35850 74 78 74 22 29 3b 0a 20 20 20 20 69 66 28 20 70  txt");.    if( p
35860 2d 3e 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ->out==0 ){.    
35870 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
35880 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  err, "Error: can
35890 6e 6f 74 20 6f 70 65 6e 20 27 74 65 73 74 63 61  not open 'testca
358a0 73 65 2d 6f 75 74 2e 74 78 74 27 5c 6e 22 29 3b  se-out.txt'\n");
358b0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
358c0 41 72 67 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg>=2 ){.      
358d0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
358e0 28 73 69 7a 65 6f 66 28 70 2d 3e 7a 54 65 73 74  (sizeof(p->zTest
358f0 63 61 73 65 29 2c 20 70 2d 3e 7a 54 65 73 74 63  case), p->zTestc
35900 61 73 65 2c 20 22 25 73 22 2c 20 61 7a 41 72 67  ase, "%s", azArg
35910 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  [1]);.    }else{
35920 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
35930 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
35940 2d 3e 7a 54 65 73 74 63 61 73 65 29 2c 20 70 2d  ->zTestcase), p-
35950 3e 7a 54 65 73 74 63 61 73 65 2c 20 22 3f 22 29  >zTestcase, "?")
35960 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
35970 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
35980 55 4e 54 45 53 54 41 42 4c 45 0a 20 20 69 66 28  UNTESTABLE.  if(
35990 20 63 3d 3d 27 74 27 20 26 26 20 6e 3e 3d 38 20   c=='t' && n>=8 
359a0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
359b0 5b 30 5d 2c 20 22 74 65 73 74 63 74 72 6c 22 2c  [0], "testctrl",
359c0 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74   n)==0 ){.    st
359d0 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
359e0 74 20 7b 0a 20 20 20 20 20 20 20 63 6f 6e 73 74  t {.       const
359f0 20 63 68 61 72 20 2a 7a 43 74 72 6c 4e 61 6d 65   char *zCtrlName
35a00 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61  ;   /* Name of a
35a10 20 74 65 73 74 2d 63 6f 6e 74 72 6f 6c 20 6f 70   test-control op
35a20 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 69  tion */.       i
35a30 6e 74 20 63 74 72 6c 43 6f 64 65 3b 20 20 20 20  nt ctrlCode;    
35a40 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67          /* Integ
35a50 65 72 20 63 6f 64 65 20 66 6f 72 20 74 68 61 74  er code for that
35a60 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20   option */.     
35a70 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55    const char *zU
35a80 73 61 67 65 3b 20 20 20 20 20 20 2f 2a 20 55 73  sage;      /* Us
35a90 61 67 65 20 6e 6f 74 65 73 20 2a 2f 0a 20 20 20  age notes */.   
35aa0 20 7d 20 61 43 74 72 6c 5b 5d 20 3d 20 7b 0a 20   } aCtrl[] = {. 
35ab0 20 20 20 20 20 7b 20 22 61 6c 77 61 79 73 22 2c       { "always",
35ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
35ad0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57  ITE_TESTCTRL_ALW
35ae0 41 59 53 2c 20 20 20 20 20 20 20 20 22 42 4f 4f  AYS,        "BOO
35af0 4c 45 41 4e 22 20 20 20 20 20 20 20 20 20 20 20  LEAN"           
35b00 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 61 73 73   },.      { "ass
35b10 65 72 74 22 2c 20 20 20 20 20 20 20 20 20 20 20  ert",           
35b20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52    SQLITE_TESTCTR
35b30 4c 5f 41 53 53 45 52 54 2c 20 20 20 20 20 20 20  L_ASSERT,       
35b40 20 22 42 4f 4f 4c 45 41 4e 22 20 20 20 20 20 20   "BOOLEAN"      
35b50 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 7b        },.    /*{
35b60 20 22 62 65 6e 69 67 6e 5f 6d 61 6c 6c 6f 63 5f   "benign_malloc_
35b70 68 6f 6f 6b 73 22 2c 53 51 4c 49 54 45 5f 54 45  hooks",SQLITE_TE
35b80 53 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41  STCTRL_BENIGN_MA
35b90 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 22 22 20 20  LLOC_HOOKS, ""  
35ba0 20 20 20 20 20 20 20 20 7d 2c 2a 2f 0a 20 20 20          },*/.   
35bb0 20 2f 2a 7b 20 22 62 69 74 76 65 63 5f 74 65 73   /*{ "bitvec_tes
35bc0 74 22 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54  t",        SQLIT
35bd0 45 5f 54 45 53 54 43 54 52 4c 5f 42 49 54 56 45  E_TESTCTRL_BITVE
35be0 43 5f 54 45 53 54 2c 20 20 20 22 22 20 20 20 20  C_TEST,   ""    
35bf0 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 2a 2f              },*/
35c00 0a 20 20 20 20 20 20 7b 20 22 62 79 74 65 6f 72  .      { "byteor
35c10 64 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 53  der",          S
35c20 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42  QLITE_TESTCTRL_B
35c30 59 54 45 4f 52 44 45 52 2c 20 20 20 20 20 22 22  YTEORDER,     ""
35c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35c50 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 7b 20 22 66     },.    /*{ "f
35c60 61 75 6c 74 5f 69 6e 73 74 61 6c 6c 22 2c 20 20  ault_install",  
35c70 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43      SQLITE_TESTC
35c80 54 52 4c 5f 46 41 55 4c 54 5f 49 4e 53 54 41 4c  TRL_FAULT_INSTAL
35c90 4c 2c 20 22 22 20 20 20 20 20 20 20 20 20 20 20  L, ""           
35ca0 20 20 20 20 20 7d 2c 20 2a 2f 0a 20 20 20 20 20       }, */.     
35cb0 20 7b 20 22 69 6d 70 6f 73 74 65 72 22 2c 20 20   { "imposter",  
35cc0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
35cd0 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45  TESTCTRL_IMPOSTE
35ce0 52 2c 20 20 20 22 53 43 48 45 4d 41 20 4f 4e 2f  R,   "SCHEMA ON/
35cf0 4f 46 46 20 52 4f 4f 54 50 41 47 45 22 7d 2c 0a  OFF ROOTPAGE"},.
35d00 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 5f  #ifdef SQLITE_N_
35d10 4b 45 59 57 4f 52 44 0a 20 20 20 20 20 20 7b 20  KEYWORD.      { 
35d20 22 69 73 6b 65 79 77 6f 72 64 22 2c 20 20 20 20  "iskeyword",    
35d30 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53        SQLITE_TES
35d40 54 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44 2c  TCTRL_ISKEYWORD,
35d50 20 20 20 20 20 22 49 44 45 4e 54 49 46 49 45 52       "IDENTIFIER
35d60 22 20 20 20 20 20 20 20 20 20 7d 2c 0a 23 65 6e  "         },.#en
35d70 64 69 66 0a 20 20 20 20 20 20 7b 20 22 6c 6f 63  dif.      { "loc
35d80 61 6c 74 69 6d 65 5f 66 61 75 6c 74 22 2c 20 20  altime_fault",  
35d90 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52    SQLITE_TESTCTR
35da0 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c  L_LOCALTIME_FAUL
35db0 54 2c 22 42 4f 4f 4c 45 41 4e 22 20 20 20 20 20  T,"BOOLEAN"     
35dc0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
35dd0 20 22 6e 65 76 65 72 5f 63 6f 72 72 75 70 74 22   "never_corrupt"
35de0 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45  ,      SQLITE_TE
35df0 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52  STCTRL_NEVER_COR
35e00 52 55 50 54 2c 20 22 42 4f 4f 4c 45 41 4e 22 20  RUPT, "BOOLEAN" 
35e10 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
35e20 20 20 20 20 7b 20 22 6f 70 74 69 6d 69 7a 61 74      { "optimizat
35e30 69 6f 6e 73 22 2c 20 20 20 20 20 20 53 51 4c 49  ions",      SQLI
35e40 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
35e50 4d 49 5a 41 54 49 4f 4e 53 2c 20 22 44 49 53 41  MIZATIONS, "DISA
35e60 42 4c 45 2d 4d 41 53 4b 22 20 20 20 20 20 20 20  BLE-MASK"       
35e70 7d 2c 0a 23 69 66 64 65 66 20 59 59 43 4f 56 45  },.#ifdef YYCOVE
35e80 52 41 47 45 0a 20 20 20 20 20 20 7b 20 22 70 61  RAGE.      { "pa
35e90 72 73 65 72 5f 63 6f 76 65 72 61 67 65 22 2c 20  rser_coverage", 
35ea0 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54     SQLITE_TESTCT
35eb0 52 4c 5f 50 41 52 53 45 52 5f 43 4f 56 45 52 41  RL_PARSER_COVERA
35ec0 47 45 2c 20 22 22 20 20 20 20 20 20 20 20 20 20  GE, ""          
35ed0 20 20 20 20 20 20 20 7d 2c 0a 23 65 6e 64 69 66         },.#endif
35ee0 0a 20 20 20 20 20 20 7b 20 22 70 65 6e 64 69 6e  .      { "pendin
35ef0 67 5f 62 79 74 65 22 2c 20 20 20 20 20 20 20 53  g_byte",       S
35f00 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
35f10 45 4e 44 49 4e 47 5f 42 59 54 45 2c 20 20 22 4f  ENDING_BYTE,  "O
35f20 46 46 53 45 54 20 20 22 20 20 20 20 20 20 20 20  FFSET  "        
35f30 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 70     },.      { "p
35f40 72 6e 67 5f 72 65 73 65 74 22 2c 20 20 20 20 20  rng_reset",     
35f50 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43      SQLITE_TESTC
35f60 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 2c 20  TRL_PRNG_RESET, 
35f70 20 20 20 22 22 20 20 20 20 20 20 20 20 20 20 20     ""           
35f80 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
35f90 20 7b 20 22 70 72 6e 67 5f 72 65 73 74 6f 72 65   { "prng_restore
35fa0 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ",       SQLITE_
35fb0 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45  TESTCTRL_PRNG_RE
35fc0 53 54 4f 52 45 2c 20 20 22 22 20 20 20 20 20 20  STORE,  ""      
35fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
35fe0 20 20 20 20 20 20 7b 20 22 70 72 6e 67 5f 73 61        { "prng_sa
35ff0 76 65 22 2c 20 20 20 20 20 20 20 20 20 20 53 51  ve",          SQ
36000 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
36010 4e 47 5f 53 41 56 45 2c 20 20 20 20 20 22 22 20  NG_SAVE,     "" 
36020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36030 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 72 65    },.      { "re
36040 73 65 72 76 65 22 2c 20 20 20 20 20 20 20 20 20  serve",         
36050 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54     SQLITE_TESTCT
36060 52 4c 5f 52 45 53 45 52 56 45 2c 20 20 20 20 20  RL_RESERVE,     
36070 20 20 22 42 59 54 45 53 2d 4f 46 2d 52 45 53 45    "BYTES-OF-RESE
36080 52 56 45 22 20 20 20 7d 2c 0a 20 20 20 20 7d 3b  RVE"   },.    };
36090 0a 20 20 20 20 69 6e 74 20 74 65 73 74 63 74 72  .    int testctr
360a0 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20  l = -1;.    int 
360b0 69 43 74 72 6c 20 3d 20 2d 31 3b 0a 20 20 20 20  iCtrl = -1;.    
360c0 69 6e 74 20 72 63 32 20 3d 20 30 3b 20 20 20 20  int rc2 = 0;    
360d0 2f 2a 20 30 3a 20 75 73 61 67 65 2e 20 20 31 3a  /* 0: usage.  1:
360e0 20 25 64 20 20 32 3a 20 25 78 20 20 33 3a 20 6e   %d  2: %x  3: n
360f0 6f 2d 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20  o-output */.    
36100 69 6e 74 20 69 73 4f 6b 20 3d 20 30 3b 0a 20 20  int isOk = 0;.  
36110 20 20 69 6e 74 20 69 2c 20 6e 32 3b 0a 20 20 20    int i, n2;.   
36120 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6d   const char *zCm
36130 64 20 3d 20 30 3b 0a 0a 20 20 20 20 6f 70 65 6e  d = 0;..    open
36140 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 7a  _db(p, 0);.    z
36150 43 6d 64 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20  Cmd = nArg>=2 ? 
36160 61 7a 41 72 67 5b 31 5d 20 3a 20 22 68 65 6c 70  azArg[1] : "help
36170 22 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 61  ";..    /* The a
36180 72 67 75 6d 65 6e 74 20 63 61 6e 20 6f 70 74 69  rgument can opti
36190 6f 6e 61 6c 6c 79 20 62 65 67 69 6e 20 77 69 74  onally begin wit
361a0 68 20 22 2d 22 20 6f 72 20 22 2d 2d 22 20 2a 2f  h "-" or "--" */
361b0 0a 20 20 20 20 69 66 28 20 7a 43 6d 64 5b 30 5d  .    if( zCmd[0]
361c0 3d 3d 27 2d 27 20 26 26 20 7a 43 6d 64 5b 31 5d  =='-' && zCmd[1]
361d0 20 29 7b 0a 20 20 20 20 20 20 7a 43 6d 64 2b 2b   ){.      zCmd++
361e0 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6d 64  ;.      if( zCmd
361f0 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 7a 43 6d 64  [0]=='-' && zCmd
36200 5b 31 5d 20 29 20 7a 43 6d 64 2b 2b 3b 0a 20 20  [1] ) zCmd++;.  
36210 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 2d 2d 68 65    }..    /* --he
36220 6c 70 20 6c 69 73 74 73 20 61 6c 6c 20 74 65 73  lp lists all tes
36230 74 2d 63 6f 6e 74 72 6f 6c 73 20 2a 2f 0a 20 20  t-controls */.  
36240 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d    if( strcmp(zCm
36250 64 2c 22 68 65 6c 70 22 29 3d 3d 30 20 29 7b 0a  d,"help")==0 ){.
36260 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
36270 66 28 70 2d 3e 6f 75 74 2c 20 22 41 76 61 69 6c  f(p->out, "Avail
36280 61 62 6c 65 20 74 65 73 74 2d 63 6f 6e 74 72 6f  able test-contro
36290 6c 73 3a 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66  ls:\n");.      f
362a0 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
362b0 69 7a 65 28 61 43 74 72 6c 29 3b 20 69 2b 2b 29  ize(aCtrl); i++)
362c0 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
362d0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20  rintf(p->out, " 
362e0 20 2e 74 65 73 74 63 74 72 6c 20 25 73 20 25 73   .testctrl %s %s
362f0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
36300 20 20 20 20 20 20 20 20 20 61 43 74 72 6c 5b 69           aCtrl[i
36310 5d 2e 7a 43 74 72 6c 4e 61 6d 65 2c 20 61 43 74  ].zCtrlName, aCt
36320 72 6c 5b 69 5d 2e 7a 55 73 61 67 65 29 3b 0a 20  rl[i].zUsage);. 
36330 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
36340 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 1;.      goto 
36350 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
36360 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  t;.    }..    /*
36370 20 63 6f 6e 76 65 72 74 20 74 65 73 74 63 74 72   convert testctr
36380 6c 20 74 65 78 74 20 6f 70 74 69 6f 6e 20 74 6f  l text option to
36390 20 76 61 6c 75 65 2e 20 61 6c 6c 6f 77 20 61 6e   value. allow an
363a0 79 20 75 6e 69 71 75 65 20 70 72 65 66 69 78 0a  y unique prefix.
363b0 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6f 70      ** of the op
363c0 74 69 6f 6e 20 6e 61 6d 65 2c 20 6f 72 20 61 20  tion name, or a 
363d0 6e 75 6d 65 72 69 63 61 6c 20 76 61 6c 75 65 2e  numerical value.
363e0 20 2a 2f 0a 20 20 20 20 6e 32 20 3d 20 73 74 72   */.    n2 = str
363f0 6c 65 6e 33 30 28 7a 43 6d 64 29 3b 0a 20 20 20  len30(zCmd);.   
36400 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
36410 79 53 69 7a 65 28 61 43 74 72 6c 29 3b 20 69 2b  ySize(aCtrl); i+
36420 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74  +){.      if( st
36430 72 6e 63 6d 70 28 7a 43 6d 64 2c 20 61 43 74 72  rncmp(zCmd, aCtr
36440 6c 5b 69 5d 2e 7a 43 74 72 6c 4e 61 6d 65 2c 20  l[i].zCtrlName, 
36450 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n2)==0 ){.      
36460 20 20 69 66 28 20 74 65 73 74 63 74 72 6c 3c 30    if( testctrl<0
36470 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65   ){.          te
36480 73 74 63 74 72 6c 20 3d 20 61 43 74 72 6c 5b 69  stctrl = aCtrl[i
36490 5d 2e 63 74 72 6c 43 6f 64 65 3b 0a 20 20 20 20  ].ctrlCode;.    
364a0 20 20 20 20 20 20 69 43 74 72 6c 20 3d 20 69 3b        iCtrl = i;
364b0 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
364c0 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
364d0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
364e0 72 72 6f 72 3a 20 61 6d 62 69 67 75 6f 75 73 20  rror: ambiguous 
364f0 74 65 73 74 2d 63 6f 6e 74 72 6f 6c 3a 20 5c 22  test-control: \"
36500 25 73 5c 22 5c 6e 22 0a 20 20 20 20 20 20 20 20  %s\"\n".        
36510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36520 20 20 20 20 20 20 22 55 73 65 20 5c 22 2e 74 65        "Use \".te
36530 73 74 63 74 72 6c 20 2d 2d 68 65 6c 70 5c 22 20  stctrl --help\" 
36540 66 6f 72 20 68 65 6c 70 5c 6e 22 2c 20 7a 43 6d  for help\n", zCm
36550 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  d);.          rc
36560 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
36570 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
36580 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  d_exit;.        
36590 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
365a0 20 20 20 20 69 66 28 20 74 65 73 74 63 74 72 6c      if( testctrl
365b0 3c 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  <0 ){.      utf8
365c0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  _printf(stderr,"
365d0 45 72 72 6f 72 3a 20 75 6e 6b 6e 6f 77 6e 20 74  Error: unknown t
365e0 65 73 74 2d 63 6f 6e 74 72 6f 6c 3a 20 25 73 5c  est-control: %s\
365f0 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
36600 20 20 20 20 20 20 20 20 20 20 20 20 22 55 73 65              "Use
36610 20 5c 22 2e 74 65 73 74 63 74 72 6c 20 2d 2d 68   \".testctrl --h
36620 65 6c 70 5c 22 20 66 6f 72 20 68 65 6c 70 5c 6e  elp\" for help\n
36630 22 2c 20 7a 43 6d 64 29 3b 0a 20 20 20 20 7d 65  ", zCmd);.    }e
36640 6c 73 65 7b 0a 20 20 20 20 20 20 73 77 69 74 63  lse{.      switc
36650 68 28 74 65 73 74 63 74 72 6c 29 7b 0a 0a 20 20  h(testctrl){..  
36660 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
36670 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e  _test_control(in
36680 74 2c 20 64 62 2c 20 69 6e 74 29 20 2a 2f 0a 20  t, db, int) */. 
36690 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
366a0 54 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49  TE_TESTCTRL_OPTI
366b0 4d 49 5a 41 54 49 4f 4e 53 3a 0a 20 20 20 20 20  MIZATIONS:.     
366c0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
366d0 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45 3a  ESTCTRL_RESERVE:
366e0 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
366f0 41 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20  Arg==3 ){.      
36700 20 20 20 20 20 20 69 6e 74 20 6f 70 74 20 3d 20        int opt = 
36710 28 69 6e 74 29 73 74 72 74 6f 6c 28 61 7a 41 72  (int)strtol(azAr
36720 67 5b 32 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20  g[2], 0, 0);.   
36730 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73           rc2 = s
36740 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
36750 72 6f 6c 28 74 65 73 74 63 74 72 6c 2c 20 70 2d  rol(testctrl, p-
36760 3e 64 62 2c 20 6f 70 74 29 3b 0a 20 20 20 20 20  >db, opt);.     
36770 20 20 20 20 20 20 20 69 73 4f 6b 20 3d 20 33 3b         isOk = 3;
36780 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
36790 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20         break;.. 
367a0 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
367b0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69  3_test_control(i
367c0 6e 74 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  nt) */.        c
367d0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
367e0 54 52 4c 5f 50 52 4e 47 5f 53 41 56 45 3a 0a 20  TRL_PRNG_SAVE:. 
367f0 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
36800 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47  TE_TESTCTRL_PRNG
36810 5f 52 45 53 54 4f 52 45 3a 0a 20 20 20 20 20 20  _RESTORE:.      
36820 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
36830 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45  STCTRL_PRNG_RESE
36840 54 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  T:.        case 
36850 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
36860 42 59 54 45 4f 52 44 45 52 3a 0a 20 20 20 20 20  BYTEORDER:.     
36870 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32       if( nArg==2
36880 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
36890 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 74 65  rc2 = sqlite3_te
368a0 73 74 5f 63 6f 6e 74 72 6f 6c 28 74 65 73 74 63  st_control(testc
368b0 74 72 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  trl);.          
368c0 20 20 69 73 4f 6b 20 3d 20 74 65 73 74 63 74 72    isOk = testctr
368d0 6c 3d 3d 53 51 4c 49 54 45 5f 54 45 53 54 43 54  l==SQLITE_TESTCT
368e0 52 4c 5f 42 59 54 45 4f 52 44 45 52 20 3f 20 31  RL_BYTEORDER ? 1
368f0 20 3a 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20   : 3;.          
36900 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  }.          brea
36910 6b 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 73  k;..        /* s
36920 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
36930 72 6f 6c 28 69 6e 74 2c 20 75 69 6e 74 29 20 2a  rol(int, uint) *
36940 2f 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  /.        case S
36950 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
36960 45 4e 44 49 4e 47 5f 42 59 54 45 3a 0a 20 20 20  ENDING_BYTE:.   
36970 20 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d         if( nArg=
36980 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =3 ){.          
36990 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6f    unsigned int o
369a0 70 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 69  pt = (unsigned i
369b0 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28  nt)integerValue(
369c0 61 7a 41 72 67 5b 32 5d 29 3b 0a 20 20 20 20 20  azArg[2]);.     
369d0 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c         rc2 = sql
369e0 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
369f0 6c 28 74 65 73 74 63 74 72 6c 2c 20 6f 70 74 29  l(testctrl, opt)
36a00 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73  ;.            is
36a10 4f 6b 20 3d 20 33 3b 0a 20 20 20 20 20 20 20 20  Ok = 3;.        
36a20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72    }.          br
36a30 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a  eak;..        /*
36a40 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
36a50 6e 74 72 6f 6c 28 69 6e 74 2c 20 69 6e 74 29 20  ntrol(int, int) 
36a60 2a 2f 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  */.        case 
36a70 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
36a80 41 53 53 45 52 54 3a 0a 20 20 20 20 20 20 20 20  ASSERT:.        
36a90 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
36aa0 43 54 52 4c 5f 41 4c 57 41 59 53 3a 0a 20 20 20  CTRL_ALWAYS:.   
36ab0 20 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d         if( nArg=
36ac0 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =3 ){.          
36ad0 20 20 69 6e 74 20 6f 70 74 20 3d 20 62 6f 6f 6c    int opt = bool
36ae0 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 32  eanValue(azArg[2
36af0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
36b00 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 74 65  rc2 = sqlite3_te
36b10 73 74 5f 63 6f 6e 74 72 6f 6c 28 74 65 73 74 63  st_control(testc
36b20 74 72 6c 2c 20 6f 70 74 29 3b 0a 20 20 20 20 20  trl, opt);.     
36b30 20 20 20 20 20 20 20 69 73 4f 6b 20 3d 20 31 3b         isOk = 1;
36b40 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
36b50 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20         break;.. 
36b60 20 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65         /* sqlite
36b70 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69  3_test_control(i
36b80 6e 74 2c 20 69 6e 74 29 20 2a 2f 0a 20 20 20 20  nt, int) */.    
36b90 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
36ba0 54 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49  TESTCTRL_LOCALTI
36bb0 4d 45 5f 46 41 55 4c 54 3a 0a 20 20 20 20 20 20  ME_FAULT:.      
36bc0 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
36bd0 53 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52  STCTRL_NEVER_COR
36be0 52 55 50 54 3a 0a 20 20 20 20 20 20 20 20 20 20  RUPT:.          
36bf0 69 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20  if( nArg==3 ){. 
36c00 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f             int o
36c10 70 74 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75  pt = booleanValu
36c20 65 28 61 7a 41 72 67 5b 32 5d 29 3b 0a 20 20 20  e(azArg[2]);.   
36c30 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73           rc2 = s
36c40 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
36c50 72 6f 6c 28 74 65 73 74 63 74 72 6c 2c 20 6f 70  rol(testctrl, op
36c60 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
36c70 69 73 4f 6b 20 3d 20 33 3b 0a 20 20 20 20 20 20  isOk = 3;.      
36c80 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
36c90 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20  break;..        
36ca0 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  /* sqlite3_test_
36cb0 63 6f 6e 74 72 6f 6c 28 69 6e 74 2c 20 63 68 61  control(int, cha
36cc0 72 20 2a 29 20 2a 2f 0a 23 69 66 64 65 66 20 53  r *) */.#ifdef S
36cd0 51 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 0a  QLITE_N_KEYWORD.
36ce0 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
36cf0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b  ITE_TESTCTRL_ISK
36d00 45 59 57 4f 52 44 3a 0a 20 20 20 20 20 20 20 20  EYWORD:.        
36d10 20 20 69 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b    if( nArg==3 ){
36d20 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
36d30 73 74 20 63 68 61 72 20 2a 6f 70 74 20 3d 20 61  st char *opt = a
36d40 7a 41 72 67 5b 32 5d 3b 0a 20 20 20 20 20 20 20  zArg[2];.       
36d50 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
36d60 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
36d70 74 65 73 74 63 74 72 6c 2c 20 6f 70 74 29 3b 0a  testctrl, opt);.
36d80 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 6b              isOk
36d90 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
36da0 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  }.          brea
36db0 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20  k;.#endif..     
36dc0 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
36dd0 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52  ESTCTRL_IMPOSTER
36de0 3a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  :.          if( 
36df0 6e 41 72 67 3d 3d 35 20 29 7b 0a 20 20 20 20 20  nArg==5 ){.     
36e00 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c         rc2 = sql
36e10 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
36e20 6c 28 74 65 73 74 63 74 72 6c 2c 20 70 2d 3e 64  l(testctrl, p->d
36e30 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  b,.             
36e40 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 41               azA
36e50 72 67 5b 32 5d 2c 0a 20 20 20 20 20 20 20 20 20  rg[2],.         
36e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36e70 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a   integerValue(az
36e80 41 72 67 5b 33 5d 29 2c 0a 20 20 20 20 20 20 20  Arg[3]),.       
36e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36ea0 20 20 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28     integerValue(
36eb0 61 7a 41 72 67 5b 34 5d 29 29 3b 0a 20 20 20 20  azArg[4]));.    
36ec0 20 20 20 20 20 20 20 20 69 73 4f 6b 20 3d 20 33          isOk = 3
36ed0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
36ee0 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
36ef0 23 69 66 64 65 66 20 59 59 43 4f 56 45 52 41 47  #ifdef YYCOVERAG
36f00 45 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  E.        case S
36f10 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50  QLITE_TESTCTRL_P
36f20 41 52 53 45 52 5f 43 4f 56 45 52 41 47 45 3a 0a  ARSER_COVERAGE:.
36f30 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 41            if( nA
36f40 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 20  rg==2 ){.       
36f50 20 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73       sqlite3_tes
36f60 74 5f 63 6f 6e 74 72 6f 6c 28 74 65 73 74 63 74  t_control(testct
36f70 72 6c 2c 20 70 2d 3e 6f 75 74 29 3b 0a 20 20 20  rl, p->out);.   
36f80 20 20 20 20 20 20 20 20 20 69 73 4f 6b 20 3d 20           isOk = 
36f90 33 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23  3;.          }.#
36fa0 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20  endif.      }.  
36fb0 20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 4f 6b    }.    if( isOk
36fc0 3d 3d 30 20 26 26 20 69 43 74 72 6c 3e 3d 30 20  ==0 && iCtrl>=0 
36fd0 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
36fe0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 55 73  intf(p->out, "Us
36ff0 61 67 65 3a 20 2e 74 65 73 74 63 74 72 6c 20 25  age: .testctrl %
37000 73 20 25 73 5c 6e 22 2c 20 7a 43 6d 64 2c 20 61  s %s\n", zCmd, a
37010 43 74 72 6c 5b 69 43 74 72 6c 5d 2e 7a 55 73 61  Ctrl[iCtrl].zUsa
37020 67 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  ge);.      rc = 
37030 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
37040 20 69 73 4f 6b 3d 3d 31 20 29 7b 0a 20 20 20 20   isOk==1 ){.    
37050 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
37060 6f 75 74 2c 20 22 25 64 5c 6e 22 2c 20 72 63 32  out, "%d\n", rc2
37070 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
37080 20 69 73 4f 6b 3d 3d 32 20 29 7b 0a 20 20 20 20   isOk==2 ){.    
37090 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
370a0 6f 75 74 2c 20 22 30 78 25 30 38 78 5c 6e 22 2c  out, "0x%08x\n",
370b0 20 72 63 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   rc2);.    }.  }
370c0 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 21  else.#endif /* !
370d0 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 55  defined(SQLITE_U
370e0 4e 54 45 53 54 41 42 4c 45 29 20 2a 2f 0a 0a 20  NTESTABLE) */.. 
370f0 20 69 66 28 20 63 3d 3d 27 74 27 20 26 26 20 6e   if( c=='t' && n
37100 3e 34 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  >4 && strncmp(az
37110 41 72 67 5b 30 5d 2c 20 22 74 69 6d 65 6f 75 74  Arg[0], "timeout
37120 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
37130 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
37140 20 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f     sqlite3_busy_
37150 74 69 6d 65 6f 75 74 28 70 2d 3e 64 62 2c 20 6e  timeout(p->db, n
37160 41 72 67 3e 3d 32 20 3f 20 28 69 6e 74 29 69 6e  Arg>=2 ? (int)in
37170 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67  tegerValue(azArg
37180 5b 31 5d 29 20 3a 20 30 29 3b 0a 20 20 7d 65 6c  [1]) : 0);.  }el
37190 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 74 27  se..  if( c=='t'
371a0 20 26 26 20 6e 3e 3d 35 20 26 26 20 73 74 72 6e   && n>=5 && strn
371b0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 74  cmp(azArg[0], "t
371c0 69 6d 65 72 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  imer", n)==0 ){.
371d0 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
371e0 29 7b 0a 20 20 20 20 20 20 65 6e 61 62 6c 65 54  ){.      enableT
371f0 69 6d 65 72 20 3d 20 62 6f 6f 6c 65 61 6e 56 61  imer = booleanVa
37200 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  lue(azArg[1]);. 
37210 20 20 20 20 20 69 66 28 20 65 6e 61 62 6c 65 54       if( enableT
37220 69 6d 65 72 20 26 26 20 21 48 41 53 5f 54 49 4d  imer && !HAS_TIM
37230 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61  ER ){.        ra
37240 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
37250 20 22 45 72 72 6f 72 3a 20 74 69 6d 65 72 20 6e   "Error: timer n
37260 6f 74 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20  ot available on 
37270 74 68 69 73 20 73 79 73 74 65 6d 2e 5c 6e 22 29  this system.\n")
37280 3b 0a 20 20 20 20 20 20 20 20 65 6e 61 62 6c 65  ;.        enable
37290 54 69 6d 65 72 20 3d 20 30 3b 0a 20 20 20 20 20  Timer = 0;.     
372a0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
372b0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
372c0 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
372d0 74 69 6d 65 72 20 6f 6e 7c 6f 66 66 5c 6e 22 29  timer on|off\n")
372e0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
372f0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
37300 20 69 66 28 20 63 3d 3d 27 74 27 20 26 26 20 73   if( c=='t' && s
37310 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
37320 20 22 74 72 61 63 65 22 2c 20 6e 29 3d 3d 30 20   "trace", n)==0 
37330 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  ){.    open_db(p
37340 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 41  , 0);.    if( nA
37350 72 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72  rg!=2 ){.      r
37360 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
37370 2c 20 22 55 73 61 67 65 3a 20 2e 74 72 61 63 65  , "Usage: .trace
37380 20 46 49 4c 45 7c 6f 66 66 5c 6e 22 29 3b 0a 20   FILE|off\n");. 
37390 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
373a0 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
373b0 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d  mand_exit;.    }
373c0 0a 20 20 20 20 6f 75 74 70 75 74 5f 66 69 6c 65  .    output_file
373d0 5f 63 6c 6f 73 65 28 70 2d 3e 74 72 61 63 65 4f  _close(p->traceO
373e0 75 74 29 3b 0a 20 20 20 20 70 2d 3e 74 72 61 63  ut);.    p->trac
373f0 65 4f 75 74 20 3d 20 6f 75 74 70 75 74 5f 66 69  eOut = output_fi
37400 6c 65 5f 6f 70 65 6e 28 61 7a 41 72 67 5b 31 5d  le_open(azArg[1]
37410 29 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28  );.#if !defined(
37420 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43  SQLITE_OMIT_TRAC
37430 45 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53  E) && !defined(S
37440 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
37450 49 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 69  ING_POINT).    i
37460 66 28 20 70 2d 3e 74 72 61 63 65 4f 75 74 3d 3d  f( p->traceOut==
37470 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
37480 65 33 5f 74 72 61 63 65 5f 76 32 28 70 2d 3e 64  e3_trace_v2(p->d
37490 62 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  b, 0, 0, 0);.   
374a0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
374b0 6c 69 74 65 33 5f 74 72 61 63 65 5f 76 32 28 70  lite3_trace_v2(p
374c0 2d 3e 64 62 2c 20 53 51 4c 49 54 45 5f 54 52 41  ->db, SQLITE_TRA
374d0 43 45 5f 53 54 4d 54 2c 20 73 71 6c 5f 74 72 61  CE_STMT, sql_tra
374e0 63 65 5f 63 61 6c 6c 62 61 63 6b 2c 70 2d 3e 74  ce_callback,p->t
374f0 72 61 63 65 4f 75 74 29 3b 0a 20 20 20 20 7d 0a  raceOut);.    }.
37500 23 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 0a 0a  #endif.  }else..
37510 23 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f  #if SQLITE_USER_
37520 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20  AUTHENTICATION. 
37530 20 69 66 28 20 63 3d 3d 27 75 27 20 26 26 20 73   if( c=='u' && s
37540 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
37550 20 22 75 73 65 72 22 2c 20 6e 29 3d 3d 30 20 29   "user", n)==0 )
37560 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32  {.    if( nArg<2
37570 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
37580 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
37590 61 67 65 3a 20 2e 75 73 65 72 20 53 55 42 43 4f  age: .user SUBCO
375a0 4d 4d 41 4e 44 20 2e 2e 2e 5c 6e 22 29 3b 0a 20  MMAND ...\n");. 
375b0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
375c0 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
375d0 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d  mand_exit;.    }
375e0 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
375f0 30 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63  0);.    if( strc
37600 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 6f 67  mp(azArg[1],"log
37610 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  in")==0 ){.     
37620 20 69 66 28 20 6e 41 72 67 21 3d 34 20 29 7b 0a   if( nArg!=4 ){.
37630 20 20 20 20 20 20 20 20 72 61 77 5f 70 72