/ Hex Artifact Content
Login

Artifact 84af7b92b6c937a0b4f323719f2069e669bd685a7dcc81a42c3d9b21d040ba23:


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 23 69 66 20 53 51 4c 49 54 45  e3.h".#if SQLITE
06f0: 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41  _USER_AUTHENTICA
0700: 54 49 4f 4e 0a 23 20 69 6e 63 6c 75 64 65 20 22  TION.# include "
0710: 73 71 6c 69 74 65 33 75 73 65 72 61 75 74 68 2e  sqlite3userauth.
0720: 68 22 0a 23 65 6e 64 69 66 0a 23 69 6e 63 6c 75  h".#endif.#inclu
0730: 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a 23 69 6e  de <ctype.h>.#in
0740: 63 6c 75 64 65 20 3c 73 74 64 61 72 67 2e 68 3e  clude <stdarg.h>
0750: 0a 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f  ..#if !defined(_
0760: 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69 6e  WIN32) && !defin
0770: 65 64 28 57 49 4e 33 32 29 0a 23 20 69 6e 63 6c  ed(WIN32).# incl
0780: 75 64 65 20 3c 73 69 67 6e 61 6c 2e 68 3e 0a 23  ude <signal.h>.#
0790: 20 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 52   if !defined(__R
07a0: 54 50 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65  TP__) && !define
07b0: 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a 23  d(_WRS_KERNEL).#
07c0: 20 20 69 6e 63 6c 75 64 65 20 3c 70 77 64 2e 68    include <pwd.h
07d0: 3e 0a 23 20 65 6e 64 69 66 0a 23 20 69 6e 63 6c  >.# endif.# incl
07e0: 75 64 65 20 3c 75 6e 69 73 74 64 2e 68 3e 0a 23  ude <unistd.h>.#
07f0: 65 6e 64 69 66 0a 23 69 6e 63 6c 75 64 65 20 3c  endif.#include <
0800: 73 79 73 2f 74 79 70 65 73 2e 68 3e 0a 23 69 6e  sys/types.h>.#in
0810: 63 6c 75 64 65 20 3c 73 79 73 2f 73 74 61 74 2e  clude <sys/stat.
0820: 68 3e 0a 0a 23 69 66 20 48 41 56 45 5f 52 45 41  h>..#if HAVE_REA
0830: 44 4c 49 4e 45 0a 23 20 69 6e 63 6c 75 64 65 20  DLINE.# include 
0840: 3c 72 65 61 64 6c 69 6e 65 2f 72 65 61 64 6c 69  <readline/readli
0850: 6e 65 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65 20  ne.h>.# include 
0860: 3c 72 65 61 64 6c 69 6e 65 2f 68 69 73 74 6f 72  <readline/histor
0870: 79 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23 69 66  y.h>.#endif..#if
0880: 20 48 41 56 45 5f 45 44 49 54 4c 49 4e 45 0a 23   HAVE_EDITLINE.#
0890: 20 69 6e 63 6c 75 64 65 20 3c 65 64 69 74 6c 69   include <editli
08a0: 6e 65 2f 72 65 61 64 6c 69 6e 65 2e 68 3e 0a 23  ne/readline.h>.#
08b0: 65 6e 64 69 66 0a 0a 23 69 66 20 48 41 56 45 5f  endif..#if HAVE_
08c0: 45 44 49 54 4c 49 4e 45 20 7c 7c 20 48 41 56 45  EDITLINE || HAVE
08d0: 5f 52 45 41 44 4c 49 4e 45 0a 0a 23 20 64 65 66  _READLINE..# def
08e0: 69 6e 65 20 73 68 65 6c 6c 5f 61 64 64 5f 68 69  ine shell_add_hi
08f0: 73 74 6f 72 79 28 58 29 20 61 64 64 5f 68 69 73  story(X) add_his
0900: 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e 65  tory(X).# define
0910: 20 73 68 65 6c 6c 5f 72 65 61 64 5f 68 69 73 74   shell_read_hist
0920: 6f 72 79 28 58 29 20 72 65 61 64 5f 68 69 73 74  ory(X) read_hist
0930: 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e 65 20  ory(X).# define 
0940: 73 68 65 6c 6c 5f 77 72 69 74 65 5f 68 69 73 74  shell_write_hist
0950: 6f 72 79 28 58 29 20 77 72 69 74 65 5f 68 69 73  ory(X) write_his
0960: 74 6f 72 79 28 58 29 0a 23 20 64 65 66 69 6e 65  tory(X).# define
0970: 20 73 68 65 6c 6c 5f 73 74 69 66 6c 65 5f 68 69   shell_stifle_hi
0980: 73 74 6f 72 79 28 58 29 20 73 74 69 66 6c 65 5f  story(X) stifle_
0990: 68 69 73 74 6f 72 79 28 58 29 0a 23 20 64 65 66  history(X).# def
09a0: 69 6e 65 20 73 68 65 6c 6c 5f 72 65 61 64 6c 69  ine shell_readli
09b0: 6e 65 28 58 29 20 72 65 61 64 6c 69 6e 65 28 58  ne(X) readline(X
09c0: 29 0a 0a 23 65 6c 69 66 20 48 41 56 45 5f 4c 49  )..#elif HAVE_LI
09d0: 4e 45 4e 4f 49 53 45 0a 0a 23 20 69 6e 63 6c 75  NENOISE..# inclu
09e0: 64 65 20 22 6c 69 6e 65 6e 6f 69 73 65 2e 68 22  de "linenoise.h"
09f0: 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f  .# define shell_
0a00: 61 64 64 5f 68 69 73 74 6f 72 79 28 58 29 20 6c  add_history(X) l
0a10: 69 6e 65 6e 6f 69 73 65 48 69 73 74 6f 72 79 41  inenoiseHistoryA
0a20: 64 64 28 58 29 0a 23 20 64 65 66 69 6e 65 20 73  dd(X).# define s
0a30: 68 65 6c 6c 5f 72 65 61 64 5f 68 69 73 74 6f 72  hell_read_histor
0a40: 79 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65 48 69  y(X) linenoiseHi
0a50: 73 74 6f 72 79 4c 6f 61 64 28 58 29 0a 23 20 64  storyLoad(X).# d
0a60: 65 66 69 6e 65 20 73 68 65 6c 6c 5f 77 72 69 74  efine shell_writ
0a70: 65 5f 68 69 73 74 6f 72 79 28 58 29 20 6c 69 6e  e_history(X) lin
0a80: 65 6e 6f 69 73 65 48 69 73 74 6f 72 79 53 61 76  enoiseHistorySav
0a90: 65 28 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68  e(X).# define sh
0aa0: 65 6c 6c 5f 73 74 69 66 6c 65 5f 68 69 73 74 6f  ell_stifle_histo
0ab0: 72 79 28 58 29 20 6c 69 6e 65 6e 6f 69 73 65 48  ry(X) linenoiseH
0ac0: 69 73 74 6f 72 79 53 65 74 4d 61 78 4c 65 6e 28  istorySetMaxLen(
0ad0: 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c  X).# define shel
0ae0: 6c 5f 72 65 61 64 6c 69 6e 65 28 58 29 20 6c 69  l_readline(X) li
0af0: 6e 65 6e 6f 69 73 65 28 58 29 0a 0a 23 65 6c 73  nenoise(X)..#els
0b00: 65 0a 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c  e..# define shel
0b10: 6c 5f 72 65 61 64 5f 68 69 73 74 6f 72 79 28 58  l_read_history(X
0b20: 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c  ).# define shell
0b30: 5f 77 72 69 74 65 5f 68 69 73 74 6f 72 79 28 58  _write_history(X
0b40: 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c  ).# define shell
0b50: 5f 73 74 69 66 6c 65 5f 68 69 73 74 6f 72 79 28  _stifle_history(
0b60: 58 29 0a 0a 23 20 64 65 66 69 6e 65 20 53 48 45  X)..# define SHE
0b70: 4c 4c 5f 55 53 45 5f 4c 4f 43 41 4c 5f 47 45 54  LL_USE_LOCAL_GET
0b80: 4c 49 4e 45 20 31 0a 23 65 6e 64 69 66 0a 0a 0a  LINE 1.#endif...
0b90: 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e  #if defined(_WIN
0ba0: 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57  32) || defined(W
0bb0: 49 4e 33 32 29 0a 23 20 69 6e 63 6c 75 64 65 20  IN32).# include 
0bc0: 3c 69 6f 2e 68 3e 0a 23 20 69 6e 63 6c 75 64 65  <io.h>.# include
0bd0: 20 3c 66 63 6e 74 6c 2e 68 3e 0a 23 20 64 65 66   <fcntl.h>.# def
0be0: 69 6e 65 20 69 73 61 74 74 79 28 68 29 20 5f 69  ine isatty(h) _i
0bf0: 73 61 74 74 79 28 68 29 0a 23 20 69 66 6e 64 65  satty(h).# ifnde
0c00: 66 20 61 63 63 65 73 73 0a 23 20 20 64 65 66 69  f access.#  defi
0c10: 6e 65 20 61 63 63 65 73 73 28 66 2c 6d 29 20 5f  ne access(f,m) _
0c20: 61 63 63 65 73 73 28 28 66 29 2c 28 6d 29 29 0a  access((f),(m)).
0c30: 23 20 65 6e 64 69 66 0a 23 20 75 6e 64 65 66 20  # endif.# undef 
0c40: 70 6f 70 65 6e 0a 23 20 64 65 66 69 6e 65 20 70  popen.# define p
0c50: 6f 70 65 6e 20 5f 70 6f 70 65 6e 0a 23 20 75 6e  open _popen.# un
0c60: 64 65 66 20 70 63 6c 6f 73 65 0a 23 20 64 65 66  def pclose.# def
0c70: 69 6e 65 20 70 63 6c 6f 73 65 20 5f 70 63 6c 6f  ine pclose _pclo
0c80: 73 65 0a 23 65 6c 73 65 0a 20 2f 2a 20 4d 61 6b  se.#else. /* Mak
0c90: 65 20 73 75 72 65 20 69 73 61 74 74 79 28 29 20  e sure isatty() 
0ca0: 68 61 73 20 61 20 70 72 6f 74 6f 74 79 70 65 2e  has a prototype.
0cb0: 20 2a 2f 0a 20 65 78 74 65 72 6e 20 69 6e 74 20   */. extern int 
0cc0: 69 73 61 74 74 79 28 69 6e 74 29 3b 0a 0a 23 20  isatty(int);..# 
0cd0: 69 66 20 21 64 65 66 69 6e 65 64 28 5f 5f 52 54  if !defined(__RT
0ce0: 50 5f 5f 29 20 26 26 20 21 64 65 66 69 6e 65 64  P__) && !defined
0cf0: 28 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 0a 20 20  (_WRS_KERNEL).  
0d00: 2f 2a 20 70 6f 70 65 6e 20 61 6e 64 20 70 63 6c  /* popen and pcl
0d10: 6f 73 65 20 61 72 65 20 6e 6f 74 20 43 38 39 20  ose are not C89 
0d20: 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 73 6f  functions and so
0d30: 20 61 72 65 0a 20 20 2a 2a 20 73 6f 6d 65 74 69   are.  ** someti
0d40: 6d 65 73 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d  mes omitted from
0d50: 20 74 68 65 20 3c 73 74 64 69 6f 2e 68 3e 20 68   the <stdio.h> h
0d60: 65 61 64 65 72 20 2a 2f 0a 20 20 20 65 78 74 65  eader */.   exte
0d70: 72 6e 20 46 49 4c 45 20 2a 70 6f 70 65 6e 28 63  rn FILE *popen(c
0d80: 6f 6e 73 74 20 63 68 61 72 2a 2c 63 6f 6e 73 74  onst char*,const
0d90: 20 63 68 61 72 2a 29 3b 0a 20 20 20 65 78 74 65   char*);.   exte
0da0: 72 6e 20 69 6e 74 20 70 63 6c 6f 73 65 28 46 49  rn int pclose(FI
0db0: 4c 45 2a 29 3b 0a 23 20 65 6c 73 65 0a 23 20 20  LE*);.# else.#  
0dc0: 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 4f 4d  define SQLITE_OM
0dd0: 49 54 5f 50 4f 50 45 4e 20 31 0a 23 20 65 6e 64  IT_POPEN 1.# end
0de0: 69 66 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 64  if.#endif..#if d
0df0: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 5f 57 43  efined(_WIN32_WC
0e00: 45 29 0a 2f 2a 20 57 69 6e 64 6f 77 73 20 43 45  E)./* Windows CE
0e10: 20 28 61 72 6d 2d 77 69 6e 63 65 2d 6d 69 6e 67   (arm-wince-ming
0e20: 77 33 32 63 65 2d 67 63 63 29 20 64 6f 65 73 20  w32ce-gcc) does 
0e30: 6e 6f 74 20 70 72 6f 76 69 64 65 20 69 73 61 74  not provide isat
0e40: 74 79 28 29 0a 20 2a 20 74 68 75 73 20 77 65 20  ty(). * thus we 
0e50: 61 6c 77 61 79 73 20 61 73 73 75 6d 65 20 74 68  always assume th
0e60: 61 74 20 77 65 20 68 61 76 65 20 61 20 63 6f 6e  at we have a con
0e70: 73 6f 6c 65 2e 20 54 68 61 74 20 63 61 6e 20 62  sole. That can b
0e80: 65 0a 20 2a 20 6f 76 65 72 72 69 64 64 65 6e 20  e. * overridden 
0e90: 77 69 74 68 20 74 68 65 20 2d 62 61 74 63 68 20  with the -batch 
0ea0: 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20 6f 70 74  command line opt
0eb0: 69 6f 6e 2e 0a 20 2a 2f 0a 23 64 65 66 69 6e 65  ion.. */.#define
0ec0: 20 69 73 61 74 74 79 28 78 29 20 31 0a 23 65 6e   isatty(x) 1.#en
0ed0: 64 69 66 0a 0a 2f 2a 20 63 74 79 70 65 20 6d 61  dif../* ctype ma
0ee0: 63 72 6f 73 20 74 68 61 74 20 77 6f 72 6b 20 77  cros that work w
0ef0: 69 74 68 20 73 69 67 6e 65 64 20 63 68 61 72 61  ith signed chara
0f00: 63 74 65 72 73 20 2a 2f 0a 23 64 65 66 69 6e 65  cters */.#define
0f10: 20 49 73 53 70 61 63 65 28 58 29 20 20 69 73 73   IsSpace(X)  iss
0f20: 70 61 63 65 28 28 75 6e 73 69 67 6e 65 64 20 63  pace((unsigned c
0f30: 68 61 72 29 58 29 0a 23 64 65 66 69 6e 65 20 49  har)X).#define I
0f40: 73 44 69 67 69 74 28 58 29 20 20 69 73 64 69 67  sDigit(X)  isdig
0f50: 69 74 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  it((unsigned cha
0f60: 72 29 58 29 0a 23 64 65 66 69 6e 65 20 54 6f 4c  r)X).#define ToL
0f70: 6f 77 65 72 28 58 29 20 20 28 63 68 61 72 29 74  ower(X)  (char)t
0f80: 6f 6c 6f 77 65 72 28 28 75 6e 73 69 67 6e 65 64  olower((unsigned
0f90: 20 63 68 61 72 29 58 29 0a 0a 23 69 66 20 64 65   char)X)..#if de
0fa0: 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c  fined(_WIN32) ||
0fb0: 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 0a   defined(WIN32).
0fc0: 23 69 6e 63 6c 75 64 65 20 3c 77 69 6e 64 6f 77  #include <window
0fd0: 73 2e 68 3e 0a 0a 2f 2a 20 73 74 72 69 6e 67 20  s.h>../* string 
0fe0: 63 6f 6e 76 65 72 73 69 6f 6e 20 72 6f 75 74 69  conversion routi
0ff0: 6e 65 73 20 6f 6e 6c 79 20 6e 65 65 64 65 64 20  nes only needed 
1000: 6f 6e 20 57 69 6e 33 32 20 2a 2f 0a 65 78 74 65  on Win32 */.exte
1010: 72 6e 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  rn char *sqlite3
1020: 5f 77 69 6e 33 32 5f 75 6e 69 63 6f 64 65 5f 74  _win32_unicode_t
1030: 6f 5f 75 74 66 38 28 4c 50 43 57 53 54 52 29 3b  o_utf8(LPCWSTR);
1040: 0a 65 78 74 65 72 6e 20 63 68 61 72 20 2a 73 71  .extern char *sq
1050: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73  lite3_win32_mbcs
1060: 5f 74 6f 5f 75 74 66 38 5f 76 32 28 63 6f 6e 73  _to_utf8_v2(cons
1070: 74 20 63 68 61 72 20 2a 2c 20 69 6e 74 29 3b 0a  t char *, int);.
1080: 65 78 74 65 72 6e 20 63 68 61 72 20 2a 73 71 6c  extern char *sql
1090: 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f  ite3_win32_utf8_
10a0: 74 6f 5f 6d 62 63 73 5f 76 32 28 63 6f 6e 73 74  to_mbcs_v2(const
10b0: 20 63 68 61 72 20 2a 2c 20 69 6e 74 29 3b 0a 65   char *, int);.e
10c0: 78 74 65 72 6e 20 4c 50 57 53 54 52 20 73 71 6c  xtern LPWSTR sql
10d0: 69 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f  ite3_win32_utf8_
10e0: 74 6f 5f 75 6e 69 63 6f 64 65 28 63 6f 6e 73 74  to_unicode(const
10f0: 20 63 68 61 72 20 2a 7a 54 65 78 74 29 3b 0a 23   char *zText);.#
1100: 65 6e 64 69 66 0a 0a 2f 2a 20 4f 6e 20 57 69 6e  endif../* On Win
1110: 64 6f 77 73 2c 20 77 65 20 6e 6f 72 6d 61 6c 6c  dows, we normall
1120: 79 20 72 75 6e 20 77 69 74 68 20 6f 75 74 70 75  y run with outpu
1130: 74 20 6d 6f 64 65 20 6f 66 20 54 45 58 54 20 73  t mode of TEXT s
1140: 6f 20 74 68 61 74 20 5c 6e 20 63 68 61 72 61 63  o that \n charac
1150: 74 65 72 73 0a 2a 2a 20 61 72 65 20 61 75 74 6f  ters.** are auto
1160: 6d 61 74 69 63 61 6c 6c 79 20 74 72 61 6e 73 6c  matically transl
1170: 61 74 65 64 20 69 6e 74 6f 20 5c 72 5c 6e 2e 20  ated into \r\n. 
1180: 20 48 6f 77 65 76 65 72 2c 20 74 68 69 73 20 62   However, this b
1190: 65 68 61 76 69 6f 72 20 6e 65 65 64 73 0a 2a 2a  ehavior needs.**
11a0: 20 74 6f 20 62 65 20 64 69 73 61 62 6c 65 64 20   to be disabled 
11b0: 69 6e 20 73 6f 6d 65 20 63 61 73 65 73 20 28 65  in some cases (e
11c0: 78 3a 20 77 68 65 6e 20 67 65 6e 65 72 61 74 69  x: when generati
11d0: 6e 67 20 43 53 56 20 6f 75 74 70 75 74 20 61 6e  ng CSV output an
11e0: 64 20 77 68 65 6e 0a 2a 2a 20 72 65 6e 64 65 72  d when.** render
11f0: 69 6e 67 20 71 75 6f 74 65 64 20 73 74 72 69 6e  ing quoted strin
1200: 67 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20  gs that contain 
1210: 5c 6e 20 63 68 61 72 61 63 74 65 72 73 29 2e 20  \n characters). 
1220: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 0a 2a   The following.*
1230: 2a 20 72 6f 75 74 69 6e 65 73 20 74 61 6b 65 20  * routines take 
1240: 63 61 72 65 20 6f 66 20 74 68 61 74 2e 0a 2a 2f  care of that..*/
1250: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49  .#if defined(_WI
1260: 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  N32) || defined(
1270: 57 49 4e 33 32 29 0a 73 74 61 74 69 63 20 76 6f  WIN32).static vo
1280: 69 64 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65  id setBinaryMode
1290: 28 46 49 4c 45 20 2a 66 69 6c 65 2c 20 69 6e 74  (FILE *file, int
12a0: 20 69 73 4f 75 74 70 75 74 29 7b 0a 20 20 69 66   isOutput){.  if
12b0: 28 20 69 73 4f 75 74 70 75 74 20 29 20 66 66 6c  ( isOutput ) ffl
12c0: 75 73 68 28 66 69 6c 65 29 3b 0a 20 20 5f 73 65  ush(file);.  _se
12d0: 74 6d 6f 64 65 28 5f 66 69 6c 65 6e 6f 28 66 69  tmode(_fileno(fi
12e0: 6c 65 29 2c 20 5f 4f 5f 42 49 4e 41 52 59 29 3b  le), _O_BINARY);
12f0: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73  .}.static void s
1300: 65 74 54 65 78 74 4d 6f 64 65 28 46 49 4c 45 20  etTextMode(FILE 
1310: 2a 66 69 6c 65 2c 20 69 6e 74 20 69 73 4f 75 74  *file, int isOut
1320: 70 75 74 29 7b 0a 20 20 69 66 28 20 69 73 4f 75  put){.  if( isOu
1330: 74 70 75 74 20 29 20 66 66 6c 75 73 68 28 66 69  tput ) fflush(fi
1340: 6c 65 29 3b 0a 20 20 5f 73 65 74 6d 6f 64 65 28  le);.  _setmode(
1350: 5f 66 69 6c 65 6e 6f 28 66 69 6c 65 29 2c 20 5f  _fileno(file), _
1360: 4f 5f 54 45 58 54 29 3b 0a 7d 0a 23 65 6c 73 65  O_TEXT);.}.#else
1370: 0a 23 20 64 65 66 69 6e 65 20 73 65 74 42 69 6e  .# define setBin
1380: 61 72 79 4d 6f 64 65 28 58 2c 59 29 0a 23 20 64  aryMode(X,Y).# d
1390: 65 66 69 6e 65 20 73 65 74 54 65 78 74 4d 6f 64  efine setTextMod
13a0: 65 28 58 2c 59 29 0a 23 65 6e 64 69 66 0a 0a 0a  e(X,Y).#endif...
13b0: 2f 2a 20 54 72 75 65 20 69 66 20 74 68 65 20 74  /* True if the t
13c0: 69 6d 65 72 20 69 73 20 65 6e 61 62 6c 65 64 20  imer is enabled 
13d0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 6e  */.static int en
13e0: 61 62 6c 65 54 69 6d 65 72 20 3d 20 30 3b 0a 0a  ableTimer = 0;..
13f0: 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63 75  /* Return the cu
1400: 72 72 65 6e 74 20 77 61 6c 6c 2d 63 6c 6f 63 6b  rrent wall-clock
1410: 20 74 69 6d 65 20 2a 2f 0a 73 74 61 74 69 63 20   time */.static 
1420: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 69  sqlite3_int64 ti
1430: 6d 65 4f 66 44 61 79 28 76 6f 69 64 29 7b 0a 20  meOfDay(void){. 
1440: 20 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f   static sqlite3_
1450: 76 66 73 20 2a 63 6c 6f 63 6b 56 66 73 20 3d 20  vfs *clockVfs = 
1460: 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74  0;.  sqlite3_int
1470: 36 34 20 74 3b 0a 20 20 69 66 28 20 63 6c 6f 63  64 t;.  if( cloc
1480: 6b 56 66 73 3d 3d 30 20 29 20 63 6c 6f 63 6b 56  kVfs==0 ) clockV
1490: 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66 73  fs = sqlite3_vfs
14a0: 5f 66 69 6e 64 28 30 29 3b 0a 20 20 69 66 28 20  _find(0);.  if( 
14b0: 63 6c 6f 63 6b 56 66 73 2d 3e 69 56 65 72 73 69  clockVfs->iVersi
14c0: 6f 6e 3e 3d 32 20 26 26 20 63 6c 6f 63 6b 56 66  on>=2 && clockVf
14d0: 73 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65 49  s->xCurrentTimeI
14e0: 6e 74 36 34 21 3d 30 20 29 7b 0a 20 20 20 20 63  nt64!=0 ){.    c
14f0: 6c 6f 63 6b 56 66 73 2d 3e 78 43 75 72 72 65 6e  lockVfs->xCurren
1500: 74 54 69 6d 65 49 6e 74 36 34 28 63 6c 6f 63 6b  tTimeInt64(clock
1510: 56 66 73 2c 20 26 74 29 3b 0a 20 20 7d 65 6c 73  Vfs, &t);.  }els
1520: 65 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72 3b  e{.    double r;
1530: 0a 20 20 20 20 63 6c 6f 63 6b 56 66 73 2d 3e 78  .    clockVfs->x
1540: 43 75 72 72 65 6e 74 54 69 6d 65 28 63 6c 6f 63  CurrentTime(cloc
1550: 6b 56 66 73 2c 20 26 72 29 3b 0a 20 20 20 20 74  kVfs, &r);.    t
1560: 20 3d 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36   = (sqlite3_int6
1570: 34 29 28 72 2a 38 36 34 30 30 30 30 30 2e 30 29  4)(r*86400000.0)
1580: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 74  ;.  }.  return t
1590: 3b 0a 7d 0a 0a 23 69 66 20 21 64 65 66 69 6e 65  ;.}..#if !define
15a0: 64 28 5f 57 49 4e 33 32 29 20 26 26 20 21 64 65  d(_WIN32) && !de
15b0: 66 69 6e 65 64 28 57 49 4e 33 32 29 20 26 26 20  fined(WIN32) && 
15c0: 21 64 65 66 69 6e 65 64 28 5f 5f 6d 69 6e 75 78  !defined(__minux
15d0: 29 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  ).#include <sys/
15e0: 74 69 6d 65 2e 68 3e 0a 23 69 6e 63 6c 75 64 65  time.h>.#include
15f0: 20 3c 73 79 73 2f 72 65 73 6f 75 72 63 65 2e 68   <sys/resource.h
1600: 3e 0a 0a 2f 2a 20 56 78 57 6f 72 6b 73 20 64 6f  >../* VxWorks do
1610: 65 73 20 6e 6f 74 20 73 75 70 70 6f 72 74 20 67  es not support g
1620: 65 74 72 75 73 61 67 65 28 29 20 61 73 20 66 61  etrusage() as fa
1630: 72 20 61 73 20 77 65 20 63 61 6e 20 64 65 74 65  r as we can dete
1640: 72 6d 69 6e 65 20 2a 2f 0a 23 69 66 20 64 65 66  rmine */.#if def
1650: 69 6e 65 64 28 5f 57 52 53 5f 4b 45 52 4e 45 4c  ined(_WRS_KERNEL
1660: 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 5f 5f 52  ) || defined(__R
1670: 54 50 5f 5f 29 0a 73 74 72 75 63 74 20 72 75 73  TP__).struct rus
1680: 61 67 65 20 7b 0a 20 20 73 74 72 75 63 74 20 74  age {.  struct t
1690: 69 6d 65 76 61 6c 20 72 75 5f 75 74 69 6d 65 3b  imeval ru_utime;
16a0: 20 2f 2a 20 75 73 65 72 20 43 50 55 20 74 69 6d   /* user CPU tim
16b0: 65 20 75 73 65 64 20 2a 2f 0a 20 20 73 74 72 75  e used */.  stru
16c0: 63 74 20 74 69 6d 65 76 61 6c 20 72 75 5f 73 74  ct timeval ru_st
16d0: 69 6d 65 3b 20 2f 2a 20 73 79 73 74 65 6d 20 43  ime; /* system C
16e0: 50 55 20 74 69 6d 65 20 75 73 65 64 20 2a 2f 0a  PU time used */.
16f0: 7d 3b 0a 23 64 65 66 69 6e 65 20 67 65 74 72 75  };.#define getru
1700: 73 61 67 65 28 41 2c 42 29 20 6d 65 6d 73 65 74  sage(A,B) memset
1710: 28 42 2c 30 2c 73 69 7a 65 6f 66 28 2a 42 29 29  (B,0,sizeof(*B))
1720: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 20 53 61 76 65  .#endif../* Save
1730: 64 20 72 65 73 6f 75 72 63 65 20 69 6e 66 6f 72  d resource infor
1740: 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 62  mation for the b
1750: 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 6e 20 6f  eginning of an o
1760: 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61 74  peration */.stat
1770: 69 63 20 73 74 72 75 63 74 20 72 75 73 61 67 65  ic struct rusage
1780: 20 73 42 65 67 69 6e 3b 20 20 2f 2a 20 43 50 55   sBegin;  /* CPU
1790: 20 74 69 6d 65 20 61 74 20 73 74 61 72 74 20 2a   time at start *
17a0: 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33  /.static sqlite3
17b0: 5f 69 6e 74 36 34 20 69 42 65 67 69 6e 3b 20 20  _int64 iBegin;  
17c0: 2f 2a 20 57 61 6c 6c 2d 63 6c 6f 63 6b 20 74 69  /* Wall-clock ti
17d0: 6d 65 20 61 74 20 73 74 61 72 74 20 2a 2f 0a 0a  me at start */..
17e0: 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 74 69 6d 69  /*.** Begin timi
17f0: 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e 0a  ng an operation.
1800: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 62  */.static void b
1810: 65 67 69 6e 54 69 6d 65 72 28 76 6f 69 64 29 7b  eginTimer(void){
1820: 0a 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d  .  if( enableTim
1830: 65 72 20 29 7b 0a 20 20 20 20 67 65 74 72 75 73  er ){.    getrus
1840: 61 67 65 28 52 55 53 41 47 45 5f 53 45 4c 46 2c  age(RUSAGE_SELF,
1850: 20 26 73 42 65 67 69 6e 29 3b 0a 20 20 20 20 69   &sBegin);.    i
1860: 42 65 67 69 6e 20 3d 20 74 69 6d 65 4f 66 44 61  Begin = timeOfDa
1870: 79 28 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 20 52  y();.  }.}../* R
1880: 65 74 75 72 6e 20 74 68 65 20 64 69 66 66 65 72  eturn the differ
1890: 65 6e 63 65 20 6f 66 20 74 77 6f 20 74 69 6d 65  ence of two time
18a0: 5f 73 74 72 75 63 74 73 20 69 6e 20 73 65 63 6f  _structs in seco
18b0: 6e 64 73 20 2a 2f 0a 73 74 61 74 69 63 20 64 6f  nds */.static do
18c0: 75 62 6c 65 20 74 69 6d 65 44 69 66 66 28 73 74  uble timeDiff(st
18d0: 72 75 63 74 20 74 69 6d 65 76 61 6c 20 2a 70 53  ruct timeval *pS
18e0: 74 61 72 74 2c 20 73 74 72 75 63 74 20 74 69 6d  tart, struct tim
18f0: 65 76 61 6c 20 2a 70 45 6e 64 29 7b 0a 20 20 72  eval *pEnd){.  r
1900: 65 74 75 72 6e 20 28 70 45 6e 64 2d 3e 74 76 5f  eturn (pEnd->tv_
1910: 75 73 65 63 20 2d 20 70 53 74 61 72 74 2d 3e 74  usec - pStart->t
1920: 76 5f 75 73 65 63 29 2a 30 2e 30 30 30 30 30 31  v_usec)*0.000001
1930: 20 2b 0a 20 20 20 20 20 20 20 20 20 28 64 6f 75   +.         (dou
1940: 62 6c 65 29 28 70 45 6e 64 2d 3e 74 76 5f 73 65  ble)(pEnd->tv_se
1950: 63 20 2d 20 70 53 74 61 72 74 2d 3e 74 76 5f 73  c - pStart->tv_s
1960: 65 63 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  ec);.}../*.** Pr
1970: 69 6e 74 20 74 68 65 20 74 69 6d 69 6e 67 20 72  int the timing r
1980: 65 73 75 6c 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  esults..*/.stati
1990: 63 20 76 6f 69 64 20 65 6e 64 54 69 6d 65 72 28  c void endTimer(
19a0: 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65 6e 61  void){.  if( ena
19b0: 62 6c 65 54 69 6d 65 72 20 29 7b 0a 20 20 20 20  bleTimer ){.    
19c0: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 45  sqlite3_int64 iE
19d0: 6e 64 20 3d 20 74 69 6d 65 4f 66 44 61 79 28 29  nd = timeOfDay()
19e0: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 72 75 73  ;.    struct rus
19f0: 61 67 65 20 73 45 6e 64 3b 0a 20 20 20 20 67 65  age sEnd;.    ge
1a00: 74 72 75 73 61 67 65 28 52 55 53 41 47 45 5f 53  trusage(RUSAGE_S
1a10: 45 4c 46 2c 20 26 73 45 6e 64 29 3b 0a 20 20 20  ELF, &sEnd);.   
1a20: 20 70 72 69 6e 74 66 28 22 52 75 6e 20 54 69 6d   printf("Run Tim
1a30: 65 3a 20 72 65 61 6c 20 25 2e 33 66 20 75 73 65  e: real %.3f use
1a40: 72 20 25 66 20 73 79 73 20 25 66 5c 6e 22 2c 0a  r %f sys %f\n",.
1a50: 20 20 20 20 20 20 20 28 69 45 6e 64 20 2d 20 69         (iEnd - i
1a60: 42 65 67 69 6e 29 2a 30 2e 30 30 31 2c 0a 20 20  Begin)*0.001,.  
1a70: 20 20 20 20 20 74 69 6d 65 44 69 66 66 28 26 73       timeDiff(&s
1a80: 42 65 67 69 6e 2e 72 75 5f 75 74 69 6d 65 2c 20  Begin.ru_utime, 
1a90: 26 73 45 6e 64 2e 72 75 5f 75 74 69 6d 65 29 2c  &sEnd.ru_utime),
1aa0: 0a 20 20 20 20 20 20 20 74 69 6d 65 44 69 66 66  .       timeDiff
1ab0: 28 26 73 42 65 67 69 6e 2e 72 75 5f 73 74 69 6d  (&sBegin.ru_stim
1ac0: 65 2c 20 26 73 45 6e 64 2e 72 75 5f 73 74 69 6d  e, &sEnd.ru_stim
1ad0: 65 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 64 65 66  e));.  }.}..#def
1ae0: 69 6e 65 20 42 45 47 49 4e 5f 54 49 4d 45 52 20  ine BEGIN_TIMER 
1af0: 62 65 67 69 6e 54 69 6d 65 72 28 29 0a 23 64 65  beginTimer().#de
1b00: 66 69 6e 65 20 45 4e 44 5f 54 49 4d 45 52 20 65  fine END_TIMER e
1b10: 6e 64 54 69 6d 65 72 28 29 0a 23 64 65 66 69 6e  ndTimer().#defin
1b20: 65 20 48 41 53 5f 54 49 4d 45 52 20 31 0a 0a 23  e HAS_TIMER 1..#
1b30: 65 6c 69 66 20 28 64 65 66 69 6e 65 64 28 5f 57  elif (defined(_W
1b40: 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  IN32) || defined
1b50: 28 57 49 4e 33 32 29 29 0a 0a 2f 2a 20 53 61 76  (WIN32))../* Sav
1b60: 65 64 20 72 65 73 6f 75 72 63 65 20 69 6e 66 6f  ed resource info
1b70: 72 6d 61 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  rmation for the 
1b80: 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 61 6e 20  beginning of an 
1b90: 6f 70 65 72 61 74 69 6f 6e 20 2a 2f 0a 73 74 61  operation */.sta
1ba0: 74 69 63 20 48 41 4e 44 4c 45 20 68 50 72 6f 63  tic HANDLE hProc
1bb0: 65 73 73 3b 0a 73 74 61 74 69 63 20 46 49 4c 45  ess;.static FILE
1bc0: 54 49 4d 45 20 66 74 4b 65 72 6e 65 6c 42 65 67  TIME ftKernelBeg
1bd0: 69 6e 3b 0a 73 74 61 74 69 63 20 46 49 4c 45 54  in;.static FILET
1be0: 49 4d 45 20 66 74 55 73 65 72 42 65 67 69 6e 3b  IME ftUserBegin;
1bf0: 0a 73 74 61 74 69 63 20 73 71 6c 69 74 65 33 5f  .static sqlite3_
1c00: 69 6e 74 36 34 20 66 74 57 61 6c 6c 42 65 67 69  int64 ftWallBegi
1c10: 6e 3b 0a 74 79 70 65 64 65 66 20 42 4f 4f 4c 20  n;.typedef BOOL 
1c20: 28 57 49 4e 41 50 49 20 2a 47 45 54 50 52 4f 43  (WINAPI *GETPROC
1c30: 54 49 4d 45 53 29 28 48 41 4e 44 4c 45 2c 20 4c  TIMES)(HANDLE, L
1c40: 50 46 49 4c 45 54 49 4d 45 2c 20 4c 50 46 49 4c  PFILETIME, LPFIL
1c50: 45 54 49 4d 45 2c 0a 20 20 20 20 20 20 20 20 20  ETIME,.         
1c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c70: 20 20 20 20 20 20 20 20 20 20 20 4c 50 46 49 4c             LPFIL
1c80: 45 54 49 4d 45 2c 20 4c 50 46 49 4c 45 54 49 4d  ETIME, LPFILETIM
1c90: 45 29 3b 0a 73 74 61 74 69 63 20 47 45 54 50 52  E);.static GETPR
1ca0: 4f 43 54 49 4d 45 53 20 67 65 74 50 72 6f 63 65  OCTIMES getProce
1cb0: 73 73 54 69 6d 65 73 41 64 64 72 20 3d 20 4e 55  ssTimesAddr = NU
1cc0: 4c 4c 3b 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b  LL;../*.** Check
1cd0: 20 74 6f 20 73 65 65 20 69 66 20 77 65 20 68 61   to see if we ha
1ce0: 76 65 20 74 69 6d 65 72 20 73 75 70 70 6f 72 74  ve timer support
1cf0: 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 6e  .  Return 1 if n
1d00: 65 63 65 73 73 61 72 79 0a 2a 2a 20 73 75 70 70  ecessary.** supp
1d10: 6f 72 74 20 66 6f 75 6e 64 20 28 6f 72 20 66 6f  ort found (or fo
1d20: 75 6e 64 20 70 72 65 76 69 6f 75 73 6c 79 29 2e  und previously).
1d30: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 68  .*/.static int h
1d40: 61 73 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a 20  asTimer(void){. 
1d50: 20 69 66 28 20 67 65 74 50 72 6f 63 65 73 73 54   if( getProcessT
1d60: 69 6d 65 73 41 64 64 72 20 29 7b 0a 20 20 20 20  imesAddr ){.    
1d70: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 20 65 6c  return 1;.  } el
1d80: 73 65 20 7b 0a 20 20 20 20 2f 2a 20 47 65 74 50  se {.    /* GetP
1d90: 72 6f 63 65 73 73 54 69 6d 65 73 28 29 20 69 73  rocessTimes() is
1da0: 6e 27 74 20 73 75 70 70 6f 72 74 65 64 20 69 6e  n't supported in
1db0: 20 57 49 4e 39 35 20 61 6e 64 20 73 6f 6d 65 20   WIN95 and some 
1dc0: 6f 74 68 65 72 20 57 69 6e 64 6f 77 73 0a 20 20  other Windows.  
1dd0: 20 20 2a 2a 20 76 65 72 73 69 6f 6e 73 2e 20 53    ** versions. S
1de0: 65 65 20 69 66 20 74 68 65 20 76 65 72 73 69 6f  ee if the versio
1df0: 6e 20 77 65 20 61 72 65 20 72 75 6e 6e 69 6e 67  n we are running
1e00: 20 6f 6e 20 68 61 73 20 69 74 2c 20 61 6e 64 20   on has it, and 
1e10: 69 66 20 69 74 0a 20 20 20 20 2a 2a 20 64 6f 65  if it.    ** doe
1e20: 73 2c 20 73 61 76 65 20 6f 66 66 20 61 20 70 6f  s, save off a po
1e30: 69 6e 74 65 72 20 74 6f 20 69 74 20 61 6e 64 20  inter to it and 
1e40: 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f 63  the current proc
1e50: 65 73 73 20 68 61 6e 64 6c 65 2e 0a 20 20 20 20  ess handle..    
1e60: 2a 2f 0a 20 20 20 20 68 50 72 6f 63 65 73 73 20  */.    hProcess 
1e70: 3d 20 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63  = GetCurrentProc
1e80: 65 73 73 28 29 3b 0a 20 20 20 20 69 66 28 20 68  ess();.    if( h
1e90: 50 72 6f 63 65 73 73 20 29 7b 0a 20 20 20 20 20  Process ){.     
1ea0: 20 48 49 4e 53 54 41 4e 43 45 20 68 69 6e 73 74   HINSTANCE hinst
1eb0: 4c 69 62 20 3d 20 4c 6f 61 64 4c 69 62 72 61 72  Lib = LoadLibrar
1ec0: 79 28 54 45 58 54 28 22 4b 65 72 6e 65 6c 33 32  y(TEXT("Kernel32
1ed0: 2e 64 6c 6c 22 29 29 3b 0a 20 20 20 20 20 20 69  .dll"));.      i
1ee0: 66 28 20 4e 55 4c 4c 20 21 3d 20 68 69 6e 73 74  f( NULL != hinst
1ef0: 4c 69 62 20 29 7b 0a 20 20 20 20 20 20 20 20 67  Lib ){.        g
1f00: 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64  etProcessTimesAd
1f10: 64 72 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  dr =.           
1f20: 20 28 47 45 54 50 52 4f 43 54 49 4d 45 53 29 20   (GETPROCTIMES) 
1f30: 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 28 68  GetProcAddress(h
1f40: 69 6e 73 74 4c 69 62 2c 20 22 47 65 74 50 72 6f  instLib, "GetPro
1f50: 63 65 73 73 54 69 6d 65 73 22 29 3b 0a 20 20 20  cessTimes");.   
1f60: 20 20 20 20 20 69 66 28 20 4e 55 4c 4c 20 21 3d       if( NULL !=
1f70: 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73   getProcessTimes
1f80: 41 64 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Addr ){.        
1f90: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1fa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 46 72      }.        Fr
1fb0: 65 65 4c 69 62 72 61 72 79 28 68 69 6e 73 74 4c  eeLibrary(hinstL
1fc0: 69 62 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ib);.      }.   
1fd0: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1fe0: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 42 65 67 69  0;.}../*.** Begi
1ff0: 6e 20 74 69 6d 69 6e 67 20 61 6e 20 6f 70 65 72  n timing an oper
2000: 61 74 69 6f 6e 0a 2a 2f 0a 73 74 61 74 69 63 20  ation.*/.static 
2010: 76 6f 69 64 20 62 65 67 69 6e 54 69 6d 65 72 28  void beginTimer(
2020: 76 6f 69 64 29 7b 0a 20 20 69 66 28 20 65 6e 61  void){.  if( ena
2030: 62 6c 65 54 69 6d 65 72 20 26 26 20 67 65 74 50  bleTimer && getP
2040: 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72 20  rocessTimesAddr 
2050: 29 7b 0a 20 20 20 20 46 49 4c 45 54 49 4d 45 20  ){.    FILETIME 
2060: 66 74 43 72 65 61 74 69 6f 6e 2c 20 66 74 45 78  ftCreation, ftEx
2070: 69 74 3b 0a 20 20 20 20 67 65 74 50 72 6f 63 65  it;.    getProce
2080: 73 73 54 69 6d 65 73 41 64 64 72 28 68 50 72 6f  ssTimesAddr(hPro
2090: 63 65 73 73 2c 26 66 74 43 72 65 61 74 69 6f 6e  cess,&ftCreation
20a0: 2c 26 66 74 45 78 69 74 2c 0a 20 20 20 20 20 20  ,&ftExit,.      
20b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20c0: 20 20 26 66 74 4b 65 72 6e 65 6c 42 65 67 69 6e    &ftKernelBegin
20d0: 2c 26 66 74 55 73 65 72 42 65 67 69 6e 29 3b 0a  ,&ftUserBegin);.
20e0: 20 20 20 20 66 74 57 61 6c 6c 42 65 67 69 6e 20      ftWallBegin 
20f0: 3d 20 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a 20  = timeOfDay();. 
2100: 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e 20   }.}../* Return 
2110: 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 20 6f  the difference o
2120: 66 20 74 77 6f 20 46 49 4c 45 54 49 4d 45 20 73  f two FILETIME s
2130: 74 72 75 63 74 73 20 69 6e 20 73 65 63 6f 6e 64  tructs in second
2140: 73 20 2a 2f 0a 73 74 61 74 69 63 20 64 6f 75 62  s */.static doub
2150: 6c 65 20 74 69 6d 65 44 69 66 66 28 46 49 4c 45  le timeDiff(FILE
2160: 54 49 4d 45 20 2a 70 53 74 61 72 74 2c 20 46 49  TIME *pStart, FI
2170: 4c 45 54 49 4d 45 20 2a 70 45 6e 64 29 7b 0a 20  LETIME *pEnd){. 
2180: 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69 36   sqlite_int64 i6
2190: 34 53 74 61 72 74 20 3d 20 2a 28 28 73 71 6c 69  4Start = *((sqli
21a0: 74 65 5f 69 6e 74 36 34 20 2a 29 20 70 53 74 61  te_int64 *) pSta
21b0: 72 74 29 3b 0a 20 20 73 71 6c 69 74 65 5f 69 6e  rt);.  sqlite_in
21c0: 74 36 34 20 69 36 34 45 6e 64 20 3d 20 2a 28 28  t64 i64End = *((
21d0: 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 2a 29 20  sqlite_int64 *) 
21e0: 70 45 6e 64 29 3b 0a 20 20 72 65 74 75 72 6e 20  pEnd);.  return 
21f0: 28 64 6f 75 62 6c 65 29 20 28 28 69 36 34 45 6e  (double) ((i64En
2200: 64 20 2d 20 69 36 34 53 74 61 72 74 29 20 2f 20  d - i64Start) / 
2210: 31 30 30 30 30 30 30 30 2e 30 29 3b 0a 7d 0a 0a  10000000.0);.}..
2220: 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20  /*.** Print the 
2230: 74 69 6d 69 6e 67 20 72 65 73 75 6c 74 73 2e 0a  timing results..
2240: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 65  */.static void e
2250: 6e 64 54 69 6d 65 72 28 76 6f 69 64 29 7b 0a 20  ndTimer(void){. 
2260: 20 69 66 28 20 65 6e 61 62 6c 65 54 69 6d 65 72   if( enableTimer
2270: 20 26 26 20 67 65 74 50 72 6f 63 65 73 73 54 69   && getProcessTi
2280: 6d 65 73 41 64 64 72 29 7b 0a 20 20 20 20 46 49  mesAddr){.    FI
2290: 4c 45 54 49 4d 45 20 66 74 43 72 65 61 74 69 6f  LETIME ftCreatio
22a0: 6e 2c 20 66 74 45 78 69 74 2c 20 66 74 4b 65 72  n, ftExit, ftKer
22b0: 6e 65 6c 45 6e 64 2c 20 66 74 55 73 65 72 45 6e  nelEnd, ftUserEn
22c0: 64 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 69  d;.    sqlite3_i
22d0: 6e 74 36 34 20 66 74 57 61 6c 6c 45 6e 64 20 3d  nt64 ftWallEnd =
22e0: 20 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a 20 20   timeOfDay();.  
22f0: 20 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65    getProcessTime
2300: 73 41 64 64 72 28 68 50 72 6f 63 65 73 73 2c 26  sAddr(hProcess,&
2310: 66 74 43 72 65 61 74 69 6f 6e 2c 26 66 74 45 78  ftCreation,&ftEx
2320: 69 74 2c 26 66 74 4b 65 72 6e 65 6c 45 6e 64 2c  it,&ftKernelEnd,
2330: 26 66 74 55 73 65 72 45 6e 64 29 3b 0a 20 20 20  &ftUserEnd);.   
2340: 20 70 72 69 6e 74 66 28 22 52 75 6e 20 54 69 6d   printf("Run Tim
2350: 65 3a 20 72 65 61 6c 20 25 2e 33 66 20 75 73 65  e: real %.3f use
2360: 72 20 25 66 20 73 79 73 20 25 66 5c 6e 22 2c 0a  r %f sys %f\n",.
2370: 20 20 20 20 20 20 20 28 66 74 57 61 6c 6c 45 6e         (ftWallEn
2380: 64 20 2d 20 66 74 57 61 6c 6c 42 65 67 69 6e 29  d - ftWallBegin)
2390: 2a 30 2e 30 30 31 2c 0a 20 20 20 20 20 20 20 74  *0.001,.       t
23a0: 69 6d 65 44 69 66 66 28 26 66 74 55 73 65 72 42  imeDiff(&ftUserB
23b0: 65 67 69 6e 2c 20 26 66 74 55 73 65 72 45 6e 64  egin, &ftUserEnd
23c0: 29 2c 0a 20 20 20 20 20 20 20 74 69 6d 65 44 69  ),.       timeDi
23d0: 66 66 28 26 66 74 4b 65 72 6e 65 6c 42 65 67 69  ff(&ftKernelBegi
23e0: 6e 2c 20 26 66 74 4b 65 72 6e 65 6c 45 6e 64 29  n, &ftKernelEnd)
23f0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e  );.  }.}..#defin
2400: 65 20 42 45 47 49 4e 5f 54 49 4d 45 52 20 62 65  e BEGIN_TIMER be
2410: 67 69 6e 54 69 6d 65 72 28 29 0a 23 64 65 66 69  ginTimer().#defi
2420: 6e 65 20 45 4e 44 5f 54 49 4d 45 52 20 65 6e 64  ne END_TIMER end
2430: 54 69 6d 65 72 28 29 0a 23 64 65 66 69 6e 65 20  Timer().#define 
2440: 48 41 53 5f 54 49 4d 45 52 20 68 61 73 54 69 6d  HAS_TIMER hasTim
2450: 65 72 28 29 0a 0a 23 65 6c 73 65 0a 23 64 65 66  er()..#else.#def
2460: 69 6e 65 20 42 45 47 49 4e 5f 54 49 4d 45 52 0a  ine BEGIN_TIMER.
2470: 23 64 65 66 69 6e 65 20 45 4e 44 5f 54 49 4d 45  #define END_TIME
2480: 52 0a 23 64 65 66 69 6e 65 20 48 41 53 5f 54 49  R.#define HAS_TI
2490: 4d 45 52 20 30 0a 23 65 6e 64 69 66 0a 0a 2f 2a  MER 0.#endif../*
24a0: 0a 2a 2a 20 55 73 65 64 20 74 6f 20 70 72 65 76  .** Used to prev
24b0: 65 6e 74 20 77 61 72 6e 69 6e 67 73 20 61 62 6f  ent warnings abo
24c0: 75 74 20 75 6e 75 73 65 64 20 70 61 72 61 6d 65  ut unused parame
24d0: 74 65 72 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20  ters.*/.#define 
24e0: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
24f0: 28 78 29 20 28 76 6f 69 64 29 28 78 29 0a 0a 2f  (x) (void)(x)../
2500: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 66 6f 6c 6c  *.** If the foll
2510: 6f 77 69 6e 67 20 66 6c 61 67 20 69 73 20 73 65  owing flag is se
2520: 74 2c 20 74 68 65 6e 20 63 6f 6d 6d 61 6e 64 20  t, then command 
2530: 65 78 65 63 75 74 69 6f 6e 20 73 74 6f 70 73 0a  execution stops.
2540: 2a 2a 20 61 74 20 61 6e 20 65 72 72 6f 72 20 69  ** at an error i
2550: 66 20 77 65 20 61 72 65 20 6e 6f 74 20 69 6e 74  f we are not int
2560: 65 72 61 63 74 69 76 65 2e 0a 2a 2f 0a 73 74 61  eractive..*/.sta
2570: 74 69 63 20 69 6e 74 20 62 61 69 6c 5f 6f 6e 5f  tic int bail_on_
2580: 65 72 72 6f 72 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a  error = 0;../*.*
2590: 2a 20 54 68 72 65 61 74 20 73 74 64 69 6e 20 61  * Threat stdin a
25a0: 73 20 61 6e 20 69 6e 74 65 72 61 63 74 69 76 65  s an interactive
25b0: 20 69 6e 70 75 74 20 69 66 20 74 68 65 20 66 6f   input if the fo
25c0: 6c 6c 6f 77 69 6e 67 20 76 61 72 69 61 62 6c 65  llowing variable
25d0: 0a 2a 2a 20 69 73 20 74 72 75 65 2e 20 20 4f 74  .** is true.  Ot
25e0: 68 65 72 77 69 73 65 2c 20 61 73 73 75 6d 65 20  herwise, assume 
25f0: 73 74 64 69 6e 20 69 73 20 63 6f 6e 6e 65 63 74  stdin is connect
2600: 65 64 20 74 6f 20 61 20 66 69 6c 65 20 6f 72 20  ed to a file or 
2610: 70 69 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  pipe..*/.static 
2620: 69 6e 74 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74  int stdin_is_int
2630: 65 72 61 63 74 69 76 65 20 3d 20 31 3b 0a 0a 2f  eractive = 1;../
2640: 2a 0a 2a 2a 20 4f 6e 20 57 69 6e 64 6f 77 73 20  *.** On Windows 
2650: 73 79 73 74 65 6d 73 20 77 65 20 68 61 76 65 20  systems we have 
2660: 74 6f 20 6b 6e 6f 77 20 69 66 20 73 74 61 6e 64  to know if stand
2670: 61 72 64 20 6f 75 74 70 75 74 20 69 73 20 61 20  ard output is a 
2680: 63 6f 6e 73 6f 6c 65 0a 2a 2a 20 69 6e 20 6f 72  console.** in or
2690: 64 65 72 20 74 6f 20 74 72 61 6e 73 6c 61 74 65  der to translate
26a0: 20 55 54 46 2d 38 20 69 6e 74 6f 20 4d 42 43 53   UTF-8 into MBCS
26b0: 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .  The following
26c0: 20 76 61 72 69 61 62 6c 65 20 69 73 0a 2a 2a 20   variable is.** 
26d0: 74 72 75 65 20 69 66 20 74 72 61 6e 73 6c 61 74  true if translat
26e0: 69 6f 6e 20 69 73 20 72 65 71 75 69 72 65 64 2e  ion is required.
26f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
2700: 74 64 6f 75 74 5f 69 73 5f 63 6f 6e 73 6f 6c 65  tdout_is_console
2710: 20 3d 20 31 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65   = 1;../*.** The
2720: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 68   following is th
2730: 65 20 6f 70 65 6e 20 53 51 4c 69 74 65 20 64 61  e open SQLite da
2740: 74 61 62 61 73 65 2e 20 20 57 65 20 6d 61 6b 65  tabase.  We make
2750: 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f   a pointer.** to
2760: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 20 61   this database a
2770: 20 73 74 61 74 69 63 20 76 61 72 69 61 62 6c 65   static variable
2780: 20 73 6f 20 74 68 61 74 20 69 74 20 63 61 6e 20   so that it can 
2790: 62 65 20 61 63 63 65 73 73 65 64 0a 2a 2a 20 62  be accessed.** b
27a0: 79 20 74 68 65 20 53 49 47 49 4e 54 20 68 61 6e  y the SIGINT han
27b0: 64 6c 65 72 20 74 6f 20 69 6e 74 65 72 72 75 70  dler to interrup
27c0: 74 20 64 61 74 61 62 61 73 65 20 70 72 6f 63 65  t database proce
27d0: 73 73 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63  ssing..*/.static
27e0: 20 73 71 6c 69 74 65 33 20 2a 67 6c 6f 62 61 6c   sqlite3 *global
27f0: 44 62 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54  Db = 0;../*.** T
2800: 72 75 65 20 69 66 20 61 6e 20 69 6e 74 65 72 72  rue if an interr
2810: 75 70 74 20 28 43 6f 6e 74 72 6f 6c 2d 43 29 20  upt (Control-C) 
2820: 68 61 73 20 62 65 65 6e 20 72 65 63 65 69 76 65  has been receive
2830: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 6c  d..*/.static vol
2840: 61 74 69 6c 65 20 69 6e 74 20 73 65 65 6e 49 6e  atile int seenIn
2850: 74 65 72 72 75 70 74 20 3d 20 30 3b 0a 0a 2f 2a  terrupt = 0;../*
2860: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
2870: 6e 61 6d 65 20 6f 66 20 6f 75 72 20 70 72 6f 67  name of our prog
2880: 72 61 6d 2e 20 49 74 20 69 73 20 73 65 74 20 69  ram. It is set i
2890: 6e 20 6d 61 69 6e 28 29 2c 20 75 73 65 64 0a 2a  n main(), used.*
28a0: 2a 20 69 6e 20 61 20 6e 75 6d 62 65 72 20 6f 66  * in a number of
28b0: 20 6f 74 68 65 72 20 70 6c 61 63 65 73 2c 20 6d   other places, m
28c0: 6f 73 74 6c 79 20 66 6f 72 20 65 72 72 6f 72 20  ostly for error 
28d0: 6d 65 73 73 61 67 65 73 2e 0a 2a 2f 0a 73 74 61  messages..*/.sta
28e0: 74 69 63 20 63 68 61 72 20 2a 41 72 67 76 30 3b  tic char *Argv0;
28f0: 0a 0a 2f 2a 0a 2a 2a 20 50 72 6f 6d 70 74 20 73  ../*.** Prompt s
2900: 74 72 69 6e 67 73 2e 20 49 6e 69 74 69 61 6c 69  trings. Initiali
2910: 7a 65 64 20 69 6e 20 6d 61 69 6e 2e 20 53 65 74  zed in main. Set
2920: 74 61 62 6c 65 20 77 69 74 68 0a 2a 2a 20 20 20  table with.**   
2930: 2e 70 72 6f 6d 70 74 20 6d 61 69 6e 20 63 6f 6e  .prompt main con
2940: 74 69 6e 75 65 0a 2a 2f 0a 73 74 61 74 69 63 20  tinue.*/.static 
2950: 63 68 61 72 20 6d 61 69 6e 50 72 6f 6d 70 74 5b  char mainPrompt[
2960: 32 30 5d 3b 20 20 20 20 20 2f 2a 20 46 69 72 73  20];     /* Firs
2970: 74 20 6c 69 6e 65 20 70 72 6f 6d 70 74 2e 20 64  t line prompt. d
2980: 65 66 61 75 6c 74 3a 20 22 73 71 6c 69 74 65 3e  efault: "sqlite>
2990: 20 22 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72   "*/.static char
29a0: 20 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 5b   continuePrompt[
29b0: 32 30 5d 3b 20 2f 2a 20 43 6f 6e 74 69 6e 75 61  20]; /* Continua
29c0: 74 69 6f 6e 20 70 72 6f 6d 70 74 2e 20 64 65 66  tion prompt. def
29d0: 61 75 6c 74 3a 20 22 20 20 20 2e 2e 2e 3e 20 22  ault: "   ...> "
29e0: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e 64 65   */../*.** Rende
29f0: 72 20 6f 75 74 70 75 74 20 6c 69 6b 65 20 66 70  r output like fp
2a00: 72 69 6e 74 66 28 29 2e 20 20 45 78 63 65 70 74  rintf().  Except
2a10: 2c 20 69 66 20 74 68 65 20 6f 75 74 70 75 74 20  , if the output 
2a20: 69 73 20 67 6f 69 6e 67 20 74 6f 20 74 68 65 0a  is going to the.
2a30: 2a 2a 20 63 6f 6e 73 6f 6c 65 20 61 6e 64 20 69  ** console and i
2a40: 66 20 74 68 69 73 20 69 73 20 72 75 6e 6e 69 6e  f this is runnin
2a50: 67 20 6f 6e 20 61 20 57 69 6e 64 6f 77 73 20 6d  g on a Windows m
2a60: 61 63 68 69 6e 65 2c 20 74 72 61 6e 73 6c 61 74  achine, translat
2a70: 65 20 74 68 65 0a 2a 2a 20 6f 75 74 70 75 74 20  e the.** output 
2a80: 66 72 6f 6d 20 55 54 46 2d 38 20 69 6e 74 6f 20  from UTF-8 into 
2a90: 4d 42 43 53 2e 0a 2a 2f 0a 23 69 66 20 64 65 66  MBCS..*/.#if def
2aa0: 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20  ined(_WIN32) || 
2ab0: 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 0a 76  defined(WIN32).v
2ac0: 6f 69 64 20 75 74 66 38 5f 70 72 69 6e 74 66 28  oid utf8_printf(
2ad0: 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74  FILE *out, const
2ae0: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
2af0: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
2b00: 61 70 3b 0a 20 20 76 61 5f 73 74 61 72 74 28 61  ap;.  va_start(a
2b10: 70 2c 20 7a 46 6f 72 6d 61 74 29 3b 0a 20 20 69  p, zFormat);.  i
2b20: 66 28 20 73 74 64 6f 75 74 5f 69 73 5f 63 6f 6e  f( stdout_is_con
2b30: 73 6f 6c 65 20 26 26 20 28 6f 75 74 3d 3d 73 74  sole && (out==st
2b40: 64 6f 75 74 20 7c 7c 20 6f 75 74 3d 3d 73 74 64  dout || out==std
2b50: 65 72 72 29 20 29 7b 0a 20 20 20 20 63 68 61 72  err) ){.    char
2b60: 20 2a 7a 31 20 3d 20 73 71 6c 69 74 65 33 5f 76   *z1 = sqlite3_v
2b70: 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61 74 2c  mprintf(zFormat,
2b80: 20 61 70 29 3b 0a 20 20 20 20 63 68 61 72 20 2a   ap);.    char *
2b90: 7a 32 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e  z2 = sqlite3_win
2ba0: 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62 63 73 5f  32_utf8_to_mbcs_
2bb0: 76 32 28 7a 31 2c 20 30 29 3b 0a 20 20 20 20 73  v2(z1, 0);.    s
2bc0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 31 29 3b  qlite3_free(z1);
2bd0: 0a 20 20 20 20 66 70 75 74 73 28 7a 32 2c 20 6f  .    fputs(z2, o
2be0: 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ut);.    sqlite3
2bf0: 5f 66 72 65 65 28 7a 32 29 3b 0a 20 20 7d 65 6c  _free(z2);.  }el
2c00: 73 65 7b 0a 20 20 20 20 76 66 70 72 69 6e 74 66  se{.    vfprintf
2c10: 28 6f 75 74 2c 20 7a 46 6f 72 6d 61 74 2c 20 61  (out, zFormat, a
2c20: 70 29 3b 0a 20 20 7d 0a 20 20 76 61 5f 65 6e 64  p);.  }.  va_end
2c30: 28 61 70 29 3b 0a 7d 0a 23 65 6c 69 66 20 21 64  (ap);.}.#elif !d
2c40: 65 66 69 6e 65 64 28 75 74 66 38 5f 70 72 69 6e  efined(utf8_prin
2c50: 74 66 29 0a 23 20 64 65 66 69 6e 65 20 75 74 66  tf).# define utf
2c60: 38 5f 70 72 69 6e 74 66 20 66 70 72 69 6e 74 66  8_printf fprintf
2c70: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 52  .#endif../*.** R
2c80: 65 6e 64 65 72 20 6f 75 74 70 75 74 20 6c 69 6b  ender output lik
2c90: 65 20 66 70 72 69 6e 74 66 28 29 2e 20 20 54 68  e fprintf().  Th
2ca0: 69 73 20 73 68 6f 75 6c 64 20 6e 6f 74 20 62 65  is should not be
2cb0: 20 75 73 65 64 20 6f 6e 20 61 6e 79 74 68 69 6e   used on anythin
2cc0: 67 20 74 68 61 74 0a 2a 2a 20 69 6e 63 6c 75 64  g that.** includ
2cd0: 65 73 20 73 74 72 69 6e 67 20 66 6f 72 6d 61 74  es string format
2ce0: 74 69 6e 67 20 28 65 2e 67 2e 20 22 25 73 22 29  ting (e.g. "%s")
2cf0: 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e 65  ..*/.#if !define
2d00: 64 28 72 61 77 5f 70 72 69 6e 74 66 29 0a 23 20  d(raw_printf).# 
2d10: 64 65 66 69 6e 65 20 72 61 77 5f 70 72 69 6e 74  define raw_print
2d20: 66 20 66 70 72 69 6e 74 66 0a 23 65 6e 64 69 66  f fprintf.#endif
2d30: 0a 0a 2f 2a 0a 2a 2a 20 57 72 69 74 65 20 49 2f  ../*.** Write I/
2d40: 4f 20 74 72 61 63 65 73 20 74 6f 20 74 68 65 20  O traces to the 
2d50: 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 65 61 6d  following stream
2d60: 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51 4c 49  ..*/.#ifdef SQLI
2d70: 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
2d80: 45 0a 73 74 61 74 69 63 20 46 49 4c 45 20 2a 69  E.static FILE *i
2d90: 6f 74 72 61 63 65 20 3d 20 30 3b 0a 23 65 6e 64  otrace = 0;.#end
2da0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  if../*.** This r
2db0: 6f 75 74 69 6e 65 20 77 6f 72 6b 73 20 6c 69 6b  outine works lik
2dc0: 65 20 70 72 69 6e 74 66 20 69 6e 20 74 68 61 74  e printf in that
2dd0: 20 69 74 73 20 66 69 72 73 74 20 61 72 67 75 6d   its first argum
2de0: 65 6e 74 20 69 73 20 61 0a 2a 2a 20 66 6f 72 6d  ent is a.** form
2df0: 61 74 20 73 74 72 69 6e 67 20 61 6e 64 20 73 75  at string and su
2e00: 62 73 65 71 75 65 6e 74 20 61 72 67 75 6d 65 6e  bsequent argumen
2e10: 74 73 20 61 72 65 20 76 61 6c 75 65 73 20 74 6f  ts are values to
2e20: 20 62 65 20 73 75 62 73 74 69 74 75 74 65 64 0a   be substituted.
2e30: 2a 2a 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 25  ** in place of %
2e40: 20 66 69 65 6c 64 73 2e 20 20 54 68 65 20 72 65   fields.  The re
2e50: 73 75 6c 74 20 6f 66 20 66 6f 72 6d 61 74 74 69  sult of formatti
2e60: 6e 67 20 74 68 69 73 20 73 74 72 69 6e 67 0a 2a  ng this string.*
2e70: 2a 20 69 73 20 77 72 69 74 74 65 6e 20 74 6f 20  * is written to 
2e80: 69 6f 74 72 61 63 65 2e 0a 2a 2f 0a 23 69 66 64  iotrace..*/.#ifd
2e90: 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ef SQLITE_ENABLE
2ea0: 5f 49 4f 54 52 41 43 45 0a 73 74 61 74 69 63 20  _IOTRACE.static 
2eb0: 76 6f 69 64 20 53 51 4c 49 54 45 5f 43 44 45 43  void SQLITE_CDEC
2ec0: 4c 20 69 6f 74 72 61 63 65 50 72 69 6e 74 66 28  L iotracePrintf(
2ed0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 6f 72  const char *zFor
2ee0: 6d 61 74 2c 20 2e 2e 2e 29 7b 0a 20 20 76 61 5f  mat, ...){.  va_
2ef0: 6c 69 73 74 20 61 70 3b 0a 20 20 63 68 61 72 20  list ap;.  char 
2f00: 2a 7a 3b 0a 20 20 69 66 28 20 69 6f 74 72 61 63  *z;.  if( iotrac
2f10: 65 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  e==0 ) return;. 
2f20: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
2f30: 6f 72 6d 61 74 29 3b 0a 20 20 7a 20 3d 20 73 71  ormat);.  z = sq
2f40: 6c 69 74 65 33 5f 76 6d 70 72 69 6e 74 66 28 7a  lite3_vmprintf(z
2f50: 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20 20 76  Format, ap);.  v
2f60: 61 5f 65 6e 64 28 61 70 29 3b 0a 20 20 75 74 66  a_end(ap);.  utf
2f70: 38 5f 70 72 69 6e 74 66 28 69 6f 74 72 61 63 65  8_printf(iotrace
2f80: 2c 20 22 25 73 22 2c 20 7a 29 3b 0a 20 20 73 71  , "%s", z);.  sq
2f90: 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 7d  lite3_free(z);.}
2fa0: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f  .#endif../*.** O
2fb0: 75 74 70 75 74 20 73 74 72 69 6e 67 20 7a 55 74  utput string zUt
2fc0: 66 20 74 6f 20 73 74 72 65 61 6d 20 70 4f 75 74  f to stream pOut
2fd0: 20 61 73 20 77 20 63 68 61 72 61 63 74 65 72 73   as w characters
2fe0: 2e 20 20 49 66 20 77 20 69 73 20 6e 65 67 61 74  .  If w is negat
2ff0: 69 76 65 2c 0a 2a 2a 20 74 68 65 6e 20 72 69 67  ive,.** then rig
3000: 68 74 2d 6a 75 73 74 69 66 79 20 74 68 65 20 74  ht-justify the t
3010: 65 78 74 2e 20 20 57 20 69 73 20 74 68 65 20 77  ext.  W is the w
3020: 69 64 74 68 20 69 6e 20 55 54 46 2d 38 20 63 68  idth in UTF-8 ch
3030: 61 72 61 63 74 65 72 73 2c 20 6e 6f 74 0a 2a 2a  aracters, not.**
3040: 20 69 6e 20 62 79 74 65 73 2e 20 20 54 68 69 73   in bytes.  This
3050: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72   is different fr
3060: 6f 6d 20 74 68 65 20 25 2a 2e 2a 73 20 73 70 65  om the %*.*s spe
3070: 63 69 66 69 63 61 74 69 6f 6e 20 69 6e 20 70 72  cification in pr
3080: 69 6e 74 66 0a 2a 2a 20 73 69 6e 63 65 20 77 69  intf.** since wi
3090: 74 68 20 25 2a 2e 2a 73 20 74 68 65 20 77 69 64  th %*.*s the wid
30a0: 74 68 20 69 73 20 6d 65 61 73 75 72 65 64 20 69  th is measured i
30b0: 6e 20 62 79 74 65 73 2c 20 6e 6f 74 20 63 68 61  n bytes, not cha
30c0: 72 61 63 74 65 72 73 2e 0a 2a 2f 0a 73 74 61 74  racters..*/.stat
30d0: 69 63 20 76 6f 69 64 20 75 74 66 38 5f 77 69 64  ic void utf8_wid
30e0: 74 68 5f 70 72 69 6e 74 28 46 49 4c 45 20 2a 70  th_print(FILE *p
30f0: 4f 75 74 2c 20 69 6e 74 20 77 2c 20 63 6f 6e 73  Out, int w, cons
3100: 74 20 63 68 61 72 20 2a 7a 55 74 66 29 7b 0a 20  t char *zUtf){. 
3110: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 3b   int i;.  int n;
3120: 0a 20 20 69 6e 74 20 61 77 20 3d 20 77 3c 30 20  .  int aw = w<0 
3130: 3f 20 2d 77 20 3a 20 77 3b 0a 20 20 63 68 61 72  ? -w : w;.  char
3140: 20 7a 42 75 66 5b 31 30 30 30 5d 3b 0a 20 20 69   zBuf[1000];.  i
3150: 66 28 20 61 77 3e 28 69 6e 74 29 73 69 7a 65 6f  f( aw>(int)sizeo
3160: 66 28 7a 42 75 66 29 2f 33 20 29 20 61 77 20 3d  f(zBuf)/3 ) aw =
3170: 20 28 69 6e 74 29 73 69 7a 65 6f 66 28 7a 42 75   (int)sizeof(zBu
3180: 66 29 2f 33 3b 0a 20 20 66 6f 72 28 69 3d 6e 3d  f)/3;.  for(i=n=
3190: 30 3b 20 7a 55 74 66 5b 69 5d 3b 20 69 2b 2b 29  0; zUtf[i]; i++)
31a0: 7b 0a 20 20 20 20 69 66 28 20 28 7a 55 74 66 5b  {.    if( (zUtf[
31b0: 69 5d 26 30 78 63 30 29 21 3d 30 78 38 30 20 29  i]&0xc0)!=0x80 )
31c0: 7b 0a 20 20 20 20 20 20 6e 2b 2b 3b 0a 20 20 20  {.      n++;.   
31d0: 20 20 20 69 66 28 20 6e 3d 3d 61 77 20 29 7b 0a     if( n==aw ){.
31e0: 20 20 20 20 20 20 20 20 64 6f 7b 20 69 2b 2b 3b          do{ i++;
31f0: 20 7d 77 68 69 6c 65 28 20 28 7a 55 74 66 5b 69   }while( (zUtf[i
3200: 5d 26 30 78 63 30 29 3d 3d 30 78 38 30 20 29 3b  ]&0xc0)==0x80 );
3210: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
3220: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
3230: 7d 0a 20 20 69 66 28 20 6e 3e 3d 61 77 20 29 7b  }.  if( n>=aw ){
3240: 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
3250: 28 70 4f 75 74 2c 20 22 25 2e 2a 73 22 2c 20 69  (pOut, "%.*s", i
3260: 2c 20 7a 55 74 66 29 3b 0a 20 20 7d 65 6c 73 65  , zUtf);.  }else
3270: 20 69 66 28 20 77 3c 30 20 29 7b 0a 20 20 20 20   if( w<0 ){.    
3280: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 4f 75 74  utf8_printf(pOut
3290: 2c 20 22 25 2a 73 25 73 22 2c 20 61 77 2d 6e 2c  , "%*s%s", aw-n,
32a0: 20 22 22 2c 20 7a 55 74 66 29 3b 0a 20 20 7d 65   "", zUtf);.  }e
32b0: 6c 73 65 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  lse{.    utf8_pr
32c0: 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 73 25 2a  intf(pOut, "%s%*
32d0: 73 22 2c 20 7a 55 74 66 2c 20 61 77 2d 6e 2c 20  s", zUtf, aw-n, 
32e0: 22 22 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a  "");.  }.}.../*.
32f0: 2a 2a 20 44 65 74 65 72 6d 69 6e 65 73 20 69 66  ** Determines if
3300: 20 61 20 73 74 72 69 6e 67 20 69 73 20 61 20 6e   a string is a n
3310: 75 6d 62 65 72 20 6f 66 20 6e 6f 74 2e 0a 2a 2f  umber of not..*/
3320: 0a 73 74 61 74 69 63 20 69 6e 74 20 69 73 4e 75  .static int isNu
3330: 6d 62 65 72 28 63 6f 6e 73 74 20 63 68 61 72 20  mber(const char 
3340: 2a 7a 2c 20 69 6e 74 20 2a 72 65 61 6c 6e 75 6d  *z, int *realnum
3350: 29 7b 0a 20 20 69 66 28 20 2a 7a 3d 3d 27 2d 27  ){.  if( *z=='-'
3360: 20 7c 7c 20 2a 7a 3d 3d 27 2b 27 20 29 20 7a 2b   || *z=='+' ) z+
3370: 2b 3b 0a 20 20 69 66 28 20 21 49 73 44 69 67 69  +;.  if( !IsDigi
3380: 74 28 2a 7a 29 20 29 7b 0a 20 20 20 20 72 65 74  t(*z) ){.    ret
3390: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 2b 2b  urn 0;.  }.  z++
33a0: 3b 0a 20 20 69 66 28 20 72 65 61 6c 6e 75 6d 20  ;.  if( realnum 
33b0: 29 20 2a 72 65 61 6c 6e 75 6d 20 3d 20 30 3b 0a  ) *realnum = 0;.
33c0: 20 20 77 68 69 6c 65 28 20 49 73 44 69 67 69 74    while( IsDigit
33d0: 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20  (*z) ){ z++; }. 
33e0: 20 69 66 28 20 2a 7a 3d 3d 27 2e 27 20 29 7b 0a   if( *z=='.' ){.
33f0: 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28      z++;.    if(
3400: 20 21 49 73 44 69 67 69 74 28 2a 7a 29 20 29 20   !IsDigit(*z) ) 
3410: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 77 68  return 0;.    wh
3420: 69 6c 65 28 20 49 73 44 69 67 69 74 28 2a 7a 29  ile( IsDigit(*z)
3430: 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69   ){ z++; }.    i
3440: 66 28 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65  f( realnum ) *re
3450: 61 6c 6e 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20  alnum = 1;.  }. 
3460: 20 69 66 28 20 2a 7a 3d 3d 27 65 27 20 7c 7c 20   if( *z=='e' || 
3470: 2a 7a 3d 3d 27 45 27 20 29 7b 0a 20 20 20 20 7a  *z=='E' ){.    z
3480: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 2a 7a 3d 3d  ++;.    if( *z==
3490: 27 2b 27 20 7c 7c 20 2a 7a 3d 3d 27 2d 27 20 29  '+' || *z=='-' )
34a0: 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 21 49   z++;.    if( !I
34b0: 73 44 69 67 69 74 28 2a 7a 29 20 29 20 72 65 74  sDigit(*z) ) ret
34c0: 75 72 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c 65  urn 0;.    while
34d0: 28 20 49 73 44 69 67 69 74 28 2a 7a 29 20 29 7b  ( IsDigit(*z) ){
34e0: 20 7a 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20   z++; }.    if( 
34f0: 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c 6e  realnum ) *realn
3500: 75 6d 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 72 65  um = 1;.  }.  re
3510: 74 75 72 6e 20 2a 7a 3d 3d 30 3b 0a 7d 0a 0a 2f  turn *z==0;.}../
3520: 2a 0a 2a 2a 20 43 6f 6d 70 75 74 65 20 61 20 73  *.** Compute a s
3530: 74 72 69 6e 67 20 6c 65 6e 67 74 68 20 74 68 61  tring length tha
3540: 74 20 69 73 20 6c 69 6d 69 74 65 64 20 74 6f 20  t is limited to 
3550: 77 68 61 74 20 63 61 6e 20 62 65 20 73 74 6f 72  what can be stor
3560: 65 64 20 69 6e 0a 2a 2a 20 6c 6f 77 65 72 20 33  ed in.** lower 3
3570: 30 20 62 69 74 73 20 6f 66 20 61 20 33 32 2d 62  0 bits of a 32-b
3580: 69 74 20 73 69 67 6e 65 64 20 69 6e 74 65 67 65  it signed intege
3590: 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  r..*/.static int
35a0: 20 73 74 72 6c 65 6e 33 30 28 63 6f 6e 73 74 20   strlen30(const 
35b0: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 63 6f 6e 73  char *z){.  cons
35c0: 74 20 63 68 61 72 20 2a 7a 32 20 3d 20 7a 3b 0a  t char *z2 = z;.
35d0: 20 20 77 68 69 6c 65 28 20 2a 7a 32 20 29 7b 20    while( *z2 ){ 
35e0: 7a 32 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e  z2++; }.  return
35f0: 20 30 78 33 66 66 66 66 66 66 66 20 26 20 28 69   0x3fffffff & (i
3600: 6e 74 29 28 7a 32 20 2d 20 7a 29 3b 0a 7d 0a 0a  nt)(z2 - z);.}..
3610: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
3620: 20 6c 65 6e 67 74 68 20 6f 66 20 61 20 73 74 72   length of a str
3630: 69 6e 67 20 69 6e 20 63 68 61 72 61 63 74 65 72  ing in character
3640: 73 2e 20 20 4d 75 6c 74 69 62 79 74 65 20 55 54  s.  Multibyte UT
3650: 46 38 20 63 68 61 72 61 63 74 65 72 73 0a 2a 2a  F8 characters.**
3660: 20 63 6f 75 6e 74 20 61 73 20 61 20 73 69 6e 67   count as a sing
3670: 6c 65 20 63 68 61 72 61 63 74 65 72 2e 0a 2a 2f  le character..*/
3680: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74 72 6c  .static int strl
3690: 65 6e 43 68 61 72 28 63 6f 6e 73 74 20 63 68 61  enChar(const cha
36a0: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 6e 20 3d  r *z){.  int n =
36b0: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20   0;.  while( *z 
36c0: 29 7b 0a 20 20 20 20 69 66 28 20 28 30 78 63 30  ){.    if( (0xc0
36d0: 26 2a 28 7a 2b 2b 29 29 21 3d 30 78 38 30 20 29  &*(z++))!=0x80 )
36e0: 20 6e 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75   n++;.  }.  retu
36f0: 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn n;.}../*.** T
3700: 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 61 64  his routine read
3710: 73 20 61 20 6c 69 6e 65 20 6f 66 20 74 65 78 74  s a line of text
3720: 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e 2c 20 73   from FILE in, s
3730: 74 6f 72 65 73 0a 2a 2a 20 74 68 65 20 74 65 78  tores.** the tex
3740: 74 20 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61  t in memory obta
3750: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
3760: 28 29 20 61 6e 64 20 72 65 74 75 72 6e 73 20 61  () and returns a
3770: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
3780: 68 65 20 74 65 78 74 2e 20 20 4e 55 4c 4c 20 69  he text.  NULL i
3790: 73 20 72 65 74 75 72 6e 65 64 20 61 74 20 65 6e  s returned at en
37a0: 64 20 6f 66 20 66 69 6c 65 2c 20 6f 72 20 69 66  d of file, or if
37b0: 20 6d 61 6c 6c 6f 63 28 29 0a 2a 2a 20 66 61 69   malloc().** fai
37c0: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 7a 4c 69  ls..**.** If zLi
37d0: 6e 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20 74  ne is not NULL t
37e0: 68 65 6e 20 69 74 20 69 73 20 61 20 6d 61 6c 6c  hen it is a mall
37f0: 6f 63 65 64 20 62 75 66 66 65 72 20 72 65 74 75  oced buffer retu
3800: 72 6e 65 64 20 66 72 6f 6d 0a 2a 2a 20 61 20 70  rned from.** a p
3810: 72 65 76 69 6f 75 73 20 63 61 6c 6c 20 74 6f 20  revious call to 
3820: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74 68 61  this routine tha
3830: 74 20 6d 61 79 20 62 65 20 72 65 75 73 65 64 2e  t may be reused.
3840: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
3850: 2a 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 63  *local_getline(c
3860: 68 61 72 20 2a 7a 4c 69 6e 65 2c 20 46 49 4c 45  har *zLine, FILE
3870: 20 2a 69 6e 29 7b 0a 20 20 69 6e 74 20 6e 4c 69   *in){.  int nLi
3880: 6e 65 20 3d 20 7a 4c 69 6e 65 3d 3d 30 20 3f 20  ne = zLine==0 ? 
3890: 30 20 3a 20 31 30 30 3b 0a 20 20 69 6e 74 20 6e  0 : 100;.  int n
38a0: 20 3d 20 30 3b 0a 0a 20 20 77 68 69 6c 65 28 20   = 0;..  while( 
38b0: 31 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 2b 31  1 ){.    if( n+1
38c0: 30 30 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20 20  00>nLine ){.    
38d0: 20 20 6e 4c 69 6e 65 20 3d 20 6e 4c 69 6e 65 2a    nLine = nLine*
38e0: 32 20 2b 20 31 30 30 3b 0a 20 20 20 20 20 20 7a  2 + 100;.      z
38f0: 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 7a  Line = realloc(z
3900: 4c 69 6e 65 2c 20 6e 4c 69 6e 65 29 3b 0a 20 20  Line, nLine);.  
3910: 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d 30      if( zLine==0
3920: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
3930: 20 7d 0a 20 20 20 20 69 66 28 20 66 67 65 74 73   }.    if( fgets
3940: 28 26 7a 4c 69 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e  (&zLine[n], nLin
3950: 65 20 2d 20 6e 2c 20 69 6e 29 3d 3d 30 20 29 7b  e - n, in)==0 ){
3960: 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  .      if( n==0 
3970: 29 7b 0a 20 20 20 20 20 20 20 20 66 72 65 65 28  ){.        free(
3980: 7a 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 20 20  zLine);.        
3990: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
39a0: 7d 0a 20 20 20 20 20 20 7a 4c 69 6e 65 5b 6e 5d  }.      zLine[n]
39b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 62 72 65 61   = 0;.      brea
39c0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69  k;.    }.    whi
39d0: 6c 65 28 20 7a 4c 69 6e 65 5b 6e 5d 20 29 20 6e  le( zLine[n] ) n
39e0: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 6e 3e 30 20  ++;.    if( n>0 
39f0: 26 26 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27  && zLine[n-1]=='
3a00: 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20 6e 2d 2d  \n' ){.      n--
3a10: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 30 20  ;.      if( n>0 
3a20: 26 26 20 7a 4c 69 6e 65 5b 6e 2d 31 5d 3d 3d 27  && zLine[n-1]=='
3a30: 5c 72 27 20 29 20 6e 2d 2d 3b 0a 20 20 20 20 20  \r' ) n--;.     
3a40: 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b 0a 20   zLine[n] = 0;. 
3a50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3a60: 7d 0a 20 20 7d 0a 23 69 66 20 64 65 66 69 6e 65  }.  }.#if define
3a70: 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66  d(_WIN32) || def
3a80: 69 6e 65 64 28 57 49 4e 33 32 29 0a 20 20 2f 2a  ined(WIN32).  /*
3a90: 20 46 6f 72 20 69 6e 74 65 72 61 63 74 69 76 65   For interactive
3aa0: 20 69 6e 70 75 74 20 6f 6e 20 57 69 6e 64 6f 77   input on Window
3ab0: 73 20 73 79 73 74 65 6d 73 2c 20 74 72 61 6e 73  s systems, trans
3ac0: 6c 61 74 65 20 74 68 65 0a 20 20 2a 2a 20 6d 75  late the.  ** mu
3ad0: 6c 74 69 2d 62 79 74 65 20 63 68 61 72 61 63 74  lti-byte charact
3ae0: 65 72 73 65 74 20 63 68 61 72 61 63 74 65 72 73  erset characters
3af0: 20 69 6e 74 6f 20 55 54 46 2d 38 2e 20 2a 2f 0a   into UTF-8. */.
3b00: 20 20 69 66 28 20 73 74 64 69 6e 5f 69 73 5f 69    if( stdin_is_i
3b10: 6e 74 65 72 61 63 74 69 76 65 20 26 26 20 69 6e  nteractive && in
3b20: 3d 3d 73 74 64 69 6e 20 29 7b 0a 20 20 20 20 63  ==stdin ){.    c
3b30: 68 61 72 20 2a 7a 54 72 61 6e 73 20 3d 20 73 71  har *zTrans = sq
3b40: 6c 69 74 65 33 5f 77 69 6e 33 32 5f 6d 62 63 73  lite3_win32_mbcs
3b50: 5f 74 6f 5f 75 74 66 38 5f 76 32 28 7a 4c 69 6e  _to_utf8_v2(zLin
3b60: 65 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 7a  e, 0);.    if( z
3b70: 54 72 61 6e 73 20 29 7b 0a 20 20 20 20 20 20 69  Trans ){.      i
3b80: 6e 74 20 6e 54 72 61 6e 73 20 3d 20 73 74 72 6c  nt nTrans = strl
3b90: 65 6e 33 30 28 7a 54 72 61 6e 73 29 2b 31 3b 0a  en30(zTrans)+1;.
3ba0: 20 20 20 20 20 20 69 66 28 20 6e 54 72 61 6e 73        if( nTrans
3bb0: 3e 6e 4c 69 6e 65 20 29 7b 0a 20 20 20 20 20 20  >nLine ){.      
3bc0: 20 20 7a 4c 69 6e 65 20 3d 20 72 65 61 6c 6c 6f    zLine = reallo
3bd0: 63 28 7a 4c 69 6e 65 2c 20 6e 54 72 61 6e 73 29  c(zLine, nTrans)
3be0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4c  ;.        if( zL
3bf0: 69 6e 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ine==0 ){.      
3c00: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
3c10: 28 7a 54 72 61 6e 73 29 3b 0a 20 20 20 20 20 20  (zTrans);.      
3c20: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
3c30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
3c40: 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 4c 69        memcpy(zLi
3c50: 6e 65 2c 20 7a 54 72 61 6e 73 2c 20 6e 54 72 61  ne, zTrans, nTra
3c60: 6e 73 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ns);.      sqlit
3c70: 65 33 5f 66 72 65 65 28 7a 54 72 61 6e 73 29 3b  e3_free(zTrans);
3c80: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
3c90: 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 5f 57 49  f /* defined(_WI
3ca0: 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  N32) || defined(
3cb0: 57 49 4e 33 32 29 20 2a 2f 0a 20 20 72 65 74 75  WIN32) */.  retu
3cc0: 72 6e 20 7a 4c 69 6e 65 3b 0a 7d 0a 0a 2f 2a 0a  rn zLine;.}../*.
3cd0: 2a 2a 20 52 65 74 72 69 65 76 65 20 61 20 73 69  ** Retrieve a si
3ce0: 6e 67 6c 65 20 6c 69 6e 65 20 6f 66 20 69 6e 70  ngle line of inp
3cf0: 75 74 20 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 49  ut text..**.** I
3d00: 66 20 69 6e 3d 3d 30 20 74 68 65 6e 20 72 65 61  f in==0 then rea
3d10: 64 20 66 72 6f 6d 20 73 74 61 6e 64 61 72 64 20  d from standard 
3d20: 69 6e 70 75 74 20 61 6e 64 20 70 72 6f 6d 70 74  input and prompt
3d30: 20 62 65 66 6f 72 65 20 65 61 63 68 20 6c 69 6e   before each lin
3d40: 65 2e 0a 2a 2a 20 49 66 20 69 73 43 6f 6e 74 69  e..** If isConti
3d50: 6e 75 61 74 69 6f 6e 20 69 73 20 74 72 75 65 2c  nuation is true,
3d60: 20 74 68 65 6e 20 61 20 63 6f 6e 74 69 6e 75 61   then a continua
3d70: 74 69 6f 6e 20 70 72 6f 6d 70 74 20 69 73 20 61  tion prompt is a
3d80: 70 70 72 6f 70 72 69 61 74 65 2e 0a 2a 2a 20 49  ppropriate..** I
3d90: 66 20 69 73 43 6f 6e 74 69 6e 75 61 74 69 6f 6e  f isContinuation
3da0: 20 69 73 20 7a 65 72 6f 2c 20 74 68 65 6e 20 74   is zero, then t
3db0: 68 65 20 6d 61 69 6e 20 70 72 6f 6d 70 74 20 73  he main prompt s
3dc0: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 2e 0a 2a  hould be used..*
3dd0: 2a 0a 2a 2a 20 49 66 20 7a 50 72 69 6f 72 20 69  *.** If zPrior i
3de0: 73 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20  s not NULL then 
3df0: 69 74 20 69 73 20 61 20 62 75 66 66 65 72 20 66  it is a buffer f
3e00: 72 6f 6d 20 61 20 70 72 69 6f 72 20 63 61 6c 6c  rom a prior call
3e10: 20 74 6f 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74   to this.** rout
3e20: 69 6e 65 20 74 68 61 74 20 63 61 6e 20 62 65 20  ine that can be 
3e30: 72 65 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  reused..**.** Th
3e40: 65 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72  e result is stor
3e50: 65 64 20 69 6e 20 73 70 61 63 65 20 6f 62 74 61  ed in space obta
3e60: 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63  ined from malloc
3e70: 28 29 20 61 6e 64 20 6d 75 73 74 20 65 69 74 68  () and must eith
3e80: 65 72 0a 2a 2a 20 62 65 20 66 72 65 65 64 20 62  er.** be freed b
3e90: 79 20 74 68 65 20 63 61 6c 6c 65 72 20 6f 72 20  y the caller or 
3ea0: 65 6c 73 65 20 70 61 73 73 65 64 20 62 61 63 6b  else passed back
3eb0: 20 69 6e 74 6f 20 74 68 69 73 20 72 6f 75 74 69   into this routi
3ec0: 6e 65 20 76 69 61 20 74 68 65 0a 2a 2a 20 7a 50  ne via the.** zP
3ed0: 72 69 6f 72 20 61 72 67 75 6d 65 6e 74 20 66 6f  rior argument fo
3ee0: 72 20 72 65 75 73 65 2e 0a 2a 2f 0a 73 74 61 74  r reuse..*/.stat
3ef0: 69 63 20 63 68 61 72 20 2a 6f 6e 65 5f 69 6e 70  ic char *one_inp
3f00: 75 74 5f 6c 69 6e 65 28 46 49 4c 45 20 2a 69 6e  ut_line(FILE *in
3f10: 2c 20 63 68 61 72 20 2a 7a 50 72 69 6f 72 2c 20  , char *zPrior, 
3f20: 69 6e 74 20 69 73 43 6f 6e 74 69 6e 75 61 74 69  int isContinuati
3f30: 6f 6e 29 7b 0a 20 20 63 68 61 72 20 2a 7a 50 72  on){.  char *zPr
3f40: 6f 6d 70 74 3b 0a 20 20 63 68 61 72 20 2a 7a 52  ompt;.  char *zR
3f50: 65 73 75 6c 74 3b 0a 20 20 69 66 28 20 69 6e 21  esult;.  if( in!
3f60: 3d 30 20 29 7b 0a 20 20 20 20 7a 52 65 73 75 6c  =0 ){.    zResul
3f70: 74 20 3d 20 6c 6f 63 61 6c 5f 67 65 74 6c 69 6e  t = local_getlin
3f80: 65 28 7a 50 72 69 6f 72 2c 20 69 6e 29 3b 0a 20  e(zPrior, in);. 
3f90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 50 72 6f   }else{.    zPro
3fa0: 6d 70 74 20 3d 20 69 73 43 6f 6e 74 69 6e 75 61  mpt = isContinua
3fb0: 74 69 6f 6e 20 3f 20 63 6f 6e 74 69 6e 75 65 50  tion ? continueP
3fc0: 72 6f 6d 70 74 20 3a 20 6d 61 69 6e 50 72 6f 6d  rompt : mainProm
3fd0: 70 74 3b 0a 23 69 66 20 53 48 45 4c 4c 5f 55 53  pt;.#if SHELL_US
3fe0: 45 5f 4c 4f 43 41 4c 5f 47 45 54 4c 49 4e 45 0a  E_LOCAL_GETLINE.
3ff0: 20 20 20 20 70 72 69 6e 74 66 28 22 25 73 22 2c      printf("%s",
4000: 20 7a 50 72 6f 6d 70 74 29 3b 0a 20 20 20 20 66   zPrompt);.    f
4010: 66 6c 75 73 68 28 73 74 64 6f 75 74 29 3b 0a 20  flush(stdout);. 
4020: 20 20 20 7a 52 65 73 75 6c 74 20 3d 20 6c 6f 63     zResult = loc
4030: 61 6c 5f 67 65 74 6c 69 6e 65 28 7a 50 72 69 6f  al_getline(zPrio
4040: 72 2c 20 73 74 64 69 6e 29 3b 0a 23 65 6c 73 65  r, stdin);.#else
4050: 0a 20 20 20 20 66 72 65 65 28 7a 50 72 69 6f 72  .    free(zPrior
4060: 29 3b 0a 20 20 20 20 7a 52 65 73 75 6c 74 20 3d  );.    zResult =
4070: 20 73 68 65 6c 6c 5f 72 65 61 64 6c 69 6e 65 28   shell_readline(
4080: 7a 50 72 6f 6d 70 74 29 3b 0a 20 20 20 20 69 66  zPrompt);.    if
4090: 28 20 7a 52 65 73 75 6c 74 20 26 26 20 2a 7a 52  ( zResult && *zR
40a0: 65 73 75 6c 74 20 29 20 73 68 65 6c 6c 5f 61 64  esult ) shell_ad
40b0: 64 5f 68 69 73 74 6f 72 79 28 7a 52 65 73 75 6c  d_history(zResul
40c0: 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20  t);.#endif.  }. 
40d0: 20 72 65 74 75 72 6e 20 7a 52 65 73 75 6c 74 3b   return zResult;
40e0: 0a 7d 0a 2f 2a 0a 2a 2a 20 41 20 76 61 72 69 61  .}./*.** A varia
40f0: 62 6c 65 20 6c 65 6e 67 74 68 20 73 74 72 69 6e  ble length strin
4100: 67 20 74 6f 20 77 68 69 63 68 20 6f 6e 65 20 63  g to which one c
4110: 61 6e 20 61 70 70 65 6e 64 20 74 65 78 74 2e 0a  an append text..
4120: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
4130: 74 20 53 68 65 6c 6c 54 65 78 74 20 53 68 65 6c  t ShellText Shel
4140: 6c 54 65 78 74 3b 0a 73 74 72 75 63 74 20 53 68  lText;.struct Sh
4150: 65 6c 6c 54 65 78 74 20 7b 0a 20 20 63 68 61 72  ellText {.  char
4160: 20 2a 7a 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20   *z;.  int n;.  
4170: 69 6e 74 20 6e 41 6c 6c 6f 63 3b 0a 7d 3b 0a 0a  int nAlloc;.};..
4180: 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a 65  /*.** Initialize
4190: 20 61 6e 64 20 64 65 73 74 72 6f 79 20 61 20 53   and destroy a S
41a0: 68 65 6c 6c 54 65 78 74 20 6f 62 6a 65 63 74 0a  hellText object.
41b0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
41c0: 6e 69 74 54 65 78 74 28 53 68 65 6c 6c 54 65 78  nitText(ShellTex
41d0: 74 20 2a 70 29 7b 0a 20 20 6d 65 6d 73 65 74 28  t *p){.  memset(
41e0: 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29  p, 0, sizeof(*p)
41f0: 29 3b 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64  );.}.static void
4200: 20 66 72 65 65 54 65 78 74 28 53 68 65 6c 6c 54   freeText(ShellT
4210: 65 78 74 20 2a 70 29 7b 0a 20 20 66 72 65 65 28  ext *p){.  free(
4220: 70 2d 3e 7a 29 3b 0a 20 20 69 6e 69 74 54 65 78  p->z);.  initTex
4230: 74 28 70 29 3b 0a 7d 0a 0a 2f 2a 20 7a 49 6e 20  t(p);.}../* zIn 
4240: 69 73 20 65 69 74 68 65 72 20 61 20 70 6f 69 6e  is either a poin
4250: 74 65 72 20 74 6f 20 61 20 4e 55 4c 4c 2d 74 65  ter to a NULL-te
4260: 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e 67 20  rminated string 
4270: 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
4280: 65 64 0a 2a 2a 20 66 72 6f 6d 20 6d 61 6c 6c 6f  ed.** from mallo
4290: 63 28 29 2c 20 6f 72 20 61 20 4e 55 4c 4c 20 70  c(), or a NULL p
42a0: 6f 69 6e 74 65 72 2e 20 54 68 65 20 73 74 72 69  ointer. The stri
42b0: 6e 67 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ng pointed to by
42c0: 20 7a 41 70 70 65 6e 64 20 69 73 0a 2a 2a 20 61   zAppend is.** a
42d0: 64 64 65 64 20 74 6f 20 7a 49 6e 2c 20 61 6e 64  dded to zIn, and
42e0: 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 74 75   the result retu
42f0: 72 6e 65 64 20 69 6e 20 6d 65 6d 6f 72 79 20 6f  rned in memory o
4300: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 6d 61 6c  btained from mal
4310: 6c 6f 63 28 29 2e 0a 2a 2a 20 7a 49 6e 2c 20 69  loc()..** zIn, i
4320: 66 20 69 74 20 77 61 73 20 6e 6f 74 20 4e 55 4c  f it was not NUL
4330: 4c 2c 20 69 73 20 66 72 65 65 64 2e 0a 2a 2a 0a  L, is freed..**.
4340: 2a 2a 20 49 66 20 74 68 65 20 74 68 69 72 64 20  ** If the third 
4350: 61 72 67 75 6d 65 6e 74 2c 20 71 75 6f 74 65 2c  argument, quote,
4360: 20 69 73 20 6e 6f 74 20 27 5c 30 27 2c 20 74 68   is not '\0', th
4370: 65 6e 20 69 74 20 69 73 20 75 73 65 64 20 61 73  en it is used as
4380: 20 61 0a 2a 2a 20 71 75 6f 74 65 20 63 68 61 72   a.** quote char
4390: 61 63 74 65 72 20 66 6f 72 20 7a 41 70 70 65 6e  acter for zAppen
43a0: 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  d..*/.static voi
43b0: 64 20 61 70 70 65 6e 64 54 65 78 74 28 53 68 65  d appendText(She
43c0: 6c 6c 54 65 78 74 20 2a 70 2c 20 63 68 61 72 20  llText *p, char 
43d0: 63 6f 6e 73 74 20 2a 7a 41 70 70 65 6e 64 2c 20  const *zAppend, 
43e0: 63 68 61 72 20 71 75 6f 74 65 29 7b 0a 20 20 69  char quote){.  i
43f0: 6e 74 20 6c 65 6e 3b 0a 20 20 69 6e 74 20 69 3b  nt len;.  int i;
4400: 0a 20 20 69 6e 74 20 6e 41 70 70 65 6e 64 20 3d  .  int nAppend =
4410: 20 73 74 72 6c 65 6e 33 30 28 7a 41 70 70 65 6e   strlen30(zAppen
4420: 64 29 3b 0a 0a 20 20 6c 65 6e 20 3d 20 6e 41 70  d);..  len = nAp
4430: 70 65 6e 64 2b 70 2d 3e 6e 2b 31 3b 0a 20 20 69  pend+p->n+1;.  i
4440: 66 28 20 71 75 6f 74 65 20 29 7b 0a 20 20 20 20  f( quote ){.    
4450: 6c 65 6e 20 2b 3d 20 32 3b 0a 20 20 20 20 66 6f  len += 2;.    fo
4460: 72 28 69 3d 30 3b 20 69 3c 6e 41 70 70 65 6e 64  r(i=0; i<nAppend
4470: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
4480: 28 20 7a 41 70 70 65 6e 64 5b 69 5d 3d 3d 71 75  ( zAppend[i]==qu
4490: 6f 74 65 20 29 20 6c 65 6e 2b 2b 3b 0a 20 20 20  ote ) len++;.   
44a0: 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 2d   }.  }..  if( p-
44b0: 3e 6e 2b 6c 65 6e 3e 3d 70 2d 3e 6e 41 6c 6c 6f  >n+len>=p->nAllo
44c0: 63 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c  c ){.    p->nAll
44d0: 6f 63 20 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 2a 32  oc = p->nAlloc*2
44e0: 20 2b 20 6c 65 6e 20 2b 20 32 30 3b 0a 20 20 20   + len + 20;.   
44f0: 20 70 2d 3e 7a 20 3d 20 72 65 61 6c 6c 6f 63 28   p->z = realloc(
4500: 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c 6f 63 29  p->z, p->nAlloc)
4510: 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a 3d 3d  ;.    if( p->z==
4520: 30 20 29 7b 0a 20 20 20 20 20 20 6d 65 6d 73 65  0 ){.      memse
4530: 74 28 70 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  t(p, 0, sizeof(*
4540: 70 29 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  p));.      retur
4550: 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  n;.    }.  }..  
4560: 69 66 28 20 71 75 6f 74 65 20 29 7b 0a 20 20 20  if( quote ){.   
4570: 20 63 68 61 72 20 2a 7a 43 73 72 20 3d 20 70 2d   char *zCsr = p-
4580: 3e 7a 2b 70 2d 3e 6e 3b 0a 20 20 20 20 2a 7a 43  >z+p->n;.    *zC
4590: 73 72 2b 2b 20 3d 20 71 75 6f 74 65 3b 0a 20 20  sr++ = quote;.  
45a0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 70    for(i=0; i<nAp
45b0: 70 65 6e 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  pend; i++){.    
45c0: 20 20 2a 7a 43 73 72 2b 2b 20 3d 20 7a 41 70 70    *zCsr++ = zApp
45d0: 65 6e 64 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  end[i];.      if
45e0: 28 20 7a 41 70 70 65 6e 64 5b 69 5d 3d 3d 71 75  ( zAppend[i]==qu
45f0: 6f 74 65 20 29 20 2a 7a 43 73 72 2b 2b 20 3d 20  ote ) *zCsr++ = 
4600: 71 75 6f 74 65 3b 0a 20 20 20 20 7d 0a 20 20 20  quote;.    }.   
4610: 20 2a 7a 43 73 72 2b 2b 20 3d 20 71 75 6f 74 65   *zCsr++ = quote
4620: 3b 0a 20 20 20 20 70 2d 3e 6e 20 3d 20 28 69 6e  ;.    p->n = (in
4630: 74 29 28 7a 43 73 72 20 2d 20 70 2d 3e 7a 29 3b  t)(zCsr - p->z);
4640: 0a 20 20 20 20 2a 7a 43 73 72 20 3d 20 27 5c 30  .    *zCsr = '\0
4650: 27 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  ';.  }else{.    
4660: 6d 65 6d 63 70 79 28 70 2d 3e 7a 2b 70 2d 3e 6e  memcpy(p->z+p->n
4670: 2c 20 7a 41 70 70 65 6e 64 2c 20 6e 41 70 70 65  , zAppend, nAppe
4680: 6e 64 29 3b 0a 20 20 20 20 70 2d 3e 6e 20 2b 3d  nd);.    p->n +=
4690: 20 6e 41 70 70 65 6e 64 3b 0a 20 20 20 20 70 2d   nAppend;.    p-
46a0: 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 27 5c 30 27 3b  >z[p->n] = '\0';
46b0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74  .  }.}../*.** At
46c0: 74 65 6d 70 74 20 74 6f 20 64 65 74 65 72 6d 69  tempt to determi
46d0: 6e 65 20 69 66 20 69 64 65 6e 74 69 66 69 65 72  ne if identifier
46e0: 20 7a 4e 61 6d 65 20 6e 65 65 64 73 20 74 6f 20   zName needs to 
46f0: 62 65 20 71 75 6f 74 65 64 2c 20 65 69 74 68 65  be quoted, eithe
4700: 72 0a 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20  r.** because it 
4710: 63 6f 6e 74 61 69 6e 73 20 6e 6f 6e 2d 61 6c 70  contains non-alp
4720: 68 61 6e 75 6d 65 72 69 63 20 63 68 61 72 61 63  hanumeric charac
4730: 74 65 72 73 2c 20 6f 72 20 62 65 63 61 75 73 65  ters, or because
4740: 20 69 74 20 69 73 20 61 6e 0a 2a 2a 20 53 51 4c   it is an.** SQL
4750: 69 74 65 20 6b 65 79 77 6f 72 64 2e 20 20 42 65  ite keyword.  Be
4760: 20 63 6f 6e 73 65 72 76 61 74 69 76 65 20 69 6e   conservative in
4770: 20 74 68 69 73 20 65 73 74 69 6d 61 74 65 3a 20   this estimate: 
4780: 20 57 68 65 6e 20 69 6e 20 64 6f 75 62 74 20 61   When in doubt a
4790: 73 73 75 6d 65 0a 2a 2a 20 74 68 61 74 20 71 75  ssume.** that qu
47a0: 6f 74 69 6e 67 20 69 73 20 72 65 71 75 69 72 65  oting is require
47b0: 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  d..**.** Return 
47c0: 27 22 27 20 69 66 20 71 75 6f 74 69 6e 67 20 69  '"' if quoting i
47d0: 73 20 72 65 71 75 69 72 65 64 2e 20 20 52 65 74  s required.  Ret
47e0: 75 72 6e 20 30 20 69 66 20 6e 6f 20 71 75 6f 74  urn 0 if no quot
47f0: 69 6e 67 20 69 73 20 72 65 71 75 69 72 65 64 2e  ing is required.
4800: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
4810: 71 75 6f 74 65 43 68 61 72 28 63 6f 6e 73 74 20  quoteChar(const 
4820: 63 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20  char *zName){.  
4830: 2f 2a 20 41 6c 6c 20 53 51 4c 69 74 65 20 6b 65  /* All SQLite ke
4840: 79 77 6f 72 64 73 2c 20 69 6e 20 61 6c 70 68 61  ywords, in alpha
4850: 62 65 74 69 63 61 6c 20 6f 72 64 65 72 20 2a 2f  betical order */
4860: 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20  .  static const 
4870: 63 68 61 72 20 2a 61 7a 4b 65 79 77 6f 72 64 73  char *azKeywords
4880: 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 41 42 4f 52  [] = {.    "ABOR
4890: 54 22 2c 20 22 41 43 54 49 4f 4e 22 2c 20 22 41  T", "ACTION", "A
48a0: 44 44 22 2c 20 22 41 46 54 45 52 22 2c 20 22 41  DD", "AFTER", "A
48b0: 4c 4c 22 2c 20 22 41 4c 54 45 52 22 2c 20 22 41  LL", "ALTER", "A
48c0: 4e 41 4c 59 5a 45 22 2c 20 22 41 4e 44 22 2c 20  NALYZE", "AND", 
48d0: 22 41 53 22 2c 0a 20 20 20 20 22 41 53 43 22 2c  "AS",.    "ASC",
48e0: 20 22 41 54 54 41 43 48 22 2c 20 22 41 55 54 4f   "ATTACH", "AUTO
48f0: 49 4e 43 52 45 4d 45 4e 54 22 2c 20 22 42 45 46  INCREMENT", "BEF
4900: 4f 52 45 22 2c 20 22 42 45 47 49 4e 22 2c 20 22  ORE", "BEGIN", "
4910: 42 45 54 57 45 45 4e 22 2c 20 22 42 59 22 2c 0a  BETWEEN", "BY",.
4920: 20 20 20 20 22 43 41 53 43 41 44 45 22 2c 20 22      "CASCADE", "
4930: 43 41 53 45 22 2c 20 22 43 41 53 54 22 2c 20 22  CASE", "CAST", "
4940: 43 48 45 43 4b 22 2c 20 22 43 4f 4c 4c 41 54 45  CHECK", "COLLATE
4950: 22 2c 20 22 43 4f 4c 55 4d 4e 22 2c 20 22 43 4f  ", "COLUMN", "CO
4960: 4d 4d 49 54 22 2c 0a 20 20 20 20 22 43 4f 4e 46  MMIT",.    "CONF
4970: 4c 49 43 54 22 2c 20 22 43 4f 4e 53 54 52 41 49  LICT", "CONSTRAI
4980: 4e 54 22 2c 20 22 43 52 45 41 54 45 22 2c 20 22  NT", "CREATE", "
4990: 43 52 4f 53 53 22 2c 20 22 43 55 52 52 45 4e 54  CROSS", "CURRENT
49a0: 5f 44 41 54 45 22 2c 0a 20 20 20 20 22 43 55 52  _DATE",.    "CUR
49b0: 52 45 4e 54 5f 54 49 4d 45 22 2c 20 22 43 55 52  RENT_TIME", "CUR
49c0: 52 45 4e 54 5f 54 49 4d 45 53 54 41 4d 50 22 2c  RENT_TIMESTAMP",
49d0: 20 22 44 41 54 41 42 41 53 45 22 2c 20 22 44 45   "DATABASE", "DE
49e0: 46 41 55 4c 54 22 2c 20 22 44 45 46 45 52 52 41  FAULT", "DEFERRA
49f0: 42 4c 45 22 2c 0a 20 20 20 20 22 44 45 46 45 52  BLE",.    "DEFER
4a00: 52 45 44 22 2c 20 22 44 45 4c 45 54 45 22 2c 20  RED", "DELETE", 
4a10: 22 44 45 53 43 22 2c 20 22 44 45 54 41 43 48 22  "DESC", "DETACH"
4a20: 2c 20 22 44 49 53 54 49 4e 43 54 22 2c 20 22 44  , "DISTINCT", "D
4a30: 52 4f 50 22 2c 20 22 45 41 43 48 22 2c 0a 20 20  ROP", "EACH",.  
4a40: 20 20 22 45 4c 53 45 22 2c 20 22 45 4e 44 22 2c    "ELSE", "END",
4a50: 20 22 45 53 43 41 50 45 22 2c 20 22 45 58 43 45   "ESCAPE", "EXCE
4a60: 50 54 22 2c 20 22 45 58 43 4c 55 53 49 56 45 22  PT", "EXCLUSIVE"
4a70: 2c 20 22 45 58 49 53 54 53 22 2c 20 22 45 58 50  , "EXISTS", "EXP
4a80: 4c 41 49 4e 22 2c 0a 20 20 20 20 22 46 41 49 4c  LAIN",.    "FAIL
4a90: 22 2c 20 22 46 4f 52 22 2c 20 22 46 4f 52 45 49  ", "FOR", "FOREI
4aa0: 47 4e 22 2c 20 22 46 52 4f 4d 22 2c 20 22 46 55  GN", "FROM", "FU
4ab0: 4c 4c 22 2c 20 22 47 4c 4f 42 22 2c 20 22 47 52  LL", "GLOB", "GR
4ac0: 4f 55 50 22 2c 20 22 48 41 56 49 4e 47 22 2c 20  OUP", "HAVING", 
4ad0: 22 49 46 22 2c 0a 20 20 20 20 22 49 47 4e 4f 52  "IF",.    "IGNOR
4ae0: 45 22 2c 20 22 49 4d 4d 45 44 49 41 54 45 22 2c  E", "IMMEDIATE",
4af0: 20 22 49 4e 22 2c 20 22 49 4e 44 45 58 22 2c 20   "IN", "INDEX", 
4b00: 22 49 4e 44 45 58 45 44 22 2c 20 22 49 4e 49 54  "INDEXED", "INIT
4b10: 49 41 4c 4c 59 22 2c 20 22 49 4e 4e 45 52 22 2c  IALLY", "INNER",
4b20: 0a 20 20 20 20 22 49 4e 53 45 52 54 22 2c 20 22  .    "INSERT", "
4b30: 49 4e 53 54 45 41 44 22 2c 20 22 49 4e 54 45 52  INSTEAD", "INTER
4b40: 53 45 43 54 22 2c 20 22 49 4e 54 4f 22 2c 20 22  SECT", "INTO", "
4b50: 49 53 22 2c 20 22 49 53 4e 55 4c 4c 22 2c 20 22  IS", "ISNULL", "
4b60: 4a 4f 49 4e 22 2c 20 22 4b 45 59 22 2c 0a 20 20  JOIN", "KEY",.  
4b70: 20 20 22 4c 45 46 54 22 2c 20 22 4c 49 4b 45 22    "LEFT", "LIKE"
4b80: 2c 20 22 4c 49 4d 49 54 22 2c 20 22 4d 41 54 43  , "LIMIT", "MATC
4b90: 48 22 2c 20 22 4e 41 54 55 52 41 4c 22 2c 20 22  H", "NATURAL", "
4ba0: 4e 4f 22 2c 20 22 4e 4f 54 22 2c 20 22 4e 4f 54  NO", "NOT", "NOT
4bb0: 4e 55 4c 4c 22 2c 0a 20 20 20 20 22 4e 55 4c 4c  NULL",.    "NULL
4bc0: 22 2c 20 22 4f 46 22 2c 20 22 4f 46 46 53 45 54  ", "OF", "OFFSET
4bd0: 22 2c 20 22 4f 4e 22 2c 20 22 4f 52 22 2c 20 22  ", "ON", "OR", "
4be0: 4f 52 44 45 52 22 2c 20 22 4f 55 54 45 52 22 2c  ORDER", "OUTER",
4bf0: 20 22 50 4c 41 4e 22 2c 20 22 50 52 41 47 4d 41   "PLAN", "PRAGMA
4c00: 22 2c 0a 20 20 20 20 22 50 52 49 4d 41 52 59 22  ",.    "PRIMARY"
4c10: 2c 20 22 51 55 45 52 59 22 2c 20 22 52 41 49 53  , "QUERY", "RAIS
4c20: 45 22 2c 20 22 52 45 43 55 52 53 49 56 45 22 2c  E", "RECURSIVE",
4c30: 20 22 52 45 46 45 52 45 4e 43 45 53 22 2c 20 22   "REFERENCES", "
4c40: 52 45 47 45 58 50 22 2c 0a 20 20 20 20 22 52 45  REGEXP",.    "RE
4c50: 49 4e 44 45 58 22 2c 20 22 52 45 4c 45 41 53 45  INDEX", "RELEASE
4c60: 22 2c 20 22 52 45 4e 41 4d 45 22 2c 20 22 52 45  ", "RENAME", "RE
4c70: 50 4c 41 43 45 22 2c 20 22 52 45 53 54 52 49 43  PLACE", "RESTRIC
4c80: 54 22 2c 20 22 52 49 47 48 54 22 2c 0a 20 20 20  T", "RIGHT",.   
4c90: 20 22 52 4f 4c 4c 42 41 43 4b 22 2c 20 22 52 4f   "ROLLBACK", "RO
4ca0: 57 22 2c 20 22 53 41 56 45 50 4f 49 4e 54 22 2c  W", "SAVEPOINT",
4cb0: 20 22 53 45 4c 45 43 54 22 2c 20 22 53 45 54 22   "SELECT", "SET"
4cc0: 2c 20 22 54 41 42 4c 45 22 2c 20 22 54 45 4d 50  , "TABLE", "TEMP
4cd0: 22 2c 0a 20 20 20 20 22 54 45 4d 50 4f 52 41 52  ",.    "TEMPORAR
4ce0: 59 22 2c 20 22 54 48 45 4e 22 2c 20 22 54 4f 22  Y", "THEN", "TO"
4cf0: 2c 20 22 54 52 41 4e 53 41 43 54 49 4f 4e 22 2c  , "TRANSACTION",
4d00: 20 22 54 52 49 47 47 45 52 22 2c 20 22 55 4e 49   "TRIGGER", "UNI
4d10: 4f 4e 22 2c 20 22 55 4e 49 51 55 45 22 2c 0a 20  ON", "UNIQUE",. 
4d20: 20 20 20 22 55 50 44 41 54 45 22 2c 20 22 55 53     "UPDATE", "US
4d30: 49 4e 47 22 2c 20 22 56 41 43 55 55 4d 22 2c 20  ING", "VACUUM", 
4d40: 22 56 41 4c 55 45 53 22 2c 20 22 56 49 45 57 22  "VALUES", "VIEW"
4d50: 2c 20 22 56 49 52 54 55 41 4c 22 2c 20 22 57 48  , "VIRTUAL", "WH
4d60: 45 4e 22 2c 20 22 57 48 45 52 45 22 2c 0a 20 20  EN", "WHERE",.  
4d70: 20 20 22 57 49 54 48 22 2c 20 22 57 49 54 48 4f    "WITH", "WITHO
4d80: 55 54 22 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20  UT",.  };.  int 
4d90: 69 2c 20 6c 77 72 2c 20 75 70 72 2c 20 6d 69 64  i, lwr, upr, mid
4da0: 2c 20 63 3b 0a 20 20 69 66 28 20 21 69 73 61 6c  , c;.  if( !isal
4db0: 70 68 61 28 28 75 6e 73 69 67 6e 65 64 20 63 68  pha((unsigned ch
4dc0: 61 72 29 7a 4e 61 6d 65 5b 30 5d 29 20 26 26 20  ar)zName[0]) && 
4dd0: 7a 4e 61 6d 65 5b 30 5d 21 3d 27 5f 27 20 29 20  zName[0]!='_' ) 
4de0: 72 65 74 75 72 6e 20 27 22 27 3b 0a 20 20 66 6f  return '"';.  fo
4df0: 72 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b 69 5d 3b  r(i=0; zName[i];
4e00: 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 21   i++){.    if( !
4e10: 69 73 61 6c 6e 75 6d 28 28 75 6e 73 69 67 6e 65  isalnum((unsigne
4e20: 64 20 63 68 61 72 29 7a 4e 61 6d 65 5b 69 5d 29  d char)zName[i])
4e30: 20 26 26 20 7a 4e 61 6d 65 5b 69 5d 21 3d 27 5f   && zName[i]!='_
4e40: 27 20 29 20 72 65 74 75 72 6e 20 27 22 27 3b 0a  ' ) return '"';.
4e50: 20 20 7d 0a 20 20 6c 77 72 20 3d 20 30 3b 0a 20    }.  lwr = 0;. 
4e60: 20 75 70 72 20 3d 20 73 69 7a 65 6f 66 28 61 7a   upr = sizeof(az
4e70: 4b 65 79 77 6f 72 64 73 29 2f 73 69 7a 65 6f 66  Keywords)/sizeof
4e80: 28 61 7a 4b 65 79 77 6f 72 64 73 5b 30 5d 29 20  (azKeywords[0]) 
4e90: 2d 20 31 3b 0a 20 20 77 68 69 6c 65 28 20 6c 77  - 1;.  while( lw
4ea0: 72 3c 3d 75 70 72 20 29 7b 0a 20 20 20 20 6d 69  r<=upr ){.    mi
4eb0: 64 20 3d 20 28 6c 77 72 2b 75 70 72 29 2f 32 3b  d = (lwr+upr)/2;
4ec0: 0a 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33  .    c = sqlite3
4ed0: 5f 73 74 72 69 63 6d 70 28 61 7a 4b 65 79 77 6f  _stricmp(azKeywo
4ee0: 72 64 73 5b 6d 69 64 5d 2c 20 7a 4e 61 6d 65 29  rds[mid], zName)
4ef0: 3b 0a 20 20 20 20 69 66 28 20 63 3d 3d 30 20 29  ;.    if( c==0 )
4f00: 20 72 65 74 75 72 6e 20 27 22 27 3b 0a 20 20 20   return '"';.   
4f10: 20 69 66 28 20 63 3c 30 20 29 7b 0a 20 20 20 20   if( c<0 ){.    
4f20: 20 20 6c 77 72 20 3d 20 6d 69 64 2b 31 3b 0a 20    lwr = mid+1;. 
4f30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4f40: 75 70 72 20 3d 20 6d 69 64 2d 31 3b 0a 20 20 20  upr = mid-1;.   
4f50: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
4f60: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73  0;.}../*.** Cons
4f70: 74 72 75 63 74 20 61 20 66 61 6b 65 20 6f 62 6a  truct a fake obj
4f80: 65 63 74 20 6e 61 6d 65 20 61 6e 64 20 63 6f 6c  ect name and col
4f90: 75 6d 6e 20 6c 69 73 74 20 74 6f 20 64 65 73 63  umn list to desc
4fa0: 72 69 62 65 20 74 68 65 20 73 74 72 75 63 74 75  ribe the structu
4fb0: 72 65 0a 2a 2a 20 6f 66 20 74 68 65 20 76 69 65  re.** of the vie
4fc0: 77 2c 20 76 69 72 74 75 61 6c 20 74 61 62 6c 65  w, virtual table
4fd0: 2c 20 6f 72 20 74 61 62 6c 65 20 76 61 6c 75 65  , or table value
4fe0: 64 20 66 75 6e 63 74 69 6f 6e 20 7a 53 63 68 65  d function zSche
4ff0: 6d 61 2e 7a 4e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  ma.zName..*/.sta
5000: 74 69 63 20 63 68 61 72 20 2a 73 68 65 6c 6c 46  tic char *shellF
5010: 61 6b 65 53 63 68 65 6d 61 28 0a 20 20 73 71 6c  akeSchema(.  sql
5020: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
5030: 20 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61       /* The data
5040: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
5050: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 76  containing the v
5060: 74 61 62 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  tab */.  const c
5070: 68 61 72 20 2a 7a 53 63 68 65 6d 61 2c 20 20 20  har *zSchema,   
5080: 20 2f 2a 20 53 63 68 65 6d 61 20 6f 66 20 74 68   /* Schema of th
5090: 65 20 64 61 74 61 62 61 73 65 20 68 6f 6c 64 69  e database holdi
50a0: 6e 67 20 74 68 65 20 76 74 61 62 20 2a 2f 0a 20  ng the vtab */. 
50b0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
50c0: 6d 65 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  me       /* The 
50d0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 76 69 72 74  name of the virt
50e0: 75 61 6c 20 74 61 62 6c 65 20 2a 2f 0a 29 7b 0a  ual table */.){.
50f0: 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
5100: 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 63 68 61  pStmt = 0;.  cha
5110: 72 20 2a 7a 53 71 6c 3b 0a 20 20 53 68 65 6c 6c  r *zSql;.  Shell
5120: 54 65 78 74 20 73 3b 0a 20 20 63 68 61 72 20 63  Text s;.  char c
5130: 51 75 6f 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a  Quote;.  char *z
5140: 44 69 76 20 3d 20 22 28 22 3b 0a 20 20 69 6e 74  Div = "(";.  int
5150: 20 6e 52 6f 77 20 3d 20 30 3b 0a 0a 20 20 7a 53   nRow = 0;..  zS
5160: 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
5170: 69 6e 74 66 28 22 50 52 41 47 4d 41 20 5c 22 25  intf("PRAGMA \"%
5180: 77 5c 22 2e 74 61 62 6c 65 5f 69 6e 66 6f 3d 25  w\".table_info=%
5190: 51 3b 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  Q;",.           
51a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 53                zS
51b0: 63 68 65 6d 61 20 3f 20 7a 53 63 68 65 6d 61 20  chema ? zSchema 
51c0: 3a 20 22 6d 61 69 6e 22 2c 20 7a 4e 61 6d 65 29  : "main", zName)
51d0: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ;.  sqlite3_prep
51e0: 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c  are_v2(db, zSql,
51f0: 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
5200: 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
5210: 7a 53 71 6c 29 3b 0a 20 20 69 6e 69 74 54 65 78  zSql);.  initTex
5220: 74 28 26 73 29 3b 0a 20 20 69 66 28 20 7a 53 63  t(&s);.  if( zSc
5230: 68 65 6d 61 20 29 7b 0a 20 20 20 20 63 51 75 6f  hema ){.    cQuo
5240: 74 65 20 3d 20 71 75 6f 74 65 43 68 61 72 28 7a  te = quoteChar(z
5250: 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 69 66 28  Schema);.    if(
5260: 20 63 51 75 6f 74 65 20 26 26 20 73 71 6c 69 74   cQuote && sqlit
5270: 65 33 5f 73 74 72 69 63 6d 70 28 7a 53 63 68 65  e3_stricmp(zSche
5280: 6d 61 2c 22 74 65 6d 70 22 29 3d 3d 30 20 29 20  ma,"temp")==0 ) 
5290: 63 51 75 6f 74 65 20 3d 20 30 3b 0a 20 20 20 20  cQuote = 0;.    
52a0: 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20 7a  appendText(&s, z
52b0: 53 63 68 65 6d 61 2c 20 63 51 75 6f 74 65 29 3b  Schema, cQuote);
52c0: 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28  .    appendText(
52d0: 26 73 2c 20 22 2e 22 2c 20 30 29 3b 0a 20 20 7d  &s, ".", 0);.  }
52e0: 0a 20 20 63 51 75 6f 74 65 20 3d 20 71 75 6f 74  .  cQuote = quot
52f0: 65 43 68 61 72 28 7a 4e 61 6d 65 29 3b 0a 20 20  eChar(zName);.  
5300: 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20 7a  appendText(&s, z
5310: 4e 61 6d 65 2c 20 63 51 75 6f 74 65 29 3b 0a 20  Name, cQuote);. 
5320: 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f   while( sqlite3_
5330: 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c  step(pStmt)==SQL
5340: 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 63  ITE_ROW ){.    c
5350: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 20  onst char *zCol 
5360: 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
5370: 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
5380: 78 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20  xt(pStmt, 1);.  
5390: 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20 20 20 61 70    nRow++;.    ap
53a0: 70 65 6e 64 54 65 78 74 28 26 73 2c 20 7a 44 69  pendText(&s, zDi
53b0: 76 2c 20 30 29 3b 0a 20 20 20 20 7a 44 69 76 20  v, 0);.    zDiv 
53c0: 3d 20 22 2c 22 3b 0a 20 20 20 20 63 51 75 6f 74  = ",";.    cQuot
53d0: 65 20 3d 20 71 75 6f 74 65 43 68 61 72 28 7a 43  e = quoteChar(zC
53e0: 6f 6c 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54  ol);.    appendT
53f0: 65 78 74 28 26 73 2c 20 7a 43 6f 6c 2c 20 63 51  ext(&s, zCol, cQ
5400: 75 6f 74 65 29 3b 0a 20 20 7d 0a 20 20 61 70 70  uote);.  }.  app
5410: 65 6e 64 54 65 78 74 28 26 73 2c 20 22 29 22 2c  endText(&s, ")",
5420: 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66   0);.  sqlite3_f
5430: 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
5440: 20 20 69 66 28 20 6e 52 6f 77 3d 3d 30 20 29 7b    if( nRow==0 ){
5450: 0a 20 20 20 20 66 72 65 65 54 65 78 74 28 26 73  .    freeText(&s
5460: 29 3b 0a 20 20 20 20 73 2e 7a 20 3d 20 30 3b 0a  );.    s.z = 0;.
5470: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 2e 7a    }.  return s.z
5480: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51 4c 20 66  ;.}../*.** SQL f
5490: 75 6e 63 74 69 6f 6e 3a 20 20 73 68 65 6c 6c 5f  unction:  shell_
54a0: 6d 6f 64 75 6c 65 5f 73 63 68 65 6d 61 28 58 29  module_schema(X)
54b0: 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20  .**.** Return a 
54c0: 66 61 6b 65 20 73 63 68 65 6d 61 20 66 6f 72 20  fake schema for 
54d0: 74 68 65 20 74 61 62 6c 65 2d 76 61 6c 75 65 64  the table-valued
54e0: 20 66 75 6e 63 74 69 6f 6e 20 6f 72 20 65 70 6f   function or epo
54f0: 6e 79 6d 6f 75 73 20 76 69 72 74 75 61 6c 0a 2a  nymous virtual.*
5500: 2a 20 74 61 62 6c 65 20 58 2e 0a 2a 2f 0a 73 74  * table X..*/.st
5510: 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 4d  atic void shellM
5520: 6f 64 75 6c 65 53 63 68 65 6d 61 28 0a 20 20 73  oduleSchema(.  s
5530: 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a  qlite3_context *
5540: 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e 56 61 6c  pCtx,.  int nVal
5550: 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76 61 6c 75  ,.  sqlite3_valu
5560: 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 63  e **apVal.){.  c
5570: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65  onst char *zName
5580: 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
5590: 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65  sqlite3_value_te
55a0: 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20  xt(apVal[0]);.  
55b0: 63 68 61 72 20 2a 7a 46 61 6b 65 20 3d 20 73 68  char *zFake = sh
55c0: 65 6c 6c 46 61 6b 65 53 63 68 65 6d 61 28 73 71  ellFakeSchema(sq
55d0: 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f 64 62  lite3_context_db
55e0: 5f 68 61 6e 64 6c 65 28 70 43 74 78 29 2c 20 30  _handle(pCtx), 0
55f0: 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , zName);.  if( 
5600: 7a 46 61 6b 65 20 29 7b 0a 20 20 20 20 73 71 6c  zFake ){.    sql
5610: 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
5620: 28 70 43 74 78 2c 20 73 71 6c 69 74 65 33 5f 6d  (pCtx, sqlite3_m
5630: 70 72 69 6e 74 66 28 22 2f 2a 20 25 7a 20 2a 2f  printf("/* %z */
5640: 22 2c 20 7a 46 61 6b 65 29 2c 0a 20 20 20 20 20  ", zFake),.     
5650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5660: 20 20 20 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66     -1, sqlite3_f
5670: 72 65 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  ree);.  }.}../*.
5680: 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69 6f 6e 3a  ** SQL function:
5690: 20 20 73 68 65 6c 6c 5f 61 64 64 5f 73 63 68 65    shell_add_sche
56a0: 6d 61 28 53 2c 58 29 0a 2a 2a 0a 2a 2a 20 41 64  ma(S,X).**.** Ad
56b0: 64 20 74 68 65 20 73 63 68 65 6d 61 20 6e 61 6d  d the schema nam
56c0: 65 20 58 20 74 6f 20 74 68 65 20 43 52 45 41 54  e X to the CREAT
56d0: 45 20 73 74 61 74 65 6d 65 6e 74 20 69 6e 20 53  E statement in S
56e0: 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20   and return the 
56f0: 72 65 73 75 6c 74 2e 0a 2a 2a 20 45 78 61 6d 70  result..** Examp
5700: 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52  les:.**.**    CR
5710: 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 78 29  EATE TABLE t1(x)
5720: 20 20 20 2d 3e 20 20 20 43 52 45 41 54 45 20 54     ->   CREATE T
5730: 41 42 4c 45 20 78 79 7a 2e 74 31 28 78 29 3b 0a  ABLE xyz.t1(x);.
5740: 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 77 6f 72 6b 73  **.** Also works
5750: 20 6f 6e 0a 2a 2a 0a 2a 2a 20 20 20 20 43 52 45   on.**.**    CRE
5760: 41 54 45 20 49 4e 44 45 58 0a 2a 2a 20 20 20 20  ATE INDEX.**    
5770: 43 52 45 41 54 45 20 55 4e 49 51 55 45 20 49 4e  CREATE UNIQUE IN
5780: 44 45 58 0a 2a 2a 20 20 20 20 43 52 45 41 54 45  DEX.**    CREATE
5790: 20 56 49 45 57 0a 2a 2a 20 20 20 20 43 52 45 41   VIEW.**    CREA
57a0: 54 45 20 54 52 49 47 47 45 52 0a 2a 2a 20 20 20  TE TRIGGER.**   
57b0: 20 43 52 45 41 54 45 20 56 49 52 54 55 41 4c 20   CREATE VIRTUAL 
57c0: 54 41 42 4c 45 0a 2a 2a 0a 2a 2a 20 54 68 69 73  TABLE.**.** This
57d0: 20 55 44 46 20 69 73 20 75 73 65 64 20 62 79 20   UDF is used by 
57e0: 74 68 65 20 2e 73 63 68 65 6d 61 20 63 6f 6d 6d  the .schema comm
57f0: 61 6e 64 20 74 6f 20 69 6e 73 65 72 74 20 74 68  and to insert th
5800: 65 20 73 63 68 65 6d 61 20 6e 61 6d 65 20 6f 66  e schema name of
5810: 0a 2a 2a 20 61 74 74 61 63 68 65 64 20 64 61 74  .** attached dat
5820: 61 62 61 73 65 73 20 69 6e 74 6f 20 74 68 65 20  abases into the 
5830: 6d 69 64 64 6c 65 20 6f 66 20 74 68 65 20 73 71  middle of the sq
5840: 6c 69 74 65 5f 6d 61 73 74 65 72 2e 73 71 6c 20  lite_master.sql 
5850: 66 69 65 6c 64 2e 0a 2a 2f 0a 73 74 61 74 69 63  field..*/.static
5860: 20 76 6f 69 64 20 73 68 65 6c 6c 41 64 64 53 63   void shellAddSc
5870: 68 65 6d 61 4e 61 6d 65 28 0a 20 20 73 71 6c 69  hemaName(.  sqli
5880: 74 65 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74  te3_context *pCt
5890: 78 2c 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20  x,.  int nVal,. 
58a0: 20 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a   sqlite3_value *
58b0: 2a 61 70 56 61 6c 0a 29 7b 0a 20 20 73 74 61 74  *apVal.){.  stat
58c0: 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61  ic const char *a
58d0: 50 72 65 66 69 78 5b 5d 20 3d 20 7b 0a 20 20 20  Prefix[] = {.   
58e0: 20 20 22 54 41 42 4c 45 22 2c 0a 20 20 20 20 20    "TABLE",.     
58f0: 22 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 55  "INDEX",.     "U
5900: 4e 49 51 55 45 20 49 4e 44 45 58 22 2c 0a 20 20  NIQUE INDEX",.  
5910: 20 20 20 22 56 49 45 57 22 2c 0a 20 20 20 20 20     "VIEW",.     
5920: 22 54 52 49 47 47 45 52 22 2c 0a 20 20 20 20 20  "TRIGGER",.     
5930: 22 56 49 52 54 55 41 4c 20 54 41 42 4c 45 22 0a  "VIRTUAL TABLE".
5940: 20 20 7d 3b 0a 20 20 69 6e 74 20 69 20 3d 20 30    };.  int i = 0
5950: 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
5960: 7a 49 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  zIn = (const cha
5970: 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
5980: 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b  _text(apVal[0]);
5990: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
59a0: 53 63 68 65 6d 61 20 3d 20 28 63 6f 6e 73 74 20  Schema = (const 
59b0: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61  char*)sqlite3_va
59c0: 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 31  lue_text(apVal[1
59d0: 5d 29 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ]);.  const char
59e0: 20 2a 7a 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74   *zName = (const
59f0: 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 76   char*)sqlite3_v
5a00: 61 6c 75 65 5f 74 65 78 74 28 61 70 56 61 6c 5b  alue_text(apVal[
5a10: 32 5d 29 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a  2]);.  sqlite3 *
5a20: 64 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6e  db = sqlite3_con
5a30: 74 65 78 74 5f 64 62 5f 68 61 6e 64 6c 65 28 70  text_db_handle(p
5a40: 43 74 78 29 3b 0a 20 20 69 66 28 20 7a 49 6e 21  Ctx);.  if( zIn!
5a50: 3d 30 20 26 26 20 73 74 72 6e 63 6d 70 28 7a 49  =0 && strncmp(zI
5a60: 6e 2c 20 22 43 52 45 41 54 45 20 22 2c 20 37 29  n, "CREATE ", 7)
5a70: 3d 3d 30 20 29 7b 0a 20 20 20 20 66 6f 72 28 69  ==0 ){.    for(i
5a80: 3d 30 3b 20 69 3c 28 69 6e 74 29 28 73 69 7a 65  =0; i<(int)(size
5a90: 6f 66 28 61 50 72 65 66 69 78 29 2f 73 69 7a 65  of(aPrefix)/size
5aa0: 6f 66 28 61 50 72 65 66 69 78 5b 30 5d 29 29 3b  of(aPrefix[0]));
5ab0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74   i++){.      int
5ac0: 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 50   n = strlen30(aP
5ad0: 72 65 66 69 78 5b 69 5d 29 3b 0a 20 20 20 20 20  refix[i]);.     
5ae0: 20 69 66 28 20 73 74 72 6e 63 6d 70 28 7a 49 6e   if( strncmp(zIn
5af0: 2b 37 2c 20 61 50 72 65 66 69 78 5b 69 5d 2c 20  +7, aPrefix[i], 
5b00: 6e 29 3d 3d 30 20 26 26 20 7a 49 6e 5b 6e 2b 37  n)==0 && zIn[n+7
5b10: 5d 3d 3d 27 20 27 20 29 7b 0a 20 20 20 20 20 20  ]==' ' ){.      
5b20: 20 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20    char *z = 0;. 
5b30: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 46 61         char *zFa
5b40: 6b 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ke = 0;.        
5b50: 69 66 28 20 7a 53 63 68 65 6d 61 20 29 7b 0a 20  if( zSchema ){. 
5b60: 20 20 20 20 20 20 20 20 20 63 68 61 72 20 63 51           char cQ
5b70: 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61 72  uote = quoteChar
5b80: 28 7a 53 63 68 65 6d 61 29 3b 0a 20 20 20 20 20  (zSchema);.     
5b90: 20 20 20 20 20 69 66 28 20 63 51 75 6f 74 65 20       if( cQuote 
5ba0: 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  && sqlite3_stric
5bb0: 6d 70 28 7a 53 63 68 65 6d 61 2c 22 74 65 6d 70  mp(zSchema,"temp
5bc0: 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ")!=0 ){.       
5bd0: 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
5be0: 5f 6d 70 72 69 6e 74 66 28 22 25 2e 2a 73 20 5c  _mprintf("%.*s \
5bf0: 22 25 77 5c 22 2e 25 73 22 2c 20 6e 2b 37 2c 20  "%w\".%s", n+7, 
5c00: 7a 49 6e 2c 20 7a 53 63 68 65 6d 61 2c 20 7a 49  zIn, zSchema, zI
5c10: 6e 2b 6e 2b 38 29 3b 0a 20 20 20 20 20 20 20 20  n+n+8);.        
5c20: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5c30: 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
5c40: 5f 6d 70 72 69 6e 74 66 28 22 25 2e 2a 73 20 25  _mprintf("%.*s %
5c50: 73 2e 25 73 22 2c 20 6e 2b 37 2c 20 7a 49 6e 2c  s.%s", n+7, zIn,
5c60: 20 7a 53 63 68 65 6d 61 2c 20 7a 49 6e 2b 6e 2b   zSchema, zIn+n+
5c70: 38 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  8);.          }.
5c80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5c90: 20 20 69 66 28 20 7a 4e 61 6d 65 0a 20 20 20 20    if( zName.    
5ca0: 20 20 20 20 20 26 26 20 61 50 72 65 66 69 78 5b       && aPrefix[
5cb0: 69 5d 5b 30 5d 3d 3d 27 56 27 0a 20 20 20 20 20  i][0]=='V'.     
5cc0: 20 20 20 20 26 26 20 28 7a 46 61 6b 65 20 3d 20      && (zFake = 
5cd0: 73 68 65 6c 6c 46 61 6b 65 53 63 68 65 6d 61 28  shellFakeSchema(
5ce0: 64 62 2c 20 7a 53 63 68 65 6d 61 2c 20 7a 4e 61  db, zSchema, zNa
5cf0: 6d 65 29 29 21 3d 30 0a 20 20 20 20 20 20 20 20  me))!=0.        
5d00: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
5d10: 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20   z==0 ){.       
5d20: 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33       z = sqlite3
5d30: 5f 6d 70 72 69 6e 74 66 28 22 25 73 5c 6e 2f 2a  _mprintf("%s\n/*
5d40: 20 25 7a 20 2a 2f 22 2c 20 7a 49 6e 2c 20 7a 46   %z */", zIn, zF
5d50: 61 6b 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ake);.          
5d60: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
5d70: 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d     z = sqlite3_m
5d80: 70 72 69 6e 74 66 28 22 25 7a 5c 6e 2f 2a 20 25  printf("%z\n/* %
5d90: 7a 20 2a 2f 22 2c 20 7a 2c 20 7a 46 61 6b 65 29  z */", z, zFake)
5da0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
5db0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
5dc0: 69 66 28 20 7a 20 29 7b 0a 20 20 20 20 20 20 20  if( z ){.       
5dd0: 20 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c     sqlite3_resul
5de0: 74 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 2c 20  t_text(pCtx, z, 
5df0: 2d 31 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65  -1, sqlite3_free
5e00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
5e10: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  urn;.        }. 
5e20: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5e30: 0a 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c  .  sqlite3_resul
5e40: 74 5f 76 61 6c 75 65 28 70 43 74 78 2c 20 61 70  t_value(pCtx, ap
5e50: 56 61 6c 5b 30 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Val[0]);.}../*.*
5e60: 2a 20 54 68 65 20 73 6f 75 72 63 65 20 63 6f 64  * The source cod
5e70: 65 20 66 6f 72 20 73 65 76 65 72 61 6c 20 72 75  e for several ru
5e80: 6e 2d 74 69 6d 65 20 6c 6f 61 64 61 62 6c 65 20  n-time loadable 
5e90: 65 78 74 65 6e 73 69 6f 6e 73 20 69 73 20 69 6e  extensions is in
5ea0: 73 65 72 74 65 64 0a 2a 2a 20 62 65 6c 6f 77 20  serted.** below 
5eb0: 62 79 20 74 68 65 20 2e 2e 2f 74 6f 6f 6c 2f 6d  by the ../tool/m
5ec0: 6b 73 68 65 6c 6c 63 2e 74 63 6c 20 73 63 72 69  kshellc.tcl scri
5ed0: 70 74 2e 20 20 42 65 66 6f 72 65 20 70 72 6f 63  pt.  Before proc
5ee0: 65 73 73 69 6e 67 20 74 68 61 74 20 69 6e 63 6c  essing that incl
5ef0: 75 64 65 64 0a 2a 2a 20 63 6f 64 65 2c 20 77 65  uded.** code, we
5f00: 20 6e 65 65 64 20 74 6f 20 6f 76 65 72 72 69 64   need to overrid
5f10: 65 20 73 6f 6d 65 20 6d 61 63 72 6f 73 20 74 6f  e some macros to
5f20: 20 6d 61 6b 65 20 74 68 65 20 69 6e 63 6c 75 64   make the includ
5f30: 65 64 20 70 72 6f 67 72 61 6d 20 63 6f 64 65 0a  ed program code.
5f40: 2a 2a 20 77 6f 72 6b 20 68 65 72 65 20 69 6e 20  ** work here in 
5f50: 74 68 65 20 6d 69 64 64 6c 65 20 6f 66 20 74 68  the middle of th
5f60: 69 73 20 72 65 67 75 6c 61 72 20 70 72 6f 67 72  is regular progr
5f70: 61 6d 2e 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53  am..*/.#define S
5f80: 51 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f  QLITE_EXTENSION_
5f90: 49 4e 49 54 31 0a 23 64 65 66 69 6e 65 20 53 51  INIT1.#define SQ
5fa0: 4c 49 54 45 5f 45 58 54 45 4e 53 49 4f 4e 5f 49  LITE_EXTENSION_I
5fb0: 4e 49 54 32 28 58 29 20 28 76 6f 69 64 29 28 58  NIT2(X) (void)(X
5fc0: 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  )..#if defined(_
5fd0: 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65  WIN32) || define
5fe0: 64 28 57 49 4e 33 32 29 0a 49 4e 43 4c 55 44 45  d(WIN32).INCLUDE
5ff0: 20 74 65 73 74 5f 77 69 6e 64 69 72 65 6e 74 2e   test_windirent.
6000: 63 0a 23 64 65 66 69 6e 65 20 64 69 72 65 6e 74  c.#define dirent
6010: 20 44 49 52 45 4e 54 0a 23 64 65 66 69 6e 65 20   DIRENT.#define 
6020: 74 69 6d 65 73 70 65 63 20 54 49 4d 45 53 50 45  timespec TIMESPE
6030: 43 0a 23 65 6e 64 69 66 0a 49 4e 43 4c 55 44 45  C.#endif.INCLUDE
6040: 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 73 68 61   ../ext/misc/sha
6050: 74 68 72 65 65 2e 63 0a 49 4e 43 4c 55 44 45 20  three.c.INCLUDE 
6060: 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 66 69 6c 65  ../ext/misc/file
6070: 69 6f 2e 63 0a 49 4e 43 4c 55 44 45 20 2e 2e 2f  io.c.INCLUDE ../
6080: 65 78 74 2f 6d 69 73 63 2f 63 6f 6d 70 6c 65 74  ext/misc/complet
6090: 69 6f 6e 2e 63 0a 23 69 66 64 65 66 20 53 51 4c  ion.c.#ifdef SQL
60a0: 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a 49 4e  ITE_HAVE_ZLIB.IN
60b0: 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73  CLUDE ../ext/mis
60c0: 63 2f 7a 69 70 66 69 6c 65 2e 63 0a 49 4e 43 4c  c/zipfile.c.INCL
60d0: 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f  UDE ../ext/misc/
60e0: 73 71 6c 61 72 2e 63 0a 23 65 6e 64 69 66 0a 49  sqlar.c.#endif.I
60f0: 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 65 78  NCLUDE ../ext/ex
6100: 70 65 72 74 2f 73 71 6c 69 74 65 33 65 78 70 65  pert/sqlite3expe
6110: 72 74 2e 68 0a 49 4e 43 4c 55 44 45 20 2e 2e 2f  rt.h.INCLUDE ../
6120: 65 78 74 2f 65 78 70 65 72 74 2f 73 71 6c 69 74  ext/expert/sqlit
6130: 65 33 65 78 70 65 72 74 2e 63 0a 0a 23 69 66 20  e3expert.c..#if 
6140: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
6150: 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 2f  NABLE_SESSION)./
6160: 2a 0a 2a 2a 20 53 74 61 74 65 20 69 6e 66 6f 72  *.** State infor
6170: 6d 61 74 69 6f 6e 20 66 6f 72 20 61 20 73 69 6e  mation for a sin
6180: 67 6c 65 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e  gle open session
6190: 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75  .*/.typedef stru
61a0: 63 74 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20 4f  ct OpenSession O
61b0: 70 65 6e 53 65 73 73 69 6f 6e 3b 0a 73 74 72 75  penSession;.stru
61c0: 63 74 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20 7b  ct OpenSession {
61d0: 0a 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20  .  char *zName; 
61e0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
61f0: 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 66 6f 72  ymbolic name for
6200: 20 74 68 69 73 20 73 65 73 73 69 6f 6e 20 2a 2f   this session */
6210: 0a 20 20 69 6e 74 20 6e 46 69 6c 74 65 72 3b 20  .  int nFilter; 
6220: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6230: 75 6d 62 65 72 20 6f 66 20 78 46 69 6c 74 65 72  umber of xFilter
6240: 20 72 65 6a 65 63 74 69 6f 6e 20 47 4c 4f 42 20   rejection GLOB 
6250: 70 61 74 74 65 72 6e 73 20 2a 2f 0a 20 20 63 68  patterns */.  ch
6260: 61 72 20 2a 2a 61 7a 46 69 6c 74 65 72 3b 20 20  ar **azFilter;  
6270: 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
6280: 6f 66 20 78 46 69 6c 74 65 72 20 72 65 6a 65 63  of xFilter rejec
6290: 74 69 6f 6e 20 47 4c 4f 42 20 70 61 74 74 65 72  tion GLOB patter
62a0: 6e 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ns */.  sqlite3_
62b0: 73 65 73 73 69 6f 6e 20 2a 70 3b 20 20 20 20 20  session *p;     
62c0: 20 2f 2a 20 54 68 65 20 6f 70 65 6e 20 73 65 73   /* The open ses
62d0: 73 69 6f 6e 20 2a 2f 0a 7d 3b 0a 23 65 6e 64 69  sion */.};.#endi
62e0: 66 0a 0a 2f 2a 0a 2a 2a 20 53 68 65 6c 6c 20 6f  f../*.** Shell o
62f0: 75 74 70 75 74 20 6d 6f 64 65 20 69 6e 66 6f 72  utput mode infor
6300: 6d 61 74 69 6f 6e 20 66 72 6f 6d 20 62 65 66 6f  mation from befo
6310: 72 65 20 22 2e 65 78 70 6c 61 69 6e 20 6f 6e 22  re ".explain on"
6320: 2c 0a 2a 2a 20 73 61 76 65 64 20 73 6f 20 74 68  ,.** saved so th
6330: 61 74 20 69 74 20 63 61 6e 20 62 65 20 72 65 73  at it can be res
6340: 74 6f 72 65 64 20 62 79 20 22 2e 65 78 70 6c 61  tored by ".expla
6350: 69 6e 20 6f 66 66 22 0a 2a 2f 0a 74 79 70 65 64  in off".*/.typed
6360: 65 66 20 73 74 72 75 63 74 20 53 61 76 65 64 4d  ef struct SavedM
6370: 6f 64 65 49 6e 66 6f 20 53 61 76 65 64 4d 6f 64  odeInfo SavedMod
6380: 65 49 6e 66 6f 3b 0a 73 74 72 75 63 74 20 53 61  eInfo;.struct Sa
6390: 76 65 64 4d 6f 64 65 49 6e 66 6f 20 7b 0a 20 20  vedModeInfo {.  
63a0: 69 6e 74 20 76 61 6c 69 64 3b 20 20 20 20 20 20  int valid;      
63b0: 20 20 20 20 2f 2a 20 49 73 20 74 68 65 72 65 20      /* Is there 
63c0: 6c 65 67 69 74 20 64 61 74 61 20 69 6e 20 68 65  legit data in he
63d0: 72 65 3f 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64  re? */.  int mod
63e0: 65 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  e;           /* 
63f0: 4d 6f 64 65 20 70 72 69 6f 72 20 74 6f 20 22 2e  Mode prior to ".
6400: 65 78 70 6c 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20  explain on" */. 
6410: 20 69 6e 74 20 73 68 6f 77 48 65 61 64 65 72 3b   int showHeader;
6420: 20 20 20 20 20 2f 2a 20 54 68 65 20 22 2e 68 65       /* The ".he
6430: 61 64 65 72 22 20 73 65 74 74 69 6e 67 20 70 72  ader" setting pr
6440: 69 6f 72 20 74 6f 20 22 2e 65 78 70 6c 61 69 6e  ior to ".explain
6450: 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74 20 63 6f   on" */.  int co
6460: 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20 20 2f 2a  lWidth[100];  /*
6470: 20 43 6f 6c 75 6d 6e 20 77 69 64 74 68 73 20 70   Column widths p
6480: 72 69 6f 72 20 74 6f 20 22 2e 65 78 70 6c 61 69  rior to ".explai
6490: 6e 20 6f 6e 22 20 2a 2f 0a 7d 3b 0a 0a 74 79 70  n on" */.};..typ
64a0: 65 64 65 66 20 73 74 72 75 63 74 20 45 78 70 65  edef struct Expe
64b0: 72 74 49 6e 66 6f 20 45 78 70 65 72 74 49 6e 66  rtInfo ExpertInf
64c0: 6f 3b 0a 73 74 72 75 63 74 20 45 78 70 65 72 74  o;.struct Expert
64d0: 49 6e 66 6f 20 7b 0a 20 20 73 71 6c 69 74 65 33  Info {.  sqlite3
64e0: 65 78 70 65 72 74 20 2a 70 45 78 70 65 72 74 3b  expert *pExpert;
64f0: 0a 20 20 69 6e 74 20 62 56 65 72 62 6f 73 65 3b  .  int bVerbose;
6500: 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 53 74 61 74 65  .};../*.** State
6510: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
6520: 75 74 20 74 68 65 20 64 61 74 61 62 61 73 65 20  ut the database 
6530: 63 6f 6e 6e 65 63 74 69 6f 6e 20 69 73 20 63 6f  connection is co
6540: 6e 74 61 69 6e 65 64 20 69 6e 20 61 6e 0a 2a 2a  ntained in an.**
6550: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
6560: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
6570: 74 75 72 65 2e 0a 2a 2f 0a 74 79 70 65 64 65 66  ture..*/.typedef
6580: 20 73 74 72 75 63 74 20 53 68 65 6c 6c 53 74 61   struct ShellSta
6590: 74 65 20 53 68 65 6c 6c 53 74 61 74 65 3b 0a 73  te ShellState;.s
65a0: 74 72 75 63 74 20 53 68 65 6c 6c 53 74 61 74 65  truct ShellState
65b0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62   {.  sqlite3 *db
65c0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  ;           /* T
65d0: 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  he database */. 
65e0: 20 69 6e 74 20 61 75 74 6f 45 78 70 6c 61 69 6e   int autoExplain
65f0: 3b 20 20 20 20 20 20 20 2f 2a 20 41 75 74 6f 6d  ;       /* Autom
6600: 61 74 69 63 61 6c 6c 79 20 74 75 72 6e 20 6f 6e  atically turn on
6610: 20 2e 65 78 70 6c 61 69 6e 20 6d 6f 64 65 20 2a   .explain mode *
6620: 2f 0a 20 20 69 6e 74 20 61 75 74 6f 45 51 50 3b  /.  int autoEQP;
6630: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 75             /* Ru
6640: 6e 20 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20  n EXPLAIN QUERY 
6650: 50 4c 41 4e 20 70 72 69 6f 72 20 74 6f 20 73 65  PLAN prior to se
6660: 61 63 68 20 53 51 4c 20 73 74 6d 74 20 2a 2f 0a  ach SQL stmt */.
6670: 20 20 69 6e 74 20 73 74 61 74 73 4f 6e 3b 20 20    int statsOn;  
6680: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
6690: 20 74 6f 20 64 69 73 70 6c 61 79 20 6d 65 6d 6f   to display memo
66a0: 72 79 20 73 74 61 74 73 20 62 65 66 6f 72 65 20  ry stats before 
66b0: 65 61 63 68 20 66 69 6e 61 6c 69 7a 65 20 2a 2f  each finalize */
66c0: 0a 20 20 69 6e 74 20 73 63 61 6e 73 74 61 74 73  .  int scanstats
66d0: 4f 6e 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75  On;       /* Tru
66e0: 65 20 74 6f 20 64 69 73 70 6c 61 79 20 73 63 61  e to display sca
66f0: 6e 20 73 74 61 74 73 20 62 65 66 6f 72 65 20 65  n stats before e
6700: 61 63 68 20 66 69 6e 61 6c 69 7a 65 20 2a 2f 0a  ach finalize */.
6710: 20 20 69 6e 74 20 6f 75 74 43 6f 75 6e 74 3b 20    int outCount; 
6720: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 76 65           /* Reve
6730: 72 74 20 74 6f 20 73 74 64 6f 75 74 20 77 68 65  rt to stdout whe
6740: 6e 20 72 65 61 63 68 69 6e 67 20 7a 65 72 6f 20  n reaching zero 
6750: 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 3b 20 20 20  */.  int cnt;   
6760: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6770: 75 6d 62 65 72 20 6f 66 20 72 65 63 6f 72 64 73  umber of records
6780: 20 64 69 73 70 6c 61 79 65 64 20 73 6f 20 66 61   displayed so fa
6790: 72 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 6f 75 74  r */.  FILE *out
67a0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
67b0: 20 57 72 69 74 65 20 72 65 73 75 6c 74 73 20 68   Write results h
67c0: 65 72 65 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 74  ere */.  FILE *t
67d0: 72 61 63 65 4f 75 74 3b 20 20 20 20 20 20 20 20  raceOut;        
67e0: 2f 2a 20 4f 75 74 70 75 74 20 66 6f 72 20 73 71  /* Output for sq
67f0: 6c 69 74 65 33 5f 74 72 61 63 65 28 29 20 2a 2f  lite3_trace() */
6800: 0a 20 20 69 6e 74 20 6e 45 72 72 3b 20 20 20 20  .  int nErr;    
6810: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
6820: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65  ber of errors se
6830: 65 6e 20 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64 65  en */.  int mode
6840: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
6850: 2a 20 41 6e 20 6f 75 74 70 75 74 20 6d 6f 64 65  * An output mode
6860: 20 73 65 74 74 69 6e 67 20 2a 2f 0a 20 20 69 6e   setting */.  in
6870: 74 20 63 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  t cMode;        
6880: 20 20 20 20 20 2f 2a 20 74 65 6d 70 6f 72 61 72       /* temporar
6890: 79 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 66 6f  y output mode fo
68a0: 72 20 74 68 65 20 63 75 72 72 65 6e 74 20 71 75  r the current qu
68b0: 65 72 79 20 2a 2f 0a 20 20 69 6e 74 20 6e 6f 72  ery */.  int nor
68c0: 6d 61 6c 4d 6f 64 65 3b 20 20 20 20 20 20 20 20  malMode;        
68d0: 2f 2a 20 4f 75 74 70 75 74 20 6d 6f 64 65 20 62  /* Output mode b
68e0: 65 66 6f 72 65 20 22 2e 65 78 70 6c 61 69 6e 20  efore ".explain 
68f0: 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74 20 77 72 69  on" */.  int wri
6900: 74 61 62 6c 65 53 63 68 65 6d 61 3b 20 20 20 20  tableSchema;    
6910: 2f 2a 20 54 72 75 65 20 69 66 20 50 52 41 47 4d  /* True if PRAGM
6920: 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
6930: 61 3d 4f 4e 20 2a 2f 0a 20 20 69 6e 74 20 73 68  a=ON */.  int sh
6940: 6f 77 48 65 61 64 65 72 3b 20 20 20 20 20 20 20  owHeader;       
6950: 20 2f 2a 20 54 72 75 65 20 74 6f 20 73 68 6f 77   /* True to show
6960: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 69 6e   column names in
6970: 20 4c 69 73 74 20 6f 72 20 43 6f 6c 75 6d 6e 20   List or Column 
6980: 6d 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  mode */.  int nC
6990: 68 65 63 6b 3b 20 20 20 20 20 20 20 20 20 20 20  heck;           
69a0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 22 2e   /* Number of ".
69b0: 63 68 65 63 6b 22 20 63 6f 6d 6d 61 6e 64 73 20  check" commands 
69c0: 72 75 6e 20 2a 2f 0a 20 20 75 6e 73 69 67 6e 65  run */.  unsigne
69d0: 64 20 73 68 65 6c 6c 46 6c 67 73 3b 20 20 20 20  d shellFlgs;    
69e0: 2f 2a 20 56 61 72 69 6f 75 73 20 66 6c 61 67 73  /* Various flags
69f0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 44 65 73   */.  char *zDes
6a00: 74 54 61 62 6c 65 3b 20 20 20 20 20 20 2f 2a 20  tTable;      /* 
6a10: 4e 61 6d 65 20 6f 66 20 64 65 73 74 69 6e 61 74  Name of destinat
6a20: 69 6f 6e 20 74 61 62 6c 65 20 77 68 65 6e 20 4d  ion table when M
6a30: 4f 44 45 5f 49 6e 73 65 72 74 20 2a 2f 0a 20 20  ODE_Insert */.  
6a40: 63 68 61 72 20 7a 54 65 73 74 63 61 73 65 5b 33  char zTestcase[3
6a50: 30 5d 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  0];    /* Name o
6a60: 66 20 63 75 72 72 65 6e 74 20 74 65 73 74 20 63  f current test c
6a70: 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 63 6f  ase */.  char co
6a80: 6c 53 65 70 61 72 61 74 6f 72 5b 32 30 5d 3b 20  lSeparator[20]; 
6a90: 2f 2a 20 43 6f 6c 75 6d 6e 20 73 65 70 61 72 61  /* Column separa
6aa0: 74 6f 72 20 63 68 61 72 61 63 74 65 72 20 66 6f  tor character fo
6ab0: 72 20 73 65 76 65 72 61 6c 20 6d 6f 64 65 73 20  r several modes 
6ac0: 2a 2f 0a 20 20 63 68 61 72 20 72 6f 77 53 65 70  */.  char rowSep
6ad0: 61 72 61 74 6f 72 5b 32 30 5d 3b 20 2f 2a 20 52  arator[20]; /* R
6ae0: 6f 77 20 73 65 70 61 72 61 74 6f 72 20 63 68 61  ow separator cha
6af0: 72 61 63 74 65 72 20 66 6f 72 20 4d 4f 44 45 5f  racter for MODE_
6b00: 41 73 63 69 69 20 2a 2f 0a 20 20 69 6e 74 20 63  Ascii */.  int c
6b10: 6f 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20 20 20  olWidth[100];   
6b20: 20 20 2f 2a 20 52 65 71 75 65 73 74 65 64 20 77    /* Requested w
6b30: 69 64 74 68 20 6f 66 20 65 61 63 68 20 63 6f 6c  idth of each col
6b40: 75 6d 6e 20 77 68 65 6e 20 69 6e 20 63 6f 6c 75  umn when in colu
6b50: 6d 6e 20 6d 6f 64 65 2a 2f 0a 20 20 69 6e 74 20  mn mode*/.  int 
6b60: 61 63 74 75 61 6c 57 69 64 74 68 5b 31 30 30 5d  actualWidth[100]
6b70: 3b 20 20 2f 2a 20 41 63 74 75 61 6c 20 77 69 64  ;  /* Actual wid
6b80: 74 68 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d  th of each colum
6b90: 6e 20 2a 2f 0a 20 20 63 68 61 72 20 6e 75 6c 6c  n */.  char null
6ba0: 56 61 6c 75 65 5b 32 30 5d 3b 20 20 20 20 2f 2a  Value[20];    /*
6bb0: 20 54 68 65 20 74 65 78 74 20 74 6f 20 70 72 69   The text to pri
6bc0: 6e 74 20 77 68 65 6e 20 61 20 4e 55 4c 4c 20 63  nt when a NULL c
6bd0: 6f 6d 65 73 20 62 61 63 6b 20 66 72 6f 6d 0a 20  omes back from. 
6be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6bf0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20 64          ** the d
6c00: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 68 61  atabase */.  cha
6c10: 72 20 6f 75 74 66 69 6c 65 5b 46 49 4c 45 4e 41  r outfile[FILENA
6c20: 4d 45 5f 4d 41 58 5d 3b 20 2f 2a 20 46 69 6c 65  ME_MAX]; /* File
6c30: 6e 61 6d 65 20 66 6f 72 20 2a 6f 75 74 20 2a 2f  name for *out */
6c40: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6c50: 44 62 46 69 6c 65 6e 61 6d 65 3b 20 20 20 20 2f  DbFilename;    /
6c60: 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * name of the da
6c70: 74 61 62 61 73 65 20 66 69 6c 65 20 2a 2f 0a 20  tabase file */. 
6c80: 20 63 68 61 72 20 2a 7a 46 72 65 65 4f 6e 43 6c   char *zFreeOnCl
6c90: 6f 73 65 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  ose;         /* 
6ca0: 46 69 6c 65 6e 61 6d 65 20 74 6f 20 66 72 65 65  Filename to free
6cb0: 20 77 68 65 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f   when closing */
6cc0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
6cd0: 56 66 73 3b 20 20 20 20 20 20 20 20 20 20 20 2f  Vfs;           /
6ce0: 2a 20 4e 61 6d 65 20 6f 66 20 56 46 53 20 74 6f  * Name of VFS to
6cf0: 20 75 73 65 20 2a 2f 0a 20 20 73 71 6c 69 74 65   use */.  sqlite
6d00: 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20  3_stmt *pStmt;  
6d10: 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 74 61 74   /* Current stat
6d20: 65 6d 65 6e 74 20 69 66 20 61 6e 79 2e 20 2a 2f  ement if any. */
6d30: 0a 20 20 46 49 4c 45 20 2a 70 4c 6f 67 3b 20 20  .  FILE *pLog;  
6d40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
6d50: 74 65 20 6c 6f 67 20 6f 75 74 70 75 74 20 68 65  te log output he
6d60: 72 65 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 49  re */.  int *aiI
6d70: 6e 64 65 6e 74 3b 20 20 20 20 20 20 20 20 20 2f  ndent;         /
6d80: 2a 20 41 72 72 61 79 20 6f 66 20 69 6e 64 65 6e  * Array of inden
6d90: 74 73 20 75 73 65 64 20 69 6e 20 4d 4f 44 45 5f  ts used in MODE_
6da0: 45 78 70 6c 61 69 6e 20 2a 2f 0a 20 20 69 6e 74  Explain */.  int
6db0: 20 6e 49 6e 64 65 6e 74 3b 20 20 20 20 20 20 20   nIndent;       
6dc0: 20 20 20 20 2f 2a 20 53 69 7a 65 20 6f 66 20 61      /* Size of a
6dd0: 72 72 61 79 20 61 69 49 6e 64 65 6e 74 5b 5d 20  rray aiIndent[] 
6de0: 2a 2f 0a 20 20 69 6e 74 20 69 49 6e 64 65 6e 74  */.  int iIndent
6df0: 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49  ;           /* I
6e00: 6e 64 65 78 20 6f 66 20 63 75 72 72 65 6e 74 20  ndex of current 
6e10: 6f 70 20 69 6e 20 61 69 49 6e 64 65 6e 74 5b 5d  op in aiIndent[]
6e20: 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
6e30: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
6e40: 53 53 49 4f 4e 29 0a 20 20 69 6e 74 20 6e 53 65  SSION).  int nSe
6e50: 73 73 69 6f 6e 3b 20 20 20 20 20 20 20 20 20 20  ssion;          
6e60: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
6e70: 61 63 74 69 76 65 20 73 65 73 73 69 6f 6e 73 20  active sessions 
6e80: 2a 2f 0a 20 20 4f 70 65 6e 53 65 73 73 69 6f 6e  */.  OpenSession
6e90: 20 61 53 65 73 73 69 6f 6e 5b 34 5d 3b 20 20 2f   aSession[4];  /
6ea0: 2a 20 41 72 72 61 79 20 6f 66 20 73 65 73 73 69  * Array of sessi
6eb0: 6f 6e 73 2e 20 20 5b 30 5d 20 69 73 20 69 6e 20  ons.  [0] is in 
6ec0: 66 6f 63 75 73 2e 20 2a 2f 0a 23 65 6e 64 69 66  focus. */.#endif
6ed0: 0a 20 20 45 78 70 65 72 74 49 6e 66 6f 20 65 78  .  ExpertInfo ex
6ee0: 70 65 72 74 3b 20 20 20 20 20 20 20 20 2f 2a 20  pert;        /* 
6ef0: 56 61 6c 69 64 20 69 66 20 70 72 65 76 69 6f 75  Valid if previou
6f00: 73 20 63 6f 6d 6d 61 6e 64 20 77 61 73 20 22 2e  s command was ".
6f10: 65 78 70 65 72 74 20 4f 50 54 2e 2e 2e 22 20 2a  expert OPT..." *
6f20: 2f 0a 7d 3b 0a 0a 2f 2a 20 41 6c 6c 6f 77 65 64  /.};../* Allowed
6f30: 20 76 61 6c 75 65 73 20 66 6f 72 20 53 68 65 6c   values for Shel
6f40: 6c 53 74 61 74 65 2e 61 75 74 6f 45 51 50 0a 2a  lState.autoEQP.*
6f50: 2f 0a 23 64 65 66 69 6e 65 20 41 55 54 4f 45 51  /.#define AUTOEQ
6f60: 50 5f 6f 66 66 20 20 20 20 20 20 30 0a 23 64 65  P_off      0.#de
6f70: 66 69 6e 65 20 41 55 54 4f 45 51 50 5f 6f 6e 20  fine AUTOEQP_on 
6f80: 20 20 20 20 20 20 31 0a 23 64 65 66 69 6e 65 20        1.#define 
6f90: 41 55 54 4f 45 51 50 5f 74 72 69 67 67 65 72 20  AUTOEQP_trigger 
6fa0: 20 32 0a 23 64 65 66 69 6e 65 20 41 55 54 4f 45   2.#define AUTOE
6fb0: 51 50 5f 66 75 6c 6c 20 20 20 20 20 33 0a 0a 2f  QP_full     3../
6fc0: 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74  *.** These are t
6fd0: 68 65 20 61 6c 6c 6f 77 65 64 20 73 68 65 6c 6c  he allowed shell
6fe0: 46 6c 67 73 20 76 61 6c 75 65 73 0a 2a 2f 0a 23  Flgs values.*/.#
6ff0: 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 50 61 67  define SHFLG_Pag
7000: 65 63 61 63 68 65 20 20 20 20 20 20 30 78 30 30  ecache      0x00
7010: 30 30 30 30 30 31 20 2f 2a 20 54 68 65 20 2d 2d  000001 /* The --
7020: 70 61 67 65 63 61 63 68 65 20 6f 70 74 69 6f 6e  pagecache option
7030: 20 69 73 20 75 73 65 64 20 2a 2f 0a 23 64 65 66   is used */.#def
7040: 69 6e 65 20 53 48 46 4c 47 5f 4c 6f 6f 6b 61 73  ine SHFLG_Lookas
7050: 69 64 65 20 20 20 20 20 20 30 78 30 30 30 30 30  ide      0x00000
7060: 30 30 32 20 2f 2a 20 4c 6f 6f 6b 61 73 69 64 65  002 /* Lookaside
7070: 20 6d 65 6d 6f 72 79 20 69 73 20 75 73 65 64 20   memory is used 
7080: 2a 2f 0a 23 64 65 66 69 6e 65 20 53 48 46 4c 47  */.#define SHFLG
7090: 5f 42 61 63 6b 73 6c 61 73 68 20 20 20 20 20 20  _Backslash      
70a0: 30 78 30 30 30 30 30 30 30 34 20 2f 2a 20 54 68  0x00000004 /* Th
70b0: 65 20 2d 2d 62 61 63 6b 73 6c 61 73 68 20 6f 70  e --backslash op
70c0: 74 69 6f 6e 20 69 73 20 75 73 65 64 20 2a 2f 0a  tion is used */.
70d0: 23 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 50 72  #define SHFLG_Pr
70e0: 65 73 65 72 76 65 52 6f 77 69 64 20 20 30 78 30  eserveRowid  0x0
70f0: 30 30 30 30 30 30 38 20 2f 2a 20 2e 64 75 6d 70  0000008 /* .dump
7100: 20 70 72 65 73 65 72 76 65 73 20 72 6f 77 69 64   preserves rowid
7110: 20 76 61 6c 75 65 73 20 2a 2f 0a 23 64 65 66 69   values */.#defi
7120: 6e 65 20 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65  ne SHFLG_Newline
7130: 73 20 20 20 20 20 20 20 30 78 30 30 30 30 30 30  s       0x000000
7140: 31 30 20 2f 2a 20 2e 64 75 6d 70 20 2d 2d 6e 65  10 /* .dump --ne
7150: 77 6c 69 6e 65 20 66 6c 61 67 20 2a 2f 0a 23 64  wline flag */.#d
7160: 65 66 69 6e 65 20 53 48 46 4c 47 5f 43 6f 75 6e  efine SHFLG_Coun
7170: 74 43 68 61 6e 67 65 73 20 20 20 30 78 30 30 30  tChanges   0x000
7180: 30 30 30 32 30 20 2f 2a 20 2e 63 68 61 6e 67 65  00020 /* .change
7190: 73 20 73 65 74 74 69 6e 67 20 2a 2f 0a 23 64 65  s setting */.#de
71a0: 66 69 6e 65 20 53 48 46 4c 47 5f 45 63 68 6f 20  fine SHFLG_Echo 
71b0: 20 20 20 20 20 20 20 20 20 20 30 78 30 30 30 30            0x0000
71c0: 30 30 34 30 20 2f 2a 20 2e 65 63 68 6f 20 6f 72  0040 /* .echo or
71d0: 20 2d 2d 65 63 68 6f 20 73 65 74 74 69 6e 67 20   --echo setting 
71e0: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73  */../*.** Macros
71f0: 20 66 6f 72 20 74 65 73 74 69 6e 67 20 61 6e 64   for testing and
7200: 20 73 65 74 74 69 6e 67 20 73 68 65 6c 6c 46 6c   setting shellFl
7210: 67 73 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 53 68  gs.*/.#define Sh
7220: 65 6c 6c 48 61 73 46 6c 61 67 28 50 2c 58 29 20  ellHasFlag(P,X) 
7230: 20 20 20 28 28 28 50 29 2d 3e 73 68 65 6c 6c 46     (((P)->shellF
7240: 6c 67 73 20 26 20 28 58 29 29 21 3d 30 29 0a 23  lgs & (X))!=0).#
7250: 64 65 66 69 6e 65 20 53 68 65 6c 6c 53 65 74 46  define ShellSetF
7260: 6c 61 67 28 50 2c 58 29 20 20 20 20 28 28 50 29  lag(P,X)    ((P)
7270: 2d 3e 73 68 65 6c 6c 46 6c 67 73 7c 3d 28 58 29  ->shellFlgs|=(X)
7280: 29 0a 23 64 65 66 69 6e 65 20 53 68 65 6c 6c 43  ).#define ShellC
7290: 6c 65 61 72 46 6c 61 67 28 50 2c 58 29 20 20 28  learFlag(P,X)  (
72a0: 28 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 26 3d  (P)->shellFlgs&=
72b0: 28 7e 28 58 29 29 29 0a 0a 2f 2a 0a 2a 2a 20 54  (~(X)))../*.** T
72c0: 68 65 73 65 20 61 72 65 20 74 68 65 20 61 6c 6c  hese are the all
72d0: 6f 77 65 64 20 6d 6f 64 65 73 2e 0a 2a 2f 0a 23  owed modes..*/.#
72e0: 64 65 66 69 6e 65 20 4d 4f 44 45 5f 4c 69 6e 65  define MODE_Line
72f0: 20 20 20 20 20 30 20 20 2f 2a 20 4f 6e 65 20 63       0  /* One c
7300: 6f 6c 75 6d 6e 20 70 65 72 20 6c 69 6e 65 2e 20  olumn per line. 
7310: 20 42 6c 61 6e 6b 20 6c 69 6e 65 20 62 65 74 77   Blank line betw
7320: 65 65 6e 20 72 65 63 6f 72 64 73 20 2a 2f 0a 23  een records */.#
7330: 64 65 66 69 6e 65 20 4d 4f 44 45 5f 43 6f 6c 75  define MODE_Colu
7340: 6d 6e 20 20 20 31 20 20 2f 2a 20 4f 6e 65 20 72  mn   1  /* One r
7350: 65 63 6f 72 64 20 70 65 72 20 6c 69 6e 65 20 69  ecord per line i
7360: 6e 20 6e 65 61 74 20 63 6f 6c 75 6d 6e 73 20 2a  n neat columns *
7370: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 4c  /.#define MODE_L
7380: 69 73 74 20 20 20 20 20 32 20 20 2f 2a 20 4f 6e  ist     2  /* On
7390: 65 20 72 65 63 6f 72 64 20 70 65 72 20 6c 69 6e  e record per lin
73a0: 65 20 77 69 74 68 20 61 20 73 65 70 61 72 61 74  e with a separat
73b0: 6f 72 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  or */.#define MO
73c0: 44 45 5f 53 65 6d 69 20 20 20 20 20 33 20 20 2f  DE_Semi     3  /
73d0: 2a 20 53 61 6d 65 20 61 73 20 4d 4f 44 45 5f 4c  * Same as MODE_L
73e0: 69 73 74 20 62 75 74 20 61 70 70 65 6e 64 20 22  ist but append "
73f0: 3b 22 20 74 6f 20 65 61 63 68 20 6c 69 6e 65 20  ;" to each line 
7400: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
7410: 48 74 6d 6c 20 20 20 20 20 34 20 20 2f 2a 20 47  Html     4  /* G
7420: 65 6e 65 72 61 74 65 20 61 6e 20 58 48 54 4d 4c  enerate an XHTML
7430: 20 74 61 62 6c 65 20 2a 2f 0a 23 64 65 66 69 6e   table */.#defin
7440: 65 20 4d 4f 44 45 5f 49 6e 73 65 72 74 20 20 20  e MODE_Insert   
7450: 35 20 20 2f 2a 20 47 65 6e 65 72 61 74 65 20 53  5  /* Generate S
7460: 51 4c 20 22 69 6e 73 65 72 74 22 20 73 74 61 74  QL "insert" stat
7470: 65 6d 65 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e  ements */.#defin
7480: 65 20 4d 4f 44 45 5f 51 75 6f 74 65 20 20 20 20  e MODE_Quote    
7490: 36 20 20 2f 2a 20 51 75 6f 74 65 20 76 61 6c 75  6  /* Quote valu
74a0: 65 73 20 61 73 20 66 6f 72 20 53 51 4c 20 2a 2f  es as for SQL */
74b0: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 54 63  .#define MODE_Tc
74c0: 6c 20 20 20 20 20 20 37 20 20 2f 2a 20 47 65 6e  l      7  /* Gen
74d0: 65 72 61 74 65 20 41 4e 53 49 2d 43 20 6f 72 20  erate ANSI-C or 
74e0: 54 43 4c 20 71 75 6f 74 65 64 20 65 6c 65 6d 65  TCL quoted eleme
74f0: 6e 74 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  nts */.#define M
7500: 4f 44 45 5f 43 73 76 20 20 20 20 20 20 38 20 20  ODE_Csv      8  
7510: 2f 2a 20 51 75 6f 74 65 20 73 74 72 69 6e 67 73  /* Quote strings
7520: 2c 20 6e 75 6d 62 65 72 73 20 61 72 65 20 70 6c  , numbers are pl
7530: 61 69 6e 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d  ain */.#define M
7540: 4f 44 45 5f 45 78 70 6c 61 69 6e 20 20 39 20 20  ODE_Explain  9  
7550: 2f 2a 20 4c 69 6b 65 20 4d 4f 44 45 5f 43 6f 6c  /* Like MODE_Col
7560: 75 6d 6e 2c 20 62 75 74 20 64 6f 20 6e 6f 74 20  umn, but do not 
7570: 74 72 75 6e 63 61 74 65 20 64 61 74 61 20 2a 2f  truncate data */
7580: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 41 73  .#define MODE_As
7590: 63 69 69 20 20 20 31 30 20 20 2f 2a 20 55 73 65  cii   10  /* Use
75a0: 20 41 53 43 49 49 20 75 6e 69 74 20 61 6e 64 20   ASCII unit and 
75b0: 72 65 63 6f 72 64 20 73 65 70 61 72 61 74 6f 72  record separator
75c0: 73 20 28 30 78 31 46 2f 30 78 31 45 29 20 2a 2f  s (0x1F/0x1E) */
75d0: 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 50 72  .#define MODE_Pr
75e0: 65 74 74 79 20 20 31 31 20 20 2f 2a 20 50 72 65  etty  11  /* Pre
75f0: 74 74 79 2d 70 72 69 6e 74 20 73 63 68 65 6d 61  tty-print schema
7600: 73 20 2a 2f 0a 0a 73 74 61 74 69 63 20 63 6f 6e  s */..static con
7610: 73 74 20 63 68 61 72 20 2a 6d 6f 64 65 44 65 73  st char *modeDes
7620: 63 72 5b 5d 20 3d 20 7b 0a 20 20 22 6c 69 6e 65  cr[] = {.  "line
7630: 22 2c 0a 20 20 22 63 6f 6c 75 6d 6e 22 2c 0a 20  ",.  "column",. 
7640: 20 22 6c 69 73 74 22 2c 0a 20 20 22 73 65 6d 69   "list",.  "semi
7650: 22 2c 0a 20 20 22 68 74 6d 6c 22 2c 0a 20 20 22  ",.  "html",.  "
7660: 69 6e 73 65 72 74 22 2c 0a 20 20 22 71 75 6f 74  insert",.  "quot
7670: 65 22 2c 0a 20 20 22 74 63 6c 22 2c 0a 20 20 22  e",.  "tcl",.  "
7680: 63 73 76 22 2c 0a 20 20 22 65 78 70 6c 61 69 6e  csv",.  "explain
7690: 22 2c 0a 20 20 22 61 73 63 69 69 22 2c 0a 20 20  ",.  "ascii",.  
76a0: 22 70 72 65 74 74 79 70 72 69 6e 74 22 2c 0a 7d  "prettyprint",.}
76b0: 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20 61  ;../*.** These a
76c0: 72 65 20 74 68 65 20 63 6f 6c 75 6d 6e 2f 72 6f  re the column/ro
76d0: 77 2f 6c 69 6e 65 20 73 65 70 61 72 61 74 6f 72  w/line separator
76e0: 73 20 75 73 65 64 20 62 79 20 74 68 65 20 76 61  s used by the va
76f0: 72 69 6f 75 73 0a 2a 2a 20 69 6d 70 6f 72 74 2f  rious.** import/
7700: 65 78 70 6f 72 74 20 6d 6f 64 65 73 2e 0a 2a 2f  export modes..*/
7710: 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 43 6f 6c  .#define SEP_Col
7720: 75 6d 6e 20 20 20 20 22 7c 22 0a 23 64 65 66 69  umn    "|".#defi
7730: 6e 65 20 53 45 50 5f 52 6f 77 20 20 20 20 20 20  ne SEP_Row      
7740: 20 22 5c 6e 22 0a 23 64 65 66 69 6e 65 20 53 45   "\n".#define SE
7750: 50 5f 54 61 62 20 20 20 20 20 20 20 22 5c 74 22  P_Tab       "\t"
7760: 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 53 70 61  .#define SEP_Spa
7770: 63 65 20 20 20 20 20 22 20 22 0a 23 64 65 66 69  ce     " ".#defi
7780: 6e 65 20 53 45 50 5f 43 6f 6d 6d 61 20 20 20 20  ne SEP_Comma    
7790: 20 22 2c 22 0a 23 64 65 66 69 6e 65 20 53 45 50   ",".#define SEP
77a0: 5f 43 72 4c 66 20 20 20 20 20 20 22 5c 72 5c 6e  _CrLf      "\r\n
77b0: 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 55 6e  ".#define SEP_Un
77c0: 69 74 20 20 20 20 20 20 22 5c 78 31 46 22 0a 23  it      "\x1F".#
77d0: 64 65 66 69 6e 65 20 53 45 50 5f 52 65 63 6f 72  define SEP_Recor
77e0: 64 20 20 20 20 22 5c 78 31 45 22 0a 0a 2f 2a 0a  d    "\x1E"../*.
77f0: 2a 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 6c 65  ** Number of ele
7800: 6d 65 6e 74 73 20 69 6e 20 61 6e 20 61 72 72 61  ments in an arra
7810: 79 0a 2a 2f 0a 23 64 65 66 69 6e 65 20 41 72 72  y.*/.#define Arr
7820: 61 79 53 69 7a 65 28 58 29 20 20 28 69 6e 74 29  aySize(X)  (int)
7830: 28 73 69 7a 65 6f 66 28 58 29 2f 73 69 7a 65 6f  (sizeof(X)/sizeo
7840: 66 28 58 5b 30 5d 29 29 0a 0a 2f 2a 0a 2a 2a 20  f(X[0]))../*.** 
7850: 41 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 74  A callback for t
7860: 68 65 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29  he sqlite3_log()
7870: 20 69 6e 74 65 72 66 61 63 65 2e 0a 2a 2f 0a 73   interface..*/.s
7880: 74 61 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c  tatic void shell
7890: 4c 6f 67 28 76 6f 69 64 20 2a 70 41 72 67 2c 20  Log(void *pArg, 
78a0: 69 6e 74 20 69 45 72 72 43 6f 64 65 2c 20 63 6f  int iErrCode, co
78b0: 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 29 7b  nst char *zMsg){
78c0: 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
78d0: 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 2a 29   = (ShellState*)
78e0: 70 41 72 67 3b 0a 20 20 69 66 28 20 70 2d 3e 70  pArg;.  if( p->p
78f0: 4c 6f 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  Log==0 ) return;
7900: 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70  .  utf8_printf(p
7910: 2d 3e 70 4c 6f 67 2c 20 22 28 25 64 29 20 25 73  ->pLog, "(%d) %s
7920: 5c 6e 22 2c 20 69 45 72 72 43 6f 64 65 2c 20 7a  \n", iErrCode, z
7930: 4d 73 67 29 3b 0a 20 20 66 66 6c 75 73 68 28 70  Msg);.  fflush(p
7940: 2d 3e 70 4c 6f 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ->pLog);.}../*.*
7950: 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67 69 76  * Output the giv
7960: 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20 68  en string as a h
7970: 65 78 2d 65 6e 63 6f 64 65 64 20 62 6c 6f 62 20  ex-encoded blob 
7980: 28 65 67 2e 20 58 27 31 32 33 34 27 20 29 0a 2a  (eg. X'1234' ).*
7990: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75  /.static void ou
79a0: 74 70 75 74 5f 68 65 78 5f 62 6c 6f 62 28 46 49  tput_hex_blob(FI
79b0: 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 76  LE *out, const v
79c0: 6f 69 64 20 2a 70 42 6c 6f 62 2c 20 69 6e 74 20  oid *pBlob, int 
79d0: 6e 42 6c 6f 62 29 7b 0a 20 20 69 6e 74 20 69 3b  nBlob){.  int i;
79e0: 0a 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 20 3d  .  char *zBlob =
79f0: 20 28 63 68 61 72 20 2a 29 70 42 6c 6f 62 3b 0a   (char *)pBlob;.
7a00: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
7a10: 2c 22 58 27 22 29 3b 0a 20 20 66 6f 72 28 69 3d  ,"X'");.  for(i=
7a20: 30 3b 20 69 3c 6e 42 6c 6f 62 3b 20 69 2b 2b 29  0; i<nBlob; i++)
7a30: 7b 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74  { raw_printf(out
7a40: 2c 22 25 30 32 78 22 2c 7a 42 6c 6f 62 5b 69 5d  ,"%02x",zBlob[i]
7a50: 26 30 78 66 66 29 3b 20 7d 0a 20 20 72 61 77 5f  &0xff); }.  raw_
7a60: 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 22 29 3b  printf(out,"'");
7a70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61  .}../*.** Find a
7a80: 20 73 74 72 69 6e 67 20 74 68 61 74 20 69 73 20   string that is 
7a90: 6e 6f 74 20 66 6f 75 6e 64 20 61 6e 79 77 68 65  not found anywhe
7aa0: 72 65 20 69 6e 20 7a 5b 5d 2e 20 20 52 65 74 75  re in z[].  Retu
7ab0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 0a 2a 2a 20  rn a pointer.** 
7ac0: 74 6f 20 74 68 61 74 20 73 74 72 69 6e 67 2e 0a  to that string..
7ad0: 2a 2a 0a 2a 2a 20 54 72 79 20 74 6f 20 75 73 65  **.** Try to use
7ae0: 20 7a 41 20 61 6e 64 20 7a 42 20 66 69 72 73 74   zA and zB first
7af0: 2e 20 20 49 66 20 62 6f 74 68 20 6f 66 20 74 68  .  If both of th
7b00: 6f 73 65 20 61 72 65 20 61 6c 72 65 61 64 79 20  ose are already 
7b10: 66 6f 75 6e 64 20 69 6e 20 7a 5b 5d 0a 2a 2a 20  found in z[].** 
7b20: 74 68 65 6e 20 6d 61 6b 65 20 75 70 20 73 6f 6d  then make up som
7b30: 65 20 73 74 72 69 6e 67 20 61 6e 64 20 73 74 6f  e string and sto
7b40: 72 65 20 69 74 20 69 6e 20 74 68 65 20 62 75 66  re it in the buf
7b50: 66 65 72 20 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61  fer zBuf..*/.sta
7b60: 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  tic const char *
7b70: 75 6e 75 73 65 64 5f 73 74 72 69 6e 67 28 0a 20  unused_string(. 
7b80: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20   const char *z, 
7b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7ba0: 20 20 20 2f 2a 20 52 65 73 75 6c 74 20 6d 75 73     /* Result mus
7bb0: 74 20 6e 6f 74 20 61 70 70 65 61 72 20 61 6e 79  t not appear any
7bc0: 77 68 65 72 65 20 69 6e 20 7a 20 2a 2f 0a 20 20  where in z */.  
7bd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 2c 20  const char *zA, 
7be0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 42 2c 20  const char *zB, 
7bf0: 20 20 2f 2a 20 54 72 79 20 74 68 65 73 65 20 66    /* Try these f
7c00: 69 72 73 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  irst */.  char *
7c10: 7a 42 75 66 20 20 20 20 20 20 20 20 20 20 20 20  zBuf            
7c20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
7c30: 70 61 63 65 20 74 6f 20 73 74 6f 72 65 20 61 20  pace to store a 
7c40: 67 65 6e 65 72 61 74 65 64 20 73 74 72 69 6e 67  generated string
7c50: 20 2a 2f 0a 29 7b 0a 20 20 75 6e 73 69 67 6e 65   */.){.  unsigne
7c60: 64 20 69 20 3d 20 30 3b 0a 20 20 69 66 28 20 73  d i = 0;.  if( s
7c70: 74 72 73 74 72 28 7a 2c 20 7a 41 29 3d 3d 30 20  trstr(z, zA)==0 
7c80: 29 20 72 65 74 75 72 6e 20 7a 41 3b 0a 20 20 69  ) return zA;.  i
7c90: 66 28 20 73 74 72 73 74 72 28 7a 2c 20 7a 42 29  f( strstr(z, zB)
7ca0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 7a 42 3b  ==0 ) return zB;
7cb0: 0a 20 20 64 6f 7b 0a 20 20 20 20 73 71 6c 69 74  .  do{.    sqlit
7cc0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 32 30 2c 7a  e3_snprintf(20,z
7cd0: 42 75 66 2c 22 28 25 73 25 75 29 22 2c 20 7a 41  Buf,"(%s%u)", zA
7ce0: 2c 20 69 2b 2b 29 3b 0a 20 20 7d 77 68 69 6c 65  , i++);.  }while
7cf0: 28 20 73 74 72 73 74 72 28 7a 2c 7a 42 75 66 29  ( strstr(z,zBuf)
7d00: 21 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  !=0 );.  return 
7d10: 7a 42 75 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f  zBuf;.}../*.** O
7d20: 75 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 20  utput the given 
7d30: 73 74 72 69 6e 67 20 61 73 20 61 20 71 75 6f 74  string as a quot
7d40: 65 64 20 73 74 72 69 6e 67 20 75 73 69 6e 67 20  ed string using 
7d50: 53 51 4c 20 71 75 6f 74 69 6e 67 20 63 6f 6e 76  SQL quoting conv
7d60: 65 6e 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 53  entions..**.** S
7d70: 65 65 20 61 6c 73 6f 3a 20 6f 75 74 70 75 74 5f  ee also: output_
7d80: 71 75 6f 74 65 64 5f 65 73 63 61 70 65 64 5f 73  quoted_escaped_s
7d90: 74 72 69 6e 67 28 29 0a 2a 2f 0a 73 74 61 74 69  tring().*/.stati
7da0: 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 71 75  c void output_qu
7db0: 6f 74 65 64 5f 73 74 72 69 6e 67 28 46 49 4c 45  oted_string(FILE
7dc0: 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61   *out, const cha
7dd0: 72 20 2a 7a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  r *z){.  int i;.
7de0: 20 20 63 68 61 72 20 63 3b 0a 20 20 73 65 74 42    char c;.  setB
7df0: 69 6e 61 72 79 4d 6f 64 65 28 6f 75 74 2c 20 31  inaryMode(out, 1
7e00: 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 28 63  );.  for(i=0; (c
7e10: 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63   = z[i])!=0 && c
7e20: 21 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20  !='\''; i++){}. 
7e30: 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20   if( c==0 ){.   
7e40: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74   utf8_printf(out
7e50: 2c 22 27 25 73 27 22 2c 7a 29 3b 0a 20 20 7d 65  ,"'%s'",z);.  }e
7e60: 6c 73 65 7b 0a 20 20 20 20 72 61 77 5f 70 72 69  lse{.    raw_pri
7e70: 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b 0a 20  ntf(out, "'");. 
7e80: 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a     while( *z ){.
7e90: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 28        for(i=0; (
7ea0: 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26 26 20  c = z[i])!=0 && 
7eb0: 63 21 3d 27 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a  c!='\''; i++){}.
7ec0: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27        if( c=='\'
7ed0: 27 20 29 20 69 2b 2b 3b 0a 20 20 20 20 20 20 69  ' ) i++;.      i
7ee0: 66 28 20 69 20 29 7b 0a 20 20 20 20 20 20 20 20  f( i ){.        
7ef0: 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
7f00: 20 22 25 2e 2a 73 22 2c 20 69 2c 20 7a 29 3b 0a   "%.*s", i, z);.
7f10: 20 20 20 20 20 20 20 20 7a 20 2b 3d 20 69 3b 0a          z += i;.
7f20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
7f30: 28 20 63 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20  ( c=='\'' ){.   
7f40: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
7f50: 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 20  out, "'");.     
7f60: 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
7f70: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
7f80: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62  ==0 ){.        b
7f90: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
7fa0: 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20      z++;.    }. 
7fb0: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
7fc0: 74 2c 20 22 27 22 29 3b 0a 20 20 7d 0a 20 20 73  t, "'");.  }.  s
7fd0: 65 74 54 65 78 74 4d 6f 64 65 28 6f 75 74 2c 20  etTextMode(out, 
7fe0: 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74  1);.}../*.** Out
7ff0: 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73 74  put the given st
8000: 72 69 6e 67 20 61 73 20 61 20 71 75 6f 74 65 64  ring as a quoted
8010: 20 73 74 72 69 6e 67 20 75 73 69 6e 67 20 53 51   string using SQ
8020: 4c 20 71 75 6f 74 69 6e 67 20 63 6f 6e 76 65 6e  L quoting conven
8030: 74 69 6f 6e 73 2e 0a 2a 2a 20 41 64 64 69 74 69  tions..** Additi
8040: 6f 6e 61 6c 6c 6c 79 20 2c 20 65 73 63 61 70 65  onallly , escape
8050: 20 74 68 65 20 22 5c 6e 22 20 61 6e 64 20 22 5c   the "\n" and "\
8060: 72 22 20 63 68 61 72 61 63 74 65 72 73 20 73 6f  r" characters so
8070: 20 74 68 61 74 20 74 68 65 79 20 64 6f 20 6e 6f   that they do no
8080: 74 0a 2a 2a 20 67 65 74 20 63 6f 72 72 75 70 74  t.** get corrupt
8090: 65 64 20 62 79 20 65 6e 64 2d 6f 66 2d 6c 69 6e  ed by end-of-lin
80a0: 65 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 66 61  e translation fa
80b0: 63 69 6c 69 74 69 65 73 20 69 6e 20 73 6f 6d 65  cilities in some
80c0: 20 6f 70 65 72 61 74 69 6e 67 0a 2a 2a 20 73 79   operating.** sy
80d0: 73 74 65 6d 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  stems..**.** Thi
80e0: 73 20 69 73 20 6c 69 6b 65 20 6f 75 74 70 75 74  s is like output
80f0: 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 29  _quoted_string()
8100: 20 62 75 74 20 77 69 74 68 20 74 68 65 20 61 64   but with the ad
8110: 64 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 5c 72  dition of the \r
8120: 5c 6e 0a 2a 2a 20 65 73 63 61 70 65 20 6d 65 63  \n.** escape mec
8130: 68 61 6e 69 73 6d 2e 0a 2a 2f 0a 73 74 61 74 69  hanism..*/.stati
8140: 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 71 75  c void output_qu
8150: 6f 74 65 64 5f 65 73 63 61 70 65 64 5f 73 74 72  oted_escaped_str
8160: 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63  ing(FILE *out, c
8170: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
8180: 20 69 6e 74 20 69 3b 0a 20 20 63 68 61 72 20 63   int i;.  char c
8190: 3b 0a 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64  ;.  setBinaryMod
81a0: 65 28 6f 75 74 2c 20 31 29 3b 0a 20 20 66 6f 72  e(out, 1);.  for
81b0: 28 69 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29  (i=0; (c = z[i])
81c0: 21 3d 30 20 26 26 20 63 21 3d 27 5c 27 27 20 26  !=0 && c!='\'' &
81d0: 26 20 63 21 3d 27 5c 6e 27 20 26 26 20 63 21 3d  & c!='\n' && c!=
81e0: 27 5c 72 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69  '\r'; i++){}.  i
81f0: 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75  f( c==0 ){.    u
8200: 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22  tf8_printf(out,"
8210: 27 25 73 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73  '%s'",z);.  }els
8220: 65 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  e{.    const cha
8230: 72 20 2a 7a 4e 4c 20 3d 20 30 3b 0a 20 20 20 20  r *zNL = 0;.    
8240: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 52 20  const char *zCR 
8250: 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 4e 4c  = 0;.    int nNL
8260: 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 6e 43   = 0;.    int nC
8270: 52 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20  R = 0;.    char 
8280: 7a 42 75 66 31 5b 32 30 5d 2c 20 7a 42 75 66 32  zBuf1[20], zBuf2
8290: 5b 32 30 5d 3b 0a 20 20 20 20 66 6f 72 28 69 3d  [20];.    for(i=
82a0: 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
82b0: 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27       if( z[i]=='
82c0: 5c 6e 27 20 29 20 6e 4e 4c 2b 2b 3b 0a 20 20 20  \n' ) nNL++;.   
82d0: 20 20 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 72     if( z[i]=='\r
82e0: 27 20 29 20 6e 43 52 2b 2b 3b 0a 20 20 20 20 7d  ' ) nCR++;.    }
82f0: 0a 20 20 20 20 69 66 28 20 6e 4e 4c 20 29 7b 0a  .    if( nNL ){.
8300: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
8310: 28 6f 75 74 2c 20 22 72 65 70 6c 61 63 65 28 22  (out, "replace("
8320: 29 3b 0a 20 20 20 20 20 20 7a 4e 4c 20 3d 20 75  );.      zNL = u
8330: 6e 75 73 65 64 5f 73 74 72 69 6e 67 28 7a 2c 20  nused_string(z, 
8340: 22 5c 5c 6e 22 2c 20 22 5c 5c 30 31 32 22 2c 20  "\\n", "\\012", 
8350: 7a 42 75 66 31 29 3b 0a 20 20 20 20 7d 0a 20 20  zBuf1);.    }.  
8360: 20 20 69 66 28 20 6e 43 52 20 29 7b 0a 20 20 20    if( nCR ){.   
8370: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
8380: 74 2c 20 22 72 65 70 6c 61 63 65 28 22 29 3b 0a  t, "replace(");.
8390: 20 20 20 20 20 20 7a 43 52 20 3d 20 75 6e 75 73        zCR = unus
83a0: 65 64 5f 73 74 72 69 6e 67 28 7a 2c 20 22 5c 5c  ed_string(z, "\\
83b0: 72 22 2c 20 22 5c 5c 30 31 35 22 2c 20 7a 42 75  r", "\\015", zBu
83c0: 66 32 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  f2);.    }.    r
83d0: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
83e0: 27 22 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  '");.    while( 
83f0: 2a 7a 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  *z ){.      for(
8400: 69 3d 30 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21  i=0; (c = z[i])!
8410: 3d 30 20 26 26 20 63 21 3d 27 5c 6e 27 20 26 26  =0 && c!='\n' &&
8420: 20 63 21 3d 27 5c 72 27 20 26 26 20 63 21 3d 27   c!='\r' && c!='
8430: 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  \''; i++){}.    
8440: 20 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 20    if( c=='\'' ) 
8450: 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69  i++;.      if( i
8460: 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
8470: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2e  _printf(out, "%.
8480: 2a 73 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 20 20  *s", i, z);.    
8490: 20 20 20 20 7a 20 2b 3d 20 69 3b 0a 20 20 20 20      z += i;.    
84a0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
84b0: 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20  ='\'' ){.       
84c0: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
84d0: 20 22 27 22 29 3b 0a 20 20 20 20 20 20 20 20 63   "'");.        c
84e0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
84f0: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
8500: 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
8510: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8520: 7a 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 63  z++;.      if( c
8530: 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20 20  =='\n' ){.      
8540: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
8550: 2c 20 22 25 73 22 2c 20 7a 4e 4c 29 3b 0a 20 20  , "%s", zNL);.  
8560: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
8570: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61        }.      ra
8580: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  w_printf(out, "%
8590: 73 22 2c 20 7a 43 52 29 3b 0a 20 20 20 20 7d 0a  s", zCR);.    }.
85a0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
85b0: 75 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 69 66  ut, "'");.    if
85c0: 28 20 6e 43 52 20 29 7b 0a 20 20 20 20 20 20 72  ( nCR ){.      r
85d0: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
85e0: 2c 27 25 73 27 2c 63 68 61 72 28 31 33 29 29 22  ,'%s',char(13))"
85f0: 2c 20 7a 43 52 29 3b 0a 20 20 20 20 7d 0a 20 20  , zCR);.    }.  
8600: 20 20 69 66 28 20 6e 4e 4c 20 29 7b 0a 20 20 20    if( nNL ){.   
8610: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
8620: 74 2c 20 22 2c 27 25 73 27 2c 63 68 61 72 28 31  t, ",'%s',char(1
8630: 30 29 29 22 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20  0))", zNL);.    
8640: 7d 0a 20 20 7d 0a 20 20 73 65 74 54 65 78 74 4d  }.  }.  setTextM
8650: 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a 7d 0a 0a  ode(out, 1);.}..
8660: 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68 65  /*.** Output the
8670: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 61 73   given string as
8680: 20 61 20 71 75 6f 74 65 64 20 61 63 63 6f 72 64   a quoted accord
8690: 69 6e 67 20 74 6f 20 43 20 6f 72 20 54 43 4c 20  ing to C or TCL 
86a0: 71 75 6f 74 69 6e 67 20 72 75 6c 65 73 2e 0a 2a  quoting rules..*
86b0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f 75  /.static void ou
86c0: 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 46 49  tput_c_string(FI
86d0: 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63  LE *out, const c
86e0: 68 61 72 20 2a 7a 29 7b 0a 20 20 75 6e 73 69 67  har *z){.  unsig
86f0: 6e 65 64 20 69 6e 74 20 63 3b 0a 20 20 66 70 75  ned int c;.  fpu
8700: 74 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20  tc('"', out);.  
8710: 77 68 69 6c 65 28 20 28 63 20 3d 20 2a 28 7a 2b  while( (c = *(z+
8720: 2b 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69 66  +))!=0 ){.    if
8730: 28 20 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20  ( c=='\\' ){.   
8740: 20 20 20 66 70 75 74 63 28 63 2c 20 6f 75 74 29     fputc(c, out)
8750: 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28 63 2c  ;.      fputc(c,
8760: 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65   out);.    }else
8770: 20 69 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20   if( c=='"' ){. 
8780: 20 20 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c       fputc('\\',
8790: 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75   out);.      fpu
87a0: 74 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a 20 20  tc('"', out);.  
87b0: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
87c0: 5c 74 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75  \t' ){.      fpu
87d0: 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20  tc('\\', out);. 
87e0: 20 20 20 20 20 66 70 75 74 63 28 27 74 27 2c 20       fputc('t', 
87f0: 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  out);.    }else 
8800: 69 66 28 20 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20  if( c=='\n' ){. 
8810: 20 20 20 20 20 66 70 75 74 63 28 27 5c 5c 27 2c       fputc('\\',
8820: 20 6f 75 74 29 3b 0a 20 20 20 20 20 20 66 70 75   out);.      fpu
8830: 74 63 28 27 6e 27 2c 20 6f 75 74 29 3b 0a 20 20  tc('n', out);.  
8840: 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
8850: 5c 72 27 20 29 7b 0a 20 20 20 20 20 20 66 70 75  \r' ){.      fpu
8860: 74 63 28 27 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20  tc('\\', out);. 
8870: 20 20 20 20 20 66 70 75 74 63 28 27 72 27 2c 20       fputc('r', 
8880: 6f 75 74 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  out);.    }else 
8890: 69 66 28 20 21 69 73 70 72 69 6e 74 28 63 26 30  if( !isprint(c&0
88a0: 78 66 66 29 20 29 7b 0a 20 20 20 20 20 20 72 61  xff) ){.      ra
88b0: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 5c  w_printf(out, "\
88c0: 5c 25 30 33 6f 22 2c 20 63 26 30 78 66 66 29 3b  \%03o", c&0xff);
88d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
88e0: 20 20 66 70 75 74 63 28 63 2c 20 6f 75 74 29 3b    fputc(c, out);
88f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 70 75  .    }.  }.  fpu
8900: 74 63 28 27 22 27 2c 20 6f 75 74 29 3b 0a 7d 0a  tc('"', out);.}.
8910: 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 74 68  ./*.** Output th
8920: 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 77  e given string w
8930: 69 74 68 20 63 68 61 72 61 63 74 65 72 73 20 74  ith characters t
8940: 68 61 74 20 61 72 65 20 73 70 65 63 69 61 6c 20  hat are special 
8950: 74 6f 0a 2a 2a 20 48 54 4d 4c 20 65 73 63 61 70  to.** HTML escap
8960: 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ed..*/.static vo
8970: 69 64 20 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73  id output_html_s
8980: 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75 74 2c  tring(FILE *out,
8990: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b   const char *z){
89a0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
89b0: 7a 3d 3d 30 20 29 20 7a 20 3d 20 22 22 3b 0a 20  z==0 ) z = "";. 
89c0: 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20   while( *z ){.  
89d0: 20 20 66 6f 72 28 69 3d 30 3b 20 20 20 7a 5b 69    for(i=0;   z[i
89e0: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 26 26  ].            &&
89f0: 20 7a 5b 69 5d 21 3d 27 3c 27 0a 20 20 20 20 20   z[i]!='<'.     
8a00: 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d         && z[i]!=
8a10: 27 26 27 0a 20 20 20 20 20 20 20 20 20 20 20 20  '&'.            
8a20: 26 26 20 7a 5b 69 5d 21 3d 27 3e 27 0a 20 20 20  && z[i]!='>'.   
8a30: 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69 5d           && z[i]
8a40: 21 3d 27 5c 22 27 0a 20 20 20 20 20 20 20 20 20  !='\"'.         
8a50: 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 5c 27 27     && z[i]!='\''
8a60: 3b 0a 20 20 20 20 20 20 20 20 69 2b 2b 29 7b 7d  ;.        i++){}
8a70: 0a 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a  .    if( i>0 ){.
8a80: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
8a90: 66 28 6f 75 74 2c 22 25 2e 2a 73 22 2c 69 2c 7a  f(out,"%.*s",i,z
8aa0: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  );.    }.    if(
8ab0: 20 7a 5b 69 5d 3d 3d 27 3c 27 20 29 7b 0a 20 20   z[i]=='<' ){.  
8ac0: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f      raw_printf(o
8ad0: 75 74 2c 22 26 6c 74 3b 22 29 3b 0a 20 20 20 20  ut,"&lt;");.    
8ae0: 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d  }else if( z[i]==
8af0: 27 26 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77  '&' ){.      raw
8b00: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 61 6d  _printf(out,"&am
8b10: 70 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  p;");.    }else 
8b20: 69 66 28 20 7a 5b 69 5d 3d 3d 27 3e 27 20 29 7b  if( z[i]=='>' ){
8b30: 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
8b40: 66 28 6f 75 74 2c 22 26 67 74 3b 22 29 3b 0a 20  f(out,"&gt;");. 
8b50: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 5b 69     }else if( z[i
8b60: 5d 3d 3d 27 5c 22 27 20 29 7b 0a 20 20 20 20 20  ]=='\"' ){.     
8b70: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
8b80: 22 26 71 75 6f 74 3b 22 29 3b 0a 20 20 20 20 7d  "&quot;");.    }
8b90: 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  else if( z[i]=='
8ba0: 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77  \'' ){.      raw
8bb0: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 23 33  _printf(out,"&#3
8bc0: 39 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  9;");.    }else{
8bd0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8be0: 20 20 7d 0a 20 20 20 20 7a 20 2b 3d 20 69 20 2b    }.    z += i +
8bf0: 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a   1;.  }.}../*.**
8c00: 20 49 66 20 61 20 66 69 65 6c 64 20 63 6f 6e 74   If a field cont
8c10: 61 69 6e 73 20 61 6e 79 20 63 68 61 72 61 63 74  ains any charact
8c20: 65 72 20 69 64 65 6e 74 69 66 69 65 64 20 62 79  er identified by
8c30: 20 61 20 31 20 69 6e 20 74 68 65 20 66 6f 6c 6c   a 1 in the foll
8c40: 6f 77 69 6e 67 0a 2a 2a 20 61 72 72 61 79 2c 20  owing.** array, 
8c50: 74 68 65 6e 20 74 68 65 20 73 74 72 69 6e 67 20  then the string 
8c60: 6d 75 73 74 20 62 65 20 71 75 6f 74 65 64 20 66  must be quoted f
8c70: 6f 72 20 43 53 56 2e 0a 2a 2f 0a 73 74 61 74 69  or CSV..*/.stati
8c80: 63 20 63 6f 6e 73 74 20 63 68 61 72 20 6e 65 65  c const char nee
8c90: 64 43 73 76 51 75 6f 74 65 5b 5d 20 3d 20 7b 0a  dCsvQuote[] = {.
8ca0: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
8cb0: 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31   1, 1, 1,   1, 1
8cc0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
8cd0: 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,.  1, 1, 1, 1
8ce0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
8cf0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
8d00: 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 30 2c 20  , 1, 1,.  1, 0, 
8d10: 31 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 31  1, 0, 0, 0, 0, 1
8d20: 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,   0, 0, 0, 0, 
8d30: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c  0, 0, 0, 0,.  0,
8d40: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
8d50: 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c  0, 0,   0, 0, 0,
8d60: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a   0, 0, 0, 0, 0,.
8d70: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
8d80: 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30   0, 0, 0,   0, 0
8d90: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
8da0: 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,.  0, 0, 0, 0
8db0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20  , 0, 0, 0, 0,   
8dc0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
8dd0: 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20  , 0, 0,.  0, 0, 
8de0: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
8df0: 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,   0, 0, 0, 0, 
8e00: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c  0, 0, 0, 0,.  0,
8e10: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
8e20: 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c  0, 0,   0, 0, 0,
8e30: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 0a   0, 0, 0, 0, 1,.
8e40: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
8e50: 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31   1, 1, 1,   1, 1
8e60: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
8e70: 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,.  1, 1, 1, 1
8e80: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
8e90: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
8ea0: 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20  , 1, 1,.  1, 1, 
8eb0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
8ec0: 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,   1, 1, 1, 1, 
8ed0: 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c  1, 1, 1, 1,.  1,
8ee0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
8ef0: 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c  1, 1,   1, 1, 1,
8f00: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a   1, 1, 1, 1, 1,.
8f10: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
8f20: 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31   1, 1, 1,   1, 1
8f30: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
8f40: 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,.  1, 1, 1, 1
8f50: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
8f60: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
8f70: 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20  , 1, 1,.  1, 1, 
8f80: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
8f90: 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,   1, 1, 1, 1, 
8fa0: 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c  1, 1, 1, 1,.  1,
8fb0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
8fc0: 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c  1, 1,   1, 1, 1,
8fd0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a   1, 1, 1, 1, 1,.
8fe0: 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74  };../*.** Output
8ff0: 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d 20 6f   a single term o
9000: 66 20 43 53 56 2e 20 20 41 63 74 75 61 6c 6c 79  f CSV.  Actually
9010: 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
9020: 72 20 69 73 20 75 73 65 64 20 66 6f 72 0a 2a 2a  r is used for.**
9030: 20 74 68 65 20 73 65 70 61 72 61 74 6f 72 2c 20   the separator, 
9040: 77 68 69 63 68 20 6d 61 79 20 6f 72 20 6d 61 79  which may or may
9050: 20 6e 6f 74 20 62 65 20 61 20 63 6f 6d 6d 61 2e   not be a comma.
9060: 20 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 20 69    p->nullValue i
9070: 73 0a 2a 2a 20 74 68 65 20 6e 75 6c 6c 20 76 61  s.** the null va
9080: 6c 75 65 2e 20 20 53 74 72 69 6e 67 73 20 61 72  lue.  Strings ar
9090: 65 20 71 75 6f 74 65 64 20 69 66 20 6e 65 63 65  e quoted if nece
90a0: 73 73 61 72 79 2e 20 20 54 68 65 20 73 65 70 61  ssary.  The sepa
90b0: 72 61 74 6f 72 0a 2a 2a 20 69 73 20 6f 6e 6c 79  rator.** is only
90c0: 20 69 73 73 75 65 64 20 69 66 20 62 53 65 70 20   issued if bSep 
90d0: 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 73 74 61 74  is true..*/.stat
90e0: 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74 5f 63  ic void output_c
90f0: 73 76 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  sv(ShellState *p
9100: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c  , const char *z,
9110: 20 69 6e 74 20 62 53 65 70 29 7b 0a 20 20 46 49   int bSep){.  FI
9120: 4c 45 20 2a 6f 75 74 20 3d 20 70 2d 3e 6f 75 74  LE *out = p->out
9130: 3b 0a 20 20 69 66 28 20 7a 3d 3d 30 20 29 7b 0a  ;.  if( z==0 ){.
9140: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
9150: 6f 75 74 2c 22 25 73 22 2c 70 2d 3e 6e 75 6c 6c  out,"%s",p->null
9160: 56 61 6c 75 65 29 3b 0a 20 20 7d 65 6c 73 65 7b  Value);.  }else{
9170: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
9180: 69 6e 74 20 6e 53 65 70 20 3d 20 73 74 72 6c 65  int nSep = strle
9190: 6e 33 30 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61  n30(p->colSepara
91a0: 74 6f 72 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  tor);.    for(i=
91b0: 30 3b 20 7a 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20  0; z[i]; i++){. 
91c0: 20 20 20 20 20 69 66 28 20 6e 65 65 64 43 73 76       if( needCsv
91d0: 51 75 6f 74 65 5b 28 28 75 6e 73 69 67 6e 65 64  Quote[((unsigned
91e0: 20 63 68 61 72 2a 29 7a 29 5b 69 5d 5d 0a 20 20   char*)z)[i]].  
91f0: 20 20 20 20 20 20 20 7c 7c 20 28 7a 5b 69 5d 3d         || (z[i]=
9200: 3d 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72  =p->colSeparator
9210: 5b 30 5d 20 26 26 0a 20 20 20 20 20 20 20 20 20  [0] &&.         
9220: 20 20 20 20 28 6e 53 65 70 3d 3d 31 20 7c 7c 20      (nSep==1 || 
9230: 6d 65 6d 63 6d 70 28 7a 2c 20 70 2d 3e 63 6f 6c  memcmp(z, p->col
9240: 53 65 70 61 72 61 74 6f 72 2c 20 6e 53 65 70 29  Separator, nSep)
9250: 3d 3d 30 29 29 20 29 7b 0a 20 20 20 20 20 20 20  ==0)) ){.       
9260: 20 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   i = 0;.        
9270: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
9280: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3d 3d     }.    if( i==
9290: 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  0 ){.      char 
92a0: 2a 7a 51 75 6f 74 65 64 20 3d 20 73 71 6c 69 74  *zQuoted = sqlit
92b0: 65 33 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25 77  e3_mprintf("\"%w
92c0: 5c 22 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 75  \"", z);.      u
92d0: 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  tf8_printf(out, 
92e0: 22 25 73 22 2c 20 7a 51 75 6f 74 65 64 29 3b 0a  "%s", zQuoted);.
92f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
9300: 65 65 28 7a 51 75 6f 74 65 64 29 3b 0a 20 20 20  ee(zQuoted);.   
9310: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 74   }else{.      ut
9320: 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  f8_printf(out, "
9330: 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 7d 0a 20  %s", z);.    }. 
9340: 20 7d 0a 20 20 69 66 28 20 62 53 65 70 20 29 7b   }.  if( bSep ){
9350: 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
9360: 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70  (p->out, "%s", p
9370: 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b  ->colSeparator);
9380: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
9390: 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e 73 20  is routine runs 
93a0: 77 68 65 6e 20 74 68 65 20 75 73 65 72 20 70 72  when the user pr
93b0: 65 73 73 65 73 20 43 74 72 6c 2d 43 0a 2a 2f 0a  esses Ctrl-C.*/.
93c0: 73 74 61 74 69 63 20 76 6f 69 64 20 69 6e 74 65  static void inte
93d0: 72 72 75 70 74 5f 68 61 6e 64 6c 65 72 28 69 6e  rrupt_handler(in
93e0: 74 20 4e 6f 74 55 73 65 64 29 7b 0a 20 20 55 4e  t NotUsed){.  UN
93f0: 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 4e  USED_PARAMETER(N
9400: 6f 74 55 73 65 64 29 3b 0a 20 20 73 65 65 6e 49  otUsed);.  seenI
9410: 6e 74 65 72 72 75 70 74 2b 2b 3b 0a 20 20 69 66  nterrupt++;.  if
9420: 28 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 3e  ( seenInterrupt>
9430: 32 20 29 20 65 78 69 74 28 31 29 3b 0a 20 20 69  2 ) exit(1);.  i
9440: 66 28 20 67 6c 6f 62 61 6c 44 62 20 29 20 73 71  f( globalDb ) sq
9450: 6c 69 74 65 33 5f 69 6e 74 65 72 72 75 70 74 28  lite3_interrupt(
9460: 67 6c 6f 62 61 6c 44 62 29 3b 0a 7d 0a 0a 23 69  globalDb);.}..#i
9470: 66 20 28 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  f (defined(_WIN3
9480: 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49  2) || defined(WI
9490: 4e 33 32 29 29 20 26 26 20 21 64 65 66 69 6e 65  N32)) && !define
94a0: 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a 2f 2a  d(_WIN32_WCE)./*
94b0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
94c0: 20 72 75 6e 73 20 66 6f 72 20 63 6f 6e 73 6f 6c   runs for consol
94d0: 65 20 65 76 65 6e 74 73 20 28 65 2e 67 2e 20 43  e events (e.g. C
94e0: 74 72 6c 2d 43 29 20 6f 6e 20 57 69 6e 33 32 0a  trl-C) on Win32.
94f0: 2a 2f 0a 73 74 61 74 69 63 20 42 4f 4f 4c 20 57  */.static BOOL W
9500: 49 4e 41 50 49 20 43 6f 6e 73 6f 6c 65 43 74 72  INAPI ConsoleCtr
9510: 6c 48 61 6e 64 6c 65 72 28 0a 20 20 44 57 4f 52  lHandler(.  DWOR
9520: 44 20 64 77 43 74 72 6c 54 79 70 65 20 2f 2a 20  D dwCtrlType /* 
9530: 4f 6e 65 20 6f 66 20 74 68 65 20 43 54 52 4c 5f  One of the CTRL_
9540: 2a 5f 45 56 45 4e 54 20 63 6f 6e 73 74 61 6e 74  *_EVENT constant
9550: 73 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 64 77  s */.){.  if( dw
9560: 43 74 72 6c 54 79 70 65 3d 3d 43 54 52 4c 5f 43  CtrlType==CTRL_C
9570: 5f 45 56 45 4e 54 20 29 7b 0a 20 20 20 20 69 6e  _EVENT ){.    in
9580: 74 65 72 72 75 70 74 5f 68 61 6e 64 6c 65 72 28  terrupt_handler(
9590: 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 54  0);.    return T
95a0: 52 55 45 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  RUE;.  }.  retur
95b0: 6e 20 46 41 4c 53 45 3b 0a 7d 0a 23 65 6e 64 69  n FALSE;.}.#endi
95c0: 66 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  f..#ifndef SQLIT
95d0: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
95e0: 54 49 4f 4e 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20  TION./*.** When 
95f0: 74 68 65 20 22 2e 61 75 74 68 20 4f 4e 22 20 69  the ".auth ON" i
9600: 73 20 73 65 74 2c 20 74 68 65 20 66 6f 6c 6c 6f  s set, the follo
9610: 77 69 6e 67 20 61 75 74 68 6f 72 69 7a 65 72 20  wing authorizer 
9620: 63 61 6c 6c 62 61 63 6b 20 69 73 0a 2a 2a 20 69  callback is.** i
9630: 6e 76 6f 6b 65 64 2e 20 20 49 74 20 61 6c 77 61  nvoked.  It alwa
9640: 79 73 20 72 65 74 75 72 6e 73 20 53 51 4c 49 54  ys returns SQLIT
9650: 45 5f 4f 4b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  E_OK..*/.static 
9660: 69 6e 74 20 73 68 65 6c 6c 41 75 74 68 28 0a 20  int shellAuth(. 
9670: 20 76 6f 69 64 20 2a 70 43 6c 69 65 6e 74 44 61   void *pClientDa
9680: 74 61 2c 0a 20 20 69 6e 74 20 6f 70 2c 0a 20 20  ta,.  int op,.  
9690: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 31 2c  const char *zA1,
96a0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
96b0: 41 32 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  A2,.  const char
96c0: 20 2a 7a 41 33 2c 0a 20 20 63 6f 6e 73 74 20 63   *zA3,.  const c
96d0: 68 61 72 20 2a 7a 41 34 0a 29 7b 0a 20 20 53 68  har *zA4.){.  Sh
96e0: 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28 53  ellState *p = (S
96f0: 68 65 6c 6c 53 74 61 74 65 2a 29 70 43 6c 69 65  hellState*)pClie
9700: 6e 74 44 61 74 61 3b 0a 20 20 73 74 61 74 69 63  ntData;.  static
9710: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 41   const char *azA
9720: 63 74 69 6f 6e 5b 5d 20 3d 20 7b 20 30 2c 0a 20  ction[] = { 0,. 
9730: 20 20 20 20 22 43 52 45 41 54 45 5f 49 4e 44 45      "CREATE_INDE
9740: 58 22 2c 20 20 20 20 20 20 20 20 20 22 43 52 45  X",         "CRE
9750: 41 54 45 5f 54 41 42 4c 45 22 2c 20 20 20 20 20  ATE_TABLE",     
9760: 20 20 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50      "CREATE_TEMP
9770: 5f 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 43  _INDEX",.     "C
9780: 52 45 41 54 45 5f 54 45 4d 50 5f 54 41 42 4c 45  REATE_TEMP_TABLE
9790: 22 2c 20 20 20 20 22 43 52 45 41 54 45 5f 54 45  ",    "CREATE_TE
97a0: 4d 50 5f 54 52 49 47 47 45 52 22 2c 20 20 22 43  MP_TRIGGER",  "C
97b0: 52 45 41 54 45 5f 54 45 4d 50 5f 56 49 45 57 22  REATE_TEMP_VIEW"
97c0: 2c 0a 20 20 20 20 20 22 43 52 45 41 54 45 5f 54  ,.     "CREATE_T
97d0: 52 49 47 47 45 52 22 2c 20 20 20 20 20 20 20 22  RIGGER",       "
97e0: 43 52 45 41 54 45 5f 56 49 45 57 22 2c 20 20 20  CREATE_VIEW",   
97f0: 20 20 20 20 20 20 20 22 44 45 4c 45 54 45 22 2c         "DELETE",
9800: 0a 20 20 20 20 20 22 44 52 4f 50 5f 49 4e 44 45  .     "DROP_INDE
9810: 58 22 2c 20 20 20 20 20 20 20 20 20 20 20 22 44  X",           "D
9820: 52 4f 50 5f 54 41 42 4c 45 22 2c 20 20 20 20 20  ROP_TABLE",     
9830: 20 20 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50        "DROP_TEMP
9840: 5f 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 44  _INDEX",.     "D
9850: 52 4f 50 5f 54 45 4d 50 5f 54 41 42 4c 45 22 2c  ROP_TEMP_TABLE",
9860: 20 20 20 20 20 20 22 44 52 4f 50 5f 54 45 4d 50        "DROP_TEMP
9870: 5f 54 52 49 47 47 45 52 22 2c 20 20 20 20 22 44  _TRIGGER",    "D
9880: 52 4f 50 5f 54 45 4d 50 5f 56 49 45 57 22 2c 0a  ROP_TEMP_VIEW",.
9890: 20 20 20 20 20 22 44 52 4f 50 5f 54 52 49 47 47       "DROP_TRIGG
98a0: 45 52 22 2c 20 20 20 20 20 20 20 20 20 22 44 52  ER",         "DR
98b0: 4f 50 5f 56 49 45 57 22 2c 20 20 20 20 20 20 20  OP_VIEW",       
98c0: 20 20 20 20 20 22 49 4e 53 45 52 54 22 2c 0a 20       "INSERT",. 
98d0: 20 20 20 20 22 50 52 41 47 4d 41 22 2c 20 20 20      "PRAGMA",   
98e0: 20 20 20 20 20 20 20 20 20 20 20 20 22 52 45 41              "REA
98f0: 44 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  D",             
9900: 20 20 20 20 22 53 45 4c 45 43 54 22 2c 0a 20 20      "SELECT",.  
9910: 20 20 20 22 54 52 41 4e 53 41 43 54 49 4f 4e 22     "TRANSACTION"
9920: 2c 20 20 20 20 20 20 20 20 20 20 22 55 50 44 41  ,          "UPDA
9930: 54 45 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  TE",            
9940: 20 20 20 22 41 54 54 41 43 48 22 2c 0a 20 20 20     "ATTACH",.   
9950: 20 20 22 44 45 54 41 43 48 22 2c 20 20 20 20 20    "DETACH",     
9960: 20 20 20 20 20 20 20 20 20 20 22 41 4c 54 45 52            "ALTER
9970: 5f 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20  _TABLE",        
9980: 20 20 22 52 45 49 4e 44 45 58 22 2c 0a 20 20 20    "REINDEX",.   
9990: 20 20 22 41 4e 41 4c 59 5a 45 22 2c 20 20 20 20    "ANALYZE",    
99a0: 20 20 20 20 20 20 20 20 20 20 22 43 52 45 41 54            "CREAT
99b0: 45 5f 56 54 41 42 4c 45 22 2c 20 20 20 20 20 20  E_VTABLE",      
99c0: 20 20 22 44 52 4f 50 5f 56 54 41 42 4c 45 22 2c    "DROP_VTABLE",
99d0: 0a 20 20 20 20 20 22 46 55 4e 43 54 49 4f 4e 22  .     "FUNCTION"
99e0: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53  ,             "S
99f0: 41 56 45 50 4f 49 4e 54 22 2c 20 20 20 20 20 20  AVEPOINT",      
9a00: 20 20 20 20 20 20 22 52 45 43 55 52 53 49 56 45        "RECURSIVE
9a10: 22 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  ".  };.  int i;.
9a20: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a    const char *az
9a30: 5b 34 5d 3b 0a 20 20 61 7a 5b 30 5d 20 3d 20 7a  [4];.  az[0] = z
9a40: 41 31 3b 0a 20 20 61 7a 5b 31 5d 20 3d 20 7a 41  A1;.  az[1] = zA
9a50: 32 3b 0a 20 20 61 7a 5b 32 5d 20 3d 20 7a 41 33  2;.  az[2] = zA3
9a60: 3b 0a 20 20 61 7a 5b 33 5d 20 3d 20 7a 41 34 3b  ;.  az[3] = zA4;
9a70: 0a 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70  .  utf8_printf(p
9a80: 2d 3e 6f 75 74 2c 20 22 61 75 74 68 6f 72 69 7a  ->out, "authoriz
9a90: 65 72 3a 20 25 73 22 2c 20 61 7a 41 63 74 69 6f  er: %s", azActio
9aa0: 6e 5b 6f 70 5d 29 3b 0a 20 20 66 6f 72 28 69 3d  n[op]);.  for(i=
9ab0: 30 3b 20 69 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20  0; i<4; i++){.  
9ac0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
9ad0: 6f 75 74 2c 20 22 20 22 29 3b 0a 20 20 20 20 69  out, " ");.    i
9ae0: 66 28 20 61 7a 5b 69 5d 20 29 7b 0a 20 20 20 20  f( az[i] ){.    
9af0: 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e    output_c_strin
9b00: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 5b 69 5d 29  g(p->out, az[i])
9b10: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
9b20: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
9b30: 3e 6f 75 74 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20  >out, "NULL");. 
9b40: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 61 77 5f 70     }.  }.  raw_p
9b50: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c  rintf(p->out, "\
9b60: 6e 22 29 3b 0a 20 20 72 65 74 75 72 6e 20 53 51  n");.  return SQ
9b70: 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69  LITE_OK;.}.#endi
9b80: 66 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61  f../*.** Print a
9b90: 20 73 63 68 65 6d 61 20 73 74 61 74 65 6d 65 6e   schema statemen
9ba0: 74 2e 20 20 50 61 72 74 20 6f 66 20 4d 4f 44 45  t.  Part of MODE
9bb0: 5f 53 65 6d 69 20 61 6e 64 20 4d 4f 44 45 5f 50  _Semi and MODE_P
9bc0: 72 65 74 74 79 20 6f 75 74 70 75 74 2e 0a 2a 2a  retty output..**
9bd0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
9be0: 20 63 6f 6e 76 65 72 74 73 20 73 6f 6d 65 20 43   converts some C
9bf0: 52 45 41 54 45 20 54 41 42 4c 45 20 73 74 61 74  REATE TABLE stat
9c00: 65 6d 65 6e 74 73 20 66 6f 72 20 73 68 61 64 6f  ements for shado
9c10: 77 20 74 61 62 6c 65 73 0a 2a 2a 20 69 6e 20 46  w tables.** in F
9c20: 54 53 33 2f 34 2f 35 20 69 6e 74 6f 20 43 52 45  TS3/4/5 into CRE
9c30: 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54  ATE TABLE IF NOT
9c40: 20 45 58 49 53 54 53 20 73 74 61 74 65 6d 65 6e   EXISTS statemen
9c50: 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ts..*/.static vo
9c60: 69 64 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69  id printSchemaLi
9c70: 6e 65 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f  ne(FILE *out, co
9c80: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 63 6f 6e  nst char *z, con
9c90: 73 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 29 7b  st char *zTail){
9ca0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
9cb0: 74 72 67 6c 6f 62 28 22 43 52 45 41 54 45 20 54  trglob("CREATE T
9cc0: 41 42 4c 45 20 5b 27 5c 22 5d 2a 22 2c 20 7a 29  ABLE ['\"]*", z)
9cd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f  ==0 ){.    utf8_
9ce0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 43 52 45  printf(out, "CRE
9cf0: 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f 54  ATE TABLE IF NOT
9d00: 20 45 58 49 53 54 53 20 25 73 25 73 22 2c 20 7a   EXISTS %s%s", z
9d10: 2b 31 33 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7d  +13, zTail);.  }
9d20: 65 6c 73 65 7b 0a 20 20 20 20 75 74 66 38 5f 70  else{.    utf8_p
9d30: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 25 73  rintf(out, "%s%s
9d40: 22 2c 20 7a 2c 20 7a 54 61 69 6c 29 3b 0a 20 20  ", z, zTail);.  
9d50: 7d 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20  }.}.static void 
9d60: 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 4e  printSchemaLineN
9d70: 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 68 61 72  (FILE *out, char
9d80: 20 2a 7a 2c 20 69 6e 74 20 6e 2c 20 63 6f 6e 73   *z, int n, cons
9d90: 74 20 63 68 61 72 20 2a 7a 54 61 69 6c 29 7b 0a  t char *zTail){.
9da0: 20 20 63 68 61 72 20 63 20 3d 20 7a 5b 6e 5d 3b    char c = z[n];
9db0: 0a 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 20 20 70  .  z[n] = 0;.  p
9dc0: 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 6f  rintSchemaLine(o
9dd0: 75 74 2c 20 7a 2c 20 7a 54 61 69 6c 29 3b 0a 20  ut, z, zTail);. 
9de0: 20 7a 5b 6e 5d 20 3d 20 63 3b 0a 7d 0a 0a 2f 2a   z[n] = c;.}../*
9df0: 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20  .** This is the 
9e00: 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65  callback routine
9e10: 20 74 68 61 74 20 74 68 65 20 73 68 65 6c 6c 0a   that the shell.
9e20: 2a 2a 20 69 6e 76 6f 6b 65 73 20 66 6f 72 20 65  ** invokes for e
9e30: 61 63 68 20 72 6f 77 20 6f 66 20 61 20 71 75 65  ach row of a que
9e40: 72 79 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74  ry result..*/.st
9e50: 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f 63  atic int shell_c
9e60: 61 6c 6c 62 61 63 6b 28 0a 20 20 76 6f 69 64 20  allback(.  void 
9e70: 2a 70 41 72 67 2c 0a 20 20 69 6e 74 20 6e 41 72  *pArg,.  int nAr
9e80: 67 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  g,        /* Num
9e90: 62 65 72 20 6f 66 20 72 65 73 75 6c 74 20 63 6f  ber of result co
9ea0: 6c 75 6d 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20  lumns */.  char 
9eb0: 2a 2a 61 7a 41 72 67 2c 20 20 20 20 2f 2a 20 54  **azArg,    /* T
9ec0: 65 78 74 20 6f 66 20 65 61 63 68 20 72 65 73 75  ext of each resu
9ed0: 6c 74 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63  lt column */.  c
9ee0: 68 61 72 20 2a 2a 61 7a 43 6f 6c 2c 20 20 20 20  har **azCol,    
9ef0: 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  /* Column names 
9f00: 2a 2f 0a 20 20 69 6e 74 20 2a 61 69 54 79 70 65  */.  int *aiType
9f10: 20 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20        /* Column 
9f20: 74 79 70 65 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e  types */.){.  in
9f30: 74 20 69 3b 0a 20 20 53 68 65 6c 6c 53 74 61 74  t i;.  ShellStat
9f40: 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61  e *p = (ShellSta
9f50: 74 65 2a 29 70 41 72 67 3b 0a 0a 20 20 69 66 28  te*)pArg;..  if(
9f60: 20 61 7a 41 72 67 3d 3d 30 20 29 20 72 65 74 75   azArg==0 ) retu
9f70: 72 6e 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20  rn 0;.  switch( 
9f80: 70 2d 3e 63 4d 6f 64 65 20 29 7b 0a 20 20 20 20  p->cMode ){.    
9f90: 63 61 73 65 20 4d 4f 44 45 5f 4c 69 6e 65 3a 20  case MODE_Line: 
9fa0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 77 20 3d 20  {.      int w = 
9fb0: 35 3b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41  5;.      if( azA
9fc0: 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rg==0 ) break;. 
9fd0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
9fe0: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
9ff0: 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20 73 74      int len = st
a000: 72 6c 65 6e 33 30 28 61 7a 43 6f 6c 5b 69 5d 20  rlen30(azCol[i] 
a010: 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29  ? azCol[i] : "")
a020: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6c 65  ;.        if( le
a030: 6e 3e 77 20 29 20 77 20 3d 20 6c 65 6e 3b 0a 20  n>w ) w = len;. 
a040: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
a050: 20 70 2d 3e 63 6e 74 2b 2b 3e 30 20 29 20 75 74   p->cnt++>0 ) ut
a060: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
a070: 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65  , "%s", p->rowSe
a080: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
a090: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
a0a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75   i++){.        u
a0b0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
a0c0: 74 2c 22 25 2a 73 20 3d 20 25 73 25 73 22 2c 20  t,"%*s = %s%s", 
a0d0: 77 2c 20 61 7a 43 6f 6c 5b 69 5d 2c 0a 20 20 20  w, azCol[i],.   
a0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 41               azA
a0f0: 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d  rg[i] ? azArg[i]
a100: 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 2c   : p->nullValue,
a110: 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
a120: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
a130: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
a140: 20 20 63 61 73 65 20 4d 4f 44 45 5f 45 78 70 6c    case MODE_Expl
a150: 61 69 6e 3a 0a 20 20 20 20 63 61 73 65 20 4d 4f  ain:.    case MO
a160: 44 45 5f 43 6f 6c 75 6d 6e 3a 20 7b 0a 20 20 20  DE_Column: {.   
a170: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
a180: 69 6e 74 20 61 45 78 70 6c 61 69 6e 57 69 64 74  int aExplainWidt
a190: 68 73 5b 5d 20 3d 20 7b 34 2c 20 31 33 2c 20 34  hs[] = {4, 13, 4
a1a0: 2c 20 34 2c 20 34 2c 20 31 33 2c 20 32 2c 20 31  , 4, 4, 13, 2, 1
a1b0: 33 7d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  3};.      const 
a1c0: 69 6e 74 20 2a 63 6f 6c 57 69 64 74 68 3b 0a 20  int *colWidth;. 
a1d0: 20 20 20 20 20 69 6e 74 20 73 68 6f 77 48 64 72       int showHdr
a1e0: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 72 6f  ;.      char *ro
a1f0: 77 53 65 70 3b 0a 20 20 20 20 20 20 69 66 28 20  wSep;.      if( 
a200: 70 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 43  p->cMode==MODE_C
a210: 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20  olumn ){.       
a220: 20 63 6f 6c 57 69 64 74 68 20 3d 20 70 2d 3e 63   colWidth = p->c
a230: 6f 6c 57 69 64 74 68 3b 0a 20 20 20 20 20 20 20  olWidth;.       
a240: 20 73 68 6f 77 48 64 72 20 3d 20 70 2d 3e 73 68   showHdr = p->sh
a250: 6f 77 48 65 61 64 65 72 3b 0a 20 20 20 20 20 20  owHeader;.      
a260: 20 20 72 6f 77 53 65 70 20 3d 20 70 2d 3e 72 6f    rowSep = p->ro
a270: 77 53 65 70 61 72 61 74 6f 72 3b 0a 20 20 20 20  wSeparator;.    
a280: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a290: 20 63 6f 6c 57 69 64 74 68 20 3d 20 61 45 78 70   colWidth = aExp
a2a0: 6c 61 69 6e 57 69 64 74 68 73 3b 0a 20 20 20 20  lainWidths;.    
a2b0: 20 20 20 20 73 68 6f 77 48 64 72 20 3d 20 31 3b      showHdr = 1;
a2c0: 0a 20 20 20 20 20 20 20 20 72 6f 77 53 65 70 20  .        rowSep 
a2d0: 3d 20 53 45 50 5f 52 6f 77 3b 0a 20 20 20 20 20  = SEP_Row;.     
a2e0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
a2f0: 63 6e 74 2b 2b 3d 3d 30 20 29 7b 0a 20 20 20 20  cnt++==0 ){.    
a300: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
a310: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
a320: 20 20 20 20 20 69 6e 74 20 77 2c 20 6e 3b 0a 20       int w, n;. 
a330: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 41           if( i<A
a340: 72 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f 6c 57  rraySize(p->colW
a350: 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20 20 20  idth) ){.       
a360: 20 20 20 20 20 77 20 3d 20 63 6f 6c 57 69 64 74       w = colWidt
a370: 68 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  h[i];.          
a380: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
a390: 20 20 20 77 20 3d 20 30 3b 0a 20 20 20 20 20 20     w = 0;.      
a3a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
a3b0: 69 66 28 20 77 3d 3d 30 20 29 7b 0a 20 20 20 20  if( w==0 ){.    
a3c0: 20 20 20 20 20 20 20 20 77 20 3d 20 73 74 72 6c          w = strl
a3d0: 65 6e 43 68 61 72 28 61 7a 43 6f 6c 5b 69 5d 20  enChar(azCol[i] 
a3e0: 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 29  ? azCol[i] : "")
a3f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
a400: 28 20 77 3c 31 30 20 29 20 77 20 3d 20 31 30 3b  ( w<10 ) w = 10;
a410: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d  .            n =
a420: 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a 41 72   strlenChar(azAr
a430: 67 20 26 26 20 61 7a 41 72 67 5b 69 5d 20 3f 20  g && azArg[i] ? 
a440: 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75  azArg[i] : p->nu
a450: 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20  llValue);.      
a460: 20 20 20 20 20 20 69 66 28 20 77 3c 6e 20 29 20        if( w<n ) 
a470: 77 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20  w = n;.         
a480: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
a490: 20 69 3c 41 72 72 61 79 53 69 7a 65 28 70 2d 3e   i<ArraySize(p->
a4a0: 61 63 74 75 61 6c 57 69 64 74 68 29 20 29 7b 0a  actualWidth) ){.
a4b0: 20 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 61              p->a
a4c0: 63 74 75 61 6c 57 69 64 74 68 5b 69 5d 20 3d 20  ctualWidth[i] = 
a4d0: 77 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  w;.          }. 
a4e0: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 68 6f           if( sho
a4f0: 77 48 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20  wHdr ){.        
a500: 20 20 20 20 75 74 66 38 5f 77 69 64 74 68 5f 70      utf8_width_p
a510: 72 69 6e 74 28 70 2d 3e 6f 75 74 2c 20 77 2c 20  rint(p->out, w, 
a520: 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20  azCol[i]);.     
a530: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
a540: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
a550: 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f 77   i==nArg-1 ? row
a560: 53 65 70 20 3a 20 22 20 20 22 29 3b 0a 20 20 20  Sep : "  ");.   
a570: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a580: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73   }.        if( s
a590: 68 6f 77 48 64 72 20 29 7b 0a 20 20 20 20 20 20  howHdr ){.      
a5a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
a5b0: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
a5c0: 20 20 20 20 20 20 20 69 6e 74 20 77 3b 0a 20 20         int w;.  
a5d0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c            if( i<
a5e0: 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 63 74  ArraySize(p->act
a5f0: 75 61 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20  ualWidth) ){.   
a600: 20 20 20 20 20 20 20 20 20 20 20 20 77 20 3d 20              w = 
a610: 70 2d 3e 61 63 74 75 61 6c 57 69 64 74 68 5b 69  p->actualWidth[i
a620: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ];.             
a630: 20 20 69 66 28 20 77 3c 30 20 29 20 77 20 3d 20    if( w<0 ) w = 
a640: 2d 77 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  -w;.            
a650: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
a660: 20 20 20 20 20 20 77 20 3d 20 31 30 3b 0a 20 20        w = 10;.  
a670: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
a680: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
a690: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 2d 2a 2e  ntf(p->out,"%-*.
a6a0: 2a 73 25 73 22 2c 77 2c 77 2c 0a 20 20 20 20 20  *s%s",w,w,.     
a6b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
a6c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a6d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a6e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a6f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 0a 20 20 20 20 20  ---------".     
a700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 2d                "-
a710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 22 2c 0a 20 20 20 20  ---------",.    
a750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a760: 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 72 6f 77 53  i==nArg-1 ? rowS
a770: 65 70 20 3a 20 22 20 20 22 29 3b 0a 20 20 20 20  ep : "  ");.    
a780: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a790: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
a7a0: 69 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62  if( azArg==0 ) b
a7b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28  reak;.      for(
a7c0: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
a7d0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 77  ){.        int w
a7e0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c  ;.        if( i<
a7f0: 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 63 74  ArraySize(p->act
a800: 75 61 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20  ualWidth) ){.   
a810: 20 20 20 20 20 20 20 20 77 20 3d 20 70 2d 3e 61          w = p->a
a820: 63 74 75 61 6c 57 69 64 74 68 5b 69 5d 3b 0a 20  ctualWidth[i];. 
a830: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
a840: 20 20 20 20 20 20 20 20 20 77 20 3d 20 31 30 3b           w = 10;
a850: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a860: 20 20 20 69 66 28 20 70 2d 3e 63 4d 6f 64 65 3d     if( p->cMode=
a870: 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20 26 26  =MODE_Explain &&
a880: 20 61 7a 41 72 67 5b 69 5d 20 26 26 20 73 74 72   azArg[i] && str
a890: 6c 65 6e 43 68 61 72 28 61 7a 41 72 67 5b 69 5d  lenChar(azArg[i]
a8a0: 29 3e 77 20 29 7b 0a 20 20 20 20 20 20 20 20 20  )>w ){.         
a8b0: 20 77 20 3d 20 73 74 72 6c 65 6e 43 68 61 72 28   w = strlenChar(
a8c0: 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20  azArg[i]);.     
a8d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
a8e0: 20 69 3d 3d 31 20 26 26 20 70 2d 3e 61 69 49 6e   i==1 && p->aiIn
a8f0: 64 65 6e 74 20 26 26 20 70 2d 3e 70 53 74 6d 74  dent && p->pStmt
a900: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
a910: 28 20 70 2d 3e 69 49 6e 64 65 6e 74 3c 70 2d 3e  ( p->iIndent<p->
a920: 6e 49 6e 64 65 6e 74 20 29 7b 0a 20 20 20 20 20  nIndent ){.     
a930: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
a940: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2a 2e 73  tf(p->out, "%*.s
a950: 22 2c 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 70  ", p->aiIndent[p
a960: 2d 3e 69 49 6e 64 65 6e 74 5d 2c 20 22 22 29 3b  ->iIndent], "");
a970: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
a980: 20 20 20 20 20 20 20 70 2d 3e 69 49 6e 64 65 6e         p->iInden
a990: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  t++;.        }. 
a9a0: 20 20 20 20 20 20 20 75 74 66 38 5f 77 69 64 74         utf8_widt
a9b0: 68 5f 70 72 69 6e 74 28 70 2d 3e 6f 75 74 2c 20  h_print(p->out, 
a9c0: 77 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a  w, azArg[i] ? az
a9d0: 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c  Arg[i] : p->null
a9e0: 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20  Value);.        
a9f0: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
aa00: 75 74 2c 20 22 25 73 22 2c 20 69 3d 3d 6e 41 72  ut, "%s", i==nAr
aa10: 67 2d 31 20 3f 20 72 6f 77 53 65 70 20 3a 20 22  g-1 ? rowSep : "
aa20: 20 20 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20    ");.      }.  
aa30: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
aa40: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 53  .    case MODE_S
aa50: 65 6d 69 3a 20 7b 20 20 20 2f 2a 20 2e 73 63 68  emi: {   /* .sch
aa60: 65 6d 61 20 61 6e 64 20 2e 66 75 6c 6c 73 63 68  ema and .fullsch
aa70: 65 6d 61 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20  ema output */.  
aa80: 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c      printSchemaL
aa90: 69 6e 65 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72  ine(p->out, azAr
aaa0: 67 5b 30 5d 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20  g[0], ";\n");.  
aab0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
aac0: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 50  .    case MODE_P
aad0: 72 65 74 74 79 3a 20 7b 20 20 2f 2a 20 2e 73 63  retty: {  /* .sc
aae0: 68 65 6d 61 20 61 6e 64 20 2e 66 75 6c 6c 73 63  hema and .fullsc
aaf0: 68 65 6d 61 20 77 69 74 68 20 2d 2d 69 6e 64 65  hema with --inde
ab00: 6e 74 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72  nt */.      char
ab10: 20 2a 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a   *z;.      int j
ab20: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 61 72  ;.      int nPar
ab30: 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 68  en = 0;.      ch
ab40: 61 72 20 63 45 6e 64 20 3d 20 30 3b 0a 20 20 20  ar cEnd = 0;.   
ab50: 20 20 20 63 68 61 72 20 63 3b 0a 20 20 20 20 20     char c;.     
ab60: 20 69 6e 74 20 6e 4c 69 6e 65 20 3d 20 30 3b 0a   int nLine = 0;.
ab70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 6e 41        assert( nA
ab80: 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 69  rg==1 );.      i
ab90: 66 28 20 61 7a 41 72 67 5b 30 5d 3d 3d 30 20 29  f( azArg[0]==0 )
aba0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69 66   break;.      if
abb0: 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b  ( sqlite3_strlik
abc0: 65 28 22 43 52 45 41 54 45 20 56 49 45 57 25 22  e("CREATE VIEW%"
abd0: 2c 20 61 7a 41 72 67 5b 30 5d 2c 20 30 29 3d 3d  , azArg[0], 0)==
abe0: 30 0a 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69  0.       || sqli
abf0: 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 43 52 45  te3_strlike("CRE
ac00: 41 54 45 20 54 52 49 47 25 22 2c 20 61 7a 41 72  ATE TRIG%", azAr
ac10: 67 5b 30 5d 2c 20 30 29 3d 3d 30 0a 20 20 20 20  g[0], 0)==0.    
ac20: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66    ){.        utf
ac30: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
ac40: 20 22 25 73 3b 5c 6e 22 2c 20 61 7a 41 72 67 5b   "%s;\n", azArg[
ac50: 30 5d 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  0]);.        bre
ac60: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
ac70: 20 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70    z = sqlite3_mp
ac80: 72 69 6e 74 66 28 22 25 73 22 2c 20 61 7a 41 72  rintf("%s", azAr
ac90: 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 6a 20 3d  g[0]);.      j =
aca0: 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   0;.      for(i=
acb0: 30 3b 20 49 73 53 70 61 63 65 28 7a 5b 69 5d 29  0; IsSpace(z[i])
acc0: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 66  ; i++){}.      f
acd0: 6f 72 28 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21  or(; (c = z[i])!
ace0: 3d 30 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  =0; i++){.      
acf0: 20 20 69 66 28 20 49 73 53 70 61 63 65 28 63 29    if( IsSpace(c)
ad00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
ad10: 28 20 7a 5b 6a 2d 31 5d 3d 3d 27 5c 72 27 20 29  ( z[j-1]=='\r' )
ad20: 20 7a 5b 6a 2d 31 5d 20 3d 20 27 5c 6e 27 3b 0a   z[j-1] = '\n';.
ad30: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49 73            if( Is
ad40: 53 70 61 63 65 28 7a 5b 6a 2d 31 5d 29 20 7c 7c  Space(z[j-1]) ||
ad50: 20 7a 5b 6a 2d 31 5d 3d 3d 27 28 27 20 29 20 63   z[j-1]=='(' ) c
ad60: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
ad70: 20 7d 65 6c 73 65 20 69 66 28 20 28 63 3d 3d 27   }else if( (c=='
ad80: 28 27 20 7c 7c 20 63 3d 3d 27 29 27 29 20 26 26  (' || c==')') &&
ad90: 20 6a 3e 30 20 26 26 20 49 73 53 70 61 63 65 28   j>0 && IsSpace(
ada0: 7a 5b 6a 2d 31 5d 29 20 29 7b 0a 20 20 20 20 20  z[j-1]) ){.     
adb0: 20 20 20 20 20 6a 2d 2d 3b 0a 20 20 20 20 20 20       j--;.      
adc0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 5b 6a 2b    }.        z[j+
add0: 2b 5d 20 3d 20 63 3b 0a 20 20 20 20 20 20 7d 0a  +] = c;.      }.
ade0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 6a 3e 30        while( j>0
adf0: 20 26 26 20 49 73 53 70 61 63 65 28 7a 5b 6a 2d   && IsSpace(z[j-
ae00: 31 5d 29 20 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20  1]) ){ j--; }.  
ae10: 20 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20      z[j] = 0;.  
ae20: 20 20 20 20 69 66 28 20 73 74 72 6c 65 6e 33 30      if( strlen30
ae30: 28 7a 29 3e 3d 37 39 20 29 7b 0a 20 20 20 20 20  (z)>=79 ){.     
ae40: 20 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 28 63     for(i=j=0; (c
ae50: 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b   = z[i])!=0; i++
ae60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
ae70: 20 63 3d 3d 63 45 6e 64 20 29 7b 0a 20 20 20 20   c==cEnd ){.    
ae80: 20 20 20 20 20 20 20 20 63 45 6e 64 20 3d 20 30          cEnd = 0
ae90: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
aea0: 65 20 69 66 28 20 63 3d 3d 27 22 27 20 7c 7c 20  e if( c=='"' || 
aeb0: 63 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 60  c=='\'' || c=='`
aec0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
aed0: 20 63 45 6e 64 20 3d 20 63 3b 0a 20 20 20 20 20   cEnd = c;.     
aee0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
aef0: 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20 20  =='[' ){.       
af00: 20 20 20 20 20 63 45 6e 64 20 3d 20 27 5d 27 3b       cEnd = ']';
af10: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
af20: 20 69 66 28 20 63 3d 3d 27 28 27 20 29 7b 0a 20   if( c=='(' ){. 
af30: 20 20 20 20 20 20 20 20 20 20 20 6e 50 61 72 65             nPare
af40: 6e 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  n++;.          }
af50: 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 29 27 20  else if( c==')' 
af60: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  ){.            n
af70: 50 61 72 65 6e 2d 2d 3b 0a 20 20 20 20 20 20 20  Paren--;.       
af80: 20 20 20 20 20 69 66 28 20 6e 4c 69 6e 65 3e 30       if( nLine>0
af90: 20 26 26 20 6e 50 61 72 65 6e 3d 3d 30 20 26 26   && nParen==0 &&
afa0: 20 6a 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   j>0 ){.        
afb0: 20 20 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d        printSchem
afc0: 61 4c 69 6e 65 4e 28 70 2d 3e 6f 75 74 2c 20 7a  aLineN(p->out, z
afd0: 2c 20 6a 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20  , j, "\n");.    
afe0: 20 20 20 20 20 20 20 20 20 20 6a 20 3d 20 30 3b            j = 0;
aff0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
b000: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
b010: 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b       z[j++] = c;
b020: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
b030: 50 61 72 65 6e 3d 3d 31 20 26 26 20 28 63 3d 3d  Paren==1 && (c==
b040: 27 28 27 20 7c 7c 20 63 3d 3d 27 2c 27 20 7c 7c  '(' || c==',' ||
b050: 20 63 3d 3d 27 5c 6e 27 29 20 29 7b 0a 20 20 20   c=='\n') ){.   
b060: 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d           if( c==
b070: 27 5c 6e 27 20 29 20 6a 2d 2d 3b 0a 20 20 20 20  '\n' ) j--;.    
b080: 20 20 20 20 20 20 20 20 70 72 69 6e 74 53 63 68          printSch
b090: 65 6d 61 4c 69 6e 65 4e 28 70 2d 3e 6f 75 74 2c  emaLineN(p->out,
b0a0: 20 7a 2c 20 6a 2c 20 22 5c 6e 20 20 22 29 3b 0a   z, j, "\n  ");.
b0b0: 20 20 20 20 20 20 20 20 20 20 20 20 6a 20 3d 20              j = 
b0c0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  0;.            n
b0d0: 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 20 20  Line++;.        
b0e0: 20 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61      while( IsSpa
b0f0: 63 65 28 7a 5b 69 2b 31 5d 29 20 29 7b 20 69 2b  ce(z[i+1]) ){ i+
b100: 2b 3b 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d  +; }.          }
b110: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b120: 20 20 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20     z[j] = 0;.   
b130: 20 20 20 7d 0a 20 20 20 20 20 20 70 72 69 6e 74     }.      print
b140: 53 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75  SchemaLine(p->ou
b150: 74 2c 20 7a 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20  t, z, ";\n");.  
b160: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
b170: 28 7a 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  (z);.      break
b180: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
b190: 20 4d 4f 44 45 5f 4c 69 73 74 3a 20 7b 0a 20 20   MODE_List: {.  
b1a0: 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b 2b      if( p->cnt++
b1b0: 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65  ==0 && p->showHe
b1c0: 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20  ader ){.        
b1d0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
b1e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
b1f0: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
b200: 6f 75 74 2c 22 25 73 25 73 22 2c 61 7a 43 6f 6c  out,"%s%s",azCol
b210: 5b 69 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20  [i],.           
b220: 20 20 20 20 20 20 20 69 3d 3d 6e 41 72 67 2d 31         i==nArg-1
b230: 20 3f 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74   ? p->rowSeparat
b240: 6f 72 20 3a 20 70 2d 3e 63 6f 6c 53 65 70 61 72  or : p->colSepar
b250: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ator);.        }
b260: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
b270: 66 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72  f( azArg==0 ) br
b280: 65 61 6b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  eak;.      for(i
b290: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
b2a0: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
b2b0: 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20  z = azArg[i];.  
b2c0: 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29        if( z==0 )
b2d0: 20 7a 20 3d 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75   z = p->nullValu
b2e0: 65 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  e;.        utf8_
b2f0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
b300: 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20  %s", z);.       
b310: 20 69 66 28 20 69 3c 6e 41 72 67 2d 31 20 29 7b   if( i<nArg-1 ){
b320: 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
b330: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
b340: 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  %s", p->colSepar
b350: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  ator);.        }
b360: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
b370: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
b380: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77  ut, "%s", p->row
b390: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
b3a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
b3b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b3c0: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 48  .    case MODE_H
b3d0: 74 6d 6c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  tml: {.      if(
b3e0: 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20   p->cnt++==0 && 
b3f0: 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b  p->showHeader ){
b400: 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
b410: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e  ntf(p->out,"<TR>
b420: 22 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ");.        for(
b430: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
b440: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  ){.          raw
b450: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
b460: 3c 54 48 3e 22 29 3b 0a 20 20 20 20 20 20 20 20  <TH>");.        
b470: 20 20 6f 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74    output_html_st
b480: 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 43  ring(p->out, azC
b490: 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ol[i]);.        
b4a0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
b4b0: 6f 75 74 2c 22 3c 2f 54 48 3e 5c 6e 22 29 3b 0a  out,"</TH>\n");.
b4c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
b4d0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
b4e0: 6f 75 74 2c 22 3c 2f 54 52 3e 5c 6e 22 29 3b 0a  out,"</TR>\n");.
b4f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
b500: 28 20 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65  ( azArg==0 ) bre
b510: 61 6b 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  ak;.      raw_pr
b520: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 52  intf(p->out,"<TR
b530: 3e 22 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  >");.      for(i
b540: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
b550: 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
b560: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 44  intf(p->out,"<TD
b570: 3e 22 29 3b 0a 20 20 20 20 20 20 20 20 6f 75 74  >");.        out
b580: 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67 28  put_html_string(
b590: 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d  p->out, azArg[i]
b5a0: 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d   ? azArg[i] : p-
b5b0: 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20  >nullValue);.   
b5c0: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
b5d0: 70 2d 3e 6f 75 74 2c 22 3c 2f 54 44 3e 5c 6e 22  p->out,"</TD>\n"
b5e0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
b5f0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
b600: 75 74 2c 22 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20  ut,"</TR>\n");. 
b610: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b620: 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f  }.    case MODE_
b630: 54 63 6c 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  Tcl: {.      if(
b640: 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20   p->cnt++==0 && 
b650: 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b  p->showHeader ){
b660: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
b670: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
b680: 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74            output
b690: 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  _c_string(p->out
b6a0: 2c 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f  ,azCol[i] ? azCo
b6b0: 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20  l[i] : "");.    
b6c0: 20 20 20 20 20 20 69 66 28 69 3c 6e 41 72 67 2d        if(i<nArg-
b6d0: 31 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70  1) utf8_printf(p
b6e0: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e  ->out, "%s", p->
b6f0: 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  colSeparator);. 
b700: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b710: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
b720: 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f  out, "%s", p->ro
b730: 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20  wSeparator);.   
b740: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61     }.      if( a
b750: 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b  zArg==0 ) break;
b760: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
b770: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
b780: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73        output_c_s
b790: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a  tring(p->out, az
b7a0: 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b 69  Arg[i] ? azArg[i
b7b0: 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65  ] : p->nullValue
b7c0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 69 3c  );.        if(i<
b7d0: 6e 41 72 67 2d 31 29 20 75 74 66 38 5f 70 72 69  nArg-1) utf8_pri
b7e0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
b7f0: 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
b800: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
b810: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
b820: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72  >out, "%s", p->r
b830: 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20  owSeparator);.  
b840: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b850: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 43  .    case MODE_C
b860: 73 76 3a 20 7b 0a 20 20 20 20 20 20 73 65 74 42  sv: {.      setB
b870: 69 6e 61 72 79 4d 6f 64 65 28 70 2d 3e 6f 75 74  inaryMode(p->out
b880: 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
b890: 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70  p->cnt++==0 && p
b8a0: 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a  ->showHeader ){.
b8b0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
b8c0: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
b8d0: 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f           output_
b8e0: 63 73 76 28 70 2c 20 61 7a 43 6f 6c 5b 69 5d 20  csv(p, azCol[i] 
b8f0: 3f 20 61 7a 43 6f 6c 5b 69 5d 20 3a 20 22 22 2c  ? azCol[i] : "",
b900: 20 69 3c 6e 41 72 67 2d 31 29 3b 0a 20 20 20 20   i<nArg-1);.    
b910: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74      }.        ut
b920: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
b930: 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65  , "%s", p->rowSe
b940: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
b950: 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67  }.      if( nArg
b960: 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  >0 ){.        fo
b970: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
b980: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6f  ++){.          o
b990: 75 74 70 75 74 5f 63 73 76 28 70 2c 20 61 7a 41  utput_csv(p, azA
b9a0: 72 67 5b 69 5d 2c 20 69 3c 6e 41 72 67 2d 31 29  rg[i], i<nArg-1)
b9b0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
b9c0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
b9d0: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
b9e0: 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a  >rowSeparator);.
b9f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 65        }.      se
ba00: 74 54 65 78 74 4d 6f 64 65 28 70 2d 3e 6f 75 74  tTextMode(p->out
ba10: 2c 20 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 1);.      brea
ba20: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
ba30: 65 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3a 20 7b  e MODE_Insert: {
ba40: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
ba50: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
ba60: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
ba70: 2d 3e 6f 75 74 2c 22 49 4e 53 45 52 54 20 49 4e  ->out,"INSERT IN
ba80: 54 4f 20 25 73 22 2c 70 2d 3e 7a 44 65 73 74 54  TO %s",p->zDestT
ba90: 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 69 66 28  able);.      if(
baa0: 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29   p->showHeader )
bab0: 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
bac0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 28 22 29  intf(p->out,"(")
bad0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
bae0: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
baf0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
bb00: 3e 30 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28  >0 ) raw_printf(
bb10: 70 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a 20 20  p->out, ",");.  
bb20: 20 20 20 20 20 20 20 20 69 66 28 20 71 75 6f 74          if( quot
bb30: 65 43 68 61 72 28 61 7a 43 6f 6c 5b 69 5d 29 20  eChar(azCol[i]) 
bb40: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
bb50: 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33  har *z = sqlite3
bb60: 5f 6d 70 72 69 6e 74 66 28 22 5c 22 25 77 5c 22  _mprintf("\"%w\"
bb70: 22 2c 20 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20  ", azCol[i]);.  
bb80: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
bb90: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
bba0: 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20  s", z);.        
bbb0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
bbc0: 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  (z);.          }
bbd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
bbe0: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
bbf0: 6f 75 74 2c 20 22 25 73 22 2c 20 61 7a 43 6f 6c  out, "%s", azCol
bc00: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
bc10: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
bc20: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
bc30: 2d 3e 6f 75 74 2c 22 29 22 29 3b 0a 20 20 20 20  ->out,")");.    
bc40: 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e 63 6e 74    }.      p->cnt
bc50: 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ++;.      for(i=
bc60: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
bc70: 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
bc80: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 69 3e 30 20  ntf(p->out, i>0 
bc90: 3f 20 22 2c 22 20 3a 20 22 20 56 41 4c 55 45 53  ? "," : " VALUES
bca0: 28 22 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  (");.        if(
bcb0: 20 28 61 7a 41 72 67 5b 69 5d 3d 3d 30 29 20 7c   (azArg[i]==0) |
bcc0: 7c 20 28 61 69 54 79 70 65 20 26 26 20 61 69 54  | (aiType && aiT
bcd0: 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 4e  ype[i]==SQLITE_N
bce0: 55 4c 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ULL) ){.        
bcf0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
bd00: 3e 6f 75 74 2c 22 4e 55 4c 4c 22 29 3b 0a 20 20  >out,"NULL");.  
bd10: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
bd20: 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65  aiType && aiType
bd30: 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54  [i]==SQLITE_TEXT
bd40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
bd50: 28 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70  ( ShellHasFlag(p
bd60: 2c 20 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73  , SHFLG_Newlines
bd70: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
bd80: 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73   output_quoted_s
bd90: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a  tring(p->out, az
bda0: 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[i]);.       
bdb0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
bdc0: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f        output_quo
bdd0: 74 65 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69  ted_escaped_stri
bde0: 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67  ng(p->out, azArg
bdf0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
be00: 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  }.        }else 
be10: 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69  if( aiType && ai
be20: 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f  Type[i]==SQLITE_
be30: 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20  INTEGER ){.     
be40: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
be50: 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a  (p->out,"%s", az
be60: 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[i]);.       
be70: 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70   }else if( aiTyp
be80: 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d  e && aiType[i]==
be90: 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a  SQLITE_FLOAT ){.
bea0: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 7a            char z
beb0: 5b 35 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  [50];.          
bec0: 64 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74  double r = sqlit
bed0: 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65  e3_column_double
bee0: 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20  (p->pStmt, i);. 
bef0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
bf00: 5f 73 6e 70 72 69 6e 74 66 28 35 30 2c 7a 2c 22  _snprintf(50,z,"
bf10: 25 21 2e 32 30 67 22 2c 20 72 29 3b 0a 20 20 20  %!.20g", r);.   
bf20: 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
bf30: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
bf40: 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  z);.        }els
bf50: 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20  e if( aiType && 
bf60: 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54  aiType[i]==SQLIT
bf70: 45 5f 42 4c 4f 42 20 26 26 20 70 2d 3e 70 53 74  E_BLOB && p->pSt
bf80: 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mt ){.          
bf90: 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f  const void *pBlo
bfa0: 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  b = sqlite3_colu
bfb0: 6d 6e 5f 62 6c 6f 62 28 70 2d 3e 70 53 74 6d 74  mn_blob(p->pStmt
bfc0: 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , i);.          
bfd0: 69 6e 74 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69  int nBlob = sqli
bfe0: 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73  te3_column_bytes
bff0: 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20  (p->pStmt, i);. 
c000: 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f           output_
c010: 68 65 78 5f 62 6c 6f 62 28 70 2d 3e 6f 75 74 2c  hex_blob(p->out,
c020: 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b 0a   pBlob, nBlob);.
c030: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
c040: 28 20 69 73 4e 75 6d 62 65 72 28 61 7a 41 72 67  ( isNumber(azArg
c050: 5b 69 5d 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  [i], 0) ){.     
c060: 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
c070: 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a  (p->out,"%s", az
c080: 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[i]);.       
c090: 20 7d 65 6c 73 65 20 69 66 28 20 53 68 65 6c 6c   }else if( Shell
c0a0: 48 61 73 46 6c 61 67 28 70 2c 20 53 48 46 4c 47  HasFlag(p, SHFLG
c0b0: 5f 4e 65 77 6c 69 6e 65 73 29 20 29 7b 0a 20 20  _Newlines) ){.  
c0c0: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71          output_q
c0d0: 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e  uoted_string(p->
c0e0: 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  out, azArg[i]);.
c0f0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
c100: 20 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f           output_
c110: 71 75 6f 74 65 64 5f 65 73 63 61 70 65 64 5f 73  quoted_escaped_s
c120: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a  tring(p->out, az
c130: 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[i]);.       
c140: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
c150: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
c160: 75 74 2c 22 29 3b 5c 6e 22 29 3b 0a 20 20 20 20  ut,");\n");.    
c170: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
c180: 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 51 75 6f     case MODE_Quo
c190: 74 65 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  te: {.      if( 
c1a0: 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b  azArg==0 ) break
c1b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63  ;.      if( p->c
c1c0: 6e 74 3d 3d 30 20 26 26 20 70 2d 3e 73 68 6f 77  nt==0 && p->show
c1d0: 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20 20 20  Header ){.      
c1e0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72    for(i=0; i<nAr
c1f0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
c200: 20 20 20 69 66 28 20 69 3e 30 20 29 20 72 61 77     if( i>0 ) raw
c210: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
c220: 22 2c 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ",");.          
c230: 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74  output_quoted_st
c240: 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 43  ring(p->out, azC
c250: 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  ol[i]);.        
c260: 7d 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  }.        raw_pr
c270: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22  intf(p->out,"\n"
c280: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
c290: 20 70 2d 3e 63 6e 74 2b 2b 3b 0a 20 20 20 20 20   p->cnt++;.     
c2a0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
c2b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
c2c0: 69 66 28 20 69 3e 30 20 29 20 72 61 77 5f 70 72  if( i>0 ) raw_pr
c2d0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 22  intf(p->out, ","
c2e0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28  );.        if( (
c2f0: 61 7a 41 72 67 5b 69 5d 3d 3d 30 29 20 7c 7c 20  azArg[i]==0) || 
c300: 28 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70  (aiType && aiTyp
c310: 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c  e[i]==SQLITE_NUL
c320: 4c 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  L) ){.          
c330: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
c340: 75 74 2c 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20  ut,"NULL");.    
c350: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69      }else if( ai
c360: 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69  Type && aiType[i
c370: 5d 3d 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29  ]==SQLITE_TEXT )
c380: 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70  {.          outp
c390: 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67  ut_quoted_string
c3a0: 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69  (p->out, azArg[i
c3b0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  ]);.        }els
c3c0: 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26 20  e if( aiType && 
c3d0: 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54  aiType[i]==SQLIT
c3e0: 45 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20  E_INTEGER ){.   
c3f0: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
c400: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 20  tf(p->out,"%s", 
c410: 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20  azArg[i]);.     
c420: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54     }else if( aiT
c430: 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d  ype && aiType[i]
c440: 3d 3d 53 51 4c 49 54 45 5f 46 4c 4f 41 54 20 29  ==SQLITE_FLOAT )
c450: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72  {.          char
c460: 20 7a 5b 35 30 5d 3b 0a 20 20 20 20 20 20 20 20   z[50];.        
c470: 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 73 71 6c    double r = sql
c480: 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62  ite3_column_doub
c490: 6c 65 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b  le(p->pStmt, i);
c4a0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
c4b0: 65 33 5f 73 6e 70 72 69 6e 74 66 28 35 30 2c 7a  e3_snprintf(50,z
c4c0: 2c 22 25 21 2e 32 30 67 22 2c 20 72 29 3b 0a 20  ,"%!.20g", r);. 
c4d0: 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
c4e0: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
c4f0: 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , z);.        }e
c500: 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26  lse if( aiType &
c510: 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c  & aiType[i]==SQL
c520: 49 54 45 5f 42 4c 4f 42 20 26 26 20 70 2d 3e 70  ITE_BLOB && p->p
c530: 53 74 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Stmt ){.        
c540: 20 20 63 6f 6e 73 74 20 76 6f 69 64 20 2a 70 42    const void *pB
c550: 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f  lob = sqlite3_co
c560: 6c 75 6d 6e 5f 62 6c 6f 62 28 70 2d 3e 70 53 74  lumn_blob(p->pSt
c570: 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20  mt, i);.        
c580: 20 20 69 6e 74 20 6e 42 6c 6f 62 20 3d 20 73 71    int nBlob = sq
c590: 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74  lite3_column_byt
c5a0: 65 73 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29 3b  es(p->pStmt, i);
c5b0: 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75  .          outpu
c5c0: 74 5f 68 65 78 5f 62 6c 6f 62 28 70 2d 3e 6f 75  t_hex_blob(p->ou
c5d0: 74 2c 20 70 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29  t, pBlob, nBlob)
c5e0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
c5f0: 69 66 28 20 69 73 4e 75 6d 62 65 72 28 61 7a 41  if( isNumber(azA
c600: 72 67 5b 69 5d 2c 20 30 29 20 29 7b 0a 20 20 20  rg[i], 0) ){.   
c610: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
c620: 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 20  tf(p->out,"%s", 
c630: 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20  azArg[i]);.     
c640: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c650: 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65      output_quote
c660: 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c  d_string(p->out,
c670: 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20   azArg[i]);.    
c680: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
c690: 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
c6a0: 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20 20 20  ->out,"\n");.   
c6b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
c6c0: 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 41 73      case MODE_As
c6d0: 63 69 69 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  cii: {.      if(
c6e0: 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20 26 26 20   p->cnt++==0 && 
c6f0: 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 29 7b  p->showHeader ){
c700: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
c710: 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a  ; i<nArg; i++){.
c720: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e            if( i>
c730: 30 20 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28  0 ) utf8_printf(
c740: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
c750: 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a  >colSeparator);.
c760: 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
c770: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 73  rintf(p->out,"%s
c780: 22 2c 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43  ",azCol[i] ? azC
c790: 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a 20 20 20  ol[i] : "");.   
c7a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75       }.        u
c7b0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
c7c0: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53  t, "%s", p->rowS
c7d0: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
c7e0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41   }.      if( azA
c7f0: 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  rg==0 ) break;. 
c800: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
c810: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
c820: 20 20 20 20 69 66 28 20 69 3e 30 20 29 20 75 74      if( i>0 ) ut
c830: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
c840: 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53 65  , "%s", p->colSe
c850: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
c860: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
c870: 3e 6f 75 74 2c 22 25 73 22 2c 61 7a 41 72 67 5b  >out,"%s",azArg[
c880: 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20  i] ? azArg[i] : 
c890: 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20  p->nullValue);. 
c8a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 74 66       }.      utf
c8b0: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
c8c0: 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70   "%s", p->rowSep
c8d0: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 62  arator);.      b
c8e0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
c8f0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
c900: 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65  *.** This is the
c910: 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
c920: 65 20 74 68 61 74 20 74 68 65 20 53 51 4c 69 74  e that the SQLit
c930: 65 20 6c 69 62 72 61 72 79 0a 2a 2a 20 69 6e 76  e library.** inv
c940: 6f 6b 65 73 20 66 6f 72 20 65 61 63 68 20 72 6f  okes for each ro
c950: 77 20 6f 66 20 61 20 71 75 65 72 79 20 72 65 73  w of a query res
c960: 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ult..*/.static i
c970: 6e 74 20 63 61 6c 6c 62 61 63 6b 28 76 6f 69 64  nt callback(void
c980: 20 2a 70 41 72 67 2c 20 69 6e 74 20 6e 41 72 67   *pArg, int nArg
c990: 2c 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20  , char **azArg, 
c9a0: 63 68 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20  char **azCol){. 
c9b0: 20 2f 2a 20 73 69 6e 63 65 20 77 65 20 64 6f 6e   /* since we don
c9c0: 27 74 20 68 61 76 65 20 74 79 70 65 20 69 6e 66  't have type inf
c9d0: 6f 2c 20 63 61 6c 6c 20 74 68 65 20 73 68 65 6c  o, call the shel
c9e0: 6c 5f 63 61 6c 6c 62 61 63 6b 20 77 69 74 68 20  l_callback with 
c9f0: 61 20 4e 55 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a  a NULL value */.
ca00: 20 20 72 65 74 75 72 6e 20 73 68 65 6c 6c 5f 63    return shell_c
ca10: 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20 6e 41  allback(pArg, nA
ca20: 72 67 2c 20 61 7a 41 72 67 2c 20 61 7a 43 6f 6c  rg, azArg, azCol
ca30: 2c 20 4e 55 4c 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  , NULL);.}../*.*
ca40: 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 63 61  * This is the ca
ca50: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 66  llback routine f
ca60: 72 6f 6d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  rom sqlite3_exec
ca70: 28 29 20 74 68 61 74 20 61 70 70 65 6e 64 73 20  () that appends 
ca80: 61 6c 6c 0a 2a 2a 20 6f 75 74 70 75 74 20 6f 6e  all.** output on
ca90: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  to the end of a 
caa0: 53 68 65 6c 6c 54 65 78 74 20 6f 62 6a 65 63 74  ShellText object
cab0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
cac0: 63 61 70 74 75 72 65 4f 75 74 70 75 74 43 61 6c  captureOutputCal
cad0: 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67  lback(void *pArg
cae0: 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72  , int nArg, char
caf0: 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a   **azArg, char *
cb00: 2a 61 7a 29 7b 0a 20 20 53 68 65 6c 6c 54 65 78  *az){.  ShellTex
cb10: 74 20 2a 70 20 3d 20 28 53 68 65 6c 6c 54 65 78  t *p = (ShellTex
cb20: 74 2a 29 70 41 72 67 3b 0a 20 20 69 6e 74 20 69  t*)pArg;.  int i
cb30: 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
cb40: 45 54 45 52 28 61 7a 29 3b 0a 20 20 69 66 28 20  ETER(az);.  if( 
cb50: 61 7a 41 72 67 3d 3d 30 20 29 20 72 65 74 75 72  azArg==0 ) retur
cb60: 6e 20 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6e 20  n 0;.  if( p->n 
cb70: 29 20 61 70 70 65 6e 64 54 65 78 74 28 70 2c 20  ) appendText(p, 
cb80: 22 7c 22 2c 20 30 29 3b 0a 20 20 66 6f 72 28 69  "|", 0);.  for(i
cb90: 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =0; i<nArg; i++)
cba0: 7b 0a 20 20 20 20 69 66 28 20 69 20 29 20 61 70  {.    if( i ) ap
cbb0: 70 65 6e 64 54 65 78 74 28 70 2c 20 22 2c 22 2c  pendText(p, ",",
cbc0: 20 30 29 3b 0a 20 20 20 20 69 66 28 20 61 7a 41   0);.    if( azA
cbd0: 72 67 5b 69 5d 20 29 20 61 70 70 65 6e 64 54 65  rg[i] ) appendTe
cbe0: 78 74 28 70 2c 20 61 7a 41 72 67 5b 69 5d 2c 20  xt(p, azArg[i], 
cbf0: 30 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  0);.  }.  return
cc00: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e   0;.}../*.** Gen
cc10: 65 72 61 74 65 20 61 6e 20 61 70 70 72 6f 70 72  erate an appropr
cc20: 69 61 74 65 20 53 45 4c 46 54 45 53 54 20 74 61  iate SELFTEST ta
cc30: 62 6c 65 20 69 6e 20 74 68 65 20 6d 61 69 6e 20  ble in the main 
cc40: 64 61 74 61 62 61 73 65 2e 0a 2a 2f 0a 73 74 61  database..*/.sta
cc50: 74 69 63 20 76 6f 69 64 20 63 72 65 61 74 65 53  tic void createS
cc60: 65 6c 66 74 65 73 74 54 61 62 6c 65 28 53 68 65  elftestTable(She
cc70: 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 63  llState *p){.  c
cc80: 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
cc90: 3b 0a 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63  ;.  sqlite3_exec
cca0: 28 70 2d 3e 64 62 2c 0a 20 20 20 20 22 53 41 56  (p->db,.    "SAV
ccb0: 45 50 4f 49 4e 54 20 73 65 6c 66 74 65 73 74 5f  EPOINT selftest_
ccc0: 69 6e 69 74 3b 5c 6e 22 0a 20 20 20 20 22 43 52  init;\n".    "CR
ccd0: 45 41 54 45 20 54 41 42 4c 45 20 49 46 20 4e 4f  EATE TABLE IF NO
cce0: 54 20 45 58 49 53 54 53 20 73 65 6c 66 74 65 73  T EXISTS selftes
ccf0: 74 28 5c 6e 22 0a 20 20 20 20 22 20 20 74 6e 6f  t(\n".    "  tno
cd00: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
cd10: 20 4b 45 59 2c 5c 6e 22 20 20 20 2f 2a 20 54 65   KEY,\n"   /* Te
cd20: 73 74 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20  st number */.   
cd30: 20 22 20 20 6f 70 20 54 45 58 54 2c 5c 6e 22 20   "  op TEXT,\n" 
cd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd50: 20 20 2f 2a 20 4f 70 65 72 61 74 6f 72 3a 20 20    /* Operator:  
cd60: 6d 65 6d 6f 20 72 75 6e 20 2a 2f 0a 20 20 20 20  memo run */.    
cd70: 22 20 20 63 6d 64 20 54 45 58 54 2c 5c 6e 22 20  "  cmd TEXT,\n" 
cd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cd90: 20 2f 2a 20 43 6f 6d 6d 61 6e 64 20 74 65 78 74   /* Command text
cda0: 20 2a 2f 0a 20 20 20 20 22 20 20 61 6e 73 20 54   */.    "  ans T
cdb0: 45 58 54 5c 6e 22 20 20 20 20 20 20 20 20 20 20  EXT\n"          
cdc0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 65 73 69           /* Desi
cdd0: 72 65 64 20 61 6e 73 77 65 72 20 2a 2f 0a 20 20  red answer */.  
cde0: 20 20 22 29 3b 22 0a 20 20 20 20 22 43 52 45 41    ");".    "CREA
cdf0: 54 45 20 54 45 4d 50 20 54 41 42 4c 45 20 5b 5f  TE TEMP TABLE [_
ce00: 73 68 65 6c 6c 24 73 65 6c 66 5d 28 6f 70 2c 63  shell$self](op,c
ce10: 6d 64 2c 61 6e 73 29 3b 5c 6e 22 0a 20 20 20 20  md,ans);\n".    
ce20: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73  "INSERT INTO [_s
ce30: 68 65 6c 6c 24 73 65 6c 66 5d 28 72 6f 77 69 64  hell$self](rowid
ce40: 2c 6f 70 2c 63 6d 64 29 5c 6e 22 0a 20 20 20 20  ,op,cmd)\n".    
ce50: 22 20 20 56 41 4c 55 45 53 28 63 6f 61 6c 65 73  "  VALUES(coales
ce60: 63 65 28 28 53 45 4c 45 43 54 20 28 6d 61 78 28  ce((SELECT (max(
ce70: 74 6e 6f 29 2b 31 30 30 29 2f 31 30 20 46 52 4f  tno)+100)/10 FRO
ce80: 4d 20 73 65 6c 66 74 65 73 74 29 2c 31 30 29 2c  M selftest),10),
ce90: 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 20 20 20  \n".    "       
cea0: 20 20 27 6d 65 6d 6f 27 2c 27 54 65 73 74 73 20    'memo','Tests 
ceb0: 67 65 6e 65 72 61 74 65 64 20 62 79 20 2d 2d 69  generated by --i
cec0: 6e 69 74 27 29 3b 5c 6e 22 0a 20 20 20 20 22 49  nit');\n".    "I
ced0: 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65  NSERT INTO [_she
cee0: 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20 20 20 20  ll$self]\n".    
cef0: 22 20 20 53 45 4c 45 43 54 20 27 72 75 6e 27 2c  "  SELECT 'run',
cf00: 5c 6e 22 0a 20 20 20 20 22 20 20 20 20 27 53 45  \n".    "    'SE
cf10: 4c 45 43 54 20 68 65 78 28 73 68 61 33 5f 71 75  LECT hex(sha3_qu
cf20: 65 72 79 28 27 27 53 45 4c 45 43 54 20 74 79 70  ery(''SELECT typ
cf30: 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c  e,name,tbl_name,
cf40: 73 71 6c 20 22 0a 20 20 20 20 20 20 20 20 20 20  sql ".          
cf50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf60: 20 20 20 20 20 20 20 22 46 52 4f 4d 20 73 71 6c         "FROM sql
cf70: 69 74 65 5f 6d 61 73 74 65 72 20 4f 52 44 45 52  ite_master ORDER
cf80: 20 42 59 20 32 27 27 2c 32 32 34 29 29 27 2c 5c   BY 2'',224))',\
cf90: 6e 22 0a 20 20 20 20 22 20 20 20 20 68 65 78 28  n".    "    hex(
cfa0: 73 68 61 33 5f 71 75 65 72 79 28 27 53 45 4c 45  sha3_query('SELE
cfb0: 43 54 20 74 79 70 65 2c 6e 61 6d 65 2c 74 62 6c  CT type,name,tbl
cfc0: 5f 6e 61 6d 65 2c 73 71 6c 20 22 0a 20 20 20 20  _name,sql ".    
cfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfe0: 20 20 20 20 20 20 22 46 52 4f 4d 20 73 71 6c 69        "FROM sqli
cff0: 74 65 5f 6d 61 73 74 65 72 20 4f 52 44 45 52 20  te_master ORDER 
d000: 42 59 20 32 27 2c 32 32 34 29 29 3b 5c 6e 22 0a  BY 2',224));\n".
d010: 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
d020: 20 5b 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e   [_shell$self]\n
d030: 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43 54 20  ".    "  SELECT 
d040: 27 72 75 6e 27 2c 22 0a 20 20 20 20 22 20 20 20  'run',".    "   
d050: 20 27 53 45 4c 45 43 54 20 68 65 78 28 73 68 61   'SELECT hex(sha
d060: 33 5f 71 75 65 72 79 28 27 27 53 45 4c 45 43 54  3_query(''SELECT
d070: 20 2a 20 46 52 4f 4d 20 5c 22 27 20 7c 7c 22 0a   * FROM \"' ||".
d080: 20 20 20 20 22 20 20 20 20 20 20 20 20 70 72 69      "        pri
d090: 6e 74 66 28 27 25 77 27 2c 6e 61 6d 65 29 20 7c  ntf('%w',name) |
d0a0: 7c 20 27 5c 22 20 4e 4f 54 20 49 4e 44 45 58 45  | '\" NOT INDEXE
d0b0: 44 27 27 2c 32 32 34 29 29 27 2c 5c 6e 22 0a 20  D'',224))',\n". 
d0c0: 20 20 20 22 20 20 20 20 68 65 78 28 73 68 61 33     "    hex(sha3
d0d0: 5f 71 75 65 72 79 28 70 72 69 6e 74 66 28 27 53  _query(printf('S
d0e0: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22 25  ELECT * FROM \"%
d0f0: 77 5c 22 20 4e 4f 54 20 49 4e 44 45 58 45 44 27  w\" NOT INDEXED'
d100: 2c 6e 61 6d 65 29 2c 32 32 34 29 29 5c 6e 22 0a  ,name),224))\n".
d110: 20 20 20 20 22 20 20 46 52 4f 4d 20 28 5c 6e 22      "  FROM (\n"
d120: 0a 20 20 20 20 22 20 20 20 20 53 45 4c 45 43 54  .    "    SELECT
d130: 20 6e 61 6d 65 20 46 52 4f 4d 20 73 71 6c 69 74   name FROM sqlit
d140: 65 5f 6d 61 73 74 65 72 5c 6e 22 0a 20 20 20 20  e_master\n".    
d150: 22 20 20 20 20 20 57 48 45 52 45 20 74 79 70 65  "     WHERE type
d160: 3d 27 74 61 62 6c 65 27 5c 6e 22 0a 20 20 20 20  ='table'\n".    
d170: 22 20 20 20 20 20 20 20 41 4e 44 20 6e 61 6d 65  "       AND name
d180: 3c 3e 27 73 65 6c 66 74 65 73 74 27 5c 6e 22 0a  <>'selftest'\n".
d190: 20 20 20 20 22 20 20 20 20 20 20 20 41 4e 44 20      "       AND 
d1a0: 63 6f 61 6c 65 73 63 65 28 72 6f 6f 74 70 61 67  coalesce(rootpag
d1b0: 65 2c 30 29 3e 30 5c 6e 22 0a 20 20 20 20 22 20  e,0)>0\n".    " 
d1c0: 20 29 5c 6e 22 0a 20 20 20 20 22 20 4f 52 44 45   )\n".    " ORDE
d1d0: 52 20 42 59 20 6e 61 6d 65 3b 5c 6e 22 0a 20 20  R BY name;\n".  
d1e0: 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b    "INSERT INTO [
d1f0: 5f 73 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a  _shell$self]\n".
d200: 20 20 20 20 22 20 20 56 41 4c 55 45 53 28 27 72      "  VALUES('r
d210: 75 6e 27 2c 27 50 52 41 47 4d 41 20 69 6e 74 65  un','PRAGMA inte
d220: 67 72 69 74 79 5f 63 68 65 63 6b 27 2c 27 6f 6b  grity_check','ok
d230: 27 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45  ');\n".    "INSE
d240: 52 54 20 49 4e 54 4f 20 73 65 6c 66 74 65 73 74  RT INTO selftest
d250: 28 74 6e 6f 2c 6f 70 2c 63 6d 64 2c 61 6e 73 29  (tno,op,cmd,ans)
d260: 22 0a 20 20 20 20 22 20 20 53 45 4c 45 43 54 20  ".    "  SELECT 
d270: 72 6f 77 69 64 2a 31 30 2c 6f 70 2c 63 6d 64 2c  rowid*10,op,cmd,
d280: 61 6e 73 20 46 52 4f 4d 20 5b 5f 73 68 65 6c 6c  ans FROM [_shell
d290: 24 73 65 6c 66 5d 3b 5c 6e 22 0a 20 20 20 20 22  $self];\n".    "
d2a0: 44 52 4f 50 20 54 41 42 4c 45 20 5b 5f 73 68 65  DROP TABLE [_she
d2b0: 6c 6c 24 73 65 6c 66 5d 3b 22 0a 20 20 20 20 2c  ll$self];".    ,
d2c0: 30 2c 30 2c 26 7a 45 72 72 4d 73 67 29 3b 0a 20  0,0,&zErrMsg);. 
d2d0: 20 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a   if( zErrMsg ){.
d2e0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
d2f0: 73 74 64 65 72 72 2c 20 22 53 45 4c 46 54 45 53  stderr, "SELFTES
d300: 54 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  T initialization
d310: 20 66 61 69 6c 75 72 65 3a 20 25 73 5c 6e 22 2c   failure: %s\n",
d320: 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 73   zErrMsg);.    s
d330: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
d340: 4d 73 67 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  Msg);.  }.  sqli
d350: 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
d360: 22 52 45 4c 45 41 53 45 20 73 65 6c 66 74 65 73  "RELEASE selftes
d370: 74 5f 69 6e 69 74 22 2c 30 2c 30 2c 30 29 3b 0a  t_init",0,0,0);.
d380: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  }.../*.** Set th
d390: 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 74 61  e destination ta
d3a0: 62 6c 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65  ble field of the
d3b0: 20 53 68 65 6c 6c 53 74 61 74 65 20 73 74 72 75   ShellState stru
d3c0: 63 74 75 72 65 20 74 6f 0a 2a 2a 20 74 68 65 20  cture to.** the 
d3d0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
d3e0: 65 20 67 69 76 65 6e 2e 20 20 45 73 63 61 70 65  e given.  Escape
d3f0: 20 61 6e 79 20 71 75 6f 74 65 20 63 68 61 72 61   any quote chara
d400: 63 74 65 72 73 20 69 6e 20 74 68 65 0a 2a 2a 20  cters in the.** 
d410: 74 61 62 6c 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 73  table name..*/.s
d420: 74 61 74 69 63 20 76 6f 69 64 20 73 65 74 5f 74  tatic void set_t
d430: 61 62 6c 65 5f 6e 61 6d 65 28 53 68 65 6c 6c 53  able_name(ShellS
d440: 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73 74 20 63  tate *p, const c
d450: 68 61 72 20 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69  har *zName){.  i
d460: 6e 74 20 69 2c 20 6e 3b 0a 20 20 63 68 61 72 20  nt i, n;.  char 
d470: 63 51 75 6f 74 65 3b 0a 20 20 63 68 61 72 20 2a  cQuote;.  char *
d480: 7a 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 7a 44 65  z;..  if( p->zDe
d490: 73 74 54 61 62 6c 65 20 29 7b 0a 20 20 20 20 66  stTable ){.    f
d4a0: 72 65 65 28 70 2d 3e 7a 44 65 73 74 54 61 62 6c  ree(p->zDestTabl
d4b0: 65 29 3b 0a 20 20 20 20 70 2d 3e 7a 44 65 73 74  e);.    p->zDest
d4c0: 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 7d 0a 20  Table = 0;.  }. 
d4d0: 20 69 66 28 20 7a 4e 61 6d 65 3d 3d 30 20 29 20   if( zName==0 ) 
d4e0: 72 65 74 75 72 6e 3b 0a 20 20 63 51 75 6f 74 65  return;.  cQuote
d4f0: 20 3d 20 71 75 6f 74 65 43 68 61 72 28 7a 4e 61   = quoteChar(zNa
d500: 6d 65 29 3b 0a 20 20 6e 20 3d 20 73 74 72 6c 65  me);.  n = strle
d510: 6e 33 30 28 7a 4e 61 6d 65 29 3b 0a 20 20 69 66  n30(zName);.  if
d520: 28 20 63 51 75 6f 74 65 20 29 20 6e 20 2b 3d 20  ( cQuote ) n += 
d530: 6e 2b 32 3b 0a 20 20 7a 20 3d 20 70 2d 3e 7a 44  n+2;.  z = p->zD
d540: 65 73 74 54 61 62 6c 65 20 3d 20 6d 61 6c 6c 6f  estTable = mallo
d550: 63 28 20 6e 2b 31 20 29 3b 0a 20 20 69 66 28 20  c( n+1 );.  if( 
d560: 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61 77 5f  z==0 ){.    raw_
d570: 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
d580: 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d  rror: out of mem
d590: 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 65 78 69  ory\n");.    exi
d5a0: 74 28 31 29 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20  t(1);.  }.  n = 
d5b0: 30 3b 0a 20 20 69 66 28 20 63 51 75 6f 74 65 20  0;.  if( cQuote 
d5c0: 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75 6f 74  ) z[n++] = cQuot
d5d0: 65 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 7a 4e  e;.  for(i=0; zN
d5e0: 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  ame[i]; i++){.  
d5f0: 20 20 7a 5b 6e 2b 2b 5d 20 3d 20 7a 4e 61 6d 65    z[n++] = zName
d600: 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20 7a 4e 61  [i];.    if( zNa
d610: 6d 65 5b 69 5d 3d 3d 63 51 75 6f 74 65 20 29 20  me[i]==cQuote ) 
d620: 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75 6f 74 65 3b  z[n++] = cQuote;
d630: 0a 20 20 7d 0a 20 20 69 66 28 20 63 51 75 6f 74  .  }.  if( cQuot
d640: 65 20 29 20 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75  e ) z[n++] = cQu
d650: 6f 74 65 3b 0a 20 20 7a 5b 6e 5d 20 3d 20 30 3b  ote;.  z[n] = 0;
d660: 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75  .}.../*.** Execu
d670: 74 65 20 61 20 71 75 65 72 79 20 73 74 61 74 65  te a query state
d680: 6d 65 6e 74 20 74 68 61 74 20 77 69 6c 6c 20 67  ment that will g
d690: 65 6e 65 72 61 74 65 20 53 51 4c 20 6f 75 74 70  enerate SQL outp
d6a0: 75 74 2e 20 20 50 72 69 6e 74 0a 2a 2a 20 74 68  ut.  Print.** th
d6b0: 65 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e 73  e result columns
d6c0: 2c 20 63 6f 6d 6d 61 2d 73 65 70 61 72 61 74 65  , comma-separate
d6d0: 64 2c 20 6f 6e 20 61 20 6c 69 6e 65 20 61 6e 64  d, on a line and
d6e0: 20 74 68 65 6e 20 61 64 64 20 61 0a 2a 2a 20 73   then add a.** s
d6f0: 65 6d 69 63 6f 6c 6f 6e 20 74 65 72 6d 69 6e 61  emicolon termina
d700: 74 6f 72 20 74 6f 20 74 68 65 20 65 6e 64 20 6f  tor to the end o
d710: 66 20 74 68 61 74 20 6c 69 6e 65 2e 0a 2a 2a 0a  f that line..**.
d720: 2a 2a 20 49 66 20 74 68 65 20 6e 75 6d 62 65 72  ** If the number
d730: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 73 20 31   of columns is 1
d740: 20 61 6e 64 20 74 68 61 74 20 63 6f 6c 75 6d 6e   and that column
d750: 20 63 6f 6e 74 61 69 6e 73 20 74 65 78 74 20 22   contains text "
d760: 2d 2d 22 0a 2a 2a 20 74 68 65 6e 20 77 72 69 74  --".** then writ
d770: 65 20 74 68 65 20 73 65 6d 69 63 6f 6c 6f 6e 20  e the semicolon 
d780: 6f 6e 20 61 20 73 65 70 61 72 61 74 65 20 6c 69  on a separate li
d790: 6e 65 2e 20 20 54 68 61 74 20 77 61 79 2c 20 69  ne.  That way, i
d7a0: 66 20 61 0a 2a 2a 20 22 2d 2d 22 20 63 6f 6d 6d  f a.** "--" comm
d7b0: 65 6e 74 20 6f 63 63 75 72 73 20 61 74 20 74 68  ent occurs at th
d7c0: 65 20 65 6e 64 20 6f 66 20 74 68 65 20 73 74 61  e end of the sta
d7d0: 74 65 6d 65 6e 74 2c 20 74 68 65 20 63 6f 6d 6d  tement, the comm
d7e0: 65 6e 74 0a 2a 2a 20 77 6f 6e 27 74 20 63 6f 6e  ent.** won't con
d7f0: 73 75 6d 65 20 74 68 65 20 73 65 6d 69 63 6f 6c  sume the semicol
d800: 6f 6e 20 74 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a  on terminator..*
d810: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 75 6e  /.static int run
d820: 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72  _table_dump_quer
d830: 79 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  y(.  ShellState 
d840: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 2f 2a  *p,           /*
d850: 20 51 75 65 72 79 20 63 6f 6e 74 65 78 74 20 2a   Query context *
d860: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
d870: 7a 53 65 6c 65 63 74 2c 20 20 20 20 20 2f 2a 20  zSelect,     /* 
d880: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
d890: 20 74 6f 20 65 78 74 72 61 63 74 20 63 6f 6e 74   to extract cont
d8a0: 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ent */.  const c
d8b0: 68 61 72 20 2a 7a 46 69 72 73 74 52 6f 77 20 20  har *zFirstRow  
d8c0: 20 20 2f 2a 20 50 72 69 6e 74 20 62 65 66 6f 72    /* Print befor
d8d0: 65 20 66 69 72 73 74 20 72 6f 77 2c 20 69 66 20  e first row, if 
d8e0: 6e 6f 74 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20  not NULL */.){. 
d8f0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
d900: 53 65 6c 65 63 74 3b 0a 20 20 69 6e 74 20 72 63  Select;.  int rc
d910: 3b 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74 3b  ;.  int nResult;
d920: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f 6e 73  .  int i;.  cons
d930: 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 72 63 20  t char *z;.  rc 
d940: 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
d950: 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 65 6c  e_v2(p->db, zSel
d960: 65 63 74 2c 20 2d 31 2c 20 26 70 53 65 6c 65 63  ect, -1, &pSelec
d970: 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 21  t, 0);.  if( rc!
d980: 3d 53 51 4c 49 54 45 5f 4f 4b 20 7c 7c 20 21 70  =SQLITE_OK || !p
d990: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 75 74  Select ){.    ut
d9a0: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
d9b0: 2c 20 22 2f 2a 2a 2a 2a 20 45 52 52 4f 52 3a 20  , "/**** ERROR: 
d9c0: 28 25 64 29 20 25 73 20 2a 2a 2a 2a 2a 2f 5c 6e  (%d) %s *****/\n
d9d0: 22 2c 20 72 63 2c 0a 20 20 20 20 20 20 20 20 20  ", rc,.         
d9e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
d9f0: 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
da00: 20 20 20 69 66 28 20 28 72 63 26 30 78 66 66 29     if( (rc&0xff)
da10: 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54  !=SQLITE_CORRUPT
da20: 20 29 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20   ) p->nErr++;.  
da30: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 7d    return rc;.  }
da40: 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  .  rc = sqlite3_
da50: 73 74 65 70 28 70 53 65 6c 65 63 74 29 3b 0a 20  step(pSelect);. 
da60: 20 6e 52 65 73 75 6c 74 20 3d 20 73 71 6c 69 74   nResult = sqlit
da70: 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
da80: 70 53 65 6c 65 63 74 29 3b 0a 20 20 77 68 69 6c  pSelect);.  whil
da90: 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52 4f  e( rc==SQLITE_RO
daa0: 57 20 29 7b 0a 20 20 20 20 69 66 28 20 7a 46 69  W ){.    if( zFi
dab0: 72 73 74 52 6f 77 20 29 7b 0a 20 20 20 20 20 20  rstRow ){.      
dac0: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
dad0: 75 74 2c 20 22 25 73 22 2c 20 7a 46 69 72 73 74  ut, "%s", zFirst
dae0: 52 6f 77 29 3b 0a 20 20 20 20 20 20 7a 46 69 72  Row);.      zFir
daf0: 73 74 52 6f 77 20 3d 20 30 3b 0a 20 20 20 20 7d  stRow = 0;.    }
db00: 0a 20 20 20 20 7a 20 3d 20 28 63 6f 6e 73 74 20  .    z = (const 
db10: 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
db20: 6c 75 6d 6e 5f 74 65 78 74 28 70 53 65 6c 65 63  lumn_text(pSelec
db30: 74 2c 20 30 29 3b 0a 20 20 20 20 75 74 66 38 5f  t, 0);.    utf8_
db40: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
db50: 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 66 6f 72  %s", z);.    for
db60: 28 69 3d 31 3b 20 69 3c 6e 52 65 73 75 6c 74 3b  (i=1; i<nResult;
db70: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 75 74 66   i++){.      utf
db80: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
db90: 20 22 2c 25 73 22 2c 20 73 71 6c 69 74 65 33 5f   ",%s", sqlite3_
dba0: 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 65 6c  column_text(pSel
dbb0: 65 63 74 2c 20 69 29 29 3b 0a 20 20 20 20 7d 0a  ect, i));.    }.
dbc0: 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a      if( z==0 ) z
dbd0: 20 3d 20 22 22 3b 0a 20 20 20 20 77 68 69 6c 65   = "";.    while
dbe0: 28 20 7a 5b 30 5d 20 26 26 20 28 7a 5b 30 5d 21  ( z[0] && (z[0]!
dbf0: 3d 27 2d 27 20 7c 7c 20 7a 5b 31 5d 21 3d 27 2d  ='-' || z[1]!='-
dc00: 27 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 69 66  ') ) z++;.    if
dc10: 28 20 7a 5b 30 5d 20 29 7b 0a 20 20 20 20 20 20  ( z[0] ){.      
dc20: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
dc30: 74 2c 20 22 5c 6e 3b 5c 6e 22 29 3b 0a 20 20 20  t, "\n;\n");.   
dc40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
dc50: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
dc60: 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20   ";\n");.    }. 
dc70: 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
dc80: 73 74 65 70 28 70 53 65 6c 65 63 74 29 3b 0a 20  step(pSelect);. 
dc90: 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65   }.  rc = sqlite
dca0: 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 65 6c 65  3_finalize(pSele
dcb0: 63 74 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53  ct);.  if( rc!=S
dcc0: 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
dcd0: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
dce0: 75 74 2c 20 22 2f 2a 2a 2a 2a 20 45 52 52 4f 52  ut, "/**** ERROR
dcf0: 3a 20 28 25 64 29 20 25 73 20 2a 2a 2a 2a 2a 2f  : (%d) %s *****/
dd00: 5c 6e 22 2c 20 72 63 2c 0a 20 20 20 20 20 20 20  \n", rc,.       
dd10: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
dd20: 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
dd30: 0a 20 20 20 20 69 66 28 20 28 72 63 26 30 78 66  .    if( (rc&0xf
dd40: 66 29 21 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55  f)!=SQLITE_CORRU
dd50: 50 54 20 29 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a  PT ) p->nErr++;.
dd60: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
dd70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61  .}../*.** Alloca
dd80: 74 65 20 73 70 61 63 65 20 61 6e 64 20 73 61 76  te space and sav
dd90: 65 20 6f 66 66 20 63 75 72 72 65 6e 74 20 65 72  e off current er
dda0: 72 6f 72 20 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73  ror string..*/.s
ddb0: 74 61 74 69 63 20 63 68 61 72 20 2a 73 61 76 65  tatic char *save
ddc0: 5f 65 72 72 5f 6d 73 67 28 0a 20 20 73 71 6c 69  _err_msg(.  sqli
ddd0: 74 65 33 20 2a 64 62 20 20 20 20 20 20 20 20 20  te3 *db         
dde0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 74     /* Database t
ddf0: 6f 20 71 75 65 72 79 20 2a 2f 0a 29 7b 0a 20 20  o query */.){.  
de00: 69 6e 74 20 6e 45 72 72 4d 73 67 20 3d 20 31 2b  int nErrMsg = 1+
de10: 73 74 72 6c 65 6e 33 30 28 73 71 6c 69 74 65 33  strlen30(sqlite3
de20: 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20 20  _errmsg(db));.  
de30: 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
de40: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
de50: 28 6e 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28  (nErrMsg);.  if(
de60: 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20   zErrMsg ){.    
de70: 6d 65 6d 63 70 79 28 7a 45 72 72 4d 73 67 2c 20  memcpy(zErrMsg, 
de80: 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
de90: 62 29 2c 20 6e 45 72 72 4d 73 67 29 3b 0a 20 20  b), nErrMsg);.  
dea0: 7d 0a 20 20 72 65 74 75 72 6e 20 7a 45 72 72 4d  }.  return zErrM
deb0: 73 67 3b 0a 7d 0a 0a 23 69 66 64 65 66 20 5f 5f  sg;.}..#ifdef __
dec0: 6c 69 6e 75 78 5f 5f 0a 2f 2a 0a 2a 2a 20 41 74  linux__./*.** At
ded0: 74 65 6d 70 74 20 74 6f 20 64 69 73 70 6c 61 79  tempt to display
dee0: 20 49 2f 4f 20 73 74 61 74 73 20 6f 6e 20 4c 69   I/O stats on Li
def0: 6e 75 78 20 75 73 69 6e 67 20 2f 70 72 6f 63 2f  nux using /proc/
df00: 50 49 44 2f 69 6f 0a 2a 2f 0a 73 74 61 74 69 63  PID/io.*/.static
df10: 20 76 6f 69 64 20 64 69 73 70 6c 61 79 4c 69 6e   void displayLin
df20: 75 78 49 6f 53 74 61 74 73 28 46 49 4c 45 20 2a  uxIoStats(FILE *
df30: 6f 75 74 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e  out){.  FILE *in
df40: 3b 0a 20 20 63 68 61 72 20 7a 5b 32 30 30 5d 3b  ;.  char z[200];
df50: 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
df60: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 29 2c 20 7a  ntf(sizeof(z), z
df70: 2c 20 22 2f 70 72 6f 63 2f 25 64 2f 69 6f 22 2c  , "/proc/%d/io",
df80: 20 67 65 74 70 69 64 28 29 29 3b 0a 20 20 69 6e   getpid());.  in
df90: 20 3d 20 66 6f 70 65 6e 28 7a 2c 20 22 72 62 22   = fopen(z, "rb"
dfa0: 29 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29  );.  if( in==0 )
dfb0: 20 72 65 74 75 72 6e 3b 0a 20 20 77 68 69 6c 65   return;.  while
dfc0: 28 20 66 67 65 74 73 28 7a 2c 20 73 69 7a 65 6f  ( fgets(z, sizeo
dfd0: 66 28 7a 29 2c 20 69 6e 29 21 3d 30 20 29 7b 0a  f(z), in)!=0 ){.
dfe0: 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
dff0: 20 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20   struct {.      
e000: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 61 74  const char *zPat
e010: 74 65 72 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73  tern;.      cons
e020: 74 20 63 68 61 72 20 2a 7a 44 65 73 63 3b 0a 20  t char *zDesc;. 
e030: 20 20 20 7d 20 61 54 72 61 6e 73 5b 5d 20 3d 20     } aTrans[] = 
e040: 7b 0a 20 20 20 20 20 20 7b 20 22 72 63 68 61 72  {.      { "rchar
e050: 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  : ",            
e060: 20 20 20 20 20 20 22 42 79 74 65 73 20 72 65 63        "Bytes rec
e070: 65 69 76 65 64 20 62 79 20 72 65 61 64 28 29 3a  eived by read():
e080: 22 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 77 63  " },.      { "wc
e090: 68 61 72 3a 20 22 2c 20 20 20 20 20 20 20 20 20  har: ",         
e0a0: 20 20 20 20 20 20 20 20 20 22 42 79 74 65 73 20           "Bytes 
e0b0: 73 65 6e 74 20 74 6f 20 77 72 69 74 65 28 29 3a  sent to write():
e0c0: 22 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20  "    },.      { 
e0d0: 22 73 79 73 63 72 3a 20 22 2c 20 20 20 20 20 20  "syscr: ",      
e0e0: 20 20 20 20 20 20 20 20 20 20 20 20 22 52 65 61              "Rea
e0f0: 64 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  d() system calls
e100: 3a 22 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20  :"      },.     
e110: 20 7b 20 22 73 79 73 63 77 3a 20 22 2c 20 20 20   { "syscw: ",   
e120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
e130: 57 72 69 74 65 28 29 20 73 79 73 74 65 6d 20 63  Write() system c
e140: 61 6c 6c 73 3a 22 20 20 20 20 20 7d 2c 0a 20 20  alls:"     },.  
e150: 20 20 20 20 7b 20 22 72 65 61 64 5f 62 79 74 65      { "read_byte
e160: 73 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20 20  s: ",           
e170: 20 20 22 42 79 74 65 73 20 72 65 61 64 20 66 72    "Bytes read fr
e180: 6f 6d 20 73 74 6f 72 61 67 65 3a 22 20 20 7d 2c  om storage:"  },
e190: 0a 20 20 20 20 20 20 7b 20 22 77 72 69 74 65 5f  .      { "write_
e1a0: 62 79 74 65 73 3a 20 22 2c 20 20 20 20 20 20 20  bytes: ",       
e1b0: 20 20 20 20 20 22 42 79 74 65 73 20 77 72 69 74       "Bytes writ
e1c0: 74 65 6e 20 74 6f 20 73 74 6f 72 61 67 65 3a 22  ten to storage:"
e1d0: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 63 61 6e   },.      { "can
e1e0: 63 65 6c 6c 65 64 5f 77 72 69 74 65 5f 62 79 74  celled_write_byt
e1f0: 65 73 3a 20 22 2c 20 20 22 43 61 6e 63 65 6c 6c  es: ",  "Cancell
e200: 65 64 20 77 72 69 74 65 20 62 79 74 65 73 3a 22  ed write bytes:"
e210: 20 20 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20      },.    };.  
e220: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
e230: 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
e240: 65 28 61 54 72 61 6e 73 29 3b 20 69 2b 2b 29 7b  e(aTrans); i++){
e250: 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 28  .      int n = (
e260: 69 6e 74 29 73 74 72 6c 65 6e 28 61 54 72 61 6e  int)strlen(aTran
e270: 73 5b 69 5d 2e 7a 50 61 74 74 65 72 6e 29 3b 0a  s[i].zPattern);.
e280: 20 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d        if( strncm
e290: 70 28 61 54 72 61 6e 73 5b 69 5d 2e 7a 50 61 74  p(aTrans[i].zPat
e2a0: 74 65 72 6e 2c 20 7a 2c 20 6e 29 3d 3d 30 20 29  tern, z, n)==0 )
e2b0: 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
e2c0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2d 33 36  rintf(out, "%-36
e2d0: 73 20 25 73 22 2c 20 61 54 72 61 6e 73 5b 69 5d  s %s", aTrans[i]
e2e0: 2e 7a 44 65 73 63 2c 20 26 7a 5b 6e 5d 29 3b 0a  .zDesc, &z[n]);.
e2f0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
e300: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
e310: 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 7d  .  fclose(in);.}
e320: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44  .#endif../*.** D
e330: 69 73 70 6c 61 79 20 61 20 73 69 6e 67 6c 65 20  isplay a single 
e340: 6c 69 6e 65 20 6f 66 20 73 74 61 74 75 73 20 75  line of status u
e350: 73 69 6e 67 20 36 34 2d 62 69 74 20 76 61 6c 75  sing 64-bit valu
e360: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
e370: 69 64 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69  id displayStatLi
e380: 6e 65 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  ne(.  ShellState
e390: 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   *p,            
e3a0: 2f 2a 20 54 68 65 20 73 68 65 6c 6c 20 63 6f 6e  /* The shell con
e3b0: 74 65 78 74 20 2a 2f 0a 20 20 63 68 61 72 20 2a  text */.  char *
e3c0: 7a 4c 61 62 65 6c 2c 20 20 20 20 20 20 20 20 20  zLabel,         
e3d0: 20 20 20 20 2f 2a 20 4c 61 62 65 6c 20 66 6f 72      /* Label for
e3e0: 20 74 68 69 73 20 6f 6e 65 20 6c 69 6e 65 20 2a   this one line *
e3f0: 2f 0a 20 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61  /.  char *zForma
e400: 74 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  t,            /*
e410: 20 46 6f 72 6d 61 74 20 66 6f 72 20 74 68 65 20   Format for the 
e420: 72 65 73 75 6c 74 20 2a 2f 0a 20 20 69 6e 74 20  result */.  int 
e430: 69 53 74 61 74 75 73 43 74 72 6c 2c 20 20 20 20  iStatusCtrl,    
e440: 20 20 20 20 20 20 2f 2a 20 57 68 69 63 68 20 73        /* Which s
e450: 74 61 74 75 73 20 74 6f 20 64 69 73 70 6c 61 79  tatus to display
e460: 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65 73 65 74   */.  int bReset
e470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e480: 2f 2a 20 54 72 75 65 20 74 6f 20 72 65 73 65 74  /* True to reset
e490: 20 74 68 65 20 73 74 61 74 73 20 2a 2f 0a 29 7b   the stats */.){
e4a0: 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
e4b0: 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 73 71   iCur = -1;.  sq
e4c0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 48 69 77  lite3_int64 iHiw
e4d0: 74 72 20 3d 20 2d 31 3b 0a 20 20 69 6e 74 20 69  tr = -1;.  int i
e4e0: 2c 20 6e 50 65 72 63 65 6e 74 3b 0a 20 20 63 68  , nPercent;.  ch
e4f0: 61 72 20 7a 4c 69 6e 65 5b 32 30 30 5d 3b 0a 20  ar zLine[200];. 
e500: 20 73 71 6c 69 74 65 33 5f 73 74 61 74 75 73 36   sqlite3_status6
e510: 34 28 69 53 74 61 74 75 73 43 74 72 6c 2c 20 26  4(iStatusCtrl, &
e520: 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62  iCur, &iHiwtr, b
e530: 52 65 73 65 74 29 3b 0a 20 20 66 6f 72 28 69 3d  Reset);.  for(i=
e540: 30 2c 20 6e 50 65 72 63 65 6e 74 3d 30 3b 20 7a  0, nPercent=0; z
e550: 46 6f 72 6d 61 74 5b 69 5d 3b 20 69 2b 2b 29 7b  Format[i]; i++){
e560: 0a 20 20 20 20 69 66 28 20 7a 46 6f 72 6d 61 74  .    if( zFormat
e570: 5b 69 5d 3d 3d 27 25 27 20 29 20 6e 50 65 72 63  [i]=='%' ) nPerc
e580: 65 6e 74 2b 2b 3b 0a 20 20 7d 0a 20 20 69 66 28  ent++;.  }.  if(
e590: 20 6e 50 65 72 63 65 6e 74 3e 31 20 29 7b 0a 20   nPercent>1 ){. 
e5a0: 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
e5b0: 6e 74 66 28 73 69 7a 65 6f 66 28 7a 4c 69 6e 65  ntf(sizeof(zLine
e5c0: 29 2c 20 7a 4c 69 6e 65 2c 20 7a 46 6f 72 6d 61  ), zLine, zForma
e5d0: 74 2c 20 69 43 75 72 2c 20 69 48 69 77 74 72 29  t, iCur, iHiwtr)
e5e0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73  ;.  }else{.    s
e5f0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
e600: 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 7a  sizeof(zLine), z
e610: 4c 69 6e 65 2c 20 7a 46 6f 72 6d 61 74 2c 20 69  Line, zFormat, i
e620: 48 69 77 74 72 29 3b 0a 20 20 7d 0a 20 20 72 61  Hiwtr);.  }.  ra
e630: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
e640: 20 22 25 2d 33 36 73 20 25 73 5c 6e 22 2c 20 7a   "%-36s %s\n", z
e650: 4c 61 62 65 6c 2c 20 7a 4c 69 6e 65 29 3b 0a 7d  Label, zLine);.}
e660: 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20  ../*.** Display 
e670: 6d 65 6d 6f 72 79 20 73 74 61 74 73 2e 0a 2a 2f  memory stats..*/
e680: 0a 73 74 61 74 69 63 20 69 6e 74 20 64 69 73 70  .static int disp
e690: 6c 61 79 5f 73 74 61 74 73 28 0a 20 20 73 71 6c  lay_stats(.  sql
e6a0: 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20  ite3 *db,       
e6b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
e6c0: 62 61 73 65 20 74 6f 20 71 75 65 72 79 20 2a 2f  base to query */
e6d0: 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
e6e0: 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 2f  Arg,           /
e6f0: 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68 65  * Pointer to She
e700: 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20 69 6e 74  llState */.  int
e710: 20 62 52 65 73 65 74 20 20 20 20 20 20 20 20 20   bReset         
e720: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
e730: 20 74 6f 20 72 65 73 65 74 20 74 68 65 20 73 74   to reset the st
e740: 61 74 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ats */.){.  int 
e750: 69 43 75 72 3b 0a 20 20 69 6e 74 20 69 48 69 77  iCur;.  int iHiw
e760: 74 72 3b 0a 0a 20 20 69 66 28 20 70 41 72 67 20  tr;..  if( pArg 
e770: 26 26 20 70 41 72 67 2d 3e 6f 75 74 20 29 7b 0a  && pArg->out ){.
e780: 20 20 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c      displayStatL
e790: 69 6e 65 28 70 41 72 67 2c 20 22 4d 65 6d 6f 72  ine(pArg, "Memor
e7a0: 79 20 55 73 65 64 3a 22 2c 0a 20 20 20 20 20 20  y Used:",.      
e7b0: 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64   "%lld (max %lld
e7c0: 29 20 62 79 74 65 73 22 2c 20 53 51 4c 49 54 45  ) bytes", SQLITE
e7d0: 5f 53 54 41 54 55 53 5f 4d 45 4d 4f 52 59 5f 55  _STATUS_MEMORY_U
e7e0: 53 45 44 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  SED, bReset);.  
e7f0: 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e    displayStatLin
e800: 65 28 70 41 72 67 2c 20 22 4e 75 6d 62 65 72 20  e(pArg, "Number 
e810: 6f 66 20 4f 75 74 73 74 61 6e 64 69 6e 67 20 41  of Outstanding A
e820: 6c 6c 6f 63 61 74 69 6f 6e 73 3a 22 2c 0a 20 20  llocations:",.  
e830: 20 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78 20       "%lld (max 
e840: 25 6c 6c 64 29 22 2c 20 53 51 4c 49 54 45 5f 53  %lld)", SQLITE_S
e850: 54 41 54 55 53 5f 4d 41 4c 4c 4f 43 5f 43 4f 55  TATUS_MALLOC_COU
e860: 4e 54 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  NT, bReset);.   
e870: 20 69 66 28 20 70 41 72 67 2d 3e 73 68 65 6c 6c   if( pArg->shell
e880: 46 6c 67 73 20 26 20 53 48 46 4c 47 5f 50 61 67  Flgs & SHFLG_Pag
e890: 65 63 61 63 68 65 20 29 7b 0a 20 20 20 20 20 20  ecache ){.      
e8a0: 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28  displayStatLine(
e8b0: 70 41 72 67 2c 20 22 4e 75 6d 62 65 72 20 6f 66  pArg, "Number of
e8c0: 20 50 63 61 63 68 65 20 50 61 67 65 73 20 55 73   Pcache Pages Us
e8d0: 65 64 3a 22 2c 0a 20 20 20 20 20 20 20 20 20 22  ed:",.         "
e8e0: 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 20  %lld (max %lld) 
e8f0: 70 61 67 65 73 22 2c 20 53 51 4c 49 54 45 5f 53  pages", SQLITE_S
e900: 54 41 54 55 53 5f 50 41 47 45 43 41 43 48 45 5f  TATUS_PAGECACHE_
e910: 55 53 45 44 2c 20 62 52 65 73 65 74 29 3b 0a 20  USED, bReset);. 
e920: 20 20 20 7d 0a 20 20 20 20 64 69 73 70 6c 61 79     }.    display
e930: 53 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22  StatLine(pArg, "
e940: 4e 75 6d 62 65 72 20 6f 66 20 50 63 61 63 68 65  Number of Pcache
e950: 20 4f 76 65 72 66 6c 6f 77 20 42 79 74 65 73 3a   Overflow Bytes:
e960: 22 2c 0a 20 20 20 20 20 20 20 22 25 6c 6c 64 20  ",.       "%lld 
e970: 28 6d 61 78 20 25 6c 6c 64 29 20 62 79 74 65 73  (max %lld) bytes
e980: 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53  ", SQLITE_STATUS
e990: 5f 50 41 47 45 43 41 43 48 45 5f 4f 56 45 52 46  _PAGECACHE_OVERF
e9a0: 4c 4f 57 2c 20 62 52 65 73 65 74 29 3b 0a 20 20  LOW, bReset);.  
e9b0: 20 20 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e    displayStatLin
e9c0: 65 28 70 41 72 67 2c 20 22 4c 61 72 67 65 73 74  e(pArg, "Largest
e9d0: 20 41 6c 6c 6f 63 61 74 69 6f 6e 3a 22 2c 0a 20   Allocation:",. 
e9e0: 20 20 20 20 20 20 22 25 6c 6c 64 20 62 79 74 65        "%lld byte
e9f0: 73 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55  s", SQLITE_STATU
ea00: 53 5f 4d 41 4c 4c 4f 43 5f 53 49 5a 45 2c 20 62  S_MALLOC_SIZE, b
ea10: 52 65 73 65 74 29 3b 0a 20 20 20 20 64 69 73 70  Reset);.    disp
ea20: 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67  layStatLine(pArg
ea30: 2c 20 22 4c 61 72 67 65 73 74 20 50 63 61 63 68  , "Largest Pcach
ea40: 65 20 41 6c 6c 6f 63 61 74 69 6f 6e 3a 22 2c 0a  e Allocation:",.
ea50: 20 20 20 20 20 20 20 22 25 6c 6c 64 20 62 79 74         "%lld byt
ea60: 65 73 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  es", SQLITE_STAT
ea70: 55 53 5f 50 41 47 45 43 41 43 48 45 5f 53 49 5a  US_PAGECACHE_SIZ
ea80: 45 2c 20 62 52 65 73 65 74 29 3b 0a 23 69 66 64  E, bReset);.#ifd
ea90: 65 66 20 59 59 54 52 41 43 4b 4d 41 58 53 54 41  ef YYTRACKMAXSTA
eaa0: 43 4b 44 45 50 54 48 0a 20 20 20 20 64 69 73 70  CKDEPTH.    disp
eab0: 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67  layStatLine(pArg
eac0: 2c 20 22 44 65 65 70 65 73 74 20 50 61 72 73 65  , "Deepest Parse
ead0: 72 20 53 74 61 63 6b 3a 22 2c 0a 20 20 20 20 20  r Stack:",.     
eae0: 20 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c    "%lld (max %ll
eaf0: 64 29 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54  d)", SQLITE_STAT
eb00: 55 53 5f 50 41 52 53 45 52 5f 53 54 41 43 4b 2c  US_PARSER_STACK,
eb10: 20 62 52 65 73 65 74 29 3b 0a 23 65 6e 64 69 66   bReset);.#endif
eb20: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 41 72 67  .  }..  if( pArg
eb30: 20 26 26 20 70 41 72 67 2d 3e 6f 75 74 20 26 26   && pArg->out &&
eb40: 20 64 62 20 29 7b 0a 20 20 20 20 69 66 28 20 70   db ){.    if( p
eb50: 41 72 67 2d 3e 73 68 65 6c 6c 46 6c 67 73 20 26  Arg->shellFlgs &
eb60: 20 53 48 46 4c 47 5f 4c 6f 6f 6b 61 73 69 64 65   SHFLG_Lookaside
eb70: 20 29 7b 0a 20 20 20 20 20 20 69 48 69 77 74 72   ){.      iHiwtr
eb80: 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20   = iCur = -1;.  
eb90: 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 73      sqlite3_db_s
eba0: 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54 45  tatus(db, SQLITE
ebb0: 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b 41 53  _DBSTATUS_LOOKAS
ebc0: 49 44 45 5f 55 53 45 44 2c 0a 20 20 20 20 20 20  IDE_USED,.      
ebd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebe0: 20 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72    &iCur, &iHiwtr
ebf0: 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 20  , bReset);.     
ec00: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
ec10: 2d 3e 6f 75 74 2c 0a 20 20 20 20 20 20 20 20 20  ->out,.         
ec20: 20 20 20 20 20 22 4c 6f 6f 6b 61 73 69 64 65 20       "Lookaside 
ec30: 53 6c 6f 74 73 20 55 73 65 64 3a 20 20 20 20 20  Slots Used:     
ec40: 20 20 20 20 20 20 20 20 20 20 20 25 64 20 28 6d             %d (m
ec50: 61 78 20 25 64 29 5c 6e 22 2c 0a 20 20 20 20 20  ax %d)\n",.     
ec60: 20 20 20 20 20 20 20 20 20 69 43 75 72 2c 20 69           iCur, i
ec70: 48 69 77 74 72 29 3b 0a 20 20 20 20 20 20 73 71  Hiwtr);.      sq
ec80: 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28  lite3_db_status(
ec90: 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41  db, SQLITE_DBSTA
eca0: 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 48 49  TUS_LOOKASIDE_HI
ecb0: 54 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  T,.             
ecc0: 20 20 20 20 20 20 20 20 20 20 20 26 69 43 75 72             &iCur
ecd0: 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65  , &iHiwtr, bRese
ece0: 74 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  t);.      raw_pr
ecf0: 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
ed00: 22 53 75 63 63 65 73 73 66 75 6c 20 6c 6f 6f 6b  "Successful look
ed10: 61 73 69 64 65 20 61 74 74 65 6d 70 74 73 3a 20  aside attempts: 
ed20: 20 20 20 20 20 20 25 64 5c 6e 22 2c 0a 20 20 20        %d\n",.   
ed30: 20 20 20 20 20 20 20 20 20 20 20 69 48 69 77 74             iHiwt
ed40: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
ed50: 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
ed60: 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
ed70: 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49 53 53 5f 53  LOOKASIDE_MISS_S
ed80: 49 5a 45 2c 0a 20 20 20 20 20 20 20 20 20 20 20  IZE,.           
ed90: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 69 43               &iC
eda0: 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65  ur, &iHiwtr, bRe
edb0: 73 65 74 29 3b 0a 20 20 20 20 20 20 72 61 77 5f  set);.      raw_
edc0: 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
edd0: 2c 20 22 4c 6f 6f 6b 61 73 69 64 65 20 66 61 69  , "Lookaside fai
ede0: 6c 75 72 65 73 20 64 75 65 20 74 6f 20 73 69 7a  lures due to siz
edf0: 65 3a 20 20 20 20 20 20 25 64 5c 6e 22 2c 0a 20  e:      %d\n",. 
ee00: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 48 69               iHi
ee10: 77 74 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  wtr);.      sqli
ee20: 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
ee30: 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
ee40: 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f 4d 49 53 53  S_LOOKASIDE_MISS
ee50: 5f 46 55 4c 4c 2c 0a 20 20 20 20 20 20 20 20 20  _FULL,.         
ee60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
ee70: 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62  iCur, &iHiwtr, b
ee80: 52 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72 61  Reset);.      ra
ee90: 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
eea0: 75 74 2c 20 22 4c 6f 6f 6b 61 73 69 64 65 20 66  ut, "Lookaside f
eeb0: 61 69 6c 75 72 65 73 20 64 75 65 20 74 6f 20 4f  ailures due to O
eec0: 4f 4d 3a 20 20 20 20 20 20 20 25 64 5c 6e 22 2c  OM:       %d\n",
eed0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
eee0: 48 69 77 74 72 29 3b 0a 20 20 20 20 7d 0a 20 20  Hiwtr);.    }.  
eef0: 20 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20    iHiwtr = iCur 
ef00: 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65  = -1;.    sqlite
ef10: 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
ef20: 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
ef30: 43 41 43 48 45 5f 55 53 45 44 2c 20 26 69 43 75  CACHE_USED, &iCu
ef40: 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73  r, &iHiwtr, bRes
ef50: 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69  et);.    raw_pri
ef60: 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
ef70: 50 61 67 65 72 20 48 65 61 70 20 55 73 61 67 65  Pager Heap Usage
ef80: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
ef90: 20 20 20 20 20 25 64 20 62 79 74 65 73 5c 6e 22       %d bytes\n"
efa0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 43  ,.            iC
efb0: 75 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72 20  ur);.    iHiwtr 
efc0: 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20  = iCur = -1;.   
efd0: 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74   sqlite3_db_stat
efe0: 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  us(db, SQLITE_DB
eff0: 53 54 41 54 55 53 5f 43 41 43 48 45 5f 48 49 54  STATUS_CACHE_HIT
f000: 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72  , &iCur, &iHiwtr
f010: 2c 20 31 29 3b 0a 20 20 20 20 72 61 77 5f 70 72  , 1);.    raw_pr
f020: 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
f030: 22 50 61 67 65 20 63 61 63 68 65 20 68 69 74 73  "Page cache hits
f040: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
f050: 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75        %d\n", iCu
f060: 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d  r);.    iHiwtr =
f070: 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20   iCur = -1;.    
f080: 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
f090: 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53  s(db, SQLITE_DBS
f0a0: 54 41 54 55 53 5f 43 41 43 48 45 5f 4d 49 53 53  TATUS_CACHE_MISS
f0b0: 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74 72  , &iCur, &iHiwtr
f0c0: 2c 20 31 29 3b 0a 20 20 20 20 72 61 77 5f 70 72  , 1);.    raw_pr
f0d0: 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
f0e0: 22 50 61 67 65 20 63 61 63 68 65 20 6d 69 73 73  "Page cache miss
f0f0: 65 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  es:             
f100: 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75        %d\n", iCu
f110: 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72 20 3d  r);.    iHiwtr =
f120: 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20   iCur = -1;.    
f130: 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
f140: 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53  s(db, SQLITE_DBS
f150: 54 41 54 55 53 5f 43 41 43 48 45 5f 57 52 49 54  TATUS_CACHE_WRIT
f160: 45 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77 74  E, &iCur, &iHiwt
f170: 72 2c 20 31 29 3b 0a 20 20 20 20 72 61 77 5f 70  r, 1);.    raw_p
f180: 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
f190: 20 22 50 61 67 65 20 63 61 63 68 65 20 77 72 69   "Page cache wri
f1a0: 74 65 73 3a 20 20 20 20 20 20 20 20 20 20 20 20  tes:            
f1b0: 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43         %d\n", iC
f1c0: 75 72 29 3b 0a 20 20 20 20 69 48 69 77 74 72 20  ur);.    iHiwtr 
f1d0: 3d 20 69 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20  = iCur = -1;.   
f1e0: 20 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74   sqlite3_db_stat
f1f0: 75 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42  us(db, SQLITE_DB
f200: 53 54 41 54 55 53 5f 53 43 48 45 4d 41 5f 55 53  STATUS_SCHEMA_US
f210: 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48 69 77  ED, &iCur, &iHiw
f220: 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20  tr, bReset);.   
f230: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
f240: 2d 3e 6f 75 74 2c 20 22 53 63 68 65 6d 61 20 48  ->out, "Schema H
f250: 65 61 70 20 55 73 61 67 65 3a 20 20 20 20 20 20  eap Usage:      
f260: 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 20               %d 
f270: 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20 20 20  bytes\n",.      
f280: 20 20 20 20 20 20 69 43 75 72 29 3b 0a 20 20 20        iCur);.   
f290: 20 69 48 69 77 74 72 20 3d 20 69 43 75 72 20 3d   iHiwtr = iCur =
f2a0: 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -1;.    sqlite3
f2b0: 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53  _db_status(db, S
f2c0: 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 53  QLITE_DBSTATUS_S
f2d0: 54 4d 54 5f 55 53 45 44 2c 20 26 69 43 75 72 2c  TMT_USED, &iCur,
f2e0: 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74   &iHiwtr, bReset
f2f0: 29 3b 0a 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 53 74  f(pArg->out, "St
f310: 61 74 65 6d 65 6e 74 20 48 65 61 70 2f 4c 6f 6f  atement Heap/Loo
f320: 6b 61 73 69 64 65 20 55 73 61 67 65 3a 20 20 20  kaside Usage:   
f330: 20 20 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 0a     %d bytes\n",.
f340: 20 20 20 20 20 20 20 20 20 20 20 20 69 43 75 72              iCur
f350: 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 41  );.  }..  if( pA
f360: 72 67 20 26 26 20 70 41 72 67 2d 3e 6f 75 74 20  rg && pArg->out 
f370: 26 26 20 64 62 20 26 26 20 70 41 72 67 2d 3e 70  && db && pArg->p
f380: 53 74 6d 74 20 29 7b 0a 20 20 20 20 69 43 75 72  Stmt ){.    iCur
f390: 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f   = sqlite3_stmt_
f3a0: 73 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74  status(pArg->pSt
f3b0: 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53  mt, SQLITE_STMTS
f3c0: 54 41 54 55 53 5f 46 55 4c 4c 53 43 41 4e 5f 53  TATUS_FULLSCAN_S
f3d0: 54 45 50 2c 0a 20 20 20 20 20 20 20 20 20 20 20  TEP,.           
f3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3f0: 20 20 20 20 62 52 65 73 65 74 29 3b 0a 20 20 20      bReset);.   
f400: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
f410: 2d 3e 6f 75 74 2c 20 22 46 75 6c 6c 73 63 61 6e  ->out, "Fullscan
f420: 20 53 74 65 70 73 3a 20 20 20 20 20 20 20 20 20   Steps:         
f430: 20 20 20 20 20 20 20 20 20 20 20 20 20 25 64 5c               %d\
f440: 6e 22 2c 20 69 43 75 72 29 3b 0a 20 20 20 20 69  n", iCur);.    i
f450: 43 75 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  Cur = sqlite3_st
f460: 6d 74 5f 73 74 61 74 75 73 28 70 41 72 67 2d 3e  mt_status(pArg->
f470: 70 53 74 6d 74 2c 20 53 51 4c 49 54 45 5f 53 54  pStmt, SQLITE_ST
f480: 4d 54 53 54 41 54 55 53 5f 53 4f 52 54 2c 20 62  MTSTATUS_SORT, b
f490: 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f  Reset);.    raw_
f4a0: 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
f4b0: 2c 20 22 53 6f 72 74 20 4f 70 65 72 61 74 69 6f  , "Sort Operatio
f4c0: 6e 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ns:             
f4d0: 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69          %d\n", i
f4e0: 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d  Cur);.    iCur =
f4f0: 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74   sqlite3_stmt_st
f500: 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74  atus(pArg->pStmt
f510: 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41  , SQLITE_STMTSTA
f520: 54 55 53 5f 41 55 54 4f 49 4e 44 45 58 2c 62 52  TUS_AUTOINDEX,bR
f530: 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70  eset);.    raw_p
f540: 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c  rintf(pArg->out,
f550: 20 22 41 75 74 6f 69 6e 64 65 78 20 49 6e 73 65   "Autoindex Inse
f560: 72 74 73 3a 20 20 20 20 20 20 20 20 20 20 20 20  rts:            
f570: 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43         %d\n", iC
f580: 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20 3d 20  ur);.    iCur = 
f590: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61  sqlite3_stmt_sta
f5a0: 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c  tus(pArg->pStmt,
f5b0: 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54   SQLITE_STMTSTAT
f5c0: 55 53 5f 56 4d 5f 53 54 45 50 2c 20 62 52 65 73  US_VM_STEP, bRes
f5d0: 65 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69  et);.    raw_pri
f5e0: 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
f5f0: 56 69 72 74 75 61 6c 20 4d 61 63 68 69 6e 65 20  Virtual Machine 
f600: 53 74 65 70 73 3a 20 20 20 20 20 20 20 20 20 20  Steps:          
f610: 20 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72       %d\n", iCur
f620: 29 3b 0a 20 20 7d 0a 0a 23 69 66 64 65 66 20 5f  );.  }..#ifdef _
f630: 5f 6c 69 6e 75 78 5f 5f 0a 20 20 64 69 73 70 6c  _linux__.  displ
f640: 61 79 4c 69 6e 75 78 49 6f 53 74 61 74 73 28 70  ayLinuxIoStats(p
f650: 41 72 67 2d 3e 6f 75 74 29 3b 0a 23 65 6e 64 69  Arg->out);.#endi
f660: 66 0a 0a 20 20 2f 2a 20 44 6f 20 6e 6f 74 20 72  f..  /* Do not r
f670: 65 6d 6f 76 65 20 74 68 69 73 20 6d 61 63 68 69  emove this machi
f680: 6e 65 20 72 65 61 64 61 62 6c 65 20 63 6f 6d 6d  ne readable comm
f690: 65 6e 74 3a 20 65 78 74 72 61 2d 73 74 61 74 73  ent: extra-stats
f6a0: 2d 6f 75 74 70 75 74 2d 68 65 72 65 20 2a 2f 0a  -output-here */.
f6b0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
f6c0: 2f 2a 0a 2a 2a 20 44 69 73 70 6c 61 79 20 73 63  /*.** Display sc
f6d0: 61 6e 20 73 74 61 74 73 2e 0a 2a 2f 0a 73 74 61  an stats..*/.sta
f6e0: 74 69 63 20 76 6f 69 64 20 64 69 73 70 6c 61 79  tic void display
f6f0: 5f 73 63 61 6e 73 74 61 74 73 28 0a 20 20 73 71  _scanstats(.  sq
f700: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
f710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f720: 20 44 61 74 61 62 61 73 65 20 74 6f 20 71 75 65   Database to que
f730: 72 79 20 2a 2f 0a 20 20 53 68 65 6c 6c 53 74 61  ry */.  ShellSta
f740: 74 65 20 2a 70 41 72 67 20 20 20 20 20 20 20 20  te *pArg        
f750: 20 20 20 20 20 20 20 20 2f 2a 20 50 6f 69 6e 74          /* Point
f760: 65 72 20 74 6f 20 53 68 65 6c 6c 53 74 61 74 65  er to ShellState
f770: 20 2a 2f 0a 29 7b 0a 23 69 66 6e 64 65 66 20 53   */.){.#ifndef S
f780: 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 54 4d  QLITE_ENABLE_STM
f790: 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20 20 55  T_SCANSTATUS.  U
f7a0: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
f7b0: 64 62 29 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41  db);.  UNUSED_PA
f7c0: 52 41 4d 45 54 45 52 28 70 41 72 67 29 3b 0a 23  RAMETER(pArg);.#
f7d0: 65 6c 73 65 0a 20 20 69 6e 74 20 69 2c 20 6b 2c  else.  int i, k,
f7e0: 20 6e 2c 20 6d 78 3b 0a 20 20 72 61 77 5f 70 72   n, mx;.  raw_pr
f7f0: 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
f800: 22 2d 2d 2d 2d 2d 2d 2d 2d 20 73 63 61 6e 73 74  "-------- scanst
f810: 61 74 73 20 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29  ats --------\n")
f820: 3b 0a 20 20 6d 78 20 3d 20 30 3b 0a 20 20 66 6f  ;.  mx = 0;.  fo
f830: 72 28 6b 3d 30 3b 20 6b 3c 3d 6d 78 3b 20 6b 2b  r(k=0; k<=mx; k+
f840: 2b 29 7b 0a 20 20 20 20 64 6f 75 62 6c 65 20 72  +){.    double r
f850: 45 73 74 4c 6f 6f 70 20 3d 20 31 2e 30 3b 0a 20  EstLoop = 1.0;. 
f860: 20 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 31 3b     for(i=n=0; 1;
f870: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c   i++){.      sql
f880: 69 74 65 33 5f 73 74 6d 74 20 2a 70 20 3d 20 70  ite3_stmt *p = p
f890: 41 72 67 2d 3e 70 53 74 6d 74 3b 0a 20 20 20 20  Arg->pStmt;.    
f8a0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
f8b0: 6e 4c 6f 6f 70 2c 20 6e 56 69 73 69 74 3b 0a 20  nLoop, nVisit;. 
f8c0: 20 20 20 20 20 64 6f 75 62 6c 65 20 72 45 73 74       double rEst
f8d0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 53 69 64  ;.      int iSid
f8e0: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
f8f0: 61 72 20 2a 7a 45 78 70 6c 61 69 6e 3b 0a 20 20  ar *zExplain;.  
f900: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
f910: 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28  stmt_scanstatus(
f920: 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41  p, i, SQLITE_SCA
f930: 4e 53 54 41 54 5f 4e 4c 4f 4f 50 2c 20 28 76 6f  NSTAT_NLOOP, (vo
f940: 69 64 2a 29 26 6e 4c 6f 6f 70 29 20 29 7b 0a 20  id*)&nLoop) ){. 
f950: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
f960: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
f970: 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
f980: 74 75 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45  tus(p, i, SQLITE
f990: 5f 53 43 41 4e 53 54 41 54 5f 53 45 4c 45 43 54  _SCANSTAT_SELECT
f9a0: 49 44 2c 20 28 76 6f 69 64 2a 29 26 69 53 69 64  ID, (void*)&iSid
f9b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 53 69  );.      if( iSi
f9c0: 64 3e 6d 78 20 29 20 6d 78 20 3d 20 69 53 69 64  d>mx ) mx = iSid
f9d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 53 69 64  ;.      if( iSid
f9e0: 21 3d 6b 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=k ) continue;.
f9f0: 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20 29        if( n==0 )
fa00: 7b 0a 20 20 20 20 20 20 20 20 72 45 73 74 4c 6f  {.        rEstLo
fa10: 6f 70 20 3d 20 28 64 6f 75 62 6c 65 29 6e 4c 6f  op = (double)nLo
fa20: 6f 70 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  op;.        if( 
fa30: 6b 3e 30 20 29 20 72 61 77 5f 70 72 69 6e 74 66  k>0 ) raw_printf
fa40: 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d  (pArg->out, "---
fa50: 2d 2d 2d 2d 2d 20 73 75 62 71 75 65 72 79 20 25  ----- subquery %
fa60: 64 20 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 2c 20 6b 29  d -------\n", k)
fa70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
fa80: 6e 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  n++;.      sqlit
fa90: 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74  e3_stmt_scanstat
faa0: 75 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f  us(p, i, SQLITE_
fab0: 53 43 41 4e 53 54 41 54 5f 4e 56 49 53 49 54 2c  SCANSTAT_NVISIT,
fac0: 20 28 76 6f 69 64 2a 29 26 6e 56 69 73 69 74 29   (void*)&nVisit)
fad0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
fae0: 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28  stmt_scanstatus(
faf0: 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41  p, i, SQLITE_SCA
fb00: 4e 53 54 41 54 5f 45 53 54 2c 20 28 76 6f 69 64  NSTAT_EST, (void
fb10: 2a 29 26 72 45 73 74 29 3b 0a 20 20 20 20 20 20  *)&rEst);.      
fb20: 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 63 61  sqlite3_stmt_sca
fb30: 6e 73 74 61 74 75 73 28 70 2c 20 69 2c 20 53 51  nstatus(p, i, SQ
fb40: 4c 49 54 45 5f 53 43 41 4e 53 54 41 54 5f 45 58  LITE_SCANSTAT_EX
fb50: 50 4c 41 49 4e 2c 20 28 76 6f 69 64 2a 29 26 7a  PLAIN, (void*)&z
fb60: 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20  Explain);.      
fb70: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41 72 67  utf8_printf(pArg
fb80: 2d 3e 6f 75 74 2c 20 22 4c 6f 6f 70 20 25 32 64  ->out, "Loop %2d
fb90: 3a 20 25 73 5c 6e 22 2c 20 6e 2c 20 7a 45 78 70  : %s\n", n, zExp
fba0: 6c 61 69 6e 29 3b 0a 20 20 20 20 20 20 72 45 73  lain);.      rEs
fbb0: 74 4c 6f 6f 70 20 2a 3d 20 72 45 73 74 3b 0a 20  tLoop *= rEst;. 
fbc0: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
fbd0: 70 41 72 67 2d 3e 6f 75 74 2c 0a 20 20 20 20 20  pArg->out,.     
fbe0: 20 20 20 20 20 22 20 20 20 20 20 20 20 20 20 6e       "         n
fbf0: 4c 6f 6f 70 3d 25 2d 38 6c 6c 64 20 6e 52 6f 77  Loop=%-8lld nRow
fc00: 3d 25 2d 38 6c 6c 64 20 65 73 74 52 6f 77 3d 25  =%-8lld estRow=%
fc10: 2d 38 6c 6c 64 20 65 73 74 52 6f 77 2f 4c 6f 6f  -8lld estRow/Loo
fc20: 70 3d 25 2d 38 67 5c 6e 22 2c 0a 20 20 20 20 20  p=%-8g\n",.     
fc30: 20 20 20 20 20 6e 4c 6f 6f 70 2c 20 6e 56 69 73       nLoop, nVis
fc40: 69 74 2c 20 28 73 71 6c 69 74 65 33 5f 69 6e 74  it, (sqlite3_int
fc50: 36 34 29 28 72 45 73 74 4c 6f 6f 70 2b 30 2e 35  64)(rEstLoop+0.5
fc60: 29 2c 20 72 45 73 74 0a 20 20 20 20 20 20 29 3b  ), rEst.      );
fc70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 61 77  .    }.  }.  raw
fc80: 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
fc90: 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  t, "------------
fca0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c  ---------------\
fcb0: 6e 22 29 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  n");.#endif.}../
fcc0: 2a 0a 2a 2a 20 50 61 72 61 6d 65 74 65 72 20 61  *.** Parameter a
fcd0: 7a 41 72 72 61 79 20 70 6f 69 6e 74 73 20 74 6f  zArray points to
fce0: 20 61 20 7a 65 72 6f 2d 74 65 72 6d 69 6e 61 74   a zero-terminat
fcf0: 65 64 20 61 72 72 61 79 20 6f 66 20 73 74 72 69  ed array of stri
fd00: 6e 67 73 2e 20 7a 53 74 72 0a 2a 2a 20 70 6f 69  ngs. zStr.** poi
fd10: 6e 74 73 20 74 6f 20 61 20 73 69 6e 67 6c 65 20  nts to a single 
fd20: 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 73  nul-terminated s
fd30: 74 72 69 6e 67 2e 20 52 65 74 75 72 6e 20 6e 6f  tring. Return no
fd40: 6e 2d 7a 65 72 6f 20 69 66 20 7a 53 74 72 0a 2a  n-zero if zStr.*
fd50: 2a 20 69 73 20 65 71 75 61 6c 2c 20 61 63 63 6f  * is equal, acco
fd60: 72 64 69 6e 67 20 74 6f 20 73 74 72 63 6d 70 28  rding to strcmp(
fd70: 29 2c 20 74 6f 20 61 6e 79 20 6f 66 20 74 68 65  ), to any of the
fd80: 20 73 74 72 69 6e 67 73 20 69 6e 20 74 68 65 20   strings in the 
fd90: 61 72 72 61 79 2e 0a 2a 2a 20 4f 74 68 65 72 77  array..** Otherw
fda0: 69 73 65 2c 20 72 65 74 75 72 6e 20 7a 65 72 6f  ise, return zero
fdb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
fdc0: 73 74 72 5f 69 6e 5f 61 72 72 61 79 28 63 6f 6e  str_in_array(con
fdd0: 73 74 20 63 68 61 72 20 2a 7a 53 74 72 2c 20 63  st char *zStr, c
fde0: 6f 6e 73 74 20 63 68 61 72 20 2a 2a 61 7a 41 72  onst char **azAr
fdf0: 72 61 79 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  ray){.  int i;. 
fe00: 20 66 6f 72 28 69 3d 30 3b 20 61 7a 41 72 72 61   for(i=0; azArra
fe10: 79 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  y[i]; i++){.    
fe20: 69 66 28 20 30 3d 3d 73 74 72 63 6d 70 28 7a 53  if( 0==strcmp(zS
fe30: 74 72 2c 20 61 7a 41 72 72 61 79 5b 69 5d 29 20  tr, azArray[i]) 
fe40: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a  ) return 1;.  }.
fe50: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
fe60: 2a 0a 2a 2a 20 49 66 20 63 6f 6d 70 69 6c 65 64  *.** If compiled
fe70: 20 73 74 61 74 65 6d 65 6e 74 20 70 53 71 6c 20   statement pSql 
fe80: 61 70 70 65 61 72 73 20 74 6f 20 62 65 20 61 6e  appears to be an
fe90: 20 45 58 50 4c 41 49 4e 20 73 74 61 74 65 6d 65   EXPLAIN stateme
fea0: 6e 74 2c 20 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20  nt, allocate.** 
feb0: 61 6e 64 20 70 6f 70 75 6c 61 74 65 20 74 68 65  and populate the
fec0: 20 53 68 65 6c 6c 53 74 61 74 65 2e 61 69 49 6e   ShellState.aiIn
fed0: 64 65 6e 74 5b 5d 20 61 72 72 61 79 20 77 69 74  dent[] array wit
fee0: 68 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a  h the number of.
fef0: 2a 2a 20 73 70 61 63 65 73 20 65 61 63 68 20 6f  ** spaces each o
ff00: 70 63 6f 64 65 20 73 68 6f 75 6c 64 20 62 65 20  pcode should be 
ff10: 69 6e 64 65 6e 74 65 64 20 62 65 66 6f 72 65 20  indented before 
ff20: 69 74 20 69 73 20 6f 75 74 70 75 74 2e 0a 2a 2a  it is output..**
ff30: 0a 2a 2a 20 54 68 65 20 69 6e 64 65 6e 74 69 6e  .** The indentin
ff40: 67 20 72 75 6c 65 73 20 61 72 65 3a 0a 2a 2a 0a  g rules are:.**.
ff50: 2a 2a 20 20 20 20 20 2a 20 46 6f 72 20 65 61 63  **     * For eac
ff60: 68 20 22 4e 65 78 74 22 2c 20 22 50 72 65 76 22  h "Next", "Prev"
ff70: 2c 20 22 56 4e 65 78 74 22 20 6f 72 20 22 56 50  , "VNext" or "VP
ff80: 72 65 76 22 20 69 6e 73 74 72 75 63 74 69 6f 6e  rev" instruction
ff90: 2c 20 69 6e 64 65 6e 74 0a 2a 2a 20 20 20 20 20  , indent.**     
ffa0: 20 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20 74 68    all opcodes th
ffb0: 61 74 20 6f 63 63 75 72 20 62 65 74 77 65 65 6e  at occur between
ffc0: 20 74 68 65 20 70 32 20 6a 75 6d 70 20 64 65 73   the p2 jump des
ffd0: 74 69 6e 61 74 69 6f 6e 20 61 6e 64 20 74 68 65  tination and the
ffe0: 20 6f 70 63 6f 64 65 0a 2a 2a 20 20 20 20 20 20   opcode.**      
fff0: 20 69 74 73 65 6c 66 20 62 79 20 32 20 73 70 61   itself by 2 spa
10000 63 65 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a  ces..**.**     *
10010 20 46 6f 72 20 65 61 63 68 20 22 47 6f 74 6f 22   For each "Goto"
10020 2c 20 69 66 20 74 68 65 20 6a 75 6d 70 20 64 65  , if the jump de
10030 73 74 69 6e 61 74 69 6f 6e 20 69 73 20 65 61 72  stination is ear
10040 6c 69 65 72 20 69 6e 20 74 68 65 20 70 72 6f 67  lier in the prog
10050 72 61 6d 0a 2a 2a 20 20 20 20 20 20 20 61 6e 64  ram.**       and
10060 20 65 6e 64 73 20 6f 6e 20 6f 6e 65 20 6f 66 3a   ends on one of:
10070 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 59 69 65  .**          Yie
10080 6c 64 20 20 53 65 65 6b 47 74 20 20 53 65 65 6b  ld  SeekGt  Seek
10090 4c 74 20 20 52 6f 77 53 65 74 52 65 61 64 20 20  Lt  RowSetRead  
100a0 52 65 77 69 6e 64 0a 2a 2a 20 20 20 20 20 20 20  Rewind.**       
100b0 6f 72 20 69 66 20 74 68 65 20 50 31 20 70 61 72  or if the P1 par
100c0 61 6d 65 74 65 72 20 69 73 20 6f 6e 65 20 69 6e  ameter is one in
100d0 73 74 65 61 64 20 6f 66 20 7a 65 72 6f 2c 0a 2a  stead of zero,.*
100e0 2a 20 20 20 20 20 20 20 74 68 65 6e 20 69 6e 64  *       then ind
100f0 65 6e 74 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20  ent all opcodes 
10100 62 65 74 77 65 65 6e 20 74 68 65 20 65 61 72 6c  between the earl
10110 69 65 72 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a  ier instruction.
10120 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 22 47 6f  **       and "Go
10130 74 6f 22 20 62 79 20 32 20 73 70 61 63 65 73 2e  to" by 2 spaces.
10140 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10150 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 70 72 65  explain_data_pre
10160 70 61 72 65 28 53 68 65 6c 6c 53 74 61 74 65 20  pare(ShellState 
10170 2a 70 2c 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  *p, sqlite3_stmt
10180 20 2a 70 53 71 6c 29 7b 0a 20 20 63 6f 6e 73 74   *pSql){.  const
10190 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20   char *zSql;    
101a0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68             /* Th
101b0 65 20 74 65 78 74 20 6f 66 20 74 68 65 20 53 51  e text of the SQ
101c0 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20  L statement */. 
101d0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 3b 20   const char *z; 
101e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
101f0 20 2f 2a 20 55 73 65 64 20 74 6f 20 63 68 65 63   /* Used to chec
10200 6b 20 69 66 20 74 68 69 73 20 69 73 20 61 6e 20  k if this is an 
10210 45 58 50 4c 41 49 4e 20 2a 2f 0a 20 20 69 6e 74  EXPLAIN */.  int
10220 20 2a 61 62 59 69 65 6c 64 20 3d 20 30 3b 20 20   *abYield = 0;  
10230 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10240 54 72 75 65 20 69 66 20 6f 70 20 69 73 20 61 6e  True if op is an
10250 20 4f 50 5f 59 69 65 6c 64 20 2a 2f 0a 20 20 69   OP_Yield */.  i
10260 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b 20 20  nt nAlloc = 0;  
10270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
10280 2a 20 41 6c 6c 6f 63 61 74 65 64 20 73 69 7a 65  * Allocated size
10290 20 6f 66 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b   of p->aiIndent[
102a0 5d 2c 20 61 62 59 69 65 6c 64 20 2a 2f 0a 20 20  ], abYield */.  
102b0 69 6e 74 20 69 4f 70 3b 20 20 20 20 20 20 20 20  int iOp;        
102c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102d0 2f 2a 20 49 6e 64 65 78 20 6f 66 20 6f 70 65 72  /* Index of oper
102e0 61 74 69 6f 6e 20 69 6e 20 70 2d 3e 61 69 49 6e  ation in p->aiIn
102f0 64 65 6e 74 5b 5d 20 2a 2f 0a 0a 20 20 63 6f 6e  dent[] */..  con
10300 73 74 20 63 68 61 72 20 2a 61 7a 4e 65 78 74 5b  st char *azNext[
10310 5d 20 3d 20 7b 20 22 4e 65 78 74 22 2c 20 22 50  ] = { "Next", "P
10320 72 65 76 22 2c 20 22 56 50 72 65 76 22 2c 20 22  rev", "VPrev", "
10330 56 4e 65 78 74 22 2c 20 22 53 6f 72 74 65 72 4e  VNext", "SorterN
10340 65 78 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ext",.          
10350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10360 20 22 4e 65 78 74 49 66 4f 70 65 6e 22 2c 20 22   "NextIfOpen", "
10370 50 72 65 76 49 66 4f 70 65 6e 22 2c 20 30 20 7d  PrevIfOpen", 0 }
10380 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
10390 61 7a 59 69 65 6c 64 5b 5d 20 3d 20 7b 20 22 59  azYield[] = { "Y
103a0 69 65 6c 64 22 2c 20 22 53 65 65 6b 4c 54 22 2c  ield", "SeekLT",
103b0 20 22 53 65 65 6b 47 54 22 2c 20 22 52 6f 77 53   "SeekGT", "RowS
103c0 65 74 52 65 61 64 22 2c 0a 20 20 20 20 20 20 20  etRead",.       
103d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
103e0 20 20 20 20 20 22 52 65 77 69 6e 64 22 2c 20 30       "Rewind", 0
103f0 20 7d 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   };.  const char
10400 20 2a 61 7a 47 6f 74 6f 5b 5d 20 3d 20 7b 20 22   *azGoto[] = { "
10410 47 6f 74 6f 22 2c 20 30 20 7d 3b 0a 0a 20 20 2f  Goto", 0 };..  /
10420 2a 20 54 72 79 20 74 6f 20 66 69 67 75 72 65 20  * Try to figure 
10430 6f 75 74 20 69 66 20 74 68 69 73 20 69 73 20 72  out if this is r
10440 65 61 6c 6c 79 20 61 6e 20 45 58 50 4c 41 49 4e  eally an EXPLAIN
10450 20 73 74 61 74 65 6d 65 6e 74 2e 20 49 66 20 74   statement. If t
10460 68 69 73 0a 20 20 2a 2a 20 63 61 6e 6e 6f 74 20  his.  ** cannot 
10470 62 65 20 76 65 72 69 66 69 65 64 2c 20 72 65 74  be verified, ret
10480 75 72 6e 20 65 61 72 6c 79 2e 20 20 2a 2f 0a 20  urn early.  */. 
10490 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c   if( sqlite3_col
104a0 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 71 6c 29 21  umn_count(pSql)!
104b0 3d 38 20 29 7b 0a 20 20 20 20 70 2d 3e 63 4d 6f  =8 ){.    p->cMo
104c0 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20  de = p->mode;.  
104d0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
104e0 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 73  zSql = sqlite3_s
104f0 71 6c 28 70 53 71 6c 29 3b 0a 20 20 69 66 28 20  ql(pSql);.  if( 
10500 7a 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e  zSql==0 ) return
10510 3b 0a 20 20 66 6f 72 28 7a 3d 7a 53 71 6c 3b 20  ;.  for(z=zSql; 
10520 2a 7a 3d 3d 27 20 27 20 7c 7c 20 2a 7a 3d 3d 27  *z==' ' || *z=='
10530 5c 74 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 6e 27 20  \t' || *z=='\n' 
10540 7c 7c 20 2a 7a 3d 3d 27 5c 66 27 20 7c 7c 20 2a  || *z=='\f' || *
10550 7a 3d 3d 27 5c 72 27 3b 20 7a 2b 2b 29 3b 0a 20  z=='\r'; z++);. 
10560 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
10570 6e 69 63 6d 70 28 7a 2c 20 22 65 78 70 6c 61 69  nicmp(z, "explai
10580 6e 22 2c 20 37 29 20 29 7b 0a 20 20 20 20 70 2d  n", 7) ){.    p-
10590 3e 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65  >cMode = p->mode
105a0 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  ;.    return;.  
105b0 7d 0a 0a 20 20 66 6f 72 28 69 4f 70 3d 30 3b 20  }..  for(iOp=0; 
105c0 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
105d0 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29 3b 20  te3_step(pSql); 
105e0 69 4f 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20  iOp++){.    int 
105f0 69 3b 0a 20 20 20 20 69 6e 74 20 69 41 64 64 72  i;.    int iAddr
10600 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
10610 6e 5f 69 6e 74 28 70 53 71 6c 2c 20 30 29 3b 0a  n_int(pSql, 0);.
10620 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
10630 7a 4f 70 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  zOp = (const cha
10640 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
10650 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 31 29 3b  n_text(pSql, 1);
10660 0a 0a 20 20 20 20 2f 2a 20 53 65 74 20 70 32 20  ..    /* Set p2 
10670 74 6f 20 74 68 65 20 50 32 20 66 69 65 6c 64 20  to the P2 field 
10680 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f  of the current o
10690 70 63 6f 64 65 2e 20 54 68 65 6e 2c 20 61 73 73  pcode. Then, ass
106a0 75 6d 69 6e 67 20 74 68 61 74 0a 20 20 20 20 2a  uming that.    *
106b0 2a 20 70 32 20 69 73 20 61 6e 20 69 6e 73 74 72  * p2 is an instr
106c0 75 63 74 69 6f 6e 20 61 64 64 72 65 73 73 2c 20  uction address, 
106d0 73 65 74 20 76 61 72 69 61 62 6c 65 20 70 32 6f  set variable p2o
106e0 70 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  p to the index o
106f0 66 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 6e  f that.    ** in
10700 73 74 72 75 63 74 69 6f 6e 20 69 6e 20 74 68 65  struction in the
10710 20 61 69 49 6e 64 65 6e 74 5b 5d 20 61 72 72 61   aiIndent[] arra
10720 79 2e 20 70 32 20 61 6e 64 20 70 32 6f 70 20 6d  y. p2 and p2op m
10730 61 79 20 62 65 20 64 69 66 66 65 72 65 6e 74 20  ay be different 
10740 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 20 63 75  if.    ** the cu
10750 72 72 65 6e 74 20 69 6e 73 74 72 75 63 74 69 6f  rrent instructio
10760 6e 20 69 73 20 70 61 72 74 20 6f 66 20 61 20 73  n is part of a s
10770 75 62 2d 70 72 6f 67 72 61 6d 20 67 65 6e 65 72  ub-program gener
10780 61 74 65 64 20 62 79 20 61 6e 0a 20 20 20 20 2a  ated by an.    *
10790 2a 20 53 51 4c 20 74 72 69 67 67 65 72 20 6f 72  * SQL trigger or
107a0 20 66 6f 72 65 69 67 6e 20 6b 65 79 2e 20 20 2a   foreign key.  *
107b0 2f 0a 20 20 20 20 69 6e 74 20 70 32 20 3d 20 73  /.    int p2 = s
107c0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
107d0 74 28 70 53 71 6c 2c 20 33 29 3b 0a 20 20 20 20  t(pSql, 3);.    
107e0 69 6e 74 20 70 32 6f 70 20 3d 20 28 70 32 20 2b  int p2op = (p2 +
107f0 20 28 69 4f 70 2d 69 41 64 64 72 29 29 3b 0a 0a   (iOp-iAddr));..
10800 20 20 20 20 2f 2a 20 47 72 6f 77 20 74 68 65 20      /* Grow the 
10810 70 2d 3e 61 69 49 6e 64 65 6e 74 20 61 72 72 61  p->aiIndent arra
10820 79 20 61 73 20 72 65 71 75 69 72 65 64 20 2a 2f  y as required */
10830 0a 20 20 20 20 69 66 28 20 69 4f 70 3e 3d 6e 41  .    if( iOp>=nA
10840 6c 6c 6f 63 20 29 7b 0a 20 20 20 20 20 20 69 66  lloc ){.      if
10850 28 20 69 4f 70 3d 3d 30 20 29 7b 0a 20 20 20 20  ( iOp==0 ){.    
10860 20 20 20 20 2f 2a 20 44 6f 20 66 75 72 74 68 65      /* Do furthe
10870 72 20 76 65 72 66 69 63 61 74 69 6f 6e 20 74 68  r verfication th
10880 61 74 20 74 68 69 73 20 69 73 20 65 78 70 6c 61  at this is expla
10890 69 6e 20 6f 75 74 70 75 74 2e 20 20 41 62 6f 72  in output.  Abor
108a0 74 20 69 66 0a 20 20 20 20 20 20 20 20 2a 2a 20  t if.        ** 
108b0 69 74 20 69 73 20 6e 6f 74 20 2a 2f 0a 20 20 20  it is not */.   
108c0 20 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73       static cons
108d0 74 20 63 68 61 72 20 2a 65 78 70 6c 61 69 6e 43  t char *explainC
108e0 6f 6c 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 20  ols[] = {.      
108f0 20 20 20 20 20 22 61 64 64 72 22 2c 20 22 6f 70       "addr", "op
10900 63 6f 64 65 22 2c 20 22 70 31 22 2c 20 22 70 32  code", "p1", "p2
10910 22 2c 20 22 70 33 22 2c 20 22 70 34 22 2c 20 22  ", "p3", "p4", "
10920 70 35 22 2c 20 22 63 6f 6d 6d 65 6e 74 22 20 7d  p5", "comment" }
10930 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 6a  ;.        int jj
10940 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 6a  ;.        for(jj
10950 3d 30 3b 20 6a 6a 3c 41 72 72 61 79 53 69 7a 65  =0; jj<ArraySize
10960 28 65 78 70 6c 61 69 6e 43 6f 6c 73 29 3b 20 6a  (explainCols); j
10970 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  j++){.          
10980 69 66 28 20 73 74 72 63 6d 70 28 73 71 6c 69 74  if( strcmp(sqlit
10990 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70  e3_column_name(p
109a0 53 71 6c 2c 6a 6a 29 2c 65 78 70 6c 61 69 6e 43  Sql,jj),explainC
109b0 6f 6c 73 5b 6a 6a 5d 29 21 3d 30 20 29 7b 0a 20  ols[jj])!=0 ){. 
109c0 20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 63 4d             p->cM
109d0 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20  ode = p->mode;. 
109e0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
109f0 65 33 5f 72 65 73 65 74 28 70 53 71 6c 29 3b 0a  e3_reset(pSql);.
10a00 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
10a10 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  rn;.          }.
10a20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
10a30 7d 0a 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20 2b  }.      nAlloc +
10a40 3d 20 31 30 30 3b 0a 20 20 20 20 20 20 70 2d 3e  = 100;.      p->
10a50 61 69 49 6e 64 65 6e 74 20 3d 20 28 69 6e 74 2a  aiIndent = (int*
10a60 29 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63  )sqlite3_realloc
10a70 36 34 28 70 2d 3e 61 69 49 6e 64 65 6e 74 2c 20  64(p->aiIndent, 
10a80 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 69 6e  nAlloc*sizeof(in
10a90 74 29 29 3b 0a 20 20 20 20 20 20 61 62 59 69 65  t));.      abYie
10aa0 6c 64 20 3d 20 28 69 6e 74 2a 29 73 71 6c 69 74  ld = (int*)sqlit
10ab0 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 61 62 59  e3_realloc64(abY
10ac0 69 65 6c 64 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a  ield, nAlloc*siz
10ad0 65 6f 66 28 69 6e 74 29 29 3b 0a 20 20 20 20 7d  eof(int));.    }
10ae0 0a 20 20 20 20 61 62 59 69 65 6c 64 5b 69 4f 70  .    abYield[iOp
10af0 5d 20 3d 20 73 74 72 5f 69 6e 5f 61 72 72 61 79  ] = str_in_array
10b00 28 7a 4f 70 2c 20 61 7a 59 69 65 6c 64 29 3b 0a  (zOp, azYield);.
10b10 20 20 20 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b      p->aiIndent[
10b20 69 4f 70 5d 20 3d 20 30 3b 0a 20 20 20 20 70 2d  iOp] = 0;.    p-
10b30 3e 6e 49 6e 64 65 6e 74 20 3d 20 69 4f 70 2b 31  >nIndent = iOp+1
10b40 3b 0a 0a 20 20 20 20 69 66 28 20 73 74 72 5f 69  ;..    if( str_i
10b50 6e 5f 61 72 72 61 79 28 7a 4f 70 2c 20 61 7a 4e  n_array(zOp, azN
10b60 65 78 74 29 20 29 7b 0a 20 20 20 20 20 20 66 6f  ext) ){.      fo
10b70 72 28 69 3d 70 32 6f 70 3b 20 69 3c 69 4f 70 3b  r(i=p2op; i<iOp;
10b80 20 69 2b 2b 29 20 70 2d 3e 61 69 49 6e 64 65 6e   i++) p->aiInden
10b90 74 5b 69 5d 20 2b 3d 20 32 3b 0a 20 20 20 20 7d  t[i] += 2;.    }
10ba0 0a 20 20 20 20 69 66 28 20 73 74 72 5f 69 6e 5f  .    if( str_in_
10bb0 61 72 72 61 79 28 7a 4f 70 2c 20 61 7a 47 6f 74  array(zOp, azGot
10bc0 6f 29 20 26 26 20 70 32 6f 70 3c 70 2d 3e 6e 49  o) && p2op<p->nI
10bd0 6e 64 65 6e 74 0a 20 20 20 20 20 26 26 20 28 61  ndent.     && (a
10be0 62 59 69 65 6c 64 5b 70 32 6f 70 5d 20 7c 7c 20  bYield[p2op] || 
10bf0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
10c00 6e 74 28 70 53 71 6c 2c 20 32 29 29 0a 20 20 20  nt(pSql, 2)).   
10c10 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
10c20 70 32 6f 70 3b 20 69 3c 69 4f 70 3b 20 69 2b 2b  p2op; i<iOp; i++
10c30 29 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 5d  ) p->aiIndent[i]
10c40 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 7d   += 2;.    }.  }
10c50 0a 0a 20 20 70 2d 3e 69 49 6e 64 65 6e 74 20 3d  ..  p->iIndent =
10c60 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72   0;.  sqlite3_fr
10c70 65 65 28 61 62 59 69 65 6c 64 29 3b 0a 20 20 73  ee(abYield);.  s
10c80 71 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 71  qlite3_reset(pSq
10c90 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65  l);.}../*.** Fre
10ca0 65 20 74 68 65 20 61 72 72 61 79 20 61 6c 6c 6f  e the array allo
10cb0 63 61 74 65 64 20 62 79 20 65 78 70 6c 61 69 6e  cated by explain
10cc0 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28 29 2e  _data_prepare().
10cd0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
10ce0 65 78 70 6c 61 69 6e 5f 64 61 74 61 5f 64 65 6c  explain_data_del
10cf0 65 74 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  ete(ShellState *
10d00 70 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72  p){.  sqlite3_fr
10d10 65 65 28 70 2d 3e 61 69 49 6e 64 65 6e 74 29 3b  ee(p->aiIndent);
10d20 0a 20 20 70 2d 3e 61 69 49 6e 64 65 6e 74 20 3d  .  p->aiIndent =
10d30 20 30 3b 0a 20 20 70 2d 3e 6e 49 6e 64 65 6e 74   0;.  p->nIndent
10d40 20 3d 20 30 3b 0a 20 20 70 2d 3e 69 49 6e 64 65   = 0;.  p->iInde
10d50 6e 74 20 3d 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nt = 0;.}../*.**
10d60 20 44 69 73 61 62 6c 65 20 61 6e 64 20 72 65 73   Disable and res
10d70 74 6f 72 65 20 2e 77 68 65 72 65 74 72 61 63 65  tore .wheretrace
10d80 20 61 6e 64 20 2e 73 65 6c 65 63 74 74 72 61 63   and .selecttrac
10d90 65 20 73 65 74 74 69 6e 67 73 2e 0a 2a 2f 0a 23  e settings..*/.#
10da0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
10db0 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69  E_DEBUG) && defi
10dc0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
10dd0 45 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a 65  E_SELECTTRACE).e
10de0 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65  xtern int sqlite
10df0 33 53 65 6c 65 63 74 54 72 61 63 65 3b 0a 73 74  3SelectTrace;.st
10e00 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 53 65  atic int savedSe
10e10 6c 65 63 74 54 72 61 63 65 3b 0a 23 65 6e 64 69  lectTrace;.#endi
10e20 66 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51  f.#if defined(SQ
10e30 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20 64  LITE_DEBUG) && d
10e40 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
10e50 41 42 4c 45 5f 57 48 45 52 45 54 52 41 43 45 29  ABLE_WHERETRACE)
10e60 0a 65 78 74 65 72 6e 20 69 6e 74 20 73 71 6c 69  .extern int sqli
10e70 74 65 33 57 68 65 72 65 54 72 61 63 65 3b 0a 73  te3WhereTrace;.s
10e80 74 61 74 69 63 20 69 6e 74 20 73 61 76 65 64 57  tatic int savedW
10e90 68 65 72 65 54 72 61 63 65 3b 0a 23 65 6e 64 69  hereTrace;.#endi
10ea0 66 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64 69  f.static void di
10eb0 73 61 62 6c 65 5f 64 65 62 75 67 5f 74 72 61 63  sable_debug_trac
10ec0 65 5f 6d 6f 64 65 73 28 76 6f 69 64 29 7b 0a 23  e_modes(void){.#
10ed0 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
10ee0 45 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69  E_DEBUG) && defi
10ef0 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
10f00 45 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a 20  E_SELECTTRACE). 
10f10 20 73 61 76 65 64 53 65 6c 65 63 74 54 72 61 63   savedSelectTrac
10f20 65 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  e = sqlite3Selec
10f30 74 54 72 61 63 65 3b 0a 20 20 73 71 6c 69 74 65  tTrace;.  sqlite
10f40 33 53 65 6c 65 63 74 54 72 61 63 65 20 3d 20 30  3SelectTrace = 0
10f50 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65 66  ;.#endif.#if def
10f60 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42 55  ined(SQLITE_DEBU
10f70 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53 51  G) && defined(SQ
10f80 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45 52  LITE_ENABLE_WHER
10f90 45 54 52 41 43 45 29 0a 20 20 73 61 76 65 64 57  ETRACE).  savedW
10fa0 68 65 72 65 54 72 61 63 65 20 3d 20 73 71 6c 69  hereTrace = sqli
10fb0 74 65 33 57 68 65 72 65 54 72 61 63 65 3b 0a 20  te3WhereTrace;. 
10fc0 20 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61   sqlite3WhereTra
10fd0 63 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 7d  ce = 0;.#endif.}
10fe0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
10ff0 74 6f 72 65 5f 64 65 62 75 67 5f 74 72 61 63 65  tore_debug_trace
11000 5f 6d 6f 64 65 73 28 76 6f 69 64 29 7b 0a 23 69  _modes(void){.#i
11010 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
11020 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69 6e  _DEBUG) && defin
11030 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
11040 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a 20 20  _SELECTTRACE).  
11050 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
11060 63 65 20 3d 20 73 61 76 65 64 53 65 6c 65 63 74  ce = savedSelect
11070 54 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69  Trace;.#endif.#i
11080 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
11090 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69 6e  _DEBUG) && defin
110a0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
110b0 5f 57 48 45 52 45 54 52 41 43 45 29 0a 20 20 73  _WHERETRACE).  s
110c0 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63 65  qlite3WhereTrace
110d0 20 3d 20 73 61 76 65 64 57 68 65 72 65 54 72 61   = savedWhereTra
110e0 63 65 3b 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a  ce;.#endif.}../*
110f0 0a 2a 2a 20 52 75 6e 20 61 20 70 72 65 70 61 72  .** Run a prepar
11100 65 64 20 73 74 61 74 65 6d 65 6e 74 0a 2a 2f 0a  ed statement.*/.
11110 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 65 63  static void exec
11120 5f 70 72 65 70 61 72 65 64 5f 73 74 6d 74 28 0a  _prepared_stmt(.
11130 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41    ShellState *pA
11140 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
11150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11160 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74 6f     /* Pointer to
11170 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a 20   ShellState */. 
11180 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
11190 53 74 6d 74 2c 20 20 20 20 20 20 20 20 20 20 20  Stmt,           
111a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
111b0 20 20 2f 2a 20 53 74 61 74 6d 65 6e 74 20 74 6f    /* Statment to
111c0 20 72 75 6e 20 2a 2f 0a 20 20 69 6e 74 20 28 2a   run */.  int (*
111d0 78 43 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a  xCallback)(void*
111e0 2c 69 6e 74 2c 63 68 61 72 2a 2a 2c 63 68 61 72  ,int,char**,char
111f0 2a 2a 2c 69 6e 74 2a 29 20 20 20 2f 2a 20 43 61  **,int*)   /* Ca
11200 6c 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20  llback function 
11210 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  */.){.  int rc;.
11220 0a 20 20 2f 2a 20 70 65 72 66 6f 72 6d 20 74 68  .  /* perform th
11230 65 20 66 69 72 73 74 20 73 74 65 70 2e 20 20 74  e first step.  t
11240 68 69 73 20 77 69 6c 6c 20 74 65 6c 6c 20 75 73  his will tell us
11250 20 69 66 20 77 65 0a 20 20 2a 2a 20 68 61 76 65   if we.  ** have
11260 20 61 20 72 65 73 75 6c 74 20 73 65 74 20 6f 72   a result set or
11270 20 6e 6f 74 20 61 6e 64 20 68 6f 77 20 77 69 64   not and how wid
11280 65 20 69 74 20 69 73 2e 0a 20 20 2a 2f 0a 20 20  e it is..  */.  
11290 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  rc = sqlite3_ste
112a0 70 28 70 53 74 6d 74 29 3b 0a 20 20 2f 2a 20 69  p(pStmt);.  /* i
112b0 66 20 77 65 20 68 61 76 65 20 61 20 72 65 73 75  f we have a resu
112c0 6c 74 20 73 65 74 2e 2e 2e 20 2a 2f 0a 20 20 69  lt set... */.  i
112d0 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 20 3d 3d  f( SQLITE_ROW ==
112e0 20 72 63 20 29 7b 0a 20 20 20 20 2f 2a 20 69 66   rc ){.    /* if
112f0 20 77 65 20 68 61 76 65 20 61 20 63 61 6c 6c 62   we have a callb
11300 61 63 6b 2e 2e 2e 20 2a 2f 0a 20 20 20 20 69 66  ack... */.    if
11310 28 20 78 43 61 6c 6c 62 61 63 6b 20 29 7b 0a 20  ( xCallback ){. 
11320 20 20 20 20 20 2f 2a 20 61 6c 6c 6f 63 61 74 65       /* allocate
11330 20 73 70 61 63 65 20 66 6f 72 20 63 6f 6c 20 6e   space for col n
11340 61 6d 65 20 70 74 72 2c 20 76 61 6c 75 65 20 70  ame ptr, value p
11350 74 72 2c 20 61 6e 64 20 74 79 70 65 20 2a 2f 0a  tr, and type */.
11360 20 20 20 20 20 20 69 6e 74 20 6e 43 6f 6c 20 3d        int nCol =
11370 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
11380 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20  count(pStmt);.  
11390 20 20 20 20 76 6f 69 64 20 2a 70 44 61 74 61 20      void *pData 
113a0 3d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  = sqlite3_malloc
113b0 36 34 28 33 2a 6e 43 6f 6c 2a 73 69 7a 65 6f 66  64(3*nCol*sizeof
113c0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 20 2b 20  (const char*) + 
113d0 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70  1);.      if( !p
113e0 44 61 74 61 20 29 7b 0a 20 20 20 20 20 20 20 20  Data ){.        
113f0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
11400 4d 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  M;.      }else{.
11410 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61          char **a
11420 7a 43 6f 6c 73 20 3d 20 28 63 68 61 72 20 2a 2a  zCols = (char **
11430 29 70 44 61 74 61 3b 20 20 20 20 20 20 2f 2a 20  )pData;      /* 
11440 4e 61 6d 65 73 20 6f 66 20 72 65 73 75 6c 74 20  Names of result 
11450 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 20 20 20 20 20  columns */.     
11460 20 20 20 63 68 61 72 20 2a 2a 61 7a 56 61 6c 73     char **azVals
11470 20 3d 20 26 61 7a 43 6f 6c 73 5b 6e 43 6f 6c 5d   = &azCols[nCol]
11480 3b 20 20 20 20 20 20 20 2f 2a 20 52 65 73 75 6c  ;       /* Resul
11490 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  ts */.        in
114a0 74 20 2a 61 69 54 79 70 65 73 20 3d 20 28 69 6e  t *aiTypes = (in
114b0 74 20 2a 29 26 61 7a 56 61 6c 73 5b 6e 43 6f 6c  t *)&azVals[nCol
114c0 5d 3b 20 2f 2a 20 52 65 73 75 6c 74 20 74 79 70  ]; /* Result typ
114d0 65 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  es */.        in
114e0 74 20 69 2c 20 78 3b 0a 20 20 20 20 20 20 20 20  t i, x;.        
114f0 61 73 73 65 72 74 28 73 69 7a 65 6f 66 28 69 6e  assert(sizeof(in
11500 74 29 20 3c 3d 20 73 69 7a 65 6f 66 28 63 68 61  t) <= sizeof(cha
11510 72 20 2a 29 29 3b 0a 20 20 20 20 20 20 20 20 2f  r *));.        /
11520 2a 20 73 61 76 65 20 6f 66 66 20 70 74 72 73 20  * save off ptrs 
11530 74 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  to column names 
11540 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  */.        for(i
11550 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
11560 7b 0a 20 20 20 20 20 20 20 20 20 20 61 7a 43 6f  {.          azCo
11570 6c 73 5b 69 5d 20 3d 20 28 63 68 61 72 20 2a 29  ls[i] = (char *)
11580 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e  sqlite3_column_n
11590 61 6d 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20  ame(pStmt, i);. 
115a0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
115b0 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 2f   do{.          /
115c0 2a 20 65 78 74 72 61 63 74 20 74 68 65 20 64 61  * extract the da
115d0 74 61 20 61 6e 64 20 64 61 74 61 20 74 79 70 65  ta and data type
115e0 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 66  s */.          f
115f0 6f 72 28 69 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=0; i<nCol; 
11600 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
11610 20 20 61 69 54 79 70 65 73 5b 69 5d 20 3d 20 78    aiTypes[i] = x
11620 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
11630 6e 5f 74 79 70 65 28 70 53 74 6d 74 2c 20 69 29  n_type(pStmt, i)
11640 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
11650 28 20 78 3d 3d 53 51 4c 49 54 45 5f 42 4c 4f 42  ( x==SQLITE_BLOB
11660 20 26 26 20 70 41 72 67 20 26 26 20 70 41 72 67   && pArg && pArg
11670 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 49 6e  ->cMode==MODE_In
11680 73 65 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  sert ){.        
11690 20 20 20 20 20 20 61 7a 56 61 6c 73 5b 69 5d 20        azVals[i] 
116a0 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20 20 20  = "";.          
116b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
116c0 20 20 20 20 20 20 20 61 7a 56 61 6c 73 5b 69 5d         azVals[i]
116d0 20 3d 20 28 63 68 61 72 2a 29 73 71 6c 69 74 65   = (char*)sqlite
116e0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
116f0 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20 20 20  tmt, i);.       
11700 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
11710 20 20 20 69 66 28 20 21 61 7a 56 61 6c 73 5b 69     if( !azVals[i
11720 5d 20 26 26 20 28 61 69 54 79 70 65 73 5b 69 5d  ] && (aiTypes[i]
11730 21 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29  !=SQLITE_NULL) )
11740 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
11750 72 63 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45  rc = SQLITE_NOME
11760 4d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  M;.             
11770 20 62 72 65 61 6b 3b 20 2f 2a 20 66 72 6f 6d 20   break; /* from 
11780 66 6f 72 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  for */.         
11790 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
117a0 20 2f 2a 20 65 6e 64 20 66 6f 72 20 2a 2f 0a 0a   /* end for */..
117b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 69 66 20            /* if 
117c0 64 61 74 61 20 61 6e 64 20 74 79 70 65 73 20 65  data and types e
117d0 78 74 72 61 63 74 65 64 20 73 75 63 63 65 73 73  xtracted success
117e0 66 75 6c 6c 79 2e 2e 2e 20 2a 2f 0a 20 20 20 20  fully... */.    
117f0 20 20 20 20 20 20 69 66 28 20 53 51 4c 49 54 45        if( SQLITE
11800 5f 52 4f 57 20 3d 3d 20 72 63 20 29 7b 0a 20 20  _ROW == rc ){.  
11810 20 20 20 20 20 20 20 20 20 20 2f 2a 20 63 61 6c            /* cal
11820 6c 20 74 68 65 20 73 75 70 70 6c 69 65 64 20 63  l the supplied c
11830 61 6c 6c 62 61 63 6b 20 77 69 74 68 20 74 68 65  allback with the
11840 20 72 65 73 75 6c 74 20 72 6f 77 20 64 61 74 61   result row data
11850 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
11860 69 66 28 20 78 43 61 6c 6c 62 61 63 6b 28 70 41  if( xCallback(pA
11870 72 67 2c 20 6e 43 6f 6c 2c 20 61 7a 56 61 6c 73  rg, nCol, azVals
11880 2c 20 61 7a 43 6f 6c 73 2c 20 61 69 54 79 70 65  , azCols, aiType
11890 73 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  s) ){.          
118a0 20 20 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f      rc = SQLITE_
118b0 41 42 4f 52 54 3b 0a 20 20 20 20 20 20 20 20 20  ABORT;.         
118c0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
118d0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
118e0 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
118f0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
11900 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
11910 20 20 20 20 7d 20 77 68 69 6c 65 28 20 53 51 4c      } while( SQL
11920 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20 29 3b  ITE_ROW == rc );
11930 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
11940 5f 66 72 65 65 28 70 44 61 74 61 29 3b 0a 20 20  _free(pData);.  
11950 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
11960 0a 20 20 20 20 20 20 64 6f 7b 0a 20 20 20 20 20  .      do{.     
11970 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
11980 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20  step(pStmt);.   
11990 20 20 20 7d 20 77 68 69 6c 65 28 20 72 63 20 3d     } while( rc =
119a0 3d 20 53 51 4c 49 54 45 5f 52 4f 57 20 29 3b 0a  = SQLITE_ROW );.
119b0 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
119c0 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e  ** This function
119d0 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20 70 72   is called to pr
119e0 6f 63 65 73 73 20 53 51 4c 20 69 66 20 74 68 65  ocess SQL if the
119f0 20 70 72 65 76 69 6f 75 73 20 73 68 65 6c 6c 20   previous shell 
11a00 63 6f 6d 6d 61 6e 64 0a 2a 2a 20 77 61 73 20 22  command.** was "
11a10 2e 65 78 70 65 72 74 22 2e 20 49 74 20 70 61 73  .expert". It pas
11a20 73 65 73 20 74 68 65 20 53 51 4c 20 69 6e 20 74  ses the SQL in t
11a30 68 65 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65  he second argume
11a40 6e 74 20 64 69 72 65 63 74 6c 79 20 74 6f 0a 2a  nt directly to.*
11a50 2a 20 74 68 65 20 73 71 6c 69 74 65 33 65 78 70  * the sqlite3exp
11a60 65 72 74 20 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a  ert object..**.*
11a70 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
11a80 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
11a90 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
11aa0 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  e, an SQLite err
11ab0 6f 72 0a 2a 2a 20 63 6f 64 65 2e 20 49 6e 20 74  or.** code. In t
11ac0 68 69 73 20 63 61 73 65 2c 20 28 2a 70 7a 45 72  his case, (*pzEr
11ad0 72 29 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  r) may be set to
11ae0 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
11af0 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a  er containing.**
11b00 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67   an English lang
11b10 75 61 67 65 20 65 72 72 6f 72 20 6d 65 73 73 61  uage error messa
11b20 67 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ge. It is the re
11b30 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
11b40 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f  the.** caller to
11b50 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
11b60 20 74 68 69 73 20 62 75 66 66 65 72 20 75 73 69   this buffer usi
11b70 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ng sqlite3_free(
11b80 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
11b90 20 65 78 70 65 72 74 48 61 6e 64 6c 65 53 51 4c   expertHandleSQL
11ba0 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  (.  ShellState *
11bb0 70 53 74 61 74 65 2c 20 0a 20 20 63 6f 6e 73 74  pState, .  const
11bc0 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 0a 20 20   char *zSql, .  
11bd0 63 68 61 72 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a  char **pzErr.){.
11be0 20 20 61 73 73 65 72 74 28 20 70 53 74 61 74 65    assert( pState
11bf0 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74  ->expert.pExpert
11c00 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 7a   );.  assert( pz
11c10 45 72 72 3d 3d 30 20 7c 7c 20 2a 70 7a 45 72 72  Err==0 || *pzErr
11c20 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20  ==0 );.  return 
11c30 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 73  sqlite3_expert_s
11c40 71 6c 28 70 53 74 61 74 65 2d 3e 65 78 70 65 72  ql(pState->exper
11c50 74 2e 70 45 78 70 65 72 74 2c 20 7a 53 71 6c 2c  t.pExpert, zSql,
11c60 20 70 7a 45 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a   pzErr);.}../*.*
11c70 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
11c80 69 73 20 63 61 6c 6c 65 64 20 65 69 74 68 65 72  is called either
11c90 20 74 6f 20 73 69 6c 65 6e 74 6c 79 20 63 6c 65   to silently cle
11ca0 61 6e 20 75 70 20 74 68 65 20 6f 62 6a 65 63 74  an up the object
11cb0 0a 2a 2a 20 63 72 65 61 74 65 64 20 62 79 20 74  .** created by t
11cc0 68 65 20 22 2e 65 78 70 65 72 74 22 20 63 6f 6d  he ".expert" com
11cd0 6d 61 6e 64 20 28 69 66 20 62 43 61 6e 63 65 6c  mand (if bCancel
11ce0 3d 3d 31 29 2c 20 6f 72 20 74 6f 20 67 65 6e 65  ==1), or to gene
11cf0 72 61 74 65 20 61 20 0a 2a 2a 20 72 65 70 6f 72  rate a .** repor
11d00 74 20 66 72 6f 6d 20 69 74 20 61 6e 64 20 74 68  t from it and th
11d10 65 6e 20 63 6c 65 61 6e 20 69 74 20 75 70 20 28  en clean it up (
11d20 69 66 20 62 43 61 6e 63 65 6c 3d 3d 30 29 2e 0a  if bCancel==0)..
11d30 2a 2a 0a 2a 2a 20 49 66 20 73 75 63 63 65 73 73  **.** If success
11d40 66 75 6c 2c 20 53 51 4c 49 54 45 5f 4f 4b 20 69  ful, SQLITE_OK i
11d50 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
11d60 72 77 69 73 65 2c 20 61 6e 20 53 51 4c 69 74 65  rwise, an SQLite
11d70 20 65 72 72 6f 72 0a 2a 2a 20 63 6f 64 65 2e 20   error.** code. 
11d80 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 28 2a  In this case, (*
11d90 70 7a 45 72 72 29 20 6d 61 79 20 62 65 20 73 65  pzErr) may be se
11da0 74 20 74 6f 20 70 6f 69 6e 74 20 74 6f 20 61 20  t to point to a 
11db0 62 75 66 66 65 72 20 63 6f 6e 74 61 69 6e 69 6e  buffer containin
11dc0 67 0a 2a 2a 20 61 6e 20 45 6e 67 6c 69 73 68 20  g.** an English 
11dd0 6c 61 6e 67 75 61 67 65 20 65 72 72 6f 72 20 6d  language error m
11de0 65 73 73 61 67 65 2e 20 49 74 20 69 73 20 74 68  essage. It is th
11df0 65 20 72 65 73 70 6f 6e 73 69 62 69 6c 69 74 79  e responsibility
11e00 20 6f 66 20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65   of the.** calle
11e10 72 20 74 6f 20 65 76 65 6e 74 75 61 6c 6c 79 20  r to eventually 
11e20 66 72 65 65 20 74 68 69 73 20 62 75 66 66 65 72  free this buffer
11e30 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 5f 66   using sqlite3_f
11e40 72 65 65 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ree()..*/.static
11e50 20 69 6e 74 20 65 78 70 65 72 74 46 69 6e 69 73   int expertFinis
11e60 68 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  h(.  ShellState 
11e70 2a 70 53 74 61 74 65 2c 0a 20 20 69 6e 74 20 62  *pState,.  int b
11e80 43 61 6e 63 65 6c 2c 0a 20 20 63 68 61 72 20 2a  Cancel,.  char *
11e90 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 69 6e 74 20  *pzErr.){.  int 
11ea0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
11eb0 20 20 73 71 6c 69 74 65 33 65 78 70 65 72 74 20    sqlite3expert 
11ec0 2a 70 20 3d 20 70 53 74 61 74 65 2d 3e 65 78 70  *p = pState->exp
11ed0 65 72 74 2e 70 45 78 70 65 72 74 3b 0a 20 20 61  ert.pExpert;.  a
11ee0 73 73 65 72 74 28 20 70 20 29 3b 0a 20 20 61 73  ssert( p );.  as
11ef0 73 65 72 74 28 20 62 43 61 6e 63 65 6c 20 7c 7c  sert( bCancel ||
11f00 20 70 7a 45 72 72 3d 3d 30 20 7c 7c 20 2a 70 7a   pzErr==0 || *pz
11f10 45 72 72 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20  Err==0 );.  if( 
11f20 62 43 61 6e 63 65 6c 3d 3d 30 20 29 7b 0a 20 20  bCancel==0 ){.  
11f30 20 20 46 49 4c 45 20 2a 6f 75 74 20 3d 20 70 53    FILE *out = pS
11f40 74 61 74 65 2d 3e 6f 75 74 3b 0a 20 20 20 20 69  tate->out;.    i
11f50 6e 74 20 62 56 65 72 62 6f 73 65 20 3d 20 70 53  nt bVerbose = pS
11f60 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 62 56 65  tate->expert.bVe
11f70 72 62 6f 73 65 3b 0a 0a 20 20 20 20 72 63 20 3d  rbose;..    rc =
11f80 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f   sqlite3_expert_
11f90 61 6e 61 6c 79 7a 65 28 70 2c 20 70 7a 45 72 72  analyze(p, pzErr
11fa0 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
11fb0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
11fc0 20 20 69 6e 74 20 6e 51 75 65 72 79 20 3d 20 73    int nQuery = s
11fd0 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 63 6f  qlite3_expert_co
11fe0 75 6e 74 28 70 29 3b 0a 20 20 20 20 20 20 69 6e  unt(p);.      in
11ff0 74 20 69 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  t i;..      if( 
12000 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20  bVerbose ){.    
12010 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
12020 7a 43 61 6e 64 20 3d 20 73 71 6c 69 74 65 33 5f  zCand = sqlite3_
12030 65 78 70 65 72 74 5f 72 65 70 6f 72 74 28 70 2c  expert_report(p,
12040 30 2c 45 58 50 45 52 54 5f 52 45 50 4f 52 54 5f  0,EXPERT_REPORT_
12050 43 41 4e 44 49 44 41 54 45 53 29 3b 0a 20 20 20  CANDIDATES);.   
12060 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
12070 6f 75 74 2c 20 22 2d 2d 20 43 61 6e 64 69 64 61  out, "-- Candida
12080 74 65 73 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  tes ------------
12090 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
120a0 2d 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72  -\n");.        r
120b0 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
120c0 25 73 5c 6e 22 2c 20 7a 43 61 6e 64 29 3b 0a 20  %s\n", zCand);. 
120d0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
120e0 28 69 3d 30 3b 20 69 3c 6e 51 75 65 72 79 3b 20  (i=0; i<nQuery; 
120f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f  i++){.        co
12100 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d  nst char *zSql =
12110 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f   sqlite3_expert_
12120 72 65 70 6f 72 74 28 70 2c 20 69 2c 20 45 58 50  report(p, i, EXP
12130 45 52 54 5f 52 45 50 4f 52 54 5f 53 51 4c 29 3b  ERT_REPORT_SQL);
12140 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
12150 68 61 72 20 2a 7a 49 64 78 20 3d 20 73 71 6c 69  har *zIdx = sqli
12160 74 65 33 5f 65 78 70 65 72 74 5f 72 65 70 6f 72  te3_expert_repor
12170 74 28 70 2c 20 69 2c 20 45 58 50 45 52 54 5f 52  t(p, i, EXPERT_R
12180 45 50 4f 52 54 5f 49 4e 44 45 58 45 53 29 3b 0a  EPORT_INDEXES);.
12190 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
121a0 61 72 20 2a 7a 45 51 50 20 3d 20 73 71 6c 69 74  ar *zEQP = sqlit
121b0 65 33 5f 65 78 70 65 72 74 5f 72 65 70 6f 72 74  e3_expert_report
121c0 28 70 2c 20 69 2c 20 45 58 50 45 52 54 5f 52 45  (p, i, EXPERT_RE
121d0 50 4f 52 54 5f 50 4c 41 4e 29 3b 0a 20 20 20 20  PORT_PLAN);.    
121e0 20 20 20 20 69 66 28 20 7a 49 64 78 3d 3d 30 20      if( zIdx==0 
121f0 29 20 7a 49 64 78 20 3d 20 22 28 6e 6f 20 6e 65  ) zIdx = "(no ne
12200 77 20 69 6e 64 65 78 65 73 29 5c 6e 22 3b 0a 20  w indexes)\n";. 
12210 20 20 20 20 20 20 20 69 66 28 20 62 56 65 72 62         if( bVerb
12220 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ose ){.         
12230 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
12240 20 22 2d 2d 20 51 75 65 72 79 20 25 64 20 2d 2d   "-- Query %d --
12250 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12260 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e  --------------\n
12270 22 2c 69 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  ",i+1);.        
12280 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
12290 2c 20 22 25 73 5c 6e 5c 6e 22 2c 20 7a 53 71 6c  , "%s\n\n", zSql
122a0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
122b0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
122c0 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 49 64  out, "%s\n", zId
122d0 78 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f  x);.        raw_
122e0 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c  printf(out, "%s\
122f0 6e 22 2c 20 7a 45 51 50 29 3b 0a 20 20 20 20 20  n", zEQP);.     
12300 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73   }.    }.  }.  s
12310 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 64 65  qlite3_expert_de
12320 73 74 72 6f 79 28 70 29 3b 0a 20 20 70 53 74 61  stroy(p);.  pSta
12330 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65  te->expert.pExpe
12340 72 74 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e  rt = 0;.  return
12350 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45   rc;.}.../*.** E
12360 78 65 63 75 74 65 20 61 20 73 74 61 74 65 6d 65  xecute a stateme
12370 6e 74 20 6f 72 20 73 65 74 20 6f 66 20 73 74 61  nt or set of sta
12380 74 65 6d 65 6e 74 73 2e 20 20 50 72 69 6e 74 0a  tements.  Print.
12390 2a 2a 20 61 6e 79 20 72 65 73 75 6c 74 20 72 6f  ** any result ro
123a0 77 73 2f 63 6f 6c 75 6d 6e 73 20 64 65 70 65 6e  ws/columns depen
123b0 64 69 6e 67 20 6f 6e 20 74 68 65 20 63 75 72 72  ding on the curr
123c0 65 6e 74 20 6d 6f 64 65 0a 2a 2a 20 73 65 74 20  ent mode.** set 
123d0 76 69 61 20 74 68 65 20 73 75 70 70 6c 69 65 64  via the supplied
123e0 20 63 61 6c 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a   callback..**.**
123f0 20 54 68 69 73 20 69 73 20 76 65 72 79 20 73 69   This is very si
12400 6d 69 6c 61 72 20 74 6f 20 53 51 4c 69 74 65 27  milar to SQLite'
12410 73 20 62 75 69 6c 74 2d 69 6e 20 73 71 6c 69 74  s built-in sqlit
12420 65 33 5f 65 78 65 63 28 29 0a 2a 2a 20 66 75 6e  e3_exec().** fun
12430 63 74 69 6f 6e 20 65 78 63 65 70 74 20 69 74 20  ction except it 
12440 74 61 6b 65 73 20 61 20 73 6c 69 67 68 74 6c 79  takes a slightly
12450 20 64 69 66 66 65 72 65 6e 74 20 63 61 6c 6c 62   different callb
12460 61 63 6b 0a 2a 2a 20 61 6e 64 20 63 61 6c 6c 62  ack.** and callb
12470 61 63 6b 20 64 61 74 61 20 61 72 67 75 6d 65 6e  ack data argumen
12480 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
12490 20 73 68 65 6c 6c 5f 65 78 65 63 28 0a 20 20 73   shell_exec(.  s
124a0 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20  qlite3 *db,     
124b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124c0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f           /* An o
124d0 70 65 6e 20 64 61 74 61 62 61 73 65 20 2a 2f 0a  pen database */.
124e0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
124f0 71 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  ql,             
12500 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
12510 51 4c 20 74 6f 20 62 65 20 65 76 61 6c 75 61 74  QL to be evaluat
12520 65 64 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43  ed */.  int (*xC
12530 61 6c 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69  allback)(void*,i
12540 6e 74 2c 63 68 61 72 2a 2a 2c 63 68 61 72 2a 2a  nt,char**,char**
12550 2c 69 6e 74 2a 29 2c 20 20 20 2f 2a 20 43 61 6c  ,int*),   /* Cal
12560 6c 62 61 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a  lback function *
12570 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  /.              
12580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
125a0 20 28 6e 6f 74 20 74 68 65 20 73 61 6d 65 20 61   (not the same a
125b0 73 20 73 71 6c 69 74 65 33 5f 65 78 65 63 29 20  s sqlite3_exec) 
125c0 2a 2f 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  */.  ShellState 
125d0 2a 70 41 72 67 2c 20 20 20 20 20 20 20 20 20 20  *pArg,          
125e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
125f0 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68 65  * Pointer to She
12600 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20 63 68 61  llState */.  cha
12610 72 20 2a 2a 70 7a 45 72 72 4d 73 67 20 20 20 20  r **pzErrMsg    
12620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12630 20 20 20 20 20 20 20 2f 2a 20 45 72 72 6f 72 20         /* Error 
12640 6d 73 67 20 77 72 69 74 74 65 6e 20 68 65 72 65  msg written here
12650 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
12660 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 4e  _stmt *pStmt = N
12670 55 4c 4c 3b 20 20 20 20 20 2f 2a 20 53 74 61 74  ULL;     /* Stat
12680 65 6d 65 6e 74 20 74 6f 20 65 78 65 63 75 74 65  ement to execute
12690 2e 20 2a 2f 0a 20 20 69 6e 74 20 72 63 20 3d 20  . */.  int rc = 
126a0 53 51 4c 49 54 45 5f 4f 4b 3b 20 20 20 20 20 20  SQLITE_OK;      
126b0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
126c0 20 43 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 72   Code */.  int r
126d0 63 32 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  c2;.  const char
126e0 20 2a 7a 4c 65 66 74 6f 76 65 72 3b 20 20 20 20   *zLeftover;    
126f0 20 20 20 20 20 20 2f 2a 20 54 61 69 6c 20 6f 66        /* Tail of
12700 20 75 6e 70 72 6f 63 65 73 73 65 64 20 53 51 4c   unprocessed SQL
12710 20 2a 2f 0a 0a 20 20 69 66 28 20 70 7a 45 72 72   */..  if( pzErr
12720 4d 73 67 20 29 7b 0a 20 20 20 20 2a 70 7a 45 72  Msg ){.    *pzEr
12730 72 4d 73 67 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d  rMsg = NULL;.  }
12740 0a 0a 20 20 69 66 28 20 70 41 72 67 2d 3e 65 78  ..  if( pArg->ex
12750 70 65 72 74 2e 70 45 78 70 65 72 74 20 29 7b 0a  pert.pExpert ){.
12760 20 20 20 20 72 63 20 3d 20 65 78 70 65 72 74 48      rc = expertH
12770 61 6e 64 6c 65 53 51 4c 28 70 41 72 67 2c 20 7a  andleSQL(pArg, z
12780 53 71 6c 2c 20 70 7a 45 72 72 4d 73 67 29 3b 0a  Sql, pzErrMsg);.
12790 20 20 20 20 72 65 74 75 72 6e 20 65 78 70 65 72      return exper
127a0 74 46 69 6e 69 73 68 28 70 41 72 67 2c 20 28 72  tFinish(pArg, (r
127b0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 29 2c 20 70  c!=SQLITE_OK), p
127c0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 0a 20  zErrMsg);.  }.. 
127d0 20 77 68 69 6c 65 28 20 7a 53 71 6c 5b 30 5d 20   while( zSql[0] 
127e0 26 26 20 28 53 51 4c 49 54 45 5f 4f 4b 20 3d 3d  && (SQLITE_OK ==
127f0 20 72 63 29 20 29 7b 0a 20 20 20 20 73 74 61 74   rc) ){.    stat
12800 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  ic const char *z
12810 53 74 6d 74 53 71 6c 3b 0a 20 20 20 20 72 63 20  StmtSql;.    rc 
12820 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
12830 65 5f 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d  e_v2(db, zSql, -
12840 31 2c 20 26 70 53 74 6d 74 2c 20 26 7a 4c 65 66  1, &pStmt, &zLef
12850 74 6f 76 65 72 29 3b 0a 20 20 20 20 69 66 28 20  tover);.    if( 
12860 53 51 4c 49 54 45 5f 4f 4b 20 21 3d 20 72 63 20  SQLITE_OK != rc 
12870 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 7a 45  ){.      if( pzE
12880 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 20  rrMsg ){.       
12890 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 61 76   *pzErrMsg = sav
128a0 65 5f 65 72 72 5f 6d 73 67 28 64 62 29 3b 0a 20  e_err_msg(db);. 
128b0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
128c0 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70 53 74  {.      if( !pSt
128d0 6d 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  mt ){.        /*
128e0 20 74 68 69 73 20 68 61 70 70 65 6e 73 20 66 6f   this happens fo
128f0 72 20 61 20 63 6f 6d 6d 65 6e 74 20 6f 72 20 77  r a comment or w
12900 68 69 74 65 2d 73 70 61 63 65 20 2a 2f 0a 20 20  hite-space */.  
12910 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65        zSql = zLe
12920 66 74 6f 76 65 72 3b 0a 20 20 20 20 20 20 20 20  ftover;.        
12930 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a  while( IsSpace(z
12940 53 71 6c 5b 30 5d 29 20 29 20 7a 53 71 6c 2b 2b  Sql[0]) ) zSql++
12950 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e  ;.        contin
12960 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ue;.      }.    
12970 20 20 7a 53 74 6d 74 53 71 6c 20 3d 20 73 71 6c    zStmtSql = sql
12980 69 74 65 33 5f 73 71 6c 28 70 53 74 6d 74 29 3b  ite3_sql(pStmt);
12990 0a 20 20 20 20 20 20 69 66 28 20 7a 53 74 6d 74  .      if( zStmt
129a0 53 71 6c 3d 3d 30 20 29 20 7a 53 74 6d 74 53 71  Sql==0 ) zStmtSq
129b0 6c 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 77 68  l = "";.      wh
129c0 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 53 74  ile( IsSpace(zSt
129d0 6d 74 53 71 6c 5b 30 5d 29 20 29 20 7a 53 74 6d  mtSql[0]) ) zStm
129e0 74 53 71 6c 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f  tSql++;..      /
129f0 2a 20 73 61 76 65 20 6f 66 66 20 74 68 65 20 70  * save off the p
12a00 72 65 70 61 72 65 64 20 73 74 61 74 6d 65 6e 74  repared statment
12a10 20 68 61 6e 64 6c 65 20 61 6e 64 20 72 65 73 65   handle and rese
12a20 74 20 72 6f 77 20 63 6f 75 6e 74 20 2a 2f 0a 20  t row count */. 
12a30 20 20 20 20 20 69 66 28 20 70 41 72 67 20 29 7b       if( pArg ){
12a40 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e 70  .        pArg->p
12a50 53 74 6d 74 20 3d 20 70 53 74 6d 74 3b 0a 20 20  Stmt = pStmt;.  
12a60 20 20 20 20 20 20 70 41 72 67 2d 3e 63 6e 74 20        pArg->cnt 
12a70 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  = 0;.      }..  
12a80 20 20 20 20 2f 2a 20 65 63 68 6f 20 74 68 65 20      /* echo the 
12a90 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 20 69 66  sql statement if
12aa0 20 65 63 68 6f 20 6f 6e 20 2a 2f 0a 20 20 20 20   echo on */.    
12ab0 20 20 69 66 28 20 70 41 72 67 20 26 26 20 53 68    if( pArg && Sh
12ac0 65 6c 6c 48 61 73 46 6c 61 67 28 70 41 72 67 2c  ellHasFlag(pArg,
12ad0 20 53 48 46 4c 47 5f 45 63 68 6f 29 20 29 7b 0a   SHFLG_Echo) ){.
12ae0 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
12af0 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
12b00 25 73 5c 6e 22 2c 20 7a 53 74 6d 74 53 71 6c 20  %s\n", zStmtSql 
12b10 3f 20 7a 53 74 6d 74 53 71 6c 20 3a 20 7a 53 71  ? zStmtSql : zSq
12b20 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  l);.      }..   
12b30 20 20 20 2f 2a 20 53 68 6f 77 20 74 68 65 20 45     /* Show the E
12b40 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
12b50 4e 20 69 66 20 2e 65 71 70 20 69 73 20 6f 6e 20  N if .eqp is on 
12b60 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  */.      if( pAr
12b70 67 20 26 26 20 70 41 72 67 2d 3e 61 75 74 6f 45  g && pArg->autoE
12b80 51 50 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  QP && sqlite3_st
12b90 72 6c 69 6b 65 28 22 45 58 50 4c 41 49 4e 25 22  rlike("EXPLAIN%"
12ba0 2c 7a 53 74 6d 74 53 71 6c 2c 30 29 21 3d 30 20  ,zStmtSql,0)!=0 
12bb0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
12bc0 65 33 5f 73 74 6d 74 20 2a 70 45 78 70 6c 61 69  e3_stmt *pExplai
12bd0 6e 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  n;.        char 
12be0 2a 7a 45 51 50 3b 0a 20 20 20 20 20 20 20 20 69  *zEQP;.        i
12bf0 6e 74 20 74 72 69 67 67 65 72 45 51 50 20 3d 20  nt triggerEQP = 
12c00 30 3b 0a 20 20 20 20 20 20 20 20 64 69 73 61 62  0;.        disab
12c10 6c 65 5f 64 65 62 75 67 5f 74 72 61 63 65 5f 6d  le_debug_trace_m
12c20 6f 64 65 73 28 29 3b 0a 20 20 20 20 20 20 20 20  odes();.        
12c30 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69  sqlite3_db_confi
12c40 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 43  g(db, SQLITE_DBC
12c50 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f 45 51  ONFIG_TRIGGER_EQ
12c60 50 2c 20 2d 31 2c 20 26 74 72 69 67 67 65 72 45  P, -1, &triggerE
12c70 51 50 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  QP);.        if(
12c80 20 70 41 72 67 2d 3e 61 75 74 6f 45 51 50 3e 3d   pArg->autoEQP>=
12c90 41 55 54 4f 45 51 50 5f 74 72 69 67 67 65 72 20  AUTOEQP_trigger 
12ca0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
12cb0 69 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 64  ite3_db_config(d
12cc0 62 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46  b, SQLITE_DBCONF
12cd0 49 47 5f 54 52 49 47 47 45 52 5f 45 51 50 2c 20  IG_TRIGGER_EQP, 
12ce0 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  1, 0);.        }
12cf0 0a 20 20 20 20 20 20 20 20 7a 45 51 50 20 3d 20  .        zEQP = 
12d00 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
12d10 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50  "EXPLAIN QUERY P
12d20 4c 41 4e 20 25 73 22 2c 20 7a 53 74 6d 74 53 71  LAN %s", zStmtSq
12d30 6c 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  l);.        rc =
12d40 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
12d50 5f 76 32 28 64 62 2c 20 7a 45 51 50 2c 20 2d 31  _v2(db, zEQP, -1
12d60 2c 20 26 70 45 78 70 6c 61 69 6e 2c 20 30 29 3b  , &pExplain, 0);
12d70 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d  .        if( rc=
12d80 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
12d90 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20 73          while( s
12da0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 45 78 70  qlite3_step(pExp
12db0 6c 61 69 6e 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  lain)==SQLITE_RO
12dc0 57 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  W ){.           
12dd0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
12de0 2d 3e 6f 75 74 2c 22 2d 2d 45 51 50 2d 2d 20 25  ->out,"--EQP-- %
12df0 64 2c 22 2c 73 71 6c 69 74 65 33 5f 63 6f 6c 75  d,",sqlite3_colu
12e00 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c  mn_int(pExplain,
12e10 20 30 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20   0));.          
12e20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72    raw_printf(pAr
12e30 67 2d 3e 6f 75 74 2c 22 25 64 2c 22 2c 20 73 71  g->out,"%d,", sq
12e40 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
12e50 28 70 45 78 70 6c 61 69 6e 2c 20 31 29 29 3b 0a  (pExplain, 1));.
12e60 20 20 20 20 20 20 20 20 20 20 20 20 72 61 77 5f              raw_
12e70 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74  printf(pArg->out
12e80 2c 22 25 64 2c 22 2c 20 73 71 6c 69 74 65 33 5f  ,"%d,", sqlite3_
12e90 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78 70 6c  column_int(pExpl
12ea0 61 69 6e 2c 20 32 29 29 3b 0a 20 20 20 20 20 20  ain, 2));.      
12eb0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
12ec0 66 28 70 41 72 67 2d 3e 6f 75 74 2c 22 25 73 5c  f(pArg->out,"%s\
12ed0 6e 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  n", sqlite3_colu
12ee0 6d 6e 5f 74 65 78 74 28 70 45 78 70 6c 61 69 6e  mn_text(pExplain
12ef0 2c 20 33 29 29 3b 0a 20 20 20 20 20 20 20 20 20  , 3));.         
12f00 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
12f10 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
12f20 61 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b  alize(pExplain);
12f30 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
12f40 5f 66 72 65 65 28 7a 45 51 50 29 3b 0a 20 20 20  _free(zEQP);.   
12f50 20 20 20 20 20 69 66 28 20 70 41 72 67 2d 3e 61       if( pArg->a
12f60 75 74 6f 45 51 50 3e 3d 41 55 54 4f 45 51 50 5f  utoEQP>=AUTOEQP_
12f70 66 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  full ){.        
12f80 20 20 2f 2a 20 41 6c 73 6f 20 64 6f 20 61 6e 20    /* Also do an 
12f90 45 58 50 4c 41 49 4e 20 66 6f 72 20 22 2e 65 71  EXPLAIN for ".eq
12fa0 70 20 66 75 6c 6c 22 20 6d 6f 64 65 20 2a 2f 0a  p full" mode */.
12fb0 20 20 20 20 20 20 20 20 20 20 7a 45 51 50 20 3d            zEQP =
12fc0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
12fd0 28 22 45 58 50 4c 41 49 4e 20 25 73 22 2c 20 7a  ("EXPLAIN %s", z
12fe0 53 74 6d 74 53 71 6c 29 3b 0a 20 20 20 20 20 20  StmtSql);.      
12ff0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
13000 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
13010 7a 45 51 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c  zEQP, -1, &pExpl
13020 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ain, 0);.       
13030 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
13040 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20  E_OK ){.        
13050 20 20 20 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20      pArg->cMode 
13060 3d 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 3b 0a  = MODE_Explain;.
13070 20 20 20 20 20 20 20 20 20 20 20 20 65 78 70 6c              expl
13080 61 69 6e 5f 64 61 74 61 5f 70 72 65 70 61 72 65  ain_data_prepare
13090 28 70 41 72 67 2c 20 70 45 78 70 6c 61 69 6e 29  (pArg, pExplain)
130a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 78  ;.            ex
130b0 65 63 5f 70 72 65 70 61 72 65 64 5f 73 74 6d 74  ec_prepared_stmt
130c0 28 70 41 72 67 2c 20 70 45 78 70 6c 61 69 6e 2c  (pArg, pExplain,
130d0 20 78 43 61 6c 6c 62 61 63 6b 29 3b 0a 20 20 20   xCallback);.   
130e0 20 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e           explain
130f0 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 70 41 72  _data_delete(pAr
13100 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  g);.          }.
13110 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
13120 33 5f 66 69 6e 61 6c 69 7a 65 28 70 45 78 70 6c  3_finalize(pExpl
13130 61 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ain);.          
13140 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 51  sqlite3_free(zEQ
13150 50 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  P);.        }.  
13160 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62        sqlite3_db
13170 5f 63 6f 6e 66 69 67 28 64 62 2c 20 53 51 4c 49  _config(db, SQLI
13180 54 45 5f 44 42 43 4f 4e 46 49 47 5f 54 52 49 47  TE_DBCONFIG_TRIG
13190 47 45 52 5f 45 51 50 2c 20 74 72 69 67 67 65 72  GER_EQP, trigger
131a0 45 51 50 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  EQP, 0);.       
131b0 20 72 65 73 74 6f 72 65 5f 64 65 62 75 67 5f 74   restore_debug_t
131c0 72 61 63 65 5f 6d 6f 64 65 73 28 29 3b 0a 20 20  race_modes();.  
131d0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
131e0 20 70 41 72 67 20 29 7b 0a 20 20 20 20 20 20 20   pArg ){.       
131f0 20 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 70   pArg->cMode = p
13200 41 72 67 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20  Arg->mode;.     
13210 20 20 20 69 66 28 20 70 41 72 67 2d 3e 61 75 74     if( pArg->aut
13220 6f 45 78 70 6c 61 69 6e 0a 20 20 20 20 20 20 20  oExplain.       
13230 20 20 26 26 20 73 71 6c 69 74 65 33 5f 63 6f 6c    && sqlite3_col
13240 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 74 6d 74 29  umn_count(pStmt)
13250 3d 3d 38 0a 20 20 20 20 20 20 20 20 20 26 26 20  ==8.         && 
13260 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28  sqlite3_strlike(
13270 22 45 58 50 4c 41 49 4e 25 22 2c 20 7a 53 74 6d  "EXPLAIN%", zStm
13280 74 53 71 6c 2c 30 29 3d 3d 30 0a 20 20 20 20 20  tSql,0)==0.     
13290 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20     ){.          
132a0 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f  pArg->cMode = MO
132b0 44 45 5f 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20  DE_Explain;.    
132c0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f      }..        /
132d0 2a 20 49 66 20 74 68 65 20 73 68 65 6c 6c 20 69  * If the shell i
132e0 73 20 63 75 72 72 65 6e 74 6c 79 20 69 6e 20 22  s currently in "
132f0 2e 65 78 70 6c 61 69 6e 22 20 6d 6f 64 65 2c 20  .explain" mode, 
13300 67 61 74 68 65 72 20 74 68 65 20 65 78 74 72 61  gather the extra
13310 0a 20 20 20 20 20 20 20 20 2a 2a 20 64 61 74 61  .        ** data
13320 20 72 65 71 75 69 72 65 64 20 74 6f 20 61 64 64   required to add
13330 20 69 6e 64 65 6e 74 73 20 74 6f 20 74 68 65 20   indents to the 
13340 6f 75 74 70 75 74 2e 2a 2f 0a 20 20 20 20 20 20  output.*/.      
13350 20 20 69 66 28 20 70 41 72 67 2d 3e 63 4d 6f 64    if( pArg->cMod
13360 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 20  e==MODE_Explain 
13370 29 7b 0a 20 20 20 20 20 20 20 20 20 20 65 78 70  ){.          exp
13380 6c 61 69 6e 5f 64 61 74 61 5f 70 72 65 70 61 72  lain_data_prepar
13390 65 28 70 41 72 67 2c 20 70 53 74 6d 74 29 3b 0a  e(pArg, pStmt);.
133a0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
133b0 7d 0a 0a 20 20 20 20 20 20 65 78 65 63 5f 70 72  }..      exec_pr
133c0 65 70 61 72 65 64 5f 73 74 6d 74 28 70 41 72 67  epared_stmt(pArg
133d0 2c 20 70 53 74 6d 74 2c 20 78 43 61 6c 6c 62 61  , pStmt, xCallba
133e0 63 6b 29 3b 0a 20 20 20 20 20 20 65 78 70 6c 61  ck);.      expla
133f0 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28 70  in_data_delete(p
13400 41 72 67 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  Arg);..      /* 
13410 70 72 69 6e 74 20 75 73 61 67 65 20 73 74 61 74  print usage stat
13420 73 20 69 66 20 73 74 61 74 73 20 6f 6e 20 2a 2f  s if stats on */
13430 0a 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20  .      if( pArg 
13440 26 26 20 70 41 72 67 2d 3e 73 74 61 74 73 4f 6e  && pArg->statsOn
13450 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 70   ){.        disp
13460 6c 61 79 5f 73 74 61 74 73 28 64 62 2c 20 70 41  lay_stats(db, pA
13470 72 67 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  rg, 0);.      }.
13480 0a 20 20 20 20 20 20 2f 2a 20 70 72 69 6e 74 20  .      /* print 
13490 6c 6f 6f 70 2d 63 6f 75 6e 74 65 72 73 20 69 66  loop-counters if
134a0 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20   required */.   
134b0 20 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70     if( pArg && p
134c0 41 72 67 2d 3e 73 63 61 6e 73 74 61 74 73 4f 6e  Arg->scanstatsOn
134d0 20 29 7b 0a 20 20 20 20 20 20 20 20 64 69 73 70   ){.        disp
134e0 6c 61 79 5f 73 63 61 6e 73 74 61 74 73 28 64 62  lay_scanstats(db
134f0 2c 20 70 41 72 67 29 3b 0a 20 20 20 20 20 20 7d  , pArg);.      }
13500 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 6e 61 6c  ..      /* Final
13510 69 7a 65 20 74 68 65 20 73 74 61 74 65 6d 65 6e  ize the statemen
13520 74 20 6a 75 73 74 20 65 78 65 63 75 74 65 64 2e  t just executed.
13530 20 49 66 20 74 68 69 73 20 66 61 69 6c 73 2c 20   If this fails, 
13540 73 61 76 65 20 61 0a 20 20 20 20 20 20 2a 2a 20  save a.      ** 
13550 63 6f 70 79 20 6f 66 20 74 68 65 20 65 72 72 6f  copy of the erro
13560 72 20 6d 65 73 73 61 67 65 2e 20 4f 74 68 65 72  r message. Other
13570 77 69 73 65 2c 20 73 65 74 20 7a 53 71 6c 20 74  wise, set zSql t
13580 6f 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 0a 20  o point to the. 
13590 20 20 20 20 20 2a 2a 20 6e 65 78 74 20 73 74 61       ** next sta
135a0 74 65 6d 65 6e 74 20 74 6f 20 65 78 65 63 75 74  tement to execut
135b0 65 2e 20 2a 2f 0a 20 20 20 20 20 20 72 63 32 20  e. */.      rc2 
135c0 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69  = sqlite3_finali
135d0 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
135e0 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
135f0 4e 4f 4d 45 4d 20 29 20 72 63 20 3d 20 72 63 32  NOMEM ) rc = rc2
13600 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d  ;.      if( rc==
13610 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
13620 20 20 20 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66       zSql = zLef
13630 74 6f 76 65 72 3b 0a 20 20 20 20 20 20 20 20 77  tover;.        w
13640 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 53  hile( IsSpace(zS
13650 71 6c 5b 30 5d 29 20 29 20 7a 53 71 6c 2b 2b 3b  ql[0]) ) zSql++;
13660 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
13670 20 70 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20   pzErrMsg ){.   
13680 20 20 20 20 20 2a 70 7a 45 72 72 4d 73 67 20 3d       *pzErrMsg =
13690 20 73 61 76 65 5f 65 72 72 5f 6d 73 67 28 64 62   save_err_msg(db
136a0 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  );.      }..    
136b0 20 20 2f 2a 20 63 6c 65 61 72 20 73 61 76 65 64    /* clear saved
136c0 20 73 74 6d 74 20 68 61 6e 64 6c 65 20 2a 2f 0a   stmt handle */.
136d0 20 20 20 20 20 20 69 66 28 20 70 41 72 67 20 29        if( pArg )
136e0 7b 0a 20 20 20 20 20 20 20 20 70 41 72 67 2d 3e  {.        pArg->
136f0 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20  pStmt = NULL;.  
13700 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
13710 2f 2a 20 65 6e 64 20 77 68 69 6c 65 20 2a 2f 0a  /* end while */.
13720 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
13730 0a 2f 2a 0a 2a 2a 20 52 65 6c 65 61 73 65 20 6d  ./*.** Release m
13740 65 6d 6f 72 79 20 70 72 65 76 69 6f 75 73 6c 79  emory previously
13750 20 61 6c 6c 6f 63 61 74 65 64 20 62 79 20 74 61   allocated by ta
13760 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 29 2e  bleColumnList().
13770 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
13780 66 72 65 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 63  freeColumnList(c
13790 68 61 72 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20 20  har **azCol){.  
137a0 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 31  int i;.  for(i=1
137b0 3b 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29  ; azCol[i]; i++)
137c0 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
137d0 65 65 28 61 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20  ee(azCol[i]);.  
137e0 7d 0a 20 20 2f 2a 20 61 7a 43 6f 6c 5b 30 5d 20  }.  /* azCol[0] 
137f0 69 73 20 61 20 73 74 61 74 69 63 20 73 74 72 69  is a static stri
13800 6e 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f  ng */.  sqlite3_
13810 66 72 65 65 28 61 7a 43 6f 6c 29 3b 0a 7d 0a 0a  free(azCol);.}..
13820 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 6c  /*.** Return a l
13830 69 73 74 20 6f 66 20 70 6f 69 6e 74 65 72 73 20  ist of pointers 
13840 74 6f 20 73 74 72 69 6e 67 73 20 77 68 69 63 68  to strings which
13850 20 61 72 65 20 74 68 65 20 6e 61 6d 65 73 20 6f   are the names o
13860 66 20 61 6c 6c 0a 2a 2a 20 63 6f 6c 75 6d 6e 73  f all.** columns
13870 20 69 6e 20 74 61 62 6c 65 20 7a 54 61 62 2e 20   in table zTab. 
13880 20 20 54 68 65 20 6d 65 6d 6f 72 79 20 74 6f 20    The memory to 
13890 68 6f 6c 64 20 74 68 65 20 6e 61 6d 65 73 20 69  hold the names i
138a0 73 20 64 79 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a  s dynamically.**
138b0 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6d   allocated and m
138c0 75 73 74 20 62 65 20 72 65 6c 65 61 73 65 64 20  ust be released 
138d0 62 79 20 74 68 65 20 63 61 6c 6c 65 72 20 75 73  by the caller us
138e0 69 6e 67 20 61 20 73 75 62 73 65 71 75 65 6e 74  ing a subsequent
138f0 20 63 61 6c 6c 0a 2a 2a 20 74 6f 20 66 72 65 65   call.** to free
13900 43 6f 6c 75 6d 6e 4c 69 73 74 28 29 2e 0a 2a 2a  ColumnList()..**
13910 0a 2a 2a 20 54 68 65 20 61 7a 43 6f 6c 5b 30 5d  .** The azCol[0]
13920 20 65 6e 74 72 79 20 69 73 20 75 73 75 61 6c 6c   entry is usuall
13930 79 20 4e 55 4c 4c 2e 20 20 48 6f 77 65 76 65 72  y NULL.  However
13940 2c 20 69 66 20 7a 54 61 62 20 63 6f 6e 74 61 69  , if zTab contai
13950 6e 73 20 61 20 72 6f 77 69 64 0a 2a 2a 20 76 61  ns a rowid.** va
13960 6c 75 65 20 74 68 61 74 20 6e 65 65 64 73 20 74  lue that needs t
13970 6f 20 62 65 20 70 72 65 73 65 72 76 65 64 2c 20  o be preserved, 
13980 74 68 65 6e 20 61 7a 43 6f 6c 5b 30 5d 20 69 73  then azCol[0] is
13990 20 66 69 6c 6c 65 64 20 69 6e 20 77 69 74 68 20   filled in with 
139a0 74 68 65 0a 2a 2a 20 6e 61 6d 65 20 6f 66 20 74  the.** name of t
139b0 68 65 20 72 6f 77 69 64 20 63 6f 6c 75 6d 6e 2e  he rowid column.
139c0 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72 73 74  .**.** The first
139d0 20 72 65 67 75 6c 61 72 20 63 6f 6c 75 6d 6e 20   regular column 
139e0 69 6e 20 74 68 65 20 74 61 62 6c 65 20 69 73 20  in the table is 
139f0 61 7a 43 6f 6c 5b 31 5d 2e 20 20 54 68 65 20 6c  azCol[1].  The l
13a00 69 73 74 20 69 73 20 74 65 72 6d 69 6e 61 74 65  ist is terminate
13a10 64 0a 2a 2a 20 62 79 20 61 6e 20 65 6e 74 72 79  d.** by an entry
13a20 20 77 69 74 68 20 61 7a 43 6f 6c 5b 69 5d 3d 3d   with azCol[i]==
13a30 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  0..*/.static cha
13a40 72 20 2a 2a 74 61 62 6c 65 43 6f 6c 75 6d 6e 4c  r **tableColumnL
13a50 69 73 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  ist(ShellState *
13a60 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  p, const char *z
13a70 54 61 62 29 7b 0a 20 20 63 68 61 72 20 2a 2a 61  Tab){.  char **a
13a80 7a 43 6f 6c 20 3d 20 30 3b 0a 20 20 73 71 6c 69  zCol = 0;.  sqli
13a90 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b  te3_stmt *pStmt;
13aa0 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
13ab0 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20   int nCol = 0;. 
13ac0 20 69 6e 74 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b   int nAlloc = 0;
13ad0 0a 20 20 69 6e 74 20 6e 50 4b 20 3d 20 30 3b 20  .  int nPK = 0; 
13ae0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
13af0 6f 66 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  of PRIMARY KEY c
13b00 6f 6c 75 6d 6e 73 20 73 65 65 6e 20 2a 2f 0a 20  olumns seen */. 
13b10 20 69 6e 74 20 69 73 49 50 4b 20 3d 20 30 3b 20   int isIPK = 0; 
13b20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6f      /* True if o
13b30 6e 65 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  ne PRIMARY KEY c
13b40 6f 6c 75 6d 6e 20 6f 66 20 74 79 70 65 20 49 4e  olumn of type IN
13b50 54 45 47 45 52 20 2a 2f 0a 20 20 69 6e 74 20 70  TEGER */.  int p
13b60 72 65 73 65 72 76 65 52 6f 77 69 64 20 3d 20 53  reserveRowid = S
13b70 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20 53  hellHasFlag(p, S
13b80 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52 6f 77  HFLG_PreserveRow
13b90 69 64 29 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a  id);.  int rc;..
13ba0 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
13bb0 5f 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41  _mprintf("PRAGMA
13bc0 20 74 61 62 6c 65 5f 69 6e 66 6f 3d 25 51 22 2c   table_info=%Q",
13bd0 20 7a 54 61 62 29 3b 0a 20 20 72 63 20 3d 20 73   zTab);.  rc = s
13be0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
13bf0 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  2(p->db, zSql, -
13c00 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
13c10 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
13c20 71 6c 29 3b 0a 20 20 69 66 28 20 72 63 20 29 20  ql);.  if( rc ) 
13c30 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 68 69 6c  return 0;.  whil
13c40 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  e( sqlite3_step(
13c50 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
13c60 4f 57 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 43  OW ){.    if( nC
13c70 6f 6c 3e 3d 6e 41 6c 6c 6f 63 2d 32 20 29 7b 0a  ol>=nAlloc-2 ){.
13c80 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20 3d 20 6e        nAlloc = n
13c90 41 6c 6c 6f 63 2a 32 20 2b 20 6e 43 6f 6c 20 2b  Alloc*2 + nCol +
13ca0 20 31 30 3b 0a 20 20 20 20 20 20 61 7a 43 6f 6c   10;.      azCol
13cb0 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c   = sqlite3_reall
13cc0 6f 63 28 61 7a 43 6f 6c 2c 20 6e 41 6c 6c 6f 63  oc(azCol, nAlloc
13cd0 2a 73 69 7a 65 6f 66 28 61 7a 43 6f 6c 5b 30 5d  *sizeof(azCol[0]
13ce0 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61 7a  ));.      if( az
13cf0 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Col==0 ){.      
13d00 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
13d10 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6f 75 74  err, "Error: out
13d20 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a   of memory\n");.
13d30 20 20 20 20 20 20 20 20 65 78 69 74 28 31 29 3b          exit(1);
13d40 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
13d50 20 20 20 61 7a 43 6f 6c 5b 2b 2b 6e 43 6f 6c 5d     azCol[++nCol]
13d60 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
13d70 74 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33  tf("%s", sqlite3
13d80 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74  _column_text(pSt
13d90 6d 74 2c 20 31 29 29 3b 0a 20 20 20 20 69 66 28  mt, 1));.    if(
13da0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
13db0 69 6e 74 28 70 53 74 6d 74 2c 20 35 29 20 29 7b  int(pStmt, 5) ){
13dc0 0a 20 20 20 20 20 20 6e 50 4b 2b 2b 3b 0a 20 20  .      nPK++;.  
13dd0 20 20 20 20 69 66 28 20 6e 50 4b 3d 3d 31 0a 20      if( nPK==1. 
13de0 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
13df0 5f 73 74 72 69 63 6d 70 28 28 63 6f 6e 73 74 20  _stricmp((const 
13e00 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
13e10 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
13e20 32 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  2),.            
13e30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 49                "I
13e40 4e 54 45 47 45 52 22 29 3d 3d 30 0a 20 20 20 20  NTEGER")==0.    
13e50 20 20 29 7b 0a 20 20 20 20 20 20 20 20 69 73 49    ){.        isI
13e60 50 4b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  PK = 1;.      }e
13e70 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73 49  lse{.        isI
13e80 50 4b 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  PK = 0;.      }.
13e90 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
13ea0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
13eb0 6d 74 29 3b 0a 20 20 69 66 28 20 61 7a 43 6f 6c  mt);.  if( azCol
13ec0 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
13ed0 20 20 61 7a 43 6f 6c 5b 30 5d 20 3d 20 30 3b 0a    azCol[0] = 0;.
13ee0 20 20 61 7a 43 6f 6c 5b 6e 43 6f 6c 2b 31 5d 20    azCol[nCol+1] 
13ef0 3d 20 30 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 64  = 0;..  /* The d
13f00 65 63 69 73 69 6f 6e 20 6f 66 20 77 68 65 74 68  ecision of wheth
13f10 65 72 20 6f 72 20 6e 6f 74 20 61 20 72 6f 77 69  er or not a rowi
13f20 64 20 72 65 61 6c 6c 79 20 6e 65 65 64 73 20 74  d really needs t
13f30 6f 20 62 65 20 70 72 65 73 65 72 76 65 64 0a 20  o be preserved. 
13f40 20 2a 2a 20 69 73 20 74 72 69 63 6b 79 2e 20 20   ** is tricky.  
13f50 57 65 20 6e 65 76 65 72 20 6e 65 65 64 20 74 6f  We never need to
13f60 20 70 72 65 73 65 72 76 65 20 61 20 72 6f 77 69   preserve a rowi
13f70 64 20 66 6f 72 20 61 20 57 49 54 48 4f 55 54 20  d for a WITHOUT 
13f80 52 4f 57 49 44 20 74 61 62 6c 65 0a 20 20 2a 2a  ROWID table.  **
13f90 20 6f 72 20 61 20 74 61 62 6c 65 20 77 69 74 68   or a table with
13fa0 20 61 6e 20 49 4e 54 45 47 45 52 20 50 52 49 4d   an INTEGER PRIM
13fb0 41 52 59 20 4b 45 59 2e 20 20 57 65 20 61 72 65  ARY KEY.  We are
13fc0 20 75 6e 61 62 6c 65 20 74 6f 20 70 72 65 73 65   unable to prese
13fd0 72 76 65 0a 20 20 2a 2a 20 72 6f 77 69 64 73 20  rve.  ** rowids 
13fe0 6f 6e 20 74 61 62 6c 65 73 20 77 68 65 72 65 20  on tables where 
13ff0 74 68 65 20 72 6f 77 69 64 20 69 73 20 69 6e 61  the rowid is ina
14000 63 63 65 73 73 69 62 6c 65 20 62 65 63 61 75 73  ccessible becaus
14010 65 20 74 68 65 72 65 20 61 72 65 20 6f 74 68 65  e there are othe
14020 72 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69  r.  ** columns i
14030 6e 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d 65  n the table name
14040 64 20 22 72 6f 77 69 64 22 2c 20 22 5f 72 6f 77  d "rowid", "_row
14050 69 64 5f 22 2c 20 61 6e 64 20 22 6f 69 64 22 2e  id_", and "oid".
14060 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 72 65 73  .  */.  if( pres
14070 65 72 76 65 52 6f 77 69 64 20 26 26 20 69 73 49  erveRowid && isI
14080 50 4b 20 29 7b 0a 20 20 20 20 2f 2a 20 49 66 20  PK ){.    /* If 
14090 61 20 73 69 6e 67 6c 65 20 50 52 49 4d 41 52 59  a single PRIMARY
140a0 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 77 69 74 68   KEY column with
140b0 20 74 79 70 65 20 49 4e 54 45 47 45 52 20 77 61   type INTEGER wa
140c0 73 20 73 65 65 6e 2c 20 74 68 65 6e 20 69 74 0a  s seen, then it.
140d0 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 62 65 20      ** might be 
140e0 61 6e 20 61 6c 69 73 65 20 66 6f 72 20 74 68 65  an alise for the
140f0 20 52 4f 57 49 44 2e 20 20 42 75 74 20 69 74 20   ROWID.  But it 
14100 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 61 20  might also be a 
14110 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20  WITHOUT ROWID.  
14120 20 20 2a 2a 20 74 61 62 6c 65 20 6f 72 20 61 20    ** table or a 
14130 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
14140 4b 45 59 20 44 45 53 43 20 63 6f 6c 75 6d 6e 2c  KEY DESC column,
14150 20 6e 65 69 74 68 65 72 20 6f 66 20 77 68 69 63   neither of whic
14160 68 20 61 72 65 0a 20 20 20 20 2a 2a 20 52 4f 57  h are.    ** ROW
14170 49 44 20 61 6c 69 61 73 65 73 2e 20 20 54 6f 20  ID aliases.  To 
14180 64 69 73 74 69 6e 67 75 69 73 68 20 74 68 65 73  distinguish thes
14190 65 20 63 61 73 65 73 2c 20 63 68 65 63 6b 20 74  e cases, check t
141a0 6f 20 73 65 65 20 69 66 0a 20 20 20 20 2a 2a 20  o see if.    ** 
141b0 74 68 65 72 65 20 69 73 20 61 20 22 70 6b 22 20  there is a "pk" 
141c0 65 6e 74 72 79 20 69 6e 20 22 50 52 41 47 4d 41  entry in "PRAGMA
141d0 20 69 6e 64 65 78 5f 6c 69 73 74 22 2e 20 20 54   index_list".  T
141e0 68 65 72 65 20 77 69 6c 6c 20 62 65 0a 20 20 20  here will be.   
141f0 20 2a 2a 20 6e 6f 20 22 70 6b 22 20 69 6e 64 65   ** no "pk" inde
14200 78 20 69 66 20 74 68 65 20 50 52 49 4d 41 52 59  x if the PRIMARY
14210 20 4b 45 59 20 72 65 61 6c 6c 79 20 69 73 20 61   KEY really is a
14220 6e 20 61 6c 69 61 73 20 66 6f 72 20 74 68 65 20  n alias for the 
14230 52 4f 57 49 44 2e 0a 20 20 20 20 2a 2f 0a 20 20  ROWID..    */.  
14240 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
14250 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
14260 20 31 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 69   1 FROM pragma_i
14270 6e 64 65 78 5f 6c 69 73 74 28 25 51 29 22 0a 20  ndex_list(%Q)". 
14280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14290 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
142a0 45 20 6f 72 69 67 69 6e 3d 27 70 6b 27 22 2c 20  E origin='pk'", 
142b0 7a 54 61 62 29 3b 0a 20 20 20 20 72 63 20 3d 20  zTab);.    rc = 
142c0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
142d0 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  v2(p->db, zSql, 
142e0 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
142f0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
14300 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20  (zSql);.    if( 
14310 72 63 20 29 7b 0a 20 20 20 20 20 20 66 72 65 65  rc ){.      free
14320 43 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c  ColumnList(azCol
14330 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
14340 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  0;.    }.    rc 
14350 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  = sqlite3_step(p
14360 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Stmt);.    sqlit
14370 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
14380 74 29 3b 0a 20 20 20 20 70 72 65 73 65 72 76 65  t);.    preserve
14390 52 6f 77 69 64 20 3d 20 72 63 3d 3d 53 51 4c 49  Rowid = rc==SQLI
143a0 54 45 5f 52 4f 57 3b 0a 20 20 7d 0a 20 20 69 66  TE_ROW;.  }.  if
143b0 28 20 70 72 65 73 65 72 76 65 52 6f 77 69 64 20  ( preserveRowid 
143c0 29 7b 0a 20 20 20 20 2f 2a 20 4f 6e 6c 79 20 70  ){.    /* Only p
143d0 72 65 73 65 72 76 65 20 74 68 65 20 72 6f 77 69  reserve the rowi
143e0 64 20 69 66 20 77 65 20 63 61 6e 20 66 69 6e 64  d if we can find
143f0 20 61 20 6e 61 6d 65 20 74 6f 20 75 73 65 20 66   a name to use f
14400 6f 72 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 6f  or the.    ** ro
14410 77 69 64 20 2a 2f 0a 20 20 20 20 73 74 61 74 69  wid */.    stati
14420 63 20 63 68 61 72 20 2a 61 7a 52 6f 77 69 64 5b  c char *azRowid[
14430 5d 20 3d 20 7b 20 22 72 6f 77 69 64 22 2c 20 22  ] = { "rowid", "
14440 5f 72 6f 77 69 64 5f 22 2c 20 22 6f 69 64 22 20  _rowid_", "oid" 
14450 7d 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  };.    int i, j;
14460 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
14470 33 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 66  3; j++){.      f
14480 6f 72 28 69 3d 31 3b 20 69 3c 3d 6e 43 6f 6c 3b  or(i=1; i<=nCol;
14490 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
144a0 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69 63  f( sqlite3_stric
144b0 6d 70 28 61 7a 52 6f 77 69 64 5b 6a 5d 2c 61 7a  mp(azRowid[j],az
144c0 43 6f 6c 5b 69 5d 29 3d 3d 30 20 29 20 62 72 65  Col[i])==0 ) bre
144d0 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
144e0 20 20 69 66 28 20 69 3e 6e 43 6f 6c 20 29 7b 0a    if( i>nCol ){.
144f0 20 20 20 20 20 20 20 20 2f 2a 20 41 74 20 74 68          /* At th
14500 69 73 20 70 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f  is point, we kno
14510 77 20 74 68 61 74 20 61 7a 52 6f 77 69 64 5b 6a  w that azRowid[j
14520 5d 20 69 73 20 6e 6f 74 20 74 68 65 20 6e 61 6d  ] is not the nam
14530 65 20 6f 66 20 61 6e 79 0a 20 20 20 20 20 20 20  e of any.       
14540 20 2a 2a 20 6f 72 64 69 6e 61 72 79 20 63 6f 6c   ** ordinary col
14550 75 6d 6e 20 69 6e 20 74 68 65 20 74 61 62 6c 65  umn in the table
14560 2e 20 20 56 65 72 69 66 79 20 74 68 61 74 20 61  .  Verify that a
14570 7a 52 6f 77 69 64 5b 6a 5d 20 69 73 20 61 20 76  zRowid[j] is a v
14580 61 6c 69 64 0a 20 20 20 20 20 20 20 20 2a 2a 20  alid.        ** 
14590 6e 61 6d 65 20 66 6f 72 20 74 68 65 20 72 6f 77  name for the row
145a0 69 64 20 62 65 66 6f 72 65 20 61 64 64 69 6e 67  id before adding
145b0 20 69 74 20 74 6f 20 61 7a 43 6f 6c 5b 30 5d 2e   it to azCol[0].
145c0 20 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 0a    WITHOUT ROWID.
145d0 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
145e0 73 20 77 69 6c 6c 20 66 61 69 6c 20 74 68 69 73  s will fail this
145f0 20 6c 61 73 74 20 63 68 65 63 6b 20 2a 2f 0a 20   last check */. 
14600 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
14610 74 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e  te3_table_column
14620 5f 6d 65 74 61 64 61 74 61 28 70 2d 3e 64 62 2c  _metadata(p->db,
14630 30 2c 7a 54 61 62 2c 61 7a 52 6f 77 69 64 5b 6a  0,zTab,azRowid[j
14640 5d 2c 30 2c 30 2c 30 2c 30 2c 30 29 3b 0a 20 20  ],0,0,0,0,0);.  
14650 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51        if( rc==SQ
14660 4c 49 54 45 5f 4f 4b 20 29 20 61 7a 43 6f 6c 5b  LITE_OK ) azCol[
14670 30 5d 20 3d 20 61 7a 52 6f 77 69 64 5b 6a 5d 3b  0] = azRowid[j];
14680 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
14690 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
146a0 7d 0a 20 20 72 65 74 75 72 6e 20 61 7a 43 6f 6c  }.  return azCol
146b0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 6f 67 67 6c  ;.}../*.** Toggl
146c0 65 20 74 68 65 20 72 65 76 65 72 73 65 5f 75 6e  e the reverse_un
146d0 6f 72 64 65 72 65 64 5f 73 65 6c 65 63 74 73 20  ordered_selects 
146e0 73 65 74 74 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74  setting..*/.stat
146f0 69 63 20 76 6f 69 64 20 74 6f 67 67 6c 65 53 65  ic void toggleSe
14700 6c 65 63 74 4f 72 64 65 72 28 73 71 6c 69 74 65  lectOrder(sqlite
14710 33 20 2a 64 62 29 7b 0a 20 20 73 71 6c 69 74 65  3 *db){.  sqlite
14720 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
14730 30 3b 0a 20 20 69 6e 74 20 69 53 65 74 74 69 6e  0;.  int iSettin
14740 67 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 7a 53  g = 0;.  char zS
14750 74 6d 74 5b 31 30 30 5d 3b 0a 20 20 73 71 6c 69  tmt[100];.  sqli
14760 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 64  te3_prepare_v2(d
14770 62 2c 20 22 50 52 41 47 4d 41 20 72 65 76 65 72  b, "PRAGMA rever
14780 73 65 5f 75 6e 6f 72 64 65 72 65 64 5f 73 65 6c  se_unordered_sel
14790 65 63 74 73 22 2c 20 2d 31 2c 20 26 70 53 74 6d  ects", -1, &pStm
147a0 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 73 71 6c  t, 0);.  if( sql
147b0 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
147c0 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
147d0 20 20 20 20 69 53 65 74 74 69 6e 67 20 3d 20 73      iSetting = s
147e0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
147f0 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 7d  t(pStmt, 0);.  }
14800 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
14810 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 73 71  ize(pStmt);.  sq
14820 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
14830 69 7a 65 6f 66 28 7a 53 74 6d 74 29 2c 20 7a 53  izeof(zStmt), zS
14840 74 6d 74 2c 0a 20 20 20 20 20 20 20 22 50 52 41  tmt,.       "PRA
14850 47 4d 41 20 72 65 76 65 72 73 65 5f 75 6e 6f 72  GMA reverse_unor
14860 64 65 72 65 64 5f 73 65 6c 65 63 74 73 28 25 64  dered_selects(%d
14870 29 22 2c 20 21 69 53 65 74 74 69 6e 67 29 3b 0a  )", !iSetting);.
14880 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64    sqlite3_exec(d
14890 62 2c 20 7a 53 74 6d 74 2c 20 30 2c 20 30 2c 20  b, zStmt, 0, 0, 
148a0 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  0);.}../*.** Thi
148b0 73 20 69 73 20 61 20 64 69 66 66 65 72 65 6e 74  s is a different
148c0 20 63 61 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e   callback routin
148d0 65 20 75 73 65 64 20 66 6f 72 20 64 75 6d 70 69  e used for dumpi
148e0 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  ng the database.
148f0 0a 2a 2a 20 45 61 63 68 20 72 6f 77 20 72 65 63  .** Each row rec
14900 65 69 76 65 64 20 62 79 20 74 68 69 73 20 63 61  eived by this ca
14910 6c 6c 62 61 63 6b 20 63 6f 6e 73 69 73 74 73 20  llback consists 
14920 6f 66 20 61 20 74 61 62 6c 65 20 6e 61 6d 65 2c  of a table name,
14930 0a 2a 2a 20 74 68 65 20 74 61 62 6c 65 20 74 79  .** the table ty
14940 70 65 20 28 22 69 6e 64 65 78 22 20 6f 72 20 22  pe ("index" or "
14950 74 61 62 6c 65 22 29 20 61 6e 64 20 53 51 4c 20  table") and SQL 
14960 74 6f 20 63 72 65 61 74 65 20 74 68 65 20 74 61  to create the ta
14970 62 6c 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ble..** This rou
14980 74 69 6e 65 20 73 68 6f 75 6c 64 20 70 72 69 6e  tine should prin
14990 74 20 74 65 78 74 20 73 75 66 66 69 63 69 65 6e  t text sufficien
149a0 74 20 74 6f 20 72 65 63 72 65 61 74 65 20 74 68  t to recreate th
149b0 65 20 74 61 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74  e table..*/.stat
149c0 69 63 20 69 6e 74 20 64 75 6d 70 5f 63 61 6c 6c  ic int dump_call
149d0 62 61 63 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c  back(void *pArg,
149e0 20 69 6e 74 20 6e 41 72 67 2c 20 63 68 61 72 20   int nArg, char 
149f0 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a  **azArg, char **
14a00 61 7a 4e 6f 74 55 73 65 64 29 7b 0a 20 20 69 6e  azNotUsed){.  in
14a10 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74 20 63 68  t rc;.  const ch
14a20 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 63 6f  ar *zTable;.  co
14a30 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b  nst char *zType;
14a40 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
14a50 53 71 6c 3b 0a 20 20 53 68 65 6c 6c 53 74 61 74  Sql;.  ShellStat
14a60 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c 53 74 61  e *p = (ShellSta
14a70 74 65 20 2a 29 70 41 72 67 3b 0a 0a 20 20 55 4e  te *)pArg;..  UN
14a80 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 61  USED_PARAMETER(a
14a90 7a 4e 6f 74 55 73 65 64 29 3b 0a 20 20 69 66 28  zNotUsed);.  if(
14aa0 20 6e 41 72 67 21 3d 33 20 7c 7c 20 61 7a 41 72   nArg!=3 || azAr
14ab0 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  g==0 ) return 0;
14ac0 0a 20 20 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72  .  zTable = azAr
14ad0 67 5b 30 5d 3b 0a 20 20 7a 54 79 70 65 20 3d 20  g[0];.  zType = 
14ae0 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 7a 53 71 6c  azArg[1];.  zSql
14af0 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 0a 20 20   = azArg[2];..  
14b00 69 66 28 20 73 74 72 63 6d 70 28 7a 54 61 62 6c  if( strcmp(zTabl
14b10 65 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65  e, "sqlite_seque
14b20 6e 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nce")==0 ){.    
14b30 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
14b40 74 2c 20 22 44 45 4c 45 54 45 20 46 52 4f 4d 20  t, "DELETE FROM 
14b50 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 3b  sqlite_sequence;
14b60 5c 6e 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  \n");.  }else if
14b70 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f  ( sqlite3_strglo
14b80 62 28 22 73 71 6c 69 74 65 5f 73 74 61 74 3f 22  b("sqlite_stat?"
14b90 2c 20 7a 54 61 62 6c 65 29 3d 3d 30 20 29 7b 0a  , zTable)==0 ){.
14ba0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
14bb0 2d 3e 6f 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20  ->out, "ANALYZE 
14bc0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e  sqlite_master;\n
14bd0 22 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ");.  }else if( 
14be0 73 74 72 6e 63 6d 70 28 7a 54 61 62 6c 65 2c 20  strncmp(zTable, 
14bf0 22 73 71 6c 69 74 65 5f 22 2c 20 37 29 3d 3d 30  "sqlite_", 7)==0
14c00 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
14c10 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74  ;.  }else if( st
14c20 72 6e 63 6d 70 28 7a 53 71 6c 2c 20 22 43 52 45  rncmp(zSql, "CRE
14c30 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c  ATE VIRTUAL TABL
14c40 45 22 2c 20 32 30 29 3d 3d 30 20 29 7b 0a 20 20  E", 20)==0 ){.  
14c50 20 20 63 68 61 72 20 2a 7a 49 6e 73 3b 0a 20 20    char *zIns;.  
14c60 20 20 69 66 28 20 21 70 2d 3e 77 72 69 74 61 62    if( !p->writab
14c70 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  leSchema ){.    
14c80 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
14c90 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 77 72 69  out, "PRAGMA wri
14ca0 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 3b  table_schema=ON;
14cb0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77  \n");.      p->w
14cc0 72 69 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20  ritableSchema = 
14cd0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 49 6e  1;.    }.    zIn
14ce0 73 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  s = sqlite3_mpri
14cf0 6e 74 66 28 0a 20 20 20 20 20 20 20 22 49 4e 53  ntf(.       "INS
14d00 45 52 54 20 49 4e 54 4f 20 73 71 6c 69 74 65 5f  ERT INTO sqlite_
14d10 6d 61 73 74 65 72 28 74 79 70 65 2c 6e 61 6d 65  master(type,name
14d20 2c 74 62 6c 5f 6e 61 6d 65 2c 72 6f 6f 74 70 61  ,tbl_name,rootpa
14d30 67 65 2c 73 71 6c 29 22 0a 20 20 20 20 20 20 20  ge,sql)".       
14d40 22 56 41 4c 55 45 53 28 27 74 61 62 6c 65 27 2c  "VALUES('table',
14d50 27 25 71 27 2c 27 25 71 27 2c 30 2c 27 25 71 27  '%q','%q',0,'%q'
14d60 29 3b 22 2c 0a 20 20 20 20 20 20 20 7a 54 61 62  );",.       zTab
14d70 6c 65 2c 20 7a 54 61 62 6c 65 2c 20 7a 53 71 6c  le, zTable, zSql
14d80 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  );.    utf8_prin
14d90 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  tf(p->out, "%s\n
14da0 22 2c 20 7a 49 6e 73 29 3b 0a 20 20 20 20 73 71  ", zIns);.    sq
14db0 6c 69 74 65 33 5f 66 72 65 65 28 7a 49 6e 73 29  lite3_free(zIns)
14dc0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
14dd0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 72 69    }else{.    pri
14de0 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 70 2d 3e  ntSchemaLine(p->
14df0 6f 75 74 2c 20 7a 53 71 6c 2c 20 22 3b 5c 6e 22  out, zSql, ";\n"
14e00 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 73 74  );.  }..  if( st
14e10 72 63 6d 70 28 7a 54 79 70 65 2c 20 22 74 61 62  rcmp(zType, "tab
14e20 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53  le")==0 ){.    S
14e30 68 65 6c 6c 54 65 78 74 20 73 53 65 6c 65 63 74  hellText sSelect
14e40 3b 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20  ;.    ShellText 
14e50 73 54 61 62 6c 65 3b 0a 20 20 20 20 63 68 61 72  sTable;.    char
14e60 20 2a 2a 61 7a 43 6f 6c 3b 0a 20 20 20 20 69 6e   **azCol;.    in
14e70 74 20 69 3b 0a 20 20 20 20 63 68 61 72 20 2a 73  t i;.    char *s
14e80 61 76 65 64 44 65 73 74 54 61 62 6c 65 3b 0a 20  avedDestTable;. 
14e90 20 20 20 69 6e 74 20 73 61 76 65 64 4d 6f 64 65     int savedMode
14ea0 3b 0a 0a 20 20 20 20 61 7a 43 6f 6c 20 3d 20 74  ;..    azCol = t
14eb0 61 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28 70  ableColumnList(p
14ec0 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69  , zTable);.    i
14ed0 66 28 20 61 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20  f( azCol==0 ){. 
14ee0 20 20 20 20 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a       p->nErr++;.
14ef0 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
14f00 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c      }..    /* Al
14f10 77 61 79 73 20 71 75 6f 74 65 20 74 68 65 20 74  ways quote the t
14f20 61 62 6c 65 20 6e 61 6d 65 2c 20 65 76 65 6e 20  able name, even 
14f30 69 66 20 69 74 20 61 70 70 65 61 72 73 20 74 6f  if it appears to
14f40 20 62 65 20 70 75 72 65 20 61 73 63 69 69 2c 0a   be pure ascii,.
14f50 20 20 20 20 2a 2a 20 69 6e 20 63 61 73 65 20 69      ** in case i
14f60 74 20 69 73 20 61 20 6b 65 79 77 6f 72 64 2e 20  t is a keyword. 
14f70 45 78 3a 20 20 49 4e 53 45 52 54 20 49 4e 54 4f  Ex:  INSERT INTO
14f80 20 22 74 61 62 6c 65 22 20 2e 2e 2e 20 2a 2f 0a   "table" ... */.
14f90 20 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 54      initText(&sT
14fa0 61 62 6c 65 29 3b 0a 20 20 20 20 61 70 70 65 6e  able);.    appen
14fb0 64 54 65 78 74 28 26 73 54 61 62 6c 65 2c 20 7a  dText(&sTable, z
14fc0 54 61 62 6c 65 2c 20 71 75 6f 74 65 43 68 61 72  Table, quoteChar
14fd0 28 7a 54 61 62 6c 65 29 29 3b 0a 20 20 20 20 2f  (zTable));.    /
14fe0 2a 20 49 66 20 70 72 65 73 65 72 76 69 6e 67 20  * If preserving 
14ff0 74 68 65 20 72 6f 77 69 64 2c 20 61 64 64 20 61  the rowid, add a
15000 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 61 66 74   column list aft
15010 65 72 20 74 68 65 20 74 61 62 6c 65 20 6e 61 6d  er the table nam
15020 65 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 6f 74 68  e..    ** In oth
15030 65 72 20 77 6f 72 64 73 3a 20 20 22 49 4e 53 45  er words:  "INSE
15040 52 54 20 49 4e 54 4f 20 74 61 62 28 72 6f 77 69  RT INTO tab(rowi
15050 64 2c 61 2c 62 2c 63 2c 2e 2e 2e 29 20 56 41 4c  d,a,b,c,...) VAL
15060 55 45 53 28 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a  UES(...)".    **
15070 20 69 6e 73 74 65 61 64 20 6f 66 20 74 68 65 20   instead of the 
15080 75 73 75 61 6c 20 22 49 4e 53 45 52 54 20 49 4e  usual "INSERT IN
15090 54 4f 20 74 61 62 20 56 41 4c 55 45 53 28 2e 2e  TO tab VALUES(..
150a0 2e 29 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  .)"..    */.    
150b0 69 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b 0a  if( azCol[0] ){.
150c0 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
150d0 28 26 73 54 61 62 6c 65 2c 20 22 28 22 2c 20 30  (&sTable, "(", 0
150e0 29 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54  );.      appendT
150f0 65 78 74 28 26 73 54 61 62 6c 65 2c 20 61 7a 43  ext(&sTable, azC
15100 6f 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20  ol[0], 0);.     
15110 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b   for(i=1; azCol[
15120 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  i]; i++){.      
15130 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 54    appendText(&sT
15140 61 62 6c 65 2c 20 22 2c 22 2c 20 30 29 3b 0a 20  able, ",", 0);. 
15150 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
15160 74 28 26 73 54 61 62 6c 65 2c 20 61 7a 43 6f 6c  t(&sTable, azCol
15170 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28 61  [i], quoteChar(a
15180 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20 20  zCol[i]));.     
15190 20 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54   }.      appendT
151a0 65 78 74 28 26 73 54 61 62 6c 65 2c 20 22 29 22  ext(&sTable, ")"
151b0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  , 0);.    }..   
151c0 20 2f 2a 20 42 75 69 6c 64 20 61 6e 20 61 70 70   /* Build an app
151d0 72 6f 70 72 69 61 74 65 20 53 45 4c 45 43 54 20  ropriate SELECT 
151e0 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
151f0 20 69 6e 69 74 54 65 78 74 28 26 73 53 65 6c 65   initText(&sSele
15200 63 74 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54  ct);.    appendT
15210 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 53  ext(&sSelect, "S
15220 45 4c 45 43 54 20 22 2c 20 30 29 3b 0a 20 20 20  ELECT ", 0);.   
15230 20 69 66 28 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b   if( azCol[0] ){
15240 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
15250 74 28 26 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f  t(&sSelect, azCo
15260 6c 5b 30 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20  l[0], 0);.      
15270 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
15280 65 63 74 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20  ect, ",", 0);.  
15290 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b    }.    for(i=1;
152a0 20 61 7a 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29 7b   azCol[i]; i++){
152b0 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
152c0 74 28 26 73 53 65 6c 65 63 74 2c 20 61 7a 43 6f  t(&sSelect, azCo
152d0 6c 5b 69 5d 2c 20 71 75 6f 74 65 43 68 61 72 28  l[i], quoteChar(
152e0 61 7a 43 6f 6c 5b 69 5d 29 29 3b 0a 20 20 20 20  azCol[i]));.    
152f0 20 20 69 66 28 20 61 7a 43 6f 6c 5b 69 2b 31 5d    if( azCol[i+1]
15300 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65   ){.        appe
15310 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
15320 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20   ",", 0);.      
15330 7d 0a 20 20 20 20 7d 0a 20 20 20 20 66 72 65 65  }.    }.    free
15340 43 6f 6c 75 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c  ColumnList(azCol
15350 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78  );.    appendTex
15360 74 28 26 73 53 65 6c 65 63 74 2c 20 22 20 46 52  t(&sSelect, " FR
15370 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 61 70  OM ", 0);.    ap
15380 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63  pendText(&sSelec
15390 74 2c 20 7a 54 61 62 6c 65 2c 20 71 75 6f 74 65  t, zTable, quote
153a0 43 68 61 72 28 7a 54 61 62 6c 65 29 29 3b 0a 0a  Char(zTable));..
153b0 20 20 20 20 73 61 76 65 64 44 65 73 74 54 61 62      savedDestTab
153c0 6c 65 20 3d 20 70 2d 3e 7a 44 65 73 74 54 61 62  le = p->zDestTab
153d0 6c 65 3b 0a 20 20 20 20 73 61 76 65 64 4d 6f 64  le;.    savedMod
153e0 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20  e = p->mode;.   
153f0 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 20 3d   p->zDestTable =
15400 20 73 54 61 62 6c 65 2e 7a 3b 0a 20 20 20 20 70   sTable.z;.    p
15410 2d 3e 6d 6f 64 65 20 3d 20 70 2d 3e 63 4d 6f 64  ->mode = p->cMod
15420 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b  e = MODE_Insert;
15430 0a 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f  .    rc = shell_
15440 65 78 65 63 28 70 2d 3e 64 62 2c 20 73 53 65 6c  exec(p->db, sSel
15450 65 63 74 2e 7a 2c 20 73 68 65 6c 6c 5f 63 61 6c  ect.z, shell_cal
15460 6c 62 61 63 6b 2c 20 70 2c 20 30 29 3b 0a 20 20  lback, p, 0);.  
15470 20 20 69 66 28 20 28 72 63 26 30 78 66 66 29 3d    if( (rc&0xff)=
15480 3d 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20  =SQLITE_CORRUPT 
15490 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
154a0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a  ntf(p->out, "/**
154b0 2a 2a 2a 2a 20 43 4f 52 52 55 50 54 49 4f 4e 20  **** CORRUPTION 
154c0 45 52 52 4f 52 20 2a 2a 2a 2a 2a 2a 2a 2f 5c 6e  ERROR *******/\n
154d0 22 29 3b 0a 20 20 20 20 20 20 74 6f 67 67 6c 65  ");.      toggle
154e0 53 65 6c 65 63 74 4f 72 64 65 72 28 70 2d 3e 64  SelectOrder(p->d
154f0 62 29 3b 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f  b);.      shell_
15500 65 78 65 63 28 70 2d 3e 64 62 2c 20 73 53 65 6c  exec(p->db, sSel
15510 65 63 74 2e 7a 2c 20 73 68 65 6c 6c 5f 63 61 6c  ect.z, shell_cal
15520 6c 62 61 63 6b 2c 20 70 2c 20 30 29 3b 0a 20 20  lback, p, 0);.  
15530 20 20 20 20 74 6f 67 67 6c 65 53 65 6c 65 63 74      toggleSelect
15540 4f 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a 20 20  Order(p->db);.  
15550 20 20 7d 0a 20 20 20 20 70 2d 3e 7a 44 65 73 74    }.    p->zDest
15560 54 61 62 6c 65 20 3d 20 73 61 76 65 64 44 65 73  Table = savedDes
15570 74 54 61 62 6c 65 3b 0a 20 20 20 20 70 2d 3e 6d  tTable;.    p->m
15580 6f 64 65 20 3d 20 73 61 76 65 64 4d 6f 64 65 3b  ode = savedMode;
15590 0a 20 20 20 20 66 72 65 65 54 65 78 74 28 26 73  .    freeText(&s
155a0 54 61 62 6c 65 29 3b 0a 20 20 20 20 66 72 65 65  Table);.    free
155b0 54 65 78 74 28 26 73 53 65 6c 65 63 74 29 3b 0a  Text(&sSelect);.
155c0 20 20 20 20 69 66 28 20 72 63 20 29 20 70 2d 3e      if( rc ) p->
155d0 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65  nErr++;.  }.  re
155e0 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
155f0 20 52 75 6e 20 7a 51 75 65 72 79 2e 20 20 55 73   Run zQuery.  Us
15600 65 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 28  e dump_callback(
15610 29 20 61 73 20 74 68 65 20 63 61 6c 6c 62 61 63  ) as the callbac
15620 6b 20 72 6f 75 74 69 6e 65 20 73 6f 20 74 68 61  k routine so tha
15630 74 0a 2a 2a 20 74 68 65 20 63 6f 6e 74 65 6e 74  t.** the content
15640 73 20 6f 66 20 74 68 65 20 71 75 65 72 79 20 61  s of the query a
15650 72 65 20 6f 75 74 70 75 74 20 61 73 20 53 51 4c  re output as SQL
15660 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a   statements..**.
15670 2a 2a 20 49 66 20 77 65 20 67 65 74 20 61 20 53  ** If we get a S
15680 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 65 72  QLITE_CORRUPT er
15690 72 6f 72 2c 20 72 65 72 75 6e 20 74 68 65 20 71  ror, rerun the q
156a0 75 65 72 79 20 61 66 74 65 72 20 61 70 70 65 6e  uery after appen
156b0 64 69 6e 67 0a 2a 2a 20 22 4f 52 44 45 52 20 42  ding.** "ORDER B
156c0 59 20 72 6f 77 69 64 20 44 45 53 43 22 20 74 6f  Y rowid DESC" to
156d0 20 74 68 65 20 65 6e 64 2e 0a 2a 2f 0a 73 74 61   the end..*/.sta
156e0 74 69 63 20 69 6e 74 20 72 75 6e 5f 73 63 68 65  tic int run_sche
156f0 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28 0a 20  ma_dump_query(. 
15700 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a   ShellState *p,.
15710 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 51    const char *zQ
15720 75 65 72 79 0a 29 7b 0a 20 20 69 6e 74 20 72 63  uery.){.  int rc
15730 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d  ;.  char *zErr =
15740 20 30 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74   0;.  rc = sqlit
15750 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a  e3_exec(p->db, z
15760 51 75 65 72 79 2c 20 64 75 6d 70 5f 63 61 6c 6c  Query, dump_call
15770 62 61 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b  back, p, &zErr);
15780 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
15790 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20 20 20  E_CORRUPT ){.   
157a0 20 63 68 61 72 20 2a 7a 51 32 3b 0a 20 20 20 20   char *zQ2;.    
157b0 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e  int len = strlen
157c0 33 30 28 7a 51 75 65 72 79 29 3b 0a 20 20 20 20  30(zQuery);.    
157d0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
157e0 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52 52  t, "/****** CORR
157f0 55 50 54 49 4f 4e 20 45 52 52 4f 52 20 2a 2a 2a  UPTION ERROR ***
15800 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20 69  ****/\n");.    i
15810 66 28 20 7a 45 72 72 20 29 7b 0a 20 20 20 20 20  f( zErr ){.     
15820 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
15830 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 25 73  out, "/****** %s
15840 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 7a 45 72   ******/\n", zEr
15850 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
15860 33 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20  3_free(zErr);.  
15870 20 20 20 20 7a 45 72 72 20 3d 20 30 3b 0a 20 20      zErr = 0;.  
15880 20 20 7d 0a 20 20 20 20 7a 51 32 20 3d 20 6d 61    }.    zQ2 = ma
15890 6c 6c 6f 63 28 20 6c 65 6e 2b 31 30 30 20 29 3b  lloc( len+100 );
158a0 0a 20 20 20 20 69 66 28 20 7a 51 32 3d 3d 30 20  .    if( zQ2==0 
158b0 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20 20  ) return rc;.   
158c0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
158d0 66 28 6c 65 6e 2b 31 30 30 2c 20 7a 51 32 2c 20  f(len+100, zQ2, 
158e0 22 25 73 20 4f 52 44 45 52 20 42 59 20 72 6f 77  "%s ORDER BY row
158f0 69 64 20 44 45 53 43 22 2c 20 7a 51 75 65 72 79  id DESC", zQuery
15900 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
15910 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
15920 7a 51 32 2c 20 64 75 6d 70 5f 63 61 6c 6c 62 61  zQ2, dump_callba
15930 63 6b 2c 20 70 2c 20 26 7a 45 72 72 29 3b 0a 20  ck, p, &zErr);. 
15940 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
15950 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
15960 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20  ->out, "/****** 
15970 45 52 52 4f 52 3a 20 25 73 20 2a 2a 2a 2a 2a 2a  ERROR: %s ******
15980 2f 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a 20 20 20  /\n", zErr);.   
15990 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63   }else{.      rc
159a0 20 3d 20 53 51 4c 49 54 45 5f 43 4f 52 52 55 50   = SQLITE_CORRUP
159b0 54 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  T;.    }.    sql
159c0 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 29 3b  ite3_free(zErr);
159d0 0a 20 20 20 20 66 72 65 65 28 7a 51 32 29 3b 0a  .    free(zQ2);.
159e0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3b    }.  return rc;
159f0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 65 78 74 20 6f  .}../*.** Text o
15a00 66 20 61 20 68 65 6c 70 20 6d 65 73 73 61 67 65  f a help message
15a10 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
15a20 7a 48 65 6c 70 5b 5d 20 3d 0a 23 69 66 6e 64 65  zHelp[] =.#ifnde
15a30 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
15a40 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 22 2e  THORIZATION.  ".
15a50 61 75 74 68 20 4f 4e 7c 4f 46 46 20 20 20 20 20  auth ON|OFF     
15a60 20 20 20 20 20 20 53 68 6f 77 20 61 75 74 68 6f        Show autho
15a70 72 69 7a 65 72 20 63 61 6c 6c 62 61 63 6b 73 5c  rizer callbacks\
15a80 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e 62 61  n".#endif.  ".ba
15a90 63 6b 75 70 20 3f 44 42 3f 20 46 49 4c 45 20 20  ckup ?DB? FILE  
15aa0 20 20 20 20 42 61 63 6b 75 70 20 44 42 20 28 64      Backup DB (d
15ab0 65 66 61 75 6c 74 20 5c 22 6d 61 69 6e 5c 22 29  efault \"main\")
15ac0 20 74 6f 20 46 49 4c 45 5c 6e 22 0a 20 20 22 2e   to FILE\n".  ".
15ad0 62 61 69 6c 20 6f 6e 7c 6f 66 66 20 20 20 20 20  bail on|off     
15ae0 20 20 20 20 20 20 53 74 6f 70 20 61 66 74 65 72        Stop after
15af0 20 68 69 74 74 69 6e 67 20 61 6e 20 65 72 72 6f   hitting an erro
15b00 72 2e 20 20 44 65 66 61 75 6c 74 20 4f 46 46 5c  r.  Default OFF\
15b10 6e 22 0a 20 20 22 2e 62 69 6e 61 72 79 20 6f 6e  n".  ".binary on
15b20 7c 6f 66 66 20 20 20 20 20 20 20 20 20 54 75 72  |off         Tur
15b30 6e 20 62 69 6e 61 72 79 20 6f 75 74 70 75 74 20  n binary output 
15b40 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 44 65 66 61  on or off.  Defa
15b50 75 6c 74 20 4f 46 46 5c 6e 22 0a 20 20 22 2e 63  ult OFF\n".  ".c
15b60 64 20 44 49 52 45 43 54 4f 52 59 20 20 20 20 20  d DIRECTORY     
15b70 20 20 20 20 20 43 68 61 6e 67 65 20 74 68 65 20       Change the 
15b80 77 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72  working director
15b90 79 20 74 6f 20 44 49 52 45 43 54 4f 52 59 5c 6e  y to DIRECTORY\n
15ba0 22 0a 20 20 22 2e 63 68 61 6e 67 65 73 20 6f 6e  ".  ".changes on
15bb0 7c 6f 66 66 20 20 20 20 20 20 20 20 53 68 6f 77  |off        Show
15bc0 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73 20   number of rows 
15bd0 63 68 61 6e 67 65 64 20 62 79 20 53 51 4c 5c 6e  changed by SQL\n
15be0 22 0a 20 20 22 2e 63 68 65 63 6b 20 47 4c 4f 42  ".  ".check GLOB
15bf0 20 20 20 20 20 20 20 20 20 20 20 20 46 61 69 6c              Fail
15c00 20 69 66 20 6f 75 74 70 75 74 20 73 69 6e 63 65   if output since
15c10 20 2e 74 65 73 74 63 61 73 65 20 64 6f 65 73 20   .testcase does 
15c20 6e 6f 74 20 6d 61 74 63 68 5c 6e 22 0a 20 20 22  not match\n".  "
15c30 2e 63 6c 6f 6e 65 20 4e 45 57 44 42 20 20 20 20  .clone NEWDB    
15c40 20 20 20 20 20 20 20 43 6c 6f 6e 65 20 64 61 74         Clone dat
15c50 61 20 69 6e 74 6f 20 4e 45 57 44 42 20 66 72 6f  a into NEWDB fro
15c60 6d 20 74 68 65 20 65 78 69 73 74 69 6e 67 20 64  m the existing d
15c70 61 74 61 62 61 73 65 5c 6e 22 0a 20 20 22 2e 64  atabase\n".  ".d
15c80 61 74 61 62 61 73 65 73 20 20 20 20 20 20 20 20  atabases        
15c90 20 20 20 20 20 4c 69 73 74 20 6e 61 6d 65 73 20       List names 
15ca0 61 6e 64 20 66 69 6c 65 73 20 6f 66 20 61 74 74  and files of att
15cb0 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 5c  ached databases\
15cc0 6e 22 0a 20 20 22 2e 64 62 69 6e 66 6f 20 3f 44  n".  ".dbinfo ?D
15cd0 42 3f 20 20 20 20 20 20 20 20 20 20 20 53 68 6f  B?           Sho
15ce0 77 20 73 74 61 74 75 73 20 69 6e 66 6f 72 6d 61  w status informa
15cf0 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 64  tion about the d
15d00 61 74 61 62 61 73 65 5c 6e 22 0a 20 20 22 2e 64  atabase\n".  ".d
15d10 75 6d 70 20 3f 54 41 42 4c 45 3f 20 2e 2e 2e 20  ump ?TABLE? ... 
15d20 20 20 20 20 20 44 75 6d 70 20 74 68 65 20 64 61       Dump the da
15d30 74 61 62 61 73 65 20 69 6e 20 61 6e 20 53 51 4c  tabase in an SQL
15d40 20 74 65 78 74 20 66 6f 72 6d 61 74 5c 6e 22 0a   text format\n".
15d50 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
15d60 20 20 20 20 20 20 20 20 20 20 20 20 49 66 20 54              If T
15d70 41 42 4c 45 20 73 70 65 63 69 66 69 65 64 2c 20  ABLE specified, 
15d80 6f 6e 6c 79 20 64 75 6d 70 20 74 61 62 6c 65 73  only dump tables
15d90 20 6d 61 74 63 68 69 6e 67 5c 6e 22 0a 20 20 22   matching\n".  "
15da0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15db0 20 20 20 20 20 20 20 20 20 4c 49 4b 45 20 70 61           LIKE pa
15dc0 74 74 65 72 6e 20 54 41 42 4c 45 2e 5c 6e 22 0a  ttern TABLE.\n".
15dd0 20 20 22 2e 65 63 68 6f 20 6f 6e 7c 6f 66 66 20    ".echo on|off 
15de0 20 20 20 20 20 20 20 20 20 20 54 75 72 6e 20 63            Turn c
15df0 6f 6d 6d 61 6e 64 20 65 63 68 6f 20 6f 6e 20 6f  ommand echo on o
15e00 72 20 6f 66 66 5c 6e 22 0a 20 20 22 2e 65 71 70  r off\n".  ".eqp
15e10 20 6f 6e 7c 6f 66 66 7c 66 75 6c 6c 20 20 20 20   on|off|full    
15e20 20 20 20 45 6e 61 62 6c 65 20 6f 72 20 64 69 73     Enable or dis
15e30 61 62 6c 65 20 61 75 74 6f 6d 61 74 69 63 20 45  able automatic E
15e40 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41  XPLAIN QUERY PLA
15e50 4e 5c 6e 22 0a 20 20 22 2e 65 78 69 74 20 20 20  N\n".  ".exit   
15e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45                 E
15e70 78 69 74 20 74 68 69 73 20 70 72 6f 67 72 61 6d  xit this program
15e80 5c 6e 22 0a 20 20 22 2e 65 78 70 65 72 74 20 20  \n".  ".expert  
15e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 58                EX
15ea0 50 45 52 49 4d 45 4e 54 41 4c 2e 20 53 75 67 67  PERIMENTAL. Sugg
15eb0 65 73 74 20 69 6e 64 65 78 65 73 20 66 6f 72 20  est indexes for 
15ec0 73 70 65 63 69 66 69 65 64 20 71 75 65 72 69 65  specified querie
15ed0 73 5c 6e 22 0a 2f 2a 20 42 65 63 61 75 73 65 20  s\n"./* Because 
15ee0 65 78 70 6c 61 69 6e 20 6d 6f 64 65 20 63 6f 6d  explain mode com
15ef0 65 73 20 6f 6e 20 61 75 74 6f 6d 61 74 69 63 61  es on automatica
15f00 6c 6c 79 20 6e 6f 77 2c 20 74 68 65 20 22 2e 65  lly now, the ".e
15f10 78 70 6c 61 69 6e 22 20 6d 6f 64 65 0a 2a 2a 20  xplain" mode.** 
15f20 69 73 20 72 65 6d 6f 76 65 64 20 66 72 6f 6d 20  is removed from 
15f30 74 68 65 20 68 65 6c 70 20 73 63 72 65 65 6e 2e  the help screen.
15f40 20 20 49 74 20 69 73 20 73 74 69 6c 6c 20 73 75    It is still su
15f50 70 70 6f 72 74 65 64 20 66 6f 72 20 6c 65 67 61  pported for lega
15f60 63 79 2c 20 68 6f 77 65 76 65 72 20 2a 2f 0a 2f  cy, however */./
15f70 2a 22 2e 65 78 70 6c 61 69 6e 20 3f 6f 6e 7c 6f  *".explain ?on|o
15f80 66 66 7c 61 75 74 6f 3f 20 54 75 72 6e 20 45 58  ff|auto? Turn EX
15f90 50 4c 41 49 4e 20 6f 75 74 70 75 74 20 6d 6f 64  PLAIN output mod
15fa0 65 20 6f 6e 20 6f 72 20 6f 66 66 20 6f 72 20 74  e on or off or t
15fb0 6f 20 61 75 74 6f 6d 61 74 69 63 5c 6e 22 2a 2f  o automatic\n"*/
15fc0 0a 20 20 22 2e 66 75 6c 6c 73 63 68 65 6d 61 20  .  ".fullschema 
15fd0 3f 2d 2d 69 6e 64 65 6e 74 3f 20 53 68 6f 77 20  ?--indent? Show 
15fe0 73 63 68 65 6d 61 20 61 6e 64 20 74 68 65 20 63  schema and the c
15ff0 6f 6e 74 65 6e 74 20 6f 66 20 73 71 6c 69 74 65  ontent of sqlite
16000 5f 73 74 61 74 20 74 61 62 6c 65 73 5c 6e 22 0a  _stat tables\n".
16010 20 20 22 2e 68 65 61 64 65 72 73 20 6f 6e 7c 6f    ".headers on|o
16020 66 66 20 20 20 20 20 20 20 20 54 75 72 6e 20 64  ff        Turn d
16030 69 73 70 6c 61 79 20 6f 66 20 68 65 61 64 65 72  isplay of header
16040 73 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22 0a 20  s on or off\n". 
16050 20 22 2e 68 65 6c 70 20 20 20 20 20 20 20 20 20   ".help         
16060 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 74 68           Show th
16070 69 73 20 6d 65 73 73 61 67 65 5c 6e 22 0a 20 20  is message\n".  
16080 22 2e 69 6d 70 6f 72 74 20 46 49 4c 45 20 54 41  ".import FILE TA
16090 42 4c 45 20 20 20 20 20 49 6d 70 6f 72 74 20 64  BLE     Import d
160a0 61 74 61 20 66 72 6f 6d 20 46 49 4c 45 20 69 6e  ata from FILE in
160b0 74 6f 20 54 41 42 4c 45 5c 6e 22 0a 23 69 66 6e  to TABLE\n".#ifn
160c0 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
160d0 54 45 53 54 5f 43 4f 4e 54 52 4f 4c 0a 20 20 22  TEST_CONTROL.  "
160e0 2e 69 6d 70 6f 73 74 65 72 20 49 4e 44 45 58 20  .imposter INDEX 
160f0 54 41 42 4c 45 20 20 43 72 65 61 74 65 20 69 6d  TABLE  Create im
16100 70 6f 73 74 65 72 20 74 61 62 6c 65 20 54 41 42  poster table TAB
16110 4c 45 20 6f 6e 20 69 6e 64 65 78 20 49 4e 44 45  LE on index INDE
16120 58 5c 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e  X\n".#endif.  ".
16130 69 6e 64 65 78 65 73 20 3f 54 41 42 4c 45 3f 20  indexes ?TABLE? 
16140 20 20 20 20 20 20 53 68 6f 77 20 6e 61 6d 65 73        Show names
16150 20 6f 66 20 61 6c 6c 20 69 6e 64 65 78 65 73 5c   of all indexes\
16160 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
16170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49                 I
16180 66 20 54 41 42 4c 45 20 73 70 65 63 69 66 69 65  f TABLE specifie
16190 64 2c 20 6f 6e 6c 79 20 73 68 6f 77 20 69 6e 64  d, only show ind
161a0 65 78 65 73 20 66 6f 72 20 74 61 62 6c 65 73 5c  exes for tables\
161b0 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
161c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
161d0 61 74 63 68 69 6e 67 20 4c 49 4b 45 20 70 61 74  atching LIKE pat
161e0 74 65 72 6e 20 54 41 42 4c 45 2e 5c 6e 22 0a 23  tern TABLE.\n".#
161f0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
16200 42 4c 45 5f 49 4f 54 52 41 43 45 0a 20 20 22 2e  BLE_IOTRACE.  ".
16210 69 6f 74 72 61 63 65 20 46 49 4c 45 20 20 20 20  iotrace FILE    
16220 20 20 20 20 20 20 45 6e 61 62 6c 65 20 49 2f 4f        Enable I/O
16230 20 64 69 61 67 6e 6f 73 74 69 63 20 6c 6f 67 67   diagnostic logg
16240 69 6e 67 20 74 6f 20 46 49 4c 45 5c 6e 22 0a 23  ing to FILE\n".#
16250 65 6e 64 69 66 0a 20 20 22 2e 6c 69 6d 69 74 20  endif.  ".limit 
16260 3f 4c 49 4d 49 54 3f 20 3f 56 41 4c 3f 20 20 20  ?LIMIT? ?VAL?   
16270 44 69 73 70 6c 61 79 20 6f 72 20 63 68 61 6e 67  Display or chang
16280 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 61  e the value of a
16290 6e 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5c 6e  n SQLITE_LIMIT\n
162a0 22 0a 20 20 22 2e 6c 69 6e 74 20 4f 50 54 49 4f  ".  ".lint OPTIO
162b0 4e 53 20 20 20 20 20 20 20 20 20 20 52 65 70 6f  NS          Repo
162c0 72 74 20 70 6f 74 65 6e 74 69 61 6c 20 73 63 68  rt potential sch
162d0 65 6d 61 20 69 73 73 75 65 73 2e 20 4f 70 74 69  ema issues. Opti
162e0 6f 6e 73 3a 5c 6e 22 0a 20 20 22 20 20 20 20 20  ons:\n".  "     
162f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16300 20 20 20 20 66 6b 65 79 2d 69 6e 64 65 78 65 73      fkey-indexes
16310 20 20 20 20 20 46 69 6e 64 20 6d 69 73 73 69 6e       Find missin
16320 67 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 69 6e  g foreign key in
16330 64 65 78 65 73 5c 6e 22 0a 23 69 66 6e 64 65 66  dexes\n".#ifndef
16340 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
16350 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 22 2e  D_EXTENSION.  ".
16360 6c 6f 61 64 20 46 49 4c 45 20 3f 45 4e 54 52 59  load FILE ?ENTRY
16370 3f 20 20 20 20 20 4c 6f 61 64 20 61 6e 20 65 78  ?     Load an ex
16380 74 65 6e 73 69 6f 6e 20 6c 69 62 72 61 72 79 5c  tension library\
16390 6e 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e 6c 6f  n".#endif.  ".lo
163a0 67 20 46 49 4c 45 7c 6f 66 66 20 20 20 20 20 20  g FILE|off      
163b0 20 20 20 20 54 75 72 6e 20 6c 6f 67 67 69 6e 67      Turn logging
163c0 20 6f 6e 20 6f 72 20 6f 66 66 2e 20 20 46 49 4c   on or off.  FIL
163d0 45 20 63 61 6e 20 62 65 20 73 74 64 65 72 72 2f  E can be stderr/
163e0 73 74 64 6f 75 74 5c 6e 22 0a 20 20 22 2e 6d 6f  stdout\n".  ".mo
163f0 64 65 20 4d 4f 44 45 20 3f 54 41 42 4c 45 3f 20  de MODE ?TABLE? 
16400 20 20 20 20 53 65 74 20 6f 75 74 70 75 74 20 6d      Set output m
16410 6f 64 65 20 77 68 65 72 65 20 4d 4f 44 45 20 69  ode where MODE i
16420 73 20 6f 6e 65 20 6f 66 3a 5c 6e 22 0a 20 20 22  s one of:\n".  "
16430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16440 20 20 20 20 20 20 20 20 20 61 73 63 69 69 20 20           ascii  
16450 20 20 43 6f 6c 75 6d 6e 73 2f 72 6f 77 73 20 64    Columns/rows d
16460 65 6c 69 6d 69 74 65 64 20 62 79 20 30 78 31 46  elimited by 0x1F
16470 20 61 6e 64 20 30 78 31 45 5c 6e 22 0a 20 20 22   and 0x1E\n".  "
16480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16490 20 20 20 20 20 20 20 20 20 63 73 76 20 20 20 20           csv    
164a0 20 20 43 6f 6d 6d 61 2d 73 65 70 61 72 61 74 65    Comma-separate
164b0 64 20 76 61 6c 75 65 73 5c 6e 22 0a 20 20 22 20  d values\n".  " 
164c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164d0 20 20 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 20          column  
164e0 20 4c 65 66 74 2d 61 6c 69 67 6e 65 64 20 63 6f   Left-aligned co
164f0 6c 75 6d 6e 73 2e 20 20 28 53 65 65 20 2e 77 69  lumns.  (See .wi
16500 64 74 68 29 5c 6e 22 0a 20 20 22 20 20 20 20 20  dth)\n".  "     
16510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16520 20 20 20 20 68 74 6d 6c 20 20 20 20 20 48 54 4d      html     HTM
16530 4c 20 3c 74 61 62 6c 65 3e 20 63 6f 64 65 5c 6e  L <table> code\n
16540 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
16550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
16560 73 65 72 74 20 20 20 53 51 4c 20 69 6e 73 65 72  sert   SQL inser
16570 74 20 73 74 61 74 65 6d 65 6e 74 73 20 66 6f 72  t statements for
16580 20 54 41 42 4c 45 5c 6e 22 0a 20 20 22 20 20 20   TABLE\n".  "   
16590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165a0 20 20 20 20 20 20 6c 69 6e 65 20 20 20 20 20 4f        line     O
165b0 6e 65 20 76 61 6c 75 65 20 70 65 72 20 6c 69 6e  ne value per lin
165c0 65 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  e\n".  "        
165d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165e0 20 6c 69 73 74 20 20 20 20 20 56 61 6c 75 65 73   list     Values
165f0 20 64 65 6c 69 6d 69 74 65 64 20 62 79 20 5c 22   delimited by \"
16600 7c 5c 22 5c 6e 22 0a 20 20 22 20 20 20 20 20 20  |\"\n".  "      
16610 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16620 20 20 20 71 75 6f 74 65 20 20 20 20 45 73 63 61     quote    Esca
16630 70 65 20 61 6e 73 77 65 72 73 20 61 73 20 66 6f  pe answers as fo
16640 72 20 53 51 4c 5c 6e 22 0a 20 20 22 20 20 20 20  r SQL\n".  "    
16650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16660 20 20 20 20 20 74 61 62 73 20 20 20 20 20 54 61       tabs     Ta
16670 62 2d 73 65 70 61 72 61 74 65 64 20 76 61 6c 75  b-separated valu
16680 65 73 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  es\n".  "       
16690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
166a0 20 20 74 63 6c 20 20 20 20 20 20 54 43 4c 20 6c    tcl      TCL l
166b0 69 73 74 20 65 6c 65 6d 65 6e 74 73 5c 6e 22 0a  ist elements\n".
166c0 20 20 22 2e 6e 75 6c 6c 76 61 6c 75 65 20 53 54    ".nullvalue ST
166d0 52 49 4e 47 20 20 20 20 20 20 55 73 65 20 53 54  RING      Use ST
166e0 52 49 4e 47 20 69 6e 20 70 6c 61 63 65 20 6f 66  RING in place of
166f0 20 4e 55 4c 4c 20 76 61 6c 75 65 73 5c 6e 22 0a   NULL values\n".
16700 20 20 22 2e 6f 6e 63 65 20 46 49 4c 45 4e 41 4d    ".once FILENAM
16710 45 20 20 20 20 20 20 20 20 20 4f 75 74 70 75 74  E         Output
16720 20 66 6f 72 20 74 68 65 20 6e 65 78 74 20 53 51   for the next SQ
16730 4c 20 63 6f 6d 6d 61 6e 64 20 6f 6e 6c 79 20 74  L command only t
16740 6f 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 0a 20 20  o FILENAME\n".  
16750 22 2e 6f 70 65 6e 20 3f 4f 50 54 49 4f 4e 53 3f  ".open ?OPTIONS?
16760 20 3f 46 49 4c 45 3f 20 43 6c 6f 73 65 20 65 78   ?FILE? Close ex
16770 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 20  isting database 
16780 61 6e 64 20 72 65 6f 70 65 6e 20 46 49 4c 45 5c  and reopen FILE\
16790 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
167a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 54                 T
167b0 68 65 20 2d 2d 6e 65 77 20 6f 70 74 69 6f 6e 20  he --new option 
167c0 73 74 61 72 74 73 20 77 69 74 68 20 61 6e 20 65  starts with an e
167d0 6d 70 74 79 20 66 69 6c 65 5c 6e 22 0a 20 20 22  mpty file\n".  "
167e0 2e 6f 75 74 70 75 74 20 3f 46 49 4c 45 4e 41 4d  .output ?FILENAM
167f0 45 3f 20 20 20 20 20 53 65 6e 64 20 6f 75 74 70  E?     Send outp
16800 75 74 20 74 6f 20 46 49 4c 45 4e 41 4d 45 20 6f  ut to FILENAME o
16810 72 20 73 74 64 6f 75 74 5c 6e 22 0a 20 20 22 2e  r stdout\n".  ".
16820 70 72 69 6e 74 20 53 54 52 49 4e 47 2e 2e 2e 20  print STRING... 
16830 20 20 20 20 20 20 50 72 69 6e 74 20 6c 69 74 65        Print lite
16840 72 61 6c 20 53 54 52 49 4e 47 5c 6e 22 0a 20 20  ral STRING\n".  
16850 22 2e 70 72 6f 6d 70 74 20 4d 41 49 4e 20 43 4f  ".prompt MAIN CO
16860 4e 54 49 4e 55 45 20 20 52 65 70 6c 61 63 65 20  NTINUE  Replace 
16870 74 68 65 20 73 74 61 6e 64 61 72 64 20 70 72 6f  the standard pro
16880 6d 70 74 73 5c 6e 22 0a 20 20 22 2e 71 75 69 74  mpts\n".  ".quit
16890 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
168a0 20 20 45 78 69 74 20 74 68 69 73 20 70 72 6f 67    Exit this prog
168b0 72 61 6d 5c 6e 22 0a 20 20 22 2e 72 65 61 64 20  ram\n".  ".read 
168c0 46 49 4c 45 4e 41 4d 45 20 20 20 20 20 20 20 20  FILENAME        
168d0 20 45 78 65 63 75 74 65 20 53 51 4c 20 69 6e 20   Execute SQL in 
168e0 46 49 4c 45 4e 41 4d 45 5c 6e 22 0a 20 20 22 2e  FILENAME\n".  ".
168f0 72 65 73 74 6f 72 65 20 3f 44 42 3f 20 46 49 4c  restore ?DB? FIL
16900 45 20 20 20 20 20 52 65 73 74 6f 72 65 20 63 6f  E     Restore co
16910 6e 74 65 6e 74 20 6f 66 20 44 42 20 28 64 65 66  ntent of DB (def
16920 61 75 6c 74 20 5c 22 6d 61 69 6e 5c 22 29 20 66  ault \"main\") f
16930 72 6f 6d 20 46 49 4c 45 5c 6e 22 0a 20 20 22 2e  rom FILE\n".  ".
16940 73 61 76 65 20 46 49 4c 45 20 20 20 20 20 20 20  save FILE       
16950 20 20 20 20 20 20 57 72 69 74 65 20 69 6e 2d 6d        Write in-m
16960 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65 20 69  emory database i
16970 6e 74 6f 20 46 49 4c 45 5c 6e 22 0a 20 20 22 2e  nto FILE\n".  ".
16980 73 63 61 6e 73 74 61 74 73 20 6f 6e 7c 6f 66 66  scanstats on|off
16990 20 20 20 20 20 20 54 75 72 6e 20 73 71 6c 69 74        Turn sqlit
169a0 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61 74  e3_stmt_scanstat
169b0 75 73 28 29 20 6d 65 74 72 69 63 73 20 6f 6e 20  us() metrics on 
169c0 6f 72 20 6f 66 66 5c 6e 22 0a 20 20 22 2e 73 63  or off\n".  ".sc
169d0 68 65 6d 61 20 3f 50 41 54 54 45 52 4e 3f 20 20  hema ?PATTERN?  
169e0 20 20 20 20 53 68 6f 77 20 74 68 65 20 43 52 45      Show the CRE
169f0 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 6d  ATE statements m
16a00 61 74 63 68 69 6e 67 20 50 41 54 54 45 52 4e 5c  atching PATTERN\
16a10 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
16a20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a30 41 64 64 20 2d 2d 69 6e 64 65 6e 74 20 66 6f 72  Add --indent for
16a40 20 70 72 65 74 74 79 2d 70 72 69 6e 74 69 6e 67   pretty-printing
16a50 5c 6e 22 0a 20 20 22 2e 73 65 6c 66 74 65 73 74  \n".  ".selftest
16a60 20 3f 2d 2d 69 6e 69 74 3f 20 20 20 20 20 52 75   ?--init?     Ru
16a70 6e 20 74 65 73 74 73 20 64 65 66 69 6e 65 64 20  n tests defined 
16a80 69 6e 20 74 68 65 20 53 45 4c 46 54 45 53 54 20  in the SELFTEST 
16a90 74 61 62 6c 65 5c 6e 22 0a 20 20 22 2e 73 65 70  table\n".  ".sep
16aa0 61 72 61 74 6f 72 20 43 4f 4c 20 3f 52 4f 57 3f  arator COL ?ROW?
16ab0 20 20 20 43 68 61 6e 67 65 20 74 68 65 20 63 6f     Change the co
16ac0 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 20 61  lumn separator a
16ad0 6e 64 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 74 68  nd optionally th
16ae0 65 20 72 6f 77 5c 6e 22 0a 20 20 22 20 20 20 20  e row\n".  "    
16af0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b00 20 20 20 20 20 73 65 70 61 72 61 74 6f 72 20 66       separator f
16b10 6f 72 20 62 6f 74 68 20 74 68 65 20 6f 75 74 70  or both the outp
16b20 75 74 20 6d 6f 64 65 20 61 6e 64 20 2e 69 6d 70  ut mode and .imp
16b30 6f 72 74 5c 6e 22 0a 23 69 66 20 64 65 66 69 6e  ort\n".#if defin
16b40 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
16b50 5f 53 45 53 53 49 4f 4e 29 0a 20 20 22 2e 73 65  _SESSION).  ".se
16b60 73 73 69 6f 6e 20 43 4d 44 20 2e 2e 2e 20 20 20  ssion CMD ...   
16b70 20 20 20 20 43 72 65 61 74 65 20 6f 72 20 63 6f      Create or co
16b80 6e 74 72 6f 6c 20 73 65 73 73 69 6f 6e 73 5c 6e  ntrol sessions\n
16b90 22 0a 23 65 6e 64 69 66 0a 20 20 22 2e 73 68 61  ".#endif.  ".sha
16ba0 33 73 75 6d 20 3f 4f 50 54 49 4f 4e 53 2e 2e 2e  3sum ?OPTIONS...
16bb0 3f 20 20 43 6f 6d 70 75 74 65 20 61 20 53 48 41  ?  Compute a SHA
16bc0 33 20 68 61 73 68 20 6f 66 20 64 61 74 61 62 61  3 hash of databa
16bd0 73 65 20 63 6f 6e 74 65 6e 74 5c 6e 22 0a 20 20  se content\n".  
16be0 22 2e 73 68 65 6c 6c 20 43 4d 44 20 41 52 47 53  ".shell CMD ARGS
16bf0 2e 2e 2e 20 20 20 20 20 52 75 6e 20 43 4d 44 20  ...     Run CMD 
16c00 41 52 47 53 2e 2e 2e 20 69 6e 20 61 20 73 79 73  ARGS... in a sys
16c10 74 65 6d 20 73 68 65 6c 6c 5c 6e 22 0a 20 20 22  tem shell\n".  "
16c20 2e 73 68 6f 77 20 20 20 20 20 20 20 20 20 20 20  .show           
16c30 20 20 20 20 20 20 20 53 68 6f 77 20 74 68 65 20         Show the 
16c40 63 75 72 72 65 6e 74 20 76 61 6c 75 65 73 20 66  current values f
16c50 6f 72 20 76 61 72 69 6f 75 73 20 73 65 74 74 69  or various setti
16c60 6e 67 73 5c 6e 22 0a 20 20 22 2e 73 74 61 74 73  ngs\n".  ".stats
16c70 20 3f 6f 6e 7c 6f 66 66 3f 20 20 20 20 20 20 20   ?on|off?       
16c80 20 53 68 6f 77 20 73 74 61 74 73 20 6f 72 20 74   Show stats or t
16c90 75 72 6e 20 73 74 61 74 73 20 6f 6e 20 6f 72 20  urn stats on or 
16ca0 6f 66 66 5c 6e 22 0a 20 20 22 2e 73 79 73 74 65  off\n".  ".syste
16cb0 6d 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20 20 20  m CMD ARGS...   
16cc0 20 52 75 6e 20 43 4d 44 20 41 52 47 53 2e 2e 2e   Run CMD ARGS...
16cd0 20 69 6e 20 61 20 73 79 73 74 65 6d 20 73 68 65   in a system she
16ce0 6c 6c 5c 6e 22 0a 20 20 22 2e 74 61 62 6c 65 73  ll\n".  ".tables
16cf0 20 3f 54 41 42 4c 45 3f 20 20 20 20 20 20 20 20   ?TABLE?        
16d00 4c 69 73 74 20 6e 61 6d 65 73 20 6f 66 20 74 61  List names of ta
16d10 62 6c 65 73 5c 6e 22 0a 20 20 22 20 20 20 20 20  bles\n".  "     
16d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d30 20 20 20 20 49 66 20 54 41 42 4c 45 20 73 70 65      If TABLE spe
16d40 63 69 66 69 65 64 2c 20 6f 6e 6c 79 20 6c 69 73  cified, only lis
16d50 74 20 74 61 62 6c 65 73 20 6d 61 74 63 68 69 6e  t tables matchin
16d60 67 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  g\n".  "        
16d70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16d80 20 4c 49 4b 45 20 70 61 74 74 65 72 6e 20 54 41   LIKE pattern TA
16d90 42 4c 45 2e 5c 6e 22 0a 20 20 22 2e 74 65 73 74  BLE.\n".  ".test
16da0 63 61 73 65 20 4e 41 4d 45 20 20 20 20 20 20 20  case NAME       
16db0 20 20 42 65 67 69 6e 20 72 65 64 69 72 65 63 74    Begin redirect
16dc0 69 6e 67 20 6f 75 74 70 75 74 20 74 6f 20 27 74  ing output to 't
16dd0 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 27  estcase-out.txt'
16de0 5c 6e 22 0a 20 20 22 2e 74 69 6d 65 6f 75 74 20  \n".  ".timeout 
16df0 4d 53 20 20 20 20 20 20 20 20 20 20 20 20 54 72  MS            Tr
16e00 79 20 6f 70 65 6e 69 6e 67 20 6c 6f 63 6b 65 64  y opening locked
16e10 20 74 61 62 6c 65 73 20 66 6f 72 20 4d 53 20 6d   tables for MS m
16e20 69 6c 6c 69 73 65 63 6f 6e 64 73 5c 6e 22 0a 20  illiseconds\n". 
16e30 20 22 2e 74 69 6d 65 72 20 6f 6e 7c 6f 66 66 20   ".timer on|off 
16e40 20 20 20 20 20 20 20 20 20 54 75 72 6e 20 53 51           Turn SQ
16e50 4c 20 74 69 6d 65 72 20 6f 6e 20 6f 72 20 6f 66  L timer on or of
16e60 66 5c 6e 22 0a 20 20 22 2e 74 72 61 63 65 20 46  f\n".  ".trace F
16e70 49 4c 45 7c 6f 66 66 20 20 20 20 20 20 20 20 4f  ILE|off        O
16e80 75 74 70 75 74 20 65 61 63 68 20 53 51 4c 20 73  utput each SQL s
16e90 74 61 74 65 6d 65 6e 74 20 61 73 20 69 74 20 69  tatement as it i
16ea0 73 20 72 75 6e 5c 6e 22 0a 20 20 22 2e 76 66 73  s run\n".  ".vfs
16eb0 69 6e 66 6f 20 3f 41 55 58 3f 20 20 20 20 20 20  info ?AUX?      
16ec0 20 20 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61     Information a
16ed0 62 6f 75 74 20 74 68 65 20 74 6f 70 2d 6c 65 76  bout the top-lev
16ee0 65 6c 20 56 46 53 5c 6e 22 0a 20 20 22 2e 76 66  el VFS\n".  ".vf
16ef0 73 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20  slist           
16f00 20 20 20 20 4c 69 73 74 20 61 6c 6c 20 61 76 61      List all ava
16f10 69 6c 61 62 6c 65 20 56 46 53 65 73 5c 6e 22 0a  ilable VFSes\n".
16f20 20 20 22 2e 76 66 73 6e 61 6d 65 20 3f 41 55 58    ".vfsname ?AUX
16f30 3f 20 20 20 20 20 20 20 20 20 50 72 69 6e 74 20  ?         Print 
16f40 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
16f50 56 46 53 20 73 74 61 63 6b 5c 6e 22 0a 20 20 22  VFS stack\n".  "
16f60 2e 77 69 64 74 68 20 4e 55 4d 31 20 4e 55 4d 32  .width NUM1 NUM2
16f70 20 2e 2e 2e 20 20 20 53 65 74 20 63 6f 6c 75 6d   ...   Set colum
16f80 6e 20 77 69 64 74 68 73 20 66 6f 72 20 5c 22 63  n widths for \"c
16f90 6f 6c 75 6d 6e 5c 22 20 6d 6f 64 65 5c 6e 22 0a  olumn\" mode\n".
16fa0 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20    "             
16fb0 20 20 20 20 20 20 20 20 20 20 20 20 4e 65 67 61              Nega
16fc0 74 69 76 65 20 76 61 6c 75 65 73 20 72 69 67 68  tive values righ
16fd0 74 2d 6a 75 73 74 69 66 79 5c 6e 22 0a 3b 0a 0a  t-justify\n".;..
16fe0 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
16ff0 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f  TE_ENABLE_SESSIO
17000 4e 29 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 68  N)./*.** Print h
17010 65 6c 70 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  elp information 
17020 66 6f 72 20 74 68 65 20 22 2e 73 65 73 73 69 6f  for the ".sessio
17030 6e 73 22 20 63 6f 6d 6d 61 6e 64 0a 2a 2f 0a 76  ns" command.*/.v
17040 6f 69 64 20 73 65 73 73 69 6f 6e 5f 68 65 6c 70  oid session_help
17050 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b  (ShellState *p){
17060 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d  .  raw_printf(p-
17070 3e 6f 75 74 2c 0a 20 20 20 20 22 2e 73 65 73 73  >out,.    ".sess
17080 69 6f 6e 20 3f 4e 41 4d 45 3f 20 53 55 42 43 4f  ion ?NAME? SUBCO
17090 4d 4d 41 4e 44 20 3f 41 52 47 53 2e 2e 2e 3f 5c  MMAND ?ARGS...?\
170a0 6e 22 0a 20 20 20 20 22 49 66 20 3f 4e 41 4d 45  n".    "If ?NAME
170b0 3f 20 69 73 20 6f 6d 69 74 74 65 64 2c 20 74 68  ? is omitted, th
170c0 65 20 66 69 72 73 74 20 64 65 66 69 6e 65 64 20  e first defined 
170d0 73 65 73 73 69 6f 6e 20 69 73 20 75 73 65 64 2e  session is used.
170e0 5c 6e 22 0a 20 20 20 20 22 53 75 62 63 6f 6d 6d  \n".    "Subcomm
170f0 61 6e 64 73 3a 5c 6e 22 0a 20 20 20 20 22 20 20  ands:\n".    "  
17100 20 61 74 74 61 63 68 20 54 41 42 4c 45 20 20 20   attach TABLE   
17110 20 20 20 20 20 20 20 20 20 20 41 74 74 61 63 68            Attach
17120 20 54 41 42 4c 45 5c 6e 22 0a 20 20 20 20 22 20   TABLE\n".    " 
17130 20 20 63 68 61 6e 67 65 73 65 74 20 46 49 4c 45    changeset FILE
17140 20 20 20 20 20 20 20 20 20 20 20 57 72 69 74 65             Write
17150 20 61 20 63 68 61 6e 67 65 73 65 74 20 69 6e 74   a changeset int
17160 6f 20 46 49 4c 45 5c 6e 22 0a 20 20 20 20 22 20  o FILE\n".    " 
17170 20 20 63 6c 6f 73 65 20 20 20 20 20 20 20 20 20    close         
17180 20 20 20 20 20 20 20 20 20 20 20 43 6c 6f 73 65             Close
17190 20 6f 6e 65 20 73 65 73 73 69 6f 6e 5c 6e 22 0a   one session\n".
171a0 20 20 20 20 22 20 20 20 65 6e 61 62 6c 65 20 3f      "   enable ?
171b0 42 4f 4f 4c 45 41 4e 3f 20 20 20 20 20 20 20 20  BOOLEAN?        
171c0 20 53 65 74 20 6f 72 20 71 75 65 72 79 20 74 68   Set or query th
171d0 65 20 65 6e 61 62 6c 65 20 62 69 74 5c 6e 22 0a  e enable bit\n".
171e0 20 20 20 20 22 20 20 20 66 69 6c 74 65 72 20 47      "   filter G
171f0 4c 4f 42 2e 2e 2e 20 20 20 20 20 20 20 20 20 20  LOB...          
17200 20 52 65 6a 65 63 74 20 74 61 62 6c 65 73 20 6d   Reject tables m
17210 61 74 63 68 69 6e 67 20 47 4c 4f 42 73 5c 6e 22  atching GLOBs\n"
17220 0a 20 20 20 20 22 20 20 20 69 6e 64 69 72 65 63  .    "   indirec
17230 74 20 3f 42 4f 4f 4c 45 41 4e 3f 20 20 20 20 20  t ?BOOLEAN?     
17240 20 20 4d 61 72 6b 20 6f 72 20 71 75 65 72 79 20    Mark or query 
17250 74 68 65 20 69 6e 64 69 72 65 63 74 20 73 74 61  the indirect sta
17260 74 75 73 5c 6e 22 0a 20 20 20 20 22 20 20 20 69  tus\n".    "   i
17270 73 65 6d 70 74 79 20 20 20 20 20 20 20 20 20 20  sempty          
17280 20 20 20 20 20 20 20 20 51 75 65 72 79 20 77 68          Query wh
17290 65 74 68 65 72 20 74 68 65 20 73 65 73 73 69 6f  ether the sessio
172a0 6e 20 69 73 20 65 6d 70 74 79 5c 6e 22 0a 20 20  n is empty\n".  
172b0 20 20 22 20 20 20 6c 69 73 74 20 20 20 20 20 20    "   list      
172c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c                 L
172d0 69 73 74 20 63 75 72 72 65 6e 74 6c 79 20 6f 70  ist currently op
172e0 65 6e 20 73 65 73 73 69 6f 6e 20 6e 61 6d 65 73  en session names
172f0 5c 6e 22 0a 20 20 20 20 22 20 20 20 6f 70 65 6e  \n".    "   open
17300 20 44 42 20 4e 41 4d 45 20 20 20 20 20 20 20 20   DB NAME        
17310 20 20 20 20 20 4f 70 65 6e 20 61 20 6e 65 77 20       Open a new 
17320 73 65 73 73 69 6f 6e 20 6f 6e 20 44 42 5c 6e 22  session on DB\n"
17330 0a 20 20 20 20 22 20 20 20 70 61 74 63 68 73 65  .    "   patchse
17340 74 20 46 49 4c 45 20 20 20 20 20 20 20 20 20 20  t FILE          
17350 20 20 57 72 69 74 65 20 61 20 70 61 74 63 68 73    Write a patchs
17360 65 74 20 69 6e 74 6f 20 46 49 4c 45 5c 6e 22 0a  et into FILE\n".
17370 20 20 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a    );.}.#endif...
17380 2f 2a 20 46 6f 72 77 61 72 64 20 72 65 66 65 72  /* Forward refer
17390 65 6e 63 65 20 2a 2f 0a 73 74 61 74 69 63 20 69  ence */.static i
173a0 6e 74 20 70 72 6f 63 65 73 73 5f 69 6e 70 75 74  nt process_input
173b0 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20  (ShellState *p, 
173c0 46 49 4c 45 20 2a 69 6e 29 3b 0a 0a 2f 2a 0a 2a  FILE *in);../*.*
173d0 2a 20 52 65 61 64 20 74 68 65 20 63 6f 6e 74 65  * Read the conte
173e0 6e 74 20 6f 66 20 66 69 6c 65 20 7a 4e 61 6d 65  nt of file zName
173f0 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 6f 62 74   into memory obt
17400 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
17410 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 29 0a 2a 2a  e3_malloc64().**
17420 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
17430 69 6e 74 65 72 20 74 6f 20 74 68 65 20 62 75 66  inter to the buf
17440 66 65 72 2e 20 54 68 65 20 63 61 6c 6c 65 72 20  fer. The caller 
17450 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66  is responsible f
17460 6f 72 20 66 72 65 65 69 6e 67 0a 2a 2a 20 74 68  or freeing.** th
17470 65 20 6d 65 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20  e memory..**.** 
17480 49 66 20 70 61 72 61 6d 65 74 65 72 20 70 6e 42  If parameter pnB
17490 79 74 65 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c  yte is not NULL,
174a0 20 28 2a 70 6e 42 79 74 65 29 20 69 73 20 73 65   (*pnByte) is se
174b0 74 20 74 6f 20 74 68 65 20 6e 75 6d 62 65 72 20  t to the number 
174c0 6f 66 20 62 79 74 65 73 0a 2a 2a 20 72 65 61 64  of bytes.** read
174d0 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 63 6f 6e 76  ..**.** For conv
174e0 65 6e 69 65 6e 63 65 2c 20 61 20 6e 75 6c 2d 74  enience, a nul-t
174f0 65 72 6d 69 6e 61 74 6f 72 20 62 79 74 65 20 69  erminator byte i
17500 73 20 61 6c 77 61 79 73 20 61 70 70 65 6e 64 65  s always appende
17510 64 20 74 6f 20 74 68 65 20 64 61 74 61 20 72 65  d to the data re
17520 61 64 0a 2a 2a 20 66 72 6f 6d 20 74 68 65 20 66  ad.** from the f
17530 69 6c 65 20 62 65 66 6f 72 65 20 74 68 65 20 62  ile before the b
17540 75 66 66 65 72 20 69 73 20 72 65 74 75 72 6e 65  uffer is returne
17550 64 2e 20 54 68 69 73 20 62 79 74 65 20 69 73 20  d. This byte is 
17560 6e 6f 74 20 69 6e 63 6c 75 64 65 64 20 69 6e 0a  not included in.
17570 2a 2a 20 74 68 65 20 66 69 6e 61 6c 20 76 61 6c  ** the final val
17580 75 65 20 6f 66 20 28 2a 70 6e 42 79 74 65 29 2c  ue of (*pnByte),
17590 20 69 66 20 61 70 70 6c 69 63 61 62 6c 65 2e 0a   if applicable..
175a0 2a 2a 0a 2a 2a 20 4e 55 4c 4c 20 69 73 20 72 65  **.** NULL is re
175b0 74 75 72 6e 65 64 20 69 66 20 61 6e 79 20 65 72  turned if any er
175c0 72 6f 72 20 69 73 20 65 6e 63 6f 75 6e 74 65 72  ror is encounter
175d0 65 64 2e 20 54 68 65 20 66 69 6e 61 6c 20 76 61  ed. The final va
175e0 6c 75 65 20 6f 66 20 2a 70 6e 42 79 74 65 0a 2a  lue of *pnByte.*
175f0 2a 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20 69  * is undefined i
17600 6e 20 74 68 69 73 20 63 61 73 65 2e 0a 2a 2f 0a  n this case..*/.
17610 73 74 61 74 69 63 20 63 68 61 72 20 2a 72 65 61  static char *rea
17620 64 46 69 6c 65 28 63 6f 6e 73 74 20 63 68 61 72  dFile(const char
17630 20 2a 7a 4e 61 6d 65 2c 20 69 6e 74 20 2a 70 6e   *zName, int *pn
17640 42 79 74 65 29 7b 0a 20 20 46 49 4c 45 20 2a 69  Byte){.  FILE *i
17650 6e 20 3d 20 66 6f 70 65 6e 28 7a 4e 61 6d 65 2c  n = fopen(zName,
17660 20 22 72 62 22 29 3b 0a 20 20 6c 6f 6e 67 20 6e   "rb");.  long n
17670 49 6e 3b 0a 20 20 73 69 7a 65 5f 74 20 6e 52 65  In;.  size_t nRe
17680 61 64 3b 0a 20 20 63 68 61 72 20 2a 70 42 75 66  ad;.  char *pBuf
17690 3b 0a 20 20 69 66 28 20 69 6e 3d 3d 30 20 29 20  ;.  if( in==0 ) 
176a0 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 73 65 65  return 0;.  fsee
176b0 6b 28 69 6e 2c 20 30 2c 20 53 45 45 4b 5f 45 4e  k(in, 0, SEEK_EN
176c0 44 29 3b 0a 20 20 6e 49 6e 20 3d 20 66 74 65 6c  D);.  nIn = ftel
176d0 6c 28 69 6e 29 3b 0a 20 20 72 65 77 69 6e 64 28  l(in);.  rewind(
176e0 69 6e 29 3b 0a 20 20 70 42 75 66 20 3d 20 73 71  in);.  pBuf = sq
176f0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20  lite3_malloc64( 
17700 6e 49 6e 2b 31 20 29 3b 0a 20 20 69 66 28 20 70  nIn+1 );.  if( p
17710 42 75 66 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Buf==0 ) return 
17720 30 3b 0a 20 20 6e 52 65 61 64 20 3d 20 66 72 65  0;.  nRead = fre
17730 61 64 28 70 42 75 66 2c 20 6e 49 6e 2c 20 31 2c  ad(pBuf, nIn, 1,
17740 20 69 6e 29 3b 0a 20 20 66 63 6c 6f 73 65 28 69   in);.  fclose(i
17750 6e 29 3b 0a 20 20 69 66 28 20 6e 52 65 61 64 21  n);.  if( nRead!
17760 3d 31 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =1 ){.    sqlite
17770 33 5f 66 72 65 65 28 70 42 75 66 29 3b 0a 20 20  3_free(pBuf);.  
17780 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
17790 20 20 70 42 75 66 5b 6e 49 6e 5d 20 3d 20 30 3b    pBuf[nIn] = 0;
177a0 0a 20 20 69 66 28 20 70 6e 42 79 74 65 20 29 20  .  if( pnByte ) 
177b0 2a 70 6e 42 79 74 65 20 3d 20 6e 49 6e 3b 0a 20  *pnByte = nIn;. 
177c0 20 72 65 74 75 72 6e 20 70 42 75 66 3b 0a 7d 0a   return pBuf;.}.
177d0 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c  .#if defined(SQL
177e0 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49  ITE_ENABLE_SESSI
177f0 4f 4e 29 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20  ON)./*.** Close 
17800 61 20 73 69 6e 67 6c 65 20 4f 70 65 6e 53 65 73  a single OpenSes
17810 73 69 6f 6e 20 6f 62 6a 65 63 74 20 61 6e 64 20  sion object and 
17820 72 65 6c 65 61 73 65 20 61 6c 6c 20 6f 66 20 69  release all of i
17830 74 73 20 61 73 73 6f 63 69 61 74 65 64 0a 2a 2a  ts associated.**
17840 20 72 65 73 6f 75 72 63 65 73 2e 0a 2a 2f 0a 73   resources..*/.s
17850 74 61 74 69 63 20 76 6f 69 64 20 73 65 73 73 69  tatic void sessi
17860 6f 6e 5f 63 6c 6f 73 65 28 4f 70 65 6e 53 65 73  on_close(OpenSes
17870 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 29 7b  sion *pSession){
17880 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69  .  int i;.  sqli
17890 74 65 33 73 65 73 73 69 6f 6e 5f 64 65 6c 65 74  te3session_delet
178a0 65 28 70 53 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a  e(pSession->p);.
178b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
178c0 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 29 3b  Session->zName);
178d0 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53  .  for(i=0; i<pS
178e0 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72 3b  ession->nFilter;
178f0 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
17900 65 33 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e  e3_free(pSession
17910 2d 3e 61 7a 46 69 6c 74 65 72 5b 69 5d 29 3b 0a  ->azFilter[i]);.
17920 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
17930 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46  ee(pSession->azF
17940 69 6c 74 65 72 29 3b 0a 20 20 6d 65 6d 73 65 74  ilter);.  memset
17950 28 70 53 65 73 73 69 6f 6e 2c 20 30 2c 20 73 69  (pSession, 0, si
17960 7a 65 6f 66 28 4f 70 65 6e 53 65 73 73 69 6f 6e  zeof(OpenSession
17970 29 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ));.}.#endif../*
17980 0a 2a 2a 20 43 6c 6f 73 65 20 61 6c 6c 20 4f 70  .** Close all Op
17990 65 6e 53 65 73 73 69 6f 6e 20 6f 62 6a 65 63 74  enSession object
179a0 73 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6c  s and release al
179b0 6c 20 61 73 73 6f 63 69 61 74 65 64 20 72 65 73  l associated res
179c0 6f 75 72 63 65 73 2e 0a 2a 2f 0a 23 69 66 20 64  ources..*/.#if d
179d0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e  efined(SQLITE_EN
179e0 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 73 74  ABLE_SESSION).st
179f0 61 74 69 63 20 76 6f 69 64 20 73 65 73 73 69 6f  atic void sessio
17a00 6e 5f 63 6c 6f 73 65 5f 61 6c 6c 28 53 68 65 6c  n_close_all(Shel
17a10 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 69 6e  lState *p){.  in
17a20 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  t i;.  for(i=0; 
17a30 69 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b 20 69  i<p->nSession; i
17a40 2b 2b 29 7b 0a 20 20 20 20 73 65 73 73 69 6f 6e  ++){.    session
17a50 5f 63 6c 6f 73 65 28 26 70 2d 3e 61 53 65 73 73  _close(&p->aSess
17a60 69 6f 6e 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20 70  ion[i]);.  }.  p
17a70 2d 3e 6e 53 65 73 73 69 6f 6e 20 3d 20 30 3b 0a  ->nSession = 0;.
17a80 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65  }.#else.# define
17a90 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61   session_close_a
17aa0 6c 6c 28 58 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a  ll(X).#endif../*
17ab0 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69  .** Implementati
17ac0 6f 6e 20 6f 66 20 74 68 65 20 78 46 69 6c 74 65  on of the xFilte
17ad0 72 20 66 75 6e 63 74 69 6f 6e 20 66 6f 72 20 61  r function for a
17ae0 6e 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e 2e 20  n open session. 
17af0 20 4f 6d 69 74 0a 2a 2a 20 61 6e 79 20 74 61 62   Omit.** any tab
17b00 6c 65 73 20 6e 61 6d 65 64 20 62 79 20 22 2e 73  les named by ".s
17b10 65 73 73 69 6f 6e 20 66 69 6c 74 65 72 22 20 62  ession filter" b
17b20 75 74 20 6c 65 74 20 61 6c 6c 20 6f 74 68 65 72  ut let all other
17b30 20 74 61 62 6c 65 20 74 68 72 6f 75 67 68 2e 0a   table through..
17b40 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  */.#if defined(S
17b50 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53  QLITE_ENABLE_SES
17b60 53 49 4f 4e 29 0a 73 74 61 74 69 63 20 69 6e 74  SION).static int
17b70 20 73 65 73 73 69 6f 6e 5f 66 69 6c 74 65 72 28   session_filter(
17b80 76 6f 69 64 20 2a 70 43 74 78 2c 20 63 6f 6e 73  void *pCtx, cons
17b90 74 20 63 68 61 72 20 2a 7a 54 61 62 29 7b 0a 20  t char *zTab){. 
17ba0 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20 2a 70 53   OpenSession *pS
17bb0 65 73 73 69 6f 6e 20 3d 20 28 4f 70 65 6e 53 65  ession = (OpenSe
17bc0 73 73 69 6f 6e 2a 29 70 43 74 78 3b 0a 20 20 69  ssion*)pCtx;.  i
17bd0 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nt i;.  for(i=0;
17be0 20 69 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e 46 69   i<pSession->nFi
17bf0 6c 74 65 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  lter; i++){.    
17c00 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67  if( sqlite3_strg
17c10 6c 6f 62 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a  lob(pSession->az
17c20 46 69 6c 74 65 72 5b 69 5d 2c 20 7a 54 61 62 29  Filter[i], zTab)
17c30 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
17c40 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
17c50 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
17c60 4d 61 6b 65 20 73 75 72 65 20 74 68 65 20 64 61  Make sure the da
17c70 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 2e 20  tabase is open. 
17c80 20 49 66 20 69 74 20 69 73 20 6e 6f 74 2c 20 74   If it is not, t
17c90 68 65 6e 20 6f 70 65 6e 20 69 74 2e 20 20 49 66  hen open it.  If
17ca0 0a 2a 2a 20 74 68 65 20 64 61 74 61 62 61 73 65  .** the database
17cb0 20 66 61 69 6c 73 20 74 6f 20 6f 70 65 6e 2c 20   fails to open, 
17cc0 70 72 69 6e 74 20 61 6e 20 65 72 72 6f 72 20 6d  print an error m
17cd0 65 73 73 61 67 65 20 61 6e 64 20 65 78 69 74 2e  essage and exit.
17ce0 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
17cf0 6f 70 65 6e 5f 64 62 28 53 68 65 6c 6c 53 74 61  open_db(ShellSta
17d00 74 65 20 2a 70 2c 20 69 6e 74 20 6b 65 65 70 41  te *p, int keepA
17d10 6c 69 76 65 29 7b 0a 20 20 69 66 28 20 70 2d 3e  live){.  if( p->
17d20 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  db==0 ){.    sql
17d30 69 74 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28  ite3_initialize(
17d40 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 6f  );.    sqlite3_o
17d50 70 65 6e 28 70 2d 3e 7a 44 62 46 69 6c 65 6e 61  pen(p->zDbFilena
17d60 6d 65 2c 20 26 70 2d 3e 64 62 29 3b 0a 20 20 20  me, &p->db);.   
17d70 20 67 6c 6f 62 61 6c 44 62 20 3d 20 70 2d 3e 64   globalDb = p->d
17d80 62 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62  b;.    if( p->db
17d90 3d 3d 30 20 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b  ==0 || SQLITE_OK
17da0 21 3d 73 71 6c 69 74 65 33 5f 65 72 72 63 6f 64  !=sqlite3_errcod
17db0 65 28 70 2d 3e 64 62 29 20 29 7b 0a 20 20 20 20  e(p->db) ){.    
17dc0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
17dd0 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 75 6e 61  derr,"Error: una
17de0 62 6c 65 20 74 6f 20 6f 70 65 6e 20 64 61 74 61  ble to open data
17df0 62 61 73 65 20 5c 22 25 73 5c 22 3a 20 25 73 5c  base \"%s\": %s\
17e00 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 70 2d  n",.          p-
17e10 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20 73 71  >zDbFilename, sq
17e20 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
17e30 64 62 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20  db));.      if( 
17e40 6b 65 65 70 41 6c 69 76 65 20 29 20 72 65 74 75  keepAlive ) retu
17e50 72 6e 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31  rn;.      exit(1
17e60 29 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  );.    }.#ifndef
17e70 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41   SQLITE_OMIT_LOA
17e80 44 5f 45 58 54 45 4e 53 49 4f 4e 0a 20 20 20 20  D_EXTENSION.    
17e90 73 71 6c 69 74 65 33 5f 65 6e 61 62 6c 65 5f 6c  sqlite3_enable_l
17ea0 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70 2d  oad_extension(p-
17eb0 3e 64 62 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a  >db, 1);.#endif.
17ec0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c 65      sqlite3_file
17ed0 69 6f 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30  io_init(p->db, 0
17ee0 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
17ef0 33 5f 73 68 61 74 68 72 65 65 5f 69 6e 69 74 28  3_shathree_init(
17f00 70 2d 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20  p->db, 0, 0);.  
17f10 20 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65    sqlite3_comple
17f20 74 69 6f 6e 5f 69 6e 69 74 28 70 2d 3e 64 62 2c  tion_init(p->db,
17f30 20 30 2c 20 30 29 3b 0a 23 69 66 64 65 66 20 53   0, 0);.#ifdef S
17f40 51 4c 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a  QLITE_HAVE_ZLIB.
17f50 20 20 20 20 73 71 6c 69 74 65 33 5f 7a 69 70 66      sqlite3_zipf
17f60 69 6c 65 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20  ile_init(p->db, 
17f70 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  0, 0);.    sqlit
17f80 65 33 5f 73 71 6c 61 72 5f 69 6e 69 74 28 70 2d  e3_sqlar_init(p-
17f90 3e 64 62 2c 20 30 2c 20 30 29 3b 0a 23 65 6e 64  >db, 0, 0);.#end
17fa0 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63  if.    sqlite3_c
17fb0 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 70  reate_function(p
17fc0 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 61 64 64  ->db, "shell_add
17fd0 5f 73 63 68 65 6d 61 22 2c 20 33 2c 20 53 51 4c  _schema", 3, SQL
17fe0 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20 20  ITE_UTF8, 0,.   
17ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18000 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c 41 64           shellAd
18010 64 53 63 68 65 6d 61 4e 61 6d 65 2c 20 30 2c 20  dSchemaName, 0, 
18020 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
18030 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
18040 70 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 6d 6f  p->db, "shell_mo
18050 64 75 6c 65 5f 73 63 68 65 6d 61 22 2c 20 31 2c  dule_schema", 1,
18060 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c   SQLITE_UTF8, 0,
18070 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
18080 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68 65               she
18090 6c 6c 4d 6f 64 75 6c 65 53 63 68 65 6d 61 2c 20  llModuleSchema, 
180a0 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 23 69  0, 0);.  }.}..#i
180b0 66 20 48 41 56 45 5f 52 45 41 44 4c 49 4e 45 20  f HAVE_READLINE 
180c0 7c 7c 20 48 41 56 45 5f 45 44 49 54 4c 49 4e 45  || HAVE_EDITLINE
180d0 0a 2f 2a 0a 2a 2a 20 52 65 61 64 6c 69 6e 65 20  ./*.** Readline 
180e0 63 6f 6d 70 6c 65 74 69 6f 6e 20 63 61 6c 6c 62  completion callb
180f0 61 63 6b 73 0a 2a 2f 0a 73 74 61 74 69 63 20 63  acks.*/.static c
18100 68 61 72 20 2a 72 65 61 64 6c 69 6e 65 5f 63 6f  har *readline_co
18110 6d 70 6c 65 74 69 6f 6e 5f 67 65 6e 65 72 61 74  mpletion_generat
18120 6f 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 74  or(const char *t
18130 65 78 74 2c 20 69 6e 74 20 73 74 61 74 65 29 7b  ext, int state){
18140 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74 65  .  static sqlite
18150 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
18160 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74 3b  0;.  char *zRet;
18170 0a 20 20 69 66 28 20 73 74 61 74 65 3d 3d 30 20  .  if( state==0 
18180 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  ){.    char *zSq
18190 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  l;.    sqlite3_f
181a0 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
181b0 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
181c0 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45  e3_mprintf("SELE
181d0 43 54 20 44 49 53 54 49 4e 43 54 20 63 61 6e 64  CT DISTINCT cand
181e0 69 64 61 74 65 20 43 4f 4c 4c 41 54 45 20 6e 6f  idate COLLATE no
181f0 63 61 73 65 22 0a 20 20 20 20 20 20 20 20 20 20  case".          
18200 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18210 20 22 20 20 46 52 4f 4d 20 63 6f 6d 70 6c 65 74   "  FROM complet
18220 69 6f 6e 28 25 51 29 20 4f 52 44 45 52 20 42 59  ion(%Q) ORDER BY
18230 20 31 22 2c 20 74 65 78 74 29 3b 0a 20 20 20 20   1", text);.    
18240 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
18250 76 32 28 67 6c 6f 62 61 6c 44 62 2c 20 7a 53 71  v2(globalDb, zSq
18260 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  l, -1, &pStmt, 0
18270 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
18280 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a 20  ree(zSql);.  }. 
18290 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 65   if( sqlite3_ste
182a0 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
182b0 5f 52 4f 57 20 29 7b 0a 20 20 20 20 7a 52 65 74  _ROW ){.    zRet
182c0 20 3d 20 73 74 72 64 75 70 28 28 63 6f 6e 73 74   = strdup((const
182d0 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
182e0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
182f0 2c 20 30 29 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  , 0));.  }else{.
18300 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
18310 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
18320 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20   pStmt = 0;.    
18330 7a 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  zRet = 0;.  }.  
18340 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a 73  return zRet;.}.s
18350 74 61 74 69 63 20 63 68 61 72 20 2a 2a 72 65 61  tatic char **rea
18360 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f 6e  dline_completion
18370 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 65  (const char *zTe
18380 78 74 2c 20 69 6e 74 20 69 53 74 61 72 74 2c 20  xt, int iStart, 
18390 69 6e 74 20 69 45 6e 64 29 7b 0a 20 20 72 6c 5f  int iEnd){.  rl_
183a0 61 74 74 65 6d 70 74 65 64 5f 63 6f 6d 70 6c 65  attempted_comple
183b0 74 69 6f 6e 5f 6f 76 65 72 20 3d 20 31 3b 0a 20  tion_over = 1;. 
183c0 20 72 65 74 75 72 6e 20 72 6c 5f 63 6f 6d 70 6c   return rl_compl
183d0 65 74 69 6f 6e 5f 6d 61 74 63 68 65 73 28 7a 54  etion_matches(zT
183e0 65 78 74 2c 20 72 65 61 64 6c 69 6e 65 5f 63 6f  ext, readline_co
183f0 6d 70 6c 65 74 69 6f 6e 5f 67 65 6e 65 72 61 74  mpletion_generat
18400 6f 72 29 3b 0a 7d 0a 0a 23 65 6c 69 66 20 48 41  or);.}..#elif HA
18410 56 45 5f 4c 49 4e 45 4e 4f 49 53 45 0a 2f 2a 0a  VE_LINENOISE./*.
18420 2a 2a 20 4c 69 6e 65 6e 6f 69 73 65 20 63 6f 6d  ** Linenoise com
18430 70 6c 65 74 69 6f 6e 20 63 61 6c 6c 62 61 63 6b  pletion callback
18440 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
18450 6c 69 6e 65 6e 6f 69 73 65 5f 63 6f 6d 70 6c 65  linenoise_comple
18460 74 69 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72 20  tion(const char 
18470 2a 7a 4c 69 6e 65 2c 20 6c 69 6e 65 6e 6f 69 73  *zLine, linenois
18480 65 43 6f 6d 70 6c 65 74 69 6f 6e 73 20 2a 6c 63  eCompletions *lc
18490 29 7b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 20 3d  ){.  int nLine =
184a0 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4c 69   (int)strlen(zLi
184b0 6e 65 29 3b 0a 20 20 69 6e 74 20 69 2c 20 69 53  ne);.  int i, iS
184c0 74 61 72 74 3b 0a 20 20 73 71 6c 69 74 65 33 5f  tart;.  sqlite3_
184d0 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b  stmt *pStmt = 0;
184e0 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20  .  char *zSql;. 
184f0 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 30 5d   char zBuf[1000]
18500 3b 0a 0a 20 20 69 66 28 20 6e 4c 69 6e 65 3e 73  ;..  if( nLine>s
18510 69 7a 65 6f 66 28 7a 42 75 66 29 2d 33 30 20 29  izeof(zBuf)-30 )
18520 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 7a   return;.  if( z
18530 4c 69 6e 65 5b 30 5d 3d 3d 27 2e 27 20 29 20 72  Line[0]=='.' ) r
18540 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d 6e  eturn;.  for(i=n
18550 4c 69 6e 65 2d 31 3b 20 69 3e 3d 30 20 26 26 20  Line-1; i>=0 && 
18560 28 69 73 61 6c 6e 75 6d 28 7a 4c 69 6e 65 5b 69  (isalnum(zLine[i
18570 5d 29 20 7c 7c 20 7a 4c 69 6e 65 5b 69 5d 3d 3d  ]) || zLine[i]==
18580 27 5f 27 29 3b 20 69 2d 2d 29 7b 7d 0a 20 20 69  '_'); i--){}.  i
18590 66 28 20 69 3d 3d 6e 4c 69 6e 65 2d 31 20 29 20  f( i==nLine-1 ) 
185a0 72 65 74 75 72 6e 3b 0a 20 20 69 53 74 61 72 74  return;.  iStart
185b0 20 3d 20 69 2b 31 3b 0a 20 20 6d 65 6d 63 70 79   = i+1;.  memcpy
185c0 28 7a 42 75 66 2c 20 7a 4c 69 6e 65 2c 20 69 53  (zBuf, zLine, iS
185d0 74 61 72 74 29 3b 0a 20 20 7a 53 71 6c 20 3d 20  tart);.  zSql = 
185e0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
185f0 22 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43 54  "SELECT DISTINCT
18600 20 63 61 6e 64 69 64 61 74 65 20 43 4f 4c 4c 41   candidate COLLA
18610 54 45 20 6e 6f 63 61 73 65 22 0a 20 20 20 20 20  TE nocase".     
18620 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18630 20 20 20 20 22 20 20 46 52 4f 4d 20 63 6f 6d 70      "  FROM comp
18640 6c 65 74 69 6f 6e 28 25 51 2c 25 51 29 20 4f 52  letion(%Q,%Q) OR
18650 44 45 52 20 42 59 20 31 22 2c 0a 20 20 20 20 20  DER BY 1",.     
18660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18670 20 20 20 20 26 7a 4c 69 6e 65 5b 69 53 74 61 72      &zLine[iStar
18680 74 5d 2c 20 7a 4c 69 6e 65 29 3b 0a 20 20 73 71  t], zLine);.  sq
18690 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
186a0 28 67 6c 6f 62 61 6c 44 62 2c 20 7a 53 71 6c 2c  (globalDb, zSql,
186b0 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
186c0 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  .  sqlite3_free(
186d0 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  zSql);.  sqlite3
186e0 5f 65 78 65 63 28 67 6c 6f 62 61 6c 44 62 2c 20  _exec(globalDb, 
186f0 22 50 52 41 47 4d 41 20 70 61 67 65 5f 63 6f 75  "PRAGMA page_cou
18700 6e 74 22 2c 20 30 2c 20 30 2c 20 30 29 3b 20 2f  nt", 0, 0, 0); /
18710 2a 20 4c 6f 61 64 20 74 68 65 20 73 63 68 65 6d  * Load the schem
18720 61 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 73 71  a */.  while( sq
18730 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
18740 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
18750 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
18760 2a 7a 43 6f 6d 70 6c 65 74 69 6f 6e 20 3d 20 28  *zCompletion = (
18770 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
18780 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
18790 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69  pStmt, 0);.    i
187a0 6e 74 20 6e 43 6f 6d 70 6c 65 74 69 6f 6e 20 3d  nt nCompletion =
187b0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
187c0 62 79 74 65 73 28 70 53 74 6d 74 2c 20 30 29 3b  bytes(pStmt, 0);
187d0 0a 20 20 20 20 69 66 28 20 69 53 74 61 72 74 2b  .    if( iStart+
187e0 6e 43 6f 6d 70 6c 65 74 69 6f 6e 20 3c 20 73 69  nCompletion < si
187f0 7a 65 6f 66 28 7a 42 75 66 29 2d 31 20 29 7b 0a  zeof(zBuf)-1 ){.
18800 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42 75        memcpy(zBu
18810 66 2b 69 53 74 61 72 74 2c 20 7a 43 6f 6d 70 6c  f+iStart, zCompl
18820 65 74 69 6f 6e 2c 20 6e 43 6f 6d 70 6c 65 74 69  etion, nCompleti
18830 6f 6e 2b 31 29 3b 0a 20 20 20 20 20 20 6c 69 6e  on+1);.      lin
18840 65 6e 6f 69 73 65 41 64 64 43 6f 6d 70 6c 65 74  enoiseAddComplet
18850 69 6f 6e 28 6c 63 2c 20 7a 42 75 66 29 3b 0a 20  ion(lc, zBuf);. 
18860 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
18870 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
18880 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a  t);.}.#endif../*
18890 0a 2a 2a 20 44 6f 20 43 2d 6c 61 6e 67 75 61 67  .** Do C-languag
188a0 65 20 73 74 79 6c 65 20 64 65 71 75 6f 74 69 6e  e style dequotin
188b0 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 5c 61 20 20  g..**.**    \a  
188c0 20 20 2d 3e 20 61 6c 61 72 6d 0a 2a 2a 20 20 20    -> alarm.**   
188d0 20 5c 62 20 20 20 20 2d 3e 20 62 61 63 6b 73 70   \b    -> backsp
188e0 61 63 65 0a 2a 2a 20 20 20 20 5c 74 20 20 20 20  ace.**    \t    
188f0 2d 3e 20 74 61 62 0a 2a 2a 20 20 20 20 5c 6e 20  -> tab.**    \n 
18900 20 20 20 2d 3e 20 6e 65 77 6c 69 6e 65 0a 2a 2a     -> newline.**
18910 20 20 20 20 5c 76 20 20 20 20 2d 3e 20 76 65 72      \v    -> ver
18920 74 69 63 61 6c 20 74 61 62 0a 2a 2a 20 20 20 20  tical tab.**    
18930 5c 66 20 20 20 20 2d 3e 20 66 6f 72 6d 20 66 65  \f    -> form fe
18940 65 64 0a 2a 2a 20 20 20 20 5c 72 20 20 20 20 2d  ed.**    \r    -
18950 3e 20 63 61 72 72 69 61 67 65 20 72 65 74 75 72  > carriage retur
18960 6e 0a 2a 2a 20 20 20 20 5c 73 20 20 20 20 2d 3e  n.**    \s    ->
18970 20 73 70 61 63 65 0a 2a 2a 20 20 20 20 5c 22 20   space.**    \" 
18980 20 20 20 2d 3e 20 22 0a 2a 2a 20 20 20 20 5c 27     -> ".**    \'
18990 20 20 20 20 2d 3e 20 27 0a 2a 2a 20 20 20 20 5c      -> '.**    \
189a0 5c 20 20 20 20 2d 3e 20 62 61 63 6b 73 6c 61 73  \    -> backslas
189b0 68 0a 2a 2a 20 20 20 20 5c 4e 4e 4e 20 20 2d 3e  h.**    \NNN  ->
189c0 20 61 73 63 69 69 20 63 68 61 72 61 63 74 65 72   ascii character
189d0 20 4e 4e 4e 20 69 6e 20 6f 63 74 61 6c 0a 2a 2f   NNN in octal.*/
189e0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65 73  .static void res
189f0 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68 65 73  olve_backslashes
18a00 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74  (char *z){.  int
18a10 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 63 3b   i, j;.  char c;
18a20 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20  .  while( *z && 
18a30 2a 7a 21 3d 27 5c 5c 27 20 29 20 7a 2b 2b 3b 0a  *z!='\\' ) z++;.
18a40 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 28 63 20    for(i=j=0; (c 
18a50 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 2c  = z[i])!=0; i++,
18a60 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 63   j++){.    if( c
18a70 3d 3d 27 5c 5c 27 20 26 26 20 7a 5b 69 2b 31 5d  =='\\' && z[i+1]
18a80 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 20 3d  !=0 ){.      c =
18a90 20 7a 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20 20 69   z[++i];.      i
18aa0 66 28 20 63 3d 3d 27 61 27 20 29 7b 0a 20 20 20  f( c=='a' ){.   
18ab0 20 20 20 20 20 63 20 3d 20 27 5c 61 27 3b 0a 20       c = '\a';. 
18ac0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
18ad0 3d 3d 27 62 27 20 29 7b 0a 20 20 20 20 20 20 20  =='b' ){.       
18ae0 20 63 20 3d 20 27 5c 62 27 3b 0a 20 20 20 20 20   c = '\b';.     
18af0 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 74   }else if( c=='t
18b00 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
18b10 20 27 5c 74 27 3b 0a 20 20 20 20 20 20 7d 65 6c   '\t';.      }el
18b20 73 65 20 69 66 28 20 63 3d 3d 27 6e 27 20 29 7b  se if( c=='n' ){
18b30 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c 6e  .        c = '\n
18b40 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
18b50 66 28 20 63 3d 3d 27 76 27 20 29 7b 0a 20 20 20  f( c=='v' ){.   
18b60 20 20 20 20 20 63 20 3d 20 27 5c 76 27 3b 0a 20       c = '\v';. 
18b70 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
18b80 3d 3d 27 66 27 20 29 7b 0a 20 20 20 20 20 20 20  =='f' ){.       
18b90 20 63 20 3d 20 27 5c 66 27 3b 0a 20 20 20 20 20   c = '\f';.     
18ba0 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 72   }else if( c=='r
18bb0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20 3d  ' ){.        c =
18bc0 20 27 5c 72 27 3b 0a 20 20 20 20 20 20 7d 65 6c   '\r';.      }el
18bd0 73 65 20 69 66 28 20 63 3d 3d 27 22 27 20 29 7b  se if( c=='"' ){
18be0 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 22 27  .        c = '"'
18bf0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
18c00 28 20 63 3d 3d 27 5c 27 27 20 29 7b 0a 20 20 20  ( c=='\'' ){.   
18c10 20 20 20 20 20 63 20 3d 20 27 5c 27 27 3b 0a 20       c = '\'';. 
18c20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63       }else if( c
18c30 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20  =='\\' ){.      
18c40 20 20 63 20 3d 20 27 5c 5c 27 3b 0a 20 20 20 20    c = '\\';.    
18c50 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 3d 27    }else if( c>='
18c60 30 27 20 26 26 20 63 3c 3d 27 37 27 20 29 7b 0a  0' && c<='7' ){.
18c70 20 20 20 20 20 20 20 20 63 20 2d 3d 20 27 30 27          c -= '0'
18c80 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  ;.        if( z[
18c90 69 2b 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 69  i+1]>='0' && z[i
18ca0 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20  +1]<='7' ){.    
18cb0 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
18cc0 20 20 20 20 20 63 20 3d 20 28 63 3c 3c 33 29 20       c = (c<<3) 
18cd0 2b 20 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a 20 20  + z[i] - '0';.  
18ce0 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 2b          if( z[i+
18cf0 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 69 2b 31  1]>='0' && z[i+1
18d00 5d 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20 20  ]<='7' ){.      
18d10 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20 20        i++;.     
18d20 20 20 20 20 20 20 20 63 20 3d 20 28 63 3c 3c 33         c = (c<<3
18d30 29 20 2b 20 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a  ) + z[i] - '0';.
18d40 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
18d50 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
18d60 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20 63    }.    z[j] = c
18d70 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6a 3c 69 20  ;.  }.  if( j<i 
18d80 29 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a 2f  ) z[j] = 0;.}../
18d90 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
18da0 76 61 6c 75 65 20 6f 66 20 61 20 68 65 78 61 64  value of a hexad
18db0 65 63 69 6d 61 6c 20 64 69 67 69 74 2e 20 20 52  ecimal digit.  R
18dc0 65 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65 20  eturn -1 if the 
18dd0 69 6e 70 75 74 0a 2a 2a 20 69 73 20 6e 6f 74 20  input.** is not 
18de0 61 20 68 65 78 20 64 69 67 69 74 2e 0a 2a 2f 0a  a hex digit..*/.
18df0 73 74 61 74 69 63 20 69 6e 74 20 68 65 78 44 69  static int hexDi
18e00 67 69 74 56 61 6c 75 65 28 63 68 61 72 20 63 29  gitValue(char c)
18e10 7b 0a 20 20 69 66 28 20 63 3e 3d 27 30 27 20 26  {.  if( c>='0' &
18e20 26 20 63 3c 3d 27 39 27 20 29 20 72 65 74 75 72  & c<='9' ) retur
18e30 6e 20 63 20 2d 20 27 30 27 3b 0a 20 20 69 66 28  n c - '0';.  if(
18e40 20 63 3e 3d 27 61 27 20 26 26 20 63 3c 3d 27 66   c>='a' && c<='f
18e50 27 20 29 20 72 65 74 75 72 6e 20 63 20 2d 20 27  ' ) return c - '
18e60 61 27 20 2b 20 31 30 3b 0a 20 20 69 66 28 20 63  a' + 10;.  if( c
18e70 3e 3d 27 41 27 20 26 26 20 63 3c 3d 27 46 27 20  >='A' && c<='F' 
18e80 29 20 72 65 74 75 72 6e 20 63 20 2d 20 27 41 27  ) return c - 'A'
18e90 20 2b 20 31 30 3b 0a 20 20 72 65 74 75 72 6e 20   + 10;.  return 
18ea0 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74  -1;.}../*.** Int
18eb0 65 72 70 72 65 74 20 7a 41 72 67 20 61 73 20 61  erpret zArg as a
18ec0 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2c  n integer value,
18ed0 20 70 6f 73 73 69 62 6c 79 20 77 69 74 68 20 73   possibly with s
18ee0 75 66 66 69 78 65 73 2e 0a 2a 2f 0a 73 74 61 74  uffixes..*/.stat
18ef0 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  ic sqlite3_int64
18f00 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28 63 6f   integerValue(co
18f10 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 29 7b  nst char *zArg){
18f20 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  .  sqlite3_int64
18f30 20 76 20 3d 20 30 3b 0a 20 20 73 74 61 74 69 63   v = 0;.  static
18f40 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 20   const struct { 
18f50 63 68 61 72 20 2a 7a 53 75 66 66 69 78 3b 20 69  char *zSuffix; i
18f60 6e 74 20 69 4d 75 6c 74 3b 20 7d 20 61 4d 75 6c  nt iMult; } aMul
18f70 74 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22 4b  t[] = {.    { "K
18f80 69 42 22 2c 20 31 30 32 34 20 7d 2c 0a 20 20 20  iB", 1024 },.   
18f90 20 7b 20 22 4d 69 42 22 2c 20 31 30 32 34 2a 31   { "MiB", 1024*1
18fa0 30 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22 47 69  024 },.    { "Gi
18fb0 42 22 2c 20 31 30 32 34 2a 31 30 32 34 2a 31 30  B", 1024*1024*10
18fc0 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22 4b 42 22  24 },.    { "KB"
18fd0 2c 20 20 31 30 30 30 20 7d 2c 0a 20 20 20 20 7b  ,  1000 },.    {
18fe0 20 22 4d 42 22 2c 20 20 31 30 30 30 30 30 30 20   "MB",  1000000 
18ff0 7d 2c 0a 20 20 20 20 7b 20 22 47 42 22 2c 20 20  },.    { "GB",  
19000 31 30 30 30 30 30 30 30 30 30 20 7d 2c 0a 20 20  1000000000 },.  
19010 20 20 7b 20 22 4b 22 2c 20 20 20 31 30 30 30 20    { "K",   1000 
19020 7d 2c 0a 20 20 20 20 7b 20 22 4d 22 2c 20 20 20  },.    { "M",   
19030 31 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20 7b  1000000 },.    {
19040 20 22 47 22 2c 20 20 20 31 30 30 30 30 30 30 30   "G",   10000000
19050 30 30 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74  00 },.  };.  int
19060 20 69 3b 0a 20 20 69 6e 74 20 69 73 4e 65 67 20   i;.  int isNeg 
19070 3d 20 30 3b 0a 20 20 69 66 28 20 7a 41 72 67 5b  = 0;.  if( zArg[
19080 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20 69  0]=='-' ){.    i
19090 73 4e 65 67 20 3d 20 31 3b 0a 20 20 20 20 7a 41  sNeg = 1;.    zA
190a0 72 67 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20 69 66  rg++;.  }else if
190b0 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 2b 27 20 29  ( zArg[0]=='+' )
190c0 7b 0a 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20 20  {.    zArg++;.  
190d0 7d 0a 20 20 69 66 28 20 7a 41 72 67 5b 30 5d 3d  }.  if( zArg[0]=
190e0 3d 27 30 27 20 26 26 20 7a 41 72 67 5b 31 5d 3d  ='0' && zArg[1]=
190f0 3d 27 78 27 20 29 7b 0a 20 20 20 20 69 6e 74 20  ='x' ){.    int 
19100 78 3b 0a 20 20 20 20 7a 41 72 67 20 2b 3d 20 32  x;.    zArg += 2
19110 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 78 20  ;.    while( (x 
19120 3d 20 68 65 78 44 69 67 69 74 56 61 6c 75 65 28  = hexDigitValue(
19130 7a 41 72 67 5b 30 5d 29 29 3e 3d 30 20 29 7b 0a  zArg[0]))>=0 ){.
19140 20 20 20 20 20 20 76 20 3d 20 28 76 3c 3c 34 29        v = (v<<4)
19150 20 2b 20 78 3b 0a 20 20 20 20 20 20 7a 41 72 67   + x;.      zArg
19160 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  ++;.    }.  }els
19170 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 49 73  e{.    while( Is
19180 44 69 67 69 74 28 7a 41 72 67 5b 30 5d 29 20 29  Digit(zArg[0]) )
19190 7b 0a 20 20 20 20 20 20 76 20 3d 20 76 2a 31 30  {.      v = v*10
191a0 20 2b 20 7a 41 72 67 5b 30 5d 20 2d 20 27 30 27   + zArg[0] - '0'
191b0 3b 0a 20 20 20 20 20 20 7a 41 72 67 2b 2b 3b 0a  ;.      zArg++;.
191c0 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72 28      }.  }.  for(
191d0 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65  i=0; i<ArraySize
191e0 28 61 4d 75 6c 74 29 3b 20 69 2b 2b 29 7b 0a 20  (aMult); i++){. 
191f0 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
19200 74 72 69 63 6d 70 28 61 4d 75 6c 74 5b 69 5d 2e  tricmp(aMult[i].
19210 7a 53 75 66 66 69 78 2c 20 7a 41 72 67 29 3d 3d  zSuffix, zArg)==
19220 30 20 29 7b 0a 20 20 20 20 20 20 76 20 2a 3d 20  0 ){.      v *= 
19230 61 4d 75 6c 74 5b 69 5d 2e 69 4d 75 6c 74 3b 0a  aMult[i].iMult;.
19240 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
19250 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
19260 69 73 4e 65 67 3f 20 2d 76 20 3a 20 76 3b 0a 7d  isNeg? -v : v;.}
19270 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72 65  ../*.** Interpre
19280 74 20 7a 41 72 67 20 61 73 20 65 69 74 68 65 72  t zArg as either
19290 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 61   an integer or a
192a0 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e 20   boolean value. 
192b0 20 52 65 74 75 72 6e 20 31 20 6f 72 20 30 0a 2a   Return 1 or 0.*
192c0 2a 20 66 6f 72 20 54 52 55 45 20 61 6e 64 20 46  * for TRUE and F
192d0 41 4c 53 45 2e 20 20 52 65 74 75 72 6e 20 74 68  ALSE.  Return th
192e0 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  e integer value 
192f0 69 66 20 61 70 70 72 6f 70 72 69 61 74 65 2e 0a  if appropriate..
19300 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62 6f  */.static int bo
19310 6f 6c 65 61 6e 56 61 6c 75 65 28 63 6f 6e 73 74  oleanValue(const
19320 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20   char *zArg){.  
19330 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 41 72  int i;.  if( zAr
19340 67 5b 30 5d 3d 3d 27 30 27 20 26 26 20 7a 41 72  g[0]=='0' && zAr
19350 67 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a 20 20 20  g[1]=='x' ){.   
19360 20 66 6f 72 28 69 3d 32 3b 20 68 65 78 44 69 67   for(i=2; hexDig
19370 69 74 56 61 6c 75 65 28 7a 41 72 67 5b 69 5d 29  itValue(zArg[i])
19380 3e 3d 30 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7d 65  >=0; i++){}.  }e
19390 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30  lse{.    for(i=0
193a0 3b 20 7a 41 72 67 5b 69 5d 3e 3d 27 30 27 20 26  ; zArg[i]>='0' &
193b0 26 20 7a 41 72 67 5b 69 5d 3c 3d 27 39 27 3b 20  & zArg[i]<='9'; 
193c0 69 2b 2b 29 7b 7d 0a 20 20 7d 0a 20 20 69 66 28  i++){}.  }.  if(
193d0 20 69 3e 30 20 26 26 20 7a 41 72 67 5b 69 5d 3d   i>0 && zArg[i]=
193e0 3d 30 20 29 20 72 65 74 75 72 6e 20 28 69 6e 74  =0 ) return (int
193f0 29 28 69 6e 74 65 67 65 72 56 61 6c 75 65 28 7a  )(integerValue(z
19400 41 72 67 29 20 26 20 30 78 66 66 66 66 66 66 66  Arg) & 0xfffffff
19410 66 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  f);.  if( sqlite
19420 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 20  3_stricmp(zArg, 
19430 22 6f 6e 22 29 3d 3d 30 20 7c 7c 20 73 71 6c 69  "on")==0 || sqli
19440 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67  te3_stricmp(zArg
19450 2c 22 79 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20  ,"yes")==0 ){.  
19460 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
19470 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
19480 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 6f 66 66  ricmp(zArg, "off
19490 22 29 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  ")==0 || sqlite3
194a0 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 22 6e  _stricmp(zArg,"n
194b0 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  o")==0 ){.    re
194c0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 75 74  turn 0;.  }.  ut
194d0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
194e0 2c 20 22 45 52 52 4f 52 3a 20 4e 6f 74 20 61 20  , "ERROR: Not a 
194f0 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 3a 20 5c  boolean value: \
19500 22 25 73 5c 22 2e 20 41 73 73 75 6d 69 6e 67 20  "%s\". Assuming 
19510 5c 22 6e 6f 5c 22 2e 5c 6e 22 2c 0a 20 20 20 20  \"no\".\n",.    
19520 20 20 20 20 20 20 7a 41 72 67 29 3b 0a 20 20 72        zArg);.  r
19530 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
19540 2a 20 53 65 74 20 6f 72 20 63 6c 65 61 72 20 61  * Set or clear a
19550 20 73 68 65 6c 6c 20 66 6c 61 67 20 61 63 63 6f   shell flag acco
19560 72 64 69 6e 67 20 74 6f 20 61 20 62 6f 6f 6c 65  rding to a boole
19570 61 6e 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61  an value..*/.sta
19580 74 69 63 20 76 6f 69 64 20 73 65 74 4f 72 43 6c  tic void setOrCl
19590 65 61 72 46 6c 61 67 28 53 68 65 6c 6c 53 74 61  earFlag(ShellSta
195a0 74 65 20 2a 70 2c 20 75 6e 73 69 67 6e 65 64 20  te *p, unsigned 
195b0 6d 46 6c 61 67 2c 20 63 6f 6e 73 74 20 63 68 61  mFlag, const cha
195c0 72 20 2a 7a 41 72 67 29 7b 0a 20 20 69 66 28 20  r *zArg){.  if( 
195d0 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 7a 41 72  booleanValue(zAr
195e0 67 29 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c 53  g) ){.    ShellS
195f0 65 74 46 6c 61 67 28 70 2c 20 6d 46 6c 61 67 29  etFlag(p, mFlag)
19600 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 53  ;.  }else{.    S
19610 68 65 6c 6c 43 6c 65 61 72 46 6c 61 67 28 70 2c  hellClearFlag(p,
19620 20 6d 46 6c 61 67 29 3b 0a 20 20 7d 0a 7d 0a 0a   mFlag);.  }.}..
19630 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20 6f  /*.** Close an o
19640 75 74 70 75 74 20 66 69 6c 65 2c 20 61 73 73 75  utput file, assu
19650 6d 69 6e 67 20 69 74 20 69 73 20 6e 6f 74 20 73  ming it is not s
19660 74 64 65 72 72 20 6f 72 20 73 74 64 6f 75 74 0a  tderr or stdout.
19670 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f  */.static void o
19680 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65  utput_file_close
19690 28 46 49 4c 45 20 2a 66 29 7b 0a 20 20 69 66 28  (FILE *f){.  if(
196a0 20 66 20 26 26 20 66 21 3d 73 74 64 6f 75 74 20   f && f!=stdout 
196b0 26 26 20 66 21 3d 73 74 64 65 72 72 20 29 20 66  && f!=stderr ) f
196c0 63 6c 6f 73 65 28 66 29 3b 0a 7d 0a 0a 2f 2a 0a  close(f);.}../*.
196d0 2a 2a 20 54 72 79 20 74 6f 20 6f 70 65 6e 20 61  ** Try to open a
196e0 6e 20 6f 75 74 70 75 74 20 66 69 6c 65 2e 20 20  n output file.  
196f0 20 54 68 65 20 6e 61 6d 65 73 20 22 73 74 64 6f   The names "stdo
19700 75 74 22 20 61 6e 64 20 22 73 74 64 65 72 72 22  ut" and "stderr"
19710 20 61 72 65 0a 2a 2a 20 72 65 63 6f 67 6e 69 7a   are.** recogniz
19720 65 64 20 61 6e 64 20 64 6f 20 74 68 65 20 72 69  ed and do the ri
19730 67 68 74 20 74 68 69 6e 67 2e 20 20 4e 55 4c 4c  ght thing.  NULL
19740 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66 20   is returned if 
19750 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 66 69  the output.** fi
19760 6c 65 6e 61 6d 65 20 69 73 20 22 6f 66 66 22 2e  lename is "off".
19770 0a 2a 2f 0a 73 74 61 74 69 63 20 46 49 4c 45 20  .*/.static FILE 
19780 2a 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65  *output_file_ope
19790 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  n(const char *zF
197a0 69 6c 65 29 7b 0a 20 20 46 49 4c 45 20 2a 66 3b  ile){.  FILE *f;
197b0 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46  .  if( strcmp(zF
197c0 69 6c 65 2c 22 73 74 64 6f 75 74 22 29 3d 3d 30  ile,"stdout")==0
197d0 20 29 7b 0a 20 20 20 20 66 20 3d 20 73 74 64 6f   ){.    f = stdo
197e0 75 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ut;.  }else if( 
197f0 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22 73  strcmp(zFile, "s
19800 74 64 65 72 72 22 29 3d 3d 30 20 29 7b 0a 20 20  tderr")==0 ){.  
19810 20 20 66 20 3d 20 73 74 64 65 72 72 3b 0a 20 20    f = stderr;.  
19820 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
19830 28 7a 46 69 6c 65 2c 20 22 6f 66 66 22 29 3d 3d  (zFile, "off")==
19840 30 20 29 7b 0a 20 20 20 20 66 20 3d 20 30 3b 0a  0 ){.    f = 0;.
19850 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 20 3d    }else{.    f =
19860 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22 77   fopen(zFile, "w
19870 62 22 29 3b 0a 20 20 20 20 69 66 28 20 66 3d 3d  b");.    if( f==
19880 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  0 ){.      utf8_
19890 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
198a0 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70  Error: cannot op
198b0 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 46  en \"%s\"\n", zF
198c0 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ile);.    }.  }.
198d0 20 20 72 65 74 75 72 6e 20 66 3b 0a 7d 0a 0a 23    return f;.}..#
198e0 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
198f0 54 45 5f 55 4e 54 45 53 54 41 42 4c 45 29 0a 23  TE_UNTESTABLE).#
19900 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
19910 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20 26  TE_OMIT_TRACE) &
19920 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
19930 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47 5f  E_OMIT_FLOATING_
19940 50 4f 49 4e 54 29 0a 2f 2a 0a 2a 2a 20 41 20 72  POINT)./*.** A r
19950 6f 75 74 69 6e 65 20 66 6f 72 20 68 61 6e 64 6c  outine for handl
19960 69 6e 67 20 6f 75 74 70 75 74 20 66 72 6f 6d 20  ing output from 
19970 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 29 2e  sqlite3_trace().
19980 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
19990 71 6c 5f 74 72 61 63 65 5f 63 61 6c 6c 62 61 63  ql_trace_callbac
199a0 6b 28 0a 20 20 75 6e 73 69 67 6e 65 64 20 6d 54  k(.  unsigned mT
199b0 79 70 65 2c 0a 20 20 76 6f 69 64 20 2a 70 41 72  ype,.  void *pAr
199c0 67 2c 0a 20 20 76 6f 69 64 20 2a 70 50 2c 0a 20  g,.  void *pP,. 
199d0 20 76 6f 69 64 20 2a 70 58 0a 29 7b 0a 20 20 46   void *pX.){.  F
199e0 49 4c 45 20 2a 66 20 3d 20 28 46 49 4c 45 2a 29  ILE *f = (FILE*)
199f0 70 41 72 67 3b 0a 20 20 55 4e 55 53 45 44 5f 50  pArg;.  UNUSED_P
19a00 41 52 41 4d 45 54 45 52 28 6d 54 79 70 65 29 3b  ARAMETER(mType);
19a10 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
19a20 54 45 52 28 70 50 29 3b 0a 20 20 69 66 28 20 66  TER(pP);.  if( f
19a30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
19a40 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20 63  ar *z = (const c
19a50 68 61 72 2a 29 70 58 3b 0a 20 20 20 20 69 6e 74  har*)pX;.    int
19a60 20 69 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e   i = (int)strlen
19a70 28 7a 29 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  (z);.    while( 
19a80 69 3e 30 20 26 26 20 7a 5b 69 2d 31 5d 3d 3d 27  i>0 && z[i-1]=='
19a90 3b 27 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20 20  ;' ){ i--; }.   
19aa0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 66 2c 20   utf8_printf(f, 
19ab0 22 25 2e 2a 73 3b 5c 6e 22 2c 20 69 2c 20 7a 29  "%.*s;\n", i, z)
19ac0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
19ad0 3b 0a 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64 69  ;.}.#endif.#endi
19ae0 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 6f 2d 6f 70  f../*.** A no-op
19af0 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 72 75   routine that ru
19b00 6e 73 20 77 69 74 68 20 74 68 65 20 22 2e 62 72  ns with the ".br
19b10 65 61 6b 70 6f 69 6e 74 22 20 64 6f 63 2d 63 6f  eakpoint" doc-co
19b20 6d 6d 61 6e 64 2e 20 20 54 68 69 73 20 69 73 0a  mmand.  This is.
19b30 2a 2a 20 61 20 75 73 65 66 75 6c 20 73 70 6f 74  ** a useful spot
19b40 20 74 6f 20 73 65 74 20 61 20 64 65 62 75 67 67   to set a debugg
19b50 65 72 20 62 72 65 61 6b 70 6f 69 6e 74 2e 0a 2a  er breakpoint..*
19b60 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 65  /.static void te
19b70 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 76 6f  st_breakpoint(vo
19b80 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 69 6e  id){.  static in
19b90 74 20 6e 43 61 6c 6c 20 3d 20 30 3b 0a 20 20 6e  t nCall = 0;.  n
19ba0 43 61 6c 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Call++;.}../*.**
19bb0 20 41 6e 20 6f 62 6a 65 63 74 20 75 73 65 64 20   An object used 
19bc0 74 6f 20 72 65 61 64 20 61 20 43 53 56 20 61 6e  to read a CSV an
19bd0 64 20 6f 74 68 65 72 20 66 69 6c 65 73 20 66 6f  d other files fo
19be0 72 20 69 6d 70 6f 72 74 2e 0a 2a 2f 0a 74 79 70  r import..*/.typ
19bf0 65 64 65 66 20 73 74 72 75 63 74 20 49 6d 70 6f  edef struct Impo
19c00 72 74 43 74 78 20 49 6d 70 6f 72 74 43 74 78 3b  rtCtx ImportCtx;
19c10 0a 73 74 72 75 63 74 20 49 6d 70 6f 72 74 43 74  .struct ImportCt
19c20 78 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  x {.  const char
19c30 20 2a 7a 46 69 6c 65 3b 20 20 2f 2a 20 4e 61 6d   *zFile;  /* Nam
19c40 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20 66  e of the input f
19c50 69 6c 65 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 69  ile */.  FILE *i
19c60 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  n;           /* 
19c70 52 65 61 64 20 74 68 65 20 43 53 56 20 74 65 78  Read the CSV tex
19c80 74 20 66 72 6f 6d 20 74 68 69 73 20 69 6e 70 75  t from this inpu
19c90 74 20 73 74 72 65 61 6d 20 2a 2f 0a 20 20 63 68  t stream */.  ch
19ca0 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20 20  ar *z;          
19cb0 20 20 2f 2a 20 41 63 63 75 6d 75 6c 61 74 65 64    /* Accumulated
19cc0 20 74 65 78 74 20 66 6f 72 20 61 20 66 69 65 6c   text for a fiel
19cd0 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20 20  d */.  int n;   
19ce0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
19cf0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
19d00 20 7a 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c 6c   z */.  int nAll
19d10 6f 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 53  oc;         /* S
19d20 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20 66  pace allocated f
19d30 6f 72 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74 20  or z[] */.  int 
19d40 6e 4c 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20  nLine;          
19d50 2f 2a 20 43 75 72 72 65 6e 74 20 6c 69 6e 65 20  /* Current line 
19d60 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
19d70 62 4e 6f 74 46 69 72 73 74 3b 20 20 20 20 20 20  bNotFirst;      
19d80 2f 2a 20 54 72 75 65 20 69 66 20 6f 6e 65 20 6f  /* True if one o
19d90 72 20 6d 6f 72 65 20 62 79 74 65 73 20 61 6c 72  r more bytes alr
19da0 65 61 64 79 20 72 65 61 64 20 2a 2f 0a 20 20 69  eady read */.  i
19db0 6e 74 20 63 54 65 72 6d 3b 20 20 20 20 20 20 20  nt cTerm;       
19dc0 20 20 20 2f 2a 20 43 68 61 72 61 63 74 65 72 20     /* Character 
19dd0 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 64 20  that terminated 
19de0 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74 20  the most recent 
19df0 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 63  field */.  int c
19e00 43 6f 6c 53 65 70 3b 20 20 20 20 20 20 20 20 2f  ColSep;        /
19e10 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 73 65 70  * The column sep
19e20 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65 72  arator character
19e30 2e 20 20 28 55 73 75 61 6c 6c 79 20 22 2c 22 29  .  (Usually ",")
19e40 20 2a 2f 0a 20 20 69 6e 74 20 63 52 6f 77 53 65   */.  int cRowSe
19e50 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  p;        /* The
19e60 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 20 63   row separator c
19e70 68 61 72 61 63 74 65 72 2e 20 20 28 55 73 75 61  haracter.  (Usua
19e80 6c 6c 79 20 22 5c 6e 22 29 20 2a 2f 0a 7d 3b 0a  lly "\n") */.};.
19e90 0a 2f 2a 20 41 70 70 65 6e 64 20 61 20 73 69 6e  ./* Append a sin
19ea0 67 6c 65 20 62 79 74 65 20 74 6f 20 7a 5b 5d 20  gle byte to z[] 
19eb0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 69  */.static void i
19ec0 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61  mport_append_cha
19ed0 72 28 49 6d 70 6f 72 74 43 74 78 20 2a 70 2c 20  r(ImportCtx *p, 
19ee0 69 6e 74 20 63 29 7b 0a 20 20 69 66 28 20 70 2d  int c){.  if( p-
19ef0 3e 6e 2b 31 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63 20  >n+1>=p->nAlloc 
19f00 29 7b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63  ){.    p->nAlloc
19f10 20 2b 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 20 2b 20   += p->nAlloc + 
19f20 31 30 30 3b 0a 20 20 20 20 70 2d 3e 7a 20 3d 20  100;.    p->z = 
19f30 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36  sqlite3_realloc6
19f40 34 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c 6f  4(p->z, p->nAllo
19f50 63 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 7a  c);.    if( p->z
19f60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77  ==0 ){.      raw
19f70 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
19f80 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e  "out of memory\n
19f90 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28 31  ");.      exit(1
19fa0 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70  );.    }.  }.  p
19fb0 2d 3e 7a 5b 70 2d 3e 6e 2b 2b 5d 20 3d 20 28 63  ->z[p->n++] = (c
19fc0 68 61 72 29 63 3b 0a 7d 0a 0a 2f 2a 20 52 65 61  har)c;.}../* Rea
19fd0 64 20 61 20 73 69 6e 67 6c 65 20 66 69 65 6c 64  d a single field
19fe0 20 6f 66 20 43 53 56 20 74 65 78 74 2e 20 20 43   of CSV text.  C
19ff0 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20 72  ompatible with r
1a000 66 63 34 31 38 30 20 61 6e 64 20 65 78 74 65 6e  fc4180 and exten
1a010 64 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65 20  ded.** with the 
1a020 6f 70 74 69 6f 6e 20 6f 66 20 68 61 76 69 6e 67  option of having
1a030 20 61 20 73 65 70 61 72 61 74 6f 72 20 6f 74 68   a separator oth
1a040 65 72 20 74 68 61 6e 20 22 2c 22 2e 0a 2a 2a 0a  er than ","..**.
1a050 2a 2a 20 20 20 2b 20 20 49 6e 70 75 74 20 63 6f  **   +  Input co
1a060 6d 65 73 20 66 72 6f 6d 20 70 2d 3e 69 6e 2e 0a  mes from p->in..
1a070 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65 20 72 65  **   +  Store re
1a080 73 75 6c 74 73 20 69 6e 20 70 2d 3e 7a 20 6f 66  sults in p->z of
1a090 20 6c 65 6e 67 74 68 20 70 2d 3e 6e 2e 20 20 53   length p->n.  S
1a0a0 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 70 2d 3e  pace to hold p->
1a0b0 7a 20 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20  z comes.**      
1a0c0 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c  from sqlite3_mal
1a0d0 6c 6f 63 36 34 28 29 2e 0a 2a 2a 20 20 20 2b 20  loc64()..**   + 
1a0e0 20 55 73 65 20 70 2d 3e 63 53 65 70 20 61 73 20   Use p->cSep as 
1a0f0 74 68 65 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72  the column separ
1a100 61 74 6f 72 2e 20 20 54 68 65 20 64 65 66 61 75  ator.  The defau
1a110 6c 74 20 69 73 20 22 2c 22 2e 0a 2a 2a 20 20 20  lt is ","..**   
1a120 2b 20 20 55 73 65 20 70 2d 3e 72 53 65 70 20 61  +  Use p->rSep a
1a130 73 20 74 68 65 20 72 6f 77 20 73 65 70 61 72 61  s the row separa
1a140 74 6f 72 2e 20 20 54 68 65 20 64 65 66 61 75 6c  tor.  The defaul
1a150 74 20 69 73 20 22 5c 6e 22 2e 0a 2a 2a 20 20 20  t is "\n"..**   
1a160 2b 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66  +  Keep track of
1a170 20 74 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65 72   the line number
1a180 20 69 6e 20 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a   in p->nLine..**
1a190 20 20 20 2b 20 20 53 74 6f 72 65 20 74 68 65 20     +  Store the 
1a1a0 63 68 61 72 61 63 74 65 72 20 74 68 61 74 20 74  character that t
1a1b0 65 72 6d 69 6e 61 74 65 73 20 74 68 65 20 66 69  erminates the fi
1a1c0 65 6c 64 20 69 6e 20 70 2d 3e 63 54 65 72 6d 2e  eld in p->cTerm.
1a1d0 20 20 53 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20    Store.**      
1a1e0 45 4f 46 20 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69  EOF on end-of-fi
1a1f0 6c 65 2e 0a 2a 2a 20 20 20 2b 20 20 52 65 70 6f  le..**   +  Repo
1a200 72 74 20 73 79 6e 74 61 78 20 65 72 72 6f 72 73  rt syntax errors
1a210 20 6f 6e 20 73 74 64 65 72 72 0a 2a 2f 0a 73 74   on stderr.*/.st
1a220 61 74 69 63 20 63 68 61 72 20 2a 53 51 4c 49 54  atic char *SQLIT
1a230 45 5f 43 44 45 43 4c 20 63 73 76 5f 72 65 61 64  E_CDECL csv_read
1a240 5f 6f 6e 65 5f 66 69 65 6c 64 28 49 6d 70 6f 72  _one_field(Impor
1a250 74 43 74 78 20 2a 70 29 7b 0a 20 20 69 6e 74 20  tCtx *p){.  int 
1a260 63 3b 0a 20 20 69 6e 74 20 63 53 65 70 20 3d 20  c;.  int cSep = 
1a270 70 2d 3e 63 43 6f 6c 53 65 70 3b 0a 20 20 69 6e  p->cColSep;.  in
1a280 74 20 72 53 65 70 20 3d 20 70 2d 3e 63 52 6f 77  t rSep = p->cRow
1a290 53 65 70 3b 0a 20 20 70 2d 3e 6e 20 3d 20 30 3b  Sep;.  p->n = 0;
1a2a0 0a 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e  .  c = fgetc(p->
1a2b0 69 6e 29 3b 0a 20 20 69 66 28 20 63 3d 3d 45 4f  in);.  if( c==EO
1a2c0 46 20 7c 7c 20 73 65 65 6e 49 6e 74 65 72 72 75  F || seenInterru
1a2d0 70 74 20 29 7b 0a 20 20 20 20 70 2d 3e 63 54 65  pt ){.    p->cTe
1a2e0 72 6d 20 3d 20 45 4f 46 3b 0a 20 20 20 20 72 65  rm = EOF;.    re
1a2f0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
1a300 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20  ( c=='"' ){.    
1a310 69 6e 74 20 70 63 2c 20 70 70 63 3b 0a 20 20 20  int pc, ppc;.   
1a320 20 69 6e 74 20 73 74 61 72 74 4c 69 6e 65 20 3d   int startLine =
1a330 20 70 2d 3e 6e 4c 69 6e 65 3b 0a 20 20 20 20 69   p->nLine;.    i
1a340 6e 74 20 63 51 75 6f 74 65 20 3d 20 63 3b 0a 20  nt cQuote = c;. 
1a350 20 20 20 70 63 20 3d 20 70 70 63 20 3d 20 30 3b     pc = ppc = 0;
1a360 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20 29 7b  .    while( 1 ){
1a370 0a 20 20 20 20 20 20 63 20 3d 20 66 67 65 74 63  .      c = fgetc
1a380 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20 69  (p->in);.      i
1a390 66 28 20 63 3d 3d 72 53 65 70 20 29 20 70 2d 3e  f( c==rSep ) p->
1a3a0 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 69  nLine++;.      i
1a3b0 66 28 20 63 3d 3d 63 51 75 6f 74 65 20 29 7b 0a  f( c==cQuote ){.
1a3c0 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3d 3d          if( pc==
1a3d0 63 51 75 6f 74 65 20 29 7b 0a 20 20 20 20 20 20  cQuote ){.      
1a3e0 20 20 20 20 70 63 20 3d 20 30 3b 0a 20 20 20 20      pc = 0;.    
1a3f0 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
1a400 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1a410 7d 0a 20 20 20 20 20 20 69 66 28 20 28 63 3d 3d  }.      if( (c==
1a420 63 53 65 70 20 26 26 20 70 63 3d 3d 63 51 75 6f  cSep && pc==cQuo
1a430 74 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28 63  te).       || (c
1a440 3d 3d 72 53 65 70 20 26 26 20 70 63 3d 3d 63 51  ==rSep && pc==cQ
1a450 75 6f 74 65 29 0a 20 20 20 20 20 20 20 7c 7c 20  uote).       || 
1a460 28 63 3d 3d 72 53 65 70 20 26 26 20 70 63 3d 3d  (c==rSep && pc==
1a470 27 5c 72 27 20 26 26 20 70 70 63 3d 3d 63 51 75  '\r' && ppc==cQu
1a480 6f 74 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  ote).       || (
1a490 63 3d 3d 45 4f 46 20 26 26 20 70 63 3d 3d 63 51  c==EOF && pc==cQ
1a4a0 75 6f 74 65 29 0a 20 20 20 20 20 20 29 7b 0a 20  uote).      ){. 
1a4b0 20 20 20 20 20 20 20 64 6f 7b 20 70 2d 3e 6e 2d         do{ p->n-
1a4c0 2d 3b 20 7d 77 68 69 6c 65 28 20 70 2d 3e 7a 5b  -; }while( p->z[
1a4d0 70 2d 3e 6e 5d 21 3d 63 51 75 6f 74 65 20 29 3b  p->n]!=cQuote );
1a4e0 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 54 65 72  .        p->cTer
1a4f0 6d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 62  m = c;.        b
1a500 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
1a510 20 20 20 20 69 66 28 20 70 63 3d 3d 63 51 75 6f      if( pc==cQuo
1a520 74 65 20 26 26 20 63 21 3d 27 5c 72 27 20 29 7b  te && c!='\r' ){
1a530 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
1a540 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
1a550 3a 25 64 3a 20 75 6e 65 73 63 61 70 65 64 20 25  :%d: unescaped %
1a560 63 20 63 68 61 72 61 63 74 65 72 5c 6e 22 2c 0a  c character\n",.
1a570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a580 70 2d 3e 7a 46 69 6c 65 2c 20 70 2d 3e 6e 4c 69  p->zFile, p->nLi
1a590 6e 65 2c 20 63 51 75 6f 74 65 29 3b 0a 20 20 20  ne, cQuote);.   
1a5a0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
1a5b0 3d 3d 45 4f 46 20 29 7b 0a 20 20 20 20 20 20 20  ==EOF ){.       
1a5c0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
1a5d0 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 75 6e 74  err, "%s:%d: unt
1a5e0 65 72 6d 69 6e 61 74 65 64 20 25 63 2d 71 75 6f  erminated %c-quo
1a5f0 74 65 64 20 66 69 65 6c 64 5c 6e 22 2c 0a 20 20  ted field\n",.  
1a600 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 2d                p-
1a610 3e 7a 46 69 6c 65 2c 20 73 74 61 72 74 4c 69 6e  >zFile, startLin
1a620 65 2c 20 63 51 75 6f 74 65 29 3b 0a 20 20 20 20  e, cQuote);.    
1a630 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63      p->cTerm = c
1a640 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
1a650 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
1a660 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61  mport_append_cha
1a670 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20 20 70  r(p, c);.      p
1a680 70 63 20 3d 20 70 63 3b 0a 20 20 20 20 20 20 70  pc = pc;.      p
1a690 63 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = c;.    }.  }
1a6a0 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66 20  else{.    /* If 
1a6b0 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
1a6c0 74 20 66 69 65 6c 64 20 62 65 69 6e 67 20 70 61  t field being pa
1a6d0 72 73 65 64 20 61 6e 64 20 69 74 20 62 65 67 69  rsed and it begi
1a6e0 6e 73 20 77 69 74 68 20 74 68 65 0a 20 20 20 20  ns with the.    
1a6f0 2a 2a 20 55 54 46 2d 38 20 42 4f 4d 20 20 28 30  ** UTF-8 BOM  (0
1a700 78 45 46 20 42 42 20 42 46 29 20 74 68 65 6e 20  xEF BB BF) then 
1a710 73 6b 69 70 20 74 68 65 20 42 4f 4d 20 2a 2f 0a  skip the BOM */.
1a720 20 20 20 20 69 66 28 20 28 63 26 30 78 66 66 29      if( (c&0xff)
1a730 3d 3d 30 78 65 66 20 26 26 20 70 2d 3e 62 4e 6f  ==0xef && p->bNo
1a740 74 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20 20  tFirst==0 ){.   
1a750 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64     import_append
1a760 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20 20  _char(p, c);.   
1a770 20 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d 3e     c = fgetc(p->
1a780 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 28  in);.      if( (
1a790 63 26 30 78 66 66 29 3d 3d 30 78 62 62 20 29 7b  c&0xff)==0xbb ){
1a7a0 0a 20 20 20 20 20 20 20 20 69 6d 70 6f 72 74 5f  .        import_
1a7b0 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20 63  append_char(p, c
1a7c0 29 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 66  );.        c = f
1a7d0 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20  getc(p->in);.   
1a7e0 20 20 20 20 20 69 66 28 20 28 63 26 30 78 66 66       if( (c&0xff
1a7f0 29 3d 3d 30 78 62 66 20 29 7b 0a 20 20 20 20 20  )==0xbf ){.     
1a800 20 20 20 20 20 70 2d 3e 62 4e 6f 74 46 69 72 73       p->bNotFirs
1a810 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  t = 1;.         
1a820 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20 20   p->n = 0;.     
1a830 20 20 20 20 20 72 65 74 75 72 6e 20 63 73 76 5f       return csv_
1a840 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 28 70  read_one_field(p
1a850 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
1a860 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 77     }.    }.    w
1a870 68 69 6c 65 28 20 63 21 3d 45 4f 46 20 26 26 20  hile( c!=EOF && 
1a880 63 21 3d 63 53 65 70 20 26 26 20 63 21 3d 72 53  c!=cSep && c!=rS
1a890 65 70 20 29 7b 0a 20 20 20 20 20 20 69 6d 70 6f  ep ){.      impo
1a8a0 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70  rt_append_char(p
1a8b0 2c 20 63 29 3b 0a 20 20 20 20 20 20 63 20 3d 20  , c);.      c = 
1a8c0 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20  fgetc(p->in);.  
1a8d0 20 20 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d 72    }.    if( c==r
1a8e0 53 65 70 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  Sep ){.      p->
1a8f0 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20 69  nLine++;.      i
1a900 66 28 20 70 2d 3e 6e 3e 30 20 26 26 20 70 2d 3e  f( p->n>0 && p->
1a910 7a 5b 70 2d 3e 6e 2d 31 5d 3d 3d 27 5c 72 27 20  z[p->n-1]=='\r' 
1a920 29 20 70 2d 3e 6e 2d 2d 3b 0a 20 20 20 20 7d 0a  ) p->n--;.    }.
1a930 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20 63      p->cTerm = c
1a940 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e 7a  ;.  }.  if( p->z
1a950 20 29 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20   ) p->z[p->n] = 
1a960 30 3b 0a 20 20 70 2d 3e 62 4e 6f 74 46 69 72 73  0;.  p->bNotFirs
1a970 74 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e 20  t = 1;.  return 
1a980 70 2d 3e 7a 3b 0a 7d 0a 0a 2f 2a 20 52 65 61 64  p->z;.}../* Read
1a990 20 61 20 73 69 6e 67 6c 65 20 66 69 65 6c 64 20   a single field 
1a9a0 6f 66 20 41 53 43 49 49 20 64 65 6c 69 6d 69 74  of ASCII delimit
1a9b0 65 64 20 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20 20  ed text..**.**  
1a9c0 20 2b 20 20 49 6e 70 75 74 20 63 6f 6d 65 73 20   +  Input comes 
1a9d0 66 72 6f 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a 20 20  from p->in..**  
1a9e0 20 2b 20 20 53 74 6f 72 65 20 72 65 73 75 6c 74   +  Store result
1a9f0 73 20 69 6e 20 70 2d 3e 7a 20 6f 66 20 6c 65 6e  s in p->z of len
1aa00 67 74 68 20 70 2d 3e 6e 2e 20 20 53 70 61 63 65  gth p->n.  Space
1aa10 20 74 6f 20 68 6f 6c 64 20 70 2d 3e 7a 20 63 6f   to hold p->z co
1aa20 6d 65 73 0a 2a 2a 20 20 20 20 20 20 66 72 6f 6d  mes.**      from
1aa30 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
1aa40 34 28 29 2e 0a 2a 2a 20 20 20 2b 20 20 55 73 65  4()..**   +  Use
1aa50 20 70 2d 3e 63 53 65 70 20 61 73 20 74 68 65 20   p->cSep as the 
1aa60 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72  column separator
1aa70 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20 69  .  The default i
1aa80 73 20 22 5c 78 31 46 22 2e 0a 2a 2a 20 20 20 2b  s "\x1F"..**   +
1aa90 20 20 55 73 65 20 70 2d 3e 72 53 65 70 20 61 73    Use p->rSep as
1aaa0 20 74 68 65 20 72 6f 77 20 73 65 70 61 72 61 74   the row separat
1aab0 6f 72 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74  or.  The default
1aac0 20 69 73 20 22 5c 78 31 45 22 2e 0a 2a 2a 20 20   is "\x1E"..**  
1aad0 20 2b 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f   +  Keep track o
1aae0 66 20 74 68 65 20 72 6f 77 20 6e 75 6d 62 65 72  f the row number
1aaf0 20 69 6e 20 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a 2a   in p->nLine..**
1ab00 20 20 20 2b 20 20 53 74 6f 72 65 20 74 68 65 20     +  Store the 
1ab10 63 68 61 72 61 63 74 65 72 20 74 68 61 74 20 74  character that t
1ab20 65 72 6d 69 6e 61 74 65 73 20 74 68 65 20 66 69  erminates the fi
1ab30 65 6c 64 20 69 6e 20 70 2d 3e 63 54 65 72 6d 2e  eld in p->cTerm.
1ab40 20 20 53 74 6f 72 65 0a 2a 2a 20 20 20 20 20 20    Store.**      
1ab50 45 4f 46 20 6f 6e 20 65 6e 64 2d 6f 66 2d 66 69  EOF on end-of-fi
1ab60 6c 65 2e 0a 2a 2a 20 20 20 2b 20 20 52 65 70 6f  le..**   +  Repo
1ab70 72 74 20 73 79 6e 74 61 78 20 65 72 72 6f 72 73  rt syntax errors
1ab80 20 6f 6e 20 73 74 64 65 72 72 0a 2a 2f 0a 73 74   on stderr.*/.st
1ab90 61 74 69 63 20 63 68 61 72 20 2a 53 51 4c 49 54  atic char *SQLIT
1aba0 45 5f 43 44 45 43 4c 20 61 73 63 69 69 5f 72 65  E_CDECL ascii_re
1abb0 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 28 49 6d 70  ad_one_field(Imp
1abc0 6f 72 74 43 74 78 20 2a 70 29 7b 0a 20 20 69 6e  ortCtx *p){.  in
1abd0 74 20 63 3b 0a 20 20 69 6e 74 20 63 53 65 70 20  t c;.  int cSep 
1abe0 3d 20 70 2d 3e 63 43 6f 6c 53 65 70 3b 0a 20 20  = p->cColSep;.  
1abf0 69 6e 74 20 72 53 65 70 20 3d 20 70 2d 3e 63 52  int rSep = p->cR
1ac00 6f 77 53 65 70 3b 0a 20 20 70 2d 3e 6e 20 3d 20  owSep;.  p->n = 
1ac10 30 3b 0a 20 20 63 20 3d 20 66 67 65 74 63 28 70  0;.  c = fgetc(p
1ac20 2d 3e 69 6e 29 3b 0a 20 20 69 66 28 20 63 3d 3d  ->in);.  if( c==
1ac30 45 4f 46 20 7c 7c 20 73 65 65 6e 49 6e 74 65 72  EOF || seenInter
1ac40 72 75 70 74 20 29 7b 0a 20 20 20 20 70 2d 3e 63  rupt ){.    p->c
1ac50 54 65 72 6d 20 3d 20 45 4f 46 3b 0a 20 20 20 20  Term = EOF;.    
1ac60 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
1ac70 77 68 69 6c 65 28 20 63 21 3d 45 4f 46 20 26 26  while( c!=EOF &&
1ac80 20 63 21 3d 63 53 65 70 20 26 26 20 63 21 3d 72   c!=cSep && c!=r
1ac90 53 65 70 20 29 7b 0a 20 20 20 20 69 6d 70 6f 72  Sep ){.    impor
1aca0 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c  t_append_char(p,
1acb0 20 63 29 3b 0a 20 20 20 20 63 20 3d 20 66 67 65   c);.    c = fge
1acc0 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 7d 0a 20  tc(p->in);.  }. 
1acd0 20 69 66 28 20 63 3d 3d 72 53 65 70 20 29 7b 0a   if( c==rSep ){.
1ace0 20 20 20 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b 0a      p->nLine++;.
1acf0 20 20 7d 0a 20 20 70 2d 3e 63 54 65 72 6d 20 3d    }.  p->cTerm =
1ad00 20 63 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 20 29   c;.  if( p->z )
1ad10 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 30 3b   p->z[p->n] = 0;
1ad20 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 7a 3b 0a  .  return p->z;.
1ad30 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  }../*.** Try to 
1ad40 74 72 61 6e 73 66 65 72 20 64 61 74 61 20 66 6f  transfer data fo
1ad50 72 20 74 61 62 6c 65 20 7a 54 61 62 6c 65 2e 20  r table zTable. 
1ad60 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73 20   If an error is 
1ad70 73 65 65 6e 20 77 68 69 6c 65 0a 2a 2a 20 6d 6f  seen while.** mo
1ad80 76 69 6e 67 20 66 6f 72 77 61 72 64 2c 20 74 72  ving forward, tr
1ad90 79 20 74 6f 20 67 6f 20 62 61 63 6b 77 61 72 64  y to go backward
1ada0 73 2e 20 20 54 68 65 20 62 61 63 6b 77 61 72 64  s.  The backward
1adb0 73 20 6d 6f 76 65 6d 65 6e 74 20 77 6f 6e 27 74  s movement won't
1adc0 0a 2a 2a 20 77 6f 72 6b 20 66 6f 72 20 57 49 54  .** work for WIT
1add0 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c 65  HOUT ROWID table
1ade0 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
1adf0 64 20 74 72 79 54 6f 43 6c 6f 6e 65 44 61 74 61  d tryToCloneData
1ae00 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  (.  ShellState *
1ae10 70 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a 6e 65  p,.  sqlite3 *ne
1ae20 77 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  wDb,.  const cha
1ae30 72 20 2a 7a 54 61 62 6c 65 0a 29 7b 0a 20 20 73  r *zTable.){.  s
1ae40 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 51 75  qlite3_stmt *pQu
1ae50 65 72 79 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  ery = 0;.  sqlit
1ae60 65 33 5f 73 74 6d 74 20 2a 70 49 6e 73 65 72 74  e3_stmt *pInsert
1ae70 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 51   = 0;.  char *zQ
1ae80 75 65 72 79 20 3d 20 30 3b 0a 20 20 63 68 61 72  uery = 0;.  char
1ae90 20 2a 7a 49 6e 73 65 72 74 20 3d 20 30 3b 0a 20   *zInsert = 0;. 
1aea0 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20 69   int rc;.  int i
1aeb0 2c 20 6a 2c 20 6e 3b 0a 20 20 69 6e 74 20 6e 54  , j, n;.  int nT
1aec0 61 62 6c 65 20 3d 20 28 69 6e 74 29 73 74 72 6c  able = (int)strl
1aed0 65 6e 28 7a 54 61 62 6c 65 29 3b 0a 20 20 69 6e  en(zTable);.  in
1aee0 74 20 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20 63  t k = 0;.  int c
1aef0 6e 74 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74 20  nt = 0;.  const 
1af00 69 6e 74 20 73 70 69 6e 52 61 74 65 20 3d 20 31  int spinRate = 1
1af10 30 30 30 30 3b 0a 0a 20 20 7a 51 75 65 72 79 20  0000;..  zQuery 
1af20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1af30 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  f("SELECT * FROM
1af40 20 5c 22 25 77 5c 22 22 2c 20 7a 54 61 62 6c 65   \"%w\"", zTable
1af50 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65  );.  rc = sqlite
1af60 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
1af70 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c 20  db, zQuery, -1, 
1af80 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 69  &pQuery, 0);.  i
1af90 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66  f( rc ){.    utf
1afa0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
1afb0 20 22 45 72 72 6f 72 20 25 64 3a 20 25 73 20 6f   "Error %d: %s o
1afc0 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20  n [%s]\n",.     
1afd0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
1afe0 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65 28  xtended_errcode(
1aff0 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65 33 5f  p->db), sqlite3_
1b000 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c 0a 20  errmsg(p->db),. 
1b010 20 20 20 20 20 20 20 20 20 20 20 7a 51 75 65 72             zQuer
1b020 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64  y);.    goto end
1b030 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20 20 7d 0a  _data_xfer;.  }.
1b040 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f    n = sqlite3_co
1b050 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 51 75 65 72  lumn_count(pQuer
1b060 79 29 3b 0a 20 20 7a 49 6e 73 65 72 74 20 3d 20  y);.  zInsert = 
1b070 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34  sqlite3_malloc64
1b080 28 32 30 30 20 2b 20 6e 54 61 62 6c 65 20 2b 20  (200 + nTable + 
1b090 6e 2a 33 29 3b 0a 20 20 69 66 28 20 7a 49 6e 73  n*3);.  if( zIns
1b0a0 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61  ert==0 ){.    ra
1b0b0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
1b0c0 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c   "out of memory\
1b0d0 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  n");.    goto en
1b0e0 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20 20 7d  d_data_xfer;.  }
1b0f0 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69  .  sqlite3_snpri
1b100 6e 74 66 28 32 30 30 2b 6e 54 61 62 6c 65 2c 7a  ntf(200+nTable,z
1b110 49 6e 73 65 72 74 2c 0a 20 20 20 20 20 20 20 20  Insert,.        
1b120 20 20 20 20 20 20 20 20 20 20 20 22 49 4e 53 45             "INSE
1b130 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e 54  RT OR IGNORE INT
1b140 4f 20 5c 22 25 73 5c 22 20 56 41 4c 55 45 53 28  O \"%s\" VALUES(
1b150 3f 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 69  ?", zTable);.  i
1b160 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a   = (int)strlen(z
1b170 49 6e 73 65 72 74 29 3b 0a 20 20 66 6f 72 28 6a  Insert);.  for(j
1b180 3d 31 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29 7b 0a 20  =1; j<n; j++){. 
1b190 20 20 20 6d 65 6d 63 70 79 28 7a 49 6e 73 65 72     memcpy(zInser
1b1a0 74 2b 69 2c 20 22 2c 3f 22 2c 20 32 29 3b 0a 20  t+i, ",?", 2);. 
1b1b0 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 7d 0a 20     i += 2;.  }. 
1b1c0 20 6d 65 6d 63 70 79 28 7a 49 6e 73 65 72 74 2b   memcpy(zInsert+
1b1d0 69 2c 20 22 29 3b 22 2c 20 33 29 3b 0a 20 20 72  i, ");", 3);.  r
1b1e0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
1b1f0 61 72 65 5f 76 32 28 6e 65 77 44 62 2c 20 7a 49  are_v2(newDb, zI
1b200 6e 73 65 72 74 2c 20 2d 31 2c 20 26 70 49 6e 73  nsert, -1, &pIns
1b210 65 72 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 72  ert, 0);.  if( r
1b220 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  c ){.    utf8_pr
1b230 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
1b240 72 6f 72 20 25 64 3a 20 25 73 20 6f 6e 20 5b 25  ror %d: %s on [%
1b250 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  s]\n",.         
1b260 20 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e     sqlite3_exten
1b270 64 65 64 5f 65 72 72 63 6f 64 65 28 6e 65 77 44  ded_errcode(newD
1b280 62 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  b), sqlite3_errm
1b290 73 67 28 6e 65 77 44 62 29 2c 0a 20 20 20 20 20  sg(newDb),.     
1b2a0 20 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a         zQuery);.
1b2b0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 64 61 74      goto end_dat
1b2c0 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20 66 6f  a_xfer;.  }.  fo
1b2d0 72 28 6b 3d 30 3b 20 6b 3c 32 3b 20 6b 2b 2b 29  r(k=0; k<2; k++)
1b2e0 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72 63  {.    while( (rc
1b2f0 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28   = sqlite3_step(
1b300 70 51 75 65 72 79 29 29 3d 3d 53 51 4c 49 54 45  pQuery))==SQLITE
1b310 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 66 6f  _ROW ){.      fo
1b320 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 29  r(i=0; i<n; i++)
1b330 7b 0a 20 20 20 20 20 20 20 20 73 77 69 74 63 68  {.        switch
1b340 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  ( sqlite3_column
1b350 5f 74 79 70 65 28 70 51 75 65 72 79 2c 20 69 29  _type(pQuery, i)
1b360 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 61   ){.          ca
1b370 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a 20  se SQLITE_NULL: 
1b380 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
1b390 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28  lite3_bind_null(
1b3a0 70 49 6e 73 65 72 74 2c 20 69 2b 31 29 3b 0a 20  pInsert, i+1);. 
1b3b0 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1b3c0 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1b3d0 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
1b3e0 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20  ITE_INTEGER: {. 
1b3f0 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1b400 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70 49  e3_bind_int64(pI
1b410 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69  nsert, i+1, sqli
1b420 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36 34  te3_column_int64
1b430 28 70 51 75 65 72 79 2c 69 29 29 3b 0a 20 20 20  (pQuery,i));.   
1b440 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
1b450 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1b460 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
1b470 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20 20  E_FLOAT: {.     
1b480 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
1b490 69 6e 64 5f 64 6f 75 62 6c 65 28 70 49 6e 73 65  ind_double(pInse
1b4a0 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33  rt, i+1, sqlite3
1b4b0 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70  _column_double(p
1b4c0 51 75 65 72 79 2c 69 29 29 3b 0a 20 20 20 20 20  Query,i));.     
1b4d0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
1b4e0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1b4f0 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1b500 54 45 58 54 3a 20 7b 0a 20 20 20 20 20 20 20 20  TEXT: {.        
1b510 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
1b520 5f 74 65 78 74 28 70 49 6e 73 65 72 74 2c 20 69  _text(pInsert, i
1b530 2b 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  +1,.            
1b540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b550 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
1b560 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
1b570 74 28 70 51 75 65 72 79 2c 69 29 2c 0a 20 20 20  t(pQuery,i),.   
1b580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b590 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 53 51            -1, SQ
1b5a0 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
1b5b0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1b5c0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1b5d0 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
1b5e0 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TE_BLOB: {.     
1b5f0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62         sqlite3_b
1b600 69 6e 64 5f 62 6c 6f 62 28 70 49 6e 73 65 72 74  ind_blob(pInsert
1b610 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f 63  , i+1, sqlite3_c
1b620 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 51 75 65 72  olumn_blob(pQuer
1b630 79 2c 69 29 2c 0a 20 20 20 20 20 20 20 20 20 20  y,i),.          
1b640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b660 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e    sqlite3_column
1b670 5f 62 79 74 65 73 28 70 51 75 65 72 79 2c 69 29  _bytes(pQuery,i)
1b680 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1b690 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b6a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51                SQ
1b6b0 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20  LITE_STATIC);.  
1b6c0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1b6d0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1b6e0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f       }.      } /
1b6f0 2a 20 45 6e 64 20 66 6f 72 20 2a 2f 0a 20 20 20  * End for */.   
1b700 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
1b710 73 74 65 70 28 70 49 6e 73 65 72 74 29 3b 0a 20  step(pInsert);. 
1b720 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
1b730 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53 51  ITE_OK && rc!=SQ
1b740 4c 49 54 45 5f 52 4f 57 20 26 26 20 72 63 21 3d  LITE_ROW && rc!=
1b750 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20  SQLITE_DONE ){. 
1b760 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
1b770 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
1b780 72 20 25 64 3a 20 25 73 5c 6e 22 2c 20 73 71 6c  r %d: %s\n", sql
1b790 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72  ite3_extended_er
1b7a0 72 63 6f 64 65 28 6e 65 77 44 62 29 2c 0a 20 20  rcode(newDb),.  
1b7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7c0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72        sqlite3_er
1b7d0 72 6d 73 67 28 6e 65 77 44 62 29 29 3b 0a 20 20  rmsg(newDb));.  
1b7e0 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1b7f0 74 65 33 5f 72 65 73 65 74 28 70 49 6e 73 65 72  te3_reset(pInser
1b800 74 29 3b 0a 20 20 20 20 20 20 63 6e 74 2b 2b 3b  t);.      cnt++;
1b810 0a 20 20 20 20 20 20 69 66 28 20 28 63 6e 74 25  .      if( (cnt%
1b820 73 70 69 6e 52 61 74 65 29 3d 3d 30 20 29 7b 0a  spinRate)==0 ){.
1b830 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22          printf("
1b840 25 63 5c 62 22 2c 20 22 7c 2f 2d 5c 5c 22 5b 28  %c\b", "|/-\\"[(
1b850 63 6e 74 2f 73 70 69 6e 52 61 74 65 29 25 34 5d  cnt/spinRate)%4]
1b860 29 3b 0a 20 20 20 20 20 20 20 20 66 66 6c 75 73  );.        fflus
1b870 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20  h(stdout);.     
1b880 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20   }.    } /* End 
1b890 77 68 69 6c 65 20 2a 2f 0a 20 20 20 20 69 66 28  while */.    if(
1b8a0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
1b8b0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73 71   ) break;.    sq
1b8c0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
1b8d0 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69  Query);.    sqli
1b8e0 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29  te3_free(zQuery)
1b8f0 3b 0a 20 20 20 20 7a 51 75 65 72 79 20 3d 20 73  ;.    zQuery = s
1b900 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1b910 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c 22  SELECT * FROM \"
1b920 25 77 5c 22 20 4f 52 44 45 52 20 42 59 20 72 6f  %w\" ORDER BY ro
1b930 77 69 64 20 44 45 53 43 3b 22 2c 0a 20 20 20 20  wid DESC;",.    
1b940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b950 20 20 20 20 20 20 20 20 20 7a 54 61 62 6c 65 29           zTable)
1b960 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
1b970 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
1b980 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c  >db, zQuery, -1,
1b990 20 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20   &pQuery, 0);.  
1b9a0 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
1b9b0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
1b9c0 64 65 72 72 2c 20 22 57 61 72 6e 69 6e 67 3a 20  derr, "Warning: 
1b9d0 63 61 6e 6e 6f 74 20 73 74 65 70 20 5c 22 25 73  cannot step \"%s
1b9e0 5c 22 20 62 61 63 6b 77 61 72 64 73 22 2c 20 7a  \" backwards", z
1b9f0 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62 72  Table);.      br
1ba00 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 20 2f  eak;.    }.  } /
1ba10 2a 20 45 6e 64 20 66 6f 72 28 6b 3d 30 2e 2e 2e  * End for(k=0...
1ba20 29 20 2a 2f 0a 0a 65 6e 64 5f 64 61 74 61 5f 78  ) */..end_data_x
1ba30 66 65 72 3a 0a 20 20 73 71 6c 69 74 65 33 5f 66  fer:.  sqlite3_f
1ba40 69 6e 61 6c 69 7a 65 28 70 51 75 65 72 79 29 3b  inalize(pQuery);
1ba50 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
1ba60 69 7a 65 28 70 49 6e 73 65 72 74 29 3b 0a 20 20  ize(pInsert);.  
1ba70 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75  sqlite3_free(zQu
1ba80 65 72 79 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f  ery);.  sqlite3_
1ba90 66 72 65 65 28 7a 49 6e 73 65 72 74 29 3b 0a 7d  free(zInsert);.}
1baa0 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f 20  .../*.** Try to 
1bab0 74 72 61 6e 73 66 65 72 20 61 6c 6c 20 72 6f 77  transfer all row
1bac0 73 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61 20  s of the schema 
1bad0 74 68 61 74 20 6d 61 74 63 68 20 7a 57 68 65 72  that match zWher
1bae0 65 2e 20 20 46 6f 72 0a 2a 2a 20 65 61 63 68 20  e.  For.** each 
1baf0 72 6f 77 2c 20 69 6e 76 6f 6b 65 20 78 46 6f 72  row, invoke xFor
1bb00 45 61 63 68 28 29 20 6f 6e 20 74 68 65 20 6f 62  Each() on the ob
1bb10 6a 65 63 74 20 64 65 66 69 6e 65 64 20 62 79 20  ject defined by 
1bb20 74 68 61 74 20 72 6f 77 2e 0a 2a 2a 20 49 66 20  that row..** If 
1bb30 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63 6f  an error is enco
1bb40 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20 6d 6f  untered while mo
1bb50 76 69 6e 67 20 66 6f 72 77 61 72 64 20 74 68 72  ving forward thr
1bb60 6f 75 67 68 20 74 68 65 0a 2a 2a 20 73 71 6c 69  ough the.** sqli
1bb70 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65 2c  te_master table,
1bb80 20 74 72 79 20 61 67 61 69 6e 20 6d 6f 76 69 6e   try again movin
1bb90 67 20 62 61 63 6b 77 61 72 64 73 2e 0a 2a 2f 0a  g backwards..*/.
1bba0 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 79 54  static void tryT
1bbb0 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 0a 20 20  oCloneSchema(.  
1bbc0 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20  ShellState *p,. 
1bbd0 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62 2c   sqlite3 *newDb,
1bbe0 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1bbf0 57 68 65 72 65 2c 0a 20 20 76 6f 69 64 20 28 2a  Where,.  void (*
1bc00 78 46 6f 72 45 61 63 68 29 28 53 68 65 6c 6c 53  xForEach)(ShellS
1bc10 74 61 74 65 2a 2c 73 71 6c 69 74 65 33 2a 2c 63  tate*,sqlite3*,c
1bc20 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a 20  onst char*).){. 
1bc30 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1bc40 51 75 65 72 79 20 3d 20 30 3b 0a 20 20 63 68 61  Query = 0;.  cha
1bc50 72 20 2a 7a 51 75 65 72 79 20 3d 20 30 3b 0a 20  r *zQuery = 0;. 
1bc60 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73 74   int rc;.  const
1bc70 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a   unsigned char *
1bc80 7a 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20 75  zName;.  const u
1bc90 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a 53  nsigned char *zS
1bca0 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  ql;.  char *zErr
1bcb0 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 7a 51 75 65  Msg = 0;..  zQue
1bcc0 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ry = sqlite3_mpr
1bcd0 69 6e 74 66 28 22 53 45 4c 45 43 54 20 6e 61 6d  intf("SELECT nam
1bce0 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69  e, sql FROM sqli
1bcf0 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20  te_master".     
1bd00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bd10 20 20 20 20 20 20 22 20 57 48 45 52 45 20 25 73        " WHERE %s
1bd20 22 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 72 63  ", zWhere);.  rc
1bd30 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61   = sqlite3_prepa
1bd40 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51 75  re_v2(p->db, zQu
1bd50 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72 79  ery, -1, &pQuery
1bd60 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20 29  , 0);.  if( rc )
1bd70 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
1bd80 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
1bd90 3a 20 28 25 64 29 20 25 73 20 6f 6e 20 5b 25 73  : (%d) %s on [%s
1bda0 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ]\n",.          
1bdb0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
1bdc0 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f  3_extended_errco
1bdd0 64 65 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74  de(p->db), sqlit
1bde0 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
1bdf0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1be00 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a 20        zQuery);. 
1be10 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 63 68 65     goto end_sche
1be20 6d 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20 77  ma_xfer;.  }.  w
1be30 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69  hile( (rc = sqli
1be40 74 65 33 5f 73 74 65 70 28 70 51 75 65 72 79 29  te3_step(pQuery)
1be50 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
1be60 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71 6c  .    zName = sql
1be70 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
1be80 28 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20 20  (pQuery, 0);.   
1be90 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
1bea0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75 65  column_text(pQue
1beb0 72 79 2c 20 31 29 3b 0a 20 20 20 20 70 72 69 6e  ry, 1);.    prin
1bec0 74 66 28 22 25 73 2e 2e 2e 20 22 2c 20 7a 4e 61  tf("%s... ", zNa
1bed0 6d 65 29 3b 20 66 66 6c 75 73 68 28 73 74 64 6f  me); fflush(stdo
1bee0 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  ut);.    sqlite3
1bef0 5f 65 78 65 63 28 6e 65 77 44 62 2c 20 28 63 6f  _exec(newDb, (co
1bf00 6e 73 74 20 63 68 61 72 2a 29 7a 53 71 6c 2c 20  nst char*)zSql, 
1bf10 30 2c 20 30 2c 20 26 7a 45 72 72 4d 73 67 29 3b  0, 0, &zErrMsg);
1bf20 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73 67  .    if( zErrMsg
1bf30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
1bf40 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
1bf50 72 72 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a 20 5b  rror: %s\nSQL: [
1bf60 25 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 2c  %s]\n", zErrMsg,
1bf70 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 73 71   zSql);.      sq
1bf80 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
1bf90 73 67 29 3b 0a 20 20 20 20 20 20 7a 45 72 72 4d  sg);.      zErrM
1bfa0 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20  sg = 0;.    }.  
1bfb0 20 20 69 66 28 20 78 46 6f 72 45 61 63 68 20 29    if( xForEach )
1bfc0 7b 0a 20 20 20 20 20 20 78 46 6f 72 45 61 63 68  {.      xForEach
1bfd0 28 70 2c 20 6e 65 77 44 62 2c 20 28 63 6f 6e 73  (p, newDb, (cons
1bfe0 74 20 63 68 61 72 2a 29 7a 4e 61 6d 65 29 3b 0a  t char*)zName);.
1bff0 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6e 74 66      }.    printf
1c000 28 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20 7d 0a  ("done\n");.  }.
1c010 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45    if( rc!=SQLITE
1c020 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 73 71 6c  _DONE ){.    sql
1c030 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 51  ite3_finalize(pQ
1c040 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69 74  uery);.    sqlit
1c050 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29 3b  e3_free(zQuery);
1c060 0a 20 20 20 20 7a 51 75 65 72 79 20 3d 20 73 71  .    zQuery = sq
1c070 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
1c080 45 4c 45 43 54 20 6e 61 6d 65 2c 20 73 71 6c 20  ELECT name, sql 
1c090 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
1c0a0 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  er".            
1c0b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c0c0 20 22 20 57 48 45 52 45 20 25 73 20 4f 52 44 45   " WHERE %s ORDE
1c0d0 52 20 42 59 20 72 6f 77 69 64 20 44 45 53 43 22  R BY rowid DESC"
1c0e0 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20 72  , zWhere);.    r
1c0f0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
1c100 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51  are_v2(p->db, zQ
1c110 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72  uery, -1, &pQuer
1c120 79 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 72  y, 0);.    if( r
1c130 63 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  c ){.      utf8_
1c140 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1c150 45 72 72 6f 72 3a 20 28 25 64 29 20 25 73 20 6f  Error: (%d) %s o
1c160 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20  n [%s]\n",.     
1c170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c180 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64 65   sqlite3_extende
1c190 64 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62 29  d_errcode(p->db)
1c1a0 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
1c1b0 28 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20 20  (p->db),.       
1c1c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a                 z
1c1d0 51 75 65 72 79 29 3b 0a 20 20 20 20 20 20 67 6f  Query);.      go
1c1e0 74 6f 20 65 6e 64 5f 73 63 68 65 6d 61 5f 78 66  to end_schema_xf
1c1f0 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68  er;.    }.    wh
1c200 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74  ile( (rc = sqlit
1c210 65 33 5f 73 74 65 70 28 70 51 75 65 72 79 29 29  e3_step(pQuery))
1c220 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
1c230 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71        zName = sq
1c240 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
1c250 74 28 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20  t(pQuery, 0);.  
1c260 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
1c270 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
1c280 51 75 65 72 79 2c 20 31 29 3b 0a 20 20 20 20 20  Query, 1);.     
1c290 20 70 72 69 6e 74 66 28 22 25 73 2e 2e 2e 20 22   printf("%s... "
1c2a0 2c 20 7a 4e 61 6d 65 29 3b 20 66 66 6c 75 73 68  , zName); fflush
1c2b0 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20 20  (stdout);.      
1c2c0 73 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77  sqlite3_exec(new
1c2d0 44 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  Db, (const char*
1c2e0 29 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a 45  )zSql, 0, 0, &zE
1c2f0 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 69 66  rrMsg);.      if
1c300 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ( zErrMsg ){.   
1c310 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
1c320 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
1c330 20 25 73 5c 6e 53 51 4c 3a 20 5b 25 73 5d 5c 6e   %s\nSQL: [%s]\n
1c340 22 2c 20 7a 45 72 72 4d 73 67 2c 20 7a 53 71 6c  ", zErrMsg, zSql
1c350 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
1c360 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
1c370 3b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 4d 73  ;.        zErrMs
1c380 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  g = 0;.      }. 
1c390 20 20 20 20 20 69 66 28 20 78 46 6f 72 45 61 63       if( xForEac
1c3a0 68 20 29 7b 0a 20 20 20 20 20 20 20 20 78 46 6f  h ){.        xFo
1c3b0 72 45 61 63 68 28 70 2c 20 6e 65 77 44 62 2c 20  rEach(p, newDb, 
1c3c0 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 4e 61  (const char*)zNa
1c3d0 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  me);.      }.   
1c3e0 20 20 20 70 72 69 6e 74 66 28 22 64 6f 6e 65 5c     printf("done\
1c3f0 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 65  n");.    }.  }.e
1c400 6e 64 5f 73 63 68 65 6d 61 5f 78 66 65 72 3a 0a  nd_schema_xfer:.
1c410 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
1c420 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20 73 71  ze(pQuery);.  sq
1c430 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72  lite3_free(zQuer
1c440 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70 65  y);.}../*.** Ope
1c450 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73 65  n a new database
1c460 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 7a 4e 65   file named "zNe
1c470 77 44 62 22 2e 20 20 54 72 79 20 74 6f 20 72 65  wDb".  Try to re
1c480 63 6f 76 65 72 20 61 73 20 6d 75 63 68 20 69 6e  cover as much in
1c490 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 61 73 20  formation.** as 
1c4a0 70 6f 73 73 69 62 6c 65 20 6f 75 74 20 6f 66 20  possible out of 
1c4b0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
1c4c0 65 20 28 77 68 69 63 68 20 6d 69 67 68 74 20 62  e (which might b
1c4d0 65 20 63 6f 72 72 75 70 74 29 20 61 6e 64 20 77  e corrupt) and w
1c4e0 72 69 74 65 20 69 74 0a 2a 2a 20 69 6e 74 6f 20  rite it.** into 
1c4f0 7a 4e 65 77 44 62 2e 0a 2a 2f 0a 73 74 61 74 69  zNewDb..*/.stati
1c500 63 20 76 6f 69 64 20 74 72 79 54 6f 43 6c 6f 6e  c void tryToClon
1c510 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c  e(ShellState *p,
1c520 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 65   const char *zNe
1c530 77 44 62 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a  wDb){.  int rc;.
1c540 20 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62    sqlite3 *newDb
1c550 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 63 63 65   = 0;.  if( acce
1c560 73 73 28 7a 4e 65 77 44 62 2c 30 29 3d 3d 30 20  ss(zNewDb,0)==0 
1c570 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
1c580 74 66 28 73 74 64 65 72 72 2c 20 22 46 69 6c 65  tf(stderr, "File
1c590 20 5c 22 25 73 5c 22 20 61 6c 72 65 61 64 79 20   \"%s\" already 
1c5a0 65 78 69 73 74 73 2e 5c 6e 22 2c 20 7a 4e 65 77  exists.\n", zNew
1c5b0 44 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b  Db);.    return;
1c5c0 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c 69  .  }.  rc = sqli
1c5d0 74 65 33 5f 6f 70 65 6e 28 7a 4e 65 77 44 62 2c  te3_open(zNewDb,
1c5e0 20 26 6e 65 77 44 62 29 3b 0a 20 20 69 66 28 20   &newDb);.  if( 
1c5f0 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  rc ){.    utf8_p
1c600 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 43  rintf(stderr, "C
1c610 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 6f 75 74  annot create out
1c620 70 75 74 20 64 61 74 61 62 61 73 65 3a 20 25 73  put database: %s
1c630 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
1c640 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
1c650 6e 65 77 44 62 29 29 3b 0a 20 20 7d 65 6c 73 65  newDb));.  }else
1c660 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  {.    sqlite3_ex
1c670 65 63 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d  ec(p->db, "PRAGM
1c680 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d  A writable_schem
1c690 61 3d 4f 4e 3b 22 2c 20 30 2c 20 30 2c 20 30 29  a=ON;", 0, 0, 0)
1c6a0 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78  ;.    sqlite3_ex
1c6b0 65 63 28 6e 65 77 44 62 2c 20 22 42 45 47 49 4e  ec(newDb, "BEGIN
1c6c0 20 45 58 43 4c 55 53 49 56 45 3b 22 2c 20 30 2c   EXCLUSIVE;", 0,
1c6d0 20 30 2c 20 30 29 3b 0a 20 20 20 20 74 72 79 54   0, 0);.    tryT
1c6e0 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 70 2c 20  oCloneSchema(p, 
1c6f0 6e 65 77 44 62 2c 20 22 74 79 70 65 3d 27 74 61  newDb, "type='ta
1c700 62 6c 65 27 22 2c 20 74 72 79 54 6f 43 6c 6f 6e  ble'", tryToClon
1c710 65 44 61 74 61 29 3b 0a 20 20 20 20 74 72 79 54  eData);.    tryT
1c720 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 70 2c 20  oCloneSchema(p, 
1c730 6e 65 77 44 62 2c 20 22 74 79 70 65 21 3d 27 74  newDb, "type!='t
1c740 61 62 6c 65 27 22 2c 20 30 29 3b 0a 20 20 20 20  able'", 0);.    
1c750 73 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65 77  sqlite3_exec(new
1c760 44 62 2c 20 22 43 4f 4d 4d 49 54 3b 22 2c 20 30  Db, "COMMIT;", 0
1c770 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  , 0, 0);.    sql
1c780 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
1c790 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c   "PRAGMA writabl
1c7a0 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 22 2c 20  e_schema=OFF;", 
1c7b0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20 20  0, 0, 0);.  }.  
1c7c0 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 6e 65  sqlite3_close(ne
1c7d0 77 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  wDb);.}../*.** C
1c7e0 68 61 6e 67 65 20 74 68 65 20 6f 75 74 70 75 74  hange the output
1c7f0 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 73 74   file back to st
1c800 64 6f 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20 76  dout.*/.static v
1c810 6f 69 64 20 6f 75 74 70 75 74 5f 72 65 73 65 74  oid output_reset
1c820 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b  (ShellState *p){
1c830 0a 20 20 69 66 28 20 70 2d 3e 6f 75 74 66 69 6c  .  if( p->outfil
1c840 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69 66  e[0]=='|' ){.#if
1c850 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c860 5f 50 4f 50 45 4e 0a 20 20 20 20 70 63 6c 6f 73  _POPEN.    pclos
1c870 65 28 70 2d 3e 6f 75 74 29 3b 0a 23 65 6e 64 69  e(p->out);.#endi
1c880 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 6f  f.  }else{.    o
1c890 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73 65  utput_file_close
1c8a0 28 70 2d 3e 6f 75 74 29 3b 0a 20 20 7d 0a 20 20  (p->out);.  }.  
1c8b0 70 2d 3e 6f 75 74 66 69 6c 65 5b 30 5d 20 3d 20  p->outfile[0] = 
1c8c0 30 3b 0a 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74  0;.  p->out = st
1c8d0 64 6f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  dout;.}../*.** R
1c8e0 75 6e 20 61 6e 20 53 51 4c 20 63 6f 6d 6d 61 6e  un an SQL comman
1c8f0 64 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65  d and return the
1c900 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72 20   single integer 
1c910 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69  result..*/.stati
1c920 63 20 69 6e 74 20 64 62 5f 69 6e 74 28 53 68 65  c int db_int(She
1c930 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e 73  llState *p, cons
1c940 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a 20  t char *zSql){. 
1c950 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1c960 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 65 73 20  Stmt;.  int res 
1c970 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70  = 0;.  sqlite3_p
1c980 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
1c990 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
1c9a0 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53 74  t, 0);.  if( pSt
1c9b0 6d 74 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  mt && sqlite3_st
1c9c0 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
1c9d0 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 72 65 73  E_ROW ){.    res
1c9e0 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d   = sqlite3_colum
1c9f0 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 30 29 3b 0a  n_int(pStmt,0);.
1ca00 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 69    }.  sqlite3_fi
1ca10 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
1ca20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 0a   return res;.}..
1ca30 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61 20  /*.** Convert a 
1ca40 32 2d 62 79 74 65 20 6f 72 20 34 2d 62 79 74 65  2-byte or 4-byte
1ca50 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74 65   big-endian inte
1ca60 67 65 72 20 69 6e 74 6f 20 61 20 6e 61 74 69 76  ger into a nativ
1ca70 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 73 74 61  e integer.*/.sta
1ca80 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  tic unsigned int
1ca90 20 67 65 74 32 62 79 74 65 49 6e 74 28 75 6e 73   get2byteInt(uns
1caa0 69 67 6e 65 64 20 63 68 61 72 20 2a 61 29 7b 0a  igned char *a){.
1cab0 20 20 72 65 74 75 72 6e 20 28 61 5b 30 5d 3c 3c    return (a[0]<<
1cac0 38 29 20 2b 20 61 5b 31 5d 3b 0a 7d 0a 73 74 61  8) + a[1];.}.sta
1cad0 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e 74  tic unsigned int
1cae0 20 67 65 74 34 62 79 74 65 49 6e 74 28 75 6e 73   get4byteInt(uns
1caf0 69 67 6e 65 64 20 63 68 61 72 20 2a 61 29 7b 0a  igned char *a){.
1cb00 20 20 72 65 74 75 72 6e 20 28 61 5b 30 5d 3c 3c    return (a[0]<<
1cb10 32 34 29 20 2b 20 28 61 5b 31 5d 3c 3c 31 36 29  24) + (a[1]<<16)
1cb20 20 2b 20 28 61 5b 32 5d 3c 3c 38 29 20 2b 20 61   + (a[2]<<8) + a
1cb30 5b 33 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  [3];.}../*.** Im
1cb40 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
1cb50 74 68 65 20 22 2e 69 6e 66 6f 22 20 63 6f 6d 6d  the ".info" comm
1cb60 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  and..**.** Retur
1cb70 6e 20 31 20 6f 6e 20 65 72 72 6f 72 2c 20 32 20  n 1 on error, 2 
1cb80 74 6f 20 65 78 69 74 2c 20 61 6e 64 20 30 20 6f  to exit, and 0 o
1cb90 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61  therwise..*/.sta
1cba0 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f 64 62  tic int shell_db
1cbb0 69 6e 66 6f 5f 63 6f 6d 6d 61 6e 64 28 53 68 65  info_command(She
1cbc0 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e 74 20  llState *p, int 
1cbd0 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 41  nArg, char **azA
1cbe0 72 67 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  rg){.  static co
1cbf0 6e 73 74 20 73 74 72 75 63 74 20 7b 20 63 6f 6e  nst struct { con
1cc00 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20  st char *zName; 
1cc10 69 6e 74 20 6f 66 73 74 3b 20 7d 20 61 46 69 65  int ofst; } aFie
1cc20 6c 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b 20  ld[] = {.     { 
1cc30 22 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f 75  "file change cou
1cc40 6e 74 65 72 3a 22 2c 20 20 32 34 20 20 7d 2c 0a  nter:",  24  },.
1cc50 20 20 20 20 20 7b 20 22 64 61 74 61 62 61 73 65       { "database
1cc60 20 70 61 67 65 20 63 6f 75 6e 74 3a 22 2c 20 20   page count:",  
1cc70 32 38 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66  28  },.     { "f
1cc80 72 65 65 6c 69 73 74 20 70 61 67 65 20 63 6f 75  reelist page cou
1cc90 6e 74 3a 22 2c 20 20 33 36 20 20 7d 2c 0a 20 20  nt:",  36  },.  
1cca0 20 20 20 7b 20 22 73 63 68 65 6d 61 20 63 6f 6f     { "schema coo
1ccb0 6b 69 65 3a 22 2c 20 20 20 20 20 20 20 20 34 30  kie:",        40
1ccc0 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63 68    },.     { "sch
1ccd0 65 6d 61 20 66 6f 72 6d 61 74 3a 22 2c 20 20 20  ema format:",   
1cce0 20 20 20 20 20 34 34 20 20 7d 2c 0a 20 20 20 20       44  },.    
1ccf0 20 7b 20 22 64 65 66 61 75 6c 74 20 63 61 63 68   { "default cach
1cd00 65 20 73 69 7a 65 3a 22 2c 20 20 20 34 38 20 20  e size:",   48  
1cd10 7d 2c 0a 20 20 20 20 20 7b 20 22 61 75 74 6f 76  },.     { "autov
1cd20 61 63 75 75 6d 20 74 6f 70 20 72 6f 6f 74 3a 22  acuum top root:"
1cd30 2c 20 20 35 32 20 20 7d 2c 0a 20 20 20 20 20 7b  ,  52  },.     {
1cd40 20 22 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76 61   "incremental va
1cd50 63 75 75 6d 3a 22 2c 20 20 20 36 34 20 20 7d 2c  cuum:",   64  },
1cd60 0a 20 20 20 20 20 7b 20 22 74 65 78 74 20 65 6e  .     { "text en
1cd70 63 6f 64 69 6e 67 3a 22 2c 20 20 20 20 20 20 20  coding:",       
1cd80 20 35 36 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   56  },.     { "
1cd90 75 73 65 72 20 76 65 72 73 69 6f 6e 3a 22 2c 20  user version:", 
1cda0 20 20 20 20 20 20 20 20 36 30 20 20 7d 2c 0a 20          60  },. 
1cdb0 20 20 20 20 7b 20 22 61 70 70 6c 69 63 61 74 69      { "applicati
1cdc0 6f 6e 20 69 64 3a 22 2c 20 20 20 20 20 20 20 36  on id:",       6
1cdd0 38 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 6f  8  },.     { "so
1cde0 66 74 77 61 72 65 20 76 65 72 73 69 6f 6e 3a 22  ftware version:"
1cdf0 2c 20 20 20 20 20 39 36 20 20 7d 2c 0a 20 20 7d  ,     96  },.  }
1ce00 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74  ;.  static const
1ce10 20 73 74 72 75 63 74 20 7b 20 63 6f 6e 73 74 20   struct { const 
1ce20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 63 6f 6e  char *zName; con
1ce30 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20 7d  st char *zSql; }
1ce40 20 61 51 75 65 72 79 5b 5d 20 3d 20 7b 0a 20 20   aQuery[] = {.  
1ce50 20 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20     { "number of 
1ce60 74 61 62 6c 65 73 3a 22 2c 0a 20 20 20 20 20 20  tables:",.      
1ce70 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a   "SELECT count(*
1ce80 29 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20  ) FROM %s WHERE 
1ce90 74 79 70 65 3d 27 74 61 62 6c 65 27 22 20 7d 2c  type='table'" },
1cea0 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62 65 72 20  .     { "number 
1ceb0 6f 66 20 69 6e 64 65 78 65 73 3a 22 2c 0a 20 20  of indexes:",.  
1cec0 20 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f 75       "SELECT cou
1ced0 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20 57 48  nt(*) FROM %s WH
1cee0 45 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27  ERE type='index'
1cef0 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6e 75 6d  " },.     { "num
1cf00 62 65 72 20 6f 66 20 74 72 69 67 67 65 72 73 3a  ber of triggers:
1cf10 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45 43  ",.       "SELEC
1cf20 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d 20  T count(*) FROM 
1cf30 25 73 20 57 48 45 52 45 20 74 79 70 65 3d 27 74  %s WHERE type='t
1cf40 72 69 67 67 65 72 27 22 20 7d 2c 0a 20 20 20 20  rigger'" },.    
1cf50 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20 76 69   { "number of vi
1cf60 65 77 73 3a 22 2c 0a 20 20 20 20 20 20 20 22 53  ews:",.       "S
1cf70 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46  ELECT count(*) F
1cf80 52 4f 4d 20 25 73 20 57 48 45 52 45 20 74 79 70  ROM %s WHERE typ
1cf90 65 3d 27 76 69 65 77 27 22 20 7d 2c 0a 20 20 20  e='view'" },.   
1cfa0 20 20 7b 20 22 73 63 68 65 6d 61 20 73 69 7a 65    { "schema size
1cfb0 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45  :",.       "SELE
1cfc0 43 54 20 74 6f 74 61 6c 28 6c 65 6e 67 74 68 28  CT total(length(
1cfd0 73 71 6c 29 29 20 46 52 4f 4d 20 25 73 22 20 7d  sql)) FROM %s" }
1cfe0 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a  ,.  };.  int i;.
1cff0 20 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61 54    char *zSchemaT
1d000 61 62 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62 20  ab;.  char *zDb 
1d010 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41 72  = nArg>=2 ? azAr
1d020 67 5b 31 5d 20 3a 20 22 6d 61 69 6e 22 3b 0a 20  g[1] : "main";. 
1d030 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1d040 53 74 6d 74 20 3d 20 30 3b 0a 20 20 75 6e 73 69  Stmt = 0;.  unsi
1d050 67 6e 65 64 20 63 68 61 72 20 61 48 64 72 5b 31  gned char aHdr[1
1d060 30 30 5d 3b 0a 20 20 6f 70 65 6e 5f 64 62 28 70  00];.  open_db(p
1d070 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e 64  , 0);.  if( p->d
1d080 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  b==0 ) return 1;
1d090 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61  .  sqlite3_prepa
1d0a0 72 65 5f 76 32 28 70 2d 3e 64 62 2c 22 53 45 4c  re_v2(p->db,"SEL
1d0b0 45 43 54 20 64 61 74 61 20 46 52 4f 4d 20 73 71  ECT data FROM sq
1d0c0 6c 69 74 65 5f 64 62 70 61 67 65 28 3f 31 29 20  lite_dbpage(?1) 
1d0d0 57 48 45 52 45 20 70 67 6e 6f 3d 31 22 2c 0a 20  WHERE pgno=1",. 
1d0e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d0f0 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20      -1, &pStmt, 
1d100 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62 69  0);.  sqlite3_bi
1d110 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31  nd_text(pStmt, 1
1d120 2c 20 7a 44 62 2c 20 2d 31 2c 20 53 51 4c 49 54  , zDb, -1, SQLIT
1d130 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66 28  E_STATIC);.  if(
1d140 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
1d150 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
1d160 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f 63  .   && sqlite3_c
1d170 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74 6d  olumn_bytes(pStm
1d180 74 2c 30 29 3e 31 30 30 0a 20 20 29 7b 0a 20 20  t,0)>100.  ){.  
1d190 20 20 6d 65 6d 63 70 79 28 61 48 64 72 2c 20 73    memcpy(aHdr, s
1d1a0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62 6c  qlite3_column_bl
1d1b0 6f 62 28 70 53 74 6d 74 2c 30 29 2c 20 31 30 30  ob(pStmt,0), 100
1d1c0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
1d1d0 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
1d1e0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 61 77    }else{.    raw
1d1f0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
1d200 22 75 6e 61 62 6c 65 20 74 6f 20 72 65 61 64 20  "unable to read 
1d210 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72 5c  database header\
1d220 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  n");.    sqlite3
1d230 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
1d240 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
1d250 20 20 7d 0a 20 20 69 20 3d 20 67 65 74 32 62 79    }.  i = get2by
1d260 74 65 49 6e 74 28 61 48 64 72 2b 31 36 29 3b 0a  teInt(aHdr+16);.
1d270 20 20 69 66 28 20 69 3d 3d 31 20 29 20 69 20 3d    if( i==1 ) i =
1d280 20 36 35 35 33 36 3b 0a 20 20 75 74 66 38 5f 70   65536;.  utf8_p
1d290 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
1d2a0 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22 64 61 74  -20s %d\n", "dat
1d2b0 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 3a  abase page size:
1d2c0 22 2c 20 69 29 3b 0a 20 20 75 74 66 38 5f 70 72  ", i);.  utf8_pr
1d2d0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d  intf(p->out, "%-
1d2e0 32 30 73 20 25 64 5c 6e 22 2c 20 22 77 72 69 74  20s %d\n", "writ
1d2f0 65 20 66 6f 72 6d 61 74 3a 22 2c 20 61 48 64 72  e format:", aHdr
1d300 5b 31 38 5d 29 3b 0a 20 20 75 74 66 38 5f 70 72  [18]);.  utf8_pr
1d310 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d  intf(p->out, "%-
1d320 32 30 73 20 25 64 5c 6e 22 2c 20 22 72 65 61 64  20s %d\n", "read
1d330 20 66 6f 72 6d 61 74 3a 22 2c 20 61 48 64 72 5b   format:", aHdr[
1d340 31 39 5d 29 3b 0a 20 20 75 74 66 38 5f 70 72 69  19]);.  utf8_pri
1d350 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32  ntf(p->out, "%-2
1d360 30 73 20 25 64 5c 6e 22 2c 20 22 72 65 73 65 72  0s %d\n", "reser
1d370 76 65 64 20 62 79 74 65 73 3a 22 2c 20 61 48 64  ved bytes:", aHd
1d380 72 5b 32 30 5d 29 3b 0a 20 20 66 6f 72 28 69 3d  r[20]);.  for(i=
1d390 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
1d3a0 46 69 65 6c 64 29 3b 20 69 2b 2b 29 7b 0a 20 20  Field); i++){.  
1d3b0 20 20 69 6e 74 20 6f 66 73 74 20 3d 20 61 46 69    int ofst = aFi
1d3c0 65 6c 64 5b 69 5d 2e 6f 66 73 74 3b 0a 20 20 20  eld[i].ofst;.   
1d3d0 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 76 61   unsigned int va
1d3e0 6c 20 3d 20 67 65 74 34 62 79 74 65 49 6e 74 28  l = get4byteInt(
1d3f0 61 48 64 72 20 2b 20 6f 66 73 74 29 3b 0a 20 20  aHdr + ofst);.  
1d400 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
1d410 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 75 22  >out, "%-20s %u"
1d420 2c 20 61 46 69 65 6c 64 5b 69 5d 2e 7a 4e 61 6d  , aField[i].zNam
1d430 65 2c 20 76 61 6c 29 3b 0a 20 20 20 20 73 77 69  e, val);.    swi
1d440 74 63 68 28 20 6f 66 73 74 20 29 7b 0a 20 20 20  tch( ofst ){.   
1d450 20 20 20 63 61 73 65 20 35 36 3a 20 7b 0a 20 20     case 56: {.  
1d460 20 20 20 20 20 20 69 66 28 20 76 61 6c 3d 3d 31        if( val==1
1d470 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d   ) raw_printf(p-
1d480 3e 6f 75 74 2c 20 22 20 28 75 74 66 38 29 22 29  >out, " (utf8)")
1d490 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 76 61  ;.        if( va
1d4a0 6c 3d 3d 32 20 29 20 72 61 77 5f 70 72 69 6e 74  l==2 ) raw_print
1d4b0 66 28 70 2d 3e 6f 75 74 2c 20 22 20 28 75 74 66  f(p->out, " (utf
1d4c0 31 36 6c 65 29 22 29 3b 0a 20 20 20 20 20 20 20  16le)");.       
1d4d0 20 69 66 28 20 76 61 6c 3d 3d 33 20 29 20 72 61   if( val==3 ) ra
1d4e0 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
1d4f0 20 22 20 28 75 74 66 31 36 62 65 29 22 29 3b 0a   " (utf16be)");.
1d500 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1d510 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
1d520 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d 0a  out, "\n");.  }.
1d530 20 20 69 66 28 20 7a 44 62 3d 3d 30 20 29 7b 0a    if( zDb==0 ){.
1d540 20 20 20 20 7a 53 63 68 65 6d 61 54 61 62 20 3d      zSchemaTab =
1d550 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1d560 28 22 6d 61 69 6e 2e 73 71 6c 69 74 65 5f 6d 61  ("main.sqlite_ma
1d570 73 74 65 72 22 29 3b 0a 20 20 7d 65 6c 73 65 20  ster");.  }else 
1d580 69 66 28 20 73 74 72 63 6d 70 28 7a 44 62 2c 22  if( strcmp(zDb,"
1d590 74 65 6d 70 22 29 3d 3d 30 20 29 7b 0a 20 20 20  temp")==0 ){.   
1d5a0 20 7a 53 63 68 65 6d 61 54 61 62 20 3d 20 73 71   zSchemaTab = sq
1d5b0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25  lite3_mprintf("%
1d5c0 73 22 2c 20 22 73 71 6c 69 74 65 5f 74 65 6d 70  s", "sqlite_temp
1d5d0 5f 6d 61 73 74 65 72 22 29 3b 0a 20 20 7d 65 6c  _master");.  }el
1d5e0 73 65 7b 0a 20 20 20 20 7a 53 63 68 65 6d 61 54  se{.    zSchemaT
1d5f0 61 62 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ab = sqlite3_mpr
1d600 69 6e 74 66 28 22 5c 22 25 77 5c 22 2e 73 71 6c  intf("\"%w\".sql
1d610 69 74 65 5f 6d 61 73 74 65 72 22 2c 20 7a 44 62  ite_master", zDb
1d620 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d 30  );.  }.  for(i=0
1d630 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 51  ; i<ArraySize(aQ
1d640 75 65 72 79 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  uery); i++){.   
1d650 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71   char *zSql = sq
1d660 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61 51  lite3_mprintf(aQ
1d670 75 65 72 79 5b 69 5d 2e 7a 53 71 6c 2c 20 7a 53  uery[i].zSql, zS
1d680 63 68 65 6d 61 54 61 62 29 3b 0a 20 20 20 20 69  chemaTab);.    i
1d690 6e 74 20 76 61 6c 20 3d 20 64 62 5f 69 6e 74 28  nt val = db_int(
1d6a0 70 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 73 71  p, zSql);.    sq
1d6b0 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
1d6c0 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  ;.    utf8_print
1d6d0 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73  f(p->out, "%-20s
1d6e0 20 25 64 5c 6e 22 2c 20 61 51 75 65 72 79 5b 69   %d\n", aQuery[i
1d6f0 5d 2e 7a 4e 61 6d 65 2c 20 76 61 6c 29 3b 0a 20  ].zName, val);. 
1d700 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65   }.  sqlite3_fre
1d710 65 28 7a 53 63 68 65 6d 61 54 61 62 29 3b 0a 20  e(zSchemaTab);. 
1d720 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
1d730 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63 75  .** Print the cu
1d740 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65 72  rrent sqlite3_er
1d750 72 6d 73 67 28 29 20 76 61 6c 75 65 20 74 6f 20  rmsg() value to 
1d760 73 74 64 65 72 72 20 61 6e 64 20 72 65 74 75 72  stderr and retur
1d770 6e 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n 1..*/.static i
1d780 6e 74 20 73 68 65 6c 6c 44 61 74 61 62 61 73 65  nt shellDatabase
1d790 45 72 72 6f 72 28 73 71 6c 69 74 65 33 20 2a 64  Error(sqlite3 *d
1d7a0 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  b){.  const char
1d7b0 20 2a 7a 45 72 72 20 3d 20 73 71 6c 69 74 65 33   *zErr = sqlite3
1d7c0 5f 65 72 72 6d 73 67 28 64 62 29 3b 0a 20 20 75  _errmsg(db);.  u
1d7d0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
1d7e0 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  r, "Error: %s\n"
1d7f0 2c 20 7a 45 72 72 29 3b 0a 20 20 72 65 74 75 72  , zErr);.  retur
1d800 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72  n 1;.}../*.** Pr
1d810 69 6e 74 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d 65  int an out-of-me
1d820 6d 6f 72 79 20 6d 65 73 73 61 67 65 20 74 6f 20  mory message to 
1d830 73 74 64 65 72 72 20 61 6e 64 20 72 65 74 75 72  stderr and retur
1d840 6e 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  n 1..*/.static i
1d850 6e 74 20 73 68 65 6c 6c 4e 6f 6d 65 6d 45 72 72  nt shellNomemErr
1d860 6f 72 28 76 6f 69 64 29 7b 0a 20 20 72 61 77 5f  or(void){.  raw_
1d870 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1d880 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65  Error: out of me
1d890 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 72 65 74 75  mory\n");.  retu
1d8a0 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rn 1;.}../*.** C
1d8b0 6f 6d 70 61 72 65 20 74 68 65 20 70 61 74 74 65  ompare the patte
1d8c0 72 6e 20 69 6e 20 7a 47 6c 6f 62 5b 5d 20 61 67  rn in zGlob[] ag
1d8d0 61 69 6e 73 74 20 74 68 65 20 74 65 78 74 20 69  ainst the text i
1d8e0 6e 20 7a 5b 5d 2e 20 20 52 65 74 75 72 6e 20 54  n z[].  Return T
1d8f0 52 55 45 0a 2a 2a 20 69 66 20 74 68 65 79 20 6d  RUE.** if they m
1d900 61 74 63 68 20 61 6e 64 20 46 41 4c 53 45 20 28  atch and FALSE (
1d910 30 29 20 69 66 20 74 68 65 79 20 64 6f 20 6e 6f  0) if they do no
1d920 74 20 6d 61 74 63 68 2e 0a 2a 2a 0a 2a 2a 20 47  t match..**.** G
1d930 6c 6f 62 62 69 6e 67 20 72 75 6c 65 73 3a 0a 2a  lobbing rules:.*
1d940 2a 0a 2a 2a 20 20 20 20 20 20 27 2a 27 20 20 20  *.**      '*'   
1d950 20 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79 20      Matches any 
1d960 73 65 71 75 65 6e 63 65 20 6f 66 20 7a 65 72 6f  sequence of zero
1d970 20 6f 72 20 6d 6f 72 65 20 63 68 61 72 61 63 74   or more charact
1d980 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20  ers..**.**      
1d990 27 3f 27 20 20 20 20 20 20 20 4d 61 74 63 68 65  '?'       Matche
1d9a0 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63 68  s exactly one ch
1d9b0 61 72 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 20  aracter..**.**  
1d9c0 20 20 20 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d 61     [...]      Ma
1d9d0 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61 63  tches one charac
1d9e0 74 65 72 20 66 72 6f 6d 20 74 68 65 20 65 6e 63  ter from the enc
1d9f0 6c 6f 73 65 64 20 6c 69 73 74 20 6f 66 0a 2a 2a  losed list of.**
1da00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1da10 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a 2a  characters..**.*
1da20 2a 20 20 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20 20  *     [^...]    
1da30 20 4d 61 74 63 68 65 73 20 6f 6e 65 20 63 68 61   Matches one cha
1da40 72 61 63 74 65 72 20 6e 6f 74 20 69 6e 20 74 68  racter not in th
1da50 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74 2e  e enclosed list.
1da60 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 23 27 20  .**.**      '#' 
1da70 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 61 6e        Matches an
1da80 79 20 73 65 71 75 65 6e 63 65 20 6f 66 20 6f 6e  y sequence of on
1da90 65 20 6f 72 20 6d 6f 72 65 20 64 69 67 69 74 73  e or more digits
1daa0 20 77 69 74 68 20 61 6e 0a 2a 2a 20 20 20 20 20   with an.**     
1dab0 20 20 20 20 20 20 20 20 20 20 20 6f 70 74 69 6f             optio
1dac0 6e 61 6c 20 2b 20 6f 72 20 2d 20 73 69 67 6e 20  nal + or - sign 
1dad0 69 6e 20 66 72 6f 6e 74 0a 2a 2a 0a 2a 2a 20 20  in front.**.**  
1dae0 20 20 20 20 27 20 27 20 20 20 20 20 20 20 41 6e      ' '       An
1daf0 79 20 73 70 61 6e 20 6f 66 20 77 68 69 74 65 73  y span of whites
1db00 70 61 63 65 20 6d 61 74 63 68 65 73 20 61 6e 79  pace matches any
1db10 20 6f 74 68 65 72 20 73 70 61 6e 20 6f 66 0a 2a   other span of.*
1db20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1db30 20 77 68 69 74 65 73 70 61 63 65 2e 0a 2a 2a 0a   whitespace..**.
1db40 2a 2a 20 45 78 74 72 61 20 77 68 69 74 65 73 70  ** Extra whitesp
1db50 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20 6f  ace at the end o
1db60 66 20 7a 5b 5d 20 69 73 20 69 67 6e 6f 72 65 64  f z[] is ignored
1db70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1db80 74 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 63 6f  testcase_glob(co
1db90 6e 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62 2c  nst char *zGlob,
1dba0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b   const char *z){
1dbb0 0a 20 20 69 6e 74 20 63 2c 20 63 32 3b 0a 20 20  .  int c, c2;.  
1dbc0 69 6e 74 20 69 6e 76 65 72 74 3b 0a 20 20 69 6e  int invert;.  in
1dbd0 74 20 73 65 65 6e 3b 0a 0a 20 20 77 68 69 6c 65  t seen;..  while
1dbe0 28 20 28 63 20 3d 20 28 2a 28 7a 47 6c 6f 62 2b  ( (c = (*(zGlob+
1dbf0 2b 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 69  +)))!=0 ){.    i
1dc00 66 28 20 49 73 53 70 61 63 65 28 63 29 20 29 7b  f( IsSpace(c) ){
1dc10 0a 20 20 20 20 20 20 69 66 28 20 21 49 73 53 70  .      if( !IsSp
1dc20 61 63 65 28 2a 7a 29 20 29 20 72 65 74 75 72 6e  ace(*z) ) return
1dc30 20 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   0;.      while(
1dc40 20 49 73 53 70 61 63 65 28 2a 7a 47 6c 6f 62 29   IsSpace(*zGlob)
1dc50 20 29 20 7a 47 6c 6f 62 2b 2b 3b 0a 20 20 20 20   ) zGlob++;.    
1dc60 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63 65    while( IsSpace
1dc70 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  (*z) ) z++;.    
1dc80 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 2a 27  }else if( c=='*'
1dc90 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65 28   ){.      while(
1dca0 20 28 63 3d 28 2a 28 7a 47 6c 6f 62 2b 2b 29 29   (c=(*(zGlob++))
1dcb0 29 20 3d 3d 20 27 2a 27 20 7c 7c 20 63 3d 3d 27  ) == '*' || c=='
1dcc0 3f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ?' ){.        if
1dcd0 28 20 63 3d 3d 27 3f 27 20 26 26 20 28 2a 28 7a  ( c=='?' && (*(z
1dce0 2b 2b 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ++))==0 ) return
1dcf0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
1dd00 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20 20    if( c==0 ){.  
1dd10 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
1dd20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
1dd30 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20 20  c=='[' ){.      
1dd40 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20 74    while( *z && t
1dd50 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 7a 47 6c  estcase_glob(zGl
1dd60 6f 62 2d 31 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20  ob-1,z)==0 ){.  
1dd70 20 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20          z++;.   
1dd80 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
1dd90 65 74 75 72 6e 20 28 2a 7a 29 21 3d 30 3b 0a 20  eturn (*z)!=0;. 
1dda0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68 69       }.      whi
1ddb0 6c 65 28 20 28 63 32 20 3d 20 28 2a 28 7a 2b 2b  le( (c2 = (*(z++
1ddc0 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  )))!=0 ){.      
1ddd0 20 20 77 68 69 6c 65 28 20 63 32 21 3d 63 20 29    while( c2!=c )
1dde0 7b 0a 20 20 20 20 20 20 20 20 20 20 63 32 20 3d  {.          c2 =
1ddf0 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 20 20 20   *(z++);.       
1de00 20 20 20 69 66 28 20 63 32 3d 3d 30 20 29 20 72     if( c2==0 ) r
1de10 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
1de20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 74   }.        if( t
1de30 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 7a 47 6c  estcase_glob(zGl
1de40 6f 62 2c 7a 29 20 29 20 72 65 74 75 72 6e 20 31  ob,z) ) return 1
1de50 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1de60 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65  return 0;.    }e
1de70 6c 73 65 20 69 66 28 20 63 3d 3d 27 3f 27 20 29  lse if( c=='?' )
1de80 7b 0a 20 20 20 20 20 20 69 66 28 20 28 2a 28 7a  {.      if( (*(z
1de90 2b 2b 29 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ++))==0 ) return
1dea0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66   0;.    }else if
1deb0 28 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20  ( c=='[' ){.    
1dec0 20 20 69 6e 74 20 70 72 69 6f 72 5f 63 20 3d 20    int prior_c = 
1ded0 30 3b 0a 20 20 20 20 20 20 73 65 65 6e 20 3d 20  0;.      seen = 
1dee0 30 3b 0a 20 20 20 20 20 20 69 6e 76 65 72 74 20  0;.      invert 
1def0 3d 20 30 3b 0a 20 20 20 20 20 20 63 20 3d 20 2a  = 0;.      c = *
1df00 28 7a 2b 2b 29 3b 0a 20 20 20 20 20 20 69 66 28  (z++);.      if(
1df10 20 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   c==0 ) return 0
1df20 3b 0a 20 20 20 20 20 20 63 32 20 3d 20 2a 28 7a  ;.      c2 = *(z
1df30 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20 69  Glob++);.      i
1df40 66 28 20 63 32 3d 3d 27 5e 27 20 29 7b 0a 20 20  f( c2=='^' ){.  
1df50 20 20 20 20 20 20 69 6e 76 65 72 74 20 3d 20 31        invert = 1
1df60 3b 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20 2a  ;.        c2 = *
1df70 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20  (zGlob++);.     
1df80 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 32 3d   }.      if( c2=
1df90 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  =']' ){.        
1dfa0 69 66 28 20 63 3d 3d 27 5d 27 20 29 20 73 65 65  if( c==']' ) see
1dfb0 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63  n = 1;.        c
1dfc0 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a  2 = *(zGlob++);.
1dfd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68        }.      wh
1dfe0 69 6c 65 28 20 63 32 20 26 26 20 63 32 21 3d 27  ile( c2 && c2!='
1dff0 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  ]' ){.        if
1e000 28 20 63 32 3d 3d 27 2d 27 20 26 26 20 7a 47 6c  ( c2=='-' && zGl
1e010 6f 62 5b 30 5d 21 3d 27 5d 27 20 26 26 20 7a 47  ob[0]!=']' && zG
1e020 6c 6f 62 5b 30 5d 21 3d 30 20 26 26 20 70 72 69  lob[0]!=0 && pri
1e030 6f 72 5f 63 3e 30 20 29 7b 0a 20 20 20 20 20 20  or_c>0 ){.      
1e040 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f 62      c2 = *(zGlob
1e050 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ++);.          i
1e060 66 28 20 63 3e 3d 70 72 69 6f 72 5f 63 20 26 26  f( c>=prior_c &&
1e070 20 63 3c 3d 63 32 20 29 20 73 65 65 6e 20 3d 20   c<=c2 ) seen = 
1e080 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72 69  1;.          pri
1e090 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  or_c = 0;.      
1e0a0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
1e0b0 20 20 20 69 66 28 20 63 3d 3d 63 32 20 29 7b 0a     if( c==c2 ){.
1e0c0 20 20 20 20 20 20 20 20 20 20 20 20 73 65 65 6e              seen
1e0d0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
1e0e0 7d 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6f  }.          prio
1e0f0 72 5f 63 20 3d 20 63 32 3b 0a 20 20 20 20 20 20  r_c = c2;.      
1e100 20 20 7d 0a 20 20 20 20 20 20 20 20 63 32 20 3d    }.        c2 =
1e110 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20   *(zGlob++);.   
1e120 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63     }.      if( c
1e130 32 3d 3d 30 20 7c 7c 20 28 73 65 65 6e 20 5e 20  2==0 || (seen ^ 
1e140 69 6e 76 65 72 74 29 3d 3d 30 20 29 20 72 65 74  invert)==0 ) ret
1e150 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  urn 0;.    }else
1e160 20 69 66 28 20 63 3d 3d 27 23 27 20 29 7b 0a 20   if( c=='#' ){. 
1e170 20 20 20 20 20 69 66 28 20 28 7a 5b 30 5d 3d 3d       if( (z[0]==
1e180 27 2d 27 20 7c 7c 20 7a 5b 30 5d 3d 3d 27 2b 27  '-' || z[0]=='+'
1e190 29 20 26 26 20 49 73 44 69 67 69 74 28 7a 5b 31  ) && IsDigit(z[1
1e1a0 5d 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20  ]) ) z++;.      
1e1b0 69 66 28 20 21 49 73 44 69 67 69 74 28 7a 5b 30  if( !IsDigit(z[0
1e1c0 5d 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ]) ) return 0;. 
1e1d0 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20       z++;.      
1e1e0 77 68 69 6c 65 28 20 49 73 44 69 67 69 74 28 7a  while( IsDigit(z
1e1f0 5b 30 5d 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a 20  [0]) ){ z++; }. 
1e200 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1e210 69 66 28 20 63 21 3d 28 2a 28 7a 2b 2b 29 29 20  if( c!=(*(z++)) 
1e220 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
1e230 7d 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 49  }.  }.  while( I
1e240 73 53 70 61 63 65 28 2a 7a 29 20 29 7b 20 7a 2b  sSpace(*z) ){ z+
1e250 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a 7a  +; }.  return *z
1e260 3d 3d 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 43  ==0;.}.../*.** C
1e270 6f 6d 70 61 72 65 20 74 68 65 20 73 74 72 69 6e  ompare the strin
1e280 67 20 61 73 20 61 20 63 6f 6d 6d 61 6e 64 2d 6c  g as a command-l
1e290 69 6e 65 20 6f 70 74 69 6f 6e 20 77 69 74 68 20  ine option with 
1e2a0 65 69 74 68 65 72 20 6f 6e 65 20 6f 72 20 74 77  either one or tw
1e2b0 6f 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 22 2d 22  o.** initial "-"
1e2c0 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f 0a   characters..*/.
1e2d0 73 74 61 74 69 63 20 69 6e 74 20 6f 70 74 69 6f  static int optio
1e2e0 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68 61  nMatch(const cha
1e2f0 72 20 2a 7a 53 74 72 2c 20 63 6f 6e 73 74 20 63  r *zStr, const c
1e300 68 61 72 20 2a 7a 4f 70 74 29 7b 0a 20 20 69 66  har *zOpt){.  if
1e310 28 20 7a 53 74 72 5b 30 5d 21 3d 27 2d 27 20 29  ( zStr[0]!='-' )
1e320 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 53 74   return 0;.  zSt
1e330 72 2b 2b 3b 0a 20 20 69 66 28 20 7a 53 74 72 5b  r++;.  if( zStr[
1e340 30 5d 3d 3d 27 2d 27 20 29 20 7a 53 74 72 2b 2b  0]=='-' ) zStr++
1e350 3b 0a 20 20 72 65 74 75 72 6e 20 73 74 72 63 6d  ;.  return strcm
1e360 70 28 7a 53 74 72 2c 20 7a 4f 70 74 29 3d 3d 30  p(zStr, zOpt)==0
1e370 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
1e380 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e 74  e a file..*/.int
1e390 20 73 68 65 6c 6c 44 65 6c 65 74 65 46 69 6c 65   shellDeleteFile
1e3a0 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69  (const char *zFi
1e3b0 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 72  lename){.  int r
1e3c0 63 3b 0a 23 69 66 64 65 66 20 5f 57 49 4e 33 32  c;.#ifdef _WIN32
1e3d0 0a 20 20 77 63 68 61 72 5f 74 20 2a 7a 20 3d 20  .  wchar_t *z = 
1e3e0 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74  sqlite3_win32_ut
1e3f0 66 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 7a 46  f8_to_unicode(zF
1e400 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 63 20 3d  ilename);.  rc =
1e410 20 5f 77 75 6e 6c 69 6e 6b 28 7a 29 3b 0a 20 20   _wunlink(z);.  
1e420 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
1e430 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d 20 75 6e  .#else.  rc = un
1e440 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29 3b  link(zFilename);
1e450 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e  .#endif.  return
1e460 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54   rc;.}.../*.** T
1e470 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  he implementatio
1e480 6e 20 6f 66 20 53 51 4c 20 73 63 61 6c 61 72 20  n of SQL scalar 
1e490 66 75 6e 63 74 69 6f 6e 20 66 6b 65 79 5f 63 6f  function fkey_co
1e4a0 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 29 2c 20  llate_clause(), 
1e4b0 75 73 65 64 0a 2a 2a 20 62 79 20 74 68 65 20 22  used.** by the "
1e4c0 2e 6c 69 6e 74 20 66 6b 65 79 2d 69 6e 64 65 78  .lint fkey-index
1e4d0 65 73 22 20 63 6f 6d 6d 61 6e 64 2e 20 54 68 69  es" command. Thi
1e4e0 73 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69 6f  s scalar functio
1e4f0 6e 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20 63  n is always.** c
1e500 61 6c 6c 65 64 20 77 69 74 68 20 66 6f 75 72 20  alled with four 
1e510 61 72 67 75 6d 65 6e 74 73 20 2d 20 74 68 65 20  arguments - the 
1e520 70 61 72 65 6e 74 20 74 61 62 6c 65 20 6e 61 6d  parent table nam
1e530 65 2c 20 74 68 65 20 70 61 72 65 6e 74 20 63 6f  e, the parent co
1e540 6c 75 6d 6e 20 6e 61 6d 65 2c 0a 2a 2a 20 74 68  lumn name,.** th
1e550 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20 6e 61  e child table na
1e560 6d 65 20 61 6e 64 20 74 68 65 20 63 68 69 6c 64  me and the child
1e570 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2a   column name..**
1e580 0a 2a 2a 20 20 20 66 6b 65 79 5f 63 6f 6c 6c 61  .**   fkey_colla
1e590 74 65 5f 63 6c 61 75 73 65 28 27 70 61 72 65 6e  te_clause('paren
1e5a0 74 2d 74 61 62 27 2c 20 27 70 61 72 65 6e 74 2d  t-tab', 'parent-
1e5b0 63 6f 6c 27 2c 20 27 63 68 69 6c 64 2d 74 61 62  col', 'child-tab
1e5c0 27 2c 20 27 63 68 69 6c 64 2d 63 6f 6c 27 29 0a  ', 'child-col').
1e5d0 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72 20  **.** If either 
1e5e0 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61 62  of the named tab
1e5f0 6c 65 73 20 6f 72 20 63 6f 6c 75 6d 6e 73 20 64  les or columns d
1e600 6f 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68 69  o not exist, thi
1e610 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72 65  s function.** re
1e620 74 75 72 6e 73 20 61 6e 20 65 6d 70 74 79 20 73  turns an empty s
1e630 74 72 69 6e 67 2e 20 41 6e 20 65 6d 70 74 79 20  tring. An empty 
1e640 73 74 72 69 6e 67 20 69 73 20 61 6c 73 6f 20 72  string is also r
1e650 65 74 75 72 6e 65 64 20 69 66 20 62 6f 74 68 20  eturned if both 
1e660 74 61 62 6c 65 73 0a 2a 2a 20 61 6e 64 20 63 6f  tables.** and co
1e670 6c 75 6d 6e 73 20 65 78 69 73 74 20 62 75 74 20  lumns exist but 
1e680 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 64 65  have the same de
1e690 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
1e6a0 73 65 71 75 65 6e 63 65 2e 20 4f 72 2c 0a 2a 2a  sequence. Or,.**
1e6b0 20 69 66 20 62 6f 74 68 20 65 78 69 73 74 20 62   if both exist b
1e6c0 75 74 20 74 68 65 20 64 65 66 61 75 6c 74 20 63  ut the default c
1e6d0 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
1e6e0 65 73 20 61 72 65 20 64 69 66 66 65 72 65 6e 74  es are different
1e6f0 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  , this.** functi
1e700 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  on returns the s
1e710 74 72 69 6e 67 20 22 20 43 4f 4c 4c 41 54 45 20  tring " COLLATE 
1e720 3c 70 61 72 65 6e 74 2d 63 6f 6c 6c 61 74 69 6f  <parent-collatio
1e730 6e 3e 22 2c 20 77 68 65 72 65 0a 2a 2a 20 3c 70  n>", where.** <p
1e740 61 72 65 6e 74 2d 63 6f 6c 6c 61 74 69 6f 6e 3e  arent-collation>
1e750 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74 20   is the default 
1e760 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1e770 63 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e 74  ce of the parent
1e780 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61 74   column..*/.stat
1e790 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 46 6b 65  ic void shellFke
1e7a0 79 43 6f 6c 6c 61 74 65 43 6c 61 75 73 65 28 0a  yCollateClause(.
1e7b0 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78    sqlite3_contex
1e7c0 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20 6e  t *pCtx,.  int n
1e7d0 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f 76  Val,.  sqlite3_v
1e7e0 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b 0a  alue **apVal.){.
1e7f0 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1e800 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f  sqlite3_context_
1e810 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78 29 3b  db_handle(pCtx);
1e820 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1e830 50 61 72 65 6e 74 3b 0a 20 20 63 6f 6e 73 74 20  Parent;.  const 
1e840 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f 6c  char *zParentCol
1e850 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1e860 7a 50 61 72 65 6e 74 53 65 71 3b 0a 20 20 63 6f  zParentSeq;.  co
1e870 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 69 6c 64  nst char *zChild
1e880 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1e890 7a 43 68 69 6c 64 43 6f 6c 3b 0a 20 20 63 6f 6e  zChildCol;.  con
1e8a0 73 74 20 63 68 61 72 20 2a 7a 43 68 69 6c 64 53  st char *zChildS
1e8b0 65 71 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 69 74  eq = 0;  /* Init
1e8c0 69 61 6c 69 7a 65 20 74 6f 20 61 76 6f 69 64 20  ialize to avoid 
1e8d0 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20 77  false-positive w
1e8e0 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20  arning */.  int 
1e8f0 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 6e  rc;..  assert( n
1e900 56 61 6c 3d 3d 34 20 29 3b 0a 20 20 7a 50 61 72  Val==4 );.  zPar
1e910 65 6e 74 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ent = (const cha
1e920 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
1e930 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29 3b  _text(apVal[0]);
1e940 0a 20 20 7a 50 61 72 65 6e 74 43 6f 6c 20 3d 20  .  zParentCol = 
1e950 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
1e960 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
1e970 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 7a 43 68  apVal[1]);.  zCh
1e980 69 6c 64 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ild = (const cha
1e990 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65  r*)sqlite3_value
1e9a0 5f 74 65 78 74 28 61 70 56 61 6c 5b 32 5d 29 3b  _text(apVal[2]);
1e9b0 0a 20 20 7a 43 68 69 6c 64 43 6f 6c 20 3d 20 28  .  zChildCol = (
1e9c0 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69  const char*)sqli
1e9d0 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61  te3_value_text(a
1e9e0 70 56 61 6c 5b 33 5d 29 3b 0a 0a 20 20 73 71 6c  pVal[3]);..  sql
1e9f0 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78 74  ite3_result_text
1ea00 28 70 43 74 78 2c 20 22 22 2c 20 2d 31 2c 20 53  (pCtx, "", -1, S
1ea10 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
1ea20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74 61   rc = sqlite3_ta
1ea30 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61 64  ble_column_metad
1ea40 61 74 61 28 0a 20 20 20 20 20 20 64 62 2c 20 22  ata(.      db, "
1ea50 6d 61 69 6e 22 2c 20 7a 50 61 72 65 6e 74 2c 20  main", zParent, 
1ea60 7a 50 61 72 65 6e 74 43 6f 6c 2c 20 30 2c 20 26  zParentCol, 0, &
1ea70 7a 50 61 72 65 6e 74 53 65 71 2c 20 30 2c 20 30  zParentSeq, 0, 0
1ea80 2c 20 30 0a 20 20 29 3b 0a 20 20 69 66 28 20 72  , 0.  );.  if( r
1ea90 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
1eaa0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1eab0 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65  _table_column_me
1eac0 74 61 64 61 74 61 28 0a 20 20 20 20 20 20 20 20  tadata(.        
1ead0 64 62 2c 20 22 6d 61 69 6e 22 2c 20 7a 43 68 69  db, "main", zChi
1eae0 6c 64 2c 20 7a 43 68 69 6c 64 43 6f 6c 2c 20 30  ld, zChildCol, 0
1eaf0 2c 20 26 7a 43 68 69 6c 64 53 65 71 2c 20 30 2c  , &zChildSeq, 0,
1eb00 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20 7d   0, 0.    );.  }
1eb10 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
1eb20 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65 33  TE_OK && sqlite3
1eb30 5f 73 74 72 69 63 6d 70 28 7a 50 61 72 65 6e 74  _stricmp(zParent
1eb40 53 65 71 2c 20 7a 43 68 69 6c 64 53 65 71 29 20  Seq, zChildSeq) 
1eb50 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  ){.    char *z =
1eb60 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
1eb70 28 22 20 43 4f 4c 4c 41 54 45 20 25 73 22 2c 20  (" COLLATE %s", 
1eb80 7a 50 61 72 65 6e 74 53 65 71 29 3b 0a 20 20 20  zParentSeq);.   
1eb90 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f   sqlite3_result_
1eba0 74 65 78 74 28 70 43 74 78 2c 20 7a 2c 20 2d 31  text(pCtx, z, -1
1ebb0 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45  , SQLITE_TRANSIE
1ebc0 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  NT);.    sqlite3
1ebd0 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 7d 0a  _free(z);.  }.}.
1ebe0 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70 6c  ../*.** The impl
1ebf0 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 64 6f  ementation of do
1ec00 74 2d 63 6f 6d 6d 61 6e 64 20 22 2e 6c 69 6e 74  t-command ".lint
1ec10 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 22 2e 0a   fkey-indexes"..
1ec20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 69  */.static int li
1ec30 6e 74 46 6b 65 79 49 6e 64 65 78 65 73 28 0a 20  ntFkeyIndexes(. 
1ec40 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74   ShellState *pSt
1ec50 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20 20  ate,            
1ec60 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68 65 6c   /* Current shel
1ec70 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f 0a  l tool state */.
1ec80 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c 20    char **azArg, 
1ec90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eca0 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61 72    /* Array of ar
1ecb0 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20 74  guments passed t
1ecc0 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a 2f  o dot command */
1ecd0 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20 20  .  int nArg     
1ece0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ecf0 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
1ed00 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72 67  entries in azArg
1ed10 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  [] */.){.  sqlit
1ed20 65 33 20 2a 64 62 20 3d 20 70 53 74 61 74 65 2d  e3 *db = pState-
1ed30 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61  >db;       /* Da
1ed40 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74 6f  tabase handle to
1ed50 20 71 75 65 72 79 20 22 6d 61 69 6e 22 20 64 62   query "main" db
1ed60 20 6f 66 20 2a 2f 0a 20 20 46 49 4c 45 20 2a 6f   of */.  FILE *o
1ed70 75 74 20 3d 20 70 53 74 61 74 65 2d 3e 6f 75 74  ut = pState->out
1ed80 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72 65  ;        /* Stre
1ed90 61 6d 20 74 6f 20 77 72 69 74 65 20 6e 6f 6e 2d  am to write non-
1eda0 65 72 72 6f 72 20 6f 75 74 70 75 74 20 74 6f 20  error output to 
1edb0 2a 2f 0a 20 20 69 6e 74 20 62 56 65 72 62 6f 73  */.  int bVerbos
1edc0 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  e = 0;          
1edd0 20 20 20 20 20 2f 2a 20 49 66 20 2d 76 65 72 62       /* If -verb
1ede0 6f 73 65 20 69 73 20 70 72 65 73 65 6e 74 20 2a  ose is present *
1edf0 2f 0a 20 20 69 6e 74 20 62 47 72 6f 75 70 42 79  /.  int bGroupBy
1ee00 50 61 72 65 6e 74 20 3d 20 30 3b 20 20 20 20 20  Parent = 0;     
1ee10 20 20 20 20 2f 2a 20 49 66 20 2d 67 72 6f 75 70      /* If -group
1ee20 62 79 70 61 72 65 6e 74 20 69 73 20 70 72 65 73  byparent is pres
1ee30 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b 20  ent */.  int i; 
1ee40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ee50 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20 69           /* To i
1ee60 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20 61  terate through a
1ee70 7a 41 72 67 5b 5d 20 2a 2f 0a 20 20 63 6f 6e 73  zArg[] */.  cons
1ee80 74 20 63 68 61 72 20 2a 7a 49 6e 64 65 6e 74 20  t char *zIndent 
1ee90 3d 20 22 22 3b 20 20 20 20 20 20 20 2f 2a 20 48  = "";       /* H
1eea0 6f 77 20 6d 75 63 68 20 74 6f 20 69 6e 64 65 6e  ow much to inden
1eeb0 74 20 43 52 45 41 54 45 20 49 4e 44 45 58 20 62  t CREATE INDEX b
1eec0 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20  y */.  int rc;  
1eed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eee0 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e         /* Return
1eef0 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69 74   code */.  sqlit
1ef00 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20  e3_stmt *pSql = 
1ef10 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  0;         /* Co
1ef20 6d 70 69 6c 65 64 20 76 65 72 73 69 6f 6e 20 6f  mpiled version o
1ef30 66 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  f SQL statement 
1ef40 62 65 6c 6f 77 20 2a 2f 0a 0a 20 20 2f 2a 0a 20  below */..  /*. 
1ef50 20 2a 2a 20 54 68 69 73 20 53 45 4c 45 43 54 20   ** This SELECT 
1ef60 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e  statement return
1ef70 73 20 6f 6e 65 20 72 6f 77 20 66 6f 72 20 65 61  s one row for ea
1ef80 63 68 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  ch foreign key c
1ef90 6f 6e 73 74 72 61 69 6e 74 0a 20 20 2a 2a 20 69  onstraint.  ** i
1efa0 6e 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66 20  n the schema of 
1efb0 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61 73  the main databas
1efc0 65 2e 20 54 68 65 20 63 6f 6c 75 6d 6e 20 76 61  e. The column va
1efd0 6c 75 65 73 20 61 72 65 3a 0a 20 20 2a 2a 0a 20  lues are:.  **. 
1efe0 20 2a 2a 20 30 2e 20 54 68 65 20 74 65 78 74 20   ** 0. The text 
1eff0 6f 66 20 61 6e 20 53 51 4c 20 73 74 61 74 65 6d  of an SQL statem
1f000 65 6e 74 20 73 69 6d 69 6c 61 72 20 74 6f 3a 0a  ent similar to:.
1f010 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 22    **.  **      "
1f020 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
1f030 41 4e 20 53 45 4c 45 43 54 20 31 20 46 52 4f 4d  AN SELECT 1 FROM
1f040 20 63 68 69 6c 64 5f 74 61 62 6c 65 20 57 48 45   child_table WHE
1f050 52 45 20 63 68 69 6c 64 5f 6b 65 79 3d 3f 22 0a  RE child_key=?".
1f060 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 54 68 69    **.  **    Thi
1f070 73 20 53 45 4c 45 43 54 20 69 73 20 73 69 6d 69  s SELECT is simi
1f080 6c 61 72 20 74 6f 20 74 68 65 20 6f 6e 65 20 74  lar to the one t
1f090 68 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e 20  hat the foreign 
1f0a0 6b 65 79 73 20 69 6d 70 6c 65 6d 65 6e 74 61 74  keys implementat
1f0b0 69 6f 6e 0a 20 20 2a 2a 20 20 20 20 6e 65 65 64  ion.  **    need
1f0c0 73 20 74 6f 20 72 75 6e 20 69 6e 74 65 72 6e 61  s to run interna
1f0d0 6c 6c 79 20 6f 6e 20 63 68 69 6c 64 20 74 61 62  lly on child tab
1f0e0 6c 65 73 2e 20 49 66 20 74 68 65 72 65 20 69 73  les. If there is
1f0f0 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63   an index that c
1f100 61 6e 0a 20 20 2a 2a 20 20 20 20 62 65 20 75 73  an.  **    be us
1f110 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20 74  ed to optimize t
1f120 68 69 73 20 71 75 65 72 79 2c 20 74 68 65 6e 20  his query, then 
1f130 69 74 20 63 61 6e 20 61 6c 73 6f 20 62 65 20 75  it can also be u
1f140 73 65 64 20 62 79 20 74 68 65 20 46 4b 0a 20 20  sed by the FK.  
1f150 2a 2a 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74 61  **    implementa
1f160 74 69 6f 6e 20 74 6f 20 6f 70 74 69 6d 69 7a 65  tion to optimize
1f170 20 44 45 4c 45 54 45 20 6f 72 20 55 50 44 41 54   DELETE or UPDAT
1f180 45 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 20  E statements on 
1f190 74 68 65 20 70 61 72 65 6e 74 0a 20 20 2a 2a 20  the parent.  ** 
1f1a0 20 20 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a 20     table..  **. 
1f1b0 20 2a 2a 20 31 2e 20 41 20 47 4c 4f 42 20 70 61   ** 1. A GLOB pa
1f1c0 74 74 65 72 6e 20 73 75 69 74 61 62 6c 65 20 66  ttern suitable f
1f1d0 6f 72 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  or sqlite3_strgl
1f1e0 6f 62 28 29 2e 20 49 66 20 74 68 65 20 70 6c 61  ob(). If the pla
1f1f0 6e 20 6f 75 74 70 75 74 20 62 79 0a 20 20 2a 2a  n output by.  **
1f200 20 20 20 20 74 68 65 20 45 58 50 4c 41 49 4e 20      the EXPLAIN 
1f210 51 55 45 52 59 20 50 4c 41 4e 20 63 6f 6d 6d 61  QUERY PLAN comma
1f220 6e 64 20 6d 61 74 63 68 65 73 20 74 68 69 73 20  nd matches this 
1f230 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 74 68  pattern, then th
1f240 65 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 20 20  e schema.  **   
1f250 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e 64   contains an ind
1f260 65 78 20 74 68 61 74 20 63 61 6e 20 62 65 20 75  ex that can be u
1f270 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20  sed to optimize 
1f280 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2a 0a  the query..  **.
1f290 20 20 2a 2a 20 32 2e 20 48 75 6d 61 6e 20 72 65    ** 2. Human re
1f2a0 61 64 61 62 6c 65 20 74 65 78 74 20 74 68 61 74  adable text that
1f2b0 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20 63   describes the c
1f2c0 68 69 6c 64 20 74 61 62 6c 65 20 61 6e 64 20 63  hild table and c
1f2d0 6f 6c 75 6d 6e 73 2e 20 65 2e 67 2e 0a 20 20 2a  olumns. e.g..  *
1f2e0 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 22 63 68  *.  **       "ch
1f2f0 69 6c 64 5f 74 61 62 6c 65 28 63 68 69 6c 64 5f  ild_table(child_
1f300 6b 65 79 31 2c 20 63 68 69 6c 64 5f 6b 65 79 32  key1, child_key2
1f310 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 33 2e 20  )".  **.  ** 3. 
1f320 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20 74  Human readable t
1f330 65 78 74 20 74 68 61 74 20 64 65 73 63 72 69 62  ext that describ
1f340 65 73 20 74 68 65 20 70 61 72 65 6e 74 20 74 61  es the parent ta
1f350 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 73 2e  ble and columns.
1f360 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20   e.g..  **.  ** 
1f370 20 20 20 20 20 20 22 70 61 72 65 6e 74 5f 74 61        "parent_ta
1f380 62 6c 65 28 70 61 72 65 6e 74 5f 6b 65 79 31 2c  ble(parent_key1,
1f390 20 70 61 72 65 6e 74 5f 6b 65 79 32 29 22 0a 20   parent_key2)". 
1f3a0 20 2a 2a 0a 20 20 2a 2a 20 34 2e 20 41 20 66 75   **.  ** 4. A fu
1f3b0 6c 6c 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  ll CREATE INDEX 
1f3c0 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 61 6e  statement for an
1f3d0 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 75 6c   index that coul
1f3e0 64 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20 2a  d be used to.  *
1f3f0 2a 20 20 20 20 6f 70 74 69 6d 69 7a 65 20 44 45  *    optimize DE
1f400 4c 45 54 45 20 6f 72 20 55 50 44 41 54 45 20 73  LETE or UPDATE s
1f410 74 61 74 65 6d 65 6e 74 73 20 6f 6e 20 74 68 65  tatements on the
1f420 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2e 20 65   parent table. e
1f430 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  .g..  **.  **   
1f440 20 20 20 20 22 43 52 45 41 54 45 20 49 4e 44 45      "CREATE INDE
1f450 58 20 63 68 69 6c 64 5f 74 61 62 6c 65 5f 63 68  X child_table_ch
1f460 69 6c 64 5f 6b 65 79 20 4f 4e 20 63 68 69 6c 64  ild_key ON child
1f470 5f 74 61 62 6c 65 28 63 68 69 6c 64 5f 6b 65 79  _table(child_key
1f480 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 35 2e 20  )".  **.  ** 5. 
1f490 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  The name of the 
1f4a0 70 61 72 65 6e 74 20 74 61 62 6c 65 2e 0a 20 20  parent table..  
1f4b0 2a 2a 0a 20 20 2a 2a 20 54 68 65 73 65 20 73 69  **.  ** These si
1f4c0 78 20 76 61 6c 75 65 73 20 61 72 65 20 75 73 65  x values are use
1f4d0 64 20 62 79 20 74 68 65 20 43 20 6c 6f 67 69 63  d by the C logic
1f4e0 20 62 65 6c 6f 77 20 74 6f 20 67 65 6e 65 72 61   below to genera
1f4f0 74 65 20 74 68 65 20 72 65 70 6f 72 74 2e 0a 20  te the report.. 
1f500 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1f510 20 2a 7a 53 71 6c 20 3d 0a 20 20 22 53 45 4c 45   *zSql =.  "SELE
1f520 43 54 20 22 0a 20 20 20 20 22 20 20 20 20 20 27  CT ".    "     '
1f530 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c  EXPLAIN QUERY PL
1f540 41 4e 20 53 45 4c 45 43 54 20 31 20 46 52 4f 4d  AN SELECT 1 FROM
1f550 20 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61   ' || quote(s.na
1f560 6d 65 29 20 7c 7c 20 27 20 57 48 45 52 45 20 27  me) || ' WHERE '
1f570 22 0a 20 20 20 20 22 20 20 7c 7c 20 67 72 6f 75  ".    "  || grou
1f580 70 5f 63 6f 6e 63 61 74 28 71 75 6f 74 65 28 73  p_concat(quote(s
1f590 2e 6e 61 6d 65 29 20 7c 7c 20 27 2e 27 20 7c 7c  .name) || '.' ||
1f5a0 20 71 75 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d 29   quote(f.[from])
1f5b0 20 7c 7c 20 27 3d 3f 27 20 22 0a 20 20 20 20 22   || '=?' ".    "
1f5c0 20 20 7c 7c 20 66 6b 65 79 5f 63 6f 6c 6c 61 74    || fkey_collat
1f5d0 65 5f 63 6c 61 75 73 65 28 22 0a 20 20 20 20 22  e_clause(".    "
1f5e0 20 20 20 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d         f.[table]
1f5f0 2c 20 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f  , COALESCE(f.[to
1f600 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73 2e  ], p.[name]), s.
1f610 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29 2c  name, f.[from]),
1f620 27 20 41 4e 44 20 27 29 22 0a 20 20 20 20 22 2c  ' AND ')".    ",
1f630 20 22 0a 20 20 20 20 22 20 20 20 20 20 27 53 45   ".    "     'SE
1f640 41 52 43 48 20 54 41 42 4c 45 20 27 20 7c 7c 20  ARCH TABLE ' || 
1f650 73 2e 6e 61 6d 65 20 7c 7c 20 27 20 55 53 49 4e  s.name || ' USIN
1f660 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45 58  G COVERING INDEX
1f670 2a 28 27 22 0a 20 20 20 20 22 20 20 7c 7c 20 67  *('".    "  || g
1f680 72 6f 75 70 5f 63 6f 6e 63 61 74 28 27 2a 3d 3f  roup_concat('*=?
1f690 27 2c 20 27 20 41 4e 44 20 27 29 20 7c 7c 20 27  ', ' AND ') || '
1f6a0 29 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20 20  )'".    ", ".   
1f6b0 20 22 20 20 20 20 20 73 2e 6e 61 6d 65 20 20 7c   "     s.name  |
1f6c0 7c 20 27 28 27 20 7c 7c 20 67 72 6f 75 70 5f 63  | '(' || group_c
1f6d0 6f 6e 63 61 74 28 66 2e 5b 66 72 6f 6d 5d 2c 20  oncat(f.[from], 
1f6e0 20 27 2c 20 27 29 20 7c 7c 20 27 29 27 22 0a 20   ', ') || ')'". 
1f6f0 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20 20 20     ", ".    "   
1f700 20 20 66 2e 5b 74 61 62 6c 65 5d 20 7c 7c 20 27    f.[table] || '
1f710 28 27 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63  (' || group_conc
1f720 61 74 28 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74  at(COALESCE(f.[t
1f730 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 29 20 7c  o], p.[name])) |
1f740 7c 20 27 29 27 22 0a 20 20 20 20 22 2c 20 22 0a  | ')'".    ", ".
1f750 20 20 20 20 22 20 20 20 20 20 27 43 52 45 41 54      "     'CREAT
1f760 45 20 49 4e 44 45 58 20 27 20 7c 7c 20 71 75 6f  E INDEX ' || quo
1f770 74 65 28 73 2e 6e 61 6d 65 20 7c 7c 27 5f 27 7c  te(s.name ||'_'|
1f780 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 66  | group_concat(f
1f790 2e 5b 66 72 6f 6d 5d 2c 20 27 5f 27 29 29 22 0a  .[from], '_'))".
1f7a0 20 20 20 20 22 20 20 7c 7c 20 27 20 4f 4e 20 27      "  || ' ON '
1f7b0 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61 6d 65   || quote(s.name
1f7c0 29 20 7c 7c 20 27 28 27 22 0a 20 20 20 20 22 20  ) || '('".    " 
1f7d0 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74   || group_concat
1f7e0 28 71 75 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d 29  (quote(f.[from])
1f7f0 20 7c 7c 22 0a 20 20 20 20 22 20 20 20 20 20 20   ||".    "      
1f800 20 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f 63    fkey_collate_c
1f810 6c 61 75 73 65 28 22 0a 20 20 20 20 22 20 20 20  lause(".    "   
1f820 20 20 20 20 20 20 20 66 2e 5b 74 61 62 6c 65 5d         f.[table]
1f830 2c 20 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74 6f  , COALESCE(f.[to
1f840 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73 2e  ], p.[name]), s.
1f850 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29 2c  name, f.[from]),
1f860 20 27 2c 20 27 29 22 0a 20 20 20 20 22 20 20 7c   ', ')".    "  |
1f870 7c 20 27 29 3b 27 22 0a 20 20 20 20 22 2c 20 22  | ');'".    ", "
1f880 0a 20 20 20 20 22 20 20 20 20 20 66 2e 5b 74 61  .    "     f.[ta
1f890 62 6c 65 5d 20 22 0a 20 20 20 20 22 46 52 4f 4d  ble] ".    "FROM
1f8a0 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 41   sqlite_master A
1f8b0 53 20 73 2c 20 70 72 61 67 6d 61 5f 66 6f 72 65  S s, pragma_fore
1f8c0 69 67 6e 5f 6b 65 79 5f 6c 69 73 74 28 73 2e 6e  ign_key_list(s.n
1f8d0 61 6d 65 29 20 41 53 20 66 20 22 0a 20 20 20 20  ame) AS f ".    
1f8e0 22 4c 45 46 54 20 4a 4f 49 4e 20 70 72 61 67 6d  "LEFT JOIN pragm
1f8f0 61 5f 74 61 62 6c 65 5f 69 6e 66 6f 20 41 53 20  a_table_info AS 
1f900 70 20 4f 4e 20 28 70 6b 2d 31 3d 73 65 71 20 41  p ON (pk-1=seq A
1f910 4e 44 20 70 2e 61 72 67 3d 66 2e 5b 74 61 62 6c  ND p.arg=f.[tabl
1f920 65 5d 29 20 22 0a 20 20 20 20 22 47 52 4f 55 50  e]) ".    "GROUP
1f930 20 42 59 20 73 2e 6e 61 6d 65 2c 20 66 2e 69 64   BY s.name, f.id
1f940 20 22 0a 20 20 20 20 22 4f 52 44 45 52 20 42 59   ".    "ORDER BY
1f950 20 28 43 41 53 45 20 57 48 45 4e 20 3f 20 54 48   (CASE WHEN ? TH
1f960 45 4e 20 66 2e 5b 74 61 62 6c 65 5d 20 45 4c 53  EN f.[table] ELS
1f970 45 20 73 2e 6e 61 6d 65 20 45 4e 44 29 22 0a 20  E s.name END)". 
1f980 20 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20   ;.  const char 
1f990 2a 7a 47 6c 6f 62 49 50 4b 20 3d 20 22 53 45 41  *zGlobIPK = "SEA
1f9a0 52 43 48 20 54 41 42 4c 45 20 2a 20 55 53 49 4e  RCH TABLE * USIN
1f9b0 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  G INTEGER PRIMAR
1f9c0 59 20 4b 45 59 20 28 72 6f 77 69 64 3d 3f 29 22  Y KEY (rowid=?)"
1f9d0 3b 0a 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c  ;..  for(i=2; i<
1f9e0 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
1f9f0 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 73 74 72  int n = (int)str
1fa00 6c 65 6e 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  len(azArg[i]);. 
1fa10 20 20 20 69 66 28 20 6e 3e 31 20 26 26 20 73 71     if( n>1 && sq
1fa20 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 22  lite3_strnicmp("
1fa30 2d 76 65 72 62 6f 73 65 22 2c 20 61 7a 41 72 67  -verbose", azArg
1fa40 5b 69 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  [i], n)==0 ){.  
1fa50 20 20 20 20 62 56 65 72 62 6f 73 65 20 3d 20 31      bVerbose = 1
1fa60 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65  ;.    }.    else
1fa70 20 69 66 28 20 6e 3e 31 20 26 26 20 73 71 6c 69   if( n>1 && sqli
1fa80 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 2d 67  te3_strnicmp("-g
1fa90 72 6f 75 70 62 79 70 61 72 65 6e 74 22 2c 20 61  roupbyparent", a
1faa0 7a 41 72 67 5b 69 5d 2c 20 6e 29 3d 3d 30 20 29  zArg[i], n)==0 )
1fab0 7b 0a 20 20 20 20 20 20 62 47 72 6f 75 70 42 79  {.      bGroupBy
1fac0 50 61 72 65 6e 74 20 3d 20 31 3b 0a 20 20 20 20  Parent = 1;.    
1fad0 20 20 7a 49 6e 64 65 6e 74 20 3d 20 22 20 20 20    zIndent = "   
1fae0 20 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c   ";.    }.    el
1faf0 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
1fb00 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
1fb10 61 67 65 3a 20 25 73 20 25 73 20 3f 2d 76 65 72  age: %s %s ?-ver
1fb20 62 6f 73 65 3f 20 3f 2d 67 72 6f 75 70 62 79 70  bose? ?-groupbyp
1fb30 61 72 65 6e 74 3f 5c 6e 22 2c 0a 20 20 20 20 20  arent?\n",.     
1fb40 20 20 20 20 20 61 7a 41 72 67 5b 30 5d 2c 20 61       azArg[0], a
1fb50 7a 41 72 67 5b 31 5d 0a 20 20 20 20 20 20 29 3b  zArg[1].      );
1fb60 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
1fb70 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
1fb80 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67 69  }.  }..  /* Regi
1fb90 73 74 65 72 20 74 68 65 20 66 6b 65 79 5f 63 6f  ster the fkey_co
1fba0 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 29 20 53  llate_clause() S
1fbb0 51 4c 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  QL function */. 
1fbc0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63 72   rc = sqlite3_cr
1fbd0 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64 62  eate_function(db
1fbe0 2c 20 22 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f  , "fkey_collate_
1fbf0 63 6c 61 75 73 65 22 2c 20 34 2c 20 53 51 4c 49  clause", 4, SQLI
1fc00 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20 30  TE_UTF8,.      0
1fc10 2c 20 73 68 65 6c 6c 46 6b 65 79 43 6f 6c 6c 61  , shellFkeyColla
1fc20 74 65 43 6c 61 75 73 65 2c 20 30 2c 20 30 0a 20  teClause, 0, 0. 
1fc30 20 29 3b 0a 0a 0a 20 20 69 66 28 20 72 63 3d 3d   );...  if( rc==
1fc40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1fc50 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
1fc60 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53 71  epare_v2(db, zSq
1fc70 6c 2c 20 2d 31 2c 20 26 70 53 71 6c 2c 20 30 29  l, -1, &pSql, 0)
1fc80 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d 3d  ;.  }.  if( rc==
1fc90 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
1fca0 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69 6e   sqlite3_bind_in
1fcb0 74 28 70 53 71 6c 2c 20 31 2c 20 62 47 72 6f 75  t(pSql, 1, bGrou
1fcc0 70 42 79 50 61 72 65 6e 74 29 3b 0a 20 20 7d 0a  pByParent);.  }.
1fcd0 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54  .  if( rc==SQLIT
1fce0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74 20  E_OK ){.    int 
1fcf0 72 63 32 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  rc2;.    char *z
1fd00 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 77 68  Prev = 0;.    wh
1fd10 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d  ile( SQLITE_ROW=
1fd20 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53  =sqlite3_step(pS
1fd30 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ql) ){.      int
1fd40 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20 20   res = -1;.     
1fd50 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70   sqlite3_stmt *p
1fd60 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20  Explain = 0;.   
1fd70 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1fd80 45 51 50 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  EQP = (const cha
1fd90 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
1fda0 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29 3b  n_text(pSql, 0);
1fdb0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
1fdc0 72 20 2a 7a 47 6c 6f 62 20 3d 20 28 63 6f 6e 73  r *zGlob = (cons
1fdd0 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
1fde0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
1fdf0 2c 20 31 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73  , 1);.      cons
1fe00 74 20 63 68 61 72 20 2a 7a 46 72 6f 6d 20 3d 20  t char *zFrom = 
1fe10 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
1fe20 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
1fe30 28 70 53 71 6c 2c 20 32 29 3b 0a 20 20 20 20 20  (pSql, 2);.     
1fe40 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
1fe50 72 67 65 74 20 3d 20 28 63 6f 6e 73 74 20 63 68  rget = (const ch
1fe60 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
1fe70 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 33 29  mn_text(pSql, 3)
1fe80 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
1fe90 61 72 20 2a 7a 43 49 20 3d 20 28 63 6f 6e 73 74  ar *zCI = (const
1fea0 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
1feb0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
1fec0 20 34 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74   4);.      const
1fed0 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 20 3d   char *zParent =
1fee0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
1fef0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
1ff00 74 28 70 53 71 6c 2c 20 35 29 3b 0a 0a 20 20 20  t(pSql, 5);..   
1ff10 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
1ff20 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a  prepare_v2(db, z
1ff30 45 51 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61  EQP, -1, &pExpla
1ff40 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  in, 0);.      if
1ff50 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc!=SQLITE_OK 
1ff60 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 69  ) break;.      i
1ff70 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73  f( SQLITE_ROW==s
1ff80 71 6c 69 74 65 33 5f 73 74 65 70 28 70 45 78 70  qlite3_step(pExp
1ff90 6c 61 69 6e 29 20 29 7b 0a 20 20 20 20 20 20 20  lain) ){.       
1ffa0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50 6c   const char *zPl
1ffb0 61 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  an = (const char
1ffc0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
1ffd0 5f 74 65 78 74 28 70 45 78 70 6c 61 69 6e 2c 20  _text(pExplain, 
1ffe0 33 29 3b 0a 20 20 20 20 20 20 20 20 72 65 73 20  3);.        res 
1fff0 3d 20 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  = (.            
20000 20 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72    0==sqlite3_str
20010 67 6c 6f 62 28 7a 47 6c 6f 62 2c 20 7a 50 6c 61  glob(zGlob, zPla
20020 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  n).           ||
20030 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72 67   0==sqlite3_strg
20040 6c 6f 62 28 7a 47 6c 6f 62 49 50 4b 2c 20 7a 50  lob(zGlobIPK, zP
20050 6c 61 6e 29 0a 20 20 20 20 20 20 20 20 29 3b 0a  lan).        );.
20060 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63        }.      rc
20070 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c   = sqlite3_final
20080 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20  ize(pExplain);. 
20090 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c       if( rc!=SQL
200a0 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b 0a  ITE_OK ) break;.
200b0 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3c 30  .      if( res<0
200c0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
200d0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
200e0 45 72 72 6f 72 3a 20 69 6e 74 65 72 6e 61 6c 20  Error: internal 
200f0 65 72 72 6f 72 22 29 3b 0a 20 20 20 20 20 20 20  error");.       
20100 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65   break;.      }e
20110 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28  lse{.        if(
20120 20 62 47 72 6f 75 70 42 79 50 61 72 65 6e 74 0a   bGroupByParent.
20130 20 20 20 20 20 20 20 20 26 26 20 28 62 56 65 72          && (bVer
20140 62 6f 73 65 20 7c 7c 20 72 65 73 3d 3d 30 29 0a  bose || res==0).
20150 20 20 20 20 20 20 20 20 26 26 20 28 7a 50 72 65          && (zPre
20160 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f  v==0 || sqlite3_
20170 73 74 72 69 63 6d 70 28 7a 50 61 72 65 6e 74 2c  stricmp(zParent,
20180 20 7a 50 72 65 76 29 29 0a 20 20 20 20 20 20 20   zPrev)).       
20190 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61   ){.          ra
201a0 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d  w_printf(out, "-
201b0 2d 20 50 61 72 65 6e 74 20 74 61 62 6c 65 20 25  - Parent table %
201c0 73 5c 6e 22 2c 20 7a 50 61 72 65 6e 74 29 3b 0a  s\n", zParent);.
201d0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
201e0 33 5f 66 72 65 65 28 7a 50 72 65 76 29 3b 0a 20  3_free(zPrev);. 
201f0 20 20 20 20 20 20 20 20 20 7a 50 72 65 76 20 3d           zPrev =
20200 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
20210 28 22 25 73 22 2c 20 7a 50 61 72 65 6e 74 29 3b  ("%s", zParent);
20220 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
20230 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20 29      if( res==0 )
20240 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77 5f  {.          raw_
20250 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 25  printf(out, "%s%
20260 73 20 2d 2d 3e 20 25 73 5c 6e 22 2c 20 7a 49 6e  s --> %s\n", zIn
20270 64 65 6e 74 2c 20 7a 43 49 2c 20 7a 54 61 72 67  dent, zCI, zTarg
20280 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  et);.        }el
20290 73 65 20 69 66 28 20 62 56 65 72 62 6f 73 65 20  se if( bVerbose 
202a0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  ){.          raw
202b0 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
202c0 2f 2a 20 6e 6f 20 65 78 74 72 61 20 69 6e 64 65  /* no extra inde
202d0 78 65 73 20 72 65 71 75 69 72 65 64 20 66 6f 72  xes required for
202e0 20 25 73 20 2d 3e 20 25 73 20 2a 2f 5c 6e 22 2c   %s -> %s */\n",
202f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7a  .              z
20300 49 6e 64 65 6e 74 2c 20 7a 46 72 6f 6d 2c 20 7a  Indent, zFrom, z
20310 54 61 72 67 65 74 0a 20 20 20 20 20 20 20 20 20  Target.         
20320 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   );.        }.  
20330 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
20340 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50 72  sqlite3_free(zPr
20350 65 76 29 3b 0a 0a 20 20 20 20 69 66 28 20 72 63  ev);..    if( rc
20360 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
20370 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
20380 73 74 64 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20  stderr, "%s\n", 
20390 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64  sqlite3_errmsg(d
203a0 62 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  b));.    }..    
203b0 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66 69  rc2 = sqlite3_fi
203c0 6e 61 6c 69 7a 65 28 70 53 71 6c 29 3b 0a 20 20  nalize(pSql);.  
203d0 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
203e0 5f 4f 4b 20 26 26 20 72 63 32 21 3d 53 51 4c 49  _OK && rc2!=SQLI
203f0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
20400 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20 72  c = rc2;.      r
20410 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
20420 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  , "%s\n", sqlite
20430 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a 20  3_errmsg(db));. 
20440 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
20450 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
20460 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c  err, "%s\n", sql
20470 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29  ite3_errmsg(db))
20480 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  ;.  }..  return 
20490 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70  rc;.}../*.** Imp
204a0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22  lementation of "
204b0 2e 6c 69 6e 74 22 20 64 6f 74 20 63 6f 6d 6d 61  .lint" dot comma
204c0 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
204d0 74 20 6c 69 6e 74 44 6f 74 43 6f 6d 6d 61 6e 64  t lintDotCommand
204e0 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  (.  ShellState *
204f0 70 53 74 61 74 65 2c 20 20 20 20 20 20 20 20 20  pState,         
20500 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73      /* Current s
20510 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20  hell tool state 
20520 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72  */.  char **azAr
20530 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
20540 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66       /* Array of
20550 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65   arguments passe
20560 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64  d to dot command
20570 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20 20   */.  int nArg  
20580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20590 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
205a0 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a  of entries in az
205b0 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 69 6e  Arg[] */.){.  in
205c0 74 20 6e 3b 0a 20 20 6e 20 3d 20 28 6e 41 72 67  t n;.  n = (nArg
205d0 3e 3d 32 20 3f 20 28 69 6e 74 29 73 74 72 6c 65  >=2 ? (int)strle
205e0 6e 28 61 7a 41 72 67 5b 31 5d 29 20 3a 20 30 29  n(azArg[1]) : 0)
205f0 3b 0a 20 20 69 66 28 20 6e 3c 31 20 7c 7c 20 73  ;.  if( n<1 || s
20600 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
20610 61 7a 41 72 67 5b 31 5d 2c 20 22 66 6b 65 79 2d  azArg[1], "fkey-
20620 69 6e 64 65 78 65 73 22 2c 20 6e 29 20 29 20 67  indexes", n) ) g
20630 6f 74 6f 20 75 73 61 67 65 3b 0a 20 20 72 65 74  oto usage;.  ret
20640 75 72 6e 20 6c 69 6e 74 46 6b 65 79 49 6e 64 65  urn lintFkeyInde
20650 78 65 73 28 70 53 74 61 74 65 2c 20 61 7a 41 72  xes(pState, azAr
20660 67 2c 20 6e 41 72 67 29 3b 0a 0a 20 75 73 61 67  g, nArg);.. usag
20670 65 3a 0a 20 20 72 61 77 5f 70 72 69 6e 74 66 28  e:.  raw_printf(
20680 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 20 25  stderr, "Usage %
20690 73 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 20 3f 73  s sub-command ?s
206a0 77 69 74 63 68 65 73 2e 2e 2e 3f 5c 6e 22 2c 20  witches...?\n", 
206b0 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 72 61 77  azArg[0]);.  raw
206c0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
206d0 22 57 68 65 72 65 20 73 75 62 2d 63 6f 6d 6d 61  "Where sub-comma
206e0 6e 64 73 20 61 72 65 3a 5c 6e 22 29 3b 0a 20 20  nds are:\n");.  
206f0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
20700 72 2c 20 22 20 20 20 20 66 6b 65 79 2d 69 6e 64  r, "    fkey-ind
20710 65 78 65 73 5c 6e 22 29 3b 0a 20 20 72 65 74 75  exes\n");.  retu
20720 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b  rn SQLITE_ERROR;
20730 0a 7d 0a 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .}..static void 
20740 73 68 65 6c 6c 50 72 65 70 61 72 65 28 0a 20 20  shellPrepare(.  
20750 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 0a 20 20  sqlite3 *db, .  
20760 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20 63 6f 6e  int *pRc, .  con
20770 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20 0a  st char *zSql, .
20780 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
20790 2a 70 70 53 74 6d 74 0a 29 7b 0a 20 20 2a 70 70  *ppStmt.){.  *pp
207a0 53 74 6d 74 20 3d 20 30 3b 0a 20 20 69 66 28 20  Stmt = 0;.  if( 
207b0 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  *pRc==SQLITE_OK 
207c0 29 7b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d 20  ){.    int rc = 
207d0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
207e0 76 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  v2(db, zSql, -1,
207f0 20 70 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   ppStmt, 0);.   
20800 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f   if( rc!=SQLITE_
20810 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  OK ){.      raw_
20820 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
20830 73 71 6c 20 65 72 72 6f 72 3a 20 25 73 20 28 25  sql error: %s (%
20840 64 29 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20  d)\n", .        
20850 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67    sqlite3_errmsg
20860 28 64 62 29 2c 20 73 71 6c 69 74 65 33 5f 65 72  (db), sqlite3_er
20870 72 63 6f 64 65 28 64 62 29 0a 20 20 20 20 20 20  rcode(db).      
20880 29 3b 0a 20 20 20 20 20 20 2a 70 52 63 20 3d 20  );.      *pRc = 
20890 72 63 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  rc;.    }.  }.}.
208a0 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 68 65  .static void she
208b0 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66 28  llPreparePrintf(
208c0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  .  sqlite3 *db, 
208d0 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20  .  int *pRc, .  
208e0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 2a 70  sqlite3_stmt **p
208f0 70 53 74 6d 74 2c 0a 20 20 63 6f 6e 73 74 20 63  pStmt,.  const c
20900 68 61 72 20 2a 7a 46 6d 74 2c 20 0a 20 20 2e 2e  har *zFmt, .  ..
20910 2e 0a 29 7b 0a 20 20 2a 70 70 53 74 6d 74 20 3d  ..){.  *ppStmt =
20920 20 30 3b 0a 20 20 69 66 28 20 2a 70 52 63 3d 3d   0;.  if( *pRc==
20930 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
20940 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20 20   va_list ap;.   
20950 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20 76 61   char *z;.    va
20960 5f 73 74 61 72 74 28 61 70 2c 20 7a 46 6d 74 29  _start(ap, zFmt)
20970 3b 0a 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65  ;.    z = sqlite
20980 33 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6d 74 2c  3_vmprintf(zFmt,
20990 20 61 70 29 3b 0a 20 20 20 20 69 66 28 20 7a 3d   ap);.    if( z=
209a0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2a 70 52 63  =0 ){.      *pRc
209b0 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
209c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
209d0 20 20 73 68 65 6c 6c 50 72 65 70 61 72 65 28 64    shellPrepare(d
209e0 62 2c 20 70 52 63 2c 20 7a 2c 20 70 70 53 74 6d  b, pRc, z, ppStm
209f0 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
20a00 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 20 20 7d  3_free(z);.    }
20a10 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20 76  .  }.}..static v
20a20 6f 69 64 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a  oid shellFinaliz
20a30 65 28 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a  e(.  int *pRc, .
20a40 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
20a50 70 53 74 6d 74 0a 29 7b 0a 20 20 69 66 28 20 70  pStmt.){.  if( p
20a60 53 74 6d 74 20 29 7b 0a 20 20 20 20 73 71 6c 69  Stmt ){.    sqli
20a70 74 65 33 20 2a 64 62 20 3d 20 73 71 6c 69 74 65  te3 *db = sqlite
20a80 33 5f 64 62 5f 68 61 6e 64 6c 65 28 70 53 74 6d  3_db_handle(pStm
20a90 74 29 3b 0a 20 20 20 20 69 6e 74 20 72 63 20 3d  t);.    int rc =
20aa0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
20ab0 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66  e(pStmt);.    if
20ac0 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54 45 5f 4f  ( *pRc==SQLITE_O
20ad0 4b 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 72  K ){.      if( r
20ae0 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
20af0 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
20b00 74 66 28 73 74 64 65 72 72 2c 20 22 53 51 4c 20  tf(stderr, "SQL 
20b10 65 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71  error: %s\n", sq
20b20 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
20b30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
20b40 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20 20 20   *pRc = rc;.    
20b50 7d 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74 69 63 20  }.  }.}..static 
20b60 76 6f 69 64 20 73 68 65 6c 6c 52 65 73 65 74 28  void shellReset(
20b70 0a 20 20 69 6e 74 20 2a 70 52 63 2c 20 0a 20 20  .  int *pRc, .  
20b80 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
20b90 74 6d 74 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20  tmt.){.  int rc 
20ba0 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74 28  = sqlite3_reset(
20bb0 70 53 74 6d 74 29 3b 0a 20 20 69 66 28 20 2a 70  pStmt);.  if( *p
20bc0 52 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  Rc==SQLITE_OK ){
20bd0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
20be0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
20bf0 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 73 71  sqlite3 *db = sq
20c00 6c 69 74 65 33 5f 64 62 5f 68 61 6e 64 6c 65 28  lite3_db_handle(
20c10 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 72 61  pStmt);.      ra
20c20 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
20c30 20 22 53 51 4c 20 65 72 72 6f 72 3a 20 25 73 5c   "SQL error: %s\
20c40 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  n", sqlite3_errm
20c50 73 67 28 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20  sg(db));.    }. 
20c60 20 20 20 2a 70 52 63 20 3d 20 72 63 3b 0a 20 20     *pRc = rc;.  
20c70 7d 0a 7d 0a 0a 2f 2a 20 0a 2a 2a 20 53 74 72 75  }.}../* .** Stru
20c80 63 74 75 72 65 20 72 65 70 72 65 73 65 6e 74 69  cture representi
20c90 6e 67 20 61 20 73 69 6e 67 6c 65 20 22 2e 61 72  ng a single ".ar
20ca0 22 20 63 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 74 79  " command..*/.ty
20cb0 70 65 64 65 66 20 73 74 72 75 63 74 20 41 72 43  pedef struct ArC
20cc0 6f 6d 6d 61 6e 64 20 41 72 43 6f 6d 6d 61 6e 64  ommand ArCommand
20cd0 3b 0a 73 74 72 75 63 74 20 41 72 43 6f 6d 6d 61  ;.struct ArComma
20ce0 6e 64 20 7b 0a 20 20 69 6e 74 20 65 43 6d 64 3b  nd {.  int eCmd;
20cf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20d00 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 41 52 5f         /* An AR_
20d10 43 4d 44 5f 2a 20 76 61 6c 75 65 20 2a 2f 0a 20  CMD_* value */. 
20d20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
20d30 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  le;             
20d40 20 2f 2a 20 2d 2d 66 69 6c 65 20 61 72 67 75 6d   /* --file argum
20d50 65 6e 74 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  ent, or NULL */.
20d60 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
20d70 69 72 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ir;             
20d80 20 20 2f 2a 20 2d 2d 64 69 72 65 63 74 6f 72 79    /* --directory
20d90 20 61 72 67 75 6d 65 6e 74 2c 20 6f 72 20 4e 55   argument, or NU
20da0 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 62 56 65 72  LL */.  int bVer
20db0 62 6f 73 65 3b 20 20 20 20 20 20 20 20 20 20 20  bose;           
20dc0 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
20dd0 69 66 20 2d 2d 76 65 72 62 6f 73 65 20 2a 2f 0a  if --verbose */.
20de0 20 20 69 6e 74 20 62 5a 69 70 3b 20 20 20 20 20    int bZip;     
20df0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20e00 20 20 2f 2a 20 54 72 75 65 20 69 66 20 2d 2d 7a    /* True if --z
20e10 69 70 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67  ip */.  int nArg
20e20 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
20e30 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
20e40 72 20 6f 66 20 63 6f 6d 6d 61 6e 64 20 61 72 67  r of command arg
20e50 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 63 68 61 72  uments */.  char
20e60 20 2a 2a 61 7a 41 72 67 3b 20 20 20 20 20 20 20   **azArg;       
20e70 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
20e80 72 72 61 79 20 6f 66 20 63 6f 6d 6d 61 6e 64 20  rray of command 
20e90 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 7d 3b 0a  arguments */.};.
20ea0 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 75  ./*.** Print a u
20eb0 73 61 67 65 20 6d 65 73 73 61 67 65 20 66 6f 72  sage message for
20ec0 20 74 68 65 20 2e 61 72 20 63 6f 6d 6d 61 6e 64   the .ar command
20ed0 20 74 6f 20 73 74 64 65 72 72 20 61 6e 64 20 72   to stderr and r
20ee0 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
20ef0 4f 52 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  OR..*/.static in
20f00 74 20 61 72 55 73 61 67 65 28 46 49 4c 45 20 2a  t arUsage(FILE *
20f10 66 29 7b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66  f){.  raw_printf
20f20 28 66 2c 0a 22 5c 6e 22 0a 22 55 73 61 67 65 3a  (f,."\n"."Usage:
20f30 20 2e 61 72 20 5b 4f 50 54 49 4f 4e 2e 2e 2e 5d   .ar [OPTION...]
20f40 20 5b 46 49 4c 45 2e 2e 2e 5d 5c 6e 22 0a 22 54   [FILE...]\n"."T
20f50 68 65 20 2e 61 72 20 63 6f 6d 6d 61 6e 64 20 6d  he .ar command m
20f60 61 6e 61 67 65 73 20 73 71 6c 61 72 20 61 72 63  anages sqlar arc
20f70 68 69 76 65 73 2e 5c 6e 22 0a 22 5c 6e 22 0a 22  hives.\n"."\n"."
20f80 45 78 61 6d 70 6c 65 73 3a 5c 6e 22 0a 22 20 20  Examples:\n"."  
20f90 2e 61 72 20 2d 63 66 20 61 72 63 68 69 76 65 2e  .ar -cf archive.
20fa0 73 61 72 20 66 6f 6f 20 62 61 72 20 20 20 20 23  sar foo bar    #
20fb0 20 43 72 65 61 74 65 20 61 72 63 68 69 76 65 2e   Create archive.
20fc0 73 61 72 20 66 72 6f 6d 20 66 69 6c 65 73 20 66  sar from files f
20fd0 6f 6f 20 61 6e 64 20 62 61 72 5c 6e 22 0a 22 20  oo and bar\n"." 
20fe0 20 2e 61 72 20 2d 74 66 20 61 72 63 68 69 76 65   .ar -tf archive
20ff0 2e 73 61 72 20 20 20 20 20 20 20 20 20 20 20 20  .sar            
21000 23 20 4c 69 73 74 20 6d 65 6d 62 65 72 73 20 6f  # List members o
21010 66 20 61 72 63 68 69 76 65 2e 73 61 72 5c 6e 22  f archive.sar\n"
21020 0a 22 20 20 2e 61 72 20 2d 78 76 66 20 61 72 63  ."  .ar -xvf arc
21030 68 69 76 65 2e 73 61 72 20 20 20 20 20 20 20 20  hive.sar        
21040 20 20 20 23 20 56 65 72 62 6f 73 65 6c 79 20 65     # Verbosely e
21050 78 74 72 61 63 74 20 66 69 6c 65 73 20 66 72 6f  xtract files fro
21060 6d 20 61 72 63 68 69 76 65 2e 73 61 72 5c 6e 22  m archive.sar\n"
21070 0a 22 5c 6e 22 0a 22 45 61 63 68 20 63 6f 6d 6d  ."\n"."Each comm
21080 61 6e 64 20 6c 69 6e 65 20 6d 75 73 74 20 66 65  and line must fe
21090 61 74 75 72 65 20 65 78 61 63 74 6c 79 20 6f 6e  ature exactly on
210a0 65 20 63 6f 6d 6d 61 6e 64 20 6f 70 74 69 6f 6e  e command option
210b0 3a 5c 6e 22 0a 22 20 20 2d 63 2c 20 2d 2d 63 72  :\n"."  -c, --cr
210c0 65 61 74 65 20 20 20 20 20 20 20 20 20 20 20 20  eate            
210d0 20 20 20 43 72 65 61 74 65 20 61 20 6e 65 77 20     Create a new 
210e0 61 72 63 68 69 76 65 5c 6e 22 0a 22 20 20 2d 75  archive\n"."  -u
210f0 2c 20 2d 2d 75 70 64 61 74 65 20 20 20 20 20 20  , --update      
21100 20 20 20 20 20 20 20 20 20 55 70 64 61 74 65 20           Update 
21110 6f 72 20 61 64 64 20 66 69 6c 65 73 20 74 6f 20  or add files to 
21120 61 6e 20 65 78 69 73 74 69 6e 67 20 61 72 63 68  an existing arch
21130 69 76 65 5c 6e 22 0a 22 20 20 2d 74 2c 20 2d 2d  ive\n"."  -t, --
21140 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20 20  list            
21150 20 20 20 20 20 4c 69 73 74 20 63 6f 6e 74 65 6e       List conten
21160 74 73 20 6f 66 20 61 72 63 68 69 76 65 5c 6e 22  ts of archive\n"
21170 0a 22 20 20 2d 78 2c 20 2d 2d 65 78 74 72 61 63  ."  -x, --extrac
21180 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45  t              E
21190 78 74 72 61 63 74 20 66 69 6c 65 73 20 66 72 6f  xtract files fro
211a0 6d 20 61 72 63 68 69 76 65 5c 6e 22 0a 22 5c 6e  m archive\n"."\n
211b0 22 0a 22 41 6e 64 20 7a 65 72 6f 20 6f 72 20 6d  "."And zero or m
211c0 6f 72 65 20 6f 70 74 69 6f 6e 61 6c 20 6f 70 74  ore optional opt
211d0 69 6f 6e 73 3a 5c 6e 22 0a 22 20 20 2d 76 2c 20  ions:\n"."  -v, 
211e0 2d 2d 76 65 72 62 6f 73 65 20 20 20 20 20 20 20  --verbose       
211f0 20 20 20 20 20 20 20 50 72 69 6e 74 20 65 61 63         Print eac
21200 68 20 66 69 6c 65 6e 61 6d 65 20 61 73 20 69 74  h filename as it
21210 20 69 73 20 70 72 6f 63 65 73 73 65 64 5c 6e 22   is processed\n"
21220 0a 22 20 20 2d 66 20 46 49 4c 45 2c 20 2d 2d 66  ."  -f FILE, --f
21230 69 6c 65 20 46 49 4c 45 20 20 20 20 20 20 20 4f  ile FILE       O
21240 70 65 72 61 74 65 20 6f 6e 20 61 72 63 68 69 76  perate on archiv
21250 65 20 46 49 4c 45 20 28 64 65 66 61 75 6c 74 20  e FILE (default 
21260 69 73 20 63 75 72 72 65 6e 74 20 64 62 29 5c 6e  is current db)\n
21270 22 0a 22 20 20 2d 43 20 44 49 52 2c 20 2d 2d 64  "."  -C DIR, --d
21280 69 72 65 63 74 6f 72 79 20 44 49 52 20 20 20 20  irectory DIR    
21290 43 68 61 6e 67 65 20 74 6f 20 64 69 72 65 63 74  Change to direct
212a0 6f 72 79 20 44 49 52 20 74 6f 20 72 65 61 64 2f  ory DIR to read/
212b0 65 78 74 72 61 63 74 20 66 69 6c 65 73 5c 6e 22  extract files\n"
212c0 0a 22 5c 6e 22 0a 22 53 65 65 20 61 6c 73 6f 3a  ."\n"."See also:
212d0 20 68 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f   http://sqlite.o
212e0 72 67 2f 63 6c 69 2e 68 74 6d 6c 23 73 71 6c 61  rg/cli.html#sqla
212f0 72 5f 61 72 63 68 69 76 65 5f 73 75 70 70 6f 72  r_archive_suppor
21300 74 5c 6e 22 0a 22 5c 6e 22 0a 29 3b 0a 20 20 72  t\n"."\n".);.  r
21310 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
21320 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69  OR;.}../*.** Pri
21330 6e 74 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  nt an error mess
21340 61 67 65 20 66 6f 72 20 74 68 65 20 2e 61 72 20  age for the .ar 
21350 63 6f 6d 6d 61 6e 64 20 74 6f 20 73 74 64 65 72  command to stder
21360 72 20 61 6e 64 20 72 65 74 75 72 6e 20 0a 2a 2a  r and return .**
21370 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 2e 0a 2a   SQLITE_ERROR..*
21380 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 72 45  /.static int arE
21390 72 72 6f 72 4d 73 67 28 63 6f 6e 73 74 20 63 68  rrorMsg(const ch
213a0 61 72 20 2a 7a 46 6d 74 2c 20 2e 2e 2e 29 7b 0a  ar *zFmt, ...){.
213b0 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20 20    va_list ap;.  
213c0 63 68 61 72 20 2a 7a 3b 0a 20 20 76 61 5f 73 74  char *z;.  va_st
213d0 61 72 74 28 61 70 2c 20 7a 46 6d 74 29 3b 0a 20  art(ap, zFmt);. 
213e0 20 7a 20 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70   z = sqlite3_vmp
213f0 72 69 6e 74 66 28 7a 46 6d 74 2c 20 61 70 29 3b  rintf(zFmt, ap);
21400 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b 0a 20  .  va_end(ap);. 
21410 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
21420 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 20 28  rr, "Error: %s (
21430 74 72 79 20 5c 22 2e 61 72 20 2d 2d 68 65 6c 70  try \".ar --help
21440 5c 22 29 5c 6e 22 2c 20 7a 29 3b 0a 20 20 73 71  \")\n", z);.  sq
21450 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a 20  lite3_free(z);. 
21460 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45   return SQLITE_E
21470 52 52 4f 52 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 56  RROR;.}../*.** V
21480 61 6c 75 65 73 20 66 6f 72 20 41 72 43 6f 6d 6d  alues for ArComm
21490 61 6e 64 2e 65 43 6d 64 2e 0a 2a 2f 0a 23 64 65  and.eCmd..*/.#de
214a0 66 69 6e 65 20 41 52 5f 43 4d 44 5f 43 52 45 41  fine AR_CMD_CREA
214b0 54 45 20 20 20 20 20 20 20 31 0a 23 64 65 66 69  TE       1.#defi
214c0 6e 65 20 41 52 5f 43 4d 44 5f 45 58 54 52 41 43  ne AR_CMD_EXTRAC
214d0 54 20 20 20 20 20 20 32 0a 23 64 65 66 69 6e 65  T      2.#define
214e0 20 41 52 5f 43 4d 44 5f 4c 49 53 54 20 20 20 20   AR_CMD_LIST    
214f0 20 20 20 20 20 33 0a 23 64 65 66 69 6e 65 20 41       3.#define A
21500 52 5f 43 4d 44 5f 55 50 44 41 54 45 20 20 20 20  R_CMD_UPDATE    
21510 20 20 20 34 0a 23 64 65 66 69 6e 65 20 41 52 5f     4.#define AR_
21520 43 4d 44 5f 48 45 4c 50 20 20 20 20 20 20 20 20  CMD_HELP        
21530 20 35 0a 0a 2f 2a 0a 2a 2a 20 4f 74 68 65 72 20   5../*.** Other 
21540 28 6e 6f 6e 2d 63 6f 6d 6d 61 6e 64 29 20 73 77  (non-command) sw
21550 69 74 63 68 65 73 2e 0a 2a 2f 0a 23 64 65 66 69  itches..*/.#defi
21560 6e 65 20 41 52 5f 53 57 49 54 43 48 5f 56 45 52  ne AR_SWITCH_VER
21570 42 4f 53 45 20 20 20 36 0a 23 64 65 66 69 6e 65  BOSE   6.#define
21580 20 41 52 5f 53 57 49 54 43 48 5f 46 49 4c 45 20   AR_SWITCH_FILE 
21590 20 20 20 20 20 37 0a 23 64 65 66 69 6e 65 20 41       7.#define A
215a0 52 5f 53 57 49 54 43 48 5f 44 49 52 45 43 54 4f  R_SWITCH_DIRECTO
215b0 52 59 20 38 0a 23 64 65 66 69 6e 65 20 41 52 5f  RY 8.#define AR_
215c0 53 57 49 54 43 48 5f 5a 49 50 20 20 20 20 20 20  SWITCH_ZIP      
215d0 20 39 0a 0a 73 74 61 74 69 63 20 69 6e 74 20 61   9..static int a
215e0 72 50 72 6f 63 65 73 73 53 77 69 74 63 68 28 41  rProcessSwitch(A
215f0 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 2c 20 69  rCommand *pAr, i
21600 6e 74 20 65 53 77 69 74 63 68 2c 20 63 6f 6e 73  nt eSwitch, cons
21610 74 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20  t char *zArg){. 
21620 20 73 77 69 74 63 68 28 20 65 53 77 69 74 63 68   switch( eSwitch
21630 20 29 7b 0a 20 20 20 20 63 61 73 65 20 41 52 5f   ){.    case AR_
21640 43 4d 44 5f 43 52 45 41 54 45 3a 0a 20 20 20 20  CMD_CREATE:.    
21650 63 61 73 65 20 41 52 5f 43 4d 44 5f 45 58 54 52  case AR_CMD_EXTR
21660 41 43 54 3a 0a 20 20 20 20 63 61 73 65 20 41 52  ACT:.    case AR
21670 5f 43 4d 44 5f 4c 49 53 54 3a 0a 20 20 20 20 63  _CMD_LIST:.    c
21680 61 73 65 20 41 52 5f 43 4d 44 5f 55 50 44 41 54  ase AR_CMD_UPDAT
21690 45 3a 0a 20 20 20 20 63 61 73 65 20 41 52 5f 43  E:.    case AR_C
216a0 4d 44 5f 48 45 4c 50 3a 0a 20 20 20 20 20 20 69  MD_HELP:.      i
216b0 66 28 20 70 41 72 2d 3e 65 43 6d 64 20 29 7b 0a  f( pAr->eCmd ){.
216c0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61          return a
216d0 72 45 72 72 6f 72 4d 73 67 28 22 6d 75 6c 74 69  rErrorMsg("multi
216e0 70 6c 65 20 63 6f 6d 6d 61 6e 64 20 6f 70 74 69  ple command opti
216f0 6f 6e 73 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ons");.      }. 
21700 20 20 20 20 20 70 41 72 2d 3e 65 43 6d 64 20 3d       pAr->eCmd =
21710 20 65 53 77 69 74 63 68 3b 0a 20 20 20 20 20 20   eSwitch;.      
21720 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
21730 20 41 52 5f 53 57 49 54 43 48 5f 56 45 52 42 4f   AR_SWITCH_VERBO
21740 53 45 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 62  SE:.      pAr->b
21750 56 65 72 62 6f 73 65 20 3d 20 31 3b 0a 20 20 20  Verbose = 1;.   
21760 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
21770 73 65 20 41 52 5f 53 57 49 54 43 48 5f 5a 49 50  se AR_SWITCH_ZIP
21780 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 62 5a 69  :.      pAr->bZi
21790 70 20 3d 20 31 3b 0a 20 20 20 20 20 20 62 72 65  p = 1;.      bre
217a0 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 41 52  ak;..    case AR
217b0 5f 53 57 49 54 43 48 5f 46 49 4c 45 3a 0a 20 20  _SWITCH_FILE:.  
217c0 20 20 20 20 70 41 72 2d 3e 7a 46 69 6c 65 20 3d      pAr->zFile =
217d0 20 7a 41 72 67 3b 0a 20 20 20 20 20 20 62 72 65   zArg;.      bre
217e0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 41 52 5f  ak;.    case AR_
217f0 53 57 49 54 43 48 5f 44 49 52 45 43 54 4f 52 59  SWITCH_DIRECTORY
21800 3a 0a 20 20 20 20 20 20 70 41 72 2d 3e 7a 44 69  :.      pAr->zDi
21810 72 20 3d 20 7a 41 72 67 3b 0a 20 20 20 20 20 20  r = zArg;.      
21820 62 72 65 61 6b 3b 0a 20 20 7d 0a 0a 20 20 72 65  break;.  }..  re
21830 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  turn SQLITE_OK;.
21840 7d 0a 0a 2f 2a 0a 2a 2a 20 50 61 72 73 65 20 74  }../*.** Parse t
21850 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e 65 20  he command line 
21860 66 6f 72 20 61 6e 20 22 2e 61 72 22 20 63 6f 6d  for an ".ar" com
21870 6d 61 6e 64 2e 20 54 68 65 20 72 65 73 75 6c 74  mand. The result
21880 73 20 61 72 65 20 77 72 69 74 74 65 6e 20 69 6e  s are written in
21890 74 6f 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  to.** structure 
218a0 28 2a 70 41 72 29 2e 20 53 51 4c 49 54 45 5f 4f  (*pAr). SQLITE_O
218b0 4b 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  K is returned if
218c0 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 6c 69 6e   the command lin
218d0 65 20 69 73 20 70 61 72 73 65 64 0a 2a 2a 20 73  e is parsed.** s
218e0 75 63 63 65 73 73 66 75 6c 6c 79 2c 20 6f 74 68  uccessfully, oth
218f0 65 72 77 69 73 65 20 61 6e 20 65 72 72 6f 72 20  erwise an error 
21900 6d 65 73 73 61 67 65 20 69 73 20 77 72 69 74 74  message is writt
21910 65 6e 20 74 6f 20 73 74 64 65 72 72 20 61 6e 64  en to stderr and
21920 20 0a 2a 2a 20 53 51 4c 49 54 45 5f 45 52 52 4f   .** SQLITE_ERRO
21930 52 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 73  R returned..*/.s
21940 74 61 74 69 63 20 69 6e 74 20 61 72 50 61 72 73  tatic int arPars
21950 65 43 6f 6d 6d 61 6e 64 28 0a 20 20 63 68 61 72  eCommand(.  char
21960 20 2a 2a 61 7a 41 72 67 2c 20 20 20 20 20 20 20   **azArg,       
21970 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41              /* A
21980 72 72 61 79 20 6f 66 20 61 72 67 75 6d 65 6e 74  rray of argument
21990 73 20 70 61 73 73 65 64 20 74 6f 20 64 6f 74 20  s passed to dot 
219a0 63 6f 6d 6d 61 6e 64 20 2a 2f 0a 20 20 69 6e 74  command */.  int
219b0 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20 20   nArg,          
219c0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
219d0 4e 75 6d 62 65 72 20 6f 66 20 65 6e 74 72 69 65  Number of entrie
219e0 73 20 69 6e 20 61 7a 41 72 67 5b 5d 20 2a 2f 0a  s in azArg[] */.
219f0 20 20 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72    ArCommand *pAr
21a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
21a10 20 20 2f 2a 20 50 6f 70 75 6c 61 74 65 20 74 68    /* Populate th
21a20 69 73 20 6f 62 6a 65 63 74 20 2a 2f 0a 29 7b 0a  is object */.){.
21a30 20 20 73 74 72 75 63 74 20 41 72 53 77 69 74 63    struct ArSwitc
21a40 68 20 7b 0a 20 20 20 20 63 68 61 72 20 63 53 68  h {.    char cSh
21a50 6f 72 74 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63  ort;.    const c
21a60 68 61 72 20 2a 7a 4c 6f 6e 67 3b 0a 20 20 20 20  har *zLong;.    
21a70 69 6e 74 20 65 53 77 69 74 63 68 3b 0a 20 20 20  int eSwitch;.   
21a80 20 69 6e 74 20 62 41 72 67 3b 0a 20 20 7d 20 61   int bArg;.  } a
21a90 53 77 69 74 63 68 5b 5d 20 3d 20 7b 0a 20 20 20  Switch[] = {.   
21aa0 20 7b 20 27 63 27 2c 20 22 63 72 65 61 74 65 22   { 'c', "create"
21ab0 2c 20 20 20 20 41 52 5f 43 4d 44 5f 43 52 45 41  ,    AR_CMD_CREA
21ac0 54 45 2c 20 30 20 7d 2c 0a 20 20 20 20 7b 20 27  TE, 0 },.    { '
21ad0 78 27 2c 20 22 65 78 74 72 61 63 74 22 2c 20 20  x', "extract",  
21ae0 20 41 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 2c   AR_CMD_EXTRACT,
21af0 20 30 20 7d 2c 0a 20 20 20 20 7b 20 27 74 27 2c   0 },.    { 't',
21b00 20 22 6c 69 73 74 22 2c 20 20 20 20 20 20 41 52   "list",      AR
21b10 5f 43 4d 44 5f 4c 49 53 54 2c 20 30 20 7d 2c 0a  _CMD_LIST, 0 },.
21b20 20 20 20 20 7b 20 27 75 27 2c 20 22 75 70 64 61      { 'u', "upda
21b30 74 65 22 2c 20 20 20 20 41 52 5f 43 4d 44 5f 55  te",    AR_CMD_U
21b40 50 44 41 54 45 2c 20 30 20 7d 2c 0a 20 20 20 20  PDATE, 0 },.    
21b50 7b 20 27 68 27 2c 20 22 68 65 6c 70 22 2c 20 20  { 'h', "help",  
21b60 20 20 20 20 41 52 5f 43 4d 44 5f 48 45 4c 50 2c      AR_CMD_HELP,
21b70 20 30 20 7d 2c 0a 20 20 20 20 7b 20 27 76 27 2c   0 },.    { 'v',
21b80 20 22 76 65 72 62 6f 73 65 22 2c 20 20 20 41 52   "verbose",   AR
21b90 5f 53 57 49 54 43 48 5f 56 45 52 42 4f 53 45 2c  _SWITCH_VERBOSE,
21ba0 20 30 20 7d 2c 0a 20 20 20 20 7b 20 27 66 27 2c   0 },.    { 'f',
21bb0 20 22 66 69 6c 65 22 2c 20 20 20 20 20 20 41 52   "file",      AR
21bc0 5f 53 57 49 54 43 48 5f 46 49 4c 45 2c 20 31 20  _SWITCH_FILE, 1 
21bd0 7d 2c 0a 20 20 20 20 7b 20 27 43 27 2c 20 22 64  },.    { 'C', "d
21be0 69 72 65 63 74 6f 72 79 22 2c 20 41 52 5f 53 57  irectory", AR_SW
21bf0 49 54 43 48 5f 44 49 52 45 43 54 4f 52 59 2c 20  ITCH_DIRECTORY, 
21c00 31 20 7d 2c 0a 20 20 20 20 7b 20 27 7a 27 2c 20  1 },.    { 'z', 
21c10 22 7a 69 70 22 2c 20 20 20 20 20 20 20 41 52 5f  "zip",       AR_
21c20 53 57 49 54 43 48 5f 5a 49 50 2c 20 30 20 7d 0a  SWITCH_ZIP, 0 }.
21c30 20 20 7d 3b 0a 20 20 69 6e 74 20 6e 53 77 69 74    };.  int nSwit
21c40 63 68 20 3d 20 73 69 7a 65 6f 66 28 61 53 77 69  ch = sizeof(aSwi
21c50 74 63 68 29 20 2f 20 73 69 7a 65 6f 66 28 73 74  tch) / sizeof(st
21c60 72 75 63 74 20 41 72 53 77 69 74 63 68 29 3b 0a  ruct ArSwitch);.
21c70 20 20 73 74 72 75 63 74 20 41 72 53 77 69 74 63    struct ArSwitc
21c80 68 20 2a 70 45 6e 64 20 3d 20 26 61 53 77 69 74  h *pEnd = &aSwit
21c90 63 68 5b 6e 53 77 69 74 63 68 5d 3b 0a 0a 20 20  ch[nSwitch];..  
21ca0 69 66 28 20 6e 41 72 67 3c 3d 31 20 29 7b 0a 20  if( nArg<=1 ){. 
21cb0 20 20 20 72 65 74 75 72 6e 20 61 72 55 73 61 67     return arUsag
21cc0 65 28 73 74 64 65 72 72 29 3b 0a 20 20 7d 65 6c  e(stderr);.  }el
21cd0 73 65 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20  se{.    char *z 
21ce0 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20  = azArg[1];.    
21cf0 6d 65 6d 73 65 74 28 70 41 72 2c 20 30 2c 20 73  memset(pAr, 0, s
21d00 69 7a 65 6f 66 28 41 72 43 6f 6d 6d 61 6e 64 29  izeof(ArCommand)
21d10 29 3b 0a 0a 20 20 20 20 69 66 28 20 7a 5b 30 5d  );..    if( z[0]
21d20 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 2f  !='-' ){.      /
21d30 2a 20 54 72 61 64 69 74 69 6f 6e 61 6c 20 73 74  * Traditional st
21d40 79 6c 65 20 5b 74 61 72 5d 20 69 6e 76 6f 63 61  yle [tar] invoca
21d50 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tion */.      in
21d60 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  t i;.      int i
21d70 41 72 67 20 3d 20 32 3b 0a 20 20 20 20 20 20 66  Arg = 2;.      f
21d80 6f 72 28 69 3d 30 3b 20 7a 5b 69 5d 3b 20 69 2b  or(i=0; z[i]; i+
21d90 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  +){.        cons
21da0 74 20 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 30  t char *zArg = 0
21db0 3b 0a 20 20 20 20 20 20 20 20 73 74 72 75 63 74  ;.        struct
21dc0 20 41 72 53 77 69 74 63 68 20 2a 70 4f 70 74 3b   ArSwitch *pOpt;
21dd0 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 4f 70  .        for(pOp
21de0 74 3d 26 61 53 77 69 74 63 68 5b 30 5d 3b 20 70  t=&aSwitch[0]; p
21df0 4f 70 74 3c 70 45 6e 64 3b 20 70 4f 70 74 2b 2b  Opt<pEnd; pOpt++
21e00 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
21e10 20 7a 5b 69 5d 3d 3d 70 4f 70 74 2d 3e 63 53 68   z[i]==pOpt->cSh
21e20 6f 72 74 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ort ) break;.   
21e30 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
21e40 66 28 20 70 4f 70 74 3d 3d 70 45 6e 64 20 29 7b  f( pOpt==pEnd ){
21e50 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
21e60 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 22 75 6e  n arErrorMsg("un
21e70 72 65 63 6f 67 6e 69 7a 65 64 20 6f 70 74 69 6f  recognized optio
21e80 6e 3a 20 25 63 22 2c 20 7a 5b 69 5d 29 3b 0a 20  n: %c", z[i]);. 
21e90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
21ea0 20 69 66 28 20 70 4f 70 74 2d 3e 62 41 72 67 20   if( pOpt->bArg 
21eb0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
21ec0 20 69 41 72 67 3e 3d 6e 41 72 67 20 29 7b 0a 20   iArg>=nArg ){. 
21ed0 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
21ee0 6e 20 61 72 45 72 72 6f 72 4d 73 67 28 22 6f 70  n arErrorMsg("op
21ef0 74 69 6f 6e 20 72 65 71 75 69 72 65 73 20 61 6e  tion requires an
21f00 20 61 72 67 75 6d 65 6e 74 3a 20 25 63 22 2c 7a   argument: %c",z
21f10 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20  [i]);.          
21f20 7d 0a 20 20 20 20 20 20 20 20 20 20 7a 41 72 67  }.          zArg
21f30 20 3d 20 61 7a 41 72 67 5b 69 41 72 67 2b 2b 5d   = azArg[iArg++]
21f40 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
21f50 20 20 20 20 69 66 28 20 61 72 50 72 6f 63 65 73      if( arProces
21f60 73 53 77 69 74 63 68 28 70 41 72 2c 20 70 4f 70  sSwitch(pAr, pOp
21f70 74 2d 3e 65 53 77 69 74 63 68 2c 20 7a 41 72 67  t->eSwitch, zArg
21f80 29 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  ) ) return SQLIT
21f90 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 7d  E_ERROR;.      }
21fa0 0a 20 20 20 20 20 20 70 41 72 2d 3e 6e 41 72 67  .      pAr->nArg
21fb0 20 3d 20 6e 41 72 67 2d 69 41 72 67 3b 0a 20 20   = nArg-iArg;.  
21fc0 20 20 20 20 69 66 28 20 70 41 72 2d 3e 6e 41 72      if( pAr->nAr
21fd0 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  g>0 ){.        p
21fe0 41 72 2d 3e 61 7a 41 72 67 20 3d 20 26 61 7a 41  Ar->azArg = &azA
21ff0 72 67 5b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20  rg[iArg];.      
22000 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
22010 20 20 20 2f 2a 20 4e 6f 6e 2d 74 72 61 64 69 74     /* Non-tradit
22020 69 6f 6e 61 6c 20 69 6e 76 6f 63 61 74 69 6f 6e  ional invocation
22030 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 41   */.      int iA
22040 72 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 41  rg;.      for(iA
22050 72 67 3d 31 3b 20 69 41 72 67 3c 6e 41 72 67 3b  rg=1; iArg<nArg;
22060 20 69 41 72 67 2b 2b 29 7b 0a 20 20 20 20 20 20   iArg++){.      
22070 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 20    int n;.       
22080 20 7a 20 3d 20 61 7a 41 72 67 5b 69 41 72 67 5d   z = azArg[iArg]
22090 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  ;.        if( z[
220a0 30 5d 21 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20  0]!='-' ){.     
220b0 20 20 20 20 20 2f 2a 20 41 6c 6c 20 72 65 6d 61       /* All rema
220c0 69 6e 69 6e 67 20 63 6f 6d 6d 61 6e 64 20 6c 69  ining command li
220d0 6e 65 20 77 6f 72 64 73 20 61 72 65 20 63 6f 6d  ne words are com
220e0 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 2e 20  mand arguments. 
220f0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70 41 72  */.          pAr
22100 2d 3e 61 7a 41 72 67 20 3d 20 26 61 7a 41 72 67  ->azArg = &azArg
22110 5b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20 20  [iArg];.        
22120 20 20 70 41 72 2d 3e 6e 41 72 67 20 3d 20 6e 41    pAr->nArg = nA
22130 72 67 2d 69 41 72 67 3b 0a 20 20 20 20 20 20 20  rg-iArg;.       
22140 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
22150 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 20 3d 20    }.        n = 
22160 73 74 72 6c 65 6e 28 7a 29 3b 0a 0a 20 20 20 20  strlen(z);..    
22170 20 20 20 20 69 66 28 20 7a 5b 31 5d 21 3d 27 2d      if( z[1]!='-
22180 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ' ){.          i
22190 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20  nt i;.          
221a0 2f 2a 20 4f 6e 65 20 6f 72 20 6d 6f 72 65 20 73  /* One or more s
221b0 68 6f 72 74 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a  hort options */.
221c0 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d            for(i=
221d0 31 3b 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  1; i<n; i++){.  
221e0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
221f0 63 68 61 72 20 2a 7a 41 72 67 20 3d 20 30 3b 0a  char *zArg = 0;.
22200 20 20 20 20 20 20 20 20 20 20 20 20 73 74 72 75              stru
22210 63 74 20 41 72 53 77 69 74 63 68 20 2a 70 4f 70  ct ArSwitch *pOp
22220 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  t;.            f
22230 6f 72 28 70 4f 70 74 3d 26 61 53 77 69 74 63 68  or(pOpt=&aSwitch
22240 5b 30 5d 3b 20 70 4f 70 74 3c 70 45 6e 64 3b 20  [0]; pOpt<pEnd; 
22250 70 4f 70 74 2b 2b 29 7b 0a 20 20 20 20 20 20 20  pOpt++){.       
22260 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69 5d 3d         if( z[i]=
22270 3d 70 4f 70 74 2d 3e 63 53 68 6f 72 74 20 29 20  =pOpt->cShort ) 
22280 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20  break;.         
22290 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
222a0 20 69 66 28 20 70 4f 70 74 3d 3d 70 45 6e 64 20   if( pOpt==pEnd 
222b0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
222c0 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72 4d   return arErrorM
222d0 73 67 28 22 75 6e 72 65 63 6f 67 6e 69 7a 65 64  sg("unrecognized
222e0 20 6f 70 74 69 6f 6e 3a 20 25 63 5c 6e 22 2c 20   option: %c\n", 
222f0 7a 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  z[i]);.         
22300 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
22310 20 69 66 28 20 70 4f 70 74 2d 3e 62 41 72 67 20   if( pOpt->bArg 
22320 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
22330 20 69 66 28 20 69 3c 28 6e 2d 31 29 20 29 7b 0a   if( i<(n-1) ){.
22340 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22350 7a 41 72 67 20 3d 20 26 7a 5b 69 2b 31 5d 3b 0a  zArg = &z[i+1];.
22360 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22370 69 20 3d 20 6e 3b 0a 20 20 20 20 20 20 20 20 20  i = n;.         
22380 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
22390 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
223a0 69 41 72 67 3e 3d 28 6e 41 72 67 2d 31 29 20 29  iArg>=(nArg-1) )
223b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
223c0 20 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72      return arErr
223d0 6f 72 4d 73 67 28 22 6f 70 74 69 6f 6e 20 72 65  orMsg("option re
223e0 71 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65  quires an argume
223f0 6e 74 3a 20 25 63 5c 6e 22 2c 7a 5b 69 5d 29 3b  nt: %c\n",z[i]);
22400 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22410 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
22420 20 20 20 7a 41 72 67 20 3d 20 61 7a 41 72 67 5b     zArg = azArg[
22430 2b 2b 69 41 72 67 5d 3b 0a 20 20 20 20 20 20 20  ++iArg];.       
22440 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22450 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
22460 20 20 20 69 66 28 20 61 72 50 72 6f 63 65 73 73     if( arProcess
22470 53 77 69 74 63 68 28 70 41 72 2c 20 70 4f 70 74  Switch(pAr, pOpt
22480 2d 3e 65 53 77 69 74 63 68 2c 20 7a 41 72 67 29  ->eSwitch, zArg)
22490 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
224a0 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
224b0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
224c0 65 20 69 66 28 20 7a 5b 32 5d 3d 3d 27 5c 30 27  e if( z[2]=='\0'
224d0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
224e0 20 41 20 2d 2d 20 6f 70 74 69 6f 6e 2c 20 69 6e   A -- option, in
224f0 64 69 63 61 74 69 6e 67 20 74 68 61 74 20 61 6c  dicating that al
22500 6c 20 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6d 6d  l remaining comm
22510 61 6e 64 20 6c 69 6e 65 20 77 6f 72 64 73 0a 20  and line words. 
22520 20 20 20 20 20 20 20 20 20 2a 2a 20 61 72 65 20           ** are 
22530 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65 6e 74  command argument
22540 73 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  s.  */.         
22550 20 70 41 72 2d 3e 61 7a 41 72 67 20 3d 20 26 61   pAr->azArg = &a
22560 7a 41 72 67 5b 69 41 72 67 2b 31 5d 3b 0a 20 20  zArg[iArg+1];.  
22570 20 20 20 20 20 20 20 20 70 41 72 2d 3e 6e 41 72          pAr->nAr
22580 67 20 3d 20 6e 41 72 67 2d 69 41 72 67 2d 31 3b  g = nArg-iArg-1;
22590 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
225a0 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
225b0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20  .          /* A 
225c0 6c 6f 6e 67 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20  long option */. 
225d0 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
225e0 68 61 72 20 2a 7a 41 72 67 20 3d 20 30 3b 20 20  har *zArg = 0;  
225f0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72             /* Ar
22600 67 75 6d 65 6e 74 20 66 6f 72 20 6f 70 74 69 6f  gument for optio
22610 6e 2c 20 69 66 20 61 6e 79 20 2a 2f 0a 20 20 20  n, if any */.   
22620 20 20 20 20 20 20 20 73 74 72 75 63 74 20 41 72         struct Ar
22630 53 77 69 74 63 68 20 2a 70 4d 61 74 63 68 20 3d  Switch *pMatch =
22640 20 30 3b 20 20 20 20 20 20 2f 2a 20 4d 61 74 63   0;      /* Matc
22650 68 69 6e 67 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20  hing option */. 
22660 20 20 20 20 20 20 20 20 20 73 74 72 75 63 74 20           struct 
22670 41 72 53 77 69 74 63 68 20 2a 70 4f 70 74 3b 20  ArSwitch *pOpt; 
22680 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74             /* It
22690 65 72 61 74 6f 72 20 2a 2f 0a 20 20 20 20 20 20  erator */.      
226a0 20 20 20 20 66 6f 72 28 70 4f 70 74 3d 26 61 53      for(pOpt=&aS
226b0 77 69 74 63 68 5b 30 5d 3b 20 70 4f 70 74 3c 70  witch[0]; pOpt<p
226c0 45 6e 64 3b 20 70 4f 70 74 2b 2b 29 7b 0a 20 20  End; pOpt++){.  
226d0 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20            const 
226e0 63 68 61 72 20 2a 7a 4c 6f 6e 67 20 3d 20 70 4f  char *zLong = pO
226f0 70 74 2d 3e 7a 4c 6f 6e 67 3b 0a 20 20 20 20 20  pt->zLong;.     
22700 20 20 20 20 20 20 20 69 66 28 20 28 6e 2d 32 29         if( (n-2)
22710 3c 3d 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4c  <=(int)strlen(zL
22720 6f 6e 67 29 20 26 26 20 30 3d 3d 6d 65 6d 63 6d  ong) && 0==memcm
22730 70 28 26 7a 5b 32 5d 2c 20 7a 4c 6f 6e 67 2c 20  p(&z[2], zLong, 
22740 6e 2d 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  n-2) ){.        
22750 20 20 20 20 20 20 69 66 28 20 70 4d 61 74 63 68        if( pMatch
22760 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
22770 20 20 20 20 72 65 74 75 72 6e 20 61 72 45 72 72      return arErr
22780 6f 72 4d 73 67 28 22 61 6d 62 69 67 75 6f 75 73  orMsg("ambiguous
22790 20 6f 70 74 69 6f 6e 3a 20 25 73 22 2c 7a 29 3b   option: %s",z);
227a0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d  .              }
227b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
227c0 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70        pMatch = p
227d0 4f 70 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Opt;.           
227e0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
227f0 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a   }.          }..
22800 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 4d            if( pM
22810 61 74 63 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20  atch==0 ){.     
22820 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 61 72         return ar
22830 45 72 72 6f 72 4d 73 67 28 22 75 6e 72 65 63 6f  ErrorMsg("unreco
22840 67 6e 69 7a 65 64 20 6f 70 74 69 6f 6e 3a 20 25  gnized option: %
22850 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20  s", z);.        
22860 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
22870 28 20 70 4d 61 74 63 68 2d 3e 62 41 72 67 20 29  ( pMatch->bArg )
22880 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
22890 28 20 69 41 72 67 3e 3d 28 6e 41 72 67 2d 31 29  ( iArg>=(nArg-1)
228a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
228b0 20 20 72 65 74 75 72 6e 20 61 72 45 72 72 6f 72    return arError
228c0 4d 73 67 28 22 6f 70 74 69 6f 6e 20 72 65 71 75  Msg("option requ
228d0 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65 6e 74  ires an argument
228e0 3a 20 25 73 22 2c 20 7a 29 3b 0a 20 20 20 20 20  : %s", z);.     
228f0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22900 20 20 20 20 20 7a 41 72 67 20 3d 20 61 7a 41 72       zArg = azAr
22910 67 5b 2b 2b 69 41 72 67 5d 3b 0a 20 20 20 20 20  g[++iArg];.     
22920 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
22930 20 69 66 28 20 61 72 50 72 6f 63 65 73 73 53 77   if( arProcessSw
22940 69 74 63 68 28 70 41 72 2c 20 70 4d 61 74 63 68  itch(pAr, pMatch
22950 2d 3e 65 53 77 69 74 63 68 2c 20 7a 41 72 67 29  ->eSwitch, zArg)
22960 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45   ) return SQLITE
22970 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20 20 20  _ERROR;.        
22980 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
22990 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 53 51    }..  return SQ
229a0 4c 49 54 45 5f 4f 4b 3b 0a 7d 0a 0a 2f 2a 0a 2a  LITE_OK;.}../*.*
229b0 2a 20 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20  * This function 
229c0 61 73 73 75 6d 65 73 20 74 68 61 74 20 61 6c 6c  assumes that all
229d0 20 61 72 67 75 6d 65 6e 74 73 20 77 69 74 68 69   arguments withi
229e0 6e 20 74 68 65 20 41 72 43 6f 6d 6d 61 6e 64 2e  n the ArCommand.
229f0 61 7a 41 72 67 5b 5d 0a 2a 2a 20 61 72 72 61 79  azArg[].** array
22a00 20 72 65 66 65 72 20 74 6f 20 61 72 63 68 69 76   refer to archiv
22a10 65 20 6d 65 6d 62 65 72 73 2c 20 61 73 20 66 6f  e members, as fo
22a20 72 20 74 68 65 20 2d 2d 65 78 74 72 61 63 74 20  r the --extract 
22a30 6f 72 20 2d 2d 6c 69 73 74 20 63 6f 6d 6d 61 6e  or --list comman
22a40 64 73 2e 20 0a 2a 2a 20 49 74 20 63 68 65 63 6b  ds. .** It check
22a50 73 20 74 68 61 74 20 65 61 63 68 20 6f 66 20 74  s that each of t
22a60 68 65 6d 20 61 72 65 20 70 72 65 73 65 6e 74 2e  hem are present.
22a70 20 49 66 20 61 6e 79 20 73 70 65 63 69 66 69 65   If any specifie
22a80 64 20 66 69 6c 65 20 69 73 20 6e 6f 74 0a 2a 2a  d file is not.**
22a90 20 70 72 65 73 65 6e 74 20 69 6e 20 74 68 65 20   present in the 
22aa0 61 72 63 68 69 76 65 2c 20 61 6e 20 65 72 72 6f  archive, an erro
22ab0 72 20 69 73 20 70 72 69 6e 74 65 64 20 74 6f 20  r is printed to 
22ac0 73 74 64 65 72 72 20 61 6e 64 20 61 6e 20 65 72  stderr and an er
22ad0 72 6f 72 0a 2a 2a 20 63 6f 64 65 20 72 65 74 75  ror.** code retu
22ae0 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
22af0 20 69 66 20 61 6c 6c 20 73 70 65 63 69 66 69 65   if all specifie
22b00 64 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20  d arguments are 
22b10 70 72 65 73 65 6e 74 20 69 6e 0a 2a 2a 20 74 68  present in.** th
22b20 65 20 61 72 63 68 69 76 65 2c 20 53 51 4c 49 54  e archive, SQLIT
22b30 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e 65 64  E_OK is returned
22b40 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e  ..**.** This fun
22b50 63 74 69 6f 6e 20 73 74 72 69 70 73 20 61 6e 79  ction strips any
22b60 20 74 72 61 69 6c 69 6e 67 20 27 2f 27 20 63 68   trailing '/' ch
22b70 61 72 61 63 74 65 72 73 20 66 72 6f 6d 20 65 61  aracters from ea
22b80 63 68 20 61 72 67 75 6d 65 6e 74 2e 0a 2a 2a 20  ch argument..** 
22b90 54 68 69 73 20 69 73 20 63 6f 6e 73 69 73 74 65  This is consiste
22ba0 6e 74 20 77 69 74 68 20 74 68 65 20 77 61 79 20  nt with the way 
22bb0 74 68 65 20 5b 74 61 72 5d 20 63 6f 6d 6d 61 6e  the [tar] comman
22bc0 64 20 73 65 65 6d 73 20 74 6f 20 77 6f 72 6b 20  d seems to work 
22bd0 6f 6e 0a 2a 2a 20 4c 69 6e 75 78 2e 0a 2a 2f 0a  on.** Linux..*/.
22be0 73 74 61 74 69 63 20 69 6e 74 20 61 72 43 68 65  static int arChe
22bf0 63 6b 45 6e 74 72 69 65 73 28 73 71 6c 69 74 65  ckEntries(sqlite
22c00 33 20 2a 64 62 2c 20 41 72 43 6f 6d 6d 61 6e 64  3 *db, ArCommand
22c10 20 2a 70 41 72 29 7b 0a 20 20 69 6e 74 20 72 63   *pAr){.  int rc
22c20 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20   = SQLITE_OK;.  
22c30 69 66 28 20 70 41 72 2d 3e 6e 41 72 67 20 29 7b  if( pAr->nArg ){
22c40 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
22c50 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 54  sqlite3_stmt *pT
22c60 65 73 74 20 3d 20 30 3b 0a 0a 20 20 20 20 73 68  est = 0;..    sh
22c70 65 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66  ellPreparePrintf
22c80 28 64 62 2c 20 26 72 63 2c 20 26 70 54 65 73 74  (db, &rc, &pTest
22c90 2c 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46  , "SELECT name F
22ca0 52 4f 4d 20 25 73 20 57 48 45 52 45 20 6e 61 6d  ROM %s WHERE nam
22cb0 65 3d 3f 31 22 2c 20 0a 20 20 20 20 20 20 20 20  e=?1", .        
22cc0 70 41 72 2d 3e 62 5a 69 70 20 3f 20 22 7a 69 70  pAr->bZip ? "zip
22cd0 66 69 6c 65 28 3f 32 29 22 20 3a 20 22 73 71 6c  file(?2)" : "sql
22ce0 61 72 22 0a 20 20 20 20 29 3b 0a 20 20 20 20 69  ar".    );.    i
22cf0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
22d00 20 26 26 20 70 41 72 2d 3e 62 5a 69 70 20 29 7b   && pAr->bZip ){
22d10 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62  .      sqlite3_b
22d20 69 6e 64 5f 74 65 78 74 28 70 54 65 73 74 2c 20  ind_text(pTest, 
22d30 32 2c 20 70 41 72 2d 3e 7a 46 69 6c 65 2c 20 2d  2, pAr->zFile, -
22d40 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
22d50 45 4e 54 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ENT);.    }.    
22d60 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 72 2d 3e  for(i=0; i<pAr->
22d70 6e 41 72 67 20 26 26 20 72 63 3d 3d 53 51 4c 49  nArg && rc==SQLI
22d80 54 45 5f 4f 4b 3b 20 69 2b 2b 29 7b 0a 20 20 20  TE_OK; i++){.   
22d90 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 70 41 72     char *z = pAr
22da0 2d 3e 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20  ->azArg[i];.    
22db0 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e    int n = strlen
22dc0 28 7a 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 62  (z);.      int b
22dd0 4f 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 77 68  Ok = 0;.      wh
22de0 69 6c 65 28 20 6e 3e 30 20 26 26 20 7a 5b 6e 2d  ile( n>0 && z[n-
22df0 31 5d 3d 3d 27 2f 27 20 29 20 6e 2d 2d 3b 0a 20  1]=='/' ) n--;. 
22e00 20 20 20 20 20 7a 5b 6e 5d 20 3d 20 27 5c 30 27       z[n] = '\0'
22e10 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
22e20 62 69 6e 64 5f 74 65 78 74 28 70 54 65 73 74 2c  bind_text(pTest,
22e30 20 31 2c 20 7a 2c 20 2d 31 2c 20 53 51 4c 49 54   1, z, -1, SQLIT
22e40 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20  E_STATIC);.     
22e50 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d   if( SQLITE_ROW=
22e60 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 54  =sqlite3_step(pT
22e70 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  est) ){.        
22e80 62 4f 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  bOk = 1;.      }
22e90 0a 20 20 20 20 20 20 73 68 65 6c 6c 52 65 73 65  .      shellRese
22ea0 74 28 26 72 63 2c 20 70 54 65 73 74 29 3b 0a 20  t(&rc, pTest);. 
22eb0 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
22ec0 49 54 45 5f 4f 4b 20 26 26 20 62 4f 6b 3d 3d 30  ITE_OK && bOk==0
22ed0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
22ee0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
22ef0 6e 6f 74 20 66 6f 75 6e 64 20 69 6e 20 61 72 63  not found in arc
22f00 68 69 76 65 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b  hive: %s\n", z);
22f10 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51  .        rc = SQ
22f20 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
22f30 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 68    }.    }.    sh
22f40 65 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c  ellFinalize(&rc,
22f50 20 70 54 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20   pTest);.  }..  
22f60 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a  return rc;.}../*
22f70 0a 2a 2a 20 46 6f 72 6d 61 74 20 61 20 57 48 45  .** Format a WHE
22f80 52 45 20 63 6c 61 75 73 65 20 74 68 61 74 20 63  RE clause that c
22f90 61 6e 20 62 65 20 75 73 65 64 20 61 67 61 69 6e  an be used again
22fa0 73 74 20 74 68 65 20 22 73 71 6c 61 72 22 20 74  st the "sqlar" t
22fb0 61 62 6c 65 20 74 6f 0a 2a 2a 20 69 64 65 6e 74  able to.** ident
22fc0 69 66 79 20 61 6c 6c 20 61 72 63 68 69 76 65 20  ify all archive 
22fd0 6d 65 6d 62 65 72 73 20 74 68 61 74 20 6d 61 74  members that mat
22fe0 63 68 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 61  ch the command a
22ff0 72 67 75 6d 65 6e 74 73 20 68 65 6c 64 0a 2a 2a  rguments held.**
23000 20 69 6e 20 28 2a 70 41 72 29 2e 20 4c 65 61 76   in (*pAr). Leav
23010 65 20 74 68 69 73 20 57 48 45 52 45 20 63 6c 61  e this WHERE cla
23020 75 73 65 20 69 6e 20 28 2a 70 7a 57 68 65 72 65  use in (*pzWhere
23030 29 20 62 65 66 6f 72 65 20 72 65 74 75 72 6e 69  ) before returni
23040 6e 67 2e 0a 2a 2a 20 54 68 65 20 63 61 6c 6c 65  ng..** The calle
23050 72 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  r is responsible
23060 20 66 6f 72 20 65 76 65 6e 74 75 61 6c 6c 79 20   for eventually 
23070 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 5f  calling sqlite3_
23080 66 72 65 65 28 29 20 6f 6e 0a 2a 2a 20 61 6e 79  free() on.** any
23090 20 6e 6f 6e 2d 4e 55 4c 4c 20 28 2a 70 7a 57 68   non-NULL (*pzWh
230a0 65 72 65 29 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73  ere) value..*/.s
230b0 74 61 74 69 63 20 76 6f 69 64 20 61 72 57 68 65  tatic void arWhe
230c0 72 65 43 6c 61 75 73 65 28 0a 20 20 69 6e 74 20  reClause(.  int 
230d0 2a 70 52 63 2c 20 0a 20 20 41 72 43 6f 6d 6d 61  *pRc, .  ArComma
230e0 6e 64 20 2a 70 41 72 2c 20 0a 20 20 63 68 61 72  nd *pAr, .  char
230f0 20 2a 2a 70 7a 57 68 65 72 65 20 20 20 20 20 20   **pzWhere      
23100 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
23110 55 54 3a 20 4e 65 77 20 57 48 45 52 45 20 63 6c  UT: New WHERE cl
23120 61 75 73 65 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  ause */.){.  cha
23130 72 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b 0a 20  r *zWhere = 0;. 
23140 20 69 66 28 20 2a 70 52 63 3d 3d 53 51 4c 49 54   if( *pRc==SQLIT
23150 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 66 28 20  E_OK ){.    if( 
23160 70 41 72 2d 3e 6e 41 72 67 3d 3d 30 20 29 7b 0a  pAr->nArg==0 ){.
23170 20 20 20 20 20 20 7a 57 68 65 72 65 20 3d 20 73        zWhere = s
23180 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
23190 31 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1");.    }else{.
231a0 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
231b0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
231c0 53 65 70 20 3d 20 22 22 3b 0a 20 20 20 20 20 20  Sep = "";.      
231d0 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 72 2d 3e  for(i=0; i<pAr->
231e0 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
231f0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
23200 7a 20 3d 20 70 41 72 2d 3e 61 7a 41 72 67 5b 69  z = pAr->azArg[i
23210 5d 3b 0a 20 20 20 20 20 20 20 20 7a 57 68 65 72  ];.        zWher
23220 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
23230 6e 74 66 28 0a 20 20 20 20 20 20 20 20 20 20 20  ntf(.           
23240 20 22 25 7a 25 73 20 6e 61 6d 65 20 3d 20 27 25   "%z%s name = '%
23250 71 27 20 4f 52 20 6e 61 6d 65 20 42 45 54 57 45  q' OR name BETWE
23260 45 4e 20 27 25 71 2f 27 20 41 4e 44 20 27 25 71  EN '%q/' AND '%q
23270 30 27 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  0'", .          
23280 20 20 7a 57 68 65 72 65 2c 20 7a 53 65 70 2c 20    zWhere, zSep, 
23290 7a 2c 20 7a 2c 20 7a 0a 20 20 20 20 20 20 20 20  z, z, z.        
232a0 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20 20 69      );.        i
232b0 66 28 20 7a 57 68 65 72 65 3d 3d 30 20 29 7b 0a  f( zWhere==0 ){.
232c0 20 20 20 20 20 20 20 20 20 20 2a 70 52 63 20 3d            *pRc =
232d0 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
232e0 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
232f0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
23300 20 20 7a 53 65 70 20 3d 20 22 20 4f 52 20 22 3b    zSep = " OR ";
23310 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
23320 20 7d 0a 20 20 2a 70 7a 57 68 65 72 65 20 3d 20   }.  *pzWhere = 
23330 7a 57 68 65 72 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  zWhere;.}../*.**
23340 20 41 72 67 75 6d 65 6e 74 20 7a 4d 6f 64 65 20   Argument zMode 
23350 6d 75 73 74 20 70 6f 69 6e 74 20 74 6f 20 61 20  must point to a 
23360 62 75 66 66 65 72 20 61 74 20 6c 65 61 73 74 20  buffer at least 
23370 31 31 20 62 79 74 65 73 20 69 6e 20 73 69 7a 65  11 bytes in size
23380 2e 20 54 68 69 73 0a 2a 2a 20 66 75 6e 63 74 69  . This.** functi
23390 6f 6e 20 70 6f 70 75 6c 61 74 65 73 20 74 68 69  on populates thi
233a0 73 20 62 75 66 66 65 72 20 77 69 74 68 20 74 68  s buffer with th
233b0 65 20 73 74 72 69 6e 67 20 69 6e 74 65 72 70 72  e string interpr
233c0 65 74 61 74 69 6f 6e 20 6f 66 0a 2a 2a 20 74 68  etation of.** th
233d0 65 20 75 6e 69 78 20 66 69 6c 65 20 6d 6f 64 65  e unix file mode
233e0 20 70 61 73 73 65 64 20 61 73 20 74 68 65 20 73   passed as the s
233f0 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 28  econd argument (
23400 65 2e 67 2e 20 22 64 72 77 78 72 2d 78 72 2d 78  e.g. "drwxr-xr-x
23410 22 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ")..*/.static vo
23420 69 64 20 73 68 65 6c 6c 4d 6f 64 65 54 6f 53 74  id shellModeToSt
23430 72 69 6e 67 28 63 68 61 72 20 2a 7a 4d 6f 64 65  ring(char *zMode
23440 2c 20 69 6e 74 20 6d 6f 64 65 29 7b 0a 20 20 69  , int mode){.  i
23450 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 4d 61 67 69  nt i;..  /* Magi
23460 63 20 6e 75 6d 62 65 72 73 20 63 6f 70 69 65 64  c numbers copied
23470 20 66 72 6f 6d 20 5b 6d 61 6e 20 32 20 73 74 61   from [man 2 sta
23480 74 5d 20 2a 2f 0a 20 20 69 66 28 20 6d 6f 64 65  t] */.  if( mode
23490 20 26 20 30 30 34 30 30 30 30 20 29 7b 0a 20 20   & 0040000 ){.  
234a0 20 20 7a 4d 6f 64 65 5b 30 5d 20 3d 20 27 64 27    zMode[0] = 'd'
234b0 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 28 6d  ;.  }else if( (m
234c0 6f 64 65 20 26 20 30 31 32 30 30 30 30 29 3d 3d  ode & 0120000)==
234d0 30 31 32 30 30 30 30 20 29 7b 0a 20 20 20 20 7a  0120000 ){.    z
234e0 4d 6f 64 65 5b 30 5d 20 3d 20 27 6c 27 3b 0a 20  Mode[0] = 'l';. 
234f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 7a 4d 6f 64   }else{.    zMod
23500 65 5b 30 5d 20 3d 20 27 2d 27 3b 0a 20 20 7d 0a  e[0] = '-';.  }.
23510 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 33 3b  .  for(i=0; i<3;
23520 20 69 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 6d   i++){.    int m
23530 20 3d 20 28 6d 6f 64 65 20 3e 3e 20 28 28 32 2d   = (mode >> ((2-
23540 69 29 2a 33 29 29 3b 0a 20 20 20 20 63 68 61 72  i)*3));.    char
23550 20 2a 61 20 3d 20 26 7a 4d 6f 64 65 5b 31 20 2b   *a = &zMode[1 +
23560 20 69 2a 33 5d 3b 0a 20 20 20 20 61 5b 30 5d 20   i*3];.    a[0] 
23570 3d 20 28 6d 20 26 20 30 78 34 29 20 3f 20 27 72  = (m & 0x4) ? 'r
23580 27 20 3a 20 27 2d 27 3b 0a 20 20 20 20 61 5b 31  ' : '-';.    a[1
23590 5d 20 3d 20 28 6d 20 26 20 30 78 32 29 20 3f 20  ] = (m & 0x2) ? 
235a0 27 77 27 20 3a 20 27 2d 27 3b 0a 20 20 20 20 61  'w' : '-';.    a
235b0 5b 32 5d 20 3d 20 28 6d 20 26 20 30 78 31 29 20  [2] = (m & 0x1) 
235c0 3f 20 27 78 27 20 3a 20 27 2d 27 3b 0a 20 20 7d  ? 'x' : '-';.  }
235d0 0a 20 20 7a 4d 6f 64 65 5b 31 30 5d 20 3d 20 27  .  zMode[10] = '
235e0 5c 30 27 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d  \0';.}../*.** Im
235f0 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
23600 2e 61 72 20 22 6c 69 73 54 22 20 63 6f 6d 6d 61  .ar "lisT" comma
23610 6e 64 2e 20 0a 2a 2f 0a 73 74 61 74 69 63 20 69  nd. .*/.static i
23620 6e 74 20 61 72 4c 69 73 74 43 6f 6d 6d 61 6e 64  nt arListCommand
23630 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20  (ShellState *p, 
23640 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 41 72 43  sqlite3 *db, ArC
23650 6f 6d 6d 61 6e 64 20 2a 70 41 72 29 7b 0a 20 20  ommand *pAr){.  
23660 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c  const char *zSql
23670 20 3d 20 22 53 45 4c 45 43 54 20 25 73 20 46 52   = "SELECT %s FR
23680 4f 4d 20 25 73 20 57 48 45 52 45 20 25 73 22 3b  OM %s WHERE %s";
23690 20 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a   .  const char *
236a0 7a 54 62 6c 20 3d 20 28 70 41 72 2d 3e 62 5a 69  zTbl = (pAr->bZi
236b0 70 20 3f 20 22 7a 69 70 66 69 6c 65 28 3f 29 22  p ? "zipfile(?)"
236c0 20 3a 20 22 73 71 6c 61 72 22 29 3b 0a 20 20 63   : "sqlar");.  c
236d0 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 43 6f 6c  onst char *azCol
236e0 73 5b 5d 20 3d 20 7b 0a 20 20 20 20 22 6e 61 6d  s[] = {.    "nam
236f0 65 22 2c 0a 20 20 20 20 22 6d 6f 64 65 2c 20 73  e",.    "mode, s
23700 7a 2c 20 64 61 74 65 74 69 6d 65 28 6d 74 69 6d  z, datetime(mtim
23710 65 2c 20 27 75 6e 69 78 65 70 6f 63 68 27 29 2c  e, 'unixepoch'),
23720 20 6e 61 6d 65 22 0a 20 20 7d 3b 0a 0a 20 20 63   name".  };..  c
23730 68 61 72 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b  har *zWhere = 0;
23740 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20  .  sqlite3_stmt 
23750 2a 70 53 71 6c 20 3d 20 30 3b 0a 20 20 69 6e 74  *pSql = 0;.  int
23760 20 72 63 3b 0a 0a 20 20 72 63 20 3d 20 61 72 43   rc;..  rc = arC
23770 68 65 63 6b 45 6e 74 72 69 65 73 28 64 62 2c 20  heckEntries(db, 
23780 70 41 72 29 3b 0a 20 20 61 72 57 68 65 72 65 43  pAr);.  arWhereC
23790 6c 61 75 73 65 28 26 72 63 2c 20 70 41 72 2c 20  lause(&rc, pAr, 
237a0 26 7a 57 68 65 72 65 29 3b 0a 0a 20 20 73 68 65  &zWhere);..  she
237b0 6c 6c 50 72 65 70 61 72 65 50 72 69 6e 74 66 28  llPreparePrintf(
237c0 64 62 2c 20 26 72 63 2c 20 26 70 53 71 6c 2c 20  db, &rc, &pSql, 
237d0 7a 53 71 6c 2c 20 61 7a 43 6f 6c 73 5b 70 41 72  zSql, azCols[pAr
237e0 2d 3e 62 56 65 72 62 6f 73 65 5d 2c 20 7a 54 62  ->bVerbose], zTb
237f0 6c 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 69 66  l, zWhere);.  if
23800 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
23810 26 26 20 70 41 72 2d 3e 62 5a 69 70 20 29 7b 0a  && pAr->bZip ){.
23820 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
23830 5f 74 65 78 74 28 70 53 71 6c 2c 20 31 2c 20 70  _text(pSql, 1, p
23840 41 72 2d 3e 7a 46 69 6c 65 2c 20 2d 31 2c 20 53  Ar->zFile, -1, S
23850 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29  QLITE_TRANSIENT)
23860 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20 72  ;.  }.  while( r
23870 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20  c==SQLITE_OK && 
23880 53 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69  SQLITE_ROW==sqli
23890 74 65 33 5f 73 74 65 70 28 70 53 71 6c 29 20 29  te3_step(pSql) )
238a0 7b 0a 20 20 20 20 69 66 28 20 70 41 72 2d 3e 62  {.    if( pAr->b
238b0 56 65 72 62 6f 73 65 20 29 7b 0a 20 20 20 20 20  Verbose ){.     
238c0 20 63 68 61 72 20 7a 4d 6f 64 65 5b 31 31 5d 3b   char zMode[11];
238d0 0a 20 20 20 20 20 20 73 68 65 6c 6c 4d 6f 64 65  .      shellMode
238e0 54 6f 53 74 72 69 6e 67 28 7a 4d 6f 64 65 2c 20  ToString(zMode, 
238f0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
23900 6e 74 28 70 53 71 6c 2c 20 30 29 29 3b 0a 0a 20  nt(pSql, 0));.. 
23910 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
23920 70 2d 3e 6f 75 74 2c 20 22 25 73 20 25 20 31 30  p->out, "%s % 10
23930 64 20 20 25 73 20 20 25 73 5c 6e 22 2c 20 7a 4d  d  %s  %s\n", zM
23940 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 73  ode,.          s
23950 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
23960 74 28 70 53 71 6c 2c 20 31 29 2c 20 0a 20 20 20  t(pSql, 1), .   
23970 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63         sqlite3_c
23980 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c  olumn_text(pSql,
23990 20 32 29 2c 0a 20 20 20 20 20 20 20 20 20 20 73   2),.          s
239a0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
239b0 78 74 28 70 53 71 6c 2c 20 33 29 0a 20 20 20 20  xt(pSql, 3).    
239c0 20 20 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a    );.    }else{.
239d0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
239e0 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c  (p->out, "%s\n",
239f0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
23a00 74 65 78 74 28 70 53 71 6c 2c 20 30 29 29 3b 0a  text(pSql, 0));.
23a10 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 73 68 65      }.  }..  she
23a20 6c 6c 46 69 6e 61 6c 69 7a 65 28 26 72 63 2c 20  llFinalize(&rc, 
23a30 70 53 71 6c 29 3b 0a 20 20 72 65 74 75 72 6e 20  pSql);.  return 
23a40 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 6d  rc;.}.../*.** Im
23a50 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
23a60 2e 61 72 20 22 65 58 74 72 61 63 74 22 20 63 6f  .ar "eXtract" co
23a70 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a 73 74 61 74 69  mmand. .*/.stati
23a80 63 20 69 6e 74 20 61 72 45 78 74 72 61 63 74 43  c int arExtractC
23a90 6f 6d 6d 61 6e 64 28 53 68 65 6c 6c 53 74 61 74  ommand(ShellStat
23aa0 65 20 2a 70 2c 20 73 71 6c 69 74 65 33 20 2a 64  e *p, sqlite3 *d
23ab0 62 2c 20 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41  b, ArCommand *pA
23ac0 72 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  r){.  const char
23ad0 20 2a 7a 53 71 6c 31 20 3d 20 0a 20 20 20 20 22   *zSql1 = .    "
23ae0 53 45 4c 45 43 54 20 22 0a 20 20 20 20 22 20 20  SELECT ".    "  
23af0 3a 31 20 7c 7c 20 6e 61 6d 65 2c 20 22 0a 20 20  :1 || name, ".  
23b00 20 20 22 20 20 77 72 69 74 65 66 69 6c 65 28 3f    "  writefile(?
23b10 31 20 7c 7c 20 6e 61 6d 65 2c 20 25 73 2c 20 6d  1 || name, %s, m
23b20 6f 64 65 2c 20 6d 74 69 6d 65 29 20 22 0a 20 20  ode, mtime) ".  
23b30 20 20 22 46 52 4f 4d 20 25 73 20 57 48 45 52 45    "FROM %s WHERE
23b40 20 28 25 73 29 20 41 4e 44 20 28 64 61 74 61 20   (%s) AND (data 
23b50 49 53 20 4e 55 4c 4c 20 4f 52 20 3f 32 20 3d 20  IS NULL OR ?2 = 
23b60 30 29 22 3b 0a 0a 20 20 63 6f 6e 73 74 20 63 68  0)";..  const ch
23b70 61 72 20 2a 61 7a 45 78 74 72 61 41 72 67 5b 5d  ar *azExtraArg[]
23b80 20 3d 20 7b 20 0a 20 20 20 20 22 73 71 6c 61 72   = { .    "sqlar
23b90 5f 75 6e 63 6f 6d 70 72 65 73 73 28 64 61 74 61  _uncompress(data
23ba0 2c 20 73 7a 29 22 2c 0a 20 20 20 20 22 7a 69 70  , sz)",.    "zip
23bb0 66 69 6c 65 5f 75 6e 63 6f 6d 70 72 65 73 73 28  file_uncompress(
23bc0 64 61 74 61 2c 20 73 7a 2c 20 6d 65 74 68 6f 64  data, sz, method
23bd0 29 22 0a 20 20 7d 3b 0a 20 20 63 6f 6e 73 74 20  )".  };.  const 
23be0 63 68 61 72 20 2a 61 7a 53 6f 75 72 63 65 5b 5d  char *azSource[]
23bf0 20 3d 20 7b 0a 20 20 20 20 22 73 71 6c 61 72 22   = {.    "sqlar"
23c00 2c 20 22 7a 69 70 66 69 6c 65 28 3f 33 29 22 0a  , "zipfile(?3)".
23c10 20 20 7d 3b 0a 0a 0a 0a 20 20 73 71 6c 69 74 65    };....  sqlite
23c20 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d 20 30  3_stmt *pSql = 0
23c30 3b 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c  ;.  int rc = SQL
23c40 49 54 45 5f 4f 4b 3b 0a 20 20 63 68 61 72 20 2a  ITE_OK;.  char *
23c50 7a 44 69 72 20 3d 20 30 3b 0a 20 20 63 68 61 72  zDir = 0;.  char
23c60 20 2a 7a 57 68 65 72 65 20 3d 20 30 3b 0a 20 20   *zWhere = 0;.  
23c70 69 6e 74 20 69 3b 0a 0a 20 20 2f 2a 20 49 66 20  int i;..  /* If 
23c80 61 72 67 75 6d 65 6e 74 73 20 61 72 65 20 73 70  arguments are sp
23c90 65 63 69 66 69 65 64 2c 20 63 68 65 63 6b 20 74  ecified, check t
23ca0 68 61 74 20 74 68 65 79 20 61 63 74 75 61 6c 6c  hat they actuall
23cb0 79 20 65 78 69 73 74 20 77 69 74 68 69 6e 0a 20  y exist within. 
23cc0 20 2a 2a 20 74 68 65 20 61 72 63 68 69 76 65 20   ** the archive 
23cd0 62 65 66 6f 72 65 20 70 72 6f 63 65 65 64 69 6e  before proceedin
23ce0 67 2e 20 41 6e 64 20 66 6f 72 6d 75 6c 61 74 65  g. And formulate
23cf0 20 61 20 57 48 45 52 45 20 63 6c 61 75 73 65 20   a WHERE clause 
23d00 74 6f 0a 20 20 2a 2a 20 6d 61 74 63 68 20 74 68  to.  ** match th
23d10 65 6d 2e 20 20 2a 2f 0a 20 20 72 63 20 3d 20 61  em.  */.  rc = a
23d20 72 43 68 65 63 6b 45 6e 74 72 69 65 73 28 64 62  rCheckEntries(db
23d30 2c 20 70 41 72 29 3b 0a 20 20 61 72 57 68 65 72  , pAr);.  arWher
23d40 65 43 6c 61 75 73 65 28 26 72 63 2c 20 70 41 72  eClause(&rc, pAr
23d50 2c 20 26 7a 57 68 65 72 65 29 3b 0a 0a 20 20 69  , &zWhere);..  i
23d60 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
23d70 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 72 2d   ){.    if( pAr-
23d80 3e 7a 44 69 72 20 29 7b 0a 20 20 20 20 20 20 7a  >zDir ){.      z
23d90 44 69 72 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Dir = sqlite3_mp
23da0 72 69 6e 74 66 28 22 25 73 2f 22 2c 20 70 41 72  rintf("%s/", pAr
23db0 2d 3e 7a 44 69 72 29 3b 0a 20 20 20 20 7d 65 6c  ->zDir);.    }el
23dc0 73 65 7b 0a 20 20 20 20 20 20 7a 44 69 72 20 3d  se{.      zDir =
23dd0 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
23de0 28 22 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ("");.    }.    
23df0 69 66 28 20 7a 44 69 72 3d 3d 30 20 29 20 72 63  if( zDir==0 ) rc
23e00 20 3d 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b   = SQLITE_NOMEM;
23e10 0a 20 20 7d 0a 0a 20 20 73 68 65 6c 6c 50 72 65  .  }..  shellPre
23e20 70 61 72 65 50 72 69 6e 74 66 28 64 62 2c 20 26  parePrintf(db, &
23e30 72 63 2c 20 26 70 53 71 6c 2c 20 7a 53 71 6c 31  rc, &pSql, zSql1
23e40 2c 20 0a 20 20 20 20 20 20 61 7a 45 78 74 72 61  , .      azExtra
23e50 41 72 67 5b 70 41 72 2d 3e 62 5a 69 70 5d 2c 20  Arg[pAr->bZip], 
23e60 61 7a 53 6f 75 72 63 65 5b 70 41 72 2d 3e 62 5a  azSource[pAr->bZ
23e70 69 70 5d 2c 20 7a 57 68 65 72 65 0a 20 20 29 3b  ip], zWhere.  );
23e80 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
23e90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
23ea0 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
23eb0 53 71 6c 2c 20 31 2c 20 7a 44 69 72 2c 20 2d 31  Sql, 1, zDir, -1
23ec0 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29  , SQLITE_STATIC)
23ed0 3b 0a 20 20 20 20 69 66 28 20 70 41 72 2d 3e 62  ;.    if( pAr->b
23ee0 5a 69 70 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Zip ){.      sql
23ef0 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
23f00 53 71 6c 2c 20 33 2c 20 70 41 72 2d 3e 7a 46 69  Sql, 3, pAr->zFi
23f10 6c 65 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53  le, -1, SQLITE_S
23f20 54 41 54 49 43 29 3b 0a 20 20 20 20 7d 0a 0a 20  TATIC);.    }.. 
23f30 20 20 20 2f 2a 20 52 75 6e 20 74 68 65 20 53 45     /* Run the SE
23f40 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74  LECT statement t
23f50 77 69 63 65 2e 20 54 68 65 20 66 69 72 73 74 20  wice. The first 
23f60 74 69 6d 65 2c 20 77 72 69 74 65 66 69 6c 65 28  time, writefile(
23f70 29 20 69 73 20 63 61 6c 6c 65 64 0a 20 20 20 20  ) is called.    
23f80 2a 2a 20 66 6f 72 20 61 6c 6c 20 61 72 63 68 69  ** for all archi
23f90 76 65 20 6d 65 6d 62 65 72 73 20 74 68 61 74 20  ve members that 
23fa0 73 68 6f 75 6c 64 20 62 65 20 65 78 74 72 61 63  should be extrac
23fb0 74 65 64 2e 20 54 68 65 20 73 65 63 6f 6e 64 20  ted. The second 
23fc0 74 69 6d 65 2c 0a 20 20 20 20 2a 2a 20 6f 6e 6c  time,.    ** onl
23fd0 79 20 66 6f 72 20 74 68 65 20 64 69 72 65 63 74  y for the direct
23fe0 6f 72 69 65 73 2e 20 54 68 69 73 20 69 73 20 62  ories. This is b
23ff0 65 63 61 75 73 65 20 74 68 65 20 74 69 6d 65 73  ecause the times
24000 74 61 6d 70 73 20 66 6f 72 0a 20 20 20 20 2a 2a  tamps for.    **
24010 20 65 78 74 72 61 63 74 65 64 20 64 69 72 65 63   extracted direc
24020 74 6f 72 69 65 73 20 6d 75 73 74 20 62 65 20 72  tories must be r
24030 65 73 65 74 20 61 66 74 65 72 20 74 68 65 79 20  eset after they 
24040 61 72 65 20 70 6f 70 75 6c 61 74 65 64 20 28 61  are populated (a
24050 73 0a 20 20 20 20 2a 2a 20 70 6f 70 75 6c 61 74  s.    ** populat
24060 69 6e 67 20 74 68 65 6d 20 63 68 61 6e 67 65 73  ing them changes
24070 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70 29 2e   the timestamp).
24080 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
24090 3b 20 69 3c 32 3b 20 69 2b 2b 29 7b 0a 20 20 20  ; i<2; i++){.   
240a0 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
240b0 69 6e 74 28 70 53 71 6c 2c 20 32 2c 20 69 29 3b  int(pSql, 2, i);
240c0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 72 63  .      while( rc
240d0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 26 26 20 53  ==SQLITE_OK && S
240e0 51 4c 49 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74  QLITE_ROW==sqlit
240f0 65 33 5f 73 74 65 70 28 70 53 71 6c 29 20 29 7b  e3_step(pSql) ){
24100 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d  .        if( i==
24110 30 20 26 26 20 70 41 72 2d 3e 62 56 65 72 62 6f  0 && pAr->bVerbo
24120 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  se ){.          
24130 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
24140 74 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74  t, "%s\n", sqlit
24150 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
24160 53 71 6c 2c 20 30 29 29 3b 0a 20 20 20 20 20 20  Sql, 0));.      
24170 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
24180 20 20 73 68 65 6c 6c 52 65 73 65 74 28 26 72 63    shellReset(&rc
24190 2c 20 70 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20  , pSql);.    }. 
241a0 20 20 20 73 68 65 6c 6c 46 69 6e 61 6c 69 7a 65     shellFinalize
241b0 28 26 72 63 2c 20 70 53 71 6c 29 3b 0a 20 20 7d  (&rc, pSql);.  }
241c0 0a 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ..  sqlite3_free
241d0 28 7a 44 69 72 29 3b 0a 20 20 73 71 6c 69 74 65  (zDir);.  sqlite
241e0 33 5f 66 72 65 65 28 7a 57 68 65 72 65 29 3b 0a  3_free(zWhere);.
241f0 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
24200 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
24210 61 74 69 6f 6e 20 6f 66 20 2e 61 72 20 22 63 72  ation of .ar "cr
24220 65 61 74 65 22 20 61 6e 64 20 22 75 70 64 61 74  eate" and "updat
24230 65 22 20 63 6f 6d 6d 61 6e 64 73 2e 0a 2a 2a 0a  e" commands..**.
24240 2a 2a 20 43 72 65 61 74 65 20 74 68 65 20 22 73  ** Create the "s
24250 71 6c 61 72 22 20 74 61 62 6c 65 20 69 6e 20 74  qlar" table in t
24260 68 65 20 64 61 74 61 62 61 73 65 20 69 66 20 69  he database if i
24270 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61  t does not alrea
24280 64 79 20 65 78 69 73 74 2e 0a 2a 2a 20 54 68 65  dy exist..** The
24290 6e 20 61 64 64 20 65 61 63 68 20 66 69 6c 65 20  n add each file 
242a0 69 6e 20 74 68 65 20 61 7a 46 69 6c 65 5b 5d 20  in the azFile[] 
242b0 61 72 72 61 79 20 74 6f 20 74 68 65 20 61 72 63  array to the arc
242c0 68 69 76 65 2e 20 44 69 72 65 63 74 6f 72 69 65  hive. Directorie
242d0 73 0a 2a 2a 20 61 72 65 20 61 64 64 65 64 20 72  s.** are added r
242e0 65 63 75 72 73 69 76 65 6c 79 2e 20 49 66 20 61  ecursively. If a
242f0 72 67 75 6d 65 6e 74 20 62 56 65 72 62 6f 73 65  rgument bVerbose
24300 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 61 20   is non-zero, a 
24310 6d 65 73 73 61 67 65 20 69 73 0a 2a 2a 20 70 72  message is.** pr
24320 69 6e 74 65 64 20 6f 6e 20 73 74 64 6f 75 74 20  inted on stdout 
24330 66 6f 72 20 65 61 63 68 20 66 69 6c 65 20 61 72  for each file ar
24340 63 68 69 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  chived..**.** Th
24350 65 20 63 72 65 61 74 65 20 63 6f 6d 6d 61 6e 64  e create command
24360 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
24370 75 70 64 61 74 65 2c 20 65 78 63 65 70 74 20 74  update, except t
24380 68 61 74 20 69 74 20 64 72 6f 70 73 0a 2a 2a 20  hat it drops.** 
24390 61 6e 79 20 65 78 69 73 74 69 6e 67 20 22 73 71  any existing "sq
243a0 6c 61 72 22 20 74 61 62 6c 65 20 62 65 66 6f 72  lar" table befor
243b0 65 20 62 65 67 69 6e 6e 69 6e 67 2e 0a 2a 2f 0a  e beginning..*/.
243c0 73 74 61 74 69 63 20 69 6e 74 20 61 72 43 72 65  static int arCre
243d0 61 74 65 55 70 64 61 74 65 28 0a 20 20 53 68 65  ateUpdate(.  She
243e0 6c 6c 53 74 61 74 65 20 2a 70 2c 20 20 20 20 20  llState *p,     
243f0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
24400 53 68 65 6c 6c 20 73 74 61 74 65 20 70 6f 69 6e  Shell state poin
24410 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ter */.  sqlite3
24420 20 2a 64 62 2c 0a 20 20 41 72 43 6f 6d 6d 61 6e   *db,.  ArComman
24430 64 20 2a 70 41 72 2c 20 20 20 20 20 20 20 20 20  d *pAr,         
24440 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d 61          /* Comma
24450 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 61 6e 64  nd arguments and
24460 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e   options */.  in
24470 74 20 62 55 70 64 61 74 65 0a 29 7b 0a 20 20 63  t bUpdate.){.  c
24480 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 20  onst char *zSql 
24490 3d 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20  = "SELECT name, 
244a0 6d 6f 64 65 2c 20 6d 74 69 6d 65 2c 20 64 61 74  mode, mtime, dat
244b0 61 20 46 52 4f 4d 20 66 73 64 69 72 28 3f 2c 20  a FROM fsdir(?, 
244c0 3f 29 22 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ?)";.  const cha
244d0 72 20 2a 7a 43 72 65 61 74 65 20 3d 20 0a 20 20  r *zCreate = .  
244e0 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c      "CREATE TABL
244f0 45 20 49 46 20 4e 4f 54 20 45 58 49 53 54 53 20  E IF NOT EXISTS 
24500 73 71 6c 61 72 28 22 0a 20 20 20 20 20 20 22 6e  sqlar(".      "n
24510 61 6d 65 20 54 45 58 54 20 50 52 49 4d 41 52 59  ame TEXT PRIMARY
24520 20 4b 45 59 2c 20 20 2d 2d 20 6e 61 6d 65 20 6f   KEY,  -- name o
24530 66 20 74 68 65 20 66 69 6c 65 5c 6e 22 0a 20 20  f the file\n".  
24540 20 20 20 20 22 6d 6f 64 65 20 49 4e 54 2c 20 20      "mode INT,  
24550 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
24560 61 63 63 65 73 73 20 70 65 72 6d 69 73 73 69 6f  access permissio
24570 6e 73 5c 6e 22 0a 20 20 20 20 20 20 22 6d 74 69  ns\n".      "mti
24580 6d 65 20 49 4e 54 2c 20 20 20 20 20 20 20 20 20  me INT,         
24590 20 20 20 20 20 2d 2d 20 6c 61 73 74 20 6d 6f 64       -- last mod
245a0 69 66 69 63 61 74 69 6f 6e 20 74 69 6d 65 5c 6e  ification time\n
245b0 22 0a 20 20 20 20 20 20 22 73 7a 20 49 4e 54 2c  ".      "sz INT,
245c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
245d0 20 2d 2d 20 6f 72 69 67 69 6e 61 6c 20 66 69 6c   -- original fil
245e0 65 20 73 69 7a 65 5c 6e 22 0a 20 20 20 20 20 20  e size\n".      
245f0 22 64 61 74 61 20 42 4c 4f 42 20 20 20 20 20 20  "data BLOB      
24600 20 20 20 20 20 20 20 20 20 2d 2d 20 63 6f 6d 70           -- comp
24610 72 65 73 73 65 64 20 63 6f 6e 74 65 6e 74 5c 6e  ressed content\n
24620 22 0a 20 20 22 29 22 3b 0a 20 20 63 6f 6e 73 74  ".  ")";.  const
24630 20 63 68 61 72 20 2a 7a 44 72 6f 70 20 3d 20 22   char *zDrop = "
24640 44 52 4f 50 20 54 41 42 4c 45 20 49 46 20 45 58  DROP TABLE IF EX
24650 49 53 54 53 20 73 71 6c 61 72 22 3b 0a 20 20 63  ISTS sqlar";.  c
24660 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 73 65  onst char *zInse
24670 72 74 20 3d 20 22 52 45 50 4c 41 43 45 20 49 4e  rt = "REPLACE IN
24680 54 4f 20 73 71 6c 61 72 20 56 41 4c 55 45 53 28  TO sqlar VALUES(
24690 3f 2c 3f 2c 3f 2c 3f 2c 73 71 6c 61 72 5f 63 6f  ?,?,?,?,sqlar_co
246a0 6d 70 72 65 73 73 28 3f 29 29 22 3b 0a 0a 20 20  mpress(?))";..  
246b0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
246c0 74 6d 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  tmt = 0;        
246d0 2f 2a 20 44 69 72 65 63 74 6f 72 79 20 74 72 61  /* Directory tra
246e0 76 65 72 73 65 72 20 2a 2f 0a 20 20 73 71 6c 69  verser */.  sqli
246f0 74 65 33 5f 73 74 6d 74 20 2a 70 49 6e 73 65 72  te3_stmt *pInser
24700 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 43  t = 0;      /* C
24710 6f 6d 70 69 6c 61 74 69 6f 6e 20 6f 66 20 7a 49  ompilation of zI
24720 6e 73 65 72 74 20 2a 2f 0a 20 20 69 6e 74 20 69  nsert */.  int i
24730 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
24740 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f             /* Fo
24750 72 20 69 74 65 72 61 74 69 6e 67 20 74 68 72 6f  r iterating thro
24760 75 67 68 20 61 7a 46 69 6c 65 5b 5d 20 2a 2f 0a  ugh azFile[] */.
24770 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20    int rc;       
24780 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24790 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
247a0 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70   */..  assert( p
247b0 41 72 2d 3e 62 5a 69 70 3d 3d 30 20 29 3b 0a 0a  Ar->bZip==0 );..
247c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
247d0 78 65 63 28 64 62 2c 20 22 53 41 56 45 50 4f 49  xec(db, "SAVEPOI
247e0 4e 54 20 61 72 3b 22 2c 20 30 2c 20 30 2c 20 30  NT ar;", 0, 0, 0
247f0 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
24800 49 54 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20  ITE_OK ) return 
24810 72 63 3b 0a 0a 20 20 69 66 28 20 62 55 70 64 61  rc;..  if( bUpda
24820 74 65 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  te==0 ){.    rc 
24830 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 64  = sqlite3_exec(d
24840 62 2c 20 7a 44 72 6f 70 2c 20 30 2c 20 30 2c 20  b, zDrop, 0, 0, 
24850 30 29 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d  0);.    if( rc!=
24860 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74 75  SQLITE_OK ) retu
24870 72 6e 20 72 63 3b 0a 20 20 7d 0a 0a 20 20 72 63  rn rc;.  }..  rc
24880 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
24890 64 62 2c 20 7a 43 72 65 61 74 65 2c 20 30 2c 20  db, zCreate, 0, 
248a0 30 2c 20 30 29 3b 0a 20 20 73 68 65 6c 6c 50 72  0, 0);.  shellPr
248b0 65 70 61 72 65 28 64 62 2c 20 26 72 63 2c 20 7a  epare(db, &rc, z
248c0 49 6e 73 65 72 74 2c 20 26 70 49 6e 73 65 72 74  Insert, &pInsert
248d0 29 3b 0a 20 20 73 68 65 6c 6c 50 72 65 70 61 72  );.  shellPrepar
248e0 65 28 64 62 2c 20 26 72 63 2c 20 7a 53 71 6c 2c  e(db, &rc, zSql,
248f0 20 26 70 53 74 6d 74 29 3b 0a 20 20 73 71 6c 69   &pStmt);.  sqli
24900 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
24910 74 6d 74 2c 20 32 2c 20 70 41 72 2d 3e 7a 44 69  tmt, 2, pAr->zDi
24920 72 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54  r, -1, SQLITE_ST
24930 41 54 49 43 29 3b 0a 0a 20 20 66 6f 72 28 69 3d  ATIC);..  for(i=
24940 30 3b 20 69 3c 70 41 72 2d 3e 6e 41 72 67 20 26  0; i<pAr->nArg &
24950 26 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 3b  & rc==SQLITE_OK;
24960 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74   i++){.    sqlit
24970 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74  e3_bind_text(pSt
24980 6d 74 2c 20 31 2c 20 70 41 72 2d 3e 61 7a 41 72  mt, 1, pAr->azAr
24990 67 5b 69 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45  g[i], -1, SQLITE
249a0 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 77 68  _STATIC);.    wh
249b0 69 6c 65 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f  ile( rc==SQLITE_
249c0 4f 4b 20 26 26 20 53 51 4c 49 54 45 5f 52 4f 57  OK && SQLITE_ROW
249d0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
249e0 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 69  Stmt) ){.      i
249f0 6e 74 20 73 7a 3b 0a 20 20 20 20 20 20 63 6f 6e  nt sz;.      con
24a00 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d  st char *zName =
24a10 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
24a20 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
24a30 74 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20  t(pStmt, 0);.   
24a40 20 20 20 69 6e 74 20 6d 6f 64 65 20 3d 20 73 71     int mode = sq
24a50 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74  lite3_column_int
24a60 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20  (pStmt, 1);.    
24a70 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6d    unsigned int m
24a80 74 69 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 63  time = sqlite3_c
24a90 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
24aa0 20 32 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20   2);..      if( 
24ab0 70 41 72 2d 3e 62 56 65 72 62 6f 73 65 20 29 7b  pAr->bVerbose ){
24ac0 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
24ad0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c  ntf(p->out, "%s\
24ae0 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  n", zName);.    
24af0 20 20 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74    }..      sqlit
24b00 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 49 6e  e3_bind_text(pIn
24b10 73 65 72 74 2c 20 31 2c 20 7a 4e 61 6d 65 2c 20  sert, 1, zName, 
24b20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 49  -1, SQLITE_STATI
24b30 43 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  C);.      sqlite
24b40 33 5f 62 69 6e 64 5f 69 6e 74 28 70 49 6e 73 65  3_bind_int(pInse
24b50 72 74 2c 20 32 2c 20 6d 6f 64 65 29 3b 0a 20 20  rt, 2, mode);.  
24b60 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64      sqlite3_bind
24b70 5f 69 6e 74 36 34 28 70 49 6e 73 65 72 74 2c 20  _int64(pInsert, 
24b80 33 2c 20 28 73 71 6c 69 74 65 33 5f 69 6e 74 36  3, (sqlite3_int6
24b90 34 29 6d 74 69 6d 65 29 3b 0a 0a 20 20 20 20 20  4)mtime);..     
24ba0 20 69 66 28 20 53 5f 49 53 44 49 52 28 6d 6f 64   if( S_ISDIR(mod
24bb0 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 7a  e) ){.        sz
24bc0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 73 71   = 0;.        sq
24bd0 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28  lite3_bind_null(
24be0 70 49 6e 73 65 72 74 2c 20 35 29 3b 0a 20 20 20  pInsert, 5);.   
24bf0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24c00 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 76    sqlite3_bind_v
24c10 61 6c 75 65 28 70 49 6e 73 65 72 74 2c 20 35 2c  alue(pInsert, 5,
24c20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
24c30 76 61 6c 75 65 28 70 53 74 6d 74 2c 20 33 29 29  value(pStmt, 3))
24c40 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 53 5f  ;.        if( S_
24c50 49 53 4c 4e 4b 28 6d 6f 64 65 29 20 29 7b 0a 20  ISLNK(mode) ){. 
24c60 20 20 20 20 20 20 20 20 20 73 7a 20 3d 20 2d 31           sz = -1
24c70 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
24c80 0a 20 20 20 20 20 20 20 20 20 20 73 7a 20 3d 20  .          sz = 
24c90 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
24ca0 79 74 65 73 28 70 53 74 6d 74 2c 20 33 29 3b 0a  ytes(pStmt, 3);.
24cb0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24cc0 7d 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  }..      sqlite3
24cd0 5f 62 69 6e 64 5f 69 6e 74 28 70 49 6e 73 65 72  _bind_int(pInser
24ce0 74 2c 20 34 2c 20 73 7a 29 3b 0a 20 20 20 20 20  t, 4, sz);.     
24cf0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 49   sqlite3_step(pI
24d00 6e 73 65 72 74 29 3b 0a 20 20 20 20 20 20 72 63  nsert);.      rc
24d10 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 73 65 74   = sqlite3_reset
24d20 28 70 49 6e 73 65 72 74 29 3b 0a 20 20 20 20 7d  (pInsert);.    }
24d30 0a 20 20 20 20 73 68 65 6c 6c 52 65 73 65 74 28  .    shellReset(
24d40 26 72 63 2c 20 70 53 74 6d 74 29 3b 0a 20 20 7d  &rc, pStmt);.  }
24d50 0a 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49  ..  if( rc!=SQLI
24d60 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71 6c  TE_OK ){.    sql
24d70 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 22 52  ite3_exec(db, "R
24d80 4f 4c 4c 42 41 43 4b 20 54 4f 20 61 72 3b 20 52  OLLBACK TO ar; R
24d90 45 4c 45 41 53 45 20 61 72 3b 22 2c 20 30 2c 20  ELEASE ar;", 0, 
24da0 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  0, 0);.  }else{.
24db0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
24dc0 5f 65 78 65 63 28 64 62 2c 20 22 52 45 4c 45 41  _exec(db, "RELEA
24dd0 53 45 20 61 72 3b 22 2c 20 30 2c 20 30 2c 20 30  SE ar;", 0, 0, 0
24de0 29 3b 0a 20 20 7d 0a 20 20 73 68 65 6c 6c 46 69  );.  }.  shellFi
24df0 6e 61 6c 69 7a 65 28 26 72 63 2c 20 70 53 74 6d  nalize(&rc, pStm
24e00 74 29 3b 0a 20 20 73 68 65 6c 6c 46 69 6e 61 6c  t);.  shellFinal
24e10 69 7a 65 28 26 72 63 2c 20 70 49 6e 73 65 72 74  ize(&rc, pInsert
24e20 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a  );.  return rc;.
24e30 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65  }../*.** Impleme
24e40 6e 74 61 74 69 6f 6e 20 6f 66 20 2e 61 72 20 22  ntation of .ar "
24e50 43 72 65 61 74 65 22 20 63 6f 6d 6d 61 6e 64 2e  Create" command.
24e60 20 0a 2a 2a 0a 2a 2a 20 43 72 65 61 74 65 20 74   .**.** Create t
24e70 68 65 20 22 73 71 6c 61 72 22 20 74 61 62 6c 65  he "sqlar" table
24e80 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
24e90 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20   if it does not 
24ea0 61 6c 72 65 61 64 79 20 65 78 69 73 74 2e 0a 2a  already exist..*
24eb0 2a 20 54 68 65 6e 20 61 64 64 20 65 61 63 68 20  * Then add each 
24ec0 66 69 6c 65 20 69 6e 20 74 68 65 20 61 7a 46 69  file in the azFi
24ed0 6c 65 5b 5d 20 61 72 72 61 79 20 74 6f 20 74 68  le[] array to th
24ee0 65 20 61 72 63 68 69 76 65 2e 20 44 69 72 65 63  e archive. Direc
24ef0 74 6f 72 69 65 73 0a 2a 2a 20 61 72 65 20 61 64  tories.** are ad
24f00 64 65 64 20 72 65 63 75 72 73 69 76 65 6c 79 2e  ded recursively.
24f10 20 49 66 20 61 72 67 75 6d 65 6e 74 20 62 56 65   If argument bVe
24f20 72 62 6f 73 65 20 69 73 20 6e 6f 6e 2d 7a 65 72  rbose is non-zer
24f30 6f 2c 20 61 20 6d 65 73 73 61 67 65 20 69 73 0a  o, a message is.
24f40 2a 2a 20 70 72 69 6e 74 65 64 20 6f 6e 20 73 74  ** printed on st
24f50 64 6f 75 74 20 66 6f 72 20 65 61 63 68 20 66 69  dout for each fi
24f60 6c 65 20 61 72 63 68 69 76 65 64 2e 0a 2a 2f 0a  le archived..*/.
24f70 73 74 61 74 69 63 20 69 6e 74 20 61 72 43 72 65  static int arCre
24f80 61 74 65 43 6f 6d 6d 61 6e 64 28 0a 20 20 53 68  ateCommand(.  Sh
24f90 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 20 20 20  ellState *p,    
24fa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
24fb0 20 53 68 65 6c 6c 20 73 74 61 74 65 20 70 6f 69   Shell state poi
24fc0 6e 74 65 72 20 2a 2f 0a 20 20 73 71 6c 69 74 65  nter */.  sqlite
24fd0 33 20 2a 64 62 2c 0a 20 20 41 72 43 6f 6d 6d 61  3 *db,.  ArComma
24fe0 6e 64 20 2a 70 41 72 20 20 20 20 20 20 20 20 20  nd *pAr         
24ff0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6d 6d           /* Comm
25000 61 6e 64 20 61 72 67 75 6d 65 6e 74 73 20 61 6e  and arguments an
25010 64 20 6f 70 74 69 6f 6e 73 20 2a 2f 0a 29 7b 0a  d options */.){.
25020 20 20 72 65 74 75 72 6e 20 61 72 43 72 65 61 74    return arCreat
25030 65 55 70 64 61 74 65 28 70 2c 20 64 62 2c 20 70  eUpdate(p, db, p
25040 41 72 2c 20 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  Ar, 0);.}../*.**
25050 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20   Implementation 
25060 6f 66 20 2e 61 72 20 22 55 70 64 61 74 65 22 20  of .ar "Update" 
25070 63 6f 6d 6d 61 6e 64 2e 20 0a 2a 2f 0a 73 74 61  command. .*/.sta
25080 74 69 63 20 69 6e 74 20 61 72 55 70 64 61 74 65  tic int arUpdate
25090 43 6d 64 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  Cmd(ShellState *
250a0 70 2c 20 73 71 6c 69 74 65 33 20 2a 64 62 2c 20  p, sqlite3 *db, 
250b0 41 72 43 6f 6d 6d 61 6e 64 20 2a 70 41 72 29 7b  ArCommand *pAr){
250c0 0a 20 20 72 65 74 75 72 6e 20 61 72 43 72 65 61  .  return arCrea
250d0 74 65 55 70 64 61 74 65 28 70 2c 20 64 62 2c 20  teUpdate(p, db, 
250e0 70 41 72 2c 20 31 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  pAr, 1);.}.../*.
250f0 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f  ** Implementatio
25100 6e 20 6f 66 20 22 2e 61 72 22 20 64 6f 74 20 63  n of ".ar" dot c
25110 6f 6d 6d 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69  ommand..*/.stati
25120 63 20 69 6e 74 20 61 72 44 6f 74 43 6f 6d 6d 61  c int arDotComma
25130 6e 64 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  nd(.  ShellState
25140 20 2a 70 53 74 61 74 65 2c 20 20 20 20 20 20 20   *pState,       
25150 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
25160 20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74   shell tool stat
25170 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a  e */.  char **az
25180 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Arg,            
25190 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
251a0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73  of arguments pas
251b0 73 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61  sed to dot comma
251c0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67  nd */.  int nArg
251d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
251e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
251f0 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
25200 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20  azArg[] */.){.  
25210 41 72 43 6f 6d 6d 61 6e 64 20 63 6d 64 3b 0a 20  ArCommand cmd;. 
25220 20 69 6e 74 20 72 63 3b 0a 20 20 72 63 20 3d 20   int rc;.  rc = 
25230 61 72 50 61 72 73 65 43 6f 6d 6d 61 6e 64 28 61  arParseCommand(a
25240 7a 41 72 67 2c 20 6e 41 72 67 2c 20 26 63 6d 64  zArg, nArg, &cmd
25250 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  );.  if( rc==SQL
25260 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 73 71  ITE_OK ){.    sq
25270 6c 69 74 65 33 20 2a 64 62 20 3d 20 30 3b 20 20  lite3 *db = 0;  
25280 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
25290 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74  atabase handle t
252a0 6f 20 75 73 65 20 61 73 20 61 72 63 68 69 76 65  o use as archive
252b0 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 63 6d 64   */..    if( cmd
252c0 2e 62 5a 69 70 20 29 7b 0a 20 20 20 20 20 20 69  .bZip ){.      i
252d0 66 28 20 63 6d 64 2e 7a 46 69 6c 65 3d 3d 30 20  f( cmd.zFile==0 
252e0 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  ){.        raw_p
252f0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 7a  rintf(stderr, "z
25300 69 70 20 66 6f 72 6d 61 74 20 72 65 71 75 69 72  ip format requir
25310 65 73 20 61 20 2d 2d 66 69 6c 65 20 73 77 69 74  es a --file swit
25320 63 68 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  ch\n");.        
25330 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52  return SQLITE_ER
25340 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ROR;.      }else
25350 0a 20 20 20 20 20 20 69 66 28 20 63 6d 64 2e 65  .      if( cmd.e
25360 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 43 52 45 41  Cmd==AR_CMD_CREA
25370 54 45 20 7c 7c 20 63 6d 64 2e 65 43 6d 64 3d 3d  TE || cmd.eCmd==
25380 41 52 5f 43 4d 44 5f 55 50 44 41 54 45 20 29 7b  AR_CMD_UPDATE ){
25390 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
253a0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 7a 69 70  ntf(stderr, "zip
253b0 20 61 72 63 68 69 76 65 73 20 61 72 65 20 72 65   archives are re
253c0 61 64 2d 6f 6e 6c 79 5c 6e 22 29 3b 0a 20 20 20  ad-only\n");.   
253d0 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
253e0 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
253f0 7d 0a 20 20 20 20 20 20 64 62 20 3d 20 70 53 74  }.      db = pSt
25400 61 74 65 2d 3e 64 62 3b 0a 20 20 20 20 7d 65 6c  ate->db;.    }el
25410 73 65 20 69 66 28 20 63 6d 64 2e 7a 46 69 6c 65  se if( cmd.zFile
25420 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 66 6c   ){.      int fl
25430 61 67 73 3b 0a 20 20 20 20 20 20 69 66 28 20 63  ags;.      if( c
25440 6d 64 2e 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f  md.eCmd==AR_CMD_
25450 43 52 45 41 54 45 20 7c 7c 20 63 6d 64 2e 65 43  CREATE || cmd.eC
25460 6d 64 3d 3d 41 52 5f 43 4d 44 5f 55 50 44 41 54  md==AR_CMD_UPDAT
25470 45 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6c 61  E ){.        fla
25480 67 73 20 3d 20 53 51 4c 49 54 45 5f 4f 50 45 4e  gs = SQLITE_OPEN
25490 5f 52 45 41 44 57 52 49 54 45 7c 53 51 4c 49 54  _READWRITE|SQLIT
254a0 45 5f 4f 50 45 4e 5f 43 52 45 41 54 45 3b 0a 20  E_OPEN_CREATE;. 
254b0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
254c0 20 20 20 20 66 6c 61 67 73 20 3d 20 53 51 4c 49      flags = SQLI
254d0 54 45 5f 4f 50 45 4e 5f 52 45 41 44 4f 4e 4c 59  TE_OPEN_READONLY
254e0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
254f0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65  rc = sqlite3_ope
25500 6e 5f 76 32 28 63 6d 64 2e 7a 46 69 6c 65 2c 20  n_v2(cmd.zFile, 
25510 26 64 62 2c 20 66 6c 61 67 73 2c 20 30 29 3b 0a  &db, flags, 0);.
25520 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
25530 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
25540 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
25550 64 65 72 72 2c 20 22 63 61 6e 6e 6f 74 20 6f 70  derr, "cannot op
25560 65 6e 20 66 69 6c 65 3a 20 25 73 20 28 25 73 29  en file: %s (%s)
25570 5c 6e 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  \n", .          
25580 20 20 63 6d 64 2e 7a 46 69 6c 65 2c 20 73 71 6c    cmd.zFile, sql
25590 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 0a  ite3_errmsg(db).
255a0 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
255b0 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
255c0 28 64 62 29 3b 0a 20 20 20 20 20 20 20 20 72 65  (db);.        re
255d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 20 20 7d  turn rc;.      }
255e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
255f0 69 6c 65 69 6f 5f 69 6e 69 74 28 64 62 2c 20 30  ileio_init(db, 0
25600 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
25610 74 65 33 5f 73 71 6c 61 72 5f 69 6e 69 74 28 64  te3_sqlar_init(d
25620 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d 65  b, 0, 0);.    }e
25630 6c 73 65 7b 0a 20 20 20 20 20 20 64 62 20 3d 20  lse{.      db = 
25640 70 53 74 61 74 65 2d 3e 64 62 3b 0a 20 20 20 20  pState->db;.    
25650 7d 0a 0a 20 20 20 20 73 77 69 74 63 68 28 20 63  }..    switch( c
25660 6d 64 2e 65 43 6d 64 20 29 7b 0a 20 20 20 20 20  md.eCmd ){.     
25670 20 63 61 73 65 20 41 52 5f 43 4d 44 5f 43 52 45   case AR_CMD_CRE
25680 41 54 45 3a 0a 20 20 20 20 20 20 20 20 72 63 20  ATE:.        rc 
25690 3d 20 61 72 43 72 65 61 74 65 43 6f 6d 6d 61 6e  = arCreateComman
256a0 64 28 70 53 74 61 74 65 2c 20 64 62 2c 20 26 63  d(pState, db, &c
256b0 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  md);.        bre
256c0 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20  ak;..      case 
256d0 41 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 3a 0a  AR_CMD_EXTRACT:.
256e0 20 20 20 20 20 20 20 20 72 63 20 3d 20 61 72 45          rc = arE
256f0 78 74 72 61 63 74 43 6f 6d 6d 61 6e 64 28 70 53  xtractCommand(pS
25700 74 61 74 65 2c 20 64 62 2c 20 26 63 6d 64 29 3b  tate, db, &cmd);
25710 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
25720 0a 20 20 20 20 20 20 63 61 73 65 20 41 52 5f 43  .      case AR_C
25730 4d 44 5f 4c 49 53 54 3a 0a 20 20 20 20 20 20 20  MD_LIST:.       
25740 20 72 63 20 3d 20 61 72 4c 69 73 74 43 6f 6d 6d   rc = arListComm
25750 61 6e 64 28 70 53 74 61 74 65 2c 20 64 62 2c 20  and(pState, db, 
25760 26 63 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 62  &cmd);.        b
25770 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73  reak;..      cas
25780 65 20 41 52 5f 43 4d 44 5f 48 45 4c 50 3a 0a 20  e AR_CMD_HELP:. 
25790 20 20 20 20 20 20 20 61 72 55 73 61 67 65 28 70         arUsage(p
257a0 53 74 61 74 65 2d 3e 6f 75 74 29 3b 0a 20 20 20  State->out);.   
257b0 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
257c0 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
257d0 20 20 20 20 61 73 73 65 72 74 28 20 63 6d 64 2e      assert( cmd.
257e0 65 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 55 50 44  eCmd==AR_CMD_UPD
257f0 41 54 45 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ATE );.        r
25800 63 20 3d 20 61 72 55 70 64 61 74 65 43 6d 64 28  c = arUpdateCmd(
25810 70 53 74 61 74 65 2c 20 64 62 2c 20 26 63 6d 64  pState, db, &cmd
25820 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
25830 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
25840 20 63 6d 64 2e 7a 46 69 6c 65 20 29 7b 0a 20 20   cmd.zFile ){.  
25850 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
25860 65 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  e(db);.    }.  }
25870 0a 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d  ..  return rc;.}
25880 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e  ../*.** Implemen
25890 74 61 74 69 6f 6e 20 6f 66 20 22 2e 65 78 70 65  tation of ".expe
258a0 72 74 22 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e  rt" dot command.
258b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
258c0 78 70 65 72 74 44 6f 74 43 6f 6d 6d 61 6e 64 28  xpertDotCommand(
258d0 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
258e0 53 74 61 74 65 2c 20 20 20 20 20 20 20 20 20 20  State,          
258f0 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68     /* Current sh
25900 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a  ell tool state *
25910 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67  /.  char **azArg
25920 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
25930 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20      /* Array of 
25940 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64  arguments passed
25950 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20   to dot command 
25960 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20  */.  int nArg   
25970 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25980 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
25990 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41  f entries in azA
259a0 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  rg[] */.){.  int
259b0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b   rc = SQLITE_OK;
259c0 0a 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20  .  char *zErr = 
259d0 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  0;.  int i;.  in
259e0 74 20 69 53 61 6d 70 6c 65 20 3d 20 30 3b 0a 0a  t iSample = 0;..
259f0 20 20 61 73 73 65 72 74 28 20 70 53 74 61 74 65    assert( pState
25a00 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74  ->expert.pExpert
25a10 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28  ==0 );.  memset(
25a20 26 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2c  &pState->expert,
25a30 20 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 65 72   0, sizeof(Exper
25a40 74 49 6e 66 6f 29 29 3b 0a 0a 20 20 66 6f 72 28  tInfo));..  for(
25a50 69 3d 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f  i=1; rc==SQLITE_
25a60 4f 4b 20 26 26 20 69 3c 6e 41 72 67 3b 20 69 2b  OK && i<nArg; i+
25a70 2b 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20  +){.    char *z 
25a80 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20  = azArg[i];.    
25a90 69 6e 74 20 6e 3b 0a 20 20 20 20 69 66 28 20 7a  int n;.    if( z
25aa0 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 7a 5b 31 5d  [0]=='-' && z[1]
25ab0 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20  =='-' ) z++;.   
25ac0 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a   n = strlen(z);.
25ad0 20 20 20 20 69 66 28 20 6e 3e 3d 32 20 26 26 20      if( n>=2 && 
25ae0 30 3d 3d 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d  0==strncmp(z, "-
25af0 76 65 72 62 6f 73 65 22 2c 20 6e 29 20 29 7b 0a  verbose", n) ){.
25b00 20 20 20 20 20 20 70 53 74 61 74 65 2d 3e 65 78        pState->ex
25b10 70 65 72 74 2e 62 56 65 72 62 6f 73 65 20 3d 20  pert.bVerbose = 
25b20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  1;.    }.    els
25b30 65 20 69 66 28 20 6e 3e 3d 32 20 26 26 20 30 3d  e if( n>=2 && 0=
25b40 3d 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 73 61  =strncmp(z, "-sa
25b50 6d 70 6c 65 22 2c 20 6e 29 20 29 7b 0a 20 20 20  mple", n) ){.   
25b60 20 20 20 69 66 28 20 69 3d 3d 28 6e 41 72 67 2d     if( i==(nArg-
25b70 31 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61  1) ){.        ra
25b80 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
25b90 20 22 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65   "option require
25ba0 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25  s an argument: %
25bb0 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20  s\n", z);.      
25bc0 20 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52    rc = SQLITE_ER
25bd0 52 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ROR;.      }else
25be0 7b 0a 20 20 20 20 20 20 20 20 69 53 61 6d 70 6c  {.        iSampl
25bf0 65 20 3d 20 28 69 6e 74 29 69 6e 74 65 67 65 72  e = (int)integer
25c00 56 61 6c 75 65 28 61 7a 41 72 67 5b 2b 2b 69 5d  Value(azArg[++i]
25c10 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
25c20 53 61 6d 70 6c 65 3c 30 20 7c 7c 20 69 53 61 6d  Sample<0 || iSam
25c30 70 6c 65 3e 31 30 30 20 29 7b 0a 20 20 20 20 20  ple>100 ){.     
25c40 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
25c50 73 74 64 65 72 72 2c 20 22 76 61 6c 75 65 20 6f  stderr, "value o
25c60 75 74 20 6f 66 20 72 61 6e 67 65 3a 20 25 73 5c  ut of range: %s\
25c70 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  n", azArg[i]);. 
25c80 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51           rc = SQ
25c90 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
25ca0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
25cb0 20 20 7d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20    }.    else{.  
25cc0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
25cd0 74 64 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20  tderr, "unknown 
25ce0 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 7a  option: %s\n", z
25cf0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
25d00 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
25d10 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d  }.  }..  if( rc=
25d20 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
25d30 20 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74    pState->expert
25d40 2e 70 45 78 70 65 72 74 20 3d 20 73 71 6c 69 74  .pExpert = sqlit
25d50 65 33 5f 65 78 70 65 72 74 5f 6e 65 77 28 70 53  e3_expert_new(pS
25d60 74 61 74 65 2d 3e 64 62 2c 20 26 7a 45 72 72 29  tate->db, &zErr)
25d70 3b 0a 20 20 20 20 69 66 28 20 70 53 74 61 74 65  ;.    if( pState
25d80 2d 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74  ->expert.pExpert
25d90 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77  ==0 ){.      raw
25da0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
25db0 22 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f  "sqlite3_expert_
25dc0 6e 65 77 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72  new: %s\n", zErr
25dd0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51  );.      rc = SQ
25de0 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20  LITE_ERROR;.    
25df0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
25e00 69 74 65 33 5f 65 78 70 65 72 74 5f 63 6f 6e 66  ite3_expert_conf
25e10 69 67 28 0a 20 20 20 20 20 20 20 20 20 20 70 53  ig(.          pS
25e20 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78  tate->expert.pEx
25e30 70 65 72 74 2c 20 45 58 50 45 52 54 5f 43 4f 4e  pert, EXPERT_CON
25e40 46 49 47 5f 53 41 4d 50 4c 45 2c 20 69 53 61 6d  FIG_SAMPLE, iSam
25e50 70 6c 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  ple.      );.   
25e60 20 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e   }.  }..  return
25e70 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49   rc;.}.../*.** I
25e80 66 20 61 6e 20 69 6e 70 75 74 20 6c 69 6e 65 20  f an input line 
25e90 62 65 67 69 6e 73 20 77 69 74 68 20 22 2e 22 20  begins with "." 
25ea0 74 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 69 73  then invoke this
25eb0 20 72 6f 75 74 69 6e 65 20 74 6f 0a 2a 2a 20 70   routine to.** p
25ec0 72 6f 63 65 73 73 20 74 68 61 74 20 6c 69 6e 65  rocess that line
25ed0 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31  ..**.** Return 1
25ee0 20 6f 6e 20 65 72 72 6f 72 2c 20 32 20 74 6f 20   on error, 2 to 
25ef0 65 78 69 74 2c 20 61 6e 64 20 30 20 6f 74 68 65  exit, and 0 othe
25f00 72 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  rwise..*/.static
25f10 20 69 6e 74 20 64 6f 5f 6d 65 74 61 5f 63 6f 6d   int do_meta_com
25f20 6d 61 6e 64 28 63 68 61 72 20 2a 7a 4c 69 6e 65  mand(char *zLine
25f30 2c 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29  , ShellState *p)
25f40 7b 0a 20 20 69 6e 74 20 68 20 3d 20 31 3b 0a 20  {.  int h = 1;. 
25f50 20 69 6e 74 20 6e 41 72 67 20 3d 20 30 3b 0a 20   int nArg = 0;. 
25f60 20 69 6e 74 20 6e 2c 20 63 3b 0a 20 20 69 6e 74   int n, c;.  int
25f70 20 72 63 20 3d 20 30 3b 0a 20 20 63 68 61 72 20   rc = 0;.  char 
25f80 2a 61 7a 41 72 67 5b 35 30 5d 3b 0a 0a 20 20 69  *azArg[50];..  i
25f90 66 28 20 70 2d 3e 65 78 70 65 72 74 2e 70 45 78  f( p->expert.pEx
25fa0 70 65 72 74 20 29 7b 0a 20 20 20 20 65 78 70 65  pert ){.    expe
25fb0 72 74 46 69 6e 69 73 68 28 70 2c 20 31 2c 20 30  rtFinish(p, 1, 0
25fc0 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 61 72  );.  }..  /* Par
25fd0 73 65 20 74 68 65 20 69 6e 70 75 74 20 6c 69 6e  se the input lin
25fe0 65 20 69 6e 74 6f 20 74 6f 6b 65 6e 73 2e 0a 20  e into tokens.. 
25ff0 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 7a 4c 69   */.  while( zLi
26000 6e 65 5b 68 5d 20 26 26 20 6e 41 72 67 3c 41 72  ne[h] && nArg<Ar
26010 72 61 79 53 69 7a 65 28 61 7a 41 72 67 29 20 29  raySize(azArg) )
26020 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 49 73 53  {.    while( IsS
26030 70 61 63 65 28 7a 4c 69 6e 65 5b 68 5d 29 20 29  pace(zLine[h]) )
26040 7b 20 68 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28  { h++; }.    if(
26050 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 30 20 29 20 62   zLine[h]==0 ) b
26060 72 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 7a 4c  reak;.    if( zL
26070 69 6e 65 5b 68 5d 3d 3d 27 5c 27 27 20 7c 7c 20  ine[h]=='\'' || 
26080 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 22 27 20 29 7b  zLine[h]=='"' ){
26090 0a 20 20 20 20 20 20 69 6e 74 20 64 65 6c 69 6d  .      int delim
260a0 20 3d 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 3b 0a 20   = zLine[h++];. 
260b0 20 20 20 20 20 61 7a 41 72 67 5b 6e 41 72 67 2b       azArg[nArg+
260c0 2b 5d 20 3d 20 26 7a 4c 69 6e 65 5b 68 5d 3b 0a  +] = &zLine[h];.
260d0 20 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69        while( zLi
260e0 6e 65 5b 68 5d 20 26 26 20 7a 4c 69 6e 65 5b 68  ne[h] && zLine[h
260f0 5d 21 3d 64 65 6c 69 6d 20 29 7b 0a 20 20 20 20  ]!=delim ){.    
26100 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d      if( zLine[h]
26110 3d 3d 27 5c 5c 27 20 26 26 20 64 65 6c 69 6d 3d  =='\\' && delim=
26120 3d 27 22 27 20 26 26 20 7a 4c 69 6e 65 5b 68 2b  ='"' && zLine[h+
26130 31 5d 21 3d 30 20 29 20 68 2b 2b 3b 0a 20 20 20  1]!=0 ) h++;.   
26140 20 20 20 20 20 68 2b 2b 3b 0a 20 20 20 20 20 20       h++;.      
26150 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e  }.      if( zLin
26160 65 5b 68 5d 3d 3d 64 65 6c 69 6d 20 29 7b 0a 20  e[h]==delim ){. 
26170 20 20 20 20 20 20 20 7a 4c 69 6e 65 5b 68 2b 2b         zLine[h++
26180 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  ] = 0;.      }. 
26190 20 20 20 20 20 69 66 28 20 64 65 6c 69 6d 3d 3d       if( delim==
261a0 27 22 27 20 29 20 72 65 73 6f 6c 76 65 5f 62 61  '"' ) resolve_ba
261b0 63 6b 73 6c 61 73 68 65 73 28 61 7a 41 72 67 5b  ckslashes(azArg[
261c0 6e 41 72 67 2d 31 5d 29 3b 0a 20 20 20 20 7d 65  nArg-1]);.    }e
261d0 6c 73 65 7b 0a 20 20 20 20 20 20 61 7a 41 72 67  lse{.      azArg
261e0 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26 7a 4c 69 6e  [nArg++] = &zLin
261f0 65 5b 68 5d 3b 0a 20 20 20 20 20 20 77 68 69 6c  e[h];.      whil
26200 65 28 20 7a 4c 69 6e 65 5b 68 5d 20 26 26 20 21  e( zLine[h] && !
26210 49 73 53 70 61 63 65 28 7a 4c 69 6e 65 5b 68 5d  IsSpace(zLine[h]
26220 29 20 29 7b 20 68 2b 2b 3b 20 7d 0a 20 20 20 20  ) ){ h++; }.    
26230 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 20 29    if( zLine[h] )
26240 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 20 3d 20 30 3b   zLine[h++] = 0;
26250 0a 20 20 20 20 20 20 72 65 73 6f 6c 76 65 5f 62  .      resolve_b
26260 61 63 6b 73 6c 61 73 68 65 73 28 61 7a 41 72 67  ackslashes(azArg
26270 5b 6e 41 72 67 2d 31 5d 29 3b 0a 20 20 20 20 7d  [nArg-1]);.    }
26280 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65  .  }..  /* Proce
26290 73 73 20 74 68 65 20 69 6e 70 75 74 20 6c 69 6e  ss the input lin
262a0 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 41  e..  */.  if( nA
262b0 72 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  rg==0 ) return 0
262c0 3b 20 2f 2a 20 6e 6f 20 74 6f 6b 65 6e 73 2c 20  ; /* no tokens, 
262d0 6e 6f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 6e 20  no error */.  n 
262e0 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 41 72 67  = strlen30(azArg
262f0 5b 30 5d 29 3b 0a 20 20 63 20 3d 20 61 7a 41 72  [0]);.  c = azAr
26300 67 5b 30 5d 5b 30 5d 3b 0a 0a 23 69 66 6e 64 65  g[0][0];..#ifnde
26310 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55  f SQLITE_OMIT_AU
26320 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66  THORIZATION.  if
26330 28 20 63 3d 3d 27 61 27 20 26 26 20 73 74 72 6e  ( c=='a' && strn
26340 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 61  cmp(azArg[0], "a
26350 75 74 68 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  uth", n)==0 ){. 
26360 20 20 20 69 66 28 20 6e 41 72 67 21 3d 32 20 29     if( nArg!=2 )
26370 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
26380 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
26390 65 3a 20 2e 61 75 74 68 20 4f 4e 7c 4f 46 46 5c  e: .auth ON|OFF\
263a0 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
263b0 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  1;.      goto me
263c0 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
263d0 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f  .    }.    open_
263e0 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 69 66  db(p, 0);.    if
263f0 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61  ( booleanValue(a
26400 7a 41 72 67 5b 31 5d 29 20 29 7b 0a 20 20 20 20  zArg[1]) ){.    
26410 20 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75    sqlite3_set_au
26420 74 68 6f 72 69 7a 65 72 28 70 2d 3e 64 62 2c 20  thorizer(p->db, 
26430 73 68 65 6c 6c 41 75 74 68 2c 20 70 29 3b 0a 20  shellAuth, p);. 
26440 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26450 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68  sqlite3_set_auth
26460 6f 72 69 7a 65 72 28 70 2d 3e 64 62 2c 20 30 2c  orizer(p->db, 0,
26470 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c   0);.    }.  }el
26480 73 65 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64  se.#endif..#ifnd
26490 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
264a0 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66  IRTUALTABLE.  if
264b0 28 20 63 3d 3d 27 61 27 20 26 26 20 73 74 72 6e  ( c=='a' && strn
264c0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 61  cmp(azArg[0], "a
264d0 72 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  r", n)==0 ){.   
264e0 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
264f0 20 20 20 20 72 63 20 3d 20 61 72 44 6f 74 43 6f      rc = arDotCo
26500 6d 6d 61 6e 64 28 70 2c 20 61 7a 41 72 67 2c 20  mmand(p, azArg, 
26510 6e 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  nArg);.  }else.#
26520 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 28 63 3d  endif..  if( (c=
26530 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20 26 26 20  ='b' && n>=3 && 
26540 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
26550 2c 20 22 62 61 63 6b 75 70 22 2c 20 6e 29 3d 3d  , "backup", n)==
26560 30 29 0a 20 20 20 7c 7c 20 28 63 3d 3d 27 73 27  0).   || (c=='s'
26570 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
26580 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73  cmp(azArg[0], "s
26590 61 76 65 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 29  ave", n)==0).  )
265a0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
265b0 20 2a 7a 44 65 73 74 46 69 6c 65 20 3d 20 30 3b   *zDestFile = 0;
265c0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
265d0 2a 7a 44 62 20 3d 20 30 3b 0a 20 20 20 20 73 71  *zDb = 0;.    sq
265e0 6c 69 74 65 33 20 2a 70 44 65 73 74 3b 0a 20 20  lite3 *pDest;.  
265f0 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
26600 20 2a 70 42 61 63 6b 75 70 3b 0a 20 20 20 20 69   *pBackup;.    i
26610 6e 74 20 6a 3b 0a 20 20 20 20 66 6f 72 28 6a 3d  nt j;.    for(j=
26620 31 3b 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 29 7b  1; j<nArg; j++){
26630 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
26640 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b  r *z = azArg[j];
26650 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d  .      if( z[0]=
26660 3d 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20  ='-' ){.        
26670 77 68 69 6c 65 28 20 7a 5b 30 5d 3d 3d 27 2d 27  while( z[0]=='-'
26680 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20   ) z++;.        
26690 2f 2a 20 4e 6f 20 6f 70 74 69 6f 6e 73 20 74 6f  /* No options to
266a0 20 70 72 6f 63 65 73 73 20 61 74 20 74 68 69 73   process at this
266b0 20 74 69 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20   time */.       
266c0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66   {.          utf
266d0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
266e0 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e   "unknown option
266f0 3a 20 25 73 5c 6e 22 2c 20 61 7a 41 72 67 5b 6a  : %s\n", azArg[j
26700 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  ]);.          re
26710 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
26720 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
26730 28 20 7a 44 65 73 74 46 69 6c 65 3d 3d 30 20 29  ( zDestFile==0 )
26740 7b 0a 20 20 20 20 20 20 20 20 7a 44 65 73 74 46  {.        zDestF
26750 69 6c 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a  ile = azArg[j];.
26760 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
26770 7a 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  zDb==0 ){.      
26780 20 20 7a 44 62 20 3d 20 7a 44 65 73 74 46 69 6c    zDb = zDestFil
26790 65 3b 0a 20 20 20 20 20 20 20 20 7a 44 65 73 74  e;.        zDest
267a0 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b  File = azArg[j];
267b0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
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 74 6f 6f 20 6d 61  (stderr, "too ma
267e0 6e 79 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  ny arguments to 
267f0 2e 62 61 63 6b 75 70 5c 6e 22 29 3b 0a 20 20 20  .backup\n");.   
26800 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
26810 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
26820 20 69 66 28 20 7a 44 65 73 74 46 69 6c 65 3d 3d   if( zDestFile==
26830 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  0 ){.      raw_p
26840 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6d  rintf(stderr, "m
26850 69 73 73 69 6e 67 20 46 49 4c 45 4e 41 4d 45 20  issing FILENAME 
26860 61 72 67 75 6d 65 6e 74 20 6f 6e 20 2e 62 61 63  argument on .bac
26870 6b 75 70 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  kup\n");.      r
26880 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
26890 20 20 20 69 66 28 20 7a 44 62 3d 3d 30 20 29 20     if( zDb==0 ) 
268a0 7a 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20  zDb = "main";.  
268b0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f    rc = sqlite3_o
268c0 70 65 6e 28 7a 44 65 73 74 46 69 6c 65 2c 20 26  pen(zDestFile, &
268d0 70 44 65 73 74 29 3b 0a 20 20 20 20 69 66 28 20  pDest);.    if( 
268e0 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
268f0 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
26900 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
26910 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c  r: cannot open \
26920 22 25 73 5c 22 5c 6e 22 2c 20 7a 44 65 73 74 46  "%s\"\n", zDestF
26930 69 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ile);.      sqli
26940 74 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29  te3_close(pDest)
26950 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
26960 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e  ;.    }.    open
26970 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 70  _db(p, 0);.    p
26980 42 61 63 6b 75 70 20 3d 20 73 71 6c 69 74 65 33  Backup = sqlite3
26990 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28 70 44 65  _backup_init(pDe
269a0 73 74 2c 20 22 6d 61 69 6e 22 2c 20 70 2d 3e 64  st, "main", p->d
269b0 62 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28  b, zDb);.    if(
269c0 20 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20   pBackup==0 ){. 
269d0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
269e0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
269f0 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f   %s\n", sqlite3_
26a00 65 72 72 6d 73 67 28 70 44 65 73 74 29 29 3b 0a  errmsg(pDest));.
26a10 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c        sqlite3_cl
26a20 6f 73 65 28 70 44 65 73 74 29 3b 0a 20 20 20 20  ose(pDest);.    
26a30 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
26a40 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 20 28 72  }.    while(  (r
26a50 63 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b  c = sqlite3_back
26a60 75 70 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c  up_step(pBackup,
26a70 31 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b  100))==SQLITE_OK
26a80 20 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74 65 33   ){}.    sqlite3
26a90 5f 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70  _backup_finish(p
26aa0 42 61 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28  Backup);.    if(
26ab0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45   rc==SQLITE_DONE
26ac0 20 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30   ){.      rc = 0
26ad0 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
26ae0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
26af0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25  tderr, "Error: %
26b00 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  s\n", sqlite3_er
26b10 72 6d 73 67 28 70 44 65 73 74 29 29 3b 0a 20 20  rmsg(pDest));.  
26b20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
26b30 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c  }.    sqlite3_cl
26b40 6f 73 65 28 70 44 65 73 74 29 3b 0a 20 20 7d 65  ose(pDest);.  }e
26b50 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 62  lse..  if( c=='b
26b60 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72  ' && n>=3 && str
26b70 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
26b80 62 61 69 6c 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  bail", n)==0 ){.
26b90 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
26ba0 29 7b 0a 20 20 20 20 20 20 62 61 69 6c 5f 6f 6e  ){.      bail_on
26bb0 5f 65 72 72 6f 72 20 3d 20 62 6f 6f 6c 65 61 6e  _error = boolean
26bc0 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b  Value(azArg[1]);
26bd0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
26be0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
26bf0 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 62 61  err, "Usage: .ba
26c00 69 6c 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20  il on|off\n");. 
26c10 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
26c20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
26c30 28 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33  ( c=='b' && n>=3
26c40 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
26c50 67 5b 30 5d 2c 20 22 62 69 6e 61 72 79 22 2c 20  g[0], "binary", 
26c60 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  n)==0 ){.    if(
26c70 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
26c80 20 20 69 66 28 20 62 6f 6f 6c 65 61 6e 56 61 6c    if( booleanVal
26c90 75 65 28 61 7a 41 72 67 5b 31 5d 29 20 29 7b 0a  ue(azArg[1]) ){.
26ca0 20 20 20 20 20 20 20 20 73 65 74 42 69 6e 61 72          setBinar
26cb0 79 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29  yMode(p->out, 1)
26cc0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
26cd0 20 20 20 20 20 20 20 73 65 74 54 65 78 74 4d 6f         setTextMo
26ce0 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20  de(p->out, 1);. 
26cf0 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
26d00 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
26d10 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
26d20 65 3a 20 2e 62 69 6e 61 72 79 20 6f 6e 7c 6f 66  e: .binary on|of
26d30 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  f\n");.      rc 
26d40 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
26d50 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63 27  se..  if( c=='c'
26d60 20 26 26 20 73 74 72 63 6d 70 28 61 7a 41 72 67   && strcmp(azArg
26d70 5b 30 5d 2c 22 63 64 22 29 3d 3d 30 20 29 7b 0a  [0],"cd")==0 ){.
26d80 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
26d90 29 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f  ){.#if defined(_
26da0 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65  WIN32) || define
26db0 64 28 57 49 4e 33 32 29 0a 20 20 20 20 20 20 77  d(WIN32).      w
26dc0 63 68 61 72 5f 74 20 2a 7a 20 3d 20 73 71 6c 69  char_t *z = sqli
26dd0 74 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74  te3_win32_utf8_t
26de0 6f 5f 75 6e 69 63 6f 64 65 28 61 7a 41 72 67 5b  o_unicode(azArg[
26df0 31 5d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  1]);.      rc = 
26e00 21 53 65 74 43 75 72 72 65 6e 74 44 69 72 65 63  !SetCurrentDirec
26e10 74 6f 72 79 57 28 7a 29 3b 0a 20 20 20 20 20 20  toryW(z);.      
26e20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
26e30 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20  .#else.      rc 
26e40 3d 20 63 68 64 69 72 28 61 7a 41 72 67 5b 31 5d  = chdir(azArg[1]
26e50 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
26e60 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
26e70 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
26e80 64 65 72 72 2c 20 22 43 61 6e 6e 6f 74 20 63 68  derr, "Cannot ch
26e90 61 6e 67 65 20 74 6f 20 64 69 72 65 63 74 6f 72  ange to director
26ea0 79 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41  y \"%s\"\n", azA
26eb0 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[1]);.        
26ec0 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  rc = 1;.      }.
26ed0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26ee0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
26ef0 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 63 64 20  rr, "Usage: .cd 
26f00 44 49 52 45 43 54 4f 52 59 5c 6e 22 29 3b 0a 20  DIRECTORY\n");. 
26f10 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
26f20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a   }.  }else..  /*
26f30 20 54 68 65 20 75 6e 64 6f 63 75 6d 65 6e 74 65   The undocumente
26f40 64 20 22 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20  d ".breakpoint" 
26f50 63 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20 61  command causes a
26f60 20 63 61 6c 6c 20 74 6f 20 74 68 65 20 6e 6f 2d   call to the no-
26f70 6f 70 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20  op.  ** routine 
26f80 6e 61 6d 65 64 20 74 65 73 74 5f 62 72 65 61 6b  named test_break
26f90 70 6f 69 6e 74 28 29 2e 0a 20 20 2a 2f 0a 20 20  point()..  */.  
26fa0 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e  if( c=='b' && n>
26fb0 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =3 && strncmp(az
26fc0 41 72 67 5b 30 5d 2c 20 22 62 72 65 61 6b 70 6f  Arg[0], "breakpo
26fd0 69 6e 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  int", n)==0 ){. 
26fe0 20 20 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69     test_breakpoi
26ff0 6e 74 28 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  nt();.  }else.. 
27000 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20 6e   if( c=='c' && n
27010 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
27020 7a 41 72 67 5b 30 5d 2c 20 22 63 68 61 6e 67 65  zArg[0], "change
27030 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  s", n)==0 ){.   
27040 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a   if( nArg==2 ){.
27050 20 20 20 20 20 20 73 65 74 4f 72 43 6c 65 61 72        setOrClear
27060 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 43 6f  Flag(p, SHFLG_Co
27070 75 6e 74 43 68 61 6e 67 65 73 2c 20 61 7a 41 72  untChanges, azAr
27080 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  g[1]);.    }else
27090 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
270a0 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
270b0 65 3a 20 2e 63 68 61 6e 67 65 73 20 6f 6e 7c 6f  e: .changes on|o
270c0 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  ff\n");.      rc
270d0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = 1;.    }.  }e
270e0 6c 73 65 0a 0a 20 20 2f 2a 20 43 61 6e 63 65 6c  lse..  /* Cancel
270f0 20 6f 75 74 70 75 74 20 72 65 64 69 72 65 63 74   output redirect
27100 69 6f 6e 2c 20 69 66 20 69 74 20 69 73 20 63 75  ion, if it is cu
27110 72 72 65 6e 74 6c 79 20 73 65 74 20 28 62 79 20  rrently set (by 
27120 2e 74 65 73 74 63 61 73 65 29 0a 20 20 2a 2a 20  .testcase).  ** 
27130 54 68 65 6e 20 72 65 61 64 20 74 68 65 20 63 6f  Then read the co
27140 6e 74 65 6e 74 20 6f 66 20 74 68 65 20 74 65 73  ntent of the tes
27150 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 20 66 69  tcase-out.txt fi
27160 6c 65 20 61 6e 64 20 63 6f 6d 70 61 72 65 20 61  le and compare a
27170 67 61 69 6e 73 74 0a 20 20 2a 2a 20 61 7a 41 72  gainst.  ** azAr
27180 67 5b 31 5d 2e 20 20 49 66 20 74 68 65 72 65 20  g[1].  If there 
27190 61 72 65 20 64 69 66 66 65 72 65 6e 63 65 73 2c  are differences,
271a0 20 72 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72   report an error
271b0 20 61 6e 64 20 65 78 69 74 2e 0a 20 20 2a 2f 0a   and exit..  */.
271c0 20 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20    if( c=='c' && 
271d0 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=3 && strncmp(
271e0 61 7a 41 72 67 5b 30 5d 2c 20 22 63 68 65 63 6b  azArg[0], "check
271f0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
27200 63 68 61 72 20 2a 7a 52 65 73 20 3d 20 30 3b 0a  char *zRes = 0;.
27210 20 20 20 20 6f 75 74 70 75 74 5f 72 65 73 65 74      output_reset
27220 28 70 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72  (p);.    if( nAr
27230 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 61  g!=2 ){.      ra
27240 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
27250 20 22 55 73 61 67 65 3a 20 2e 63 68 65 63 6b 20   "Usage: .check 
27260 47 4c 4f 42 2d 50 41 54 54 45 52 4e 5c 6e 22 29  GLOB-PATTERN\n")
27270 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 32 3b 0a  ;.      rc = 2;.
27280 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 7a      }else if( (z
27290 52 65 73 20 3d 20 72 65 61 64 46 69 6c 65 28 22  Res = readFile("
272a0 74 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74  testcase-out.txt
272b0 22 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20  ", 0))==0 ){.   
272c0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
272d0 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61  derr, "Error: ca
272e0 6e 6e 6f 74 20 72 65 61 64 20 27 74 65 73 74 63  nnot read 'testc
272f0 61 73 65 2d 6f 75 74 2e 74 78 74 27 5c 6e 22 29  ase-out.txt'\n")
27300 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 32 3b 0a  ;.      rc = 2;.
27310 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 74 65      }else if( te
27320 73 74 63 61 73 65 5f 67 6c 6f 62 28 61 7a 41 72  stcase_glob(azAr
27330 67 5b 31 5d 2c 7a 52 65 73 29 3d 3d 30 20 29 7b  g[1],zRes)==0 ){
27340 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
27350 74 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20  tf(stderr,.     
27360 20 20 20 20 20 20 20 20 20 20 20 20 22 74 65 73              "tes
27370 74 63 61 73 65 2d 25 73 20 46 41 49 4c 45 44 5c  tcase-%s FAILED\
27380 6e 20 45 78 70 65 63 74 65 64 3a 20 5b 25 73 5d  n Expected: [%s]
27390 5c 6e 20 20 20 20 20 20 47 6f 74 3a 20 5b 25 73  \n      Got: [%s
273a0 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  ]\n",.          
273b0 20 20 20 20 20 20 20 70 2d 3e 7a 54 65 73 74 63         p->zTestc
273c0 61 73 65 2c 20 61 7a 41 72 67 5b 31 5d 2c 20 7a  ase, azArg[1], z
273d0 52 65 73 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  Res);.      rc =
273e0 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
273f0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
27400 28 73 74 64 6f 75 74 2c 20 22 74 65 73 74 63 61  (stdout, "testca
27410 73 65 2d 25 73 20 6f 6b 5c 6e 22 2c 20 70 2d 3e  se-%s ok\n", p->
27420 7a 54 65 73 74 63 61 73 65 29 3b 0a 20 20 20 20  zTestcase);.    
27430 20 20 70 2d 3e 6e 43 68 65 63 6b 2b 2b 3b 0a 20    p->nCheck++;. 
27440 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
27450 5f 66 72 65 65 28 7a 52 65 73 29 3b 0a 20 20 7d  _free(zRes);.  }
27460 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
27470 63 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  c' && strncmp(az
27480 41 72 67 5b 30 5d 2c 20 22 63 6c 6f 6e 65 22 2c  Arg[0], "clone",
27490 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   n)==0 ){.    if
274a0 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20  ( nArg==2 ){.   
274b0 20 20 20 74 72 79 54 6f 43 6c 6f 6e 65 28 70 2c     tryToClone(p,
274c0 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20   azArg[1]);.    
274d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
274e0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
274f0 22 55 73 61 67 65 3a 20 2e 63 6c 6f 6e 65 20 46  "Usage: .clone F
27500 49 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20 20  ILENAME\n");.   
27510 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
27520 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
27530 63 3d 3d 27 64 27 20 26 26 20 6e 3e 31 20 26 26  c=='d' && n>1 &&
27540 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
27550 5d 2c 20 22 64 61 74 61 62 61 73 65 73 22 2c 20  ], "databases", 
27560 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65  n)==0 ){.    She
27570 6c 6c 53 74 61 74 65 20 64 61 74 61 3b 0a 20 20  llState data;.  
27580 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
27590 3d 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62  = 0;.    open_db
275a0 28 70 2c 20 30 29 3b 0a 20 20 20 20 6d 65 6d 63  (p, 0);.    memc
275b0 70 79 28 26 64 61 74 61 2c 20 70 2c 20 73 69 7a  py(&data, p, siz
275c0 65 6f 66 28 64 61 74 61 29 29 3b 0a 20 20 20 20  eof(data));.    
275d0 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65 72 20  data.showHeader 
275e0 3d 20 30 3b 0a 20 20 20 20 64 61 74 61 2e 63 4d  = 0;.    data.cM
275f0 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20  ode = data.mode 
27600 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20  = MODE_List;.   
27610 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
27620 66 28 73 69 7a 65 6f 66 28 64 61 74 61 2e 63 6f  f(sizeof(data.co
27630 6c 53 65 70 61 72 61 74 6f 72 29 2c 64 61 74 61  lSeparator),data
27640 2e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 22 3a  .colSeparator,":
27650 20 22 29 3b 0a 20 20 20 20 64 61 74 61 2e 63 6e   ");.    data.cn
27660 74 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74  t = 0;.    sqlit
27670 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22  e3_exec(p->db, "
27680 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 66 69 6c  SELECT name, fil
27690 65 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 64 61  e FROM pragma_da
276a0 74 61 62 61 73 65 5f 6c 69 73 74 22 2c 0a 20 20  tabase_list",.  
276b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
276c0 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20  allback, &data, 
276d0 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69  &zErrMsg);.    i
276e0 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  f( zErrMsg ){.  
276f0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
27700 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25  stderr,"Error: %
27710 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  s\n", zErrMsg);.
27720 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
27730 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
27740 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
27750 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
27760 63 3d 3d 27 64 27 20 26 26 20 73 74 72 6e 63 6d  c=='d' && strncm
27770 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64 62 69  p(azArg[0], "dbi
27780 6e 66 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  nfo", n)==0 ){. 
27790 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f 64 62     rc = shell_db
277a0 69 6e 66 6f 5f 63 6f 6d 6d 61 6e 64 28 70 2c 20  info_command(p, 
277b0 6e 41 72 67 2c 20 61 7a 41 72 67 29 3b 0a 20 20  nArg, azArg);.  
277c0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
277d0 27 64 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'd' && strncmp(a
277e0 7a 41 72 67 5b 30 5d 2c 20 22 64 75 6d 70 22 2c  zArg[0], "dump",
277f0 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f   n)==0 ){.    co
27800 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69 6b 65 20  nst char *zLike 
27810 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  = 0;.    int i;.
27820 20 20 20 20 69 6e 74 20 73 61 76 65 64 53 68 6f      int savedSho
27830 77 48 65 61 64 65 72 20 3d 20 70 2d 3e 73 68 6f  wHeader = p->sho
27840 77 48 65 61 64 65 72 3b 0a 20 20 20 20 53 68 65  wHeader;.    She
27850 6c 6c 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 53  llClearFlag(p, S
27860 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52 6f 77  HFLG_PreserveRow
27870 69 64 7c 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65  id|SHFLG_Newline
27880 73 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b  s);.    for(i=1;
27890 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
278a0 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b 69       if( azArg[i
278b0 5d 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20  ][0]=='-' ){.   
278c0 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
278d0 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 2b 31 3b  *z = azArg[i]+1;
278e0 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 30  .        if( z[0
278f0 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20  ]=='-' ) z++;.  
27900 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
27910 28 7a 2c 22 70 72 65 73 65 72 76 65 2d 72 6f 77  (z,"preserve-row
27920 69 64 73 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64  ids")==0 ){.#ifd
27930 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
27940 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
27950 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
27960 28 73 74 64 65 72 72 2c 20 22 54 68 65 20 2d 2d  (stderr, "The --
27970 70 72 65 73 65 72 76 65 2d 72 6f 77 69 64 73 20  preserve-rowids 
27980 6f 70 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f  option is not co
27990 6d 70 61 74 69 62 6c 65 22 0a 20 20 20 20 20 20  mpatible".      
279a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279b0 20 20 20 20 20 20 20 22 20 77 69 74 68 20 53 51         " with SQ
279c0 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41  LITE_OMIT_VIRTUA
279d0 4c 54 41 42 4c 45 5c 6e 22 29 3b 0a 20 20 20 20  LTABLE\n");.    
279e0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
279f0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74          goto met
27a00 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
27a10 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20  #else.          
27a20 53 68 65 6c 6c 53 65 74 46 6c 61 67 28 70 2c 20  ShellSetFlag(p, 
27a30 53 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52 6f  SHFLG_PreserveRo
27a40 77 69 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20  wid);.#endif.   
27a50 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20       }else.     
27a60 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c     if( strcmp(z,
27a70 22 6e 65 77 6c 69 6e 65 73 22 29 3d 3d 30 20 29  "newlines")==0 )
27a80 7b 0a 20 20 20 20 20 20 20 20 20 20 53 68 65 6c  {.          Shel
27a90 6c 53 65 74 46 6c 61 67 28 70 2c 20 53 48 46 4c  lSetFlag(p, SHFL
27aa0 47 5f 4e 65 77 6c 69 6e 65 73 29 3b 0a 20 20 20  G_Newlines);.   
27ab0 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20       }else.     
27ac0 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72     {.          r
27ad0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
27ae0 2c 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f  , "Unknown optio
27af0 6e 20 5c 22 25 73 5c 22 20 6f 6e 20 5c 22 2e 64  n \"%s\" on \".d
27b00 75 6d 70 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b  ump\"\n", azArg[
27b10 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  i]);.          r
27b20 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
27b30 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
27b40 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20  nd_exit;.       
27b50 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69   }.      }else i
27b60 66 28 20 7a 4c 69 6b 65 20 29 7b 0a 20 20 20 20  f( zLike ){.    
27b70 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
27b80 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
27b90 64 75 6d 70 20 3f 2d 2d 70 72 65 73 65 72 76 65  dump ?--preserve
27ba0 2d 72 6f 77 69 64 73 3f 20 22 0a 20 20 20 20 20  -rowids? ".     
27bb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27bc0 20 20 20 20 20 20 22 3f 2d 2d 6e 65 77 6c 69 6e        "?--newlin
27bd0 65 73 3f 20 3f 4c 49 4b 45 2d 50 41 54 54 45 52  es? ?LIKE-PATTER
27be0 4e 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  N?\n");.        
27bf0 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
27c00 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
27c10 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 65  d_exit;.      }e
27c20 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69  lse{.        zLi
27c30 6b 65 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20  ke = azArg[i];. 
27c40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
27c50 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
27c60 20 20 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79      /* When play
27c70 69 6e 67 20 62 61 63 6b 20 61 20 22 64 75 6d 70  ing back a "dump
27c80 22 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6d  ", the content m
27c90 69 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 61  ight appear in a
27ca0 6e 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 77  n order.    ** w
27cb0 68 69 63 68 20 63 61 75 73 65 73 20 69 6d 6d 65  hich causes imme
27cc0 64 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65  diate foreign ke
27cd0 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f  y constraints to
27ce0 20 62 65 20 76 69 6f 6c 61 74 65 64 2e 0a 20 20   be violated..  
27cf0 20 20 2a 2a 20 53 6f 20 64 69 73 61 62 6c 65 20    ** So disable 
27d00 66 6f 72 65 69 67 6e 2d 6b 65 79 20 63 6f 6e 73  foreign-key cons
27d10 74 72 61 69 6e 74 20 65 6e 66 6f 72 63 65 6d 65  traint enforceme
27d20 6e 74 20 74 6f 20 70 72 65 76 65 6e 74 20 70 72  nt to prevent pr
27d30 6f 62 6c 65 6d 73 2e 20 2a 2f 0a 20 20 20 20 72  oblems. */.    r
27d40 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
27d50 2c 20 22 50 52 41 47 4d 41 20 66 6f 72 65 69 67  , "PRAGMA foreig
27d60 6e 5f 6b 65 79 73 3d 4f 46 46 3b 5c 6e 22 29 3b  n_keys=OFF;\n");
27d70 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
27d80 70 2d 3e 6f 75 74 2c 20 22 42 45 47 49 4e 20 54  p->out, "BEGIN T
27d90 52 41 4e 53 41 43 54 49 4f 4e 3b 5c 6e 22 29 3b  RANSACTION;\n");
27da0 0a 20 20 20 20 70 2d 3e 77 72 69 74 61 62 6c 65  .    p->writable
27db0 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20  Schema = 0;.    
27dc0 70 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20  p->showHeader = 
27dd0 30 3b 0a 20 20 20 20 2f 2a 20 53 65 74 20 77 72  0;.    /* Set wr
27de0 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e  itable_schema=ON
27df0 20 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20   since doing so 
27e00 66 6f 72 63 65 73 20 53 51 4c 69 74 65 20 74 6f  forces SQLite to
27e10 20 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 20 20   initialize.    
27e20 2a 2a 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68  ** as much of th
27e30 65 20 73 63 68 65 6d 61 20 61 73 20 69 74 20 63  e schema as it c
27e40 61 6e 20 65 76 65 6e 20 69 66 20 74 68 65 20 73  an even if the s
27e50 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62  qlite_master tab
27e60 6c 65 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 72  le is.    ** cor
27e70 72 75 70 74 2e 20 2a 2f 0a 20 20 20 20 73 71 6c  rupt. */.    sql
27e80 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
27e90 20 22 53 41 56 45 50 4f 49 4e 54 20 64 75 6d 70   "SAVEPOINT dump
27ea0 3b 20 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c  ; PRAGMA writabl
27eb0 65 5f 73 63 68 65 6d 61 3d 4f 4e 22 2c 20 30 2c  e_schema=ON", 0,
27ec0 20 30 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 6e   0, 0);.    p->n
27ed0 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Err = 0;.    if(
27ee0 20 7a 4c 69 6b 65 3d 3d 30 20 29 7b 0a 20 20 20   zLike==0 ){.   
27ef0 20 20 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75     run_schema_du
27f00 6d 70 5f 71 75 65 72 79 28 70 2c 0a 20 20 20 20  mp_query(p,.    
27f10 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65      "SELECT name
27f20 2c 20 74 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d  , type, sql FROM
27f30 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22   sqlite_master "
27f40 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20  .        "WHERE 
27f50 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44  sql NOT NULL AND
27f60 20 74 79 70 65 3d 3d 27 74 61 62 6c 65 27 20 41   type=='table' A
27f70 4e 44 20 6e 61 6d 65 21 3d 27 73 71 6c 69 74 65  ND name!='sqlite
27f80 5f 73 65 71 75 65 6e 63 65 27 22 0a 20 20 20 20  _sequence'".    
27f90 20 20 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 73    );.      run_s
27fa0 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79  chema_dump_query
27fb0 28 70 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c  (p,.        "SEL
27fc0 45 43 54 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20  ECT name, type, 
27fd0 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  sql FROM sqlite_
27fe0 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 20  master ".       
27ff0 20 22 57 48 45 52 45 20 6e 61 6d 65 3d 3d 27 73   "WHERE name=='s
28000 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 27 22  qlite_sequence'"
28010 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20  .      );.      
28020 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71  run_table_dump_q
28030 75 65 72 79 28 70 2c 0a 20 20 20 20 20 20 20 20  uery(p,.        
28040 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d  "SELECT sql FROM
28050 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22   sqlite_master "
28060 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20  .        "WHERE 
28070 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44  sql NOT NULL AND
28080 20 74 79 70 65 20 49 4e 20 28 27 69 6e 64 65 78   type IN ('index
28090 27 2c 27 74 72 69 67 67 65 72 27 2c 27 76 69 65  ','trigger','vie
280a0 77 27 29 22 2c 20 30 0a 20 20 20 20 20 20 29 3b  w')", 0.      );
280b0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
280c0 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20    char *zSql;.  
280d0 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
280e0 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
280f0 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65      "SELECT name
28100 2c 20 74 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d  , type, sql FROM
28110 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22   sqlite_master "
28120 0a 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20  .        "WHERE 
28130 74 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 25 51  tbl_name LIKE %Q
28140 20 41 4e 44 20 74 79 70 65 3d 3d 27 74 61 62 6c   AND type=='tabl
28150 65 27 22 0a 20 20 20 20 20 20 20 20 22 20 20 41  e'".        "  A
28160 4e 44 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22  ND sql NOT NULL"
28170 2c 20 7a 4c 69 6b 65 29 3b 0a 20 20 20 20 20 20  , zLike);.      
28180 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f  run_schema_dump_
28190 71 75 65 72 79 28 70 2c 7a 53 71 6c 29 3b 0a 20  query(p,zSql);. 
281a0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
281b0 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 7a  e(zSql);.      z
281c0 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Sql = sqlite3_mp
281d0 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22  rintf(.        "
281e0 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20  SELECT sql FROM 
281f0 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a  sqlite_master ".
28200 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20 73          "WHERE s
28210 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22 0a 20 20 20  ql NOT NULL".   
28220 20 20 20 20 20 22 20 20 41 4e 44 20 74 79 70 65       "  AND type
28230 20 49 4e 20 28 27 69 6e 64 65 78 27 2c 27 74 72   IN ('index','tr
28240 69 67 67 65 72 27 2c 27 76 69 65 77 27 29 22 0a  igger','view')".
28250 20 20 20 20 20 20 20 20 22 20 20 41 4e 44 20 74          "  AND t
28260 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 25 51 22  bl_name LIKE %Q"
28270 2c 20 7a 4c 69 6b 65 29 3b 0a 20 20 20 20 20 20  , zLike);.      
28280 72 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71  run_table_dump_q
28290 75 65 72 79 28 70 2c 20 7a 53 71 6c 2c 20 30 29  uery(p, zSql, 0)
282a0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
282b0 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20  free(zSql);.    
282c0 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 77 72 69  }.    if( p->wri
282d0 74 61 62 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20  tableSchema ){. 
282e0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
282f0 70 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20  p->out, "PRAGMA 
28300 77 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d  writable_schema=
28310 4f 46 46 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20  OFF;\n");.      
28320 70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d  p->writableSchem
28330 61 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  a = 0;.    }.   
28340 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
28350 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 77 72 69  >db, "PRAGMA wri
28360 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46  table_schema=OFF
28370 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ;", 0, 0, 0);.  
28380 20 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70    sqlite3_exec(p
28390 2d 3e 64 62 2c 20 22 52 45 4c 45 41 53 45 20 64  ->db, "RELEASE d
283a0 75 6d 70 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b  ump;", 0, 0, 0);
283b0 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
283c0 70 2d 3e 6f 75 74 2c 20 70 2d 3e 6e 45 72 72 20  p->out, p->nErr 
283d0 3f 20 22 52 4f 4c 4c 42 41 43 4b 3b 20 2d 2d 20  ? "ROLLBACK; -- 
283e0 64 75 65 20 74 6f 20 65 72 72 6f 72 73 5c 6e 22  due to errors\n"
283f0 20 3a 20 22 43 4f 4d 4d 49 54 3b 5c 6e 22 29 3b   : "COMMIT;\n");
28400 0a 20 20 20 20 70 2d 3e 73 68 6f 77 48 65 61 64  .    p->showHead
28410 65 72 20 3d 20 73 61 76 65 64 53 68 6f 77 48 65  er = savedShowHe
28420 61 64 65 72 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  ader;.  }else.. 
28430 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73   if( c=='e' && s
28440 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
28450 20 22 65 63 68 6f 22 2c 20 6e 29 3d 3d 30 20 29   "echo", n)==0 )
28460 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  {.    if( nArg==
28470 32 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4f 72  2 ){.      setOr
28480 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 53 48 46  ClearFlag(p, SHF
28490 4c 47 5f 45 63 68 6f 2c 20 61 7a 41 72 67 5b 31  LG_Echo, azArg[1
284a0 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
284b0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
284c0 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
284d0 2e 65 63 68 6f 20 6f 6e 7c 6f 66 66 5c 6e 22 29  .echo on|off\n")
284e0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
284f0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
28500 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73   if( c=='e' && s
28510 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
28520 20 22 65 71 70 22 2c 20 6e 29 3d 3d 30 20 29 7b   "eqp", n)==0 ){
28530 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32  .    if( nArg==2
28540 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74   ){.      if( st
28550 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 66  rcmp(azArg[1],"f
28560 75 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ull")==0 ){.    
28570 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50 20 3d      p->autoEQP =
28580 20 41 55 54 4f 45 51 50 5f 66 75 6c 6c 3b 0a 20   AUTOEQP_full;. 
28590 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
285a0 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  trcmp(azArg[1],"
285b0 74 72 69 67 67 65 72 22 29 3d 3d 30 20 29 7b 0a  trigger")==0 ){.
285c0 20 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45          p->autoE
285d0 51 50 20 3d 20 41 55 54 4f 45 51 50 5f 74 72 69  QP = AUTOEQP_tri
285e0 67 67 65 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73  gger;.      }els
285f0 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 75  e{.        p->au
28600 74 6f 45 51 50 20 3d 20 62 6f 6f 6c 65 61 6e 56  toEQP = booleanV
28610 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a  alue(azArg[1]);.
28620 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
28630 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
28640 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
28650 67 65 3a 20 2e 65 71 70 20 6f 66 66 7c 6f 6e 7c  ge: .eqp off|on|
28660 74 72 69 67 67 65 72 7c 66 75 6c 6c 5c 6e 22 29  trigger|full\n")
28670 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
28680 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
28690 20 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73   if( c=='e' && s
286a0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
286b0 20 22 65 78 69 74 22 2c 20 6e 29 3d 3d 30 20 29   "exit", n)==0 )
286c0 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 31  {.    if( nArg>1
286d0 20 26 26 20 28 72 63 20 3d 20 28 69 6e 74 29 69   && (rc = (int)i
286e0 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72  ntegerValue(azAr
286f0 67 5b 31 5d 29 29 21 3d 30 20 29 20 65 78 69 74  g[1]))!=0 ) exit
28700 28 72 63 29 3b 0a 20 20 20 20 72 63 20 3d 20 32  (rc);.    rc = 2
28710 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20  ;.  }else..  /* 
28720 54 68 65 20 22 2e 65 78 70 6c 61 69 6e 22 20 63  The ".explain" c
28730 6f 6d 6d 61 6e 64 20 69 73 20 61 75 74 6f 6d 61  ommand is automa
28740 74 69 63 20 6e 6f 77 2e 20 20 49 74 20 69 73 20  tic now.  It is 
28750 6c 61 72 67 65 6c 79 20 70 6f 69 6e 74 6c 65 73  largely pointles
28760 73 2e 20 20 49 74 0a 20 20 2a 2a 20 72 65 74 61  s.  It.  ** reta
28770 69 6e 65 64 20 70 75 72 65 6c 79 20 66 6f 72 20  ined purely for 
28780 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
28790 69 62 69 6c 69 74 79 20 2a 2f 0a 20 20 69 66 28  ibility */.  if(
287a0 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63   c=='e' && strnc
287b0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78  mp(azArg[0], "ex
287c0 70 6c 61 69 6e 22 2c 20 6e 29 3d 3d 30 20 29 7b  plain", n)==0 ){
287d0 0a 20 20 20 20 69 6e 74 20 76 61 6c 20 3d 20 31  .    int val = 1
287e0 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 3d  ;.    if( nArg>=
287f0 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  2 ){.      if( s
28800 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  trcmp(azArg[1],"
28810 61 75 74 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20  auto")==0 ){.   
28820 20 20 20 20 20 76 61 6c 20 3d 20 39 39 3b 0a 20       val = 99;. 
28830 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
28840 20 20 20 20 76 61 6c 20 3d 20 20 62 6f 6f 6c 65      val =  boole
28850 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d  anValue(azArg[1]
28860 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
28870 0a 20 20 20 20 69 66 28 20 76 61 6c 3d 3d 31 20  .    if( val==1 
28880 26 26 20 70 2d 3e 6d 6f 64 65 21 3d 4d 4f 44 45  && p->mode!=MODE
28890 5f 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20  _Explain ){.    
288a0 20 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 20    p->normalMode 
288b0 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20  = p->mode;.     
288c0 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
288d0 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 70  Explain;.      p
288e0 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20 3d 20  ->autoExplain = 
288f0 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  0;.    }else if(
28900 20 76 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20   val==0 ){.     
28910 20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f   if( p->mode==MO
28920 44 45 5f 45 78 70 6c 61 69 6e 20 29 20 70 2d 3e  DE_Explain ) p->
28930 6d 6f 64 65 20 3d 20 70 2d 3e 6e 6f 72 6d 61 6c  mode = p->normal
28940 4d 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e 61  Mode;.      p->a
28950 75 74 6f 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a  utoExplain = 0;.
28960 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 76 61      }else if( va
28970 6c 3d 3d 39 39 20 29 7b 0a 20 20 20 20 20 20 69  l==99 ){.      i
28980 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45  f( p->mode==MODE
28990 5f 45 78 70 6c 61 69 6e 20 29 20 70 2d 3e 6d 6f  _Explain ) p->mo
289a0 64 65 20 3d 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f  de = p->normalMo
289b0 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74  de;.      p->aut
289c0 6f 45 78 70 6c 61 69 6e 20 3d 20 31 3b 0a 20 20  oExplain = 1;.  
289d0 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
289e0 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72  f( c=='e' && str
289f0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
28a00 65 78 70 65 72 74 22 2c 20 6e 29 3d 3d 30 20 29  expert", n)==0 )
28a10 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  {.    open_db(p,
28a20 20 30 29 3b 0a 20 20 20 20 65 78 70 65 72 74 44   0);.    expertD
28a30 6f 74 43 6f 6d 6d 61 6e 64 28 70 2c 20 61 7a 41  otCommand(p, azA
28a40 72 67 2c 20 6e 41 72 67 29 3b 0a 20 20 7d 65 6c  rg, nArg);.  }el
28a50 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 66 27  se..  if( c=='f'
28a60 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
28a70 67 5b 30 5d 2c 20 22 66 75 6c 6c 73 63 68 65 6d  g[0], "fullschem
28a80 61 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  a", n)==0 ){.   
28a90 20 53 68 65 6c 6c 53 74 61 74 65 20 64 61 74 61   ShellState data
28aa0 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72  ;.    char *zErr
28ab0 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  Msg = 0;.    int
28ac0 20 64 6f 53 74 61 74 73 20 3d 20 30 3b 0a 20 20   doStats = 0;.  
28ad0 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 2c 20    memcpy(&data, 
28ae0 70 2c 20 73 69 7a 65 6f 66 28 64 61 74 61 29 29  p, sizeof(data))
28af0 3b 0a 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48  ;.    data.showH
28b00 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 64  eader = 0;.    d
28b10 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61  ata.cMode = data
28b20 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 53 65 6d  .mode = MODE_Sem
28b30 69 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  i;.    if( nArg=
28b40 3d 32 20 26 26 20 6f 70 74 69 6f 6e 4d 61 74 63  =2 && optionMatc
28b50 68 28 61 7a 41 72 67 5b 31 5d 2c 20 22 69 6e 64  h(azArg[1], "ind
28b60 65 6e 74 22 29 20 29 7b 0a 20 20 20 20 20 20 64  ent") ){.      d
28b70 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61  ata.cMode = data
28b80 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 50 72 65  .mode = MODE_Pre
28b90 74 74 79 3b 0a 20 20 20 20 20 20 6e 41 72 67 20  tty;.      nArg 
28ba0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  = 1;.    }.    i
28bb0 66 28 20 6e 41 72 67 21 3d 31 20 29 7b 0a 20 20  f( nArg!=1 ){.  
28bc0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
28bd0 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
28be0 66 75 6c 6c 73 63 68 65 6d 61 20 3f 2d 2d 69 6e  fullschema ?--in
28bf0 64 65 6e 74 3f 5c 6e 22 29 3b 0a 20 20 20 20 20  dent?\n");.     
28c00 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67   rc = 1;.      g
28c10 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
28c20 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
28c30 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
28c40 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
28c50 5f 65 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20  _exec(p->db,.   
28c60 20 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20      "SELECT sql 
28c70 46 52 4f 4d 22 0a 20 20 20 20 20 20 20 22 20 20  FROM".       "  
28c80 28 53 45 4c 45 43 54 20 73 71 6c 20 73 71 6c 2c  (SELECT sql sql,
28c90 20 74 79 70 65 20 74 79 70 65 2c 20 74 62 6c 5f   type type, tbl_
28ca0 6e 61 6d 65 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e  name tbl_name, n
28cb0 61 6d 65 20 6e 61 6d 65 2c 20 72 6f 77 69 64 20  ame name, rowid 
28cc0 78 22 0a 20 20 20 20 20 20 20 22 20 20 20 20 20  x".       "     
28cd0 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
28ce0 65 72 20 55 4e 49 4f 4e 20 41 4c 4c 22 0a 20 20  er UNION ALL".  
28cf0 20 20 20 20 20 22 20 20 20 53 45 4c 45 43 54 20       "   SELECT 
28d00 73 71 6c 2c 20 74 79 70 65 2c 20 74 62 6c 5f 6e  sql, type, tbl_n
28d10 61 6d 65 2c 20 6e 61 6d 65 2c 20 72 6f 77 69 64  ame, name, rowid
28d20 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d   FROM sqlite_tem
28d30 70 5f 6d 61 73 74 65 72 29 20 22 0a 20 20 20 20  p_master) ".    
28d40 20 20 20 22 57 48 45 52 45 20 74 79 70 65 21 3d     "WHERE type!=
28d50 27 6d 65 74 61 27 20 41 4e 44 20 73 71 6c 20 4e  'meta' AND sql N
28d60 4f 54 4e 55 4c 4c 20 41 4e 44 20 6e 61 6d 65 20  OTNULL AND name 
28d70 4e 4f 54 20 4c 49 4b 45 20 27 73 71 6c 69 74 65  NOT LIKE 'sqlite
28d80 5f 25 27 20 22 0a 20 20 20 20 20 20 20 22 4f 52  _%' ".       "OR
28d90 44 45 52 20 42 59 20 72 6f 77 69 64 22 2c 0a 20  DER BY rowid",. 
28da0 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20        callback, 
28db0 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 0a  &data, &zErrMsg.
28dc0 20 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72      );.    if( r
28dd0 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c==SQLITE_OK ){.
28de0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
28df0 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 20  mt *pStmt;.     
28e00 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72   rc = sqlite3_pr
28e10 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 0a  epare_v2(p->db,.
28e20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
28e30 53 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f  SELECT rowid FRO
28e40 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  M sqlite_master"
28e50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28e60 22 20 57 48 45 52 45 20 6e 61 6d 65 20 47 4c 4f  " WHERE name GLO
28e70 42 20 27 73 71 6c 69 74 65 5f 73 74 61 74 5b 31  B 'sqlite_stat[1
28e80 33 34 5d 27 22 2c 0a 20 20 20 20 20 20 20 20 20  34]'",.         
28e90 20 20 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74        -1, &pStmt
28ea0 2c 20 30 29 3b 0a 20 20 20 20 20 20 64 6f 53 74  , 0);.      doSt
28eb0 61 74 73 20 3d 20 73 71 6c 69 74 65 33 5f 73 74  ats = sqlite3_st
28ec0 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
28ed0 45 5f 52 4f 57 3b 0a 20 20 20 20 20 20 73 71 6c  E_ROW;.      sql
28ee0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
28ef0 74 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  tmt);.    }.    
28f00 69 66 28 20 64 6f 53 74 61 74 73 3d 3d 30 20 29  if( doStats==0 )
28f10 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
28f20 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 20 4e  tf(p->out, "/* N
28f30 6f 20 53 54 41 54 20 74 61 62 6c 65 73 20 61 76  o STAT tables av
28f40 61 69 6c 61 62 6c 65 20 2a 2f 5c 6e 22 29 3b 0a  ailable */\n");.
28f50 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28f60 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
28f70 75 74 2c 20 22 41 4e 41 4c 59 5a 45 20 73 71 6c  ut, "ANALYZE sql
28f80 69 74 65 5f 6d 61 73 74 65 72 3b 5c 6e 22 29 3b  ite_master;\n");
28f90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65  .      sqlite3_e
28fa0 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45  xec(p->db, "SELE
28fb0 43 54 20 27 41 4e 41 4c 59 5a 45 20 73 71 6c 69  CT 'ANALYZE sqli
28fc0 74 65 5f 6d 61 73 74 65 72 27 22 2c 0a 20 20 20  te_master'",.   
28fd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
28fe0 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c  callback, &data,
28ff0 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20   &zErrMsg);.    
29000 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64    data.cMode = d
29010 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f  ata.mode = MODE_
29020 49 6e 73 65 72 74 3b 0a 20 20 20 20 20 20 64 61  Insert;.      da
29030 74 61 2e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20  ta.zDestTable = 
29040 22 73 71 6c 69 74 65 5f 73 74 61 74 31 22 3b 0a  "sqlite_stat1";.
29050 20 20 20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63        shell_exec
29060 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20  (p->db, "SELECT 
29070 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74  * FROM sqlite_st
29080 61 74 31 22 2c 0a 20 20 20 20 20 20 20 20 20 20  at1",.          
29090 20 20 20 20 20 20 20 73 68 65 6c 6c 5f 63 61 6c         shell_cal
290a0 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 26 7a 45  lback, &data,&zE
290b0 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 64 61  rrMsg);.      da
290c0 74 61 2e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20  ta.zDestTable = 
290d0 22 73 71 6c 69 74 65 5f 73 74 61 74 33 22 3b 0a  "sqlite_stat3";.
290e0 20 20 20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63        shell_exec
290f0 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20  (p->db, "SELECT 
29100 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74  * FROM sqlite_st
29110 61 74 33 22 2c 0a 20 20 20 20 20 20 20 20 20 20  at3",.          
29120 20 20 20 20 20 20 20 73 68 65 6c 6c 5f 63 61 6c         shell_cal
29130 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 26 7a 45  lback, &data,&zE
29140 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 64 61  rrMsg);.      da
29150 74 61 2e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20  ta.zDestTable = 
29160 22 73 71 6c 69 74 65 5f 73 74 61 74 34 22 3b 0a  "sqlite_stat4";.
29170 20 20 20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63        shell_exec
29180 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20  (p->db, "SELECT 
29190 2a 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74  * FROM sqlite_st
291a0 61 74 34 22 2c 0a 20 20 20 20 20 20 20 20 20 20  at4",.          
291b0 20 20 20 20 20 20 20 73 68 65 6c 6c 5f 63 61 6c         shell_cal
291c0 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a  lback, &data, &z
291d0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72  ErrMsg);.      r
291e0 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
291f0 2c 20 22 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74  , "ANALYZE sqlit
29200 65 5f 6d 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20  e_master;\n");. 
29210 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
29220 69 66 28 20 63 3d 3d 27 68 27 20 26 26 20 73 74  if( c=='h' && st
29230 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
29240 22 68 65 61 64 65 72 73 22 2c 20 6e 29 3d 3d 30  "headers", n)==0
29250 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
29260 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==2 ){.      p->
29270 73 68 6f 77 48 65 61 64 65 72 20 3d 20 62 6f 6f  showHeader = boo
29280 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b  leanValue(azArg[
29290 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1]);.    }else{.
292a0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
292b0 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
292c0 20 2e 68 65 61 64 65 72 73 20 6f 6e 7c 6f 66 66   .headers on|off
292d0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
292e0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
292f0 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 68 27 20  e..  if( c=='h' 
29300 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
29310 5b 30 5d 2c 20 22 68 65 6c 70 22 2c 20 6e 29 3d  [0], "help", n)=
29320 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  =0 ){.    utf8_p
29330 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
29340 73 22 2c 20 7a 48 65 6c 70 29 3b 0a 20 20 7d 65  s", zHelp);.  }e
29350 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 69  lse..  if( c=='i
29360 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
29370 72 67 5b 30 5d 2c 20 22 69 6d 70 6f 72 74 22 2c  rg[0], "import",
29380 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68   n)==0 ){.    ch
29390 61 72 20 2a 7a 54 61 62 6c 65 3b 20 20 20 20 20  ar *zTable;     
293a0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73            /* Ins
293b0 65 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68  ert data into th
293c0 69 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  is table */.    
293d0 63 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20  char *zFile;    
293e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
293f0 61 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 65  ame of file to e
29400 78 74 72 61 20 63 6f 6e 74 65 6e 74 20 66 72 6f  xtra content fro
29410 6d 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33  m */.    sqlite3
29420 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 4e  _stmt *pStmt = N
29430 55 4c 4c 3b 20 2f 2a 20 41 20 73 74 61 74 65 6d  ULL; /* A statem
29440 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ent */.    int n
29450 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
29460 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
29470 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
29480 68 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  he table */.    
29490 69 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20  int nByte;      
294a0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
294b0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
294c0 6e 20 61 6e 20 53 51 4c 20 73 74 72 69 6e 67 20  n an SQL string 
294d0 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b  */.    int i, j;
294e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
294f0 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
29500 65 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e  ers */.    int n
29510 65 65 64 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20  eedCommit;      
29520 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
29530 6f 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c  o COMMIT or ROLL
29540 42 41 43 4b 20 61 74 20 65 6e 64 20 2a 2f 0a 20  BACK at end */. 
29550 20 20 20 69 6e 74 20 6e 53 65 70 3b 20 20 20 20     int nSep;    
29560 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
29570 2a 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65  * Number of byte
29580 73 20 69 6e 20 70 2d 3e 63 6f 6c 53 65 70 61 72  s in p->colSepar
29590 61 74 6f 72 5b 5d 20 2a 2f 0a 20 20 20 20 63 68  ator[] */.    ch
295a0 61 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20  ar *zSql;       
295b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20            /* An 
295c0 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  SQL statement */
295d0 0a 20 20 20 20 49 6d 70 6f 72 74 43 74 78 20 73  .    ImportCtx s
295e0 43 74 78 3b 20 20 20 20 20 20 20 20 20 20 20 20  Ctx;            
295f0 20 2f 2a 20 52 65 61 64 65 72 20 63 6f 6e 74 65   /* Reader conte
29600 78 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  xt */.    char *
29610 28 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 2a 78  (SQLITE_CDECL *x
29620 52 65 61 64 29 28 49 6d 70 6f 72 74 43 74 78 2a  Read)(ImportCtx*
29630 29 3b 20 2f 2a 20 46 75 6e 63 20 74 6f 20 72 65  ); /* Func to re
29640 61 64 20 6f 6e 65 20 76 61 6c 75 65 20 2a 2f 0a  ad one value */.
29650 20 20 20 20 69 6e 74 20 28 53 51 4c 49 54 45 5f      int (SQLITE_
29660 43 44 45 43 4c 20 2a 78 43 6c 6f 73 65 72 29 28  CDECL *xCloser)(
29670 46 49 4c 45 2a 29 3b 20 20 20 20 20 20 2f 2a 20  FILE*);      /* 
29680 46 75 6e 63 20 74 6f 20 63 6c 6f 73 65 20 66 69  Func to close fi
29690 6c 65 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 6e  le */..    if( n
296a0 41 72 67 21 3d 33 20 29 7b 0a 20 20 20 20 20 20  Arg!=3 ){.      
296b0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
296c0 72 2c 20 22 55 73 61 67 65 3a 20 2e 69 6d 70 6f  r, "Usage: .impo
296d0 72 74 20 46 49 4c 45 20 54 41 42 4c 45 5c 6e 22  rt FILE TABLE\n"
296e0 29 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  );.      goto me
296f0 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
29700 0a 20 20 20 20 7d 0a 20 20 20 20 7a 46 69 6c 65  .    }.    zFile
29710 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20   = azArg[1];.   
29720 20 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72 67 5b   zTable = azArg[
29730 32 5d 3b 0a 20 20 20 20 73 65 65 6e 49 6e 74 65  2];.    seenInte
29740 72 72 75 70 74 20 3d 20 30 3b 0a 20 20 20 20 6d  rrupt = 0;.    m
29750 65 6d 73 65 74 28 26 73 43 74 78 2c 20 30 2c 20  emset(&sCtx, 0, 
29760 73 69 7a 65 6f 66 28 73 43 74 78 29 29 3b 0a 20  sizeof(sCtx));. 
29770 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
29780 3b 0a 20 20 20 20 6e 53 65 70 20 3d 20 73 74 72  ;.    nSep = str
29790 6c 65 6e 33 30 28 70 2d 3e 63 6f 6c 53 65 70 61  len30(p->colSepa
297a0 72 61 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20  rator);.    if( 
297b0 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  nSep==0 ){.     
297c0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
297d0 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  rr,.            
297e0 20 20 20 20 20 22 45 72 72 6f 72 3a 20 6e 6f 6e       "Error: non
297f0 2d 6e 75 6c 6c 20 63 6f 6c 75 6d 6e 20 73 65 70  -null column sep
29800 61 72 61 74 6f 72 20 72 65 71 75 69 72 65 64 20  arator required 
29810 66 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a  for import\n");.
29820 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
29830 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 53      }.    if( nS
29840 65 70 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 61  ep>1 ){.      ra
29850 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
29860 20 22 45 72 72 6f 72 3a 20 6d 75 6c 74 69 2d 63   "Error: multi-c
29870 68 61 72 61 63 74 65 72 20 63 6f 6c 75 6d 6e 20  haracter column 
29880 73 65 70 61 72 61 74 6f 72 73 20 6e 6f 74 20 61  separators not a
29890 6c 6c 6f 77 65 64 22 0a 20 20 20 20 20 20 20 20  llowed".        
298a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
298b0 66 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a  for import\n");.
298c0 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
298d0 20 20 20 20 7d 0a 20 20 20 20 6e 53 65 70 20 3d      }.    nSep =
298e0 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 72 6f 77   strlen30(p->row
298f0 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
29900 69 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a 20  if( nSep==0 ){. 
29910 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
29920 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
29930 6e 6f 6e 2d 6e 75 6c 6c 20 72 6f 77 20 73 65 70  non-null row sep
29940 61 72 61 74 6f 72 20 72 65 71 75 69 72 65 64 20  arator required 
29950 66 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a  for import\n");.
29960 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
29970 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 53      }.    if( nS
29980 65 70 3d 3d 32 20 26 26 20 70 2d 3e 6d 6f 64 65  ep==2 && p->mode
29990 3d 3d 4d 4f 44 45 5f 43 73 76 20 26 26 20 73 74  ==MODE_Csv && st
299a0 72 63 6d 70 28 70 2d 3e 72 6f 77 53 65 70 61 72  rcmp(p->rowSepar
299b0 61 74 6f 72 2c 20 53 45 50 5f 43 72 4c 66 29 3d  ator, SEP_CrLf)=
299c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57  =0 ){.      /* W
299d0 68 65 6e 20 69 6d 70 6f 72 74 69 6e 67 20 43 53  hen importing CS
299e0 56 20 28 6f 6e 6c 79 29 2c 20 69 66 20 74 68 65  V (only), if the
299f0 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 20 69   row separator i
29a00 73 20 73 65 74 20 74 6f 20 74 68 65 0a 20 20 20  s set to the.   
29a10 20 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 6f 75     ** default ou
29a20 74 70 75 74 20 72 6f 77 20 73 65 70 61 72 61 74  tput row separat
29a30 6f 72 2c 20 63 68 61 6e 67 65 20 69 74 20 74 6f  or, change it to
29a40 20 74 68 65 20 64 65 66 61 75 6c 74 20 69 6e 70   the default inp
29a50 75 74 0a 20 20 20 20 20 20 2a 2a 20 72 6f 77 20  ut.      ** row 
29a60 73 65 70 61 72 61 74 6f 72 2e 20 20 54 68 69 73  separator.  This
29a70 20 61 76 6f 69 64 73 20 68 61 76 69 6e 67 20 74   avoids having t
29a80 6f 20 6d 61 69 6e 74 61 69 6e 20 64 69 66 66 65  o maintain diffe
29a90 72 65 6e 74 20 69 6e 70 75 74 0a 20 20 20 20 20  rent input.     
29aa0 20 2a 2a 20 61 6e 64 20 6f 75 74 70 75 74 20 72   ** and output r
29ab0 6f 77 20 73 65 70 61 72 61 74 6f 72 73 2e 20 2a  ow separators. *
29ac0 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  /.      sqlite3_
29ad0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
29ae0 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
29af0 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
29b00 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20  r, SEP_Row);.   
29b10 20 20 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e     nSep = strlen
29b20 33 30 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  30(p->rowSeparat
29b30 6f 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  or);.    }.    i
29b40 66 28 20 6e 53 65 70 3e 31 20 29 7b 0a 20 20 20  f( nSep>1 ){.   
29b50 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
29b60 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6d 75  derr, "Error: mu
29b70 6c 74 69 2d 63 68 61 72 61 63 74 65 72 20 72 6f  lti-character ro
29b80 77 20 73 65 70 61 72 61 74 6f 72 73 20 6e 6f 74  w separators not
29b90 20 61 6c 6c 6f 77 65 64 22 0a 20 20 20 20 20 20   allowed".      
29ba0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29bb0 22 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29  " for import\n")
29bc0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
29bd0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 43 74 78  ;.    }.    sCtx
29be0 2e 7a 46 69 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a  .zFile = zFile;.
29bf0 20 20 20 20 73 43 74 78 2e 6e 4c 69 6e 65 20 3d      sCtx.nLine =
29c00 20 31 3b 0a 20 20 20 20 69 66 28 20 73 43 74 78   1;.    if( sCtx
29c10 2e 7a 46 69 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29  .zFile[0]=='|' )
29c20 7b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  {.#ifdef SQLITE_
29c30 4f 4d 49 54 5f 50 4f 50 45 4e 0a 20 20 20 20 20  OMIT_POPEN.     
29c40 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
29c50 72 72 2c 20 22 45 72 72 6f 72 3a 20 70 69 70 65  rr, "Error: pipe
29c60 73 20 61 72 65 20 6e 6f 74 20 73 75 70 70 6f 72  s are not suppor
29c70 74 65 64 20 69 6e 20 74 68 69 73 20 4f 53 5c 6e  ted in this OS\n
29c80 22 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ");.      return
29c90 20 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20   1;.#else.      
29ca0 73 43 74 78 2e 69 6e 20 3d 20 70 6f 70 65 6e 28  sCtx.in = popen(
29cb0 73 43 74 78 2e 7a 46 69 6c 65 2b 31 2c 20 22 72  sCtx.zFile+1, "r
29cc0 22 29 3b 0a 20 20 20 20 20 20 73 43 74 78 2e 7a  ");.      sCtx.z
29cd0 46 69 6c 65 20 3d 20 22 3c 70 69 70 65 3e 22 3b  File = "<pipe>";
29ce0 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72 20 3d  .      xCloser =
29cf0 20 70 63 6c 6f 73 65 3b 0a 23 65 6e 64 69 66 0a   pclose;.#endif.
29d00 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29d10 20 73 43 74 78 2e 69 6e 20 3d 20 66 6f 70 65 6e   sCtx.in = fopen
29d20 28 73 43 74 78 2e 7a 46 69 6c 65 2c 20 22 72 62  (sCtx.zFile, "rb
29d30 22 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65  ");.      xClose
29d40 72 20 3d 20 66 63 6c 6f 73 65 3b 0a 20 20 20 20  r = fclose;.    
29d50 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 6f 64  }.    if( p->mod
29d60 65 3d 3d 4d 4f 44 45 5f 41 73 63 69 69 20 29 7b  e==MODE_Ascii ){
29d70 0a 20 20 20 20 20 20 78 52 65 61 64 20 3d 20 61  .      xRead = a
29d80 73 63 69 69 5f 72 65 61 64 5f 6f 6e 65 5f 66 69  scii_read_one_fi
29d90 65 6c 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  eld;.    }else{.
29da0 20 20 20 20 20 20 78 52 65 61 64 20 3d 20 63 73        xRead = cs
29db0 76 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64  v_read_one_field
29dc0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
29dd0 73 43 74 78 2e 69 6e 3d 3d 30 20 29 7b 0a 20 20  sCtx.in==0 ){.  
29de0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
29df0 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
29e00 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73  cannot open \"%s
29e10 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20  \"\n", zFile);. 
29e20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
29e30 20 20 20 7d 0a 20 20 20 20 73 43 74 78 2e 63 43     }.    sCtx.cC
29e40 6f 6c 53 65 70 20 3d 20 70 2d 3e 63 6f 6c 53 65  olSep = p->colSe
29e50 70 61 72 61 74 6f 72 5b 30 5d 3b 0a 20 20 20 20  parator[0];.    
29e60 73 43 74 78 2e 63 52 6f 77 53 65 70 20 3d 20 70  sCtx.cRowSep = p
29e70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 5b 30  ->rowSeparator[0
29e80 5d 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  ];.    zSql = sq
29e90 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53  lite3_mprintf("S
29ea0 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 25 73 22  ELECT * FROM %s"
29eb0 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69  , zTable);.    i
29ec0 66 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20  f( zSql==0 ){.  
29ed0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
29ee0 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6f  tderr, "Error: o
29ef0 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29  ut of memory\n")
29f00 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28  ;.      xCloser(
29f10 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20  sCtx.in);.      
29f20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
29f30 20 20 20 20 6e 42 79 74 65 20 3d 20 73 74 72 6c      nByte = strl
29f40 65 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20  en30(zSql);.    
29f50 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
29f60 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a  pare_v2(p->db, z
29f70 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
29f80 20 30 29 3b 0a 20 20 20 20 69 6d 70 6f 72 74 5f   0);.    import_
29f90 61 70 70 65 6e 64 5f 63 68 61 72 28 26 73 43 74  append_char(&sCt
29fa0 78 2c 20 30 29 3b 20 20 20 20 2f 2a 20 54 6f 20  x, 0);    /* To 
29fb0 65 6e 73 75 72 65 20 73 43 74 78 2e 7a 20 69 73  ensure sCtx.z is
29fc0 20 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20   allocated */.  
29fd0 20 20 69 66 28 20 72 63 20 26 26 20 73 71 6c 69    if( rc && sqli
29fe0 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 6e 6f 20  te3_strglob("no 
29ff0 73 75 63 68 20 74 61 62 6c 65 3a 20 2a 22 2c 20  such table: *", 
2a000 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
2a010 2d 3e 64 62 29 29 3d 3d 30 20 29 7b 0a 20 20 20  ->db))==0 ){.   
2a020 20 20 20 63 68 61 72 20 2a 7a 43 72 65 61 74 65     char *zCreate
2a030 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2a040 74 66 28 22 43 52 45 41 54 45 20 54 41 42 4c 45  tf("CREATE TABLE
2a050 20 25 73 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20   %s", zTable);. 
2a060 20 20 20 20 20 63 68 61 72 20 63 53 65 70 20 3d       char cSep =
2a070 20 27 28 27 3b 0a 20 20 20 20 20 20 77 68 69 6c   '(';.      whil
2a080 65 28 20 78 52 65 61 64 28 26 73 43 74 78 29 20  e( xRead(&sCtx) 
2a090 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 72 65 61  ){.        zCrea
2a0a0 74 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  te = sqlite3_mpr
2a0b0 69 6e 74 66 28 22 25 7a 25 63 5c 6e 20 20 5c 22  intf("%z%c\n  \"
2a0c0 25 77 5c 22 20 54 45 58 54 22 2c 20 7a 43 72 65  %w\" TEXT", zCre
2a0d0 61 74 65 2c 20 63 53 65 70 2c 20 73 43 74 78 2e  ate, cSep, sCtx.
2a0e0 7a 29 3b 0a 20 20 20 20 20 20 20 20 63 53 65 70  z);.        cSep
2a0f0 20 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20 20   = ',';.        
2a100 69 66 28 20 73 43 74 78 2e 63 54 65 72 6d 21 3d  if( sCtx.cTerm!=
2a110 73 43 74 78 2e 63 43 6f 6c 53 65 70 20 29 20 62  sCtx.cColSep ) b
2a120 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
2a130 20 20 20 20 69 66 28 20 63 53 65 70 3d 3d 27 28      if( cSep=='(
2a140 27 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ' ){.        sql
2a150 69 74 65 33 5f 66 72 65 65 28 7a 43 72 65 61 74  ite3_free(zCreat
2a160 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
2a170 74 65 33 5f 66 72 65 65 28 73 43 74 78 2e 7a 29  te3_free(sCtx.z)
2a180 3b 0a 20 20 20 20 20 20 20 20 78 43 6c 6f 73 65  ;.        xClose
2a190 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20  r(sCtx.in);.    
2a1a0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2a1b0 73 74 64 65 72 72 2c 22 25 73 3a 20 65 6d 70 74  stderr,"%s: empt
2a1c0 79 20 66 69 6c 65 5c 6e 22 2c 20 73 43 74 78 2e  y file\n", sCtx.
2a1d0 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  zFile);.        
2a1e0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
2a1f0 7d 0a 20 20 20 20 20 20 7a 43 72 65 61 74 65 20  }.      zCreate 
2a200 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2a210 66 28 22 25 7a 5c 6e 29 22 2c 20 7a 43 72 65 61  f("%z\n)", zCrea
2a220 74 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  te);.      rc = 
2a230 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
2a240 64 62 2c 20 7a 43 72 65 61 74 65 2c 20 30 2c 20  db, zCreate, 0, 
2a250 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
2a260 69 74 65 33 5f 66 72 65 65 28 7a 43 72 65 61 74  ite3_free(zCreat
2a270 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63  e);.      if( rc
2a280 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
2a290 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2a2a0 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 73  "CREATE TABLE %s
2a2b0 28 2e 2e 2e 29 20 66 61 69 6c 65 64 3a 20 25 73  (...) failed: %s
2a2c0 5c 6e 22 2c 20 7a 54 61 62 6c 65 2c 0a 20 20 20  \n", zTable,.   
2a2d0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2a2e0 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
2a2f0 62 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  b));.        sql
2a300 69 74 65 33 5f 66 72 65 65 28 73 43 74 78 2e 7a  ite3_free(sCtx.z
2a310 29 3b 0a 20 20 20 20 20 20 20 20 78 43 6c 6f 73  );.        xClos
2a320 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20  er(sCtx.in);.   
2a330 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2a340 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20       }.      rc 
2a350 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72  = sqlite3_prepar
2a360 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c  e_v2(p->db, zSql
2a370 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
2a380 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
2a390 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a  te3_free(zSql);.
2a3a0 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
2a3b0 20 20 20 20 69 66 20 28 70 53 74 6d 74 29 20 73      if (pStmt) s
2a3c0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
2a3d0 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 75 74  pStmt);.      ut
2a3e0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2a3f0 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20  ,"Error: %s\n", 
2a400 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
2a410 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 78 43  ->db));.      xC
2a420 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a  loser(sCtx.in);.
2a430 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2a440 20 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d      }.    nCol =
2a450 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
2a460 63 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20  count(pStmt);.  
2a470 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
2a480 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 70  ze(pStmt);.    p
2a490 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 69 66  Stmt = 0;.    if
2a4a0 28 20 6e 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75  ( nCol==0 ) retu
2a4b0 72 6e 20 30 3b 20 2f 2a 20 6e 6f 20 63 6f 6c 75  rn 0; /* no colu
2a4c0 6d 6e 73 2c 20 6e 6f 20 65 72 72 6f 72 20 2a 2f  mns, no error */
2a4d0 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  .    zSql = sqli
2a4e0 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e 42  te3_malloc64( nB
2a4f0 79 74 65 2a 32 20 2b 20 32 30 20 2b 20 6e 43 6f  yte*2 + 20 + nCo
2a500 6c 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 7a  l*2 );.    if( z
2a510 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sql==0 ){.      
2a520 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2a530 72 2c 20 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f  r, "Error: out o
2a540 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20  f memory\n");.  
2a550 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78      xCloser(sCtx
2a560 2e 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75  .in);.      retu
2a570 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
2a580 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2a590 28 6e 42 79 74 65 2b 32 30 2c 20 7a 53 71 6c 2c  (nByte+20, zSql,
2a5a0 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5c 22   "INSERT INTO \"
2a5b0 25 77 5c 22 20 56 41 4c 55 45 53 28 3f 22 2c 20  %w\" VALUES(?", 
2a5c0 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 6a 20 3d  zTable);.    j =
2a5d0 20 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b   strlen30(zSql);
2a5e0 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
2a5f0 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nCol; i++){.    
2a600 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c    zSql[j++] = ',
2a610 27 3b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b  ';.      zSql[j+
2a620 2b 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a  +] = '?';.    }.
2a630 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20      zSql[j++] = 
2a640 27 29 27 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d  ')';.    zSql[j]
2a650 20 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73   = 0;.    rc = s
2a660 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
2a670 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  2(p->db, zSql, -
2a680 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
2a690 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2a6a0 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72  zSql);.    if( r
2a6b0 63 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  c ){.      utf8_
2a6c0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2a6d0 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71  Error: %s\n", sq
2a6e0 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
2a6f0 64 62 29 29 3b 0a 20 20 20 20 20 20 69 66 20 28  db));.      if (
2a700 70 53 74 6d 74 29 20 73 71 6c 69 74 65 33 5f 66  pStmt) sqlite3_f
2a710 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
2a720 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43        xCloser(sC
2a730 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20 72 65  tx.in);.      re
2a740 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
2a750 20 20 6e 65 65 64 43 6f 6d 6d 69 74 20 3d 20 73    needCommit = s
2a760 71 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63  qlite3_get_autoc
2a770 6f 6d 6d 69 74 28 70 2d 3e 64 62 29 3b 0a 20 20  ommit(p->db);.  
2a780 20 20 69 66 28 20 6e 65 65 64 43 6f 6d 6d 69 74    if( needCommit
2a790 20 29 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   ) sqlite3_exec(
2a7a0 70 2d 3e 64 62 2c 20 22 42 45 47 49 4e 22 2c 20  p->db, "BEGIN", 
2a7b0 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 64 6f  0, 0, 0);.    do
2a7c0 7b 0a 20 20 20 20 20 20 69 6e 74 20 73 74 61 72  {.      int star
2a7d0 74 4c 69 6e 65 20 3d 20 73 43 74 78 2e 6e 4c 69  tLine = sCtx.nLi
2a7e0 6e 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  ne;.      for(i=
2a7f0 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b  0; i<nCol; i++){
2a800 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
2a810 20 3d 20 78 52 65 61 64 28 26 73 43 74 78 29 3b   = xRead(&sCtx);
2a820 0a 20 20 20 20 20 20 20 20 2f 2a 0a 20 20 20 20  .        /*.    
2a830 20 20 20 20 2a 2a 20 44 69 64 20 77 65 20 72 65      ** Did we re
2a840 61 63 68 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 20  ach end-of-file 
2a850 62 65 66 6f 72 65 20 66 69 6e 64 69 6e 67 20 61  before finding a
2a860 6e 79 20 63 6f 6c 75 6d 6e 73 3f 0a 20 20 20 20  ny columns?.    
2a870 20 20 20 20 2a 2a 20 49 66 20 73 6f 2c 20 73 74      ** If so, st
2a880 6f 70 20 69 6e 73 74 65 61 64 20 6f 66 20 4e 55  op instead of NU
2a890 4c 4c 20 66 69 6c 6c 69 6e 67 20 74 68 65 20 72  LL filling the r
2a8a0 65 6d 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 73  emaining columns
2a8b0 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
2a8c0 20 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 26 26       if( z==0 &&
2a8d0 20 69 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20   i==0 ) break;. 
2a8e0 20 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20         /*.      
2a8f0 20 20 2a 2a 20 44 69 64 20 77 65 20 72 65 61 63    ** Did we reac
2a900 68 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 20 4f 52  h end-of-file OR
2a910 20 65 6e 64 2d 6f 66 2d 6c 69 6e 65 20 62 65 66   end-of-line bef
2a920 6f 72 65 20 66 69 6e 64 69 6e 67 20 61 6e 79 0a  ore finding any.
2a930 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d          ** colum
2a940 6e 73 20 69 6e 20 41 53 43 49 49 20 6d 6f 64 65  ns in ASCII mode
2a950 3f 20 20 49 66 20 73 6f 2c 20 73 74 6f 70 20 69  ?  If so, stop i
2a960 6e 73 74 65 61 64 20 6f 66 20 4e 55 4c 4c 20 66  nstead of NULL f
2a970 69 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20 20 2a  illing.        *
2a980 2a 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20  * the remaining 
2a990 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 20 20 20  columns..       
2a9a0 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20   */.        if( 
2a9b0 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 41 73  p->mode==MODE_As
2a9c0 63 69 69 20 26 26 20 28 7a 3d 3d 30 20 7c 7c 20  cii && (z==0 || 
2a9d0 7a 5b 30 5d 3d 3d 30 29 20 26 26 20 69 3d 3d 30  z[0]==0) && i==0
2a9e0 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
2a9f0 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
2aa00 65 78 74 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20  ext(pStmt, i+1, 
2aa10 7a 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52  z, -1, SQLITE_TR
2aa20 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20  ANSIENT);.      
2aa30 20 20 69 66 28 20 69 3c 6e 43 6f 6c 2d 31 20 26    if( i<nCol-1 &
2aa40 26 20 73 43 74 78 2e 63 54 65 72 6d 21 3d 73 43  & sCtx.cTerm!=sC
2aa50 74 78 2e 63 43 6f 6c 53 65 70 20 29 7b 0a 20 20  tx.cColSep ){.  
2aa60 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
2aa70 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a  ntf(stderr, "%s:
2aa80 25 64 3a 20 65 78 70 65 63 74 65 64 20 25 64 20  %d: expected %d 
2aa90 63 6f 6c 75 6d 6e 73 20 62 75 74 20 66 6f 75 6e  columns but foun
2aaa0 64 20 25 64 20 2d 20 22 0a 20 20 20 20 20 20 20  d %d - ".       
2aab0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aac0 20 20 20 22 66 69 6c 6c 69 6e 67 20 74 68 65 20     "filling the 
2aad0 72 65 73 74 20 77 69 74 68 20 4e 55 4c 4c 5c 6e  rest with NULL\n
2aae0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2aaf0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 43 74               sCt
2ab00 78 2e 7a 46 69 6c 65 2c 20 73 74 61 72 74 4c 69  x.zFile, startLi
2ab10 6e 65 2c 20 6e 43 6f 6c 2c 20 69 2b 31 29 3b 0a  ne, nCol, i+1);.
2ab20 20 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32            i += 2
2ab30 3b 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c  ;.          whil
2ab40 65 28 20 69 3c 3d 6e 43 6f 6c 20 29 7b 20 73 71  e( i<=nCol ){ sq
2ab50 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28  lite3_bind_null(
2ab60 70 53 74 6d 74 2c 20 69 29 3b 20 69 2b 2b 3b 20  pStmt, i); i++; 
2ab70 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2ab80 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 43    }.      if( sC
2ab90 74 78 2e 63 54 65 72 6d 3d 3d 73 43 74 78 2e 63  tx.cTerm==sCtx.c
2aba0 43 6f 6c 53 65 70 20 29 7b 0a 20 20 20 20 20 20  ColSep ){.      
2abb0 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20    do{.          
2abc0 78 52 65 61 64 28 26 73 43 74 78 29 3b 0a 20 20  xRead(&sCtx);.  
2abd0 20 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20          i++;.   
2abe0 20 20 20 20 20 7d 77 68 69 6c 65 28 20 73 43 74       }while( sCt
2abf0 78 2e 63 54 65 72 6d 3d 3d 73 43 74 78 2e 63 43  x.cTerm==sCtx.cC
2ac00 6f 6c 53 65 70 20 29 3b 0a 20 20 20 20 20 20 20  olSep );.       
2ac10 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2ac20 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 65 78 70  err, "%s:%d: exp
2ac30 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73  ected %d columns
2ac40 20 62 75 74 20 66 6f 75 6e 64 20 25 64 20 2d 20   but found %d - 
2ac50 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
2ac60 20 20 20 20 20 20 20 20 20 20 22 65 78 74 72 61            "extra
2ac70 73 20 69 67 6e 6f 72 65 64 5c 6e 22 2c 0a 20 20  s ignored\n",.  
2ac80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac90 20 20 20 20 20 20 73 43 74 78 2e 7a 46 69 6c 65        sCtx.zFile
2aca0 2c 20 73 74 61 72 74 4c 69 6e 65 2c 20 6e 43 6f  , startLine, nCo
2acb0 6c 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20  l, i);.      }. 
2acc0 20 20 20 20 20 69 66 28 20 69 3e 3d 6e 43 6f 6c       if( i>=nCol
2acd0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2ace0 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b  te3_step(pStmt);
2acf0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71  .        rc = sq
2ad00 6c 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d  lite3_reset(pStm
2ad10 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
2ad20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc!=SQLITE_OK ){
2ad30 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
2ad40 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2ad50 25 73 3a 25 64 3a 20 49 4e 53 45 52 54 20 66 61  %s:%d: INSERT fa
2ad60 69 6c 65 64 3a 20 25 73 5c 6e 22 2c 20 73 43 74  iled: %s\n", sCt
2ad70 78 2e 7a 46 69 6c 65 2c 0a 20 20 20 20 20 20 20  x.zFile,.       
2ad80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2ad90 74 61 72 74 4c 69 6e 65 2c 20 73 71 6c 69 74 65  tartLine, sqlite
2ada0 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29  3_errmsg(p->db))
2adb0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2adc0 20 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20    }.    }while( 
2add0 73 43 74 78 2e 63 54 65 72 6d 21 3d 45 4f 46 20  sCtx.cTerm!=EOF 
2ade0 29 3b 0a 0a 20 20 20 20 78 43 6c 6f 73 65 72 28  );..    xCloser(
2adf0 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 73 71  sCtx.in);.    sq
2ae00 6c 69 74 65 33 5f 66 72 65 65 28 73 43 74 78 2e  lite3_free(sCtx.
2ae10 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  z);.    sqlite3_
2ae20 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
2ae30 0a 20 20 20 20 69 66 28 20 6e 65 65 64 43 6f 6d  .    if( needCom
2ae40 6d 69 74 20 29 20 73 71 6c 69 74 65 33 5f 65 78  mit ) sqlite3_ex
2ae50 65 63 28 70 2d 3e 64 62 2c 20 22 43 4f 4d 4d 49  ec(p->db, "COMMI
2ae60 54 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  T", 0, 0, 0);.  
2ae70 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53  }else..#ifndef S
2ae80 51 4c 49 54 45 5f 55 4e 54 45 53 54 41 42 4c 45  QLITE_UNTESTABLE
2ae90 0a 20 20 69 66 28 20 63 3d 3d 27 69 27 20 26 26  .  if( c=='i' &&
2aea0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2aeb0 5d 2c 20 22 69 6d 70 6f 73 74 65 72 22 2c 20 6e  ], "imposter", n
2aec0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72  )==0 ){.    char
2aed0 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 63 68 61 72   *zSql;.    char
2aee0 20 2a 7a 43 6f 6c 6c 69 73 74 20 3d 20 30 3b 0a   *zCollist = 0;.
2aef0 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
2af00 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74   *pStmt;.    int
2af10 20 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 69   tnum = 0;.    i
2af20 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 6e 41  nt i;.    if( nA
2af30 72 67 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 75  rg!=3 ){.      u
2af40 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2af50 72 2c 20 22 55 73 61 67 65 3a 20 2e 69 6d 70 6f  r, "Usage: .impo
2af60 73 74 65 72 20 49 4e 44 45 58 20 49 4d 50 4f 53  ster INDEX IMPOS
2af70 54 45 52 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  TER\n");.      r
2af80 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74  c = 1;.      got
2af90 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
2afa0 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f  xit;.    }.    o
2afb0 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
2afc0 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
2afd0 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54  _mprintf("SELECT
2afe0 20 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20 73   rootpage FROM s
2aff0 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20  qlite_master".  
2b000 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b010 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45           " WHERE
2b020 20 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74   name='%q' AND t
2b030 79 70 65 3d 27 69 6e 64 65 78 27 22 2c 20 61 7a  ype='index'", az
2b040 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 73 71 6c  Arg[1]);.    sql
2b050 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
2b060 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  p->db, zSql, -1,
2b070 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
2b080 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
2b090 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  ql);.    if( sql
2b0a0 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
2b0b0 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
2b0c0 20 20 20 20 20 20 74 6e 75 6d 20 3d 20 73 71 6c        tnum = sql
2b0d0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
2b0e0 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d  pStmt, 0);.    }
2b0f0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
2b100 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
2b110 20 20 69 66 28 20 74 6e 75 6d 3d 3d 30 20 29 7b    if( tnum==0 ){
2b120 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
2b130 74 66 28 73 74 64 65 72 72 2c 20 22 6e 6f 20 73  tf(stderr, "no s
2b140 75 63 68 20 69 6e 64 65 78 3a 20 5c 22 25 73 5c  uch index: \"%s\
2b150 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  "\n", azArg[1]);
2b160 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
2b170 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
2b180 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
2b190 20 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71   }.    zSql = sq
2b1a0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50  lite3_mprintf("P
2b1b0 52 41 47 4d 41 20 69 6e 64 65 78 5f 78 69 6e 66  RAGMA index_xinf
2b1c0 6f 3d 27 25 71 27 22 2c 20 61 7a 41 72 67 5b 31  o='%q'", azArg[1
2b1d0 5d 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  ]);.    rc = sql
2b1e0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
2b1f0 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c  p->db, zSql, -1,
2b200 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20   &pStmt, 0);.   
2b210 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
2b220 71 6c 29 3b 0a 20 20 20 20 69 20 3d 20 30 3b 0a  ql);.    i = 0;.
2b230 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74      while( sqlit
2b240 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d  e3_step(pStmt)==
2b250 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20  SQLITE_ROW ){.  
2b260 20 20 20 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b      char zLabel[
2b270 32 30 5d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  20];.      const
2b280 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 28 63   char *zCol = (c
2b290 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
2b2a0 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70  e3_column_text(p
2b2b0 53 74 6d 74 2c 32 29 3b 0a 20 20 20 20 20 20 69  Stmt,2);.      i
2b2c0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 43  ++;.      if( zC
2b2d0 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ol==0 ){.       
2b2e0 20 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c   if( sqlite3_col
2b2f0 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 31 29  umn_int(pStmt,1)
2b300 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20  ==-1 ){.        
2b310 20 20 7a 43 6f 6c 20 3d 20 22 5f 52 4f 57 49 44    zCol = "_ROWID
2b320 5f 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  _";.        }els
2b330 65 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  e{.          sql
2b340 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
2b350 7a 65 6f 66 28 7a 4c 61 62 65 6c 29 2c 7a 4c 61  zeof(zLabel),zLa
2b360 62 65 6c 2c 22 65 78 70 72 25 64 22 2c 69 29 3b  bel,"expr%d",i);
2b370 0a 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 20  .          zCol 
2b380 3d 20 7a 4c 61 62 65 6c 3b 0a 20 20 20 20 20 20  = zLabel;.      
2b390 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2b3a0 20 20 69 66 28 20 7a 43 6f 6c 6c 69 73 74 3d 3d    if( zCollist==
2b3b0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  0 ){.        zCo
2b3c0 6c 6c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 5f  llist = sqlite3_
2b3d0 6d 70 72 69 6e 74 66 28 22 5c 22 25 77 5c 22 22  mprintf("\"%w\""
2b3e0 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d  , zCol);.      }
2b3f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43  else{.        zC
2b400 6f 6c 6c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  ollist = sqlite3
2b410 5f 6d 70 72 69 6e 74 66 28 22 25 7a 2c 5c 22 25  _mprintf("%z,\"%
2b420 77 5c 22 22 2c 20 7a 43 6f 6c 6c 69 73 74 2c 20  w\"", zCollist, 
2b430 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20  zCol);.      }. 
2b440 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
2b450 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
2b460 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c  ;.    zSql = sql
2b470 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
2b480 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20          "CREATE 
2b490 54 41 42 4c 45 20 5c 22 25 77 5c 22 28 25 73 2c  TABLE \"%w\"(%s,
2b4a0 50 52 49 4d 41 52 59 20 4b 45 59 28 25 73 29 29  PRIMARY KEY(%s))
2b4b0 57 49 54 48 4f 55 54 20 52 4f 57 49 44 22 2c 0a  WITHOUT ROWID",.
2b4c0 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b            azArg[
2b4d0 32 5d 2c 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 43  2], zCollist, zC
2b4e0 6f 6c 6c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c  ollist);.    sql
2b4f0 69 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c 6c 69  ite3_free(zColli
2b500 73 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  st);.    rc = sq
2b510 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
2b520 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
2b530 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e  RL_IMPOSTER, p->
2b540 64 62 2c 20 22 6d 61 69 6e 22 2c 20 31 2c 20 74  db, "main", 1, t
2b550 6e 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63  num);.    if( rc
2b560 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
2b570 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2b580 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 53  3_exec(p->db, zS
2b590 71 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  ql, 0, 0, 0);.  
2b5a0 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74      sqlite3_test
2b5b0 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f  _control(SQLITE_
2b5c0 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45  TESTCTRL_IMPOSTE
2b5d0 52 2c 20 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22  R, p->db, "main"
2b5e0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  , 0, 0);.      i
2b5f0 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
2b600 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2b610 65 72 72 2c 20 22 45 72 72 6f 72 20 69 6e 20 5b  err, "Error in [
2b620 25 73 5d 3a 20 25 73 5c 6e 22 2c 20 7a 53 71 6c  %s]: %s\n", zSql
2b630 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
2b640 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20  (p->db));.      
2b650 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75  }else{.        u
2b660 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 6f 75  tf8_printf(stdou
2b670 74 2c 20 22 25 73 3b 5c 6e 22 2c 20 7a 53 71 6c  t, "%s;\n", zSql
2b680 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  );.        raw_p
2b690 72 69 6e 74 66 28 73 74 64 6f 75 74 2c 0a 20 20  rintf(stdout,.  
2b6a0 20 20 20 20 20 20 20 20 20 22 57 41 52 4e 49 4e           "WARNIN
2b6b0 47 3a 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e  G: writing to an
2b6c0 20 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20   imposter table 
2b6d0 77 69 6c 6c 20 63 6f 72 72 75 70 74 20 74 68 65  will corrupt the
2b6e0 20 69 6e 64 65 78 21 5c 6e 22 0a 20 20 20 20 20   index!\n".     
2b6f0 20 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20     );.      }.  
2b700 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
2b710 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
2b720 2c 20 22 53 51 4c 49 54 45 5f 54 45 53 54 43 54  , "SQLITE_TESTCT
2b730 52 4c 5f 49 4d 50 4f 53 54 45 52 20 72 65 74 75  RL_IMPOSTER retu
2b740 72 6e 73 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a  rns %d\n", rc);.
2b750 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
2b760 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
2b770 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 65  free(zSql);.  }e
2b780 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  lse.#endif /* !d
2b790 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
2b7a0 49 54 5f 54 45 53 54 5f 43 4f 4e 54 52 4f 4c 29  IT_TEST_CONTROL)
2b7b0 20 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49   */..#ifdef SQLI
2b7c0 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43  TE_ENABLE_IOTRAC
2b7d0 45 0a 20 20 69 66 28 20 63 3d 3d 27 69 27 20 26  E.  if( c=='i' &
2b7e0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2b7f0 30 5d 2c 20 22 69 6f 74 72 61 63 65 22 2c 20 6e  0], "iotrace", n
2b800 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 51 4c 49  )==0 ){.    SQLI
2b810 54 45 5f 41 50 49 20 65 78 74 65 72 6e 20 76 6f  TE_API extern vo
2b820 69 64 20 28 53 51 4c 49 54 45 5f 43 44 45 43 4c  id (SQLITE_CDECL
2b830 20 2a 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65   *sqlite3IoTrace
2b840 29 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 2e  )(const char*, .
2b850 2e 2e 29 3b 0a 20 20 20 20 69 66 28 20 69 6f 74  ..);.    if( iot
2b860 72 61 63 65 20 26 26 20 69 6f 74 72 61 63 65 21  race && iotrace!
2b870 3d 73 74 64 6f 75 74 20 29 20 66 63 6c 6f 73 65  =stdout ) fclose
2b880 28 69 6f 74 72 61 63 65 29 3b 0a 20 20 20 20 69  (iotrace);.    i
2b890 6f 74 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20  otrace = 0;.    
2b8a0 69 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20  if( nArg<2 ){.  
2b8b0 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61      sqlite3IoTra
2b8c0 63 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  ce = 0;.    }els
2b8d0 65 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41  e if( strcmp(azA
2b8e0 72 67 5b 31 5d 2c 20 22 2d 22 29 3d 3d 30 20 29  rg[1], "-")==0 )
2b8f0 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49  {.      sqlite3I
2b900 6f 54 72 61 63 65 20 3d 20 69 6f 74 72 61 63 65  oTrace = iotrace
2b910 50 72 69 6e 74 66 3b 0a 20 20 20 20 20 20 69 6f  Printf;.      io
2b920 74 72 61 63 65 20 3d 20 73 74 64 6f 75 74 3b 0a  trace = stdout;.
2b930 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2b940 20 69 6f 74 72 61 63 65 20 3d 20 66 6f 70 65 6e   iotrace = fopen
2b950 28 61 7a 41 72 67 5b 31 5d 2c 20 22 77 22 29 3b  (azArg[1], "w");
2b960 0a 20 20 20 20 20 20 69 66 28 20 69 6f 74 72 61  .      if( iotra
2b970 63 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ce==0 ){.       
2b980 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2b990 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  err, "Error: can
2b9a0 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c  not open \"%s\"\
2b9b0 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  n", azArg[1]);. 
2b9c0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f         sqlite3Io
2b9d0 54 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20  Trace = 0;.     
2b9e0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
2b9f0 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2ba00 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 20 3d  sqlite3IoTrace =
2ba10 20 69 6f 74 72 61 63 65 50 72 69 6e 74 66 3b 0a   iotracePrintf;.
2ba20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2ba30 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20  }else.#endif..  
2ba40 69 66 28 20 63 3d 3d 27 6c 27 20 26 26 20 6e 3e  if( c=='l' && n>
2ba50 3d 35 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =5 && strncmp(az
2ba60 41 72 67 5b 30 5d 2c 20 22 6c 69 6d 69 74 73 22  Arg[0], "limits"
2ba70 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73  , n)==0 ){.    s
2ba80 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75  tatic const stru
2ba90 63 74 20 7b 0a 20 20 20 20 20 20 20 63 6f 6e 73  ct {.       cons
2baa0 74 20 63 68 61 72 20 2a 7a 4c 69 6d 69 74 4e 61  t char *zLimitNa
2bab0 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  me;   /* Name of
2bac0 20 61 20 6c 69 6d 69 74 20 2a 2f 0a 20 20 20 20   a limit */.    
2bad0 20 20 20 69 6e 74 20 6c 69 6d 69 74 43 6f 64 65     int limitCode
2bae0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
2baf0 49 6e 74 65 67 65 72 20 63 6f 64 65 20 66 6f 72  Integer code for
2bb00 20 74 68 61 74 20 6c 69 6d 69 74 20 2a 2f 0a 20   that limit */. 
2bb10 20 20 20 7d 20 61 4c 69 6d 69 74 5b 5d 20 3d 20     } aLimit[] = 
2bb20 7b 0a 20 20 20 20 20 20 7b 20 22 6c 65 6e 67 74  {.      { "lengt
2bb30 68 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  h",             
2bb40 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
2bb50 4c 45 4e 47 54 48 20 20 20 20 20 20 20 20 20 20  LENGTH          
2bb60 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2bb70 20 20 20 7b 20 22 73 71 6c 5f 6c 65 6e 67 74 68     { "sql_length
2bb80 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 53 51  ",            SQ
2bb90 4c 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c  LITE_LIMIT_SQL_L
2bba0 45 4e 47 54 48 20 20 20 20 20 20 20 20 20 20 20  ENGTH           
2bbb0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
2bbc0 22 63 6f 6c 75 6d 6e 22 2c 20 20 20 20 20 20 20  "column",       
2bbd0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
2bbe0 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 20 20 20 20  LIMIT_COLUMN    
2bbf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bc00 7d 2c 0a 20 20 20 20 20 20 7b 20 22 65 78 70 72  },.      { "expr
2bc10 5f 64 65 70 74 68 22 2c 20 20 20 20 20 20 20 20  _depth",        
2bc20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
2bc30 5f 45 58 50 52 5f 44 45 50 54 48 20 20 20 20 20  _EXPR_DEPTH     
2bc40 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2bc50 20 20 20 20 7b 20 22 63 6f 6d 70 6f 75 6e 64 5f      { "compound_
2bc60 73 65 6c 65 63 74 22 2c 20 20 20 20 20 20 20 53  select",       S
2bc70 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50  QLITE_LIMIT_COMP
2bc80 4f 55 4e 44 5f 53 45 4c 45 43 54 20 20 20 20 20  OUND_SELECT     
2bc90 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
2bca0 20 22 76 64 62 65 5f 6f 70 22 2c 20 20 20 20 20   "vdbe_op",     
2bcb0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
2bcc0 5f 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 20 20  _LIMIT_VDBE_OP  
2bcd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bce0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 66 75 6e   },.      { "fun
2bcf0 63 74 69 6f 6e 5f 61 72 67 22 2c 20 20 20 20 20  ction_arg",     
2bd00 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
2bd10 54 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 20  T_FUNCTION_ARG  
2bd20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
2bd30 20 20 20 20 20 7b 20 22 61 74 74 61 63 68 65 64       { "attached
2bd40 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2bd50 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54  SQLITE_LIMIT_ATT
2bd60 41 43 48 45 44 20 20 20 20 20 20 20 20 20 20 20  ACHED           
2bd70 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
2bd80 7b 20 22 6c 69 6b 65 5f 70 61 74 74 65 72 6e 5f  { "like_pattern_
2bd90 6c 65 6e 67 74 68 22 2c 20 20 20 53 51 4c 49 54  length",   SQLIT
2bda0 45 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54  E_LIMIT_LIKE_PAT
2bdb0 54 45 52 4e 5f 4c 45 4e 47 54 48 20 20 20 20 20  TERN_LENGTH     
2bdc0 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 76 61    },.      { "va
2bdd0 72 69 61 62 6c 65 5f 6e 75 6d 62 65 72 22 2c 20  riable_number", 
2bde0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
2bdf0 49 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  IT_VARIABLE_NUMB
2be00 45 52 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  ER           },.
2be10 20 20 20 20 20 20 7b 20 22 74 72 69 67 67 65 72        { "trigger
2be20 5f 64 65 70 74 68 22 2c 20 20 20 20 20 20 20 20  _depth",        
2be30 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52   SQLITE_LIMIT_TR
2be40 49 47 47 45 52 5f 44 45 50 54 48 20 20 20 20 20  IGGER_DEPTH     
2be50 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
2be60 20 7b 20 22 77 6f 72 6b 65 72 5f 74 68 72 65 61   { "worker_threa
2be70 64 73 22 2c 20 20 20 20 20 20 20 20 53 51 4c 49  ds",        SQLI
2be80 54 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f  TE_LIMIT_WORKER_
2be90 54 48 52 45 41 44 53 20 20 20 20 20 20 20 20 20  THREADS         
2bea0 20 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20     },.    };.   
2beb0 20 69 6e 74 20 69 2c 20 6e 32 3b 0a 20 20 20 20   int i, n2;.    
2bec0 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
2bed0 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 31 20 29     if( nArg==1 )
2bee0 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
2bef0 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 4c 69   i<ArraySize(aLi
2bf00 6d 69 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mit); i++){.    
2bf10 20 20 20 20 70 72 69 6e 74 66 28 22 25 32 30 73      printf("%20s
2bf20 20 25 64 5c 6e 22 2c 20 61 4c 69 6d 69 74 5b 69   %d\n", aLimit[i
2bf30 5d 2e 7a 4c 69 6d 69 74 4e 61 6d 65 2c 0a 20 20  ].zLimitName,.  
2bf40 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
2bf50 69 74 65 33 5f 6c 69 6d 69 74 28 70 2d 3e 64 62  ite3_limit(p->db
2bf60 2c 20 61 4c 69 6d 69 74 5b 69 5d 2e 6c 69 6d 69  , aLimit[i].limi
2bf70 74 43 6f 64 65 2c 20 2d 31 29 29 3b 0a 20 20 20  tCode, -1));.   
2bf80 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
2bf90 66 28 20 6e 41 72 67 3e 33 20 29 7b 0a 20 20 20  f( nArg>3 ){.   
2bfa0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2bfb0 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 6c  derr, "Usage: .l
2bfc0 69 6d 69 74 20 4e 41 4d 45 20 3f 4e 45 57 2d 56  imit NAME ?NEW-V
2bfd0 41 4c 55 45 3f 5c 6e 22 29 3b 0a 20 20 20 20 20  ALUE?\n");.     
2bfe0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67   rc = 1;.      g
2bff0 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
2c000 5f 65 78 69 74 3b 0a 20 20 20 20 7d 65 6c 73 65  _exit;.    }else
2c010 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 69 6d  {.      int iLim
2c020 69 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 6e  it = -1;.      n
2c030 32 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 41  2 = strlen30(azA
2c040 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 66 6f  rg[1]);.      fo
2c050 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
2c060 7a 65 28 61 4c 69 6d 69 74 29 3b 20 69 2b 2b 29  ze(aLimit); i++)
2c070 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
2c080 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 61  lite3_strnicmp(a
2c090 4c 69 6d 69 74 5b 69 5d 2e 7a 4c 69 6d 69 74 4e  Limit[i].zLimitN
2c0a0 61 6d 65 2c 20 61 7a 41 72 67 5b 31 5d 2c 20 6e  ame, azArg[1], n
2c0b0 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  2)==0 ){.       
2c0c0 20 20 20 69 66 28 20 69 4c 69 6d 69 74 3c 30 20     if( iLimit<0 
2c0d0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
2c0e0 4c 69 6d 69 74 20 3d 20 69 3b 0a 20 20 20 20 20  Limit = i;.     
2c0f0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2c100 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
2c110 6e 74 66 28 73 74 64 65 72 72 2c 20 22 61 6d 62  ntf(stderr, "amb
2c120 69 67 75 6f 75 73 20 6c 69 6d 69 74 3a 20 5c 22  iguous limit: \"
2c130 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31  %s\"\n", azArg[1
2c140 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ]);.            
2c150 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
2c160 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
2c170 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
2c180 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2c190 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
2c1a0 69 66 28 20 69 4c 69 6d 69 74 3c 30 20 29 7b 0a  if( iLimit<0 ){.
2c1b0 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
2c1c0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e 6b  ntf(stderr, "unk
2c1d0 6e 6f 77 6e 20 6c 69 6d 69 74 3a 20 5c 22 25 73  nown limit: \"%s
2c1e0 5c 22 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20  \"\n".          
2c1f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 65                "e
2c200 6e 74 65 72 20 5c 22 2e 6c 69 6d 69 74 73 5c 22  nter \".limits\"
2c210 20 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e   with no argumen
2c220 74 73 20 66 6f 72 20 61 20 6c 69 73 74 2e 5c 6e  ts for a list.\n
2c230 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
2c240 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 41 72              azAr
2c250 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 72  g[1]);.        r
2c260 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67  c = 1;.        g
2c270 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
2c280 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  _exit;.      }. 
2c290 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 33       if( nArg==3
2c2a0 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2c2b0 74 65 33 5f 6c 69 6d 69 74 28 70 2d 3e 64 62 2c  te3_limit(p->db,
2c2c0 20 61 4c 69 6d 69 74 5b 69 4c 69 6d 69 74 5d 2e   aLimit[iLimit].
2c2d0 6c 69 6d 69 74 43 6f 64 65 2c 0a 20 20 20 20 20  limitCode,.     
2c2e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c2f0 20 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c   (int)integerVal
2c300 75 65 28 61 7a 41 72 67 5b 32 5d 29 29 3b 0a 20  ue(azArg[2]));. 
2c310 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 72 69       }.      pri
2c320 6e 74 66 28 22 25 32 30 73 20 25 64 5c 6e 22 2c  ntf("%20s %d\n",
2c330 20 61 4c 69 6d 69 74 5b 69 4c 69 6d 69 74 5d 2e   aLimit[iLimit].
2c340 7a 4c 69 6d 69 74 4e 61 6d 65 2c 0a 20 20 20 20  zLimitName,.    
2c350 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2c360 5f 6c 69 6d 69 74 28 70 2d 3e 64 62 2c 20 61 4c  _limit(p->db, aL
2c370 69 6d 69 74 5b 69 4c 69 6d 69 74 5d 2e 6c 69 6d  imit[iLimit].lim
2c380 69 74 43 6f 64 65 2c 20 2d 31 29 29 3b 0a 20 20  itCode, -1));.  
2c390 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
2c3a0 66 28 20 63 3d 3d 27 6c 27 20 26 26 20 6e 3e 32  f( c=='l' && n>2
2c3b0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2c3c0 67 5b 30 5d 2c 20 22 6c 69 6e 74 22 2c 20 6e 29  g[0], "lint", n)
2c3d0 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f  ==0 ){.    open_
2c3e0 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6c 69  db(p, 0);.    li
2c3f0 6e 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 70 2c 20  ntDotCommand(p, 
2c400 61 7a 41 72 67 2c 20 6e 41 72 67 29 3b 0a 20 20  azArg, nArg);.  
2c410 7d 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53  }else..#ifndef S
2c420 51 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f  QLITE_OMIT_LOAD_
2c430 45 58 54 45 4e 53 49 4f 4e 0a 20 20 69 66 28 20  EXTENSION.  if( 
2c440 63 3d 3d 27 6c 27 20 26 26 20 73 74 72 6e 63 6d  c=='l' && strncm
2c450 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 6f 61  p(azArg[0], "loa
2c460 64 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  d", n)==0 ){.   
2c470 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
2c480 6c 65 2c 20 2a 7a 50 72 6f 63 3b 0a 20 20 20 20  le, *zProc;.    
2c490 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
2c4a0 30 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3c  0;.    if( nArg<
2c4b0 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  2 ){.      raw_p
2c4c0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
2c4d0 73 61 67 65 3a 20 2e 6c 6f 61 64 20 46 49 4c 45  sage: .load FILE
2c4e0 20 3f 45 4e 54 52 59 50 4f 49 4e 54 3f 5c 6e 22   ?ENTRYPOINT?\n"
2c4f0 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
2c500 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61  .      goto meta
2c510 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
2c520 20 20 20 7d 0a 20 20 20 20 7a 46 69 6c 65 20 3d     }.    zFile =
2c530 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 7a   azArg[1];.    z
2c540 50 72 6f 63 20 3d 20 6e 41 72 67 3e 3d 33 20 3f  Proc = nArg>=3 ?
2c550 20 61 7a 41 72 67 5b 32 5d 20 3a 20 30 3b 0a 20   azArg[2] : 0;. 
2c560 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
2c570 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74  ;.    rc = sqlit
2c580 65 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f  e3_load_extensio
2c590 6e 28 70 2d 3e 64 62 2c 20 7a 46 69 6c 65 2c 20  n(p->db, zFile, 
2c5a0 7a 50 72 6f 63 2c 20 26 7a 45 72 72 4d 73 67 29  zProc, &zErrMsg)
2c5b0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2c5c0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2c5d0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2c5e0 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c  err, "Error: %s\
2c5f0 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20  n", zErrMsg);.  
2c600 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2c610 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  (zErrMsg);.     
2c620 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
2c630 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20   }else.#endif.. 
2c640 20 69 66 28 20 63 3d 3d 27 6c 27 20 26 26 20 73   if( c=='l' && s
2c650 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2c660 20 22 6c 6f 67 22 2c 20 6e 29 3d 3d 30 20 29 7b   "log", n)==0 ){
2c670 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 32  .    if( nArg!=2
2c680 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
2c690 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
2c6a0 61 67 65 3a 20 2e 6c 6f 67 20 46 49 4c 45 4e 41  age: .log FILENA
2c6b0 4d 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  ME\n");.      rc
2c6c0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
2c6d0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
2c6e0 72 20 2a 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67  r *zFile = azArg
2c6f0 5b 31 5d 3b 0a 20 20 20 20 20 20 6f 75 74 70 75  [1];.      outpu
2c700 74 5f 66 69 6c 65 5f 63 6c 6f 73 65 28 70 2d 3e  t_file_close(p->
2c710 70 4c 6f 67 29 3b 0a 20 20 20 20 20 20 70 2d 3e  pLog);.      p->
2c720 70 4c 6f 67 20 3d 20 6f 75 74 70 75 74 5f 66 69  pLog = output_fi
2c730 6c 65 5f 6f 70 65 6e 28 7a 46 69 6c 65 29 3b 0a  le_open(zFile);.
2c740 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
2c750 20 69 66 28 20 63 3d 3d 27 6d 27 20 26 26 20 73   if( c=='m' && s
2c760 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2c770 20 22 6d 6f 64 65 22 2c 20 6e 29 3d 3d 30 20 29   "mode", n)==0 )
2c780 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
2c790 20 2a 7a 4d 6f 64 65 20 3d 20 6e 41 72 67 3e 3d   *zMode = nArg>=
2c7a0 32 20 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20 22  2 ? azArg[1] : "
2c7b0 22 3b 0a 20 20 20 20 69 6e 74 20 6e 32 20 3d 20  ";.    int n2 = 
2c7c0 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4d 6f 64  (int)strlen(zMod
2c7d0 65 29 3b 0a 20 20 20 20 69 6e 74 20 63 32 20 3d  e);.    int c2 =
2c7e0 20 7a 4d 6f 64 65 5b 30 5d 3b 0a 20 20 20 20 69   zMode[0];.    i
2c7f0 66 28 20 63 32 3d 3d 27 6c 27 20 26 26 20 6e 32  f( c2=='l' && n2
2c800 3e 32 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  >2 && strncmp(az
2c810 41 72 67 5b 31 5d 2c 22 6c 69 6e 65 73 22 2c 6e  Arg[1],"lines",n
2c820 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  2)==0 ){.      p
2c830 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69  ->mode = MODE_Li
2c840 6e 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ne;.      sqlite
2c850 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
2c860 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  f(p->rowSeparato
2c870 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  r), p->rowSepara
2c880 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20  tor, SEP_Row);. 
2c890 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d     }else if( c2=
2c8a0 3d 27 63 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='c' && strncmp(
2c8b0 61 7a 41 72 67 5b 31 5d 2c 22 63 6f 6c 75 6d 6e  azArg[1],"column
2c8c0 73 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20  s",n2)==0 ){.   
2c8d0 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44     p->mode = MOD
2c8e0 45 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  E_Column;.      
2c8f0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
2c900 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65  (sizeof(p->rowSe
2c910 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77  parator), p->row
2c920 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52  Separator, SEP_R
2c930 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ow);.    }else i
2c940 66 28 20 63 32 3d 3d 27 6c 27 20 26 26 20 6e 32  f( c2=='l' && n2
2c950 3e 32 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  >2 && strncmp(az
2c960 41 72 67 5b 31 5d 2c 22 6c 69 73 74 22 2c 6e 32  Arg[1],"list",n2
2c970 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  )==0 ){.      p-
2c980 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73  >mode = MODE_Lis
2c990 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  t;.      sqlite3
2c9a0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
2c9b0 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72  (p->colSeparator
2c9c0 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  ), p->colSeparat
2c9d0 6f 72 2c 20 53 45 50 5f 43 6f 6c 75 6d 6e 29 3b  or, SEP_Column);
2c9e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
2c9f0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
2ca00 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c  ->rowSeparator),
2ca10 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
2ca20 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20  , SEP_Row);.    
2ca30 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 68  }else if( c2=='h
2ca40 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
2ca50 72 67 5b 31 5d 2c 22 68 74 6d 6c 22 2c 6e 32 29  rg[1],"html",n2)
2ca60 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
2ca70 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 48 74 6d 6c  mode = MODE_Html
2ca80 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
2ca90 63 32 3d 3d 27 74 27 20 26 26 20 73 74 72 6e 63  c2=='t' && strnc
2caa0 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74 63 6c  mp(azArg[1],"tcl
2cab0 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ",n2)==0 ){.    
2cac0 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45    p->mode = MODE
2cad0 5f 54 63 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69  _Tcl;.      sqli
2cae0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
2caf0 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61  eof(p->colSepara
2cb00 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61  tor), p->colSepa
2cb10 72 61 74 6f 72 2c 20 53 45 50 5f 53 70 61 63 65  rator, SEP_Space
2cb20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
2cb30 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
2cb40 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72  (p->rowSeparator
2cb50 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ), p->rowSeparat
2cb60 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20  or, SEP_Row);.  
2cb70 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d    }else if( c2==
2cb80 27 63 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'c' && strncmp(a
2cb90 7a 41 72 67 5b 31 5d 2c 22 63 73 76 22 2c 6e 32  zArg[1],"csv",n2
2cba0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  )==0 ){.      p-
2cbb0 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43 73 76  >mode = MODE_Csv
2cbc0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2cbd0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
2cbe0 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
2cbf0 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
2cc00 72 2c 20 53 45 50 5f 43 6f 6d 6d 61 29 3b 0a 20  r, SEP_Comma);. 
2cc10 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
2cc20 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
2cc30 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70  rowSeparator), p
2cc40 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20  ->rowSeparator, 
2cc50 53 45 50 5f 43 72 4c 66 29 3b 0a 20 20 20 20 7d  SEP_CrLf);.    }
2cc60 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 74 27  else if( c2=='t'
2cc70 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2cc80 67 5b 31 5d 2c 22 74 61 62 73 22 2c 6e 32 29 3d  g[1],"tabs",n2)=
2cc90 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d  =0 ){.      p->m
2cca0 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b  ode = MODE_List;
2ccb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
2ccc0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
2ccd0 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c  ->colSeparator),
2cce0 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
2ccf0 2c 20 53 45 50 5f 54 61 62 29 3b 0a 20 20 20 20  , SEP_Tab);.    
2cd00 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 69  }else if( c2=='i
2cd10 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
2cd20 72 67 5b 31 5d 2c 22 69 6e 73 65 72 74 22 2c 6e  rg[1],"insert",n
2cd30 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  2)==0 ){.      p
2cd40 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 49 6e  ->mode = MODE_In
2cd50 73 65 72 74 3b 0a 20 20 20 20 20 20 73 65 74 5f  sert;.      set_
2cd60 74 61 62 6c 65 5f 6e 61 6d 65 28 70 2c 20 6e 41  table_name(p, nA
2cd70 72 67 3e 3d 33 20 3f 20 61 7a 41 72 67 5b 32 5d  rg>=3 ? azArg[2]
2cd80 20 3a 20 22 74 61 62 6c 65 22 29 3b 0a 20 20 20   : "table");.   
2cd90 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27   }else if( c2=='
2cda0 71 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  q' && strncmp(az
2cdb0 41 72 67 5b 31 5d 2c 22 71 75 6f 74 65 22 2c 6e  Arg[1],"quote",n
2cdc0 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  2)==0 ){.      p
2cdd0 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 51 75  ->mode = MODE_Qu
2cde0 6f 74 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  ote;.    }else i
2cdf0 66 28 20 63 32 3d 3d 27 61 27 20 26 26 20 73 74  f( c2=='a' && st
2ce00 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  rncmp(azArg[1],"
2ce10 61 73 63 69 69 22 2c 6e 32 29 3d 3d 30 20 29 7b  ascii",n2)==0 ){
2ce20 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d  .      p->mode =
2ce30 20 4d 4f 44 45 5f 41 73 63 69 69 3b 0a 20 20 20   MODE_Ascii;.   
2ce40 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2ce50 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f  ntf(sizeof(p->co
2ce60 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e  lSeparator), p->
2ce70 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 53 45  colSeparator, SE
2ce80 50 5f 55 6e 69 74 29 3b 0a 20 20 20 20 20 20 73  P_Unit);.      s
2ce90 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2cea0 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70  sizeof(p->rowSep
2ceb0 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53  arator), p->rowS
2cec0 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 65  eparator, SEP_Re
2ced0 63 6f 72 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65  cord);.    }else
2cee0 20 69 66 28 20 6e 41 72 67 3d 3d 31 20 29 7b 0a   if( nArg==1 ){.
2cef0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2cf00 28 70 2d 3e 6f 75 74 2c 20 22 63 75 72 72 65 6e  (p->out, "curren
2cf10 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 3a 20 25  t output mode: %
2cf20 73 5c 6e 22 2c 20 6d 6f 64 65 44 65 73 63 72 5b  s\n", modeDescr[
2cf30 70 2d 3e 6d 6f 64 65 5d 29 3b 0a 20 20 20 20 7d  p->mode]);.    }
2cf40 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
2cf50 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2cf60 45 72 72 6f 72 3a 20 6d 6f 64 65 20 73 68 6f 75  Error: mode shou
2cf70 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 20 22 0a  ld be one of: ".
2cf80 20 20 20 20 20 20 20 20 20 22 61 73 63 69 69 20           "ascii 
2cf90 63 6f 6c 75 6d 6e 20 63 73 76 20 68 74 6d 6c 20  column csv html 
2cfa0 69 6e 73 65 72 74 20 6c 69 6e 65 20 6c 69 73 74  insert line list
2cfb0 20 71 75 6f 74 65 20 74 61 62 73 20 74 63 6c 5c   quote tabs tcl\
2cfc0 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
2cfd0 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e  1;.    }.    p->
2cfe0 63 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b  cMode = p->mode;
2cff0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
2d000 63 3d 3d 27 6e 27 20 26 26 20 73 74 72 6e 63 6d  c=='n' && strncm
2d010 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6e 75 6c  p(azArg[0], "nul
2d020 6c 76 61 6c 75 65 22 2c 20 6e 29 3d 3d 30 20 29  lvalue", n)==0 )
2d030 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  {.    if( nArg==
2d040 32 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  2 ){.      sqlit
2d050 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
2d060 6f 66 28 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29  of(p->nullValue)
2d070 2c 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 2c 0a  , p->nullValue,.
2d080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d090 20 20 20 20 20 20 20 22 25 2e 2a 73 22 2c 20 28         "%.*s", (
2d0a0 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28 70 2d  int)ArraySize(p-
2d0b0 3e 6e 75 6c 6c 56 61 6c 75 65 29 2d 31 2c 20 61  >nullValue)-1, a
2d0c0 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65  zArg[1]);.    }e
2d0d0 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
2d0e0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
2d0f0 73 61 67 65 3a 20 2e 6e 75 6c 6c 76 61 6c 75 65  sage: .nullvalue
2d100 20 53 54 52 49 4e 47 5c 6e 22 29 3b 0a 20 20 20   STRING\n");.   
2d110 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
2d120 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
2d130 63 3d 3d 27 6f 27 20 26 26 20 73 74 72 6e 63 6d  c=='o' && strncm
2d140 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f 70 65  p(azArg[0], "ope
2d150 6e 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 3e 3d  n", n)==0 && n>=
2d160 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  2 ){.    char *z
2d170 4e 65 77 46 69 6c 65 6e 61 6d 65 3b 20 20 2f 2a  NewFilename;  /*
2d180 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
2d190 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70  abase file to op
2d1a0 65 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4e  en */.    int iN
2d1b0 61 6d 65 20 3d 20 31 3b 20 20 20 20 20 20 20 2f  ame = 1;       /
2d1c0 2a 20 49 6e 64 65 78 20 69 6e 20 61 7a 41 72 67  * Index in azArg
2d1d0 5b 5d 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61  [] of the filena
2d1e0 6d 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65  me */.    int ne
2d1f0 77 46 6c 61 67 20 3d 20 30 3b 20 20 20 20 20 2f  wFlag = 0;     /
2d200 2a 20 54 72 75 65 20 74 6f 20 64 65 6c 65 74 65  * True to delete
2d210 20 66 69 6c 65 20 62 65 66 6f 72 65 20 6f 70 65   file before ope
2d220 6e 69 6e 67 20 2a 2f 0a 20 20 20 20 2f 2a 20 43  ning */.    /* C
2d230 6c 6f 73 65 20 74 68 65 20 65 78 69 73 74 69 6e  lose the existin
2d240 67 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  g database */.  
2d250 20 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f    session_close_
2d260 61 6c 6c 28 70 29 3b 0a 20 20 20 20 73 71 6c 69  all(p);.    sqli
2d270 74 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 29  te3_close(p->db)
2d280 3b 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 30 3b  ;.    p->db = 0;
2d290 0a 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e  .    p->zDbFilen
2d2a0 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  ame = 0;.    sql
2d2b0 69 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 46 72  ite3_free(p->zFr
2d2c0 65 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20 20 20  eeOnClose);.    
2d2d0 70 2d 3e 7a 46 72 65 65 4f 6e 43 6c 6f 73 65 20  p->zFreeOnClose 
2d2e0 3d 20 30 3b 0a 20 20 20 20 2f 2a 20 43 68 65 63  = 0;.    /* Chec
2d2f0 6b 20 66 6f 72 20 63 6f 6d 6d 61 6e 64 2d 6c 69  k for command-li
2d300 6e 65 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  ne arguments */.
2d310 20 20 20 20 66 6f 72 28 69 4e 61 6d 65 3d 31 3b      for(iName=1;
2d320 20 69 4e 61 6d 65 3c 6e 41 72 67 20 26 26 20 61   iName<nArg && a
2d330 7a 41 72 67 5b 69 4e 61 6d 65 5d 5b 30 5d 3d 3d  zArg[iName][0]==
2d340 27 2d 27 3b 20 69 4e 61 6d 65 2b 2b 29 7b 0a 20  '-'; iName++){. 
2d350 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
2d360 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 4e 61 6d 65  *z = azArg[iName
2d370 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 74  ];.      if( opt
2d380 69 6f 6e 4d 61 74 63 68 28 7a 2c 22 6e 65 77 22  ionMatch(z,"new"
2d390 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77  ) ){.        new
2d3a0 46 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  Flag = 1;.      
2d3b0 7d 65 6c 73 65 20 69 66 28 20 7a 5b 30 5d 3d 3d  }else if( z[0]==
2d3c0 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 75  '-' ){.        u
2d3d0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2d3e0 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69  r, "unknown opti
2d3f0 6f 6e 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20  on: %s\n", z);. 
2d400 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
2d410 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61         goto meta
2d420 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
2d430 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2d440 20 2f 2a 20 49 66 20 61 20 66 69 6c 65 6e 61 6d   /* If a filenam
2d450 65 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20  e is specified, 
2d460 74 72 79 20 74 6f 20 6f 70 65 6e 20 69 74 20 66  try to open it f
2d470 69 72 73 74 20 2a 2f 0a 20 20 20 20 7a 4e 65 77  irst */.    zNew
2d480 46 69 6c 65 6e 61 6d 65 20 3d 20 6e 41 72 67 3e  Filename = nArg>
2d490 69 4e 61 6d 65 20 3f 20 73 71 6c 69 74 65 33 5f  iName ? sqlite3_
2d4a0 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 61 7a  mprintf("%s", az
2d4b0 41 72 67 5b 69 4e 61 6d 65 5d 29 20 3a 20 30 3b  Arg[iName]) : 0;
2d4c0 0a 20 20 20 20 69 66 28 20 7a 4e 65 77 46 69 6c  .    if( zNewFil
2d4d0 65 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 69  ename ){.      i
2d4e0 66 28 20 6e 65 77 46 6c 61 67 20 29 20 73 68 65  f( newFlag ) she
2d4f0 6c 6c 44 65 6c 65 74 65 46 69 6c 65 28 7a 4e 65  llDeleteFile(zNe
2d500 77 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20  wFilename);.    
2d510 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65    p->zDbFilename
2d520 20 3d 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 3b   = zNewFilename;
2d530 0a 20 20 20 20 20 20 6f 70 65 6e 5f 64 62 28 70  .      open_db(p
2d540 2c 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 1);.      if( 
2d550 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20  p->db==0 ){.    
2d560 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2d570 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
2d580 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 27 25 73 27  cannot open '%s'
2d590 5c 6e 22 2c 20 7a 4e 65 77 46 69 6c 65 6e 61 6d  \n", zNewFilenam
2d5a0 65 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e);.        sqli
2d5b0 74 65 33 5f 66 72 65 65 28 7a 4e 65 77 46 69 6c  te3_free(zNewFil
2d5c0 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65  ename);.      }e
2d5d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e  lse{.        p->
2d5e0 7a 46 72 65 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a  zFreeOnClose = z
2d5f0 4e 65 77 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20  NewFilename;.   
2d600 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
2d610 66 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20  f( p->db==0 ){. 
2d620 20 20 20 20 20 2f 2a 20 41 73 20 61 20 66 61 6c       /* As a fal
2d630 6c 2d 62 61 63 6b 20 6f 70 65 6e 20 61 20 54 45  l-back open a TE
2d640 4d 50 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  MP database */. 
2d650 20 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e       p->zDbFilen
2d660 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 6f  ame = 0;.      o
2d670 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
2d680 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
2d690 66 28 20 63 3d 3d 27 6f 27 0a 20 20 20 26 26 20  f( c=='o'.   && 
2d6a0 28 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30  (strncmp(azArg[0
2d6b0 5d 2c 20 22 6f 75 74 70 75 74 22 2c 20 6e 29 3d  ], "output", n)=
2d6c0 3d 30 20 7c 7c 20 73 74 72 6e 63 6d 70 28 61 7a  =0 || strncmp(az
2d6d0 41 72 67 5b 30 5d 2c 20 22 6f 6e 63 65 22 2c 20  Arg[0], "once", 
2d6e0 6e 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20  n)==0).  ){.    
2d6f0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
2d700 65 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a  e = nArg>=2 ? az
2d710 41 72 67 5b 31 5d 20 3a 20 22 73 74 64 6f 75 74  Arg[1] : "stdout
2d720 22 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e  ";.    if( nArg>
2d730 32 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  2 ){.      utf8_
2d740 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2d750 55 73 61 67 65 3a 20 2e 25 73 20 46 49 4c 45 5c  Usage: .%s FILE\
2d760 6e 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20  n", azArg[0]);. 
2d770 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
2d780 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
2d790 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d  mand_exit;.    }
2d7a0 0a 20 20 20 20 69 66 28 20 6e 3e 31 20 26 26 20  .    if( n>1 && 
2d7b0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2d7c0 2c 20 22 6f 6e 63 65 22 2c 20 6e 29 3d 3d 30 20  , "once", n)==0 
2d7d0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72  ){.      if( nAr
2d7e0 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72  g<2 ){.        r
2d7f0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
2d800 2c 20 22 55 73 61 67 65 3a 20 2e 6f 6e 63 65 20  , "Usage: .once 
2d810 46 49 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20  FILE\n");.      
2d820 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
2d830 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
2d840 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  and_exit;.      
2d850 7d 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 43 6f  }.      p->outCo
2d860 75 6e 74 20 3d 20 32 3b 0a 20 20 20 20 7d 65 6c  unt = 2;.    }el
2d870 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74  se{.      p->out
2d880 43 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d  Count = 0;.    }
2d890 0a 20 20 20 20 6f 75 74 70 75 74 5f 72 65 73 65  .    output_rese
2d8a0 74 28 70 29 3b 0a 20 20 20 20 69 66 28 20 7a 46  t(p);.    if( zF
2d8b0 69 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 23  ile[0]=='|' ){.#
2d8c0 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  ifdef SQLITE_OMI
2d8d0 54 5f 50 4f 50 45 4e 0a 20 20 20 20 20 20 72 61  T_POPEN.      ra
2d8e0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2d8f0 20 22 45 72 72 6f 72 3a 20 70 69 70 65 73 20 61   "Error: pipes a
2d900 72 65 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64  re not supported
2d910 20 69 6e 20 74 68 69 73 20 4f 53 5c 6e 22 29 3b   in this OS\n");
2d920 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
2d930 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74       p->out = st
2d940 64 6f 75 74 3b 0a 23 65 6c 73 65 0a 20 20 20 20  dout;.#else.    
2d950 20 20 70 2d 3e 6f 75 74 20 3d 20 70 6f 70 65 6e    p->out = popen
2d960 28 7a 46 69 6c 65 20 2b 20 31 2c 20 22 77 22 29  (zFile + 1, "w")
2d970 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f  ;.      if( p->o
2d980 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ut==0 ){.       
2d990 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2d9a0 65 72 72 2c 22 45 72 72 6f 72 3a 20 63 61 6e 6e  err,"Error: cann
2d9b0 6f 74 20 6f 70 65 6e 20 70 69 70 65 20 5c 22 25  ot open pipe \"%
2d9c0 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 20 2b 20  s\"\n", zFile + 
2d9d0 31 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f  1);.        p->o
2d9e0 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20  ut = stdout;.   
2d9f0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
2da00 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2da10 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2da20 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 6f 75 74  tf(sizeof(p->out
2da30 66 69 6c 65 29 2c 20 70 2d 3e 6f 75 74 66 69 6c  file), p->outfil
2da40 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65 29 3b  e, "%s", zFile);
2da50 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  .      }.#endif.
2da60 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2da70 20 70 2d 3e 6f 75 74 20 3d 20 6f 75 74 70 75 74   p->out = output
2da80 5f 66 69 6c 65 5f 6f 70 65 6e 28 7a 46 69 6c 65  _file_open(zFile
2da90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
2daa0 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  out==0 ){.      
2dab0 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69    if( strcmp(zFi
2dac0 6c 65 2c 22 6f 66 66 22 29 21 3d 30 20 29 7b 0a  le,"off")!=0 ){.
2dad0 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
2dae0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72  rintf(stderr,"Er
2daf0 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 77 72 69 74  ror: cannot writ
2db00 65 20 74 6f 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  e to \"%s\"\n", 
2db10 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  zFile);.        
2db20 7d 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 75 74  }.        p->out
2db30 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20 20 20   = stdout;.     
2db40 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
2db50 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
2db60 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2db70 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 6f 75 74  tf(sizeof(p->out
2db80 66 69 6c 65 29 2c 20 70 2d 3e 6f 75 74 66 69 6c  file), p->outfil
2db90 65 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65 29 3b  e, "%s", zFile);
2dba0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2dbb0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
2dbc0 3d 27 70 27 20 26 26 20 6e 3e 3d 33 20 26 26 20  ='p' && n>=3 && 
2dbd0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2dbe0 2c 20 22 70 72 69 6e 74 22 2c 20 6e 29 3d 3d 30  , "print", n)==0
2dbf0 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
2dc00 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41     for(i=1; i<nA
2dc10 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
2dc20 69 66 28 20 69 3e 31 20 29 20 72 61 77 5f 70 72  if( i>1 ) raw_pr
2dc30 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 22  intf(p->out, " "
2dc40 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  );.      utf8_pr
2dc50 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
2dc60 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  ", azArg[i]);.  
2dc70 20 20 7d 0a 20 20 20 20 72 61 77 5f 70 72 69 6e    }.    raw_prin
2dc80 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29  tf(p->out, "\n")
2dc90 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
2dca0 20 63 3d 3d 27 70 27 20 26 26 20 73 74 72 6e 63   c=='p' && strnc
2dcb0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 70 72  mp(azArg[0], "pr
2dcc0 6f 6d 70 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  ompt", n)==0 ){.
2dcd0 20 20 20 20 69 66 28 20 6e 41 72 67 20 3e 3d 20      if( nArg >= 
2dce0 32 29 20 7b 0a 20 20 20 20 20 20 73 74 72 6e 63  2) {.      strnc
2dcf0 70 79 28 6d 61 69 6e 50 72 6f 6d 70 74 2c 61 7a  py(mainPrompt,az
2dd00 41 72 67 5b 31 5d 2c 28 69 6e 74 29 41 72 72 61  Arg[1],(int)Arra
2dd10 79 53 69 7a 65 28 6d 61 69 6e 50 72 6f 6d 70 74  ySize(mainPrompt
2dd20 29 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  )-1);.    }.    
2dd30 69 66 28 20 6e 41 72 67 20 3e 3d 20 33 29 20 7b  if( nArg >= 3) {
2dd40 0a 20 20 20 20 20 20 73 74 72 6e 63 70 79 28 63  .      strncpy(c
2dd50 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 2c 61 7a  ontinuePrompt,az
2dd60 41 72 67 5b 32 5d 2c 28 69 6e 74 29 41 72 72 61  Arg[2],(int)Arra
2dd70 79 53 69 7a 65 28 63 6f 6e 74 69 6e 75 65 50 72  ySize(continuePr
2dd80 6f 6d 70 74 29 2d 31 29 3b 0a 20 20 20 20 7d 0a  ompt)-1);.    }.
2dd90 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
2dda0 3d 3d 27 71 27 20 26 26 20 73 74 72 6e 63 6d 70  =='q' && strncmp
2ddb0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 71 75 69 74  (azArg[0], "quit
2ddc0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
2ddd0 72 63 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 0a  rc = 2;.  }else.
2dde0 0a 20 20 69 66 28 20 63 3d 3d 27 72 27 20 26 26  .  if( c=='r' &&
2ddf0 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70   n>=3 && strncmp
2de00 28 61 7a 41 72 67 5b 30 5d 2c 20 22 72 65 61 64  (azArg[0], "read
2de10 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
2de20 46 49 4c 45 20 2a 61 6c 74 3b 0a 20 20 20 20 69  FILE *alt;.    i
2de30 66 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20  f( nArg!=2 ){.  
2de40 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2de50 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
2de60 72 65 61 64 20 46 49 4c 45 5c 6e 22 29 3b 0a 20  read FILE\n");. 
2de70 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
2de80 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
2de90 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d  mand_exit;.    }
2dea0 0a 20 20 20 20 61 6c 74 20 3d 20 66 6f 70 65 6e  .    alt = fopen
2deb0 28 61 7a 41 72 67 5b 31 5d 2c 20 22 72 62 22 29  (azArg[1], "rb")
2dec0 3b 0a 20 20 20 20 69 66 28 20 61 6c 74 3d 3d 30  ;.    if( alt==0
2ded0 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
2dee0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72  rintf(stderr,"Er
2def0 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  ror: cannot open
2df00 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72   \"%s\"\n", azAr
2df10 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 72 63 20  g[1]);.      rc 
2df20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
2df30 20 20 20 20 20 20 72 63 20 3d 20 70 72 6f 63 65        rc = proce
2df40 73 73 5f 69 6e 70 75 74 28 70 2c 20 61 6c 74 29  ss_input(p, alt)
2df50 3b 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 61  ;.      fclose(a
2df60 6c 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  lt);.    }.  }el
2df70 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 72 27  se..  if( c=='r'
2df80 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
2df90 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 72  cmp(azArg[0], "r
2dfa0 65 73 74 6f 72 65 22 2c 20 6e 29 3d 3d 30 20 29  estore", n)==0 )
2dfb0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
2dfc0 20 2a 7a 53 72 63 46 69 6c 65 3b 0a 20 20 20 20   *zSrcFile;.    
2dfd0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b  const char *zDb;
2dfe0 0a 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70 53  .    sqlite3 *pS
2dff0 72 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  rc;.    sqlite3_
2e000 62 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b  backup *pBackup;
2e010 0a 20 20 20 20 69 6e 74 20 6e 54 69 6d 65 6f 75  .    int nTimeou
2e020 74 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20  t = 0;..    if( 
2e030 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20  nArg==2 ){.     
2e040 20 7a 53 72 63 46 69 6c 65 20 3d 20 61 7a 41 72   zSrcFile = azAr
2e050 67 5b 31 5d 3b 0a 20 20 20 20 20 20 7a 44 62 20  g[1];.      zDb 
2e060 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 7d 65  = "main";.    }e
2e070 6c 73 65 20 69 66 28 20 6e 41 72 67 3d 3d 33 20  lse if( nArg==3 
2e080 29 7b 0a 20 20 20 20 20 20 7a 53 72 63 46 69 6c  ){.      zSrcFil
2e090 65 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 20 20  e = azArg[2];.  
2e0a0 20 20 20 20 7a 44 62 20 3d 20 61 7a 41 72 67 5b      zDb = azArg[
2e0b0 31 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  1];.    }else{. 
2e0c0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2e0d0 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
2e0e0 2e 72 65 73 74 6f 72 65 20 3f 44 42 3f 20 46 49  .restore ?DB? FI
2e0f0 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  LE\n");.      rc
2e100 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
2e110 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
2e120 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63  it;.    }.    rc
2e130 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28   = sqlite3_open(
2e140 7a 53 72 63 46 69 6c 65 2c 20 26 70 53 72 63 29  zSrcFile, &pSrc)
2e150 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
2e160 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
2e170 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
2e180 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  err, "Error: can
2e190 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c  not open \"%s\"\
2e1a0 6e 22 2c 20 7a 53 72 63 46 69 6c 65 29 3b 0a 20  n", zSrcFile);. 
2e1b0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f       sqlite3_clo
2e1c0 73 65 28 70 53 72 63 29 3b 0a 20 20 20 20 20 20  se(pSrc);.      
2e1d0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
2e1e0 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
2e1f0 29 3b 0a 20 20 20 20 70 42 61 63 6b 75 70 20 3d  );.    pBackup =
2e200 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
2e210 69 6e 69 74 28 70 2d 3e 64 62 2c 20 7a 44 62 2c  init(p->db, zDb,
2e220 20 70 53 72 63 2c 20 22 6d 61 69 6e 22 29 3b 0a   pSrc, "main");.
2e230 20 20 20 20 69 66 28 20 70 42 61 63 6b 75 70 3d      if( pBackup=
2e240 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  =0 ){.      utf8
2e250 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2e260 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73  "Error: %s\n", s
2e270 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
2e280 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  >db));.      sql
2e290 69 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29  ite3_close(pSrc)
2e2a0 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
2e2b0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c  ;.    }.    whil
2e2c0 65 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33  e( (rc = sqlite3
2e2d0 5f 62 61 63 6b 75 70 5f 73 74 65 70 28 70 42 61  _backup_step(pBa
2e2e0 63 6b 75 70 2c 31 30 30 29 29 3d 3d 53 51 4c 49  ckup,100))==SQLI
2e2f0 54 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20  TE_OK.          
2e300 7c 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55  || rc==SQLITE_BU
2e310 53 59 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28  SY  ){.      if(
2e320 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59   rc==SQLITE_BUSY
2e330 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
2e340 6e 54 69 6d 65 6f 75 74 2b 2b 20 3e 3d 20 33 20  nTimeout++ >= 3 
2e350 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
2e360 20 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 31   sqlite3_sleep(1
2e370 30 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  00);.      }.   
2e380 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62   }.    sqlite3_b
2e390 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70 42 61  ackup_finish(pBa
2e3a0 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28 20 72  ckup);.    if( r
2e3b0 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29  c==SQLITE_DONE )
2e3c0 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a  {.      rc = 0;.
2e3d0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63      }else if( rc
2e3e0 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c  ==SQLITE_BUSY ||
2e3f0 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b   rc==SQLITE_LOCK
2e400 45 44 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  ED ){.      raw_
2e410 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2e420 45 72 72 6f 72 3a 20 73 6f 75 72 63 65 20 64 61  Error: source da
2e430 74 61 62 61 73 65 20 69 73 20 62 75 73 79 5c 6e  tabase is busy\n
2e440 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
2e450 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
2e460 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2e470 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25  tderr, "Error: %
2e480 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72  s\n", sqlite3_er
2e490 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20  rmsg(p->db));.  
2e4a0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2e4b0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c  }.    sqlite3_cl
2e4c0 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 7d 65 6c  ose(pSrc);.  }el
2e4d0 73 65 0a 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73  se...  if( c=='s
2e4e0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
2e4f0 72 67 5b 30 5d 2c 20 22 73 63 61 6e 73 74 61 74  rg[0], "scanstat
2e500 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  s", n)==0 ){.   
2e510 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a   if( nArg==2 ){.
2e520 20 20 20 20 20 20 70 2d 3e 73 63 61 6e 73 74 61        p->scansta
2e530 74 73 4f 6e 20 3d 20 62 6f 6f 6c 65 61 6e 56 61  tsOn = booleanVa
2e540 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 23  lue(azArg[1]);.#
2e550 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  ifndef SQLITE_EN
2e560 41 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54  ABLE_STMT_SCANST
2e570 41 54 55 53 0a 20 20 20 20 20 20 72 61 77 5f 70  ATUS.      raw_p
2e580 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 57  rintf(stderr, "W
2e590 61 72 6e 69 6e 67 3a 20 2e 73 63 61 6e 73 74 61  arning: .scansta
2e5a0 74 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  ts not available
2e5b0 20 69 6e 20 74 68 69 73 20 62 75 69 6c 64 2e 5c   in this build.\
2e5c0 6e 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  n");.#endif.    
2e5d0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
2e5e0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2e5f0 22 55 73 61 67 65 3a 20 2e 73 63 61 6e 73 74 61  "Usage: .scansta
2e600 74 73 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20  ts on|off\n");. 
2e610 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
2e620 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
2e630 28 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72 6e  ( c=='s' && strn
2e640 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73  cmp(azArg[0], "s
2e650 63 68 65 6d 61 22 2c 20 6e 29 3d 3d 30 20 29 7b  chema", n)==0 ){
2e660 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73  .    ShellText s
2e670 53 65 6c 65 63 74 3b 0a 20 20 20 20 53 68 65 6c  Select;.    Shel
2e680 6c 53 74 61 74 65 20 64 61 74 61 3b 0a 20 20 20  lState data;.   
2e690 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
2e6a0 20 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   0;.    const ch
2e6b0 61 72 20 2a 7a 44 69 76 20 3d 20 22 28 22 3b 0a  ar *zDiv = "(";.
2e6c0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2e6d0 7a 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 69  zName = 0;.    i
2e6e0 6e 74 20 69 53 63 68 65 6d 61 20 3d 20 30 3b 0a  nt iSchema = 0;.
2e6f0 20 20 20 20 69 6e 74 20 62 44 65 62 75 67 20 3d      int bDebug =
2e700 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a   0;.    int ii;.
2e710 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
2e720 30 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26  0);.    memcpy(&
2e730 64 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28  data, p, sizeof(
2e740 64 61 74 61 29 29 3b 0a 20 20 20 20 64 61 74 61  data));.    data
2e750 2e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b  .showHeader = 0;
2e760 0a 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20  .    data.cMode 
2e770 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f  = data.mode = MO
2e780 44 45 5f 53 65 6d 69 3b 0a 20 20 20 20 69 6e 69  DE_Semi;.    ini
2e790 74 54 65 78 74 28 26 73 53 65 6c 65 63 74 29 3b  tText(&sSelect);
2e7a0 0a 20 20 20 20 66 6f 72 28 69 69 3d 31 3b 20 69  .    for(ii=1; i
2e7b0 69 3c 6e 41 72 67 3b 20 69 69 2b 2b 29 7b 0a 20  i<nArg; ii++){. 
2e7c0 20 20 20 20 20 69 66 28 20 6f 70 74 69 6f 6e 4d       if( optionM
2e7d0 61 74 63 68 28 61 7a 41 72 67 5b 69 69 5d 2c 22  atch(azArg[ii],"
2e7e0 69 6e 64 65 6e 74 22 29 20 29 7b 0a 20 20 20 20  indent") ){.    
2e7f0 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d      data.cMode =
2e800 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44   data.mode = MOD
2e810 45 5f 50 72 65 74 74 79 3b 0a 20 20 20 20 20 20  E_Pretty;.      
2e820 7d 65 6c 73 65 20 69 66 28 20 6f 70 74 69 6f 6e  }else if( option
2e830 4d 61 74 63 68 28 61 7a 41 72 67 5b 69 69 5d 2c  Match(azArg[ii],
2e840 22 64 65 62 75 67 22 29 20 29 7b 0a 20 20 20 20  "debug") ){.    
2e850 20 20 20 20 62 44 65 62 75 67 20 3d 20 31 3b 0a      bDebug = 1;.
2e860 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
2e870 7a 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zName==0 ){.    
2e880 20 20 20 20 7a 4e 61 6d 65 20 3d 20 61 7a 41 72      zName = azAr
2e890 67 5b 69 69 5d 3b 0a 20 20 20 20 20 20 7d 65 6c  g[ii];.      }el
2e8a0 73 65 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f  se{.        raw_
2e8b0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2e8c0 55 73 61 67 65 3a 20 2e 73 63 68 65 6d 61 20 3f  Usage: .schema ?
2e8d0 2d 2d 69 6e 64 65 6e 74 3f 20 3f 4c 49 4b 45 2d  --indent? ?LIKE-
2e8e0 50 41 54 54 45 52 4e 3f 5c 6e 22 29 3b 0a 20 20  PATTERN?\n");.  
2e8f0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
2e900 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
2e910 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
2e920 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2e930 69 66 28 20 7a 4e 61 6d 65 21 3d 30 20 29 7b 0a  if( zName!=0 ){.
2e940 20 20 20 20 20 20 69 6e 74 20 69 73 4d 61 73 74        int isMast
2e950 65 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 72  er = sqlite3_str
2e960 6c 69 6b 65 28 7a 4e 61 6d 65 2c 20 22 73 71 6c  like(zName, "sql
2e970 69 74 65 5f 6d 61 73 74 65 72 22 2c 20 30 29 3d  ite_master", 0)=
2e980 3d 30 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73  =0;.      if( is
2e990 4d 61 73 74 65 72 20 7c 7c 20 73 71 6c 69 74 65  Master || sqlite
2e9a0 33 5f 73 74 72 6c 69 6b 65 28 7a 4e 61 6d 65 2c  3_strlike(zName,
2e9b0 22 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73  "sqlite_temp_mas
2e9c0 74 65 72 22 2c 30 29 3d 3d 30 20 29 7b 0a 20 20  ter",0)==0 ){.  
2e9d0 20 20 20 20 20 20 63 68 61 72 20 2a 6e 65 77 5f        char *new_
2e9e0 61 72 67 76 5b 32 5d 2c 20 2a 6e 65 77 5f 63 6f  argv[2], *new_co
2e9f0 6c 76 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 6e  lv[2];.        n
2ea00 65 77 5f 61 72 67 76 5b 30 5d 20 3d 20 73 71 6c  ew_argv[0] = sql
2ea10 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20  ite3_mprintf(.  
2ea20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea30 20 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c      "CREATE TABL
2ea40 45 20 25 73 20 28 5c 6e 22 0a 20 20 20 20 20 20  E %s (\n".      
2ea50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea60 22 20 20 74 79 70 65 20 74 65 78 74 2c 5c 6e 22  "  type text,\n"
2ea70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ea80 20 20 20 20 20 20 20 22 20 20 6e 61 6d 65 20 74         "  name t
2ea90 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20  ext,\n".        
2eaa0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
2eab0 20 74 62 6c 5f 6e 61 6d 65 20 74 65 78 74 2c 5c   tbl_name text,\
2eac0 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n".             
2ead0 20 20 20 20 20 20 20 20 20 22 20 20 72 6f 6f 74           "  root
2eae0 70 61 67 65 20 69 6e 74 65 67 65 72 2c 5c 6e 22  page integer,\n"
2eaf0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2eb00 20 20 20 20 20 20 20 22 20 20 73 71 6c 20 74 65         "  sql te
2eb10 78 74 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20  xt\n".          
2eb20 20 20 20 20 20 20 20 20 20 20 20 20 22 29 22 2c              ")",
2eb30 20 69 73 4d 61 73 74 65 72 20 3f 20 22 73 71 6c   isMaster ? "sql
2eb40 69 74 65 5f 6d 61 73 74 65 72 22 20 3a 20 22 73  ite_master" : "s
2eb50 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65  qlite_temp_maste
2eb60 72 22 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 77  r");.        new
2eb70 5f 61 72 67 76 5b 31 5d 20 3d 20 30 3b 0a 20 20  _argv[1] = 0;.  
2eb80 20 20 20 20 20 20 6e 65 77 5f 63 6f 6c 76 5b 30        new_colv[0
2eb90 5d 20 3d 20 22 73 71 6c 22 3b 0a 20 20 20 20 20  ] = "sql";.     
2eba0 20 20 20 6e 65 77 5f 63 6f 6c 76 5b 31 5d 20 3d     new_colv[1] =
2ebb0 20 30 3b 0a 20 20 20 20 20 20 20 20 63 61 6c 6c   0;.        call
2ebc0 62 61 63 6b 28 26 64 61 74 61 2c 20 31 2c 20 6e  back(&data, 1, n
2ebd0 65 77 5f 61 72 67 76 2c 20 6e 65 77 5f 63 6f 6c  ew_argv, new_col
2ebe0 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
2ebf0 74 65 33 5f 66 72 65 65 28 6e 65 77 5f 61 72 67  te3_free(new_arg
2ec00 76 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20  v[0]);.      }. 
2ec10 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 44 69     }.    if( zDi
2ec20 76 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  v ){.      sqlit
2ec30 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
2ec40 20 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73   0;.      rc = s
2ec50 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
2ec60 32 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54  2(p->db, "SELECT
2ec70 20 6e 61 6d 65 20 46 52 4f 4d 20 70 72 61 67 6d   name FROM pragm
2ec80 61 5f 64 61 74 61 62 61 73 65 5f 6c 69 73 74 22  a_database_list"
2ec90 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2eca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ecb0 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
2ecc0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
2ecd0 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
2ece0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
2ecf0 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74  or: %s\n", sqlit
2ed00 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29  e3_errmsg(p->db)
2ed10 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2ed20 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d  e3_finalize(pStm
2ed30 74 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  t);.        rc =
2ed40 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
2ed50 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
2ed60 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  it;.      }.    
2ed70 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
2ed80 65 6c 65 63 74 2c 20 22 53 45 4c 45 43 54 20 73  elect, "SELECT s
2ed90 71 6c 20 46 52 4f 4d 22 2c 20 30 29 3b 0a 20 20  ql FROM", 0);.  
2eda0 20 20 20 20 69 53 63 68 65 6d 61 20 3d 20 30 3b      iSchema = 0;
2edb0 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 71  .      while( sq
2edc0 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
2edd0 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
2ede0 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
2edf0 68 61 72 20 2a 7a 44 62 20 3d 20 28 63 6f 6e 73  har *zDb = (cons
2ee00 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
2ee10 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
2ee20 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 63  t, 0);.        c
2ee30 68 61 72 20 7a 53 63 4e 75 6d 5b 33 30 5d 3b 0a  har zScNum[30];.
2ee40 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2ee50 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
2ee60 7a 53 63 4e 75 6d 29 2c 20 7a 53 63 4e 75 6d 2c  zScNum), zScNum,
2ee70 20 22 25 64 22 2c 20 2b 2b 69 53 63 68 65 6d 61   "%d", ++iSchema
2ee80 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  );.        appen
2ee90 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
2eea0 7a 44 69 76 2c 20 30 29 3b 0a 20 20 20 20 20 20  zDiv, 0);.      
2eeb0 20 20 7a 44 69 76 20 3d 20 22 20 55 4e 49 4f 4e    zDiv = " UNION
2eec0 20 41 4c 4c 20 22 3b 0a 20 20 20 20 20 20 20 20   ALL ";.        
2eed0 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
2eee0 65 63 74 2c 20 22 53 45 4c 45 43 54 20 73 68 65  ect, "SELECT she
2eef0 6c 6c 5f 61 64 64 5f 73 63 68 65 6d 61 28 73 71  ll_add_schema(sq
2ef00 6c 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  l,", 0);.       
2ef10 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72   if( sqlite3_str
2ef20 69 63 6d 70 28 7a 44 62 2c 20 22 6d 61 69 6e 22  icmp(zDb, "main"
2ef30 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
2ef40 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
2ef50 65 6c 65 63 74 2c 20 7a 44 62 2c 20 27 22 27 29  elect, zDb, '"')
2ef60 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
2ef70 0a 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e  .          appen
2ef80 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
2ef90 22 4e 55 4c 4c 22 2c 20 30 29 3b 0a 20 20 20 20  "NULL", 0);.    
2efa0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 70      }.        ap
2efb0 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63  pendText(&sSelec
2efc0 74 2c 20 22 2c 6e 61 6d 65 29 20 41 53 20 73 71  t, ",name) AS sq
2efd0 6c 2c 20 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d  l, type, tbl_nam
2efe0 65 2c 20 6e 61 6d 65 2c 20 72 6f 77 69 64 2c 22  e, name, rowid,"
2eff0 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70  , 0);.        ap
2f000 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63  pendText(&sSelec
2f010 74 2c 20 7a 53 63 4e 75 6d 2c 20 30 29 3b 0a 20  t, zScNum, 0);. 
2f020 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
2f030 74 28 26 73 53 65 6c 65 63 74 2c 20 22 20 41 53  t(&sSelect, " AS
2f040 20 73 6e 75 6d 2c 20 22 2c 20 30 29 3b 0a 20 20   snum, ", 0);.  
2f050 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
2f060 28 26 73 53 65 6c 65 63 74 2c 20 7a 44 62 2c 20  (&sSelect, zDb, 
2f070 27 5c 27 27 29 3b 0a 20 20 20 20 20 20 20 20 61  '\'');.        a
2f080 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
2f090 63 74 2c 20 22 20 41 53 20 73 6e 61 6d 65 20 46  ct, " AS sname F
2f0a0 52 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 20  ROM ", 0);.     
2f0b0 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
2f0c0 53 65 6c 65 63 74 2c 20 7a 44 62 2c 20 27 22 27  Select, zDb, '"'
2f0d0 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  );.        appen
2f0e0 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
2f0f0 22 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22  ".sqlite_master"
2f100 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
2f110 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
2f120 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 23 69 66  lize(pStmt);.#if
2f130 64 65 66 20 53 51 4c 49 54 45 5f 49 4e 54 52 4f  def SQLITE_INTRO
2f140 53 50 45 43 54 49 4f 4e 5f 50 52 41 47 4d 41 53  SPECTION_PRAGMAS
2f150 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65  .      if( zName
2f160 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65   ){.        appe
2f170 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
2f180 0a 20 20 20 20 20 20 20 20 20 20 20 22 20 55 4e  .           " UN
2f190 49 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 73  ION ALL SELECT s
2f1a0 68 65 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68 65  hell_module_sche
2f1b0 6d 61 28 6e 61 6d 65 29 2c 22 0a 20 20 20 20 20  ma(name),".     
2f1c0 20 20 20 20 20 20 22 20 27 74 61 62 6c 65 27 2c        " 'table',
2f1d0 20 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20 6e 61 6d   name, name, nam
2f1e0 65 2c 20 39 65 2b 39 39 2c 20 27 6d 61 69 6e 27  e, 9e+99, 'main'
2f1f0 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 6d 6f 64   FROM pragma_mod
2f200 75 6c 65 5f 6c 69 73 74 22 2c 20 30 29 3b 0a 20  ule_list", 0);. 
2f210 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20       }.#endif.  
2f220 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
2f230 73 53 65 6c 65 63 74 2c 20 22 29 20 57 48 45 52  sSelect, ") WHER
2f240 45 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  E ", 0);.      i
2f250 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20  f( zName ){.    
2f260 20 20 20 20 63 68 61 72 20 2a 7a 51 61 72 67 20      char *zQarg 
2f270 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2f280 66 28 22 25 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a  f("%Q", zName);.
2f290 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63          if( strc
2f2a0 68 72 28 7a 4e 61 6d 65 2c 20 27 2e 27 29 20 29  hr(zName, '.') )
2f2b0 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 70 65  {.          appe
2f2c0 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
2f2d0 20 22 6c 6f 77 65 72 28 70 72 69 6e 74 66 28 27   "lower(printf('
2f2e0 25 73 2e 25 73 27 2c 73 6e 61 6d 65 2c 74 62 6c  %s.%s',sname,tbl
2f2f0 5f 6e 61 6d 65 29 29 22 2c 20 30 29 3b 0a 20 20  _name))", 0);.  
2f300 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2f310 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
2f320 74 28 26 73 53 65 6c 65 63 74 2c 20 22 6c 6f 77  t(&sSelect, "low
2f330 65 72 28 74 62 6c 5f 6e 61 6d 65 29 22 2c 20 30  er(tbl_name)", 0
2f340 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2f350 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
2f360 26 73 53 65 6c 65 63 74 2c 20 73 74 72 63 68 72  &sSelect, strchr
2f370 28 7a 4e 61 6d 65 2c 20 27 2a 27 29 20 3f 20 22  (zName, '*') ? "
2f380 20 47 4c 4f 42 20 22 20 3a 20 22 20 4c 49 4b 45   GLOB " : " LIKE
2f390 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   ", 0);.        
2f3a0 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
2f3b0 65 63 74 2c 20 7a 51 61 72 67 2c 20 30 29 3b 0a  ect, zQarg, 0);.
2f3c0 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
2f3d0 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 20 41  xt(&sSelect, " A
2f3e0 4e 44 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ND ", 0);.      
2f3f0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2f400 51 61 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Qarg);.      }. 
2f410 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
2f420 26 73 53 65 6c 65 63 74 2c 20 22 74 79 70 65 21  &sSelect, "type!
2f430 3d 27 6d 65 74 61 27 20 41 4e 44 20 73 71 6c 20  ='meta' AND sql 
2f440 49 53 20 4e 4f 54 20 4e 55 4c 4c 22 0a 20 20 20  IS NOT NULL".   
2f450 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f460 20 20 20 20 20 20 20 20 22 20 4f 52 44 45 52 20          " ORDER 
2f470 42 59 20 73 6e 75 6d 2c 20 72 6f 77 69 64 22 2c  BY snum, rowid",
2f480 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62   0);.      if( b
2f490 44 65 62 75 67 20 29 7b 0a 20 20 20 20 20 20 20  Debug ){.       
2f4a0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
2f4b0 6f 75 74 2c 20 22 53 51 4c 3a 20 25 73 3b 5c 6e  out, "SQL: %s;\n
2f4c0 22 2c 20 73 53 65 6c 65 63 74 2e 7a 29 3b 0a 20  ", sSelect.z);. 
2f4d0 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2f4e0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2f4f0 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 73 53 65  _exec(p->db, sSe
2f500 6c 65 63 74 2e 7a 2c 20 63 61 6c 6c 62 61 63 6b  lect.z, callback
2f510 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73  , &data, &zErrMs
2f520 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
2f530 20 20 66 72 65 65 54 65 78 74 28 26 73 53 65 6c    freeText(&sSel
2f540 65 63 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ect);.    }.    
2f550 69 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20  if( zErrMsg ){. 
2f560 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2f570 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20  (stderr,"Error: 
2f580 25 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b  %s\n", zErrMsg);
2f590 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
2f5a0 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20  ree(zErrMsg);.  
2f5b0 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2f5c0 7d 65 6c 73 65 20 69 66 28 20 72 63 20 21 3d 20  }else if( rc != 
2f5d0 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
2f5e0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2f5f0 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 71 75 65  derr,"Error: que
2f600 72 79 69 6e 67 20 73 63 68 65 6d 61 20 69 6e 66  rying schema inf
2f610 6f 72 6d 61 74 69 6f 6e 5c 6e 22 29 3b 0a 20 20  ormation\n");.  
2f620 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2f630 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20  }else{.      rc 
2f640 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 0;.    }.  }el
2f650 73 65 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  se..#if defined(
2f660 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26  SQLITE_DEBUG) &&
2f670 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2f680 45 4e 41 42 4c 45 5f 53 45 4c 45 43 54 54 52 41  ENABLE_SELECTTRA
2f690 43 45 29 0a 20 20 69 66 28 20 63 3d 3d 27 73 27  CE).  if( c=='s'
2f6a0 20 26 26 20 6e 3d 3d 31 31 20 26 26 20 73 74 72   && n==11 && str
2f6b0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2f6c0 73 65 6c 65 63 74 74 72 61 63 65 22 2c 20 6e 29  selecttrace", n)
2f6d0 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
2f6e0 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 3d 20  e3SelectTrace = 
2f6f0 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75  (int)integerValu
2f700 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d  e(azArg[1]);.  }
2f710 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 23 69 66  else.#endif..#if
2f720 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
2f730 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a  ENABLE_SESSION).
2f740 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20    if( c=='s' && 
2f750 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2f760 2c 22 73 65 73 73 69 6f 6e 22 2c 6e 29 3d 3d 30  ,"session",n)==0
2f770 20 26 26 20 6e 3e 3d 33 20 29 7b 0a 20 20 20 20   && n>=3 ){.    
2f780 4f 70 65 6e 53 65 73 73 69 6f 6e 20 2a 70 53 65  OpenSession *pSe
2f790 73 73 69 6f 6e 20 3d 20 26 70 2d 3e 61 53 65 73  ssion = &p->aSes
2f7a0 73 69 6f 6e 5b 30 5d 3b 0a 20 20 20 20 63 68 61  sion[0];.    cha
2f7b0 72 20 2a 2a 61 7a 43 6d 64 20 3d 20 26 61 7a 41  r **azCmd = &azA
2f7c0 72 67 5b 31 5d 3b 0a 20 20 20 20 69 6e 74 20 69  rg[1];.    int i
2f7d0 53 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74  Ses = 0;.    int
2f7e0 20 6e 43 6d 64 20 3d 20 6e 41 72 67 20 2d 20 31   nCmd = nArg - 1
2f7f0 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20  ;.    int i;.   
2f800 20 69 66 28 20 6e 41 72 67 3c 3d 31 20 29 20 67   if( nArg<=1 ) g
2f810 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74  oto session_synt
2f820 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 6f 70  ax_error;.    op
2f830 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
2f840 20 69 66 28 20 6e 41 72 67 3e 3d 33 20 29 7b 0a   if( nArg>=3 ){.
2f850 20 20 20 20 20 20 66 6f 72 28 69 53 65 73 3d 30        for(iSes=0
2f860 3b 20 69 53 65 73 3c 70 2d 3e 6e 53 65 73 73 69  ; iSes<p->nSessi
2f870 6f 6e 3b 20 69 53 65 73 2b 2b 29 7b 0a 20 20 20  on; iSes++){.   
2f880 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
2f890 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 53 65 73  p->aSession[iSes
2f8a0 5d 2e 7a 4e 61 6d 65 2c 20 61 7a 41 72 67 5b 31  ].zName, azArg[1
2f8b0 5d 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20  ])==0 ) break;. 
2f8c0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2f8d0 20 69 53 65 73 3c 70 2d 3e 6e 53 65 73 73 69 6f   iSes<p->nSessio
2f8e0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 65  n ){.        pSe
2f8f0 73 73 69 6f 6e 20 3d 20 26 70 2d 3e 61 53 65 73  ssion = &p->aSes
2f900 73 69 6f 6e 5b 69 53 65 73 5d 3b 0a 20 20 20 20  sion[iSes];.    
2f910 20 20 20 20 61 7a 43 6d 64 2b 2b 3b 0a 20 20 20      azCmd++;.   
2f920 20 20 20 20 20 6e 43 6d 64 2d 2d 3b 0a 20 20 20       nCmd--;.   
2f930 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2f940 20 20 70 53 65 73 73 69 6f 6e 20 3d 20 26 70 2d    pSession = &p-
2f950 3e 61 53 65 73 73 69 6f 6e 5b 30 5d 3b 0a 20 20  >aSession[0];.  
2f960 20 20 20 20 20 20 69 53 65 73 20 3d 20 30 3b 0a        iSes = 0;.
2f970 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2f980 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 61     /* .session a
2f990 74 74 61 63 68 20 54 41 42 4c 45 0a 20 20 20 20  ttach TABLE.    
2f9a0 2a 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71  ** Invoke the sq
2f9b0 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 61 74 74  lite3session_att
2f9c0 61 63 68 28 29 20 69 6e 74 65 72 66 61 63 65 20  ach() interface 
2f9d0 74 6f 20 61 74 74 61 63 68 20 61 20 70 61 72 74  to attach a part
2f9e0 69 63 75 6c 61 72 0a 20 20 20 20 2a 2a 20 74 61  icular.    ** ta
2f9f0 62 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 69  ble so that it i
2fa00 73 20 6e 65 76 65 72 20 66 69 6c 74 65 72 65 64  s never filtered
2fa10 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
2fa20 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d   strcmp(azCmd[0]
2fa30 2c 22 61 74 74 61 63 68 22 29 3d 3d 30 20 29 7b  ,"attach")==0 ){
2fa40 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6d 64 21  .      if( nCmd!
2fa50 3d 32 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f  =2 ) goto sessio
2fa60 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a  n_syntax_error;.
2fa70 20 20 20 20 20 20 69 66 28 20 70 53 65 73 73 69        if( pSessi
2fa80 6f 6e 2d 3e 70 3d 3d 30 20 29 7b 0a 20 20 20 20  on->p==0 ){.    
2fa90 20 20 20 20 73 65 73 73 69 6f 6e 5f 6e 6f 74 5f      session_not_
2faa0 6f 70 65 6e 3a 0a 20 20 20 20 20 20 20 20 72 61  open:.        ra
2fab0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2fac0 20 22 45 52 52 4f 52 3a 20 4e 6f 20 73 65 73 73   "ERROR: No sess
2fad0 69 6f 6e 73 20 61 72 65 20 6f 70 65 6e 5c 6e 22  ions are open\n"
2fae0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2faf0 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2fb00 69 74 65 33 73 65 73 73 69 6f 6e 5f 61 74 74 61  ite3session_atta
2fb10 63 68 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20  ch(pSession->p, 
2fb20 61 7a 43 6d 64 5b 31 5d 29 3b 0a 20 20 20 20 20  azCmd[1]);.     
2fb30 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2fb40 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
2fb50 66 28 73 74 64 65 72 72 2c 20 22 45 52 52 4f 52  f(stderr, "ERROR
2fb60 3a 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e  : sqlite3session
2fb70 5f 61 74 74 61 63 68 28 29 20 72 65 74 75 72 6e  _attach() return
2fb80 73 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20  s %d\n", rc);.  
2fb90 20 20 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a          rc = 0;.
2fba0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2fbb0 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20  }.    }else..   
2fbc0 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 63 68 61   /* .session cha
2fbd0 6e 67 65 73 65 74 20 46 49 4c 45 0a 20 20 20 20  ngeset FILE.    
2fbe0 2a 2a 20 2e 73 65 73 73 69 6f 6e 20 70 61 74 63  ** .session patc
2fbf0 68 73 65 74 20 46 49 4c 45 0a 20 20 20 20 2a 2a  hset FILE.    **
2fc00 20 57 72 69 74 65 20 61 20 63 68 61 6e 67 65 73   Write a changes
2fc10 65 74 20 6f 72 20 70 61 74 63 68 73 65 74 20 69  et or patchset i
2fc20 6e 74 6f 20 61 20 66 69 6c 65 2e 20 20 54 68 65  nto a file.  The
2fc30 20 66 69 6c 65 20 69 73 20 6f 76 65 72 77 72 69   file is overwri
2fc40 74 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  tten..    */.   
2fc50 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d   if( strcmp(azCm
2fc60 64 5b 30 5d 2c 22 63 68 61 6e 67 65 73 65 74 22  d[0],"changeset"
2fc70 29 3d 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28 61  )==0 || strcmp(a
2fc80 7a 43 6d 64 5b 30 5d 2c 22 70 61 74 63 68 73 65  zCmd[0],"patchse
2fc90 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  t")==0 ){.      
2fca0 46 49 4c 45 20 2a 6f 75 74 20 3d 20 30 3b 0a 20  FILE *out = 0;. 
2fcb0 20 20 20 20 20 69 66 28 20 6e 43 6d 64 21 3d 32       if( nCmd!=2
2fcc0 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f   ) goto session_
2fcd0 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20  syntax_error;.  
2fce0 20 20 20 20 69 66 28 20 70 53 65 73 73 69 6f 6e      if( pSession
2fcf0 2d 3e 70 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65  ->p==0 ) goto se
2fd00 73 73 69 6f 6e 5f 6e 6f 74 5f 6f 70 65 6e 3b 0a  ssion_not_open;.
2fd10 20 20 20 20 20 20 6f 75 74 20 3d 20 66 6f 70 65        out = fope
2fd20 6e 28 61 7a 43 6d 64 5b 31 5d 2c 20 22 77 62 22  n(azCmd[1], "wb"
2fd30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 75 74  );.      if( out
2fd40 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75  ==0 ){.        u
2fd50 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2fd60 72 2c 20 22 45 52 52 4f 52 3a 20 63 61 6e 6e 6f  r, "ERROR: canno
2fd70 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 20 66 6f  t open \"%s\" fo
2fd80 72 20 77 72 69 74 69 6e 67 5c 6e 22 2c 20 61 7a  r writing\n", az
2fd90 43 6d 64 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d  Cmd[1]);.      }
2fda0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e  else{.        in
2fdb0 74 20 73 7a 43 68 6e 67 3b 0a 20 20 20 20 20 20  t szChng;.      
2fdc0 20 20 76 6f 69 64 20 2a 70 43 68 6e 67 3b 0a 20    void *pChng;. 
2fdd0 20 20 20 20 20 20 20 69 66 28 20 61 7a 43 6d 64         if( azCmd
2fde0 5b 30 5d 5b 30 5d 3d 3d 27 63 27 20 29 7b 0a 20  [0][0]=='c' ){. 
2fdf0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2fe00 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 63 68 61  lite3session_cha
2fe10 6e 67 65 73 65 74 28 70 53 65 73 73 69 6f 6e 2d  ngeset(pSession-
2fe20 3e 70 2c 20 26 73 7a 43 68 6e 67 2c 20 26 70 43  >p, &szChng, &pC
2fe30 68 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  hng);.        }e
2fe40 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72  lse{.          r
2fe50 63 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69  c = sqlite3sessi
2fe60 6f 6e 5f 70 61 74 63 68 73 65 74 28 70 53 65 73  on_patchset(pSes
2fe70 73 69 6f 6e 2d 3e 70 2c 20 26 73 7a 43 68 6e 67  sion->p, &szChng
2fe80 2c 20 26 70 43 68 6e 67 29 3b 0a 20 20 20 20 20  , &pChng);.     
2fe90 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
2fea0 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
2feb0 20 70 72 69 6e 74 66 28 22 45 72 72 6f 72 3a 20   printf("Error: 
2fec0 65 72 72 6f 72 20 63 6f 64 65 20 25 64 5c 6e 22  error code %d\n"
2fed0 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20  , rc);.         
2fee0 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20   rc = 0;.       
2fef0 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70   }.        if( p
2ff00 43 68 6e 67 0a 20 20 20 20 20 20 20 20 20 20 26  Chng.          &
2ff10 26 20 66 77 72 69 74 65 28 70 43 68 6e 67 2c 20  & fwrite(pChng, 
2ff20 73 7a 43 68 6e 67 2c 20 31 2c 20 6f 75 74 29 21  szChng, 1, out)!
2ff30 3d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =1 ){.          
2ff40 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2ff50 72 2c 20 22 45 52 52 4f 52 3a 20 46 61 69 6c 65  r, "ERROR: Faile
2ff60 64 20 74 6f 20 77 72 69 74 65 20 65 6e 74 69 72  d to write entir
2ff70 65 20 25 64 2d 62 79 74 65 20 6f 75 74 70 75 74  e %d-byte output
2ff80 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
2ff90 20 20 20 20 20 20 20 73 7a 43 68 6e 67 29 3b 0a         szChng);.
2ffa0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2ffb0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
2ffc0 43 68 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 66  Chng);.        f
2ffd0 63 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20  close(out);.    
2ffe0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20    }.    }else.. 
2fff0 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 63     /* .session c
30000 6c 6f 73 65 0a 20 20 20 20 2a 2a 20 43 6c 6f 73  lose.    ** Clos
30010 65 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 64  e the identified
30020 20 73 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2f 0a   session.    */.
30030 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
30040 7a 43 6d 64 5b 30 5d 2c 20 22 63 6c 6f 73 65 22  zCmd[0], "close"
30050 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
30060 28 20 6e 43 6d 64 21 3d 31 20 29 20 67 6f 74 6f  ( nCmd!=1 ) goto
30070 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f   session_syntax_
30080 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 66 28  error;.      if(
30090 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a   p->nSession ){.
300a0 20 20 20 20 20 20 20 20 73 65 73 73 69 6f 6e 5f          session_
300b0 63 6c 6f 73 65 28 70 53 65 73 73 69 6f 6e 29 3b  close(pSession);
300c0 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 53 65 73  .        p->aSes
300d0 73 69 6f 6e 5b 69 53 65 73 5d 20 3d 20 70 2d 3e  sion[iSes] = p->
300e0 61 53 65 73 73 69 6f 6e 5b 2d 2d 70 2d 3e 6e 53  aSession[--p->nS
300f0 65 73 73 69 6f 6e 5d 3b 0a 20 20 20 20 20 20 7d  ession];.      }
30100 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20  .    }else..    
30110 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 65 6e 61 62  /* .session enab
30120 6c 65 20 3f 42 4f 4f 4c 45 41 4e 3f 0a 20 20 20  le ?BOOLEAN?.   
30130 20 2a 2a 20 51 75 65 72 79 20 6f 72 20 73 65 74   ** Query or set
30140 20 74 68 65 20 65 6e 61 62 6c 65 20 66 6c 61 67   the enable flag
30150 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
30160 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c  strcmp(azCmd[0],
30170 20 22 65 6e 61 62 6c 65 22 29 3d 3d 30 20 29 7b   "enable")==0 ){
30180 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  .      int ii;. 
30190 20 20 20 20 20 69 66 28 20 6e 43 6d 64 3e 32 20       if( nCmd>2 
301a0 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73  ) goto session_s
301b0 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20  yntax_error;.   
301c0 20 20 20 69 69 20 3d 20 6e 43 6d 64 3d 3d 31 20     ii = nCmd==1 
301d0 3f 20 2d 31 20 3a 20 62 6f 6f 6c 65 61 6e 56 61  ? -1 : booleanVa
301e0 6c 75 65 28 61 7a 43 6d 64 5b 31 5d 29 3b 0a 20  lue(azCmd[1]);. 
301f0 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 73       if( p->nSes
30200 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  sion ){.        
30210 69 69 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73  ii = sqlite3sess
30220 69 6f 6e 5f 65 6e 61 62 6c 65 28 70 53 65 73 73  ion_enable(pSess
30230 69 6f 6e 2d 3e 70 2c 20 69 69 29 3b 0a 20 20 20  ion->p, ii);.   
30240 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
30250 28 70 2d 3e 6f 75 74 2c 20 22 73 65 73 73 69 6f  (p->out, "sessio
30260 6e 20 25 73 20 65 6e 61 62 6c 65 20 66 6c 61 67  n %s enable flag
30270 20 3d 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20   = %d\n",.      
30280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53                pS
30290 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 2c 20 69  ession->zName, i
302a0 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  i);.      }.    
302b0 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73  }else..    /* .s
302c0 65 73 73 69 6f 6e 20 66 69 6c 74 65 72 20 47 4c  ession filter GL
302d0 4f 42 20 2e 2e 2e 2e 0a 20 20 20 20 2a 2a 20 53  OB .....    ** S
302e0 65 74 20 61 20 6c 69 73 74 20 6f 66 20 47 4c 4f  et a list of GLO
302f0 42 20 70 61 74 74 65 72 6e 73 20 6f 66 20 74 61  B patterns of ta
30300 62 6c 65 20 6e 61 6d 65 73 20 74 6f 20 62 65 20  ble names to be 
30310 65 78 63 6c 75 64 65 64 2e 0a 20 20 20 20 2a 2f  excluded..    */
30320 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
30330 61 7a 43 6d 64 5b 30 5d 2c 20 22 66 69 6c 74 65  azCmd[0], "filte
30340 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r")==0 ){.      
30350 69 6e 74 20 69 69 2c 20 6e 42 79 74 65 3b 0a 20  int ii, nByte;. 
30360 20 20 20 20 20 69 66 28 20 6e 43 6d 64 3c 32 20       if( nCmd<2 
30370 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73  ) goto session_s
30380 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20  yntax_error;.   
30390 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 73 73 69     if( p->nSessi
303a0 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  on ){.        fo
303b0 72 28 69 69 3d 30 3b 20 69 69 3c 70 53 65 73 73  r(ii=0; ii<pSess
303c0 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72 3b 20 69 69  ion->nFilter; ii
303d0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  ++){.          s
303e0 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53 65 73  qlite3_free(pSes
303f0 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 69  sion->azFilter[i
30400 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
30410 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
30420 72 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a  ree(pSession->az
30430 46 69 6c 74 65 72 29 3b 0a 20 20 20 20 20 20 20  Filter);.       
30440 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28   nByte = sizeof(
30450 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74  pSession->azFilt
30460 65 72 5b 30 5d 29 2a 28 6e 43 6d 64 2d 31 29 3b  er[0])*(nCmd-1);
30470 0a 20 20 20 20 20 20 20 20 70 53 65 73 73 69 6f  .        pSessio
30480 6e 2d 3e 61 7a 46 69 6c 74 65 72 20 3d 20 73 71  n->azFilter = sq
30490 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42  lite3_malloc( nB
304a0 79 74 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69  yte );.        i
304b0 66 28 20 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46  f( pSession->azF
304c0 69 6c 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20  ilter==0 ){.    
304d0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
304e0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
304f0 20 6f 75 74 20 6f 72 20 6d 65 6d 6f 72 79 5c 6e   out or memory\n
30500 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78  ");.          ex
30510 69 74 28 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  it(1);.        }
30520 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d  .        for(ii=
30530 31 3b 20 69 69 3c 6e 43 6d 64 3b 20 69 69 2b 2b  1; ii<nCmd; ii++
30540 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 53 65  ){.          pSe
30550 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b  ssion->azFilter[
30560 69 69 2d 31 5d 20 3d 20 73 71 6c 69 74 65 33 5f  ii-1] = sqlite3_
30570 6d 70 72 69 6e 74 66 28 22 25 73 22 2c 20 61 7a  mprintf("%s", az
30580 43 6d 64 5b 69 69 5d 29 3b 0a 20 20 20 20 20 20  Cmd[ii]);.      
30590 20 20 7d 0a 20 20 20 20 20 20 20 20 70 53 65 73    }.        pSes
305a0 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72 20 3d 20  sion->nFilter = 
305b0 69 69 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ii-1;.      }.  
305c0 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20    }else..    /* 
305d0 2e 73 65 73 73 69 6f 6e 20 69 6e 64 69 72 65 63  .session indirec
305e0 74 20 3f 42 4f 4f 4c 45 41 4e 3f 0a 20 20 20 20  t ?BOOLEAN?.    
305f0 2a 2a 20 51 75 65 72 79 20 6f 72 20 73 65 74 20  ** Query or set 
30600 74 68 65 20 69 6e 64 69 72 65 63 74 20 66 6c 61  the indirect fla
30610 67 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  g.    */.    if(
30620 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d   strcmp(azCmd[0]
30630 2c 20 22 69 6e 64 69 72 65 63 74 22 29 3d 3d 30  , "indirect")==0
30640 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69   ){.      int ii
30650 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6d 64  ;.      if( nCmd
30660 3e 32 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f  >2 ) goto sessio
30670 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a  n_syntax_error;.
30680 20 20 20 20 20 20 69 69 20 3d 20 6e 43 6d 64 3d        ii = nCmd=
30690 3d 31 20 3f 20 2d 31 20 3a 20 62 6f 6f 6c 65 61  =1 ? -1 : boolea
306a0 6e 56 61 6c 75 65 28 61 7a 43 6d 64 5b 31 5d 29  nValue(azCmd[1])
306b0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  ;.      if( p->n
306c0 53 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20  Session ){.     
306d0 20 20 20 69 69 20 3d 20 73 71 6c 69 74 65 33 73     ii = sqlite3s
306e0 65 73 73 69 6f 6e 5f 69 6e 64 69 72 65 63 74 28  ession_indirect(
306f0 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 69 69 29  pSession->p, ii)
30700 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  ;.        utf8_p
30710 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 73  rintf(p->out, "s
30720 65 73 73 69 6f 6e 20 25 73 20 69 6e 64 69 72 65  ession %s indire
30730 63 74 20 66 6c 61 67 20 3d 20 25 64 5c 6e 22 2c  ct flag = %d\n",
30740 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
30750 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 7a       pSession->z
30760 4e 61 6d 65 2c 20 69 69 29 3b 0a 20 20 20 20 20  Name, ii);.     
30770 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20   }.    }else..  
30780 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 69 73    /* .session is
30790 65 6d 70 74 79 0a 20 20 20 20 2a 2a 20 44 65 74  empty.    ** Det
307a0 65 72 6d 69 6e 65 20 69 66 20 74 68 65 20 73 65  ermine if the se
307b0 73 73 69 6f 6e 20 69 73 20 65 6d 70 74 79 0a 20  ssion is empty. 
307c0 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74     */.    if( st
307d0 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22  rcmp(azCmd[0], "
307e0 69 73 65 6d 70 74 79 22 29 3d 3d 30 20 29 7b 0a  isempty")==0 ){.
307f0 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20        int ii;.  
30800 20 20 20 20 69 66 28 20 6e 43 6d 64 21 3d 31 20      if( nCmd!=1 
30810 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73  ) goto session_s
30820 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20  yntax_error;.   
30830 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 73 73 69     if( p->nSessi
30840 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 69  on ){.        ii
30850 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f   = sqlite3sessio
30860 6e 5f 69 73 65 6d 70 74 79 28 70 53 65 73 73 69  n_isempty(pSessi
30870 6f 6e 2d 3e 70 29 3b 0a 20 20 20 20 20 20 20 20  on->p);.        
30880 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
30890 75 74 2c 20 22 73 65 73 73 69 6f 6e 20 25 73 20  ut, "session %s 
308a0 69 73 65 6d 70 74 79 20 66 6c 61 67 20 3d 20 25  isempty flag = %
308b0 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  d\n",.          
308c0 20 20 20 20 20 20 20 20 20 20 70 53 65 73 73 69            pSessi
308d0 6f 6e 2d 3e 7a 4e 61 6d 65 2c 20 69 69 29 3b 0a  on->zName, ii);.
308e0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
308f0 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69  e..    /* .sessi
30900 6f 6e 20 6c 69 73 74 0a 20 20 20 20 2a 2a 20 4c  on list.    ** L
30910 69 73 74 20 61 6c 6c 20 63 75 72 72 65 6e 74 6c  ist all currentl
30920 79 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e 73 0a  y open sessions.
30930 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
30940 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22  trcmp(azCmd[0],"
30950 6c 69 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  list")==0 ){.   
30960 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
30970 3e 6e 53 65 73 73 69 6f 6e 3b 20 69 2b 2b 29 7b  >nSession; i++){
30980 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
30990 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64  intf(p->out, "%d
309a0 20 25 73 5c 6e 22 2c 20 69 2c 20 70 2d 3e 61 53   %s\n", i, p->aS
309b0 65 73 73 69 6f 6e 5b 69 5d 2e 7a 4e 61 6d 65 29  ession[i].zName)
309c0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
309d0 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73  lse..    /* .ses
309e0 73 69 6f 6e 20 6f 70 65 6e 20 44 42 20 4e 41 4d  sion open DB NAM
309f0 45 0a 20 20 20 20 2a 2a 20 4f 70 65 6e 20 61 20  E.    ** Open a 
30a00 6e 65 77 20 73 65 73 73 69 6f 6e 20 63 61 6c 6c  new session call
30a10 65 64 20 4e 41 4d 45 20 6f 6e 20 74 68 65 20 61  ed NAME on the a
30a20 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
30a30 20 44 42 2e 0a 20 20 20 20 2a 2a 20 44 42 20 69   DB..    ** DB i
30a40 73 20 6e 6f 72 6d 61 6c 6c 79 20 22 6d 61 69 6e  s normally "main
30a50 22 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  "..    */.    if
30a60 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30  ( strcmp(azCmd[0
30a70 5d 2c 22 6f 70 65 6e 22 29 3d 3d 30 20 29 7b 0a  ],"open")==0 ){.
30a80 20 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d        char *zNam
30a90 65 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6d  e;.      if( nCm
30aa0 64 21 3d 33 20 29 20 67 6f 74 6f 20 73 65 73 73  d!=3 ) goto sess
30ab0 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72  ion_syntax_error
30ac0 3b 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20  ;.      zName = 
30ad0 61 7a 43 6d 64 5b 32 5d 3b 0a 20 20 20 20 20 20  azCmd[2];.      
30ae0 69 66 28 20 7a 4e 61 6d 65 5b 30 5d 3d 3d 30 20  if( zName[0]==0 
30af0 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73  ) goto session_s
30b00 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20  yntax_error;.   
30b10 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
30b20 3e 6e 53 65 73 73 69 6f 6e 3b 20 69 2b 2b 29 7b  >nSession; i++){
30b30 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72  .        if( str
30b40 63 6d 70 28 70 2d 3e 61 53 65 73 73 69 6f 6e 5b  cmp(p->aSession[
30b50 69 5d 2e 7a 4e 61 6d 65 2c 7a 4e 61 6d 65 29 3d  i].zName,zName)=
30b60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
30b70 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
30b80 72 72 2c 20 22 53 65 73 73 69 6f 6e 20 5c 22 25  rr, "Session \"%
30b90 73 5c 22 20 61 6c 72 65 61 64 79 20 65 78 69 73  s\" already exis
30ba0 74 73 5c 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ts\n", zName);. 
30bb0 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65           goto me
30bc0 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
30bd0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
30be0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
30bf0 6e 53 65 73 73 69 6f 6e 3e 3d 41 72 72 61 79 53  nSession>=ArrayS
30c00 69 7a 65 28 70 2d 3e 61 53 65 73 73 69 6f 6e 29  ize(p->aSession)
30c10 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
30c20 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
30c30 4d 61 78 69 6d 75 6d 20 6f 66 20 25 64 20 73 65  Maximum of %d se
30c40 73 73 69 6f 6e 73 5c 6e 22 2c 20 41 72 72 61 79  ssions\n", Array
30c50 53 69 7a 65 28 70 2d 3e 61 53 65 73 73 69 6f 6e  Size(p->aSession
30c60 29 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f  ));.        goto
30c70 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
30c80 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  it;.      }.    
30c90 20 20 70 53 65 73 73 69 6f 6e 20 3d 20 26 70 2d    pSession = &p-
30ca0 3e 61 53 65 73 73 69 6f 6e 5b 70 2d 3e 6e 53 65  >aSession[p->nSe
30cb0 73 73 69 6f 6e 5d 3b 0a 20 20 20 20 20 20 72 63  ssion];.      rc
30cc0 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f   = sqlite3sessio
30cd0 6e 5f 63 72 65 61 74 65 28 70 2d 3e 64 62 2c 20  n_create(p->db, 
30ce0 61 7a 43 6d 64 5b 31 5d 2c 20 26 70 53 65 73 73  azCmd[1], &pSess
30cf0 69 6f 6e 2d 3e 70 29 3b 0a 20 20 20 20 20 20 69  ion->p);.      i
30d00 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
30d10 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
30d20 72 72 2c 20 22 43 61 6e 6e 6f 74 20 6f 70 65 6e  rr, "Cannot open
30d30 20 73 65 73 73 69 6f 6e 3a 20 65 72 72 6f 72 20   session: error 
30d40 63 6f 64 65 3d 25 64 5c 6e 22 2c 20 72 63 29 3b  code=%d\n", rc);
30d50 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 30 3b  .        rc = 0;
30d60 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  .        goto me
30d70 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
30d80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
30d90 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72  Session->nFilter
30da0 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
30db0 74 65 33 73 65 73 73 69 6f 6e 5f 74 61 62 6c 65  te3session_table
30dc0 5f 66 69 6c 74 65 72 28 70 53 65 73 73 69 6f 6e  _filter(pSession
30dd0 2d 3e 70 2c 20 73 65 73 73 69 6f 6e 5f 66 69 6c  ->p, session_fil
30de0 74 65 72 2c 20 70 53 65 73 73 69 6f 6e 29 3b 0a  ter, pSession);.
30df0 20 20 20 20 20 20 70 2d 3e 6e 53 65 73 73 69 6f        p->nSessio
30e00 6e 2b 2b 3b 0a 20 20 20 20 20 20 70 53 65 73 73  n++;.      pSess
30e10 69 6f 6e 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  ion->zName = sql
30e20 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73  ite3_mprintf("%s
30e30 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d  ", zName);.    }
30e40 65 6c 73 65 0a 20 20 20 20 2f 2a 20 49 66 20 6e  else.    /* If n
30e50 6f 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 6d  o command name m
30e60 61 74 63 68 65 73 2c 20 73 68 6f 77 20 61 20 73  atches, show a s
30e70 79 6e 74 61 78 20 65 72 72 6f 72 20 2a 2f 0a 20  yntax error */. 
30e80 20 20 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61     session_synta
30e90 78 5f 65 72 72 6f 72 3a 0a 20 20 20 20 73 65 73  x_error:.    ses
30ea0 73 69 6f 6e 5f 68 65 6c 70 28 70 29 3b 0a 20 20  sion_help(p);.  
30eb0 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 23 69  }else.#endif..#i
30ec0 66 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55  fdef SQLITE_DEBU
30ed0 47 0a 20 20 2f 2a 20 55 6e 64 6f 63 75 6d 65 6e  G.  /* Undocumen
30ee0 74 65 64 20 63 6f 6d 6d 61 6e 64 73 20 66 6f 72  ted commands for
30ef0 20 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 69 6e   internal testin
30f00 67 2e 20 20 53 75 62 6a 65 63 74 20 74 6f 20 63  g.  Subject to c
30f10 68 61 6e 67 65 0a 20 20 2a 2a 20 77 69 74 68 6f  hange.  ** witho
30f20 75 74 20 6e 6f 74 69 63 65 2e 20 2a 2f 0a 20 20  ut notice. */.  
30f30 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20 6e 3e  if( c=='s' && n>
30f40 3d 31 30 20 26 26 20 73 74 72 6e 63 6d 70 28 61  =10 && strncmp(a
30f50 7a 41 72 67 5b 30 5d 2c 20 22 73 65 6c 66 74 65  zArg[0], "selfte
30f60 73 74 2d 22 2c 20 39 29 3d 3d 30 20 29 7b 0a 20  st-", 9)==0 ){. 
30f70 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61     if( strncmp(a
30f80 7a 41 72 67 5b 30 5d 2b 39 2c 20 22 62 6f 6f 6c  zArg[0]+9, "bool
30f90 65 61 6e 22 2c 20 6e 2d 39 29 3d 3d 30 20 29 7b  ean", n-9)==0 ){
30fa0 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20 76 3b  .      int i, v;
30fb0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  .      for(i=1; 
30fc0 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
30fd0 20 20 20 20 20 20 76 20 3d 20 62 6f 6f 6c 65 61        v = boolea
30fe0 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 69 5d 29  nValue(azArg[i])
30ff0 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  ;.        utf8_p
31000 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
31010 73 3a 20 25 64 20 30 78 25 78 5c 6e 22 2c 20 61  s: %d 0x%x\n", a
31020 7a 41 72 67 5b 69 5d 2c 20 76 2c 20 76 29 3b 0a  zArg[i], v, v);.
31030 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
31040 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61 7a    if( strncmp(az
31050 41 72 67 5b 30 5d 2b 39 2c 20 22 69 6e 74 65 67  Arg[0]+9, "integ
31060 65 72 22 2c 20 6e 2d 39 29 3d 3d 30 20 29 7b 0a  er", n-9)==0 ){.
31070 20 20 20 20 20 20 69 6e 74 20 69 3b 20 73 71 6c        int i; sql
31080 69 74 65 33 5f 69 6e 74 36 34 20 76 3b 0a 20 20  ite3_int64 v;.  
31090 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
310a0 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
310b0 20 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30     char zBuf[200
310c0 5d 3b 0a 20 20 20 20 20 20 20 20 76 20 3d 20 69  ];.        v = i
310d0 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72  ntegerValue(azAr
310e0 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73  g[i]);.        s
310f0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
31100 73 69 7a 65 6f 66 28 7a 42 75 66 29 2c 7a 42 75  sizeof(zBuf),zBu
31110 66 2c 22 25 73 3a 20 25 6c 6c 64 20 30 78 25 6c  f,"%s: %lld 0x%l
31120 6c 78 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 2c  lx\n", azArg[i],
31130 76 2c 76 29 3b 0a 20 20 20 20 20 20 20 20 75 74  v,v);.        ut
31140 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
31150 2c 20 22 25 73 22 2c 20 7a 42 75 66 29 3b 0a 20  , "%s", zBuf);. 
31160 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
31170 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69  else.#endif..  i
31180 66 28 20 63 3d 3d 27 73 27 20 26 26 20 6e 3e 3d  f( c=='s' && n>=
31190 34 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  4 && strncmp(azA
311a0 72 67 5b 30 5d 2c 22 73 65 6c 66 74 65 73 74 22  rg[0],"selftest"
311b0 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  ,n)==0 ){.    in
311c0 74 20 62 49 73 49 6e 69 74 20 3d 20 30 3b 20 20  t bIsInit = 0;  
311d0 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74         /* True t
311e0 6f 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  o initialize the
311f0 20 53 45 4c 46 54 45 53 54 20 74 61 62 6c 65 20   SELFTEST table 
31200 2a 2f 0a 20 20 20 20 69 6e 74 20 62 56 65 72 62  */.    int bVerb
31210 6f 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ose = 0;        
31220 2f 2a 20 56 65 72 62 6f 73 65 20 6f 75 74 70 75  /* Verbose outpu
31230 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 53 65  t */.    int bSe
31240 6c 66 74 65 73 74 45 78 69 73 74 73 3b 20 20 20  lftestExists;   
31250 20 20 2f 2a 20 54 72 75 65 20 69 66 20 53 45 4c    /* True if SEL
31260 46 54 45 53 54 20 61 6c 72 65 61 64 79 20 65 78  FTEST already ex
31270 69 73 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ists */.    int 
31280 69 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20  i, k;           
31290 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
312a0 6e 74 65 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74  nters */.    int
312b0 20 6e 54 65 73 74 20 3d 20 30 3b 20 20 20 20 20   nTest = 0;     
312c0 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
312d0 6f 66 20 74 65 73 74 73 20 72 75 6e 73 20 2a 2f  of tests runs */
312e0 0a 20 20 20 20 69 6e 74 20 6e 45 72 72 20 3d 20  .    int nErr = 
312f0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  0;            /*
31300 20 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   Number of error
31310 73 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 53 68  s seen */.    Sh
31320 65 6c 6c 54 65 78 74 20 73 74 72 3b 20 20 20 20  ellText str;    
31330 20 20 20 20 20 20 20 2f 2a 20 41 6e 73 77 65 72         /* Answer
31340 20 66 6f 72 20 61 20 71 75 65 72 79 20 2a 2f 0a   for a query */.
31350 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
31360 20 2a 70 53 74 6d 74 20 3d 20 30 3b 20 2f 2a 20   *pStmt = 0; /* 
31370 51 75 65 72 79 20 61 67 61 69 6e 73 74 20 74 68  Query against th
31380 65 20 53 45 4c 46 54 45 53 54 20 74 61 62 6c 65  e SELFTEST table
31390 20 2a 2f 0a 0a 20 20 20 20 6f 70 65 6e 5f 64 62   */..    open_db
313a0 28 70 2c 30 29 3b 0a 20 20 20 20 66 6f 72 28 69  (p,0);.    for(i
313b0 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29  =1; i<nArg; i++)
313c0 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  {.      const ch
313d0 61 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d  ar *z = azArg[i]
313e0 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d  ;.      if( z[0]
313f0 3d 3d 27 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d 27  =='-' && z[1]=='
31400 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20  -' ) z++;.      
31410 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 69  if( strcmp(z,"-i
31420 6e 69 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nit")==0 ){.    
31430 20 20 20 20 62 49 73 49 6e 69 74 20 3d 20 31 3b      bIsInit = 1;
31440 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20  .      }else.   
31450 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c     if( strcmp(z,
31460 22 2d 76 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  "-v")==0 ){.    
31470 20 20 20 20 62 56 65 72 62 6f 73 65 2b 2b 3b 0a      bVerbose++;.
31480 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20        }else.    
31490 20 20 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38    {.        utf8
314a0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
314b0 22 55 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 20  "Unknown option 
314c0 5c 22 25 73 5c 22 20 6f 6e 20 5c 22 25 73 5c 22  \"%s\" on \"%s\"
314d0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
314e0 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b 69           azArg[i
314f0 5d 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20  ], azArg[0]);.  
31500 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
31510 28 73 74 64 65 72 72 2c 20 22 53 68 6f 75 6c 64  (stderr, "Should
31520 20 62 65 20 6f 6e 65 20 6f 66 3a 20 2d 2d 69 6e   be one of: --in
31530 69 74 20 2d 76 5c 6e 22 29 3b 0a 20 20 20 20 20  it -v\n");.     
31540 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
31550 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
31560 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20  mand_exit;.     
31570 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
31580 20 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63   sqlite3_table_c
31590 6f 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 70  olumn_metadata(p
315a0 2d 3e 64 62 2c 22 6d 61 69 6e 22 2c 22 73 65 6c  ->db,"main","sel
315b0 66 74 65 73 74 22 2c 30 2c 30 2c 30 2c 30 2c 30  ftest",0,0,0,0,0
315c0 2c 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 21  ,0).           !
315d0 3d 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  = SQLITE_OK ){. 
315e0 20 20 20 20 20 62 53 65 6c 66 74 65 73 74 45 78       bSelftestEx
315f0 69 73 74 73 20 3d 20 30 3b 0a 20 20 20 20 7d 65  ists = 0;.    }e
31600 6c 73 65 7b 0a 20 20 20 20 20 20 62 53 65 6c 66  lse{.      bSelf
31610 74 65 73 74 45 78 69 73 74 73 20 3d 20 31 3b 0a  testExists = 1;.
31620 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 49      }.    if( bI
31630 73 49 6e 69 74 20 29 7b 0a 20 20 20 20 20 20 63  sInit ){.      c
31640 72 65 61 74 65 53 65 6c 66 74 65 73 74 54 61 62  reateSelftestTab
31650 6c 65 28 70 29 3b 0a 20 20 20 20 20 20 62 53 65  le(p);.      bSe
31660 6c 66 74 65 73 74 45 78 69 73 74 73 20 3d 20 31  lftestExists = 1
31670 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 69 74  ;.    }.    init
31680 54 65 78 74 28 26 73 74 72 29 3b 0a 20 20 20 20  Text(&str);.    
31690 61 70 70 65 6e 64 54 65 78 74 28 26 73 74 72 2c  appendText(&str,
316a0 20 22 78 22 2c 20 30 29 3b 0a 20 20 20 20 66 6f   "x", 0);.    fo
316b0 72 28 6b 3d 62 53 65 6c 66 74 65 73 74 45 78 69  r(k=bSelftestExi
316c0 73 74 73 3b 20 6b 3e 3d 30 3b 20 6b 2d 2d 29 7b  sts; k>=0; k--){
316d0 0a 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 31 20  .      if( k==1 
316e0 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  ){.        rc = 
316f0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
31700 76 32 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20  v2(p->db,.      
31710 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 74 6e        "SELECT tn
31720 6f 2c 6f 70 2c 63 6d 64 2c 61 6e 73 20 46 52 4f  o,op,cmd,ans FRO
31730 4d 20 73 65 6c 66 74 65 73 74 20 4f 52 44 45 52  M selftest ORDER
31740 20 42 59 20 74 6e 6f 22 2c 0a 20 20 20 20 20 20   BY tno",.      
31750 20 20 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74        -1, &pStmt
31760 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 0);.      }els
31770 65 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  e{.        rc = 
31780 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
31790 76 32 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20  v2(p->db,.      
317a0 20 20 20 20 22 56 41 4c 55 45 53 28 30 2c 27 6d      "VALUES(0,'m
317b0 65 6d 6f 27 2c 27 4d 69 73 73 69 6e 67 20 53 45  emo','Missing SE
317c0 4c 46 54 45 53 54 20 74 61 62 6c 65 20 2d 20 64  LFTEST table - d
317d0 65 66 61 75 6c 74 20 63 68 65 63 6b 73 20 6f 6e  efault checks on
317e0 6c 79 27 2c 27 27 29 2c 22 0a 20 20 20 20 20 20  ly',''),".      
317f0 20 20 20 20 22 20 20 20 20 20 20 28 31 2c 27 72      "      (1,'r
31800 75 6e 27 2c 27 50 52 41 47 4d 41 20 69 6e 74 65  un','PRAGMA inte
31810 67 72 69 74 79 5f 63 68 65 63 6b 27 2c 27 6f 6b  grity_check','ok
31820 27 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 2d  ')",.          -
31830 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
31840 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
31850 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72   rc ){.        r
31860 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
31870 2c 20 22 45 72 72 6f 72 20 71 75 65 72 79 69 6e  , "Error queryin
31880 67 20 74 68 65 20 73 65 6c 66 74 65 73 74 20 74  g the selftest t
31890 61 62 6c 65 5c 6e 22 29 3b 0a 20 20 20 20 20 20  able\n");.      
318a0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
318b0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
318c0 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ze(pStmt);.     
318d0 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
318e0 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20  mand_exit;.     
318f0 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31   }.      for(i=1
31900 3b 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ; sqlite3_step(p
31910 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Stmt)==SQLITE_RO
31920 57 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  W; i++){.       
31930 20 69 6e 74 20 74 6e 6f 20 3d 20 73 71 6c 69 74   int tno = sqlit
31940 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
31950 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  tmt, 0);.       
31960 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70   const char *zOp
31970 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29   = (const char*)
31980 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
31990 65 78 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20  ext(pStmt, 1);. 
319a0 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
319b0 72 20 2a 7a 53 71 6c 20 3d 20 28 63 6f 6e 73 74  r *zSql = (const
319c0 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
319d0 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
319e0 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  , 2);.        co
319f0 6e 73 74 20 63 68 61 72 20 2a 7a 41 6e 73 20 3d  nst char *zAns =
31a00 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
31a10 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
31a20 74 28 70 53 74 6d 74 2c 20 33 29 3b 0a 0a 20 20  t(pStmt, 3);..  
31a30 20 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20        k = 0;.   
31a40 20 20 20 20 20 69 66 28 20 62 56 65 72 62 6f 73       if( bVerbos
31a50 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  e>0 ){.         
31a60 20 63 68 61 72 20 2a 7a 51 75 6f 74 65 20 3d 20   char *zQuote = 
31a70 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
31a80 22 25 71 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20  "%q", zSql);.   
31a90 20 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25         printf("%
31aa0 64 3a 20 25 73 20 25 73 5c 6e 22 2c 20 74 6e 6f  d: %s %s\n", tno
31ab0 2c 20 7a 4f 70 2c 20 7a 53 71 6c 29 3b 0a 20 20  , zOp, zSql);.  
31ac0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
31ad0 66 72 65 65 28 7a 51 75 6f 74 65 29 3b 0a 20 20  free(zQuote);.  
31ae0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31af0 69 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c 22  if( strcmp(zOp,"
31b00 6d 65 6d 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20  memo")==0 ){.   
31b10 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
31b20 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  tf(p->out, "%s\n
31b30 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20  ", zSql);.      
31b40 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20    }else.        
31b50 69 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c 22  if( strcmp(zOp,"
31b60 72 75 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  run")==0 ){.    
31b70 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72        char *zErr
31b80 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  Msg = 0;.       
31b90 20 20 20 73 74 72 2e 6e 20 3d 20 30 3b 0a 20 20     str.n = 0;.  
31ba0 20 20 20 20 20 20 20 20 73 74 72 2e 7a 5b 30 5d          str.z[0]
31bb0 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
31bc0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65  rc = sqlite3_exe
31bd0 63 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 63  c(p->db, zSql, c
31be0 61 70 74 75 72 65 4f 75 74 70 75 74 43 61 6c 6c  aptureOutputCall
31bf0 62 61 63 6b 2c 20 26 73 74 72 2c 20 26 7a 45 72  back, &str, &zEr
31c00 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  rMsg);.         
31c10 20 6e 54 65 73 74 2b 2b 3b 0a 20 20 20 20 20 20   nTest++;.      
31c20 20 20 20 20 69 66 28 20 62 56 65 72 62 6f 73 65      if( bVerbose
31c30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
31c40 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
31c50 75 74 2c 20 22 52 65 73 75 6c 74 3a 20 25 73 5c  ut, "Result: %s\
31c60 6e 22 2c 20 73 74 72 2e 7a 29 3b 0a 20 20 20 20  n", str.z);.    
31c70 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
31c80 20 20 69 66 28 20 72 63 20 7c 7c 20 7a 45 72 72    if( rc || zErr
31c90 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Msg ){.         
31ca0 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20     nErr++;.     
31cb0 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
31cc0 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f             utf8_
31cd0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
31ce0 25 64 3a 20 65 72 72 6f 72 2d 63 6f 64 65 2d 25  %d: error-code-%
31cf0 64 3a 20 25 73 5c 6e 22 2c 20 74 6e 6f 2c 20 72  d: %s\n", tno, r
31d00 63 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  c, zErrMsg);.   
31d10 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
31d20 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a  _free(zErrMsg);.
31d30 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
31d40 69 66 28 20 73 74 72 63 6d 70 28 7a 41 6e 73 2c  if( strcmp(zAns,
31d50 73 74 72 2e 7a 29 21 3d 30 20 29 7b 0a 20 20 20  str.z)!=0 ){.   
31d60 20 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b           nErr++;
31d70 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20  .            rc 
31d80 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 1;.           
31d90 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
31da0 6f 75 74 2c 20 22 25 64 3a 20 45 78 70 65 63 74  out, "%d: Expect
31db0 65 64 3a 20 5b 25 73 5d 5c 6e 22 2c 20 74 6e 6f  ed: [%s]\n", tno
31dc0 2c 20 7a 41 6e 73 29 3b 0a 20 20 20 20 20 20 20  , zAns);.       
31dd0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
31de0 28 70 2d 3e 6f 75 74 2c 20 22 25 64 3a 20 20 20  (p->out, "%d:   
31df0 20 20 20 47 6f 74 3a 20 5b 25 73 5d 5c 6e 22 2c     Got: [%s]\n",
31e00 20 74 6e 6f 2c 20 73 74 72 2e 7a 29 3b 0a 20 20   tno, str.z);.  
31e10 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
31e20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20    }else.        
31e30 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
31e40 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a  _printf(stderr,.
31e50 20 20 20 20 20 20 20 20 20 20 20 20 22 55 6e 6b              "Unk
31e60 6e 6f 77 6e 20 6f 70 65 72 61 74 69 6f 6e 20 5c  nown operation \
31e70 22 25 73 5c 22 20 6f 6e 20 73 65 6c 66 74 65 73  "%s\" on selftes
31e80 74 20 6c 69 6e 65 20 25 64 5c 6e 22 2c 20 7a 4f  t line %d\n", zO
31e90 70 2c 20 74 6e 6f 29 3b 0a 20 20 20 20 20 20 20  p, tno);.       
31ea0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
31eb0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
31ec0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a      }.      } /*
31ed0 20 45 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 72   End loop over r
31ee0 6f 77 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 66  ows of content f
31ef0 72 6f 6d 20 53 45 4c 46 54 45 53 54 20 2a 2f 0a  rom SELFTEST */.
31f00 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
31f10 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
31f20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70     } /* End loop
31f30 20 6f 76 65 72 20 6b 20 2a 2f 0a 20 20 20 20 66   over k */.    f
31f40 72 65 65 54 65 78 74 28 26 73 74 72 29 3b 0a 20  reeText(&str);. 
31f50 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
31f60 2d 3e 6f 75 74 2c 20 22 25 64 20 65 72 72 6f 72  ->out, "%d error
31f70 73 20 6f 75 74 20 6f 66 20 25 64 20 74 65 73 74  s out of %d test
31f80 73 5c 6e 22 2c 20 6e 45 72 72 2c 20 6e 54 65 73  s\n", nErr, nTes
31f90 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69  t);.  }else..  i
31fa0 66 28 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72  f( c=='s' && str
31fb0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
31fc0 73 65 70 61 72 61 74 6f 72 22 2c 20 6e 29 3d 3d  separator", n)==
31fd0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  0 ){.    if( nAr
31fe0 67 3c 32 20 7c 7c 20 6e 41 72 67 3e 33 20 29 7b  g<2 || nArg>3 ){
31ff0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
32000 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
32010 3a 20 2e 73 65 70 61 72 61 74 6f 72 20 43 4f 4c  : .separator COL
32020 20 3f 52 4f 57 3f 5c 6e 22 29 3b 0a 20 20 20 20   ?ROW?\n");.    
32030 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
32040 20 20 20 20 69 66 28 20 6e 41 72 67 3e 3d 32 20      if( nArg>=2 
32050 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
32060 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
32070 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72  (p->colSeparator
32080 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  ), p->colSeparat
32090 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  or,.            
320a0 20 20 20 20 20 20 20 20 20 20 20 22 25 2e 2a 73             "%.*s
320b0 22 2c 20 28 69 6e 74 29 41 72 72 61 79 53 69 7a  ", (int)ArraySiz
320c0 65 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  e(p->colSeparato
320d0 72 29 2d 31 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  r)-1, azArg[1]);
320e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e  .    }.    if( n
320f0 41 72 67 3e 3d 33 20 29 7b 0a 20 20 20 20 20 20  Arg>=3 ){.      
32100 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
32110 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65  (sizeof(p->rowSe
32120 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77  parator), p->row
32130 53 65 70 61 72 61 74 6f 72 2c 0a 20 20 20 20 20  Separator,.     
32140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32150 20 20 22 25 2e 2a 73 22 2c 20 28 69 6e 74 29 41    "%.*s", (int)A
32160 72 72 61 79 53 69 7a 65 28 70 2d 3e 72 6f 77 53  rraySize(p->rowS
32170 65 70 61 72 61 74 6f 72 29 2d 31 2c 20 61 7a 41  eparator)-1, azA
32180 72 67 5b 32 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  rg[2]);.    }.  
32190 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
321a0 27 73 27 20 26 26 20 6e 3e 3d 34 20 26 26 20 73  's' && n>=4 && s
321b0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
321c0 22 73 68 61 33 73 75 6d 22 2c 6e 29 3d 3d 30 20  "sha3sum",n)==0 
321d0 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  ){.    const cha
321e0 72 20 2a 7a 4c 69 6b 65 20 3d 20 30 3b 20 20 20  r *zLike = 0;   
321f0 2f 2a 20 57 68 69 63 68 20 74 61 62 6c 65 20 74  /* Which table t
32200 6f 20 63 68 65 63 6b 73 75 6d 2e 20 30 20 6d 65  o checksum. 0 me
32210 61 6e 73 20 65 76 65 72 79 74 68 69 6e 67 20 2a  ans everything *
32220 2f 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20  /.    int i;    
32230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
32240 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
32250 2f 0a 20 20 20 20 69 6e 74 20 62 53 63 68 65 6d  /.    int bSchem
32260 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  a = 0;         /
32270 2a 20 41 6c 73 6f 20 68 61 73 68 20 74 68 65 20  * Also hash the 
32280 73 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 69 6e  schema */.    in
32290 74 20 62 53 65 70 61 72 61 74 65 20 3d 20 30 3b  t bSeparate = 0;
322a0 20 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 65         /* Hash e
322b0 61 63 68 20 74 61 62 6c 65 20 73 65 70 61 72 61  ach table separa
322c0 74 65 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20  tely */.    int 
322d0 69 53 69 7a 65 20 3d 20 32 32 34 3b 20 20 20 20  iSize = 224;    
322e0 20 20 20 20 20 2f 2a 20 48 61 73 68 20 61 6c 67       /* Hash alg
322f0 6f 72 69 74 68 6d 20 74 6f 20 75 73 65 20 2a 2f  orithm to use */
32300 0a 20 20 20 20 69 6e 74 20 62 44 65 62 75 67 20  .    int bDebug 
32310 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 0;          /*
32320 20 4f 6e 6c 79 20 73 68 6f 77 20 74 68 65 20 71   Only show the q
32330 75 65 72 79 20 74 68 61 74 20 77 6f 75 6c 64 20  uery that would 
32340 68 61 76 65 20 72 75 6e 20 2a 2f 0a 20 20 20 20  have run */.    
32350 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
32360 74 6d 74 3b 20 20 20 20 20 2f 2a 20 46 6f 72 20  tmt;     /* For 
32370 71 75 65 72 79 69 6e 67 20 74 61 62 6c 65 73 20  querying tables 
32380 6e 61 6d 65 73 20 2a 2f 0a 20 20 20 20 63 68 61  names */.    cha
32390 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20  r *zSql;        
323a0 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 74 6f 20        /* SQL to 
323b0 62 65 20 72 75 6e 20 2a 2f 0a 20 20 20 20 63 68  be run */.    ch
323c0 61 72 20 2a 7a 53 65 70 3b 20 20 20 20 20 20 20  ar *zSep;       
323d0 20 20 20 20 20 20 20 2f 2a 20 53 65 70 61 72 61         /* Separa
323e0 74 6f 72 20 2a 2f 0a 20 20 20 20 53 68 65 6c 6c  tor */.    Shell
323f0 54 65 78 74 20 73 53 71 6c 3b 20 20 20 20 20 20  Text sSql;      
32400 20 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20      /* Complete 
32410 53 51 4c 20 66 6f 72 20 74 68 65 20 71 75 65 72  SQL for the quer
32420 79 20 74 6f 20 72 75 6e 20 74 68 65 20 68 61 73  y to run the has
32430 68 20 2a 2f 0a 20 20 20 20 53 68 65 6c 6c 54 65  h */.    ShellTe
32440 78 74 20 73 51 75 65 72 79 3b 20 20 20 20 20 20  xt sQuery;      
32450 20 20 2f 2a 20 53 65 74 20 6f 66 20 71 75 65 72    /* Set of quer
32460 69 65 73 20 75 73 65 64 20 74 6f 20 72 65 61 64  ies used to read
32470 20 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a   all content */.
32480 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
32490 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  );.    for(i=1; 
324a0 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
324b0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
324c0 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20  z = azArg[i];.  
324d0 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d      if( z[0]=='-
324e0 27 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 2b 2b  ' ){.        z++
324f0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b  ;.        if( z[
32500 30 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20  0]=='-' ) z++;. 
32510 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d         if( strcm
32520 70 28 7a 2c 22 73 63 68 65 6d 61 22 29 3d 3d 30  p(z,"schema")==0
32530 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 53   ){.          bS
32540 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20  chema = 1;.     
32550 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20     }else.       
32560 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 73   if( strcmp(z,"s
32570 68 61 33 2d 32 32 34 22 29 3d 3d 30 20 7c 7c 20  ha3-224")==0 || 
32580 73 74 72 63 6d 70 28 7a 2c 22 73 68 61 33 2d 32  strcmp(z,"sha3-2
32590 35 36 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 20  56")==0.        
325a0 20 7c 7c 20 73 74 72 63 6d 70 28 7a 2c 22 73 68   || strcmp(z,"sh
325b0 61 33 2d 33 38 34 22 29 3d 3d 30 20 7c 7c 20 73  a3-384")==0 || s
325c0 74 72 63 6d 70 28 7a 2c 22 73 68 61 33 2d 35 31  trcmp(z,"sha3-51
325d0 32 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 29  2")==0.        )
325e0 7b 0a 20 20 20 20 20 20 20 20 20 20 69 53 69 7a  {.          iSiz
325f0 65 20 3d 20 61 74 6f 69 28 26 7a 5b 35 5d 29 3b  e = atoi(&z[5]);
32600 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20  .        }else. 
32610 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d         if( strcm
32620 70 28 7a 2c 22 64 65 62 75 67 22 29 3d 3d 30 20  p(z,"debug")==0 
32630 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 44 65  ){.          bDe
32640 62 75 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  bug = 1;.       
32650 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 7b   }else.        {
32660 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
32670 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
32680 55 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 20 5c  Unknown option \
32690 22 25 73 5c 22 20 6f 6e 20 5c 22 25 73 5c 22 5c  "%s\" on \"%s\"\
326a0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
326b0 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b            azArg[
326c0 69 5d 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20  i], azArg[0]);. 
326d0 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
326e0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 68 6f  ntf(stderr, "Sho
326f0 75 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 20 2d  uld be one of: -
32700 2d 73 63 68 65 6d 61 22 0a 20 20 20 20 20 20 20  -schema".       
32710 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32720 20 20 20 20 20 20 22 20 2d 2d 73 68 61 33 2d 32        " --sha3-2
32730 32 34 20 2d 2d 73 68 61 33 2d 32 35 35 20 2d 2d  24 --sha3-255 --
32740 73 68 61 33 2d 33 38 34 20 2d 2d 73 68 61 33 2d  sha3-384 --sha3-
32750 35 31 32 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  512\n");.       
32760 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
32770 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
32780 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
32790 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
327a0 73 65 20 69 66 28 20 7a 4c 69 6b 65 20 29 7b 0a  se if( zLike ){.
327b0 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
327c0 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
327d0 65 3a 20 2e 73 68 61 33 73 75 6d 20 3f 4f 50 54  e: .sha3sum ?OPT
327e0 49 4f 4e 53 3f 20 3f 4c 49 4b 45 2d 50 41 54 54  IONS? ?LIKE-PATT
327f0 45 52 4e 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ERN?\n");.      
32800 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
32810 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
32820 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  and_exit;.      
32830 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a  }else{.        z
32840 4c 69 6b 65 20 3d 20 7a 3b 0a 20 20 20 20 20 20  Like = z;.      
32850 20 20 62 53 65 70 61 72 61 74 65 20 3d 20 31 3b    bSeparate = 1;
32860 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
32870 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 73 71  ite3_strlike("sq
32880 6c 69 74 65 5f 25 22 2c 20 7a 4c 69 6b 65 2c 20  lite_%", zLike, 
32890 30 29 3d 3d 30 20 29 20 62 53 63 68 65 6d 61 20  0)==0 ) bSchema 
328a0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  = 1;.      }.   
328b0 20 7d 0a 20 20 20 20 69 66 28 20 62 53 63 68 65   }.    if( bSche
328c0 6d 61 20 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c  ma ){.      zSql
328d0 20 3d 20 22 53 45 4c 45 43 54 20 6c 6f 77 65 72   = "SELECT lower
328e0 28 6e 61 6d 65 29 20 46 52 4f 4d 20 73 71 6c 69  (name) FROM sqli
328f0 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20  te_master".     
32900 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20          " WHERE 
32910 74 79 70 65 3d 27 74 61 62 6c 65 27 20 41 4e 44  type='table' AND
32920 20 63 6f 61 6c 65 73 63 65 28 72 6f 6f 74 70 61   coalesce(rootpa
32930 67 65 2c 30 29 3e 31 22 0a 20 20 20 20 20 20 20  ge,0)>1".       
32940 20 20 20 20 20 20 22 20 55 4e 49 4f 4e 20 41 4c        " UNION AL
32950 4c 20 53 45 4c 45 43 54 20 27 73 71 6c 69 74 65  L SELECT 'sqlite
32960 5f 6d 61 73 74 65 72 27 22 0a 20 20 20 20 20 20  _master'".      
32970 20 20 20 20 20 20 20 22 20 4f 52 44 45 52 20 42         " ORDER B
32980 59 20 31 20 63 6f 6c 6c 61 74 65 20 6e 6f 63 61  Y 1 collate noca
32990 73 65 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  se";.    }else{.
329a0 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 22 53 45        zSql = "SE
329b0 4c 45 43 54 20 6c 6f 77 65 72 28 6e 61 6d 65 29  LECT lower(name)
329c0 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
329d0 74 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20  ter".           
329e0 20 20 22 20 57 48 45 52 45 20 74 79 70 65 3d 27    " WHERE type='
329f0 74 61 62 6c 65 27 20 41 4e 44 20 63 6f 61 6c 65  table' AND coale
32a00 73 63 65 28 72 6f 6f 74 70 61 67 65 2c 30 29 3e  sce(rootpage,0)>
32a10 31 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1".             
32a20 22 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 4c  " AND name NOT L
32a30 49 4b 45 20 27 73 71 6c 69 74 65 5f 25 27 22 0a  IKE 'sqlite_%'".
32a40 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 4f               " O
32a50 52 44 45 52 20 42 59 20 31 20 63 6f 6c 6c 61 74  RDER BY 1 collat
32a60 65 20 6e 6f 63 61 73 65 22 3b 0a 20 20 20 20 7d  e nocase";.    }
32a70 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 65  .    sqlite3_pre
32a80 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a  pare_v2(p->db, z
32a90 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c  Sql, -1, &pStmt,
32aa0 20 30 29 3b 0a 20 20 20 20 69 6e 69 74 54 65 78   0);.    initTex
32ab0 74 28 26 73 51 75 65 72 79 29 3b 0a 20 20 20 20  t(&sQuery);.    
32ac0 69 6e 69 74 54 65 78 74 28 26 73 53 71 6c 29 3b  initText(&sSql);
32ad0 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28  .    appendText(
32ae0 26 73 53 71 6c 2c 20 22 57 49 54 48 20 5b 73 68  &sSql, "WITH [sh
32af0 61 33 73 75 6d 24 71 75 65 72 79 5d 28 61 2c 62  a3sum$query](a,b
32b00 29 20 41 53 28 22 2c 30 29 3b 0a 20 20 20 20 7a  ) AS(",0);.    z
32b10 53 65 70 20 3d 20 22 56 41 4c 55 45 53 28 22 3b  Sep = "VALUES(";
32b20 0a 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49  .    while( SQLI
32b30 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
32b40 73 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20  step(pStmt) ){. 
32b50 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
32b60 2a 7a 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63  *zTab = (const c
32b70 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
32b80 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 30  umn_text(pStmt,0
32b90 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69  );.      if( zLi
32ba0 6b 65 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  ke && sqlite3_st
32bb0 72 6c 69 6b 65 28 7a 4c 69 6b 65 2c 20 7a 54 61  rlike(zLike, zTa
32bc0 62 2c 20 30 29 21 3d 30 20 29 20 63 6f 6e 74 69  b, 0)!=0 ) conti
32bd0 6e 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73  nue;.      if( s
32be0 74 72 6e 63 6d 70 28 7a 54 61 62 2c 20 22 73 71  trncmp(zTab, "sq
32bf0 6c 69 74 65 5f 22 2c 37 29 21 3d 30 20 29 7b 0a  lite_",7)!=0 ){.
32c00 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
32c10 78 74 28 26 73 51 75 65 72 79 2c 22 53 45 4c 45  xt(&sQuery,"SELE
32c20 43 54 20 2a 20 46 52 4f 4d 20 22 2c 20 30 29 3b  CT * FROM ", 0);
32c30 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
32c40 65 78 74 28 26 73 51 75 65 72 79 2c 7a 54 61 62  ext(&sQuery,zTab
32c50 2c 27 22 27 29 3b 0a 20 20 20 20 20 20 20 20 61  ,'"');.        a
32c60 70 70 65 6e 64 54 65 78 74 28 26 73 51 75 65 72  ppendText(&sQuer
32c70 79 2c 22 20 4e 4f 54 20 49 4e 44 45 58 45 44 3b  y," NOT INDEXED;
32c80 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ", 0);.      }el
32c90 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54  se if( strcmp(zT
32ca0 61 62 2c 20 22 73 71 6c 69 74 65 5f 6d 61 73 74  ab, "sqlite_mast
32cb0 65 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  er")==0 ){.     
32cc0 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
32cd0 51 75 65 72 79 2c 22 53 45 4c 45 43 54 20 74 79  Query,"SELECT ty
32ce0 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65  pe,name,tbl_name
32cf0 2c 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65  ,sql FROM sqlite
32d00 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20 20  _master".       
32d10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d20 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 6e      " ORDER BY n
32d30 61 6d 65 3b 22 2c 20 30 29 3b 0a 20 20 20 20 20  ame;", 0);.     
32d40 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
32d50 70 28 7a 54 61 62 2c 20 22 73 71 6c 69 74 65 5f  p(zTab, "sqlite_
32d60 73 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b  sequence")==0 ){
32d70 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
32d80 65 78 74 28 26 73 51 75 65 72 79 2c 22 53 45 4c  ext(&sQuery,"SEL
32d90 45 43 54 20 6e 61 6d 65 2c 73 65 71 20 46 52 4f  ECT name,seq FRO
32da0 4d 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63  M sqlite_sequenc
32db0 65 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e".             
32dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
32dd0 4f 52 44 45 52 20 42 59 20 6e 61 6d 65 3b 22 2c  ORDER BY name;",
32de0 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   0);.      }else
32df0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54 61 62   if( strcmp(zTab
32e00 2c 20 22 73 71 6c 69 74 65 5f 73 74 61 74 31 22  , "sqlite_stat1"
32e10 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
32e20 61 70 70 65 6e 64 54 65 78 74 28 26 73 51 75 65  appendText(&sQue
32e30 72 79 2c 22 53 45 4c 45 43 54 20 74 62 6c 2c 69  ry,"SELECT tbl,i
32e40 64 78 2c 73 74 61 74 20 46 52 4f 4d 20 73 71 6c  dx,stat FROM sql
32e50 69 74 65 5f 73 74 61 74 31 22 0a 20 20 20 20 20  ite_stat1".     
32e60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e70 20 20 20 20 20 20 22 20 4f 52 44 45 52 20 42 59        " ORDER BY
32e80 20 74 62 6c 2c 69 64 78 3b 22 2c 20 30 29 3b 0a   tbl,idx;", 0);.
32e90 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
32ea0 73 74 72 63 6d 70 28 7a 54 61 62 2c 20 22 73 71  strcmp(zTab, "sq
32eb0 6c 69 74 65 5f 73 74 61 74 33 22 29 3d 3d 30 0a  lite_stat3")==0.
32ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
32ed0 73 74 72 63 6d 70 28 7a 54 61 62 2c 20 22 73 71  strcmp(zTab, "sq
32ee0 6c 69 74 65 5f 73 74 61 74 34 22 29 3d 3d 30 20  lite_stat4")==0 
32ef0 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  ){.        appen
32f00 64 54 65 78 74 28 26 73 51 75 65 72 79 2c 20 22  dText(&sQuery, "
32f10 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 22 2c  SELECT * FROM ",
32f20 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70   0);.        app
32f30 65 6e 64 54 65 78 74 28 26 73 51 75 65 72 79 2c  endText(&sQuery,
32f40 20 7a 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20   zTab, 0);.     
32f50 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
32f60 51 75 65 72 79 2c 20 22 20 4f 52 44 45 52 20 42  Query, " ORDER B
32f70 59 20 74 62 6c 2c 20 69 64 78 2c 20 72 6f 77 69  Y tbl, idx, rowi
32f80 64 3b 5c 6e 22 2c 20 30 29 3b 0a 20 20 20 20 20  d;\n", 0);.     
32f90 20 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54   }.      appendT
32fa0 65 78 74 28 26 73 53 71 6c 2c 20 7a 53 65 70 2c  ext(&sSql, zSep,
32fb0 20 30 29 3b 0a 20 20 20 20 20 20 61 70 70 65 6e   0);.      appen
32fc0 64 54 65 78 74 28 26 73 53 71 6c 2c 20 73 51 75  dText(&sSql, sQu
32fd0 65 72 79 2e 7a 2c 20 27 5c 27 27 29 3b 0a 20 20  ery.z, '\'');.  
32fe0 20 20 20 20 73 51 75 65 72 79 2e 6e 20 3d 20 30      sQuery.n = 0
32ff0 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65  ;.      appendTe
33000 78 74 28 26 73 53 71 6c 2c 20 22 2c 22 2c 20 30  xt(&sSql, ",", 0
33010 29 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54  );.      appendT
33020 65 78 74 28 26 73 53 71 6c 2c 20 7a 54 61 62 2c  ext(&sSql, zTab,
33030 20 27 5c 27 27 29 3b 0a 20 20 20 20 20 20 7a 53   '\'');.      zS
33040 65 70 20 3d 20 22 29 2c 28 22 3b 0a 20 20 20 20  ep = "),(";.    
33050 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69  }.    sqlite3_fi
33060 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
33070 20 20 20 69 66 28 20 62 53 65 70 61 72 61 74 65     if( bSeparate
33080 20 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d   ){.      zSql =
33090 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
330a0 28 0a 20 20 20 20 20 20 20 20 20 20 22 25 73 29  (.          "%s)
330b0 29 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 53  )".          " S
330c0 45 4c 45 43 54 20 6c 6f 77 65 72 28 68 65 78 28  ELECT lower(hex(
330d0 73 68 61 33 5f 71 75 65 72 79 28 61 2c 25 64 29  sha3_query(a,%d)
330e0 29 29 20 41 53 20 68 61 73 68 2c 20 62 20 41 53  )) AS hash, b AS
330f0 20 6c 61 62 65 6c 22 0a 20 20 20 20 20 20 20 20   label".        
33100 20 20 22 20 20 20 46 52 4f 4d 20 5b 73 68 61 33    "   FROM [sha3
33110 73 75 6d 24 71 75 65 72 79 5d 22 2c 0a 20 20 20  sum$query]",.   
33120 20 20 20 20 20 20 20 73 53 71 6c 2e 7a 2c 20 69         sSql.z, i
33130 53 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65  Size);.    }else
33140 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73  {.      zSql = s
33150 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a  qlite3_mprintf(.
33160 20 20 20 20 20 20 20 20 20 20 22 25 73 29 29 22            "%s))"
33170 0a 20 20 20 20 20 20 20 20 20 20 22 20 53 45 4c  .          " SEL
33180 45 43 54 20 6c 6f 77 65 72 28 68 65 78 28 73 68  ECT lower(hex(sh
33190 61 33 5f 71 75 65 72 79 28 67 72 6f 75 70 5f 63  a3_query(group_c
331a0 6f 6e 63 61 74 28 61 2c 27 27 29 2c 25 64 29 29  oncat(a,''),%d))
331b0 29 20 41 53 20 68 61 73 68 22 0a 20 20 20 20 20  ) AS hash".     
331c0 20 20 20 20 20 22 20 20 20 46 52 4f 4d 20 5b 73       "   FROM [s
331d0 68 61 33 73 75 6d 24 71 75 65 72 79 5d 22 2c 0a  ha3sum$query]",.
331e0 20 20 20 20 20 20 20 20 20 20 73 53 71 6c 2e 7a            sSql.z
331f0 2c 20 69 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a  , iSize);.    }.
33200 20 20 20 20 66 72 65 65 54 65 78 74 28 26 73 51      freeText(&sQ
33210 75 65 72 79 29 3b 0a 20 20 20 20 66 72 65 65 54  uery);.    freeT
33220 65 78 74 28 26 73 53 71 6c 29 3b 0a 20 20 20 20  ext(&sSql);.    
33230 69 66 28 20 62 44 65 62 75 67 20 29 7b 0a 20 20  if( bDebug ){.  
33240 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
33250 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  p->out, "%s\n", 
33260 7a 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65  zSql);.    }else
33270 7b 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f 65 78  {.      shell_ex
33280 65 63 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20  ec(p->db, zSql, 
33290 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20  shell_callback, 
332a0 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20  p, 0);.    }.   
332b0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53   sqlite3_free(zS
332c0 71 6c 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  ql);.  }else..  
332d0 69 66 28 20 63 3d 3d 27 73 27 0a 20 20 20 26 26  if( c=='s'.   &&
332e0 20 28 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b   (strncmp(azArg[
332f0 30 5d 2c 20 22 73 68 65 6c 6c 22 2c 20 6e 29 3d  0], "shell", n)=
33300 3d 30 20 7c 7c 20 73 74 72 6e 63 6d 70 28 61 7a  =0 || strncmp(az
33310 41 72 67 5b 30 5d 2c 22 73 79 73 74 65 6d 22 2c  Arg[0],"system",
33320 6e 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20  n)==0).  ){.    
33330 63 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20 20 20  char *zCmd;.    
33340 69 6e 74 20 69 2c 20 78 3b 0a 20 20 20 20 69 66  int i, x;.    if
33350 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20 20  ( nArg<2 ){.    
33360 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
33370 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73 79  err, "Usage: .sy
33380 73 74 65 6d 20 43 4f 4d 4d 41 4e 44 5c 6e 22 29  stem COMMAND\n")
33390 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
333a0 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
333b0 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
333c0 20 20 7d 0a 20 20 20 20 7a 43 6d 64 20 3d 20 73    }.    zCmd = s
333d0 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 73  qlite3_mprintf(s
333e0 74 72 63 68 72 28 61 7a 41 72 67 5b 31 5d 2c 27  trchr(azArg[1],'
333f0 20 27 29 3d 3d 30 3f 22 25 73 22 3a 22 5c 22 25   ')==0?"%s":"\"%
33400 73 5c 22 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  s\"", azArg[1]);
33410 0a 20 20 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c  .    for(i=2; i<
33420 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
33430 20 20 7a 43 6d 64 20 3d 20 73 71 6c 69 74 65 33    zCmd = sqlite3
33440 5f 6d 70 72 69 6e 74 66 28 73 74 72 63 68 72 28  _mprintf(strchr(
33450 61 7a 41 72 67 5b 69 5d 2c 27 20 27 29 3d 3d 30  azArg[i],' ')==0
33460 3f 22 25 7a 20 25 73 22 3a 22 25 7a 20 5c 22 25  ?"%z %s":"%z \"%
33470 73 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\"",.          
33480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33490 20 20 20 7a 43 6d 64 2c 20 61 7a 41 72 67 5b 69     zCmd, azArg[i
334a0 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 78 20  ]);.    }.    x 
334b0 3d 20 73 79 73 74 65 6d 28 7a 43 6d 64 29 3b 0a  = system(zCmd);.
334c0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
334d0 28 7a 43 6d 64 29 3b 0a 20 20 20 20 69 66 28 20  (zCmd);.    if( 
334e0 78 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 73  x ) raw_printf(s
334f0 74 64 65 72 72 2c 20 22 53 79 73 74 65 6d 20 63  tderr, "System c
33500 6f 6d 6d 61 6e 64 20 72 65 74 75 72 6e 73 20 25  ommand returns %
33510 64 5c 6e 22 2c 20 78 29 3b 0a 20 20 7d 65 6c 73  d\n", x);.  }els
33520 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20  e..  if( c=='s' 
33530 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
33540 5b 30 5d 2c 20 22 73 68 6f 77 22 2c 20 6e 29 3d  [0], "show", n)=
33550 3d 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63  =0 ){.    static
33560 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 42   const char *azB
33570 6f 6f 6c 5b 5d 20 3d 20 7b 20 22 6f 66 66 22 2c  ool[] = { "off",
33580 20 22 6f 6e 22 2c 20 22 74 72 69 67 67 65 72 22   "on", "trigger"
33590 2c 20 22 66 75 6c 6c 22 7d 3b 0a 20 20 20 20 69  , "full"};.    i
335a0 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 6e 41  nt i;.    if( nA
335b0 72 67 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72  rg!=1 ){.      r
335c0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
335d0 2c 20 22 55 73 61 67 65 3a 20 2e 73 68 6f 77 5c  , "Usage: .show\
335e0 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
335f0 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  1;.      goto me
33600 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
33610 0a 20 20 20 20 7d 0a 20 20 20 20 75 74 66 38 5f  .    }.    utf8_
33620 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
33630 25 31 32 2e 31 32 73 3a 20 25 73 5c 6e 22 2c 22  %12.12s: %s\n","
33640 65 63 68 6f 22 2c 0a 20 20 20 20 20 20 20 20 20  echo",.         
33650 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33660 20 20 20 20 20 20 20 20 20 61 7a 42 6f 6f 6c 5b           azBool[
33670 53 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20  ShellHasFlag(p, 
33680 53 48 46 4c 47 5f 45 63 68 6f 29 5d 29 3b 0a 20  SHFLG_Echo)]);. 
33690 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
336a0 2d 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32 73 3a  ->out, "%12.12s:
336b0 20 25 73 5c 6e 22 2c 22 65 71 70 22 2c 20 61 7a   %s\n","eqp", az
336c0 42 6f 6f 6c 5b 70 2d 3e 61 75 74 6f 45 51 50 26  Bool[p->autoEQP&
336d0 33 5d 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72  3]);.    utf8_pr
336e0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31  intf(p->out, "%1
336f0 32 2e 31 32 73 3a 20 25 73 5c 6e 22 2c 22 65 78  2.12s: %s\n","ex
33700 70 6c 61 69 6e 22 2c 0a 20 20 20 20 20 20 20 20  plain",.        
33710 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45   p->mode==MODE_E
33720 78 70 6c 61 69 6e 20 3f 20 22 6f 6e 22 20 3a 20  xplain ? "on" : 
33730 70 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20 3f  p->autoExplain ?
33740 20 22 61 75 74 6f 22 20 3a 20 22 6f 66 66 22 29   "auto" : "off")
33750 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  ;.    utf8_print
33760 66 28 70 2d 3e 6f 75 74 2c 22 25 31 32 2e 31 32  f(p->out,"%12.12
33770 73 3a 20 25 73 5c 6e 22 2c 22 68 65 61 64 65 72  s: %s\n","header
33780 73 22 2c 20 61 7a 42 6f 6f 6c 5b 70 2d 3e 73 68  s", azBool[p->sh
33790 6f 77 48 65 61 64 65 72 21 3d 30 5d 29 3b 0a 20  owHeader!=0]);. 
337a0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
337b0 2d 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32 73 3a  ->out, "%12.12s:
337c0 20 25 73 5c 6e 22 2c 22 6d 6f 64 65 22 2c 20 6d   %s\n","mode", m
337d0 6f 64 65 44 65 73 63 72 5b 70 2d 3e 6d 6f 64 65  odeDescr[p->mode
337e0 5d 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69  ]);.    utf8_pri
337f0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31 32  ntf(p->out, "%12
33800 2e 31 32 73 3a 20 22 2c 20 22 6e 75 6c 6c 76 61  .12s: ", "nullva
33810 6c 75 65 22 29 3b 0a 20 20 20 20 20 20 6f 75 74  lue");.      out
33820 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e  put_c_string(p->
33830 6f 75 74 2c 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75  out, p->nullValu
33840 65 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  e);.      raw_pr
33850 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e  intf(p->out, "\n
33860 22 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69  ");.    utf8_pri
33870 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 31 32 2e  ntf(p->out,"%12.
33880 31 32 73 3a 20 25 73 5c 6e 22 2c 22 6f 75 74 70  12s: %s\n","outp
33890 75 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ut",.           
338a0 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e 6f 75 74   strlen30(p->out
338b0 66 69 6c 65 29 20 3f 20 70 2d 3e 6f 75 74 66 69  file) ? p->outfi
338c0 6c 65 20 3a 20 22 73 74 64 6f 75 74 22 29 3b 0a  le : "stdout");.
338d0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
338e0 70 2d 3e 6f 75 74 2c 22 25 31 32 2e 31 32 73 3a  p->out,"%12.12s:
338f0 20 22 2c 20 22 63 6f 6c 73 65 70 61 72 61 74 6f   ", "colseparato
33900 72 22 29 3b 0a 20 20 20 20 20 20 6f 75 74 70 75  r");.      outpu
33910 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75  t_c_string(p->ou
33920 74 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  t, p->colSeparat
33930 6f 72 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70  or);.      raw_p
33940 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c  rintf(p->out, "\
33950 6e 22 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72  n");.    utf8_pr
33960 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 31 32  intf(p->out,"%12
33970 2e 31 32 73 3a 20 22 2c 20 22 72 6f 77 73 65 70  .12s: ", "rowsep
33980 61 72 61 74 6f 72 22 29 3b 0a 20 20 20 20 20 20  arator");.      
33990 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28  output_c_string(
339a0 70 2d 3e 6f 75 74 2c 20 70 2d 3e 72 6f 77 53 65  p->out, p->rowSe
339b0 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
339c0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
339d0 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 75 74  t, "\n");.    ut
339e0 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
339f0 2c 20 22 25 31 32 2e 31 32 73 3a 20 25 73 5c 6e  , "%12.12s: %s\n
33a00 22 2c 22 73 74 61 74 73 22 2c 20 61 7a 42 6f 6f  ","stats", azBoo
33a10 6c 5b 70 2d 3e 73 74 61 74 73 4f 6e 21 3d 30 5d  l[p->statsOn!=0]
33a20 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  );.    utf8_prin
33a30 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31 32 2e  tf(p->out, "%12.
33a40 31 32 73 3a 20 22 2c 20 22 77 69 64 74 68 22 29  12s: ", "width")
33a50 3b 0a 20 20 20 20 66 6f 72 20 28 69 3d 30 3b 69  ;.    for (i=0;i
33a60 3c 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28  <(int)ArraySize(
33a70 70 2d 3e 63 6f 6c 57 69 64 74 68 29 20 26 26 20  p->colWidth) && 
33a80 70 2d 3e 63 6f 6c 57 69 64 74 68 5b 69 5d 20 21  p->colWidth[i] !
33a90 3d 20 30 3b 69 2b 2b 29 20 7b 0a 20 20 20 20 20  = 0;i++) {.     
33aa0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
33ab0 75 74 2c 20 22 25 64 20 22 2c 20 70 2d 3e 63 6f  ut, "%d ", p->co
33ac0 6c 57 69 64 74 68 5b 69 5d 29 3b 0a 20 20 20 20  lWidth[i]);.    
33ad0 7d 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  }.    raw_printf
33ae0 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a  (p->out, "\n");.
33af0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
33b00 70 2d 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32 73  p->out, "%12.12s
33b10 3a 20 25 73 5c 6e 22 2c 20 22 66 69 6c 65 6e 61  : %s\n", "filena
33b20 6d 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  me",.           
33b30 20 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e       p->zDbFilen
33b40 61 6d 65 20 3f 20 70 2d 3e 7a 44 62 46 69 6c 65  ame ? p->zDbFile
33b50 6e 61 6d 65 20 3a 20 22 22 29 3b 0a 20 20 7d 65  name : "");.  }e
33b60 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73  lse..  if( c=='s
33b70 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
33b80 72 67 5b 30 5d 2c 20 22 73 74 61 74 73 22 2c 20  rg[0], "stats", 
33b90 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  n)==0 ){.    if(
33ba0 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
33bb0 20 20 70 2d 3e 73 74 61 74 73 4f 6e 20 3d 20 62    p->statsOn = b
33bc0 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72  ooleanValue(azAr
33bd0 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65  g[1]);.    }else
33be0 20 69 66 28 20 6e 41 72 67 3d 3d 31 20 29 7b 0a   if( nArg==1 ){.
33bf0 20 20 20 20 20 20 64 69 73 70 6c 61 79 5f 73 74        display_st
33c00 61 74 73 28 70 2d 3e 64 62 2c 20 70 2c 20 30 29  ats(p->db, p, 0)
33c10 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
33c20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
33c30 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73  derr, "Usage: .s
33c40 74 61 74 73 20 3f 6f 6e 7c 6f 66 66 3f 5c 6e 22  tats ?on|off?\n"
33c50 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
33c60 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
33c70 20 20 69 66 28 20 28 63 3d 3d 27 74 27 20 26 26    if( (c=='t' &&
33c80 20 6e 3e 31 20 26 26 20 73 74 72 6e 63 6d 70 28   n>1 && strncmp(
33c90 61 7a 41 72 67 5b 30 5d 2c 20 22 74 61 62 6c 65  azArg[0], "table
33ca0 73 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 20 7c 7c  s", n)==0).   ||
33cb0 20 28 63 3d 3d 27 69 27 20 26 26 20 28 73 74 72   (c=='i' && (str
33cc0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
33cd0 69 6e 64 69 63 65 73 22 2c 20 6e 29 3d 3d 30 0a  indices", n)==0.
33ce0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33cf0 20 7c 7c 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   || strncmp(azAr
33d00 67 5b 30 5d 2c 20 22 69 6e 64 65 78 65 73 22 2c  g[0], "indexes",
33d10 20 6e 29 3d 3d 30 29 20 29 0a 20 20 29 7b 0a 20   n)==0) ).  ){. 
33d20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
33d30 2a 70 53 74 6d 74 3b 0a 20 20 20 20 63 68 61 72  *pStmt;.    char
33d40 20 2a 2a 61 7a 52 65 73 75 6c 74 3b 0a 20 20 20   **azResult;.   
33d50 20 69 6e 74 20 6e 52 6f 77 2c 20 6e 41 6c 6c 6f   int nRow, nAllo
33d60 63 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20  c;.    int ii;. 
33d70 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73 3b 0a     ShellText s;.
33d80 20 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 29      initText(&s)
33d90 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  ;.    open_db(p,
33da0 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71   0);.    rc = sq
33db0 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
33dc0 28 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20  (p->db, "PRAGMA 
33dd0 64 61 74 61 62 61 73 65 5f 6c 69 73 74 22 2c 20  database_list", 
33de0 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
33df0 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
33e00 75 72 6e 20 73 68 65 6c 6c 44 61 74 61 62 61 73  urn shellDatabas
33e10 65 45 72 72 6f 72 28 70 2d 3e 64 62 29 3b 0a 0a  eError(p->db);..
33e20 20 20 20 20 69 66 28 20 6e 41 72 67 3e 32 20 26      if( nArg>2 &
33e30 26 20 63 3d 3d 27 69 27 20 29 7b 0a 20 20 20 20  & c=='i' ){.    
33e40 20 20 2f 2a 20 49 74 20 69 73 20 61 6e 20 68 69    /* It is an hi
33e50 73 74 6f 72 69 63 61 6c 20 61 63 63 69 64 65 6e  storical acciden
33e60 74 20 74 68 61 74 20 74 68 65 20 2e 69 6e 64 65  t that the .inde
33e70 78 65 73 20 63 6f 6d 6d 61 6e 64 20 73 68 6f 77  xes command show
33e80 73 20 61 6e 20 65 72 72 6f 72 0a 20 20 20 20 20  s an error.     
33e90 20 2a 2a 20 77 68 65 6e 20 63 61 6c 6c 65 64 20   ** when called 
33ea0 77 69 74 68 20 74 68 65 20 77 72 6f 6e 67 20 6e  with the wrong n
33eb0 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
33ec0 74 73 20 77 68 65 72 65 61 73 20 74 68 65 20 2e  ts whereas the .
33ed0 74 61 62 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20  tables.      ** 
33ee0 63 6f 6d 6d 61 6e 64 20 64 6f 65 73 20 6e 6f 74  command does not
33ef0 2e 20 2a 2f 0a 20 20 20 20 20 20 72 61 77 5f 70  . */.      raw_p
33f00 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
33f10 73 61 67 65 3a 20 2e 69 6e 64 65 78 65 73 20 3f  sage: .indexes ?
33f20 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e 22  LIKE-PATTERN?\n"
33f30 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
33f40 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61  .      goto meta
33f50 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
33f60 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d     }.    for(ii=
33f70 30 3b 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  0; sqlite3_step(
33f80 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
33f90 4f 57 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20  OW; ii++){.     
33fa0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62   const char *zDb
33fb0 4e 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68  Name = (const ch
33fc0 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
33fd0 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31  mn_text(pStmt, 1
33fe0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 44 62  );.      if( zDb
33ff0 4e 61 6d 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  Name==0 ) contin
34000 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73 2e  ue;.      if( s.
34010 7a 20 26 26 20 73 2e 7a 5b 30 5d 20 29 20 61 70  z && s.z[0] ) ap
34020 70 65 6e 64 54 65 78 74 28 26 73 2c 20 22 20 55  pendText(&s, " U
34030 4e 49 4f 4e 20 41 4c 4c 20 22 2c 20 30 29 3b 0a  NION ALL ", 0);.
34040 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
34050 33 5f 73 74 72 69 63 6d 70 28 7a 44 62 4e 61 6d  3_stricmp(zDbNam
34060 65 2c 20 22 6d 61 69 6e 22 29 3d 3d 30 20 29 7b  e, "main")==0 ){
34070 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
34080 65 78 74 28 26 73 2c 20 22 53 45 4c 45 43 54 20  ext(&s, "SELECT 
34090 6e 61 6d 65 20 46 52 4f 4d 20 22 2c 20 30 29 3b  name FROM ", 0);
340a0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
340b0 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
340c0 28 26 73 2c 20 22 53 45 4c 45 43 54 20 22 2c 20  (&s, "SELECT ", 
340d0 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65  0);.        appe
340e0 6e 64 54 65 78 74 28 26 73 2c 20 7a 44 62 4e 61  ndText(&s, zDbNa
340f0 6d 65 2c 20 27 5c 27 27 29 3b 0a 20 20 20 20 20  me, '\'');.     
34100 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
34110 2c 20 22 7c 7c 27 2e 27 7c 7c 6e 61 6d 65 20 46  , "||'.'||name F
34120 52 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 20  ROM ", 0);.     
34130 20 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54   }.      appendT
34140 65 78 74 28 26 73 2c 20 7a 44 62 4e 61 6d 65 2c  ext(&s, zDbName,
34150 20 27 22 27 29 3b 0a 20 20 20 20 20 20 61 70 70   '"');.      app
34160 65 6e 64 54 65 78 74 28 26 73 2c 20 22 2e 73 71  endText(&s, ".sq
34170 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 2c 20 30  lite_master ", 0
34180 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d  );.      if( c==
34190 27 74 27 20 29 7b 0a 20 20 20 20 20 20 20 20 61  't' ){.        a
341a0 70 70 65 6e 64 54 65 78 74 28 26 73 2c 22 20 57  ppendText(&s," W
341b0 48 45 52 45 20 74 79 70 65 20 49 4e 20 28 27 74  HERE type IN ('t
341c0 61 62 6c 65 27 2c 27 76 69 65 77 27 29 22 0a 20  able','view')". 
341d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
341e0 20 20 20 20 20 22 20 20 20 41 4e 44 20 6e 61 6d       "   AND nam
341f0 65 20 4e 4f 54 20 4c 49 4b 45 20 27 73 71 6c 69  e NOT LIKE 'sqli
34200 74 65 5f 25 27 22 0a 20 20 20 20 20 20 20 20 20  te_%'".         
34210 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
34220 20 41 4e 44 20 6e 61 6d 65 20 4c 49 4b 45 20 3f   AND name LIKE ?
34230 31 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65  1", 0);.      }e
34240 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 70 70  lse{.        app
34250 65 6e 64 54 65 78 74 28 26 73 2c 22 20 57 48 45  endText(&s," WHE
34260 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22  RE type='index'"
34270 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
34280 20 20 20 20 20 20 20 22 20 20 20 41 4e 44 20 74         "   AND t
34290 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 3f 31 22  bl_name LIKE ?1"
342a0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
342b0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
342c0 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53  ite3_finalize(pS
342d0 74 6d 74 29 3b 0a 20 20 20 20 61 70 70 65 6e 64  tmt);.    append
342e0 54 65 78 74 28 26 73 2c 20 22 20 4f 52 44 45 52  Text(&s, " ORDER
342f0 20 42 59 20 31 22 2c 20 30 29 3b 0a 20 20 20 20   BY 1", 0);.    
34300 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
34310 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 73  pare_v2(p->db, s
34320 2e 7a 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  .z, -1, &pStmt, 
34330 30 29 3b 0a 20 20 20 20 66 72 65 65 54 65 78 74  0);.    freeText
34340 28 26 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63  (&s);.    if( rc
34350 20 29 20 72 65 74 75 72 6e 20 73 68 65 6c 6c 44   ) return shellD
34360 61 74 61 62 61 73 65 45 72 72 6f 72 28 70 2d 3e  atabaseError(p->
34370 64 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 75 6e  db);..    /* Run
34380 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
34390 6e 74 20 70 72 65 70 61 72 65 64 20 62 79 20 74  nt prepared by t
343a0 68 65 20 61 62 6f 76 65 20 62 6c 6f 63 6b 2e 20  he above block. 
343b0 53 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74  Store the result
343c0 73 0a 20 20 20 20 2a 2a 20 61 73 20 61 6e 20 61  s.    ** as an a
343d0 72 72 61 79 20 6f 66 20 6e 75 6c 2d 74 65 72 6d  rray of nul-term
343e0 69 6e 61 74 65 64 20 73 74 72 69 6e 67 73 20 69  inated strings i
343f0 6e 20 61 7a 52 65 73 75 6c 74 5b 5d 2e 20 20 2a  n azResult[].  *
34400 2f 0a 20 20 20 20 6e 52 6f 77 20 3d 20 6e 41 6c  /.    nRow = nAl
34410 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 61 7a 52  loc = 0;.    azR
34420 65 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20 69  esult = 0;.    i
34430 66 28 20 6e 41 72 67 3e 31 20 29 7b 0a 20 20 20  f( nArg>1 ){.   
34440 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f     sqlite3_bind_
34450 74 65 78 74 28 70 53 74 6d 74 2c 20 31 2c 20 61  text(pStmt, 1, a
34460 7a 41 72 67 5b 31 5d 2c 20 2d 31 2c 20 53 51 4c  zArg[1], -1, SQL
34470 49 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a  ITE_TRANSIENT);.
34480 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
34490 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
344a0 78 74 28 70 53 74 6d 74 2c 20 31 2c 20 22 25 22  xt(pStmt, 1, "%"
344b0 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41  , -1, SQLITE_STA
344c0 54 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  TIC);.    }.    
344d0 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73  while( sqlite3_s
344e0 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
344f0 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
34500 69 66 28 20 6e 52 6f 77 3e 3d 6e 41 6c 6c 6f 63  if( nRow>=nAlloc
34510 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
34520 20 2a 2a 61 7a 4e 65 77 3b 0a 20 20 20 20 20 20   **azNew;.      
34530 20 20 69 6e 74 20 6e 32 20 3d 20 6e 41 6c 6c 6f    int n2 = nAllo
34540 63 2a 32 20 2b 20 31 30 3b 0a 20 20 20 20 20 20  c*2 + 10;.      
34550 20 20 61 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65    azNew = sqlite
34560 33 5f 72 65 61 6c 6c 6f 63 36 34 28 61 7a 52 65  3_realloc64(azRe
34570 73 75 6c 74 2c 20 73 69 7a 65 6f 66 28 61 7a 52  sult, sizeof(azR
34580 65 73 75 6c 74 5b 30 5d 29 2a 6e 32 29 3b 0a 20  esult[0])*n2);. 
34590 20 20 20 20 20 20 20 69 66 28 20 61 7a 4e 65 77         if( azNew
345a0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
345b0 20 72 63 20 3d 20 73 68 65 6c 6c 4e 6f 6d 65 6d   rc = shellNomem
345c0 45 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20  Error();.       
345d0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
345e0 20 20 7d 0a 20 20 20 20 20 20 20 20 6e 41 6c 6c    }.        nAll
345f0 6f 63 20 3d 20 6e 32 3b 0a 20 20 20 20 20 20 20  oc = n2;.       
34600 20 61 7a 52 65 73 75 6c 74 20 3d 20 61 7a 4e 65   azResult = azNe
34610 77 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  w;.      }.     
34620 20 61 7a 52 65 73 75 6c 74 5b 6e 52 6f 77 5d 20   azResult[nRow] 
34630 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
34640 66 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f  f("%s", sqlite3_
34650 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
34660 74 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 69 66  t, 0));.      if
34670 28 20 30 3d 3d 61 7a 52 65 73 75 6c 74 5b 6e 52  ( 0==azResult[nR
34680 6f 77 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ow] ){.        r
34690 63 20 3d 20 73 68 65 6c 6c 4e 6f 6d 65 6d 45 72  c = shellNomemEr
346a0 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 62  ror();.        b
346b0 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
346c0 20 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20 20 20      nRow++;.    
346d0 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
346e0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
346f0 29 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  )!=SQLITE_OK ){.
34700 20 20 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c        rc = shell
34710 44 61 74 61 62 61 73 65 45 72 72 6f 72 28 70 2d  DatabaseError(p-
34720 3e 64 62 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  >db);.    }..   
34730 20 2f 2a 20 50 72 65 74 74 79 2d 70 72 69 6e 74   /* Pretty-print
34740 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
34750 20 61 72 72 61 79 20 61 7a 52 65 73 75 6c 74 5b   array azResult[
34760 5d 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20  ] to the output 
34770 2a 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 30  */.    if( rc==0
34780 20 26 26 20 6e 52 6f 77 3e 30 20 29 7b 0a 20 20   && nRow>0 ){.  
34790 20 20 20 20 69 6e 74 20 6c 65 6e 2c 20 6d 61 78      int len, max
347a0 6c 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  len = 0;.      i
347b0 6e 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 69  nt i, j;.      i
347c0 6e 74 20 6e 50 72 69 6e 74 43 6f 6c 2c 20 6e 50  nt nPrintCol, nP
347d0 72 69 6e 74 52 6f 77 3b 0a 20 20 20 20 20 20 66  rintRow;.      f
347e0 6f 72 28 69 3d 30 3b 20 69 3c 6e 52 6f 77 3b 20  or(i=0; i<nRow; 
347f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6c 65  i++){.        le
34800 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 52  n = strlen30(azR
34810 65 73 75 6c 74 5b 69 5d 29 3b 0a 20 20 20 20 20  esult[i]);.     
34820 20 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 6c 65     if( len>maxle
34830 6e 20 29 20 6d 61 78 6c 65 6e 20 3d 20 6c 65 6e  n ) maxlen = len
34840 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
34850 6e 50 72 69 6e 74 43 6f 6c 20 3d 20 38 30 2f 28  nPrintCol = 80/(
34860 6d 61 78 6c 65 6e 2b 32 29 3b 0a 20 20 20 20 20  maxlen+2);.     
34870 20 69 66 28 20 6e 50 72 69 6e 74 43 6f 6c 3c 31   if( nPrintCol<1
34880 20 29 20 6e 50 72 69 6e 74 43 6f 6c 20 3d 20 31   ) nPrintCol = 1
34890 3b 0a 20 20 20 20 20 20 6e 50 72 69 6e 74 52 6f  ;.      nPrintRo
348a0 77 20 3d 20 28 6e 52 6f 77 20 2b 20 6e 50 72 69  w = (nRow + nPri
348b0 6e 74 43 6f 6c 20 2d 20 31 29 2f 6e 50 72 69 6e  ntCol - 1)/nPrin
348c0 74 43 6f 6c 3b 0a 20 20 20 20 20 20 66 6f 72 28  tCol;.      for(
348d0 69 3d 30 3b 20 69 3c 6e 50 72 69 6e 74 52 6f 77  i=0; i<nPrintRow
348e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
348f0 66 6f 72 28 6a 3d 69 3b 20 6a 3c 6e 52 6f 77 3b  for(j=i; j<nRow;
34900 20 6a 2b 3d 6e 50 72 69 6e 74 52 6f 77 29 7b 0a   j+=nPrintRow){.
34910 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
34920 7a 53 70 20 3d 20 6a 3c 6e 50 72 69 6e 74 52 6f  zSp = j<nPrintRo
34930 77 20 3f 20 22 22 20 3a 20 22 20 20 22 3b 0a 20  w ? "" : "  ";. 
34940 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
34950 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
34960 25 2d 2a 73 22 2c 20 7a 53 70 2c 20 6d 61 78 6c  %-*s", zSp, maxl
34970 65 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  en,.            
34980 20 20 20 20 20 20 20 20 20 20 61 7a 52 65 73 75            azResu
34990 6c 74 5b 6a 5d 20 3f 20 61 7a 52 65 73 75 6c 74  lt[j] ? azResult
349a0 5b 6a 5d 3a 22 22 29 3b 0a 20 20 20 20 20 20 20  [j]:"");.       
349b0 20 7d 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70   }.        raw_p
349c0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c  rintf(p->out, "\
349d0 6e 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n");.      }.   
349e0 20 7d 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30   }..    for(ii=0
349f0 3b 20 69 69 3c 6e 52 6f 77 3b 20 69 69 2b 2b 29  ; ii<nRow; ii++)
34a00 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a   sqlite3_free(az
34a10 52 65 73 75 6c 74 5b 69 69 5d 29 3b 0a 20 20 20  Result[ii]);.   
34a20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a   sqlite3_free(az
34a30 52 65 73 75 6c 74 29 3b 0a 20 20 7d 65 6c 73 65  Result);.  }else
34a40 0a 0a 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 64  ..  /* Begin red
34a50 69 72 65 63 74 69 6e 67 20 6f 75 74 70 75 74 20  irecting output 
34a60 74 6f 20 74 68 65 20 66 69 6c 65 20 22 74 65 73  to the file "tes
34a70 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 22 20 2a  tcase-out.txt" *
34a80 2f 0a 20 20 69 66 28 20 63 3d 3d 27 74 27 20 26  /.  if( c=='t' &
34a90 26 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 30  & strcmp(azArg[0
34aa0 5d 2c 22 74 65 73 74 63 61 73 65 22 29 3d 3d 30  ],"testcase")==0
34ab0 20 29 7b 0a 20 20 20 20 6f 75 74 70 75 74 5f 72   ){.    output_r
34ac0 65 73 65 74 28 70 29 3b 0a 20 20 20 20 70 2d 3e  eset(p);.    p->
34ad0 6f 75 74 20 3d 20 6f 75 74 70 75 74 5f 66 69 6c  out = output_fil
34ae0 65 5f 6f 70 65 6e 28 22 74 65 73 74 63 61 73 65  e_open("testcase
34af0 2d 6f 75 74 2e 74 78 74 22 29 3b 0a 20 20 20 20  -out.txt");.    
34b00 69 66 28 20 70 2d 3e 6f 75 74 3d 3d 30 20 29 7b  if( p->out==0 ){
34b10 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
34b20 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
34b30 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 27 74  : cannot open 't
34b40 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 27  estcase-out.txt'
34b50 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  \n");.    }.    
34b60 69 66 28 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20  if( nArg>=2 ){. 
34b70 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
34b80 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
34b90 7a 54 65 73 74 63 61 73 65 29 2c 20 70 2d 3e 7a  zTestcase), p->z
34ba0 54 65 73 74 63 61 73 65 2c 20 22 25 73 22 2c 20  Testcase, "%s", 
34bb0 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d  azArg[1]);.    }
34bc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
34bd0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
34be0 65 6f 66 28 70 2d 3e 7a 54 65 73 74 63 61 73 65  eof(p->zTestcase
34bf0 29 2c 20 70 2d 3e 7a 54 65 73 74 63 61 73 65 2c  ), p->zTestcase,
34c00 20 22 3f 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d   "?");.    }.  }
34c10 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51  else..#ifndef SQ
34c20 4c 49 54 45 5f 55 4e 54 45 53 54 41 42 4c 45 0a  LITE_UNTESTABLE.
34c30 20 20 69 66 28 20 63 3d 3d 27 74 27 20 26 26 20    if( c=='t' && 
34c40 6e 3e 3d 38 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=8 && strncmp(
34c50 61 7a 41 72 67 5b 30 5d 2c 20 22 74 65 73 74 63  azArg[0], "testc
34c60 74 72 6c 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  trl", n)==0 ){. 
34c70 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
34c80 73 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20 20  struct {.       
34c90 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 74 72  const char *zCtr
34ca0 6c 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65  lName;   /* Name
34cb0 20 6f 66 20 61 20 74 65 73 74 2d 63 6f 6e 74 72   of a test-contr
34cc0 6f 6c 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20  ol option */.   
34cd0 20 20 20 20 69 6e 74 20 63 74 72 6c 43 6f 64 65      int ctrlCode
34ce0 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
34cf0 49 6e 74 65 67 65 72 20 63 6f 64 65 20 66 6f 72  Integer code for
34d00 20 74 68 61 74 20 6f 70 74 69 6f 6e 20 2a 2f 0a   that option */.
34d10 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
34d20 72 20 2a 7a 55 73 61 67 65 3b 20 20 20 20 20 20  r *zUsage;      
34d30 2f 2a 20 55 73 61 67 65 20 6e 6f 74 65 73 20 2a  /* Usage notes *
34d40 2f 0a 20 20 20 20 7d 20 61 43 74 72 6c 5b 5d 20  /.    } aCtrl[] 
34d50 3d 20 7b 0a 20 20 20 20 20 20 7b 20 22 61 6c 77  = {.      { "alw
34d60 61 79 73 22 2c 20 20 20 20 20 20 20 20 20 20 20  ays",           
34d70 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52    SQLITE_TESTCTR
34d80 4c 5f 41 4c 57 41 59 53 2c 20 20 20 20 20 20 20  L_ALWAYS,       
34d90 20 22 42 4f 4f 4c 45 41 4e 22 20 20 20 20 20 20   "BOOLEAN"      
34da0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
34db0 20 22 61 73 73 65 72 74 22 2c 20 20 20 20 20 20   "assert",      
34dc0 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45         SQLITE_TE
34dd0 53 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 20  STCTRL_ASSERT,  
34de0 20 20 20 20 20 20 22 42 4f 4f 4c 45 41 4e 22 20        "BOOLEAN" 
34df0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
34e00 20 20 2f 2a 7b 20 22 62 65 6e 69 67 6e 5f 6d 61    /*{ "benign_ma
34e10 6c 6c 6f 63 5f 68 6f 6f 6b 73 22 2c 53 51 4c 49  lloc_hooks",SQLI
34e20 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 45 4e 49  TE_TESTCTRL_BENI
34e30 47 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c  GN_MALLOC_HOOKS,
34e40 20 22 22 20 20 20 20 20 20 20 20 20 20 7d 2c 2a   ""          },*
34e50 2f 0a 20 20 20 20 2f 2a 7b 20 22 62 69 74 76 65  /.    /*{ "bitve
34e60 63 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20 20  c_test",        
34e70 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
34e80 42 49 54 56 45 43 5f 54 45 53 54 2c 20 20 20 22  BITVEC_TEST,   "
34e90 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
34ea0 20 7d 2c 2a 2f 0a 20 20 20 20 20 20 7b 20 22 62   },*/.      { "b
34eb0 79 74 65 6f 72 64 65 72 22 2c 20 20 20 20 20 20  yteorder",      
34ec0 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43      SQLITE_TESTC
34ed0 54 52 4c 5f 42 59 54 45 4f 52 44 45 52 2c 20 20  TRL_BYTEORDER,  
34ee0 20 20 20 22 22 20 20 20 20 20 20 20 20 20 20 20     ""           
34ef0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f          },.    /
34f00 2a 7b 20 22 66 61 75 6c 74 5f 69 6e 73 74 61 6c  *{ "fault_instal
34f10 6c 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f  l",      SQLITE_
34f20 54 45 53 54 43 54 52 4c 5f 46 41 55 4c 54 5f 49  TESTCTRL_FAULT_I
34f30 4e 53 54 41 4c 4c 2c 20 22 22 20 20 20 20 20 20  NSTALL, ""      
34f40 20 20 20 20 20 20 20 20 20 20 7d 2c 20 2a 2f 0a            }, */.
34f50 20 20 20 20 20 20 7b 20 22 69 6d 70 6f 73 74 65        { "imposte
34f60 72 22 2c 20 20 20 20 20 20 20 20 20 20 20 53 51  r",           SQ
34f70 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d  LITE_TESTCTRL_IM
34f80 50 4f 53 54 45 52 2c 20 20 20 22 53 43 48 45 4d  POSTER,   "SCHEM
34f90 41 20 4f 4e 2f 4f 46 46 20 52 4f 4f 54 50 41 47  A ON/OFF ROOTPAG
34fa0 45 22 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c 49  E"},.#ifdef SQLI
34fb0 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20 20 20  TE_N_KEYWORD.   
34fc0 20 20 20 7b 20 22 69 73 6b 65 79 77 6f 72 64 22     { "iskeyword"
34fd0 2c 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  ,          SQLIT
34fe0 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59  E_TESTCTRL_ISKEY
34ff0 57 4f 52 44 2c 20 20 20 20 20 22 49 44 45 4e 54  WORD,     "IDENT
35000 49 46 49 45 52 22 20 20 20 20 20 20 20 20 20 7d  IFIER"         }
35010 2c 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b  ,.#endif.      {
35020 20 22 6c 6f 63 61 6c 74 69 6d 65 5f 66 61 75 6c   "localtime_faul
35030 74 22 2c 20 20 20 20 53 51 4c 49 54 45 5f 54 45  t",    SQLITE_TE
35040 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45  STCTRL_LOCALTIME
35050 5f 46 41 55 4c 54 2c 22 42 4f 4f 4c 45 41 4e 22  _FAULT,"BOOLEAN"
35060 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
35070 20 20 20 20 7b 20 22 6e 65 76 65 72 5f 63 6f 72      { "never_cor
35080 72 75 70 74 22 2c 20 20 20 20 20 20 53 51 4c 49  rupt",      SQLI
35090 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56 45  TE_TESTCTRL_NEVE
350a0 52 5f 43 4f 52 52 55 50 54 2c 20 22 42 4f 4f 4c  R_CORRUPT, "BOOL
350b0 45 41 4e 22 20 20 20 20 20 20 20 20 20 20 20 20  EAN"            
350c0 7d 2c 0a 20 20 20 20 20 20 7b 20 22 6f 70 74 69  },.      { "opti
350d0 6d 69 7a 61 74 69 6f 6e 73 22 2c 20 20 20 20 20  mizations",     
350e0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
350f0 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 20  _OPTIMIZATIONS, 
35100 22 44 49 53 41 42 4c 45 2d 4d 41 53 4b 22 20 20  "DISABLE-MASK"  
35110 20 20 20 20 20 7d 2c 0a 23 69 66 64 65 66 20 59       },.#ifdef Y
35120 59 43 4f 56 45 52 41 47 45 0a 20 20 20 20 20 20  YCOVERAGE.      
35130 7b 20 22 70 61 72 73 65 72 5f 63 6f 76 65 72 61  { "parser_covera
35140 67 65 22 2c 20 20 20 20 53 51 4c 49 54 45 5f 54  ge",    SQLITE_T
35150 45 53 54 43 54 52 4c 5f 50 41 52 53 45 52 5f 43  ESTCTRL_PARSER_C
35160 4f 56 45 52 41 47 45 2c 20 22 22 20 20 20 20 20  OVERAGE, ""     
35170 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 23              },.#
35180 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 20 22 70  endif.      { "p
35190 65 6e 64 69 6e 67 5f 62 79 74 65 22 2c 20 20 20  ending_byte",   
351a0 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43      SQLITE_TESTC
351b0 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45  TRL_PENDING_BYTE
351c0 2c 20 20 22 4f 46 46 53 45 54 20 20 22 20 20 20  ,  "OFFSET  "   
351d0 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20          },.     
351e0 20 7b 20 22 70 72 6e 67 5f 72 65 73 65 74 22 2c   { "prng_reset",
351f0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
35200 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45  TESTCTRL_PRNG_RE
35210 53 45 54 2c 20 20 20 20 22 22 20 20 20 20 20 20  SET,    ""      
35220 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
35230 20 20 20 20 20 20 7b 20 22 70 72 6e 67 5f 72 65        { "prng_re
35240 73 74 6f 72 65 22 2c 20 20 20 20 20 20 20 53 51  store",       SQ
35250 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52  LITE_TESTCTRL_PR
35260 4e 47 5f 52 45 53 54 4f 52 45 2c 20 20 22 22 20  NG_RESTORE,  "" 
35270 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
35280 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 70 72    },.      { "pr
35290 6e 67 5f 73 61 76 65 22 2c 20 20 20 20 20 20 20  ng_save",       
352a0 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54     SQLITE_TESTCT
352b0 52 4c 5f 50 52 4e 47 5f 53 41 56 45 2c 20 20 20  RL_PRNG_SAVE,   
352c0 20 20 22 22 20 20 20 20 20 20 20 20 20 20 20 20    ""            
352d0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
352e0 7b 20 22 72 65 73 65 72 76 65 22 2c 20 20 20 20  { "reserve",    
352f0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54          SQLITE_T
35300 45 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45 2c  ESTCTRL_RESERVE,
35310 20 20 20 20 20 20 20 22 42 59 54 45 53 2d 4f 46         "BYTES-OF
35320 2d 52 45 53 45 52 56 45 22 20 20 20 7d 2c 0a 20  -RESERVE"   },. 
35330 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 74 65     };.    int te
35340 73 74 63 74 72 6c 20 3d 20 2d 31 3b 0a 20 20 20  stctrl = -1;.   
35350 20 69 6e 74 20 69 43 74 72 6c 20 3d 20 2d 31 3b   int iCtrl = -1;
35360 0a 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 30  .    int rc2 = 0
35370 3b 20 20 20 20 2f 2a 20 30 3a 20 75 73 61 67 65  ;    /* 0: usage
35380 2e 20 20 31 3a 20 25 64 20 20 32 3a 20 25 78 20  .  1: %d  2: %x 
35390 20 33 3a 20 6e 6f 2d 6f 75 74 70 75 74 20 2a 2f   3: no-output */
353a0 0a 20 20 20 20 69 6e 74 20 69 73 4f 6b 20 3d 20  .    int isOk = 
353b0 30 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 32  0;.    int i, n2
353c0 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  ;.    const char
353d0 20 2a 7a 43 6d 64 20 3d 20 30 3b 0a 0a 20 20 20   *zCmd = 0;..   
353e0 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
353f0 20 20 20 20 7a 43 6d 64 20 3d 20 6e 41 72 67 3e      zCmd = nArg>
35400 3d 32 20 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20  =2 ? azArg[1] : 
35410 22 68 65 6c 70 22 3b 0a 0a 20 20 20 20 2f 2a 20  "help";..    /* 
35420 54 68 65 20 61 72 67 75 6d 65 6e 74 20 63 61 6e  The argument can
35430 20 6f 70 74 69 6f 6e 61 6c 6c 79 20 62 65 67 69   optionally begi
35440 6e 20 77 69 74 68 20 22 2d 22 20 6f 72 20 22 2d  n with "-" or "-
35450 2d 22 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 43  -" */.    if( zC
35460 6d 64 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 7a 43  md[0]=='-' && zC
35470 6d 64 5b 31 5d 20 29 7b 0a 20 20 20 20 20 20 7a  md[1] ){.      z
35480 43 6d 64 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  Cmd++;.      if(
35490 20 7a 43 6d 64 5b 30 5d 3d 3d 27 2d 27 20 26 26   zCmd[0]=='-' &&
354a0 20 7a 43 6d 64 5b 31 5d 20 29 20 7a 43 6d 64 2b   zCmd[1] ) zCmd+
354b0 2b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  +;.    }..    /*
354c0 20 2d 2d 68 65 6c 70 20 6c 69 73 74 73 20 61 6c   --help lists al
354d0 6c 20 74 65 73 74 2d 63 6f 6e 74 72 6f 6c 73 20  l test-controls 
354e0 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  */.    if( strcm
354f0 70 28 7a 43 6d 64 2c 22 68 65 6c 70 22 29 3d 3d  p(zCmd,"help")==
35500 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  0 ){.      utf8_
35510 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
35520 41 76 61 69 6c 61 62 6c 65 20 74 65 73 74 2d 63  Available test-c
35530 6f 6e 74 72 6f 6c 73 3a 5c 6e 22 29 3b 0a 20 20  ontrols:\n");.  
35540 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41      for(i=0; i<A
35550 72 72 61 79 53 69 7a 65 28 61 43 74 72 6c 29 3b  rraySize(aCtrl);
35560 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75   i++){.        u
35570 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
35580 74 2c 20 22 20 20 2e 74 65 73 74 63 74 72 6c 20  t, "  .testctrl 
35590 25 73 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20  %s %s\n",.      
355a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 43                aC
355b0 74 72 6c 5b 69 5d 2e 7a 43 74 72 6c 4e 61 6d 65  trl[i].zCtrlName
355c0 2c 20 61 43 74 72 6c 5b 69 5d 2e 7a 55 73 61 67  , aCtrl[i].zUsag
355d0 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  e);.      }.    
355e0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
355f0 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
35600 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 20  d_exit;.    }.. 
35610 20 20 20 2f 2a 20 63 6f 6e 76 65 72 74 20 74 65     /* convert te
35620 73 74 63 74 72 6c 20 74 65 78 74 20 6f 70 74 69  stctrl text opti
35630 6f 6e 20 74 6f 20 76 61 6c 75 65 2e 20 61 6c 6c  on to value. all
35640 6f 77 20 61 6e 79 20 75 6e 69 71 75 65 20 70 72  ow any unique pr
35650 65 66 69 78 0a 20 20 20 20 2a 2a 20 6f 66 20 74  efix.    ** of t
35660 68 65 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 2c 20  he option name, 
35670 6f 72 20 61 20 6e 75 6d 65 72 69 63 61 6c 20 76  or a numerical v
35680 61 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 6e 32 20  alue. */.    n2 
35690 3d 20 73 74 72 6c 65 6e 33 30 28 7a 43 6d 64 29  = strlen30(zCmd)
356a0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
356b0 3c 41 72 72 61 79 53 69 7a 65 28 61 43 74 72 6c  <ArraySize(aCtrl
356c0 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ); i++){.      i
356d0 66 28 20 73 74 72 6e 63 6d 70 28 7a 43 6d 64 2c  f( strncmp(zCmd,
356e0 20 61 43 74 72 6c 5b 69 5d 2e 7a 43 74 72 6c 4e   aCtrl[i].zCtrlN
356f0 61 6d 65 2c 20 6e 32 29 3d 3d 30 20 29 7b 0a 20  ame, n2)==0 ){. 
35700 20 20 20 20 20 20 20 69 66 28 20 74 65 73 74 63         if( testc
35710 74 72 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  trl<0 ){.       
35720 20 20 20 74 65 73 74 63 74 72 6c 20 3d 20 61 43     testctrl = aC
35730 74 72 6c 5b 69 5d 2e 63 74 72 6c 43 6f 64 65 3b  trl[i].ctrlCode;
35740 0a 20 20 20 20 20 20 20 20 20 20 69 43 74 72 6c  .          iCtrl
35750 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 7d 65   = i;.        }e
35760 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 75  lse{.          u
35770 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
35780 72 2c 20 22 45 72 72 6f 72 3a 20 61 6d 62 69 67  r, "Error: ambig
35790 75 6f 75 73 20 74 65 73 74 2d 63 6f 6e 74 72 6f  uous test-contro
357a0 6c 3a 20 5c 22 25 73 5c 22 5c 6e 22 0a 20 20 20  l: \"%s\"\n".   
357b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
357c0 20 20 20 20 20 20 20 20 20 20 20 22 55 73 65 20             "Use 
357d0 5c 22 2e 74 65 73 74 63 74 72 6c 20 2d 2d 68 65  \".testctrl --he
357e0 6c 70 5c 22 20 66 6f 72 20 68 65 6c 70 5c 6e 22  lp\" for help\n"
357f0 2c 20 7a 43 6d 64 29 3b 0a 20 20 20 20 20 20 20  , zCmd);.       
35800 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
35810 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
35820 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
35830 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
35840 20 20 20 7d 0a 20 20 20 20 69 66 28 20 74 65 73     }.    if( tes
35850 74 63 74 72 6c 3c 30 20 29 7b 0a 20 20 20 20 20  tctrl<0 ){.     
35860 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
35870 65 72 72 2c 22 45 72 72 6f 72 3a 20 75 6e 6b 6e  err,"Error: unkn
35880 6f 77 6e 20 74 65 73 74 2d 63 6f 6e 74 72 6f 6c  own test-control
35890 3a 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 20 20  : %s\n".        
358a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
358b0 20 22 55 73 65 20 5c 22 2e 74 65 73 74 63 74 72   "Use \".testctr
358c0 6c 20 2d 2d 68 65 6c 70 5c 22 20 66 6f 72 20 68  l --help\" for h
358d0 65 6c 70 5c 6e 22 2c 20 7a 43 6d 64 29 3b 0a 20  elp\n", zCmd);. 
358e0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
358f0 73 77 69 74 63 68 28 74 65 73 74 63 74 72 6c 29  switch(testctrl)
35900 7b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 71  {..        /* sq
35910 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
35920 6f 6c 28 69 6e 74 2c 20 64 62 2c 20 69 6e 74 29  ol(int, db, int)
35930 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 61 73 65   */.        case
35940 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
35950 5f 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 3a 0a  _OPTIMIZATIONS:.
35960 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
35970 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53  ITE_TESTCTRL_RES
35980 45 52 56 45 3a 0a 20 20 20 20 20 20 20 20 20 20  ERVE:.          
35990 69 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20  if( nArg==3 ){. 
359a0 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f             int o
359b0 70 74 20 3d 20 28 69 6e 74 29 73 74 72 74 6f 6c  pt = (int)strtol
359c0 28 61 7a 41 72 67 5b 32 5d 2c 20 30 2c 20 30 29  (azArg[2], 0, 0)
359d0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
359e0 32 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74  2 = sqlite3_test
359f0 5f 63 6f 6e 74 72 6f 6c 28 74 65 73 74 63 74 72  _control(testctr
35a00 6c 2c 20 70 2d 3e 64 62 2c 20 6f 70 74 29 3b 0a  l, p->db, opt);.
35a10 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 6b              isOk
35a20 20 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20   = 3;.          
35a30 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  }.          brea
35a40 6b 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 73  k;..        /* s
35a50 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
35a60 72 6f 6c 28 69 6e 74 29 20 2a 2f 0a 20 20 20 20  rol(int) */.    
35a70 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
35a80 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41  TESTCTRL_PRNG_SA
35a90 56 45 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65  VE:.        case
35aa0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
35ab0 5f 50 52 4e 47 5f 52 45 53 54 4f 52 45 3a 0a 20  _PRNG_RESTORE:. 
35ac0 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
35ad0 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47  TE_TESTCTRL_PRNG
35ae0 5f 52 45 53 45 54 3a 0a 20 20 20 20 20 20 20 20  _RESET:.        
35af0 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
35b00 43 54 52 4c 5f 42 59 54 45 4f 52 44 45 52 3a 0a  CTRL_BYTEORDER:.
35b10 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 41            if( nA
35b20 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 20  rg==2 ){.       
35b30 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
35b40 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
35b50 74 65 73 74 63 74 72 6c 29 3b 0a 20 20 20 20 20  testctrl);.     
35b60 20 20 20 20 20 20 20 69 73 4f 6b 20 3d 20 74 65         isOk = te
35b70 73 74 63 74 72 6c 3d 3d 53 51 4c 49 54 45 5f 54  stctrl==SQLITE_T
35b80 45 53 54 43 54 52 4c 5f 42 59 54 45 4f 52 44 45  ESTCTRL_BYTEORDE
35b90 52 20 3f 20 31 20 3a 20 33 3b 0a 20 20 20 20 20  R ? 1 : 3;.     
35ba0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
35bb0 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20   break;..       
35bc0 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74   /* sqlite3_test
35bd0 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 2c 20 75 69  _control(int, ui
35be0 6e 74 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  nt) */.        c
35bf0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
35c00 54 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45  TRL_PENDING_BYTE
35c10 3a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  :.          if( 
35c20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20  nArg==3 ){.     
35c30 20 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20         unsigned 
35c40 69 6e 74 20 6f 70 74 20 3d 20 28 75 6e 73 69 67  int opt = (unsig
35c50 6e 65 64 20 69 6e 74 29 69 6e 74 65 67 65 72 56  ned int)integerV
35c60 61 6c 75 65 28 61 7a 41 72 67 5b 32 5d 29 3b 0a  alue(azArg[2]);.
35c70 20 20 20 20 20 20 20 20 20 20 20 20 72 63 32 20              rc2 
35c80 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  = sqlite3_test_c
35c90 6f 6e 74 72 6f 6c 28 74 65 73 74 63 74 72 6c 2c  ontrol(testctrl,
35ca0 20 6f 70 74 29 3b 0a 20 20 20 20 20 20 20 20 20   opt);.         
35cb0 20 20 20 69 73 4f 6b 20 3d 20 33 3b 0a 20 20 20     isOk = 3;.   
35cc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
35cd0 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20     break;..     
35ce0 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65     /* sqlite3_te
35cf0 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 2c 20  st_control(int, 
35d00 69 6e 74 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  int) */.        
35d10 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54  case SQLITE_TEST
35d20 43 54 52 4c 5f 41 53 53 45 52 54 3a 0a 20 20 20  CTRL_ASSERT:.   
35d30 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
35d40 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53  _TESTCTRL_ALWAYS
35d50 3a 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  :.          if( 
35d60 6e 41 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20  nArg==3 ){.     
35d70 20 20 20 20 20 20 20 69 6e 74 20 6f 70 74 20 3d         int opt =
35d80 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a   booleanValue(az
35d90 41 72 67 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[2]);.       
35da0 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74       rc2 = sqlit
35db0 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28  e3_test_control(
35dc0 74 65 73 74 63 74 72 6c 2c 20 6f 70 74 29 3b 0a  testctrl, opt);.
35dd0 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 6b              isOk
35de0 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
35df0 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  }.          brea
35e00 6b 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 73  k;..        /* s
35e10 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
35e20 72 6f 6c 28 69 6e 74 2c 20 69 6e 74 29 20 2a 2f  rol(int, int) */
35e30 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
35e40 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f  LITE_TESTCTRL_LO
35e50 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a 0a 20  CALTIME_FAULT:. 
35e60 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
35e70 54 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56 45  TE_TESTCTRL_NEVE
35e80 52 5f 43 4f 52 52 55 50 54 3a 0a 20 20 20 20 20  R_CORRUPT:.     
35e90 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 33       if( nArg==3
35ea0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
35eb0 69 6e 74 20 6f 70 74 20 3d 20 62 6f 6f 6c 65 61  int opt = boolea
35ec0 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 32 5d 29  nValue(azArg[2])
35ed0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63  ;.            rc
35ee0 32 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74  2 = sqlite3_test
35ef0 5f 63 6f 6e 74 72 6f 6c 28 74 65 73 74 63 74 72  _control(testctr
35f00 6c 2c 20 6f 70 74 29 3b 0a 20 20 20 20 20 20 20  l, opt);.       
35f10 20 20 20 20 20 69 73 4f 6b 20 3d 20 33 3b 0a 20       isOk = 3;. 
35f20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
35f30 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
35f40 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
35f50 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74  test_control(int
35f60 2c 20 63 68 61 72 20 2a 29 20 2a 2f 0a 23 69 66  , char *) */.#if
35f70 64 65 66 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59  def SQLITE_N_KEY
35f80 57 4f 52 44 0a 20 20 20 20 20 20 20 20 63 61 73  WORD.        cas
35f90 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  e SQLITE_TESTCTR
35fa0 4c 5f 49 53 4b 45 59 57 4f 52 44 3a 0a 20 20 20  L_ISKEYWORD:.   
35fb0 20 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d         if( nArg=
35fc0 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =3 ){.          
35fd0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70    const char *op
35fe0 74 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 20 20  t = azArg[2];.  
35ff0 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20            rc2 = 
36000 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
36010 74 72 6f 6c 28 74 65 73 74 63 74 72 6c 2c 20 6f  trol(testctrl, o
36020 70 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  pt);.           
36030 20 69 73 4f 6b 20 3d 20 31 3b 0a 20 20 20 20 20   isOk = 1;.     
36040 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
36050 20 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a   break;.#endif..
36060 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
36070 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50  ITE_TESTCTRL_IMP
36080 4f 53 54 45 52 3a 0a 20 20 20 20 20 20 20 20 20  OSTER:.         
36090 20 69 66 28 20 6e 41 72 67 3d 3d 35 20 29 7b 0a   if( nArg==5 ){.
360a0 20 20 20 20 20 20 20 20 20 20 20 20 72 63 32 20              rc2 
360b0 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  = sqlite3_test_c
360c0 6f 6e 74 72 6f 6c 28 74 65 73 74 63 74 72 6c 2c  ontrol(testctrl,
360d0 20 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20   p->db,.        
360e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
360f0 20 20 61 7a 41 72 67 5b 32 5d 2c 0a 20 20 20 20    azArg[2],.    
36100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36110 20 20 20 20 20 20 69 6e 74 65 67 65 72 56 61 6c        integerVal
36120 75 65 28 61 7a 41 72 67 5b 33 5d 29 2c 0a 20 20  ue(azArg[3]),.  
36130 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36140 20 20 20 20 20 20 20 20 69 6e 74 65 67 65 72 56          integerV
36150 61 6c 75 65 28 61 7a 41 72 67 5b 34 5d 29 29 3b  alue(azArg[4]));
36160 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f  .            isO
36170 6b 20 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20  k = 3;.         
36180 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
36190 61 6b 3b 0a 0a 23 69 66 64 65 66 20 59 59 43 4f  ak;..#ifdef YYCO
361a0 56 45 52 41 47 45 0a 20 20 20 20 20 20 20 20 63  VERAGE.        c
361b0 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
361c0 54 52 4c 5f 50 41 52 53 45 52 5f 43 4f 56 45 52  TRL_PARSER_COVER
361d0 41 47 45 3a 0a 20 20 20 20 20 20 20 20 20 20 69  AGE:.          i
361e0 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20  f( nArg==2 ){.  
361f0 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
36200 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 74  3_test_control(t
36210 65 73 74 63 74 72 6c 2c 20 70 2d 3e 6f 75 74 29  estctrl, p->out)
36220 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73  ;.            is
36230 4f 6b 20 3d 20 33 3b 0a 20 20 20 20 20 20 20 20  Ok = 3;.        
36240 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
36250 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
36260 20 69 73 4f 6b 3d 3d 30 20 26 26 20 69 43 74 72   isOk==0 && iCtr
36270 6c 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74  l>=0 ){.      ut
36280 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
36290 2c 20 22 55 73 61 67 65 3a 20 2e 74 65 73 74 63  , "Usage: .testc
362a0 74 72 6c 20 25 73 20 25 73 5c 6e 22 2c 20 7a 43  trl %s %s\n", zC
362b0 6d 64 2c 20 61 43 74 72 6c 5b 69 43 74 72 6c 5d  md, aCtrl[iCtrl]
362c0 2e 7a 55 73 61 67 65 29 3b 0a 20 20 20 20 20 20  .zUsage);.      
362d0 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73  rc = 1;.    }els
362e0 65 20 69 66 28 20 69 73 4f 6b 3d 3d 31 20 29 7b  e if( isOk==1 ){
362f0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
36300 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 5c 6e 22  f(p->out, "%d\n"
36310 2c 20 72 63 32 29 3b 0a 20 20 20 20 7d 65 6c 73  , rc2);.    }els
36320 65 20 69 66 28 20 69 73 4f 6b 3d 3d 32 20 29 7b  e if( isOk==2 ){
36330 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
36340 66 28 70 2d 3e 6f 75 74 2c 20 22 30 78 25 30 38  f(p->out, "0x%08
36350 78 5c 6e 22 2c 20 72 63 32 29 3b 0a 20 20 20 20  x\n", rc2);.    
36360 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  }.  }else.#endif
36370 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
36380 49 54 45 5f 55 4e 54 45 53 54 41 42 4c 45 29 20  ITE_UNTESTABLE) 
36390 2a 2f 0a 0a 20 20 69 66 28 20 63 3d 3d 27 74 27  */..  if( c=='t'
363a0 20 26 26 20 6e 3e 34 20 26 26 20 73 74 72 6e 63   && n>4 && strnc
363b0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 74 69  mp(azArg[0], "ti
363c0 6d 65 6f 75 74 22 2c 20 6e 29 3d 3d 30 20 29 7b  meout", n)==0 ){
363d0 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
363e0 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
363f0 62 75 73 79 5f 74 69 6d 65 6f 75 74 28 70 2d 3e  busy_timeout(p->
36400 64 62 2c 20 6e 41 72 67 3e 3d 32 20 3f 20 28 69  db, nArg>=2 ? (i
36410 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28  nt)integerValue(
36420 61 7a 41 72 67 5b 31 5d 29 20 3a 20 30 29 3b 0a  azArg[1]) : 0);.
36430 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
36440 3d 3d 27 74 27 20 26 26 20 6e 3e 3d 35 20 26 26  =='t' && n>=5 &&
36450 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
36460 5d 2c 20 22 74 69 6d 65 72 22 2c 20 6e 29 3d 3d  ], "timer", n)==
36470 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  0 ){.    if( nAr
36480 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 65 6e  g==2 ){.      en
36490 61 62 6c 65 54 69 6d 65 72 20 3d 20 62 6f 6f 6c  ableTimer = bool
364a0 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31  eanValue(azArg[1
364b0 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 6e  ]);.      if( en
364c0 61 62 6c 65 54 69 6d 65 72 20 26 26 20 21 48 41  ableTimer && !HA
364d0 53 5f 54 49 4d 45 52 20 29 7b 0a 20 20 20 20 20  S_TIMER ){.     
364e0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
364f0 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 74 69  derr, "Error: ti
36500 6d 65 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c  mer not availabl
36510 65 20 6f 6e 20 74 68 69 73 20 73 79 73 74 65 6d  e on this system
36520 2e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 65  .\n");.        e
36530 6e 61 62 6c 65 54 69 6d 65 72 20 3d 20 30 3b 0a  nableTimer = 0;.
36540 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
36550 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
36560 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
36570 67 65 3a 20 2e 74 69 6d 65 72 20 6f 6e 7c 6f 66  ge: .timer on|of
36580 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  f\n");.      rc 
36590 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
365a0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 74 27  se..  if( c=='t'
365b0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
365c0 67 5b 30 5d 2c 20 22 74 72 61 63 65 22 2c 20 6e  g[0], "trace", n
365d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e  )==0 ){.    open
365e0 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 69  _db(p, 0);.    i
365f0 66 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20  f( nArg!=2 ){.  
36600 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
36610 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
36620 74 72 61 63 65 20 46 49 4c 45 7c 6f 66 66 5c 6e  trace FILE|off\n
36630 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
36640 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74  ;.      goto met
36650 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
36660 20 20 20 20 7d 0a 20 20 20 20 6f 75 74 70 75 74      }.    output
36670 5f 66 69 6c 65 5f 63 6c 6f 73 65 28 70 2d 3e 74  _file_close(p->t
36680 72 61 63 65 4f 75 74 29 3b 0a 20 20 20 20 70 2d  raceOut);.    p-
36690 3e 74 72 61 63 65 4f 75 74 20 3d 20 6f 75 74 70  >traceOut = outp
366a0 75 74 5f 66 69 6c 65 5f 6f 70 65 6e 28 61 7a 41  ut_file_open(azA
366b0 72 67 5b 31 5d 29 3b 0a 23 69 66 20 21 64 65 66  rg[1]);.#if !def
366c0 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
366d0 5f 54 52 41 43 45 29 20 26 26 20 21 64 65 66 69  _TRACE) && !defi
366e0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
366f0 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a  FLOATING_POINT).
36700 20 20 20 20 69 66 28 20 70 2d 3e 74 72 61 63 65      if( p->trace
36710 4f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Out==0 ){.      
36720 73 71 6c 69 74 65 33 5f 74 72 61 63 65 5f 76 32  sqlite3_trace_v2
36730 28 70 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 30 29  (p->db, 0, 0, 0)
36740 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
36750 20 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65     sqlite3_trace
36760 5f 76 32 28 70 2d 3e 64 62 2c 20 53 51 4c 49 54  _v2(p->db, SQLIT
36770 45 5f 54 52 41 43 45 5f 53 54 4d 54 2c 20 73 71  E_TRACE_STMT, sq
36780 6c 5f 74 72 61 63 65 5f 63 61 6c 6c 62 61 63 6b  l_trace_callback
36790 2c 70 2d 3e 74 72 61 63 65 4f 75 74 29 3b 0a 20  ,p->traceOut);. 
367a0 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65     }.#endif.  }e
367b0 6c 73 65 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f  lse..#if SQLITE_
367c0 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54  USER_AUTHENTICAT
367d0 49 4f 4e 0a 20 20 69 66 28 20 63 3d 3d 27 75 27  ION.  if( c=='u'
367e0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
367f0 67 5b 30 5d 2c 20 22 75 73 65 72 22 2c 20 6e 29  g[0], "user", n)
36800 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
36810 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 72  Arg<2 ){.      r
36820 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
36830 2c 20 22 55 73 61 67 65 3a 20 2e 75 73 65 72 20  , "Usage: .user 
36840 53 55 42 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 5c 6e  SUBCOMMAND ...\n
36850 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
36860 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74  ;.      goto met
36870 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
36880 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64      }.    open_d
36890 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  b(p, 0);.    if(
368a0 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d   strcmp(azArg[1]
368b0 2c 22 6c 6f 67 69 6e 22 29 3d 3d 30 20 29 7b 0a  ,"login")==0 ){.
368c0 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d        if( nArg!=
368d0 34 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  4 ){.        raw
368e0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
368f0 22 55 73 61 67 65 3a 20 2e 75 73 65 72 20 6c 6f  "Usage: .user lo
36900 67 69 6e 20 55 53 45 52 20 50 41 53 53 57 4f 52  gin USER PASSWOR
36910 44 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72  D\n");.        r
36920 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67  c = 1;.        g
36930 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
36940 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  _exit;.      }. 
36950 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
36960 33 5f 75 73 65 72 5f 61 75 74 68 65 6e 74 69 63  3_user_authentic
36970 61 74 65 28 70 2d 3e 64 62 2c 20 61 7a 41 72 67  ate(p->db, azArg
36980 5b 32 5d 2c 20 61 7a 41 72 67 5b 33 5d 2c 0a 20  [2], azArg[3],. 
36990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
369a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
369b0 20 20 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 61     (int)strlen(a
369c0 7a 41 72 67 5b 33 5d 29 29 3b 0a 20 20 20 20 20  zArg[3]));.     
369d0 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
369e0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
369f0 74 64 65 72 72 2c 20 22 41 75 74 68 65 6e 74 69  tderr, "Authenti
36a00 63 61 74 69 6f 6e 20 66 61 69 6c 65 64 20 66 6f  cation failed fo
36a10 72 20 75 73 65 72 20 25 73 5c 6e 22 2c 20 61 7a  r user %s\n", az
36a20 41 72 67 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[2]);.       
36a30 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d   rc = 1;.      }
36a40 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
36a50 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  trcmp(azArg[1],"
36a60 61 64 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  add")==0 ){.    
36a70 20 20 69 66 28 20 6e 41 72 67 21 3d 35 20 29 7b    if( nArg!=5 ){
36a80 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
36a90 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
36aa0 67 65 3a 20 2e 75 73 65 72 20 61 64 64 20 55 53  ge: .user add US
36ab0 45 52 20 50 41 53 53 57 4f 52 44 20 49 53 41 44  ER PASSWORD ISAD
36ac0 4d 49 4e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  MIN\n");.       
36ad0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
36ae0 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
36af0 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d  nd_exit;.      }
36b00 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
36b10 74 65 33 5f 75 73 65 72 5f 61 64 64 28 70 2d 3e  te3_user_add(p->
36b20 64 62 2c 20 61 7a 41 72 67 5b 32 5d 2c 0a 20 20  db, azArg[2],.  
36b30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36b40 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b            azArg[
36b50 33 5d 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  3], (int)strlen(
36b60 61 7a 41 72 67 5b 33 5d 29 2c 0a 20 20 20 20 20  azArg[3]),.     
36b70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36b80 20 20 20 20 20 20 20 62 6f 6f 6c 65 61 6e 56 61         booleanVa
36b90 6c 75 65 28 61 7a 41 72 67 5b 34 5d 29 29 3b 0a  lue(azArg[4]));.
36ba0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
36bb0 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
36bc0 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 65 72  tf(stderr, "User
36bd0 2d 41 64 64 20 66 61 69 6c 65 64 3a 20 25 64 5c  -Add failed: %d\
36be0 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20  n", rc);.       
36bf0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d   rc = 1;.      }
36c00 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
36c10 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  trcmp(azArg[1],"
36c20 65 64 69 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20  edit")==0 ){.   
36c30 20 20 20 69 66 28 20 6e 41 72 67 21 3d 35 20 29     if( nArg!=5 )
36c40 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  {.        raw_pr
36c50 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
36c60 61 67 65 3a 20 2e 75 73 65 72 20 65 64 69 74 20  age: .user edit 
36c70 55 53 45 52 20 50 41 53 53 57 4f 52 44 20 49 53  USER PASSWORD IS
36c80 41 44 4d 49 4e 5c 6e 22 29 3b 0a 20 20 20 20 20  ADMIN\n");.     
36c90 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
36ca0 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
36cb0 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20  mand_exit;.     
36cc0 20 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71   }.      rc = sq
36cd0 6c 69 74 65 33 5f 75 73 65 72 5f 63 68 61 6e 67  lite3_user_chang
36ce0 65 28 70 2d 3e 64 62 2c 20 61 7a 41 72 67 5b 32  e(p->db, azArg[2
36cf0 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ],.             
36d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d10 20 61 7a 41 72 67 5b 33 5d 2c 20 28 69 6e 74 29   azArg[3], (int)
36d20 73 74 72 6c 65 6e 28 61 7a 41 72 67 5b 33 5d 29  strlen(azArg[3])
36d30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
36d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d50 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41  booleanValue(azA
36d60 72 67 5b 34 5d 29 29 3b 0a 20 20 20 20 20 20 69  rg[4]));.      i
36d70 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
36d80 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
36d90 72 72 2c 20 22 55 73 65 72 2d 45 64 69 74 20 66  rr, "User-Edit f
36da0 61 69 6c 65 64 3a 20 25 64 5c 6e 22 2c 20 72 63  ailed: %d\n", rc
36db0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
36dc0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
36dd0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
36de0 61 7a 41 72 67 5b 31 5d 2c 22 64 65 6c 65 74 65  azArg[1],"delete
36df0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
36e00 66 28 20 6e 41 72 67 21 3d 33 20 29 7b 0a 20 20  f( nArg!=3 ){.  
36e10 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
36e20 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
36e30 20 2e 75 73 65 72 20 64 65 6c 65 74 65 20 55 53   .user delete US
36e40 45 52 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  ER\n");.        
36e50 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
36e60 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
36e70 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a  d_exit;.      }.
36e80 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
36e90 65 33 5f 75 73 65 72 5f 64 65 6c 65 74 65 28 70  e3_user_delete(p
36ea0 2d 3e 64 62 2c 20 61 7a 41 72 67 5b 32 5d 29 3b  ->db, azArg[2]);
36eb0 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
36ec0 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
36ed0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 65  ntf(stderr, "Use
36ee0 72 2d 44 65 6c 65 74 65 20 66 61 69 6c 65 64 3a  r-Delete failed:
36ef0 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20   %d\n", rc);.   
36f00 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
36f10 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a     }.    }else{.
36f20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
36f30 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
36f40 20 2e 75 73 65 72 20 6c 6f 67 69 6e 7c 61 64 64   .user login|add
36f50 7c 65 64 69 74 7c 64 65 6c 65 74 65 20 2e 2e 2e  |edit|delete ...
36f60 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
36f70 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d   1;.      goto m
36f80 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
36f90 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
36fa0 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
36fb0 5f 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41  _USER_AUTHENTICA
36fc0 54 49 4f 4e 20 2a 2f 0a 0a 20 20 69 66 28 20 63  TION */..  if( c
36fd0 3d 3d 27 76 27 20 26 26 20 73 74 72 6e 63 6d 70  =='v' && strncmp
36fe0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 76 65 72 73  (azArg[0], "vers
36ff0 69 6f 6e 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ion", n)==0 ){. 
37000 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
37010 2d 3e 6f 75 74 2c 20 22 53 51 4c 69 74 65 20 25  ->out, "SQLite %
37020 73 20 25 73 5c 6e 22 20 2f 2a 65 78 74 72 61 2d  s %s\n" /*extra-
37030 76 65 72 73 69 6f 6e 2d 69 6e 66 6f 2a 2f 2c 0a  version-info*/,.
37040 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
37050 6c 69 62 76 65 72 73 69 6f 6e 28 29 2c 20 73 71  libversion(), sq
37060 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29  lite3_sourceid()
37070 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  );.  }else..  if
37080 28 20 63 3d 3d 27 76 27 20 26 26 20 73 74 72 6e  ( c=='v' && strn
37090 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 76  cmp(azArg[0], "v
370a0 66 73 69 6e 66 6f 22 2c 20 6e 29 3d 3d 30 20 29  fsinfo", n)==0 )
370b0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
370c0 20 2a 7a 44 62 4e 61 6d 65 20 3d 20 6e 41 72 67   *zDbName = nArg
370d0 3d 3d 32 20 3f 20 61 7a 41 72 67 5b 31 5d 20 3a  ==2 ? azArg[1] :
370e0 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 73 71 6c   "main";.    sql
370f0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d  ite3_vfs *pVfs =
37100 20 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64   0;.    if( p->d
37110 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  b ){.      sqlit
37120 65 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28  e3_file_control(
37130 70 2d 3e 64 62 2c 20 7a 44 62 4e 61 6d 65 2c 20  p->db, zDbName, 
37140 53 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53  SQLITE_FCNTL_VFS
37150 5f 50 4f 49 4e 54 45 52 2c 20 26 70 56 66 73 29  _POINTER, &pVfs)
37160 3b 0a 20 20 20 20 20 20 69 66 28 20 70 56 66 73  ;.      if( pVfs
37170 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
37180 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
37190 22 76 66 73 2e 7a 4e 61 6d 65 20 20 20 20 20 20  "vfs.zName      
371a0 3d 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 70 56 66  = \"%s\"\n", pVf
371b0 73 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  s->zName);.     
371c0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
371d0 3e 6f 75 74 2c 20 22 76 66 73 2e 69 56 65 72 73  >out, "vfs.iVers
371e0 69 6f 6e 20 20 20 3d 20 25 64 5c 6e 22 2c 20 70  ion   = %d\n", p
371f0 56 66 73 2d 3e 69 56 65 72 73 69 6f 6e 29 3b 0a  Vfs->iVersion);.
37200 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
37210 74 66 28 70 2d 3e 6f 75 74 2c 20 22 76 66 73 2e  tf(p->out, "vfs.
37220 73 7a 4f 73 46 69 6c 65 20 20 20 3d 20 25 64 5c  szOsFile   = %d\
37230 6e 22 2c 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69  n", pVfs->szOsFi
37240 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77  le);.        raw
37250 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
37260 22 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20  "vfs.mxPathname 
37270 3d 20 25 64 5c 6e 22 2c 20 70 56 66 73 2d 3e 6d  = %d\n", pVfs->m
37280 78 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20  xPathname);.    
37290 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73    }.    }.  }els
372a0 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 76 27 20  e..  if( c=='v' 
372b0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
372c0 5b 30 5d 2c 20 22 76 66 73 6c 69 73 74 22 2c 20  [0], "vfslist", 
372d0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  n)==0 ){.    sql
372e0 69 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a  ite3_vfs *pVfs;.
372f0 20 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20      sqlite3_vfs 
37300 2a 70 43 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20  *pCurrent = 0;. 
37310 20 20 20 69 66 28 20 70 2d 3e 64 62 20 29 7b 0a     if( p->db ){.
37320 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
37330 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62  le_control(p->db
37340 2c 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45  , "main", SQLITE
37350 5f 46 43 4e 54 4c 5f 56 46 53 5f 50 4f 49 4e 54  _FCNTL_VFS_POINT
37360 45 52 2c 20 26 70 43 75 72 72 65 6e 74 29 3b 0a  ER, &pCurrent);.
37370 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 56      }.    for(pV
37380 66 73 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66  fs=sqlite3_vfs_f
37390 69 6e 64 28 30 29 3b 20 70 56 66 73 3b 20 70 56  ind(0); pVfs; pV
373a0 66 73 3d 70 56 66 73 2d 3e 70 4e 65 78 74 29 7b  fs=pVfs->pNext){
373b0 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e  .      utf8_prin
373c0 74 66 28 70 2d 3e 6f 75 74 2c 20 22 76 66 73 2e  tf(p->out, "vfs.
373d0 7a 4e 61 6d 65 20 20 20 20 20 20 3d 20 5c 22 25  zName      = \"%
373e0 73 5c 22 25 73 5c 6e 22 2c 20 70 56 66 73 2d 3e  s\"%s\n", pVfs->
373f0 7a 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20  zName,.         
37400 20 20 70 56 66 73 3d 3d 70 43 75 72 72 65 6e 74    pVfs==pCurrent
37410 20 3f 20 22 20 20 3c 2d 2d 2d 20 43 55 52 52 45   ? "  <--- CURRE
37420 4e 54 22 20 3a 20 22 22 29 3b 0a 20 20 20 20 20  NT" : "");.     
37430 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
37440 75 74 2c 20 22 76 66 73 2e 69 56 65 72 73 69 6f  ut, "vfs.iVersio
37450 6e 20 20 20 3d 20 25 64 5c 6e 22 2c 20 70 56 66  n   = %d\n", pVf
37460 73 2d 3e 69 56 65 72 73 69 6f 6e 29 3b 0a 20 20  s->iVersion);.  
37470 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
37480 2d 3e 6f 75 74 2c 20 22 76 66 73 2e 73 7a 4f 73  ->out, "vfs.szOs
37490 46 69 6c 65 20 20 20 3d 20 25 64 5c 6e 22 2c 20  File   = %d\n", 
374a0 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b  pVfs->szOsFile);
374b0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
374c0 66 28 70 2d 3e 6f 75 74 2c 20 22 76 66 73 2e 6d  f(p->out, "vfs.m
374d0 78 50 61 74 68 6e 61 6d 65 20 3d 20 25 64 5c 6e  xPathname = %d\n
374e0 22 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  ", pVfs->mxPathn
374f0 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20  ame);.      if( 
37500 70 56 66 73 2d 3e 70 4e 65 78 74 20 29 7b 0a 20  pVfs->pNext ){. 
37510 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
37520 66 28 70 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d  f(p->out, "-----
37530 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37540 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e  --------------\n
37550 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
37560 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
37570 20 63 3d 3d 27 76 27 20 26 26 20 73 74 72 6e 63   c=='v' && strnc
37580 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 76 66  mp(azArg[0], "vf
37590 73 6e 61 6d 65 22 2c 20 6e 29 3d 3d 30 20 29 7b  sname", n)==0 ){
375a0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
375b0 2a 7a 44 62 4e 61 6d 65 20 3d 20 6e 41 72 67 3d  *zDbName = nArg=
375c0 3d 32 20 3f 20 61 7a 41 72 67 5b 31 5d 20 3