/ Hex Artifact Content
Login

Artifact f57fa72ec6aa5e330966adaa51a476f08a877a82e482cd26a06a7d7c1ecb666b:


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 23 69 66 64 65 66 20 53 51 4c  , 0);.#ifdef SQL
25610 49 54 45 5f 48 41 56 45 5f 5a 4c 49 42 0a 20 20  ITE_HAVE_ZLIB.  
25620 20 20 20 20 73 71 6c 69 74 65 33 5f 73 71 6c 61      sqlite3_sqla
25630 72 5f 69 6e 69 74 28 64 62 2c 20 30 2c 20 30 29  r_init(db, 0, 0)
25640 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c  ;.#endif.    }el
25650 73 65 7b 0a 20 20 20 20 20 20 64 62 20 3d 20 70  se{.      db = p
25660 53 74 61 74 65 2d 3e 64 62 3b 0a 20 20 20 20 7d  State->db;.    }
25670 0a 0a 20 20 20 20 73 77 69 74 63 68 28 20 63 6d  ..    switch( cm
25680 64 2e 65 43 6d 64 20 29 7b 0a 20 20 20 20 20 20  d.eCmd ){.      
25690 63 61 73 65 20 41 52 5f 43 4d 44 5f 43 52 45 41  case AR_CMD_CREA
256a0 54 45 3a 0a 20 20 20 20 20 20 20 20 72 63 20 3d  TE:.        rc =
256b0 20 61 72 43 72 65 61 74 65 43 6f 6d 6d 61 6e 64   arCreateCommand
256c0 28 70 53 74 61 74 65 2c 20 64 62 2c 20 26 63 6d  (pState, db, &cm
256d0 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  d);.        brea
256e0 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65 20 41  k;..      case A
256f0 52 5f 43 4d 44 5f 45 58 54 52 41 43 54 3a 0a 20  R_CMD_EXTRACT:. 
25700 20 20 20 20 20 20 20 72 63 20 3d 20 61 72 45 78         rc = arEx
25710 74 72 61 63 74 43 6f 6d 6d 61 6e 64 28 70 53 74  tractCommand(pSt
25720 61 74 65 2c 20 64 62 2c 20 26 63 6d 64 29 3b 0a  ate, db, &cmd);.
25730 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a          break;..
25740 20 20 20 20 20 20 63 61 73 65 20 41 52 5f 43 4d        case AR_CM
25750 44 5f 4c 49 53 54 3a 0a 20 20 20 20 20 20 20 20  D_LIST:.        
25760 72 63 20 3d 20 61 72 4c 69 73 74 43 6f 6d 6d 61  rc = arListComma
25770 6e 64 28 70 53 74 61 74 65 2c 20 64 62 2c 20 26  nd(pState, db, &
25780 63 6d 64 29 3b 0a 20 20 20 20 20 20 20 20 62 72  cmd);.        br
25790 65 61 6b 3b 0a 0a 20 20 20 20 20 20 63 61 73 65  eak;..      case
257a0 20 41 52 5f 43 4d 44 5f 48 45 4c 50 3a 0a 20 20   AR_CMD_HELP:.  
257b0 20 20 20 20 20 20 61 72 55 73 61 67 65 28 70 53        arUsage(pS
257c0 74 61 74 65 2d 3e 6f 75 74 29 3b 0a 20 20 20 20  tate->out);.    
257d0 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
257e0 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20    default:.     
257f0 20 20 20 61 73 73 65 72 74 28 20 63 6d 64 2e 65     assert( cmd.e
25800 43 6d 64 3d 3d 41 52 5f 43 4d 44 5f 55 50 44 41  Cmd==AR_CMD_UPDA
25810 54 45 20 29 3b 0a 20 20 20 20 20 20 20 20 72 63  TE );.        rc
25820 20 3d 20 61 72 55 70 64 61 74 65 43 6d 64 28 70   = arUpdateCmd(p
25830 53 74 61 74 65 2c 20 64 62 2c 20 26 63 6d 64 29  State, db, &cmd)
25840 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
25850 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20  .    }..    if( 
25860 63 6d 64 2e 7a 46 69 6c 65 20 29 7b 0a 20 20 20  cmd.zFile ){.   
25870 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65     sqlite3_close
25880 28 64 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  (db);.    }.  }.
25890 0a 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a  .  return rc;.}.
258a0 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65 6d 65 6e 74  ./*.** Implement
258b0 61 74 69 6f 6e 20 6f 66 20 22 2e 65 78 70 65 72  ation of ".exper
258c0 74 22 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 2e 0a  t" dot command..
258d0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
258e0 70 65 72 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 0a  pertDotCommand(.
258f0 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53    ShellState *pS
25900 74 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  tate,           
25910 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68 65    /* Current she
25920 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f  ll tool state */
25930 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c  .  char **azArg,
25940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25950 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61     /* Array of a
25960 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20  rguments passed 
25970 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a  to dot command *
25980 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20  /.  int nArg    
25990 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
259a0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
259b0 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72   entries in azAr
259c0 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  g[] */.){.  int 
259d0 72 63 20 3d 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a  rc = SQLITE_OK;.
259e0 20 20 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30    char *zErr = 0
259f0 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74  ;.  int i;.  int
25a00 20 69 53 61 6d 70 6c 65 20 3d 20 30 3b 0a 0a 20   iSample = 0;.. 
25a10 20 61 73 73 65 72 74 28 20 70 53 74 61 74 65 2d   assert( pState-
25a20 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 3d  >expert.pExpert=
25a30 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28 26  =0 );.  memset(&
25a40 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2c 20  pState->expert, 
25a50 30 2c 20 73 69 7a 65 6f 66 28 45 78 70 65 72 74  0, sizeof(Expert
25a60 49 6e 66 6f 29 29 3b 0a 0a 20 20 66 6f 72 28 69  Info));..  for(i
25a70 3d 31 3b 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f  =1; rc==SQLITE_O
25a80 4b 20 26 26 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  K && i<nArg; i++
25a90 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d  ){.    char *z =
25aa0 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 69   azArg[i];.    i
25ab0 6e 74 20 6e 3b 0a 20 20 20 20 69 66 28 20 7a 5b  nt n;.    if( z[
25ac0 30 5d 3d 3d 27 2d 27 20 26 26 20 7a 5b 31 5d 3d  0]=='-' && z[1]=
25ad0 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20  ='-' ) z++;.    
25ae0 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 29 3b 0a 20  n = strlen(z);. 
25af0 20 20 20 69 66 28 20 6e 3e 3d 32 20 26 26 20 30     if( n>=2 && 0
25b00 3d 3d 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 76  ==strncmp(z, "-v
25b10 65 72 62 6f 73 65 22 2c 20 6e 29 20 29 7b 0a 20  erbose", n) ){. 
25b20 20 20 20 20 20 70 53 74 61 74 65 2d 3e 65 78 70       pState->exp
25b30 65 72 74 2e 62 56 65 72 62 6f 73 65 20 3d 20 31  ert.bVerbose = 1
25b40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65  ;.    }.    else
25b50 20 69 66 28 20 6e 3e 3d 32 20 26 26 20 30 3d 3d   if( n>=2 && 0==
25b60 73 74 72 6e 63 6d 70 28 7a 2c 20 22 2d 73 61 6d  strncmp(z, "-sam
25b70 70 6c 65 22 2c 20 6e 29 20 29 7b 0a 20 20 20 20  ple", n) ){.    
25b80 20 20 69 66 28 20 69 3d 3d 28 6e 41 72 67 2d 31    if( i==(nArg-1
25b90 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  ) ){.        raw
25ba0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
25bb0 22 6f 70 74 69 6f 6e 20 72 65 71 75 69 72 65 73  "option requires
25bc0 20 61 6e 20 61 72 67 75 6d 65 6e 74 3a 20 25 73   an argument: %s
25bd0 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20  \n", z);.       
25be0 20 72 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52   rc = SQLITE_ERR
25bf0 4f 52 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  OR;.      }else{
25c00 0a 20 20 20 20 20 20 20 20 69 53 61 6d 70 6c 65  .        iSample
25c10 20 3d 20 28 69 6e 74 29 69 6e 74 65 67 65 72 56   = (int)integerV
25c20 61 6c 75 65 28 61 7a 41 72 67 5b 2b 2b 69 5d 29  alue(azArg[++i])
25c30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 53  ;.        if( iS
25c40 61 6d 70 6c 65 3c 30 20 7c 7c 20 69 53 61 6d 70  ample<0 || iSamp
25c50 6c 65 3e 31 30 30 20 29 7b 0a 20 20 20 20 20 20  le>100 ){.      
25c60 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
25c70 74 64 65 72 72 2c 20 22 76 61 6c 75 65 20 6f 75  tderr, "value ou
25c80 74 20 6f 66 20 72 61 6e 67 65 3a 20 25 73 5c 6e  t of range: %s\n
25c90 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  ", azArg[i]);.  
25ca0 20 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c          rc = SQL
25cb0 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20  ITE_ERROR;.     
25cc0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
25cd0 20 7d 0a 20 20 20 20 65 6c 73 65 7b 0a 20 20 20   }.    else{.   
25ce0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
25cf0 64 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f  derr, "unknown o
25d00 70 74 69 6f 6e 3a 20 25 73 5c 6e 22 2c 20 7a 29  ption: %s\n", z)
25d10 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
25d20 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
25d30 0a 20 20 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d  .  }..  if( rc==
25d40 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
25d50 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e   pState->expert.
25d60 70 45 78 70 65 72 74 20 3d 20 73 71 6c 69 74 65  pExpert = sqlite
25d70 33 5f 65 78 70 65 72 74 5f 6e 65 77 28 70 53 74  3_expert_new(pSt
25d80 61 74 65 2d 3e 64 62 2c 20 26 7a 45 72 72 29 3b  ate->db, &zErr);
25d90 0a 20 20 20 20 69 66 28 20 70 53 74 61 74 65 2d  .    if( pState-
25da0 3e 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 3d  >expert.pExpert=
25db0 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  =0 ){.      raw_
25dc0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
25dd0 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 6e  sqlite3_expert_n
25de0 65 77 3a 20 25 73 5c 6e 22 2c 20 7a 45 72 72 29  ew: %s\n", zErr)
25df0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c  ;.      rc = SQL
25e00 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 7d  ITE_ERROR;.    }
25e10 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69  else{.      sqli
25e20 74 65 33 5f 65 78 70 65 72 74 5f 63 6f 6e 66 69  te3_expert_confi
25e30 67 28 0a 20 20 20 20 20 20 20 20 20 20 70 53 74  g(.          pSt
25e40 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70  ate->expert.pExp
25e50 65 72 74 2c 20 45 58 50 45 52 54 5f 43 4f 4e 46  ert, EXPERT_CONF
25e60 49 47 5f 53 41 4d 50 4c 45 2c 20 69 53 61 6d 70  IG_SAMPLE, iSamp
25e70 6c 65 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20  le.      );.    
25e80 7d 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20  }.  }..  return 
25e90 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 49 66  rc;.}.../*.** If
25ea0 20 61 6e 20 69 6e 70 75 74 20 6c 69 6e 65 20 62   an input line b
25eb0 65 67 69 6e 73 20 77 69 74 68 20 22 2e 22 20 74  egins with "." t
25ec0 68 65 6e 20 69 6e 76 6f 6b 65 20 74 68 69 73 20  hen invoke this 
25ed0 72 6f 75 74 69 6e 65 20 74 6f 0a 2a 2a 20 70 72  routine to.** pr
25ee0 6f 63 65 73 73 20 74 68 61 74 20 6c 69 6e 65 2e  ocess that line.
25ef0 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 31 20  .**.** Return 1 
25f00 6f 6e 20 65 72 72 6f 72 2c 20 32 20 74 6f 20 65  on error, 2 to e
25f10 78 69 74 2c 20 61 6e 64 20 30 20 6f 74 68 65 72  xit, and 0 other
25f20 77 69 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  wise..*/.static 
25f30 69 6e 74 20 64 6f 5f 6d 65 74 61 5f 63 6f 6d 6d  int do_meta_comm
25f40 61 6e 64 28 63 68 61 72 20 2a 7a 4c 69 6e 65 2c  and(char *zLine,
25f50 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b   ShellState *p){
25f60 0a 20 20 69 6e 74 20 68 20 3d 20 31 3b 0a 20 20  .  int h = 1;.  
25f70 69 6e 74 20 6e 41 72 67 20 3d 20 30 3b 0a 20 20  int nArg = 0;.  
25f80 69 6e 74 20 6e 2c 20 63 3b 0a 20 20 69 6e 74 20  int n, c;.  int 
25f90 72 63 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a  rc = 0;.  char *
25fa0 61 7a 41 72 67 5b 35 30 5d 3b 0a 0a 20 20 69 66  azArg[50];..  if
25fb0 28 20 70 2d 3e 65 78 70 65 72 74 2e 70 45 78 70  ( p->expert.pExp
25fc0 65 72 74 20 29 7b 0a 20 20 20 20 65 78 70 65 72  ert ){.    exper
25fd0 74 46 69 6e 69 73 68 28 70 2c 20 31 2c 20 30 29  tFinish(p, 1, 0)
25fe0 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 50 61 72 73  ;.  }..  /* Pars
25ff0 65 20 74 68 65 20 69 6e 70 75 74 20 6c 69 6e 65  e the input line
26000 20 69 6e 74 6f 20 74 6f 6b 65 6e 73 2e 0a 20 20   into tokens..  
26010 2a 2f 0a 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e  */.  while( zLin
26020 65 5b 68 5d 20 26 26 20 6e 41 72 67 3c 41 72 72  e[h] && nArg<Arr
26030 61 79 53 69 7a 65 28 61 7a 41 72 67 29 20 29 7b  aySize(azArg) ){
26040 0a 20 20 20 20 77 68 69 6c 65 28 20 49 73 53 70  .    while( IsSp
26050 61 63 65 28 7a 4c 69 6e 65 5b 68 5d 29 20 29 7b  ace(zLine[h]) ){
26060 20 68 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20   h++; }.    if( 
26070 7a 4c 69 6e 65 5b 68 5d 3d 3d 30 20 29 20 62 72  zLine[h]==0 ) br
26080 65 61 6b 3b 0a 20 20 20 20 69 66 28 20 7a 4c 69  eak;.    if( zLi
26090 6e 65 5b 68 5d 3d 3d 27 5c 27 27 20 7c 7c 20 7a  ne[h]=='\'' || z
260a0 4c 69 6e 65 5b 68 5d 3d 3d 27 22 27 20 29 7b 0a  Line[h]=='"' ){.
260b0 20 20 20 20 20 20 69 6e 74 20 64 65 6c 69 6d 20        int delim 
260c0 3d 20 7a 4c 69 6e 65 5b 68 2b 2b 5d 3b 0a 20 20  = zLine[h++];.  
260d0 20 20 20 20 61 7a 41 72 67 5b 6e 41 72 67 2b 2b      azArg[nArg++
260e0 5d 20 3d 20 26 7a 4c 69 6e 65 5b 68 5d 3b 0a 20  ] = &zLine[h];. 
260f0 20 20 20 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e       while( zLin
26100 65 5b 68 5d 20 26 26 20 7a 4c 69 6e 65 5b 68 5d  e[h] && zLine[h]
26110 21 3d 64 65 6c 69 6d 20 29 7b 0a 20 20 20 20 20  !=delim ){.     
26120 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d     if( zLine[h]=
26130 3d 27 5c 5c 27 20 26 26 20 64 65 6c 69 6d 3d 3d  ='\\' && delim==
26140 27 22 27 20 26 26 20 7a 4c 69 6e 65 5b 68 2b 31  '"' && zLine[h+1
26150 5d 21 3d 30 20 29 20 68 2b 2b 3b 0a 20 20 20 20  ]!=0 ) h++;.    
26160 20 20 20 20 68 2b 2b 3b 0a 20 20 20 20 20 20 7d      h++;.      }
26170 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65  .      if( zLine
26180 5b 68 5d 3d 3d 64 65 6c 69 6d 20 29 7b 0a 20 20  [h]==delim ){.  
26190 20 20 20 20 20 20 7a 4c 69 6e 65 5b 68 2b 2b 5d        zLine[h++]
261a0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
261b0 20 20 20 20 69 66 28 20 64 65 6c 69 6d 3d 3d 27      if( delim=='
261c0 22 27 20 29 20 72 65 73 6f 6c 76 65 5f 62 61 63  "' ) resolve_bac
261d0 6b 73 6c 61 73 68 65 73 28 61 7a 41 72 67 5b 6e  kslashes(azArg[n
261e0 41 72 67 2d 31 5d 29 3b 0a 20 20 20 20 7d 65 6c  Arg-1]);.    }el
261f0 73 65 7b 0a 20 20 20 20 20 20 61 7a 41 72 67 5b  se{.      azArg[
26200 6e 41 72 67 2b 2b 5d 20 3d 20 26 7a 4c 69 6e 65  nArg++] = &zLine
26210 5b 68 5d 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  [h];.      while
26220 28 20 7a 4c 69 6e 65 5b 68 5d 20 26 26 20 21 49  ( zLine[h] && !I
26230 73 53 70 61 63 65 28 7a 4c 69 6e 65 5b 68 5d 29  sSpace(zLine[h])
26240 20 29 7b 20 68 2b 2b 3b 20 7d 0a 20 20 20 20 20   ){ h++; }.     
26250 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 20 29 20   if( zLine[h] ) 
26260 7a 4c 69 6e 65 5b 68 2b 2b 5d 20 3d 20 30 3b 0a  zLine[h++] = 0;.
26270 20 20 20 20 20 20 72 65 73 6f 6c 76 65 5f 62 61        resolve_ba
26280 63 6b 73 6c 61 73 68 65 73 28 61 7a 41 72 67 5b  ckslashes(azArg[
26290 6e 41 72 67 2d 31 5d 29 3b 0a 20 20 20 20 7d 0a  nArg-1]);.    }.
262a0 20 20 7d 0a 0a 20 20 2f 2a 20 50 72 6f 63 65 73    }..  /* Proces
262b0 73 20 74 68 65 20 69 6e 70 75 74 20 6c 69 6e 65  s the input line
262c0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 6e 41 72  ..  */.  if( nAr
262d0 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  g==0 ) return 0;
262e0 20 2f 2a 20 6e 6f 20 74 6f 6b 65 6e 73 2c 20 6e   /* no tokens, n
262f0 6f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 6e 20 3d  o error */.  n =
26300 20 73 74 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b   strlen30(azArg[
26310 30 5d 29 3b 0a 20 20 63 20 3d 20 61 7a 41 72 67  0]);.  c = azArg
26320 5b 30 5d 5b 30 5d 3b 0a 0a 23 69 66 6e 64 65 66  [0][0];..#ifndef
26330 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54   SQLITE_OMIT_AUT
26340 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 69 66 28  HORIZATION.  if(
26350 20 63 3d 3d 27 61 27 20 26 26 20 73 74 72 6e 63   c=='a' && strnc
26360 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 61 75  mp(azArg[0], "au
26370 74 68 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  th", n)==0 ){.  
26380 20 20 69 66 28 20 6e 41 72 67 21 3d 32 20 29 7b    if( nArg!=2 ){
26390 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
263a0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
263b0 3a 20 2e 61 75 74 68 20 4f 4e 7c 4f 46 46 5c 6e  : .auth ON|OFF\n
263c0 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
263d0 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74  ;.      goto met
263e0 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
263f0 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64      }.    open_d
26400 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  b(p, 0);.    if(
26410 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a   booleanValue(az
26420 41 72 67 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20  Arg[1]) ){.     
26430 20 73 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74   sqlite3_set_aut
26440 68 6f 72 69 7a 65 72 28 70 2d 3e 64 62 2c 20 73  horizer(p->db, s
26450 68 65 6c 6c 41 75 74 68 2c 20 70 29 3b 0a 20 20  hellAuth, p);.  
26460 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
26470 71 6c 69 74 65 33 5f 73 65 74 5f 61 75 74 68 6f  qlite3_set_autho
26480 72 69 7a 65 72 28 70 2d 3e 64 62 2c 20 30 2c 20  rizer(p->db, 0, 
26490 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  0);.    }.  }els
264a0 65 0a 23 65 6e 64 69 66 0a 0a 23 69 66 6e 64 65  e.#endif..#ifnde
264b0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
264c0 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 69 66 28  RTUALTABLE.  if(
264d0 20 63 3d 3d 27 61 27 20 26 26 20 73 74 72 6e 63   c=='a' && strnc
264e0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 61 72  mp(azArg[0], "ar
264f0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
26500 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
26510 20 20 20 72 63 20 3d 20 61 72 44 6f 74 43 6f 6d     rc = arDotCom
26520 6d 61 6e 64 28 70 2c 20 61 7a 41 72 67 2c 20 6e  mand(p, azArg, n
26530 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  Arg);.  }else.#e
26540 6e 64 69 66 0a 0a 20 20 69 66 28 20 28 63 3d 3d  ndif..  if( (c==
26550 27 62 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73  'b' && n>=3 && s
26560 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
26570 20 22 62 61 63 6b 75 70 22 2c 20 6e 29 3d 3d 30   "backup", n)==0
26580 29 0a 20 20 20 7c 7c 20 28 63 3d 3d 27 73 27 20  ).   || (c=='s' 
26590 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63  && n>=3 && strnc
265a0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 61  mp(azArg[0], "sa
265b0 76 65 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 29 7b  ve", n)==0).  ){
265c0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
265d0 2a 7a 44 65 73 74 46 69 6c 65 20 3d 20 30 3b 0a  *zDestFile = 0;.
265e0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
265f0 7a 44 62 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  zDb = 0;.    sql
26600 69 74 65 33 20 2a 70 44 65 73 74 3b 0a 20 20 20  ite3 *pDest;.   
26610 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 20   sqlite3_backup 
26620 2a 70 42 61 63 6b 75 70 3b 0a 20 20 20 20 69 6e  *pBackup;.    in
26630 74 20 6a 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31  t j;.    for(j=1
26640 3b 20 6a 3c 6e 41 72 67 3b 20 6a 2b 2b 29 7b 0a  ; j<nArg; j++){.
26650 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
26660 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a   *z = azArg[j];.
26670 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d        if( z[0]==
26680 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 77  '-' ){.        w
26690 68 69 6c 65 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20  hile( z[0]=='-' 
266a0 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20 2f  ) z++;.        /
266b0 2a 20 4e 6f 20 6f 70 74 69 6f 6e 73 20 74 6f 20  * No options to 
266c0 70 72 6f 63 65 73 73 20 61 74 20 74 68 69 73 20  process at this 
266d0 74 69 6d 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  time */.        
266e0 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
266f0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
26700 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a  "unknown option:
26710 20 25 73 5c 6e 22 2c 20 61 7a 41 72 67 5b 6a 5d   %s\n", azArg[j]
26720 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
26730 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
26740 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
26750 20 7a 44 65 73 74 46 69 6c 65 3d 3d 30 20 29 7b   zDestFile==0 ){
26760 0a 20 20 20 20 20 20 20 20 7a 44 65 73 74 46 69  .        zDestFi
26770 6c 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20  le = azArg[j];. 
26780 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a       }else if( z
26790 44 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  Db==0 ){.       
267a0 20 7a 44 62 20 3d 20 7a 44 65 73 74 46 69 6c 65   zDb = zDestFile
267b0 3b 0a 20 20 20 20 20 20 20 20 7a 44 65 73 74 46  ;.        zDestF
267c0 69 6c 65 20 3d 20 61 7a 41 72 67 5b 6a 5d 3b 0a  ile = azArg[j];.
267d0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
267e0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
267f0 73 74 64 65 72 72 2c 20 22 74 6f 6f 20 6d 61 6e  stderr, "too man
26800 79 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 2e  y arguments to .
26810 62 61 63 6b 75 70 5c 6e 22 29 3b 0a 20 20 20 20  backup\n");.    
26820 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
26830 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
26840 69 66 28 20 7a 44 65 73 74 46 69 6c 65 3d 3d 30  if( zDestFile==0
26850 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
26860 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 6d 69  intf(stderr, "mi
26870 73 73 69 6e 67 20 46 49 4c 45 4e 41 4d 45 20 61  ssing FILENAME a
26880 72 67 75 6d 65 6e 74 20 6f 6e 20 2e 62 61 63 6b  rgument on .back
26890 75 70 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 65  up\n");.      re
268a0 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
268b0 20 20 69 66 28 20 7a 44 62 3d 3d 30 20 29 20 7a    if( zDb==0 ) z
268c0 44 62 20 3d 20 22 6d 61 69 6e 22 3b 0a 20 20 20  Db = "main";.   
268d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6f 70   rc = sqlite3_op
268e0 65 6e 28 7a 44 65 73 74 46 69 6c 65 2c 20 26 70  en(zDestFile, &p
268f0 44 65 73 74 29 3b 0a 20 20 20 20 69 66 28 20 72  Dest);.    if( r
26900 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
26910 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
26920 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
26930 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22  : cannot open \"
26940 25 73 5c 22 5c 6e 22 2c 20 7a 44 65 73 74 46 69  %s\"\n", zDestFi
26950 6c 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  le);.      sqlit
26960 65 33 5f 63 6c 6f 73 65 28 70 44 65 73 74 29 3b  e3_close(pDest);
26970 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
26980 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f  .    }.    open_
26990 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 70 42  db(p, 0);.    pB
269a0 61 63 6b 75 70 20 3d 20 73 71 6c 69 74 65 33 5f  ackup = sqlite3_
269b0 62 61 63 6b 75 70 5f 69 6e 69 74 28 70 44 65 73  backup_init(pDes
269c0 74 2c 20 22 6d 61 69 6e 22 2c 20 70 2d 3e 64 62  t, "main", p->db
269d0 2c 20 7a 44 62 29 3b 0a 20 20 20 20 69 66 28 20  , zDb);.    if( 
269e0 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a 20 20  pBackup==0 ){.  
269f0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
26a00 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
26a10 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65  %s\n", sqlite3_e
26a20 72 72 6d 73 67 28 70 44 65 73 74 29 29 3b 0a 20  rrmsg(pDest));. 
26a30 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f       sqlite3_clo
26a40 73 65 28 70 44 65 73 74 29 3b 0a 20 20 20 20 20  se(pDest);.     
26a50 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
26a60 0a 20 20 20 20 77 68 69 6c 65 28 20 20 28 72 63  .    while(  (rc
26a70 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75   = sqlite3_backu
26a80 70 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31  p_step(pBackup,1
26a90 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  00))==SQLITE_OK 
26aa0 29 7b 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ){}.    sqlite3_
26ab0 62 61 63 6b 75 70 5f 66 69 6e 69 73 68 28 70 42  backup_finish(pB
26ac0 61 63 6b 75 70 29 3b 0a 20 20 20 20 69 66 28 20  ackup);.    if( 
26ad0 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20  rc==SQLITE_DONE 
26ae0 29 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b  ){.      rc = 0;
26af0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
26b00 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
26b10 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73  derr, "Error: %s
26b20 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
26b30 6d 73 67 28 70 44 65 73 74 29 29 3b 0a 20 20 20  msg(pDest));.   
26b40 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
26b50 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .    sqlite3_clo
26b60 73 65 28 70 44 65 73 74 29 3b 0a 20 20 7d 65 6c  se(pDest);.  }el
26b70 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 62 27  se..  if( c=='b'
26b80 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e   && n>=3 && strn
26b90 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62  cmp(azArg[0], "b
26ba0 61 69 6c 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  ail", n)==0 ){. 
26bb0 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
26bc0 7b 0a 20 20 20 20 20 20 62 61 69 6c 5f 6f 6e 5f  {.      bail_on_
26bd0 65 72 72 6f 72 20 3d 20 62 6f 6f 6c 65 61 6e 56  error = booleanV
26be0 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a  alue(azArg[1]);.
26bf0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
26c00 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
26c10 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 62 61 69  rr, "Usage: .bai
26c20 6c 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20  l on|off\n");.  
26c30 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
26c40 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
26c50 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20   c=='b' && n>=3 
26c60 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
26c70 5b 30 5d 2c 20 22 62 69 6e 61 72 79 22 2c 20 6e  [0], "binary", n
26c80 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
26c90 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20  nArg==2 ){.     
26ca0 20 69 66 28 20 62 6f 6f 6c 65 61 6e 56 61 6c 75   if( booleanValu
26cb0 65 28 61 7a 41 72 67 5b 31 5d 29 20 29 7b 0a 20  e(azArg[1]) ){. 
26cc0 20 20 20 20 20 20 20 73 65 74 42 69 6e 61 72 79         setBinary
26cd0 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b  Mode(p->out, 1);
26ce0 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
26cf0 20 20 20 20 20 20 73 65 74 54 65 78 74 4d 6f 64        setTextMod
26d00 65 28 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20  e(p->out, 1);.  
26d10 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b      }.    }else{
26d20 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
26d30 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
26d40 3a 20 2e 62 69 6e 61 72 79 20 6f 6e 7c 6f 66 66  : .binary on|off
26d50 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
26d60 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
26d70 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63 27 20  e..  if( c=='c' 
26d80 26 26 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b  && strcmp(azArg[
26d90 30 5d 2c 22 63 64 22 29 3d 3d 30 20 29 7b 0a 20  0],"cd")==0 ){. 
26da0 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
26db0 7b 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57  {.#if defined(_W
26dc0 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64  IN32) || defined
26dd0 28 57 49 4e 33 32 29 0a 20 20 20 20 20 20 77 63  (WIN32).      wc
26de0 68 61 72 5f 74 20 2a 7a 20 3d 20 73 71 6c 69 74  har_t *z = sqlit
26df0 65 33 5f 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f  e3_win32_utf8_to
26e00 5f 75 6e 69 63 6f 64 65 28 61 7a 41 72 67 5b 31  _unicode(azArg[1
26e10 5d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 21  ]);.      rc = !
26e20 53 65 74 43 75 72 72 65 6e 74 44 69 72 65 63 74  SetCurrentDirect
26e30 6f 72 79 57 28 7a 29 3b 0a 20 20 20 20 20 20 73  oryW(z);.      s
26e40 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b 0a  qlite3_free(z);.
26e50 23 65 6c 73 65 0a 20 20 20 20 20 20 72 63 20 3d  #else.      rc =
26e60 20 63 68 64 69 72 28 61 7a 41 72 67 5b 31 5d 29   chdir(azArg[1])
26e70 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69  ;.#endif.      i
26e80 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20  f( rc ){.       
26e90 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
26ea0 65 72 72 2c 20 22 43 61 6e 6e 6f 74 20 63 68 61  err, "Cannot cha
26eb0 6e 67 65 20 74 6f 20 64 69 72 65 63 74 6f 72 79  nge to directory
26ec0 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72   \"%s\"\n", azAr
26ed0 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 72  g[1]);.        r
26ee0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  c = 1;.      }. 
26ef0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
26f00 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
26f10 72 2c 20 22 55 73 61 67 65 3a 20 2e 63 64 20 44  r, "Usage: .cd D
26f20 49 52 45 43 54 4f 52 59 5c 6e 22 29 3b 0a 20 20  IRECTORY\n");.  
26f30 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
26f40 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20  }.  }else..  /* 
26f50 54 68 65 20 75 6e 64 6f 63 75 6d 65 6e 74 65 64  The undocumented
26f60 20 22 2e 62 72 65 61 6b 70 6f 69 6e 74 22 20 63   ".breakpoint" c
26f70 6f 6d 6d 61 6e 64 20 63 61 75 73 65 73 20 61 20  ommand causes a 
26f80 63 61 6c 6c 20 74 6f 20 74 68 65 20 6e 6f 2d 6f  call to the no-o
26f90 70 0a 20 20 2a 2a 20 72 6f 75 74 69 6e 65 20 6e  p.  ** routine n
26fa0 61 6d 65 64 20 74 65 73 74 5f 62 72 65 61 6b 70  amed test_breakp
26fb0 6f 69 6e 74 28 29 2e 0a 20 20 2a 2f 0a 20 20 69  oint()..  */.  i
26fc0 66 28 20 63 3d 3d 27 62 27 20 26 26 20 6e 3e 3d  f( c=='b' && n>=
26fd0 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  3 && strncmp(azA
26fe0 72 67 5b 30 5d 2c 20 22 62 72 65 61 6b 70 6f 69  rg[0], "breakpoi
26ff0 6e 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  nt", n)==0 ){.  
27000 20 20 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e    test_breakpoin
27010 74 28 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  t();.  }else..  
27020 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20 6e 3e  if( c=='c' && n>
27030 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =3 && strncmp(az
27040 41 72 67 5b 30 5d 2c 20 22 63 68 61 6e 67 65 73  Arg[0], "changes
27050 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
27060 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20  if( nArg==2 ){. 
27070 20 20 20 20 20 73 65 74 4f 72 43 6c 65 61 72 46       setOrClearF
27080 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 43 6f 75  lag(p, SHFLG_Cou
27090 6e 74 43 68 61 6e 67 65 73 2c 20 61 7a 41 72 67  ntChanges, azArg
270a0 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  [1]);.    }else{
270b0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
270c0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
270d0 3a 20 2e 63 68 61 6e 67 65 73 20 6f 6e 7c 6f 66  : .changes on|of
270e0 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  f\n");.      rc 
270f0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
27100 73 65 0a 0a 20 20 2f 2a 20 43 61 6e 63 65 6c 20  se..  /* Cancel 
27110 6f 75 74 70 75 74 20 72 65 64 69 72 65 63 74 69  output redirecti
27120 6f 6e 2c 20 69 66 20 69 74 20 69 73 20 63 75 72  on, if it is cur
27130 72 65 6e 74 6c 79 20 73 65 74 20 28 62 79 20 2e  rently set (by .
27140 74 65 73 74 63 61 73 65 29 0a 20 20 2a 2a 20 54  testcase).  ** T
27150 68 65 6e 20 72 65 61 64 20 74 68 65 20 63 6f 6e  hen read the con
27160 74 65 6e 74 20 6f 66 20 74 68 65 20 74 65 73 74  tent of the test
27170 63 61 73 65 2d 6f 75 74 2e 74 78 74 20 66 69 6c  case-out.txt fil
27180 65 20 61 6e 64 20 63 6f 6d 70 61 72 65 20 61 67  e and compare ag
27190 61 69 6e 73 74 0a 20 20 2a 2a 20 61 7a 41 72 67  ainst.  ** azArg
271a0 5b 31 5d 2e 20 20 49 66 20 74 68 65 72 65 20 61  [1].  If there a
271b0 72 65 20 64 69 66 66 65 72 65 6e 63 65 73 2c 20  re differences, 
271c0 72 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20  report an error 
271d0 61 6e 64 20 65 78 69 74 2e 0a 20 20 2a 2f 0a 20  and exit..  */. 
271e0 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20 6e   if( c=='c' && n
271f0 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
27200 7a 41 72 67 5b 30 5d 2c 20 22 63 68 65 63 6b 22  zArg[0], "check"
27210 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63  , n)==0 ){.    c
27220 68 61 72 20 2a 7a 52 65 73 20 3d 20 30 3b 0a 20  har *zRes = 0;. 
27230 20 20 20 6f 75 74 70 75 74 5f 72 65 73 65 74 28     output_reset(
27240 70 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67  p);.    if( nArg
27250 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77  !=2 ){.      raw
27260 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
27270 22 55 73 61 67 65 3a 20 2e 63 68 65 63 6b 20 47  "Usage: .check G
27280 4c 4f 42 2d 50 41 54 54 45 52 4e 5c 6e 22 29 3b  LOB-PATTERN\n");
27290 0a 20 20 20 20 20 20 72 63 20 3d 20 32 3b 0a 20  .      rc = 2;. 
272a0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 28 7a 52     }else if( (zR
272b0 65 73 20 3d 20 72 65 61 64 46 69 6c 65 28 22 74  es = readFile("t
272c0 65 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 22  estcase-out.txt"
272d0 2c 20 30 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , 0))==0 ){.    
272e0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
272f0 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  err, "Error: can
27300 6e 6f 74 20 72 65 61 64 20 27 74 65 73 74 63 61  not read 'testca
27310 73 65 2d 6f 75 74 2e 74 78 74 27 5c 6e 22 29 3b  se-out.txt'\n");
27320 0a 20 20 20 20 20 20 72 63 20 3d 20 32 3b 0a 20  .      rc = 2;. 
27330 20 20 20 7d 65 6c 73 65 20 69 66 28 20 74 65 73     }else if( tes
27340 74 63 61 73 65 5f 67 6c 6f 62 28 61 7a 41 72 67  tcase_glob(azArg
27350 5b 31 5d 2c 7a 52 65 73 29 3d 3d 30 20 29 7b 0a  [1],zRes)==0 ){.
27360 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
27370 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20 20  f(stderr,.      
27380 20 20 20 20 20 20 20 20 20 20 20 22 74 65 73 74             "test
27390 63 61 73 65 2d 25 73 20 46 41 49 4c 45 44 5c 6e  case-%s FAILED\n
273a0 20 45 78 70 65 63 74 65 64 3a 20 5b 25 73 5d 5c   Expected: [%s]\
273b0 6e 20 20 20 20 20 20 47 6f 74 3a 20 5b 25 73 5d  n      Got: [%s]
273c0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
273d0 20 20 20 20 20 20 70 2d 3e 7a 54 65 73 74 63 61        p->zTestca
273e0 73 65 2c 20 61 7a 41 72 67 5b 31 5d 2c 20 7a 52  se, azArg[1], zR
273f0 65 73 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  es);.      rc = 
27400 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
27410 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
27420 73 74 64 6f 75 74 2c 20 22 74 65 73 74 63 61 73  stdout, "testcas
27430 65 2d 25 73 20 6f 6b 5c 6e 22 2c 20 70 2d 3e 7a  e-%s ok\n", p->z
27440 54 65 73 74 63 61 73 65 29 3b 0a 20 20 20 20 20  Testcase);.     
27450 20 70 2d 3e 6e 43 68 65 63 6b 2b 2b 3b 0a 20 20   p->nCheck++;.  
27460 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
27470 66 72 65 65 28 7a 52 65 73 29 3b 0a 20 20 7d 65  free(zRes);.  }e
27480 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 63  lse..  if( c=='c
27490 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
274a0 72 67 5b 30 5d 2c 20 22 63 6c 6f 6e 65 22 2c 20  rg[0], "clone", 
274b0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  n)==0 ){.    if(
274c0 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20   nArg==2 ){.    
274d0 20 20 74 72 79 54 6f 43 6c 6f 6e 65 28 70 2c 20    tryToClone(p, 
274e0 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d  azArg[1]);.    }
274f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
27500 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
27510 55 73 61 67 65 3a 20 2e 63 6c 6f 6e 65 20 46 49  Usage: .clone FI
27520 4c 45 4e 41 4d 45 5c 6e 22 29 3b 0a 20 20 20 20  LENAME\n");.    
27530 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
27540 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
27550 3d 3d 27 64 27 20 26 26 20 6e 3e 31 20 26 26 20  =='d' && n>1 && 
27560 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
27570 2c 20 22 64 61 74 61 62 61 73 65 73 22 2c 20 6e  , "databases", n
27580 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65 6c  )==0 ){.    Shel
27590 6c 53 74 61 74 65 20 64 61 74 61 3b 0a 20 20 20  lState data;.   
275a0 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d   char *zErrMsg =
275b0 20 30 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28   0;.    open_db(
275c0 70 2c 20 30 29 3b 0a 20 20 20 20 6d 65 6d 63 70  p, 0);.    memcp
275d0 79 28 26 64 61 74 61 2c 20 70 2c 20 73 69 7a 65  y(&data, p, size
275e0 6f 66 28 64 61 74 61 29 29 3b 0a 20 20 20 20 64  of(data));.    d
275f0 61 74 61 2e 73 68 6f 77 48 65 61 64 65 72 20 3d  ata.showHeader =
27600 20 30 3b 0a 20 20 20 20 64 61 74 61 2e 63 4d 6f   0;.    data.cMo
27610 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20 3d  de = data.mode =
27620 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20   MODE_List;.    
27630 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
27640 28 73 69 7a 65 6f 66 28 64 61 74 61 2e 63 6f 6c  (sizeof(data.col
27650 53 65 70 61 72 61 74 6f 72 29 2c 64 61 74 61 2e  Separator),data.
27660 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 22 3a 20  colSeparator,": 
27670 22 29 3b 0a 20 20 20 20 64 61 74 61 2e 63 6e 74  ");.    data.cnt
27680 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
27690 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 53  3_exec(p->db, "S
276a0 45 4c 45 43 54 20 6e 61 6d 65 2c 20 66 69 6c 65  ELECT name, file
276b0 20 46 52 4f 4d 20 70 72 61 67 6d 61 5f 64 61 74   FROM pragma_dat
276c0 61 62 61 73 65 5f 6c 69 73 74 22 2c 0a 20 20 20  abase_list",.   
276d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61                ca
276e0 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26  llback, &data, &
276f0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 69 66  zErrMsg);.    if
27700 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20  ( zErrMsg ){.   
27710 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
27720 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25 73  tderr,"Error: %s
27730 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20  \n", zErrMsg);. 
27740 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
27750 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  e(zErrMsg);.    
27760 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
27770 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
27780 3d 3d 27 64 27 20 26 26 20 73 74 72 6e 63 6d 70  =='d' && strncmp
27790 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64 62 69 6e  (azArg[0], "dbin
277a0 66 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  fo", n)==0 ){.  
277b0 20 20 72 63 20 3d 20 73 68 65 6c 6c 5f 64 62 69    rc = shell_dbi
277c0 6e 66 6f 5f 63 6f 6d 6d 61 6e 64 28 70 2c 20 6e  nfo_command(p, n
277d0 41 72 67 2c 20 61 7a 41 72 67 29 3b 0a 20 20 7d  Arg, azArg);.  }
277e0 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
277f0 64 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  d' && strncmp(az
27800 41 72 67 5b 30 5d 2c 20 22 64 75 6d 70 22 2c 20  Arg[0], "dump", 
27810 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e  n)==0 ){.    con
27820 73 74 20 63 68 61 72 20 2a 7a 4c 69 6b 65 20 3d  st char *zLike =
27830 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   0;.    int i;. 
27840 20 20 20 69 6e 74 20 73 61 76 65 64 53 68 6f 77     int savedShow
27850 48 65 61 64 65 72 20 3d 20 70 2d 3e 73 68 6f 77  Header = p->show
27860 48 65 61 64 65 72 3b 0a 20 20 20 20 53 68 65 6c  Header;.    Shel
27870 6c 43 6c 65 61 72 46 6c 61 67 28 70 2c 20 53 48  lClearFlag(p, SH
27880 46 4c 47 5f 50 72 65 73 65 72 76 65 52 6f 77 69  FLG_PreserveRowi
27890 64 7c 53 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73  d|SHFLG_Newlines
278a0 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20  );.    for(i=1; 
278b0 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
278c0 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b 69 5d      if( azArg[i]
278d0 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20  [0]=='-' ){.    
278e0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
278f0 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 2b 31 3b 0a  z = azArg[i]+1;.
27900 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d          if( z[0]
27910 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20 20  =='-' ) z++;.   
27920 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
27930 7a 2c 22 70 72 65 73 65 72 76 65 2d 72 6f 77 69  z,"preserve-rowi
27940 64 73 22 29 3d 3d 30 20 29 7b 0a 23 69 66 64 65  ds")==0 ){.#ifde
27950 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49  f SQLITE_OMIT_VI
27960 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20 20  RTUALTABLE.     
27970 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
27980 73 74 64 65 72 72 2c 20 22 54 68 65 20 2d 2d 70  stderr, "The --p
27990 72 65 73 65 72 76 65 2d 72 6f 77 69 64 73 20 6f  reserve-rowids o
279a0 70 74 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f 6d  ption is not com
279b0 70 61 74 69 62 6c 65 22 0a 20 20 20 20 20 20 20  patible".       
279c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
279d0 20 20 20 20 20 20 22 20 77 69 74 68 20 53 51 4c        " with SQL
279e0 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
279f0 54 41 42 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20  TABLE\n");.     
27a00 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
27a10 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61         goto meta
27a20 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 23  _command_exit;.#
27a30 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 53  else.          S
27a40 68 65 6c 6c 53 65 74 46 6c 61 67 28 70 2c 20 53  hellSetFlag(p, S
27a50 48 46 4c 47 5f 50 72 65 73 65 72 76 65 52 6f 77  HFLG_PreserveRow
27a60 69 64 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  id);.#endif.    
27a70 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20      }else.      
27a80 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22    if( strcmp(z,"
27a90 6e 65 77 6c 69 6e 65 73 22 29 3d 3d 30 20 29 7b  newlines")==0 ){
27aa0 0a 20 20 20 20 20 20 20 20 20 20 53 68 65 6c 6c  .          Shell
27ab0 53 65 74 46 6c 61 67 28 70 2c 20 53 48 46 4c 47  SetFlag(p, SHFLG
27ac0 5f 4e 65 77 6c 69 6e 65 73 29 3b 0a 20 20 20 20  _Newlines);.    
27ad0 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20      }else.      
27ae0 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61    {.          ra
27af0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
27b00 20 22 55 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e   "Unknown option
27b10 20 5c 22 25 73 5c 22 20 6f 6e 20 5c 22 2e 64 75   \"%s\" on \".du
27b20 6d 70 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 69  mp\"\n", azArg[i
27b30 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ]);.          rc
27b40 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
27b50 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
27b60 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20  d_exit;.        
27b70 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
27b80 28 20 7a 4c 69 6b 65 20 29 7b 0a 20 20 20 20 20  ( zLike ){.     
27b90 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
27ba0 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 64  derr, "Usage: .d
27bb0 75 6d 70 20 3f 2d 2d 70 72 65 73 65 72 76 65 2d  ump ?--preserve-
27bc0 72 6f 77 69 64 73 3f 20 22 0a 20 20 20 20 20 20  rowids? ".      
27bd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27be0 20 20 20 20 20 22 3f 2d 2d 6e 65 77 6c 69 6e 65       "?--newline
27bf0 73 3f 20 3f 4c 49 4b 45 2d 50 41 54 54 45 52 4e  s? ?LIKE-PATTERN
27c00 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72  ?\n");.        r
27c10 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67  c = 1;.        g
27c20 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
27c30 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 65 6c  _exit;.      }el
27c40 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69 6b  se{.        zLik
27c50 65 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20  e = azArg[i];.  
27c60 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
27c70 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
27c80 20 20 20 2f 2a 20 57 68 65 6e 20 70 6c 61 79 69     /* When playi
27c90 6e 67 20 62 61 63 6b 20 61 20 22 64 75 6d 70 22  ng back a "dump"
27ca0 2c 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6d 69  , the content mi
27cb0 67 68 74 20 61 70 70 65 61 72 20 69 6e 20 61 6e  ght appear in an
27cc0 20 6f 72 64 65 72 0a 20 20 20 20 2a 2a 20 77 68   order.    ** wh
27cd0 69 63 68 20 63 61 75 73 65 73 20 69 6d 6d 65 64  ich causes immed
27ce0 69 61 74 65 20 66 6f 72 65 69 67 6e 20 6b 65 79  iate foreign key
27cf0 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 74 6f 20   constraints to 
27d00 62 65 20 76 69 6f 6c 61 74 65 64 2e 0a 20 20 20  be violated..   
27d10 20 2a 2a 20 53 6f 20 64 69 73 61 62 6c 65 20 66   ** So disable f
27d20 6f 72 65 69 67 6e 2d 6b 65 79 20 63 6f 6e 73 74  oreign-key const
27d30 72 61 69 6e 74 20 65 6e 66 6f 72 63 65 6d 65 6e  raint enforcemen
27d40 74 20 74 6f 20 70 72 65 76 65 6e 74 20 70 72 6f  t to prevent pro
27d50 62 6c 65 6d 73 2e 20 2a 2f 0a 20 20 20 20 72 61  blems. */.    ra
27d60 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
27d70 20 22 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e   "PRAGMA foreign
27d80 5f 6b 65 79 73 3d 4f 46 46 3b 5c 6e 22 29 3b 0a  _keys=OFF;\n");.
27d90 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
27da0 2d 3e 6f 75 74 2c 20 22 42 45 47 49 4e 20 54 52  ->out, "BEGIN TR
27db0 41 4e 53 41 43 54 49 4f 4e 3b 5c 6e 22 29 3b 0a  ANSACTION;\n");.
27dc0 20 20 20 20 70 2d 3e 77 72 69 74 61 62 6c 65 53      p->writableS
27dd0 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 70  chema = 0;.    p
27de0 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30  ->showHeader = 0
27df0 3b 0a 20 20 20 20 2f 2a 20 53 65 74 20 77 72 69  ;.    /* Set wri
27e00 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e 20  table_schema=ON 
27e10 73 69 6e 63 65 20 64 6f 69 6e 67 20 73 6f 20 66  since doing so f
27e20 6f 72 63 65 73 20 53 51 4c 69 74 65 20 74 6f 20  orces SQLite to 
27e30 69 6e 69 74 69 61 6c 69 7a 65 0a 20 20 20 20 2a  initialize.    *
27e40 2a 20 61 73 20 6d 75 63 68 20 6f 66 20 74 68 65  * as much of the
27e50 20 73 63 68 65 6d 61 20 61 73 20 69 74 20 63 61   schema as it ca
27e60 6e 20 65 76 65 6e 20 69 66 20 74 68 65 20 73 71  n even if the sq
27e70 6c 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c  lite_master tabl
27e80 65 20 69 73 0a 20 20 20 20 2a 2a 20 63 6f 72 72  e is.    ** corr
27e90 75 70 74 2e 20 2a 2f 0a 20 20 20 20 73 71 6c 69  upt. */.    sqli
27ea0 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
27eb0 22 53 41 56 45 50 4f 49 4e 54 20 64 75 6d 70 3b  "SAVEPOINT dump;
27ec0 20 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65   PRAGMA writable
27ed0 5f 73 63 68 65 6d 61 3d 4f 4e 22 2c 20 30 2c 20  _schema=ON", 0, 
27ee0 30 2c 20 30 29 3b 0a 20 20 20 20 70 2d 3e 6e 45  0, 0);.    p->nE
27ef0 72 72 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  rr = 0;.    if( 
27f00 7a 4c 69 6b 65 3d 3d 30 20 29 7b 0a 20 20 20 20  zLike==0 ){.    
27f10 20 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d    run_schema_dum
27f20 70 5f 71 75 65 72 79 28 70 2c 0a 20 20 20 20 20  p_query(p,.     
27f30 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c     "SELECT name,
27f40 20 74 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20   type, sql FROM 
27f50 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a  sqlite_master ".
27f60 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20 73          "WHERE s
27f70 71 6c 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20  ql NOT NULL AND 
27f80 74 79 70 65 3d 3d 27 74 61 62 6c 65 27 20 41 4e  type=='table' AN
27f90 44 20 6e 61 6d 65 21 3d 27 73 71 6c 69 74 65 5f  D name!='sqlite_
27fa0 73 65 71 75 65 6e 63 65 27 22 0a 20 20 20 20 20  sequence'".     
27fb0 20 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 73 63   );.      run_sc
27fc0 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28  hema_dump_query(
27fd0 70 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45  p,.        "SELE
27fe0 43 54 20 6e 61 6d 65 2c 20 74 79 70 65 2c 20 73  CT name, type, s
27ff0 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d  ql FROM sqlite_m
28000 61 73 74 65 72 20 22 0a 20 20 20 20 20 20 20 20  aster ".        
28010 22 57 48 45 52 45 20 6e 61 6d 65 3d 3d 27 73 71  "WHERE name=='sq
28020 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 27 22 0a  lite_sequence'".
28030 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 72        );.      r
28040 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75  un_table_dump_qu
28050 65 72 79 28 70 2c 0a 20 20 20 20 20 20 20 20 22  ery(p,.        "
28060 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20  SELECT sql FROM 
28070 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a  sqlite_master ".
28080 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20 73          "WHERE s
28090 71 6c 20 4e 4f 54 20 4e 55 4c 4c 20 41 4e 44 20  ql NOT NULL AND 
280a0 74 79 70 65 20 49 4e 20 28 27 69 6e 64 65 78 27  type IN ('index'
280b0 2c 27 74 72 69 67 67 65 72 27 2c 27 76 69 65 77  ,'trigger','view
280c0 27 29 22 2c 20 30 0a 20 20 20 20 20 20 29 3b 0a  ')", 0.      );.
280d0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
280e0 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 20   char *zSql;.   
280f0 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65     zSql = sqlite
28100 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20  3_mprintf(.     
28110 20 20 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 2c     "SELECT name,
28120 20 74 79 70 65 2c 20 73 71 6c 20 46 52 4f 4d 20   type, sql FROM 
28130 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a  sqlite_master ".
28140 20 20 20 20 20 20 20 20 22 57 48 45 52 45 20 74          "WHERE t
28150 62 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 25 51 20  bl_name LIKE %Q 
28160 41 4e 44 20 74 79 70 65 3d 3d 27 74 61 62 6c 65  AND type=='table
28170 27 22 0a 20 20 20 20 20 20 20 20 22 20 20 41 4e  '".        "  AN
28180 44 20 73 71 6c 20 4e 4f 54 20 4e 55 4c 4c 22 2c  D sql NOT NULL",
28190 20 7a 4c 69 6b 65 29 3b 0a 20 20 20 20 20 20 72   zLike);.      r
281a0 75 6e 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71  un_schema_dump_q
281b0 75 65 72 79 28 70 2c 7a 53 71 6c 29 3b 0a 20 20  uery(p,zSql);.  
281c0 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
281d0 28 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 7a 53  (zSql);.      zS
281e0 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
281f0 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 53  intf(.        "S
28200 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 20 73  ELECT sql FROM s
28210 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 22 0a 20  qlite_master ". 
28220 20 20 20 20 20 20 20 22 57 48 45 52 45 20 73 71         "WHERE sq
28230 6c 20 4e 4f 54 20 4e 55 4c 4c 22 0a 20 20 20 20  l NOT NULL".    
28240 20 20 20 20 22 20 20 41 4e 44 20 74 79 70 65 20      "  AND type 
28250 49 4e 20 28 27 69 6e 64 65 78 27 2c 27 74 72 69  IN ('index','tri
28260 67 67 65 72 27 2c 27 76 69 65 77 27 29 22 0a 20  gger','view')". 
28270 20 20 20 20 20 20 20 22 20 20 41 4e 44 20 74 62         "  AND tb
28280 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 25 51 22 2c  l_name LIKE %Q",
28290 20 7a 4c 69 6b 65 29 3b 0a 20 20 20 20 20 20 72   zLike);.      r
282a0 75 6e 5f 74 61 62 6c 65 5f 64 75 6d 70 5f 71 75  un_table_dump_qu
282b0 65 72 79 28 70 2c 20 7a 53 71 6c 2c 20 30 29 3b  ery(p, zSql, 0);
282c0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
282d0 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 7d  ree(zSql);.    }
282e0 0a 20 20 20 20 69 66 28 20 70 2d 3e 77 72 69 74  .    if( p->writ
282f0 61 62 6c 65 53 63 68 65 6d 61 20 29 7b 0a 20 20  ableSchema ){.  
28300 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
28310 2d 3e 6f 75 74 2c 20 22 50 52 41 47 4d 41 20 77  ->out, "PRAGMA w
28320 72 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f  ritable_schema=O
28330 46 46 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 70  FF;\n");.      p
28340 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61  ->writableSchema
28350 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 0;.    }.    
28360 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
28370 64 62 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74  db, "PRAGMA writ
28380 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b  able_schema=OFF;
28390 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  ", 0, 0, 0);.   
283a0 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
283b0 3e 64 62 2c 20 22 52 45 4c 45 41 53 45 20 64 75  >db, "RELEASE du
283c0 6d 70 3b 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  mp;", 0, 0, 0);.
283d0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
283e0 2d 3e 6f 75 74 2c 20 70 2d 3e 6e 45 72 72 20 3f  ->out, p->nErr ?
283f0 20 22 52 4f 4c 4c 42 41 43 4b 3b 20 2d 2d 20 64   "ROLLBACK; -- d
28400 75 65 20 74 6f 20 65 72 72 6f 72 73 5c 6e 22 20  ue to errors\n" 
28410 3a 20 22 43 4f 4d 4d 49 54 3b 5c 6e 22 29 3b 0a  : "COMMIT;\n");.
28420 20 20 20 20 70 2d 3e 73 68 6f 77 48 65 61 64 65      p->showHeade
28430 72 20 3d 20 73 61 76 65 64 53 68 6f 77 48 65 61  r = savedShowHea
28440 64 65 72 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  der;.  }else..  
28450 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74  if( c=='e' && st
28460 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
28470 22 65 63 68 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b  "echo", n)==0 ){
28480 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32  .    if( nArg==2
28490 20 29 7b 0a 20 20 20 20 20 20 73 65 74 4f 72 43   ){.      setOrC
284a0 6c 65 61 72 46 6c 61 67 28 70 2c 20 53 48 46 4c  learFlag(p, SHFL
284b0 47 5f 45 63 68 6f 2c 20 61 7a 41 72 67 5b 31 5d  G_Echo, azArg[1]
284c0 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
284d0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
284e0 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
284f0 65 63 68 6f 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b  echo on|off\n");
28500 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
28510 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
28520 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74  if( c=='e' && st
28530 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
28540 22 65 71 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  "eqp", n)==0 ){.
28550 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
28560 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
28570 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 66 75  cmp(azArg[1],"fu
28580 6c 6c 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ll")==0 ){.     
28590 20 20 20 70 2d 3e 61 75 74 6f 45 51 50 20 3d 20     p->autoEQP = 
285a0 41 55 54 4f 45 51 50 5f 66 75 6c 6c 3b 0a 20 20  AUTOEQP_full;.  
285b0 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
285c0 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74  rcmp(azArg[1],"t
285d0 72 69 67 67 65 72 22 29 3d 3d 30 20 29 7b 0a 20  rigger")==0 ){. 
285e0 20 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51         p->autoEQ
285f0 50 20 3d 20 41 55 54 4f 45 51 50 5f 74 72 69 67  P = AUTOEQP_trig
28600 67 65 72 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ger;.      }else
28610 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 61 75 74  {.        p->aut
28620 6f 45 51 50 20 3d 20 62 6f 6f 6c 65 61 6e 56 61  oEQP = booleanVa
28630 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  lue(azArg[1]);. 
28640 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
28650 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
28660 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
28670 65 3a 20 2e 65 71 70 20 6f 66 66 7c 6f 6e 7c 74  e: .eqp off|on|t
28680 72 69 67 67 65 72 7c 66 75 6c 6c 5c 6e 22 29 3b  rigger|full\n");
28690 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
286a0 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
286b0 69 66 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74  if( c=='e' && st
286c0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
286d0 22 65 78 69 74 22 2c 20 6e 29 3d 3d 30 20 29 7b  "exit", n)==0 ){
286e0 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 31 20  .    if( nArg>1 
286f0 26 26 20 28 72 63 20 3d 20 28 69 6e 74 29 69 6e  && (rc = (int)in
28700 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67  tegerValue(azArg
28710 5b 31 5d 29 29 21 3d 30 20 29 20 65 78 69 74 28  [1]))!=0 ) exit(
28720 72 63 29 3b 0a 20 20 20 20 72 63 20 3d 20 32 3b  rc);.    rc = 2;
28730 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a 20 54  .  }else..  /* T
28740 68 65 20 22 2e 65 78 70 6c 61 69 6e 22 20 63 6f  he ".explain" co
28750 6d 6d 61 6e 64 20 69 73 20 61 75 74 6f 6d 61 74  mmand is automat
28760 69 63 20 6e 6f 77 2e 20 20 49 74 20 69 73 20 6c  ic now.  It is l
28770 61 72 67 65 6c 79 20 70 6f 69 6e 74 6c 65 73 73  argely pointless
28780 2e 20 20 49 74 0a 20 20 2a 2a 20 72 65 74 61 69  .  It.  ** retai
28790 6e 65 64 20 70 75 72 65 6c 79 20 66 6f 72 20 62  ned purely for b
287a0 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69  ackwards compati
287b0 62 69 6c 69 74 79 20 2a 2f 0a 20 20 69 66 28 20  bility */.  if( 
287c0 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d  c=='e' && strncm
287d0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78 70  p(azArg[0], "exp
287e0 6c 61 69 6e 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  lain", n)==0 ){.
287f0 20 20 20 20 69 6e 74 20 76 61 6c 20 3d 20 31 3b      int val = 1;
28800 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 3d 32  .    if( nArg>=2
28810 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74   ){.      if( st
28820 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 61  rcmp(azArg[1],"a
28830 75 74 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  uto")==0 ){.    
28840 20 20 20 20 76 61 6c 20 3d 20 39 39 3b 0a 20 20      val = 99;.  
28850 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
28860 20 20 20 76 61 6c 20 3d 20 20 62 6f 6f 6c 65 61     val =  boolea
28870 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29  nValue(azArg[1])
28880 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
28890 20 20 20 20 69 66 28 20 76 61 6c 3d 3d 31 20 26      if( val==1 &
288a0 26 20 70 2d 3e 6d 6f 64 65 21 3d 4d 4f 44 45 5f  & p->mode!=MODE_
288b0 45 78 70 6c 61 69 6e 20 29 7b 0a 20 20 20 20 20  Explain ){.     
288c0 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 20 3d   p->normalMode =
288d0 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20   p->mode;.      
288e0 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45  p->mode = MODE_E
288f0 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 70 2d  xplain;.      p-
28900 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20 3d 20 30  >autoExplain = 0
28910 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
28920 76 61 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  val==0 ){.      
28930 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44  if( p->mode==MOD
28940 45 5f 45 78 70 6c 61 69 6e 20 29 20 70 2d 3e 6d  E_Explain ) p->m
28950 6f 64 65 20 3d 20 70 2d 3e 6e 6f 72 6d 61 6c 4d  ode = p->normalM
28960 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e 61 75  ode;.      p->au
28970 74 6f 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a 20  toExplain = 0;. 
28980 20 20 20 7d 65 6c 73 65 20 69 66 28 20 76 61 6c     }else if( val
28990 3d 3d 39 39 20 29 7b 0a 20 20 20 20 20 20 69 66  ==99 ){.      if
289a0 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f  ( p->mode==MODE_
289b0 45 78 70 6c 61 69 6e 20 29 20 70 2d 3e 6d 6f 64  Explain ) p->mod
289c0 65 20 3d 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64  e = p->normalMod
289d0 65 3b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f  e;.      p->auto
289e0 45 78 70 6c 61 69 6e 20 3d 20 31 3b 0a 20 20 20  Explain = 1;.   
289f0 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
28a00 28 20 63 3d 3d 27 65 27 20 26 26 20 73 74 72 6e  ( c=='e' && strn
28a10 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65  cmp(azArg[0], "e
28a20 78 70 65 72 74 22 2c 20 6e 29 3d 3d 30 20 29 7b  xpert", n)==0 ){
28a30 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
28a40 30 29 3b 0a 20 20 20 20 65 78 70 65 72 74 44 6f  0);.    expertDo
28a50 74 43 6f 6d 6d 61 6e 64 28 70 2c 20 61 7a 41 72  tCommand(p, azAr
28a60 67 2c 20 6e 41 72 67 29 3b 0a 20 20 7d 65 6c 73  g, nArg);.  }els
28a70 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 66 27 20  e..  if( c=='f' 
28a80 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
28a90 5b 30 5d 2c 20 22 66 75 6c 6c 73 63 68 65 6d 61  [0], "fullschema
28aa0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
28ab0 53 68 65 6c 6c 53 74 61 74 65 20 64 61 74 61 3b  ShellState data;
28ac0 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d  .    char *zErrM
28ad0 73 67 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  sg = 0;.    int 
28ae0 64 6f 53 74 61 74 73 20 3d 20 30 3b 0a 20 20 20  doStats = 0;.   
28af0 20 6d 65 6d 63 70 79 28 26 64 61 74 61 2c 20 70   memcpy(&data, p
28b00 2c 20 73 69 7a 65 6f 66 28 64 61 74 61 29 29 3b  , sizeof(data));
28b10 0a 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48 65  .    data.showHe
28b20 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 64 61  ader = 0;.    da
28b30 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e  ta.cMode = data.
28b40 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 53 65 6d 69  mode = MODE_Semi
28b50 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  ;.    if( nArg==
28b60 32 20 26 26 20 6f 70 74 69 6f 6e 4d 61 74 63 68  2 && optionMatch
28b70 28 61 7a 41 72 67 5b 31 5d 2c 20 22 69 6e 64 65  (azArg[1], "inde
28b80 6e 74 22 29 20 29 7b 0a 20 20 20 20 20 20 64 61  nt") ){.      da
28b90 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e  ta.cMode = data.
28ba0 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 50 72 65 74  mode = MODE_Pret
28bb0 74 79 3b 0a 20 20 20 20 20 20 6e 41 72 67 20 3d  ty;.      nArg =
28bc0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
28bd0 28 20 6e 41 72 67 21 3d 31 20 29 7b 0a 20 20 20  ( nArg!=1 ){.   
28be0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
28bf0 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 66  derr, "Usage: .f
28c00 75 6c 6c 73 63 68 65 6d 61 20 3f 2d 2d 69 6e 64  ullschema ?--ind
28c10 65 6e 74 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20  ent?\n");.      
28c20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f  rc = 1;.      go
28c30 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
28c40 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  exit;.    }.    
28c50 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
28c60 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
28c70 65 78 65 63 28 70 2d 3e 64 62 2c 0a 20 20 20 20  exec(p->db,.    
28c80 20 20 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46     "SELECT sql F
28c90 52 4f 4d 22 0a 20 20 20 20 20 20 20 22 20 20 28  ROM".       "  (
28ca0 53 45 4c 45 43 54 20 73 71 6c 20 73 71 6c 2c 20  SELECT sql sql, 
28cb0 74 79 70 65 20 74 79 70 65 2c 20 74 62 6c 5f 6e  type type, tbl_n
28cc0 61 6d 65 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61  ame tbl_name, na
28cd0 6d 65 20 6e 61 6d 65 2c 20 72 6f 77 69 64 20 78  me name, rowid x
28ce0 22 0a 20 20 20 20 20 20 20 22 20 20 20 20 20 46  ".       "     F
28cf0 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
28d00 72 20 55 4e 49 4f 4e 20 41 4c 4c 22 0a 20 20 20  r UNION ALL".   
28d10 20 20 20 20 22 20 20 20 53 45 4c 45 43 54 20 73      "   SELECT s
28d20 71 6c 2c 20 74 79 70 65 2c 20 74 62 6c 5f 6e 61  ql, type, tbl_na
28d30 6d 65 2c 20 6e 61 6d 65 2c 20 72 6f 77 69 64 20  me, name, rowid 
28d40 46 52 4f 4d 20 73 71 6c 69 74 65 5f 74 65 6d 70  FROM sqlite_temp
28d50 5f 6d 61 73 74 65 72 29 20 22 0a 20 20 20 20 20  _master) ".     
28d60 20 20 22 57 48 45 52 45 20 74 79 70 65 21 3d 27    "WHERE type!='
28d70 6d 65 74 61 27 20 41 4e 44 20 73 71 6c 20 4e 4f  meta' AND sql NO
28d80 54 4e 55 4c 4c 20 41 4e 44 20 6e 61 6d 65 20 4e  TNULL AND name N
28d90 4f 54 20 4c 49 4b 45 20 27 73 71 6c 69 74 65 5f  OT LIKE 'sqlite_
28da0 25 27 20 22 0a 20 20 20 20 20 20 20 22 4f 52 44  %' ".       "ORD
28db0 45 52 20 42 59 20 72 6f 77 69 64 22 2c 0a 20 20  ER BY rowid",.  
28dc0 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 2c 20 26       callback, &
28dd0 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67 0a 20  data, &zErrMsg. 
28de0 20 20 20 29 3b 0a 20 20 20 20 69 66 28 20 72 63     );.    if( rc
28df0 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  ==SQLITE_OK ){. 
28e00 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
28e10 74 20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 20 20  t *pStmt;.      
28e20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
28e30 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 0a 20  pare_v2(p->db,. 
28e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 53                "S
28e50 45 4c 45 43 54 20 72 6f 77 69 64 20 46 52 4f 4d  ELECT rowid FROM
28e60 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a   sqlite_master".
28e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
28e80 20 57 48 45 52 45 20 6e 61 6d 65 20 47 4c 4f 42   WHERE name GLOB
28e90 20 27 73 71 6c 69 74 65 5f 73 74 61 74 5b 31 33   'sqlite_stat[13
28ea0 34 5d 27 22 2c 0a 20 20 20 20 20 20 20 20 20 20  4]'",.          
28eb0 20 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c       -1, &pStmt,
28ec0 20 30 29 3b 0a 20 20 20 20 20 20 64 6f 53 74 61   0);.      doSta
28ed0 74 73 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65  ts = sqlite3_ste
28ee0 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
28ef0 5f 52 4f 57 3b 0a 20 20 20 20 20 20 73 71 6c 69  _ROW;.      sqli
28f00 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
28f10 6d 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  mt);.    }.    i
28f20 66 28 20 64 6f 53 74 61 74 73 3d 3d 30 20 29 7b  f( doStats==0 ){
28f30 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
28f40 66 28 70 2d 3e 6f 75 74 2c 20 22 2f 2a 20 4e 6f  f(p->out, "/* No
28f50 20 53 54 41 54 20 74 61 62 6c 65 73 20 61 76 61   STAT tables ava
28f60 69 6c 61 62 6c 65 20 2a 2f 5c 6e 22 29 3b 0a 20  ilable */\n");. 
28f70 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28f80 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
28f90 74 2c 20 22 41 4e 41 4c 59 5a 45 20 73 71 6c 69  t, "ANALYZE sqli
28fa0 74 65 5f 6d 61 73 74 65 72 3b 5c 6e 22 29 3b 0a  te_master;\n");.
28fb0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78        sqlite3_ex
28fc0 65 63 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43  ec(p->db, "SELEC
28fd0 54 20 27 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74  T 'ANALYZE sqlit
28fe0 65 5f 6d 61 73 74 65 72 27 22 2c 0a 20 20 20 20  e_master'",.    
28ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
29000 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c 20  allback, &data, 
29010 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20  &zErrMsg);.     
29020 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61   data.cMode = da
29030 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 49  ta.mode = MODE_I
29040 6e 73 65 72 74 3b 0a 20 20 20 20 20 20 64 61 74  nsert;.      dat
29050 61 2e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 22  a.zDestTable = "
29060 73 71 6c 69 74 65 5f 73 74 61 74 31 22 3b 0a 20  sqlite_stat1";. 
29070 20 20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28       shell_exec(
29080 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20 2a  p->db, "SELECT *
29090 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61   FROM sqlite_sta
290a0 74 31 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  t1",.           
290b0 20 20 20 20 20 20 73 68 65 6c 6c 5f 63 61 6c 6c        shell_call
290c0 62 61 63 6b 2c 20 26 64 61 74 61 2c 26 7a 45 72  back, &data,&zEr
290d0 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 64 61 74  rMsg);.      dat
290e0 61 2e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 22  a.zDestTable = "
290f0 73 71 6c 69 74 65 5f 73 74 61 74 33 22 3b 0a 20  sqlite_stat3";. 
29100 20 20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28       shell_exec(
29110 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20 2a  p->db, "SELECT *
29120 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61   FROM sqlite_sta
29130 74 33 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  t3",.           
29140 20 20 20 20 20 20 73 68 65 6c 6c 5f 63 61 6c 6c        shell_call
29150 62 61 63 6b 2c 20 26 64 61 74 61 2c 26 7a 45 72  back, &data,&zEr
29160 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 64 61 74  rMsg);.      dat
29170 61 2e 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 22  a.zDestTable = "
29180 73 71 6c 69 74 65 5f 73 74 61 74 34 22 3b 0a 20  sqlite_stat4";. 
29190 20 20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63 28       shell_exec(
291a0 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20 2a  p->db, "SELECT *
291b0 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74 61   FROM sqlite_sta
291c0 74 34 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  t4",.           
291d0 20 20 20 20 20 20 73 68 65 6c 6c 5f 63 61 6c 6c        shell_call
291e0 62 61 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45  back, &data, &zE
291f0 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 61  rrMsg);.      ra
29200 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
29210 20 22 41 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65   "ANALYZE sqlite
29220 5f 6d 61 73 74 65 72 3b 5c 6e 22 29 3b 0a 20 20  _master;\n");.  
29230 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
29240 66 28 20 63 3d 3d 27 68 27 20 26 26 20 73 74 72  f( c=='h' && str
29250 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
29260 68 65 61 64 65 72 73 22 2c 20 6e 29 3d 3d 30 20  headers", n)==0 
29270 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  ){.    if( nArg=
29280 3d 32 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73  =2 ){.      p->s
29290 68 6f 77 48 65 61 64 65 72 20 3d 20 62 6f 6f 6c  howHeader = bool
292a0 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31  eanValue(azArg[1
292b0 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
292c0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
292d0 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
292e0 2e 68 65 61 64 65 72 73 20 6f 6e 7c 6f 66 66 5c  .headers on|off\
292f0 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
29300 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
29310 0a 0a 20 20 69 66 28 20 63 3d 3d 27 68 27 20 26  ..  if( c=='h' &
29320 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
29330 30 5d 2c 20 22 68 65 6c 70 22 2c 20 6e 29 3d 3d  0], "help", n)==
29340 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72  0 ){.    utf8_pr
29350 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
29360 22 2c 20 7a 48 65 6c 70 29 3b 0a 20 20 7d 65 6c  ", zHelp);.  }el
29370 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 69 27  se..  if( c=='i'
29380 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
29390 67 5b 30 5d 2c 20 22 69 6d 70 6f 72 74 22 2c 20  g[0], "import", 
293a0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61  n)==0 ){.    cha
293b0 72 20 2a 7a 54 61 62 6c 65 3b 20 20 20 20 20 20  r *zTable;      
293c0 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 73 65           /* Inse
293d0 72 74 20 64 61 74 61 20 69 6e 74 6f 20 74 68 69  rt data into thi
293e0 73 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 63  s table */.    c
293f0 68 61 72 20 2a 7a 46 69 6c 65 3b 20 20 20 20 20  har *zFile;     
29400 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
29410 6d 65 20 6f 66 20 66 69 6c 65 20 74 6f 20 65 78  me of file to ex
29420 74 72 61 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d  tra content from
29430 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   */.    sqlite3_
29440 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 4e 55  stmt *pStmt = NU
29450 4c 4c 3b 20 2f 2a 20 41 20 73 74 61 74 65 6d 65  LL; /* A stateme
29460 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 43  nt */.    int nC
29470 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ol;             
29480 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
29490 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
294a0 65 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 69  e table */.    i
294b0 6e 74 20 6e 42 79 74 65 3b 20 20 20 20 20 20 20  nt nByte;       
294c0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
294d0 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e  mber of bytes in
294e0 20 61 6e 20 53 51 4c 20 73 74 72 69 6e 67 20 2a   an SQL string *
294f0 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20 6a 3b 20  /.    int i, j; 
29500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29510 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
29520 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65  rs */.    int ne
29530 65 64 43 6f 6d 6d 69 74 3b 20 20 20 20 20 20 20  edCommit;       
29540 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
29550 20 43 4f 4d 4d 49 54 20 6f 72 20 52 4f 4c 4c 42   COMMIT or ROLLB
29560 41 43 4b 20 61 74 20 65 6e 64 20 2a 2f 0a 20 20  ACK at end */.  
29570 20 20 69 6e 74 20 6e 53 65 70 3b 20 20 20 20 20    int nSep;     
29580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
29590 20 4e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   Number of bytes
295a0 20 69 6e 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61   in p->colSepara
295b0 74 6f 72 5b 5d 20 2a 2f 0a 20 20 20 20 63 68 61  tor[] */.    cha
295c0 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20  r *zSql;        
295d0 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 53           /* An S
295e0 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  QL statement */.
295f0 20 20 20 20 49 6d 70 6f 72 74 43 74 78 20 73 43      ImportCtx sC
29600 74 78 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  tx;             
29610 2f 2a 20 52 65 61 64 65 72 20 63 6f 6e 74 65 78  /* Reader contex
29620 74 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 28  t */.    char *(
29630 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 2a 78 52  SQLITE_CDECL *xR
29640 65 61 64 29 28 49 6d 70 6f 72 74 43 74 78 2a 29  ead)(ImportCtx*)
29650 3b 20 2f 2a 20 46 75 6e 63 20 74 6f 20 72 65 61  ; /* Func to rea
29660 64 20 6f 6e 65 20 76 61 6c 75 65 20 2a 2f 0a 20  d one value */. 
29670 20 20 20 69 6e 74 20 28 53 51 4c 49 54 45 5f 43     int (SQLITE_C
29680 44 45 43 4c 20 2a 78 43 6c 6f 73 65 72 29 28 46  DECL *xCloser)(F
29690 49 4c 45 2a 29 3b 20 20 20 20 20 20 2f 2a 20 46  ILE*);      /* F
296a0 75 6e 63 20 74 6f 20 63 6c 6f 73 65 20 66 69 6c  unc to close fil
296b0 65 20 2a 2f 0a 0a 20 20 20 20 69 66 28 20 6e 41  e */..    if( nA
296c0 72 67 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 72  rg!=3 ){.      r
296d0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
296e0 2c 20 22 55 73 61 67 65 3a 20 2e 69 6d 70 6f 72  , "Usage: .impor
296f0 74 20 46 49 4c 45 20 54 41 42 4c 45 5c 6e 22 29  t FILE TABLE\n")
29700 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74  ;.      goto met
29710 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
29720 20 20 20 20 7d 0a 20 20 20 20 7a 46 69 6c 65 20      }.    zFile 
29730 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20  = azArg[1];.    
29740 7a 54 61 62 6c 65 20 3d 20 61 7a 41 72 67 5b 32  zTable = azArg[2
29750 5d 3b 0a 20 20 20 20 73 65 65 6e 49 6e 74 65 72  ];.    seenInter
29760 72 75 70 74 20 3d 20 30 3b 0a 20 20 20 20 6d 65  rupt = 0;.    me
29770 6d 73 65 74 28 26 73 43 74 78 2c 20 30 2c 20 73  mset(&sCtx, 0, s
29780 69 7a 65 6f 66 28 73 43 74 78 29 29 3b 0a 20 20  izeof(sCtx));.  
29790 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
297a0 0a 20 20 20 20 6e 53 65 70 20 3d 20 73 74 72 6c  .    nSep = strl
297b0 65 6e 33 30 28 70 2d 3e 63 6f 6c 53 65 70 61 72  en30(p->colSepar
297c0 61 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 6e  ator);.    if( n
297d0 53 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Sep==0 ){.      
297e0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
297f0 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
29800 20 20 20 20 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d      "Error: non-
29810 6e 75 6c 6c 20 63 6f 6c 75 6d 6e 20 73 65 70 61  null column sepa
29820 72 61 74 6f 72 20 72 65 71 75 69 72 65 64 20 66  rator required f
29830 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20  or import\n");. 
29840 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
29850 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 53 65     }.    if( nSe
29860 70 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 61 77  p>1 ){.      raw
29870 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
29880 22 45 72 72 6f 72 3a 20 6d 75 6c 74 69 2d 63 68  "Error: multi-ch
29890 61 72 61 63 74 65 72 20 63 6f 6c 75 6d 6e 20 73  aracter column s
298a0 65 70 61 72 61 74 6f 72 73 20 6e 6f 74 20 61 6c  eparators not al
298b0 6c 6f 77 65 64 22 0a 20 20 20 20 20 20 20 20 20  lowed".         
298c0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 66               " f
298d0 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20  or import\n");. 
298e0 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
298f0 20 20 20 7d 0a 20 20 20 20 6e 53 65 70 20 3d 20     }.    nSep = 
29900 73 74 72 6c 65 6e 33 30 28 70 2d 3e 72 6f 77 53  strlen30(p->rowS
29910 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 69  eparator);.    i
29920 66 28 20 6e 53 65 70 3d 3d 30 20 29 7b 0a 20 20  f( nSep==0 ){.  
29930 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
29940 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6e  tderr, "Error: n
29950 6f 6e 2d 6e 75 6c 6c 20 72 6f 77 20 73 65 70 61  on-null row sepa
29960 72 61 74 6f 72 20 72 65 71 75 69 72 65 64 20 66  rator required f
29970 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20  or import\n");. 
29980 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
29990 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 53 65     }.    if( nSe
299a0 70 3d 3d 32 20 26 26 20 70 2d 3e 6d 6f 64 65 3d  p==2 && p->mode=
299b0 3d 4d 4f 44 45 5f 43 73 76 20 26 26 20 73 74 72  =MODE_Csv && str
299c0 63 6d 70 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  cmp(p->rowSepara
299d0 74 6f 72 2c 20 53 45 50 5f 43 72 4c 66 29 3d 3d  tor, SEP_CrLf)==
299e0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 57 68  0 ){.      /* Wh
299f0 65 6e 20 69 6d 70 6f 72 74 69 6e 67 20 43 53 56  en importing CSV
29a00 20 28 6f 6e 6c 79 29 2c 20 69 66 20 74 68 65 20   (only), if the 
29a10 72 6f 77 20 73 65 70 61 72 61 74 6f 72 20 69 73  row separator is
29a20 20 73 65 74 20 74 6f 20 74 68 65 0a 20 20 20 20   set to the.    
29a30 20 20 2a 2a 20 64 65 66 61 75 6c 74 20 6f 75 74    ** default out
29a40 70 75 74 20 72 6f 77 20 73 65 70 61 72 61 74 6f  put row separato
29a50 72 2c 20 63 68 61 6e 67 65 20 69 74 20 74 6f 20  r, change it to 
29a60 74 68 65 20 64 65 66 61 75 6c 74 20 69 6e 70 75  the default inpu
29a70 74 0a 20 20 20 20 20 20 2a 2a 20 72 6f 77 20 73  t.      ** row s
29a80 65 70 61 72 61 74 6f 72 2e 20 20 54 68 69 73 20  eparator.  This 
29a90 61 76 6f 69 64 73 20 68 61 76 69 6e 67 20 74 6f  avoids having to
29aa0 20 6d 61 69 6e 74 61 69 6e 20 64 69 66 66 65 72   maintain differ
29ab0 65 6e 74 20 69 6e 70 75 74 0a 20 20 20 20 20 20  ent input.      
29ac0 2a 2a 20 61 6e 64 20 6f 75 74 70 75 74 20 72 6f  ** and output ro
29ad0 77 20 73 65 70 61 72 61 74 6f 72 73 2e 20 2a 2f  w separators. */
29ae0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
29af0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
29b00 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c  ->rowSeparator),
29b10 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72   p->rowSeparator
29b20 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20  , SEP_Row);.    
29b30 20 20 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33    nSep = strlen3
29b40 30 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  0(p->rowSeparato
29b50 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  r);.    }.    if
29b60 28 20 6e 53 65 70 3e 31 20 29 7b 0a 20 20 20 20  ( nSep>1 ){.    
29b70 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
29b80 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6d 75 6c  err, "Error: mul
29b90 74 69 2d 63 68 61 72 61 63 74 65 72 20 72 6f 77  ti-character row
29ba0 20 73 65 70 61 72 61 74 6f 72 73 20 6e 6f 74 20   separators not 
29bb0 61 6c 6c 6f 77 65 64 22 0a 20 20 20 20 20 20 20  allowed".       
29bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
29bd0 20 66 6f 72 20 69 6d 70 6f 72 74 5c 6e 22 29 3b   for import\n");
29be0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
29bf0 0a 20 20 20 20 7d 0a 20 20 20 20 73 43 74 78 2e  .    }.    sCtx.
29c00 7a 46 69 6c 65 20 3d 20 7a 46 69 6c 65 3b 0a 20  zFile = zFile;. 
29c10 20 20 20 73 43 74 78 2e 6e 4c 69 6e 65 20 3d 20     sCtx.nLine = 
29c20 31 3b 0a 20 20 20 20 69 66 28 20 73 43 74 78 2e  1;.    if( sCtx.
29c30 7a 46 69 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b  zFile[0]=='|' ){
29c40 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f  .#ifdef SQLITE_O
29c50 4d 49 54 5f 50 4f 50 45 4e 0a 20 20 20 20 20 20  MIT_POPEN.      
29c60 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
29c70 72 2c 20 22 45 72 72 6f 72 3a 20 70 69 70 65 73  r, "Error: pipes
29c80 20 61 72 65 20 6e 6f 74 20 73 75 70 70 6f 72 74   are not support
29c90 65 64 20 69 6e 20 74 68 69 73 20 4f 53 5c 6e 22  ed in this OS\n"
29ca0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
29cb0 31 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 73  1;.#else.      s
29cc0 43 74 78 2e 69 6e 20 3d 20 70 6f 70 65 6e 28 73  Ctx.in = popen(s
29cd0 43 74 78 2e 7a 46 69 6c 65 2b 31 2c 20 22 72 22  Ctx.zFile+1, "r"
29ce0 29 3b 0a 20 20 20 20 20 20 73 43 74 78 2e 7a 46  );.      sCtx.zF
29cf0 69 6c 65 20 3d 20 22 3c 70 69 70 65 3e 22 3b 0a  ile = "<pipe>";.
29d00 20 20 20 20 20 20 78 43 6c 6f 73 65 72 20 3d 20        xCloser = 
29d10 70 63 6c 6f 73 65 3b 0a 23 65 6e 64 69 66 0a 20  pclose;.#endif. 
29d20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
29d30 73 43 74 78 2e 69 6e 20 3d 20 66 6f 70 65 6e 28  sCtx.in = fopen(
29d40 73 43 74 78 2e 7a 46 69 6c 65 2c 20 22 72 62 22  sCtx.zFile, "rb"
29d50 29 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72  );.      xCloser
29d60 20 3d 20 66 63 6c 6f 73 65 3b 0a 20 20 20 20 7d   = fclose;.    }
29d70 0a 20 20 20 20 69 66 28 20 70 2d 3e 6d 6f 64 65  .    if( p->mode
29d80 3d 3d 4d 4f 44 45 5f 41 73 63 69 69 20 29 7b 0a  ==MODE_Ascii ){.
29d90 20 20 20 20 20 20 78 52 65 61 64 20 3d 20 61 73        xRead = as
29da0 63 69 69 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65  cii_read_one_fie
29db0 6c 64 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ld;.    }else{. 
29dc0 20 20 20 20 20 78 52 65 61 64 20 3d 20 63 73 76       xRead = csv
29dd0 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 3b  _read_one_field;
29de0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
29df0 43 74 78 2e 69 6e 3d 3d 30 20 29 7b 0a 20 20 20  Ctx.in==0 ){.   
29e00 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
29e10 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63  tderr, "Error: c
29e20 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c  annot open \"%s\
29e30 22 5c 6e 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20  "\n", zFile);.  
29e40 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
29e50 20 20 7d 0a 20 20 20 20 73 43 74 78 2e 63 43 6f    }.    sCtx.cCo
29e60 6c 53 65 70 20 3d 20 70 2d 3e 63 6f 6c 53 65 70  lSep = p->colSep
29e70 61 72 61 74 6f 72 5b 30 5d 3b 0a 20 20 20 20 73  arator[0];.    s
29e80 43 74 78 2e 63 52 6f 77 53 65 70 20 3d 20 70 2d  Ctx.cRowSep = p-
29e90 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 5b 30 5d  >rowSeparator[0]
29ea0 3b 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c  ;.    zSql = sql
29eb0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45  ite3_mprintf("SE
29ec0 4c 45 43 54 20 2a 20 46 52 4f 4d 20 25 73 22 2c  LECT * FROM %s",
29ed0 20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 69 66   zTable);.    if
29ee0 28 20 7a 53 71 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( zSql==0 ){.   
29ef0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
29f00 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 6f 75  derr, "Error: ou
29f10 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b  t of memory\n");
29f20 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28 73  .      xCloser(s
29f30 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20 72  Ctx.in);.      r
29f40 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
29f50 20 20 20 6e 42 79 74 65 20 3d 20 73 74 72 6c 65     nByte = strle
29f60 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20 72  n30(zSql);.    r
29f70 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
29f80 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53  are_v2(p->db, zS
29f90 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
29fa0 30 29 3b 0a 20 20 20 20 69 6d 70 6f 72 74 5f 61  0);.    import_a
29fb0 70 70 65 6e 64 5f 63 68 61 72 28 26 73 43 74 78  ppend_char(&sCtx
29fc0 2c 20 30 29 3b 20 20 20 20 2f 2a 20 54 6f 20 65  , 0);    /* To e
29fd0 6e 73 75 72 65 20 73 43 74 78 2e 7a 20 69 73 20  nsure sCtx.z is 
29fe0 61 6c 6c 6f 63 61 74 65 64 20 2a 2f 0a 20 20 20  allocated */.   
29ff0 20 69 66 28 20 72 63 20 26 26 20 73 71 6c 69 74   if( rc && sqlit
2a000 65 33 5f 73 74 72 67 6c 6f 62 28 22 6e 6f 20 73  e3_strglob("no s
2a010 75 63 68 20 74 61 62 6c 65 3a 20 2a 22 2c 20 73  uch table: *", s
2a020 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
2a030 3e 64 62 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20  >db))==0 ){.    
2a040 20 20 63 68 61 72 20 2a 7a 43 72 65 61 74 65 20    char *zCreate 
2a050 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2a060 66 28 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  f("CREATE TABLE 
2a070 25 73 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20  %s", zTable);.  
2a080 20 20 20 20 63 68 61 72 20 63 53 65 70 20 3d 20      char cSep = 
2a090 27 28 27 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  '(';.      while
2a0a0 28 20 78 52 65 61 64 28 26 73 43 74 78 29 20 29  ( xRead(&sCtx) )
2a0b0 7b 0a 20 20 20 20 20 20 20 20 7a 43 72 65 61 74  {.        zCreat
2a0c0 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  e = sqlite3_mpri
2a0d0 6e 74 66 28 22 25 7a 25 63 5c 6e 20 20 5c 22 25  ntf("%z%c\n  \"%
2a0e0 77 5c 22 20 54 45 58 54 22 2c 20 7a 43 72 65 61  w\" TEXT", zCrea
2a0f0 74 65 2c 20 63 53 65 70 2c 20 73 43 74 78 2e 7a  te, cSep, sCtx.z
2a100 29 3b 0a 20 20 20 20 20 20 20 20 63 53 65 70 20  );.        cSep 
2a110 3d 20 27 2c 27 3b 0a 20 20 20 20 20 20 20 20 69  = ',';.        i
2a120 66 28 20 73 43 74 78 2e 63 54 65 72 6d 21 3d 73  f( sCtx.cTerm!=s
2a130 43 74 78 2e 63 43 6f 6c 53 65 70 20 29 20 62 72  Ctx.cColSep ) br
2a140 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
2a150 20 20 20 69 66 28 20 63 53 65 70 3d 3d 27 28 27     if( cSep=='('
2a160 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
2a170 74 65 33 5f 66 72 65 65 28 7a 43 72 65 61 74 65  te3_free(zCreate
2a180 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2a190 65 33 5f 66 72 65 65 28 73 43 74 78 2e 7a 29 3b  e3_free(sCtx.z);
2a1a0 0a 20 20 20 20 20 20 20 20 78 43 6c 6f 73 65 72  .        xCloser
2a1b0 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20  (sCtx.in);.     
2a1c0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2a1d0 74 64 65 72 72 2c 22 25 73 3a 20 65 6d 70 74 79  tderr,"%s: empty
2a1e0 20 66 69 6c 65 5c 6e 22 2c 20 73 43 74 78 2e 7a   file\n", sCtx.z
2a1f0 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 72  File);.        r
2a200 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
2a210 0a 20 20 20 20 20 20 7a 43 72 65 61 74 65 20 3d  .      zCreate =
2a220 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2a230 28 22 25 7a 5c 6e 29 22 2c 20 7a 43 72 65 61 74  ("%z\n)", zCreat
2a240 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73  e);.      rc = s
2a250 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
2a260 62 2c 20 7a 43 72 65 61 74 65 2c 20 30 2c 20 30  b, zCreate, 0, 0
2a270 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
2a280 74 65 33 5f 66 72 65 65 28 7a 43 72 65 61 74 65  te3_free(zCreate
2a290 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
2a2a0 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
2a2b0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2a2c0 43 52 45 41 54 45 20 54 41 42 4c 45 20 25 73 28  CREATE TABLE %s(
2a2d0 2e 2e 2e 29 20 66 61 69 6c 65 64 3a 20 25 73 5c  ...) failed: %s\
2a2e0 6e 22 2c 20 7a 54 61 62 6c 65 2c 0a 20 20 20 20  n", zTable,.    
2a2f0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2a300 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
2a310 29 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ));.        sqli
2a320 74 65 33 5f 66 72 65 65 28 73 43 74 78 2e 7a 29  te3_free(sCtx.z)
2a330 3b 0a 20 20 20 20 20 20 20 20 78 43 6c 6f 73 65  ;.        xClose
2a340 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20  r(sCtx.in);.    
2a350 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
2a360 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
2a370 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
2a380 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c  _v2(p->db, zSql,
2a390 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b   -1, &pStmt, 0);
2a3a0 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2a3b0 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
2a3c0 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
2a3d0 20 20 20 69 66 20 28 70 53 74 6d 74 29 20 73 71     if (pStmt) sq
2a3e0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
2a3f0 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 75 74 66  Stmt);.      utf
2a400 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
2a410 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73  "Error: %s\n", s
2a420 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d  qlite3_errmsg(p-
2a430 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 78 43 6c  >db));.      xCl
2a440 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a 20  oser(sCtx.in);. 
2a450 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2a460 20 20 20 7d 0a 20 20 20 20 6e 43 6f 6c 20 3d 20     }.    nCol = 
2a470 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63  sqlite3_column_c
2a480 6f 75 6e 74 28 70 53 74 6d 74 29 3b 0a 20 20 20  ount(pStmt);.   
2a490 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
2a4a0 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 70 53  e(pStmt);.    pS
2a4b0 74 6d 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  tmt = 0;.    if(
2a4c0 20 6e 43 6f 6c 3d 3d 30 20 29 20 72 65 74 75 72   nCol==0 ) retur
2a4d0 6e 20 30 3b 20 2f 2a 20 6e 6f 20 63 6f 6c 75 6d  n 0; /* no colum
2a4e0 6e 73 2c 20 6e 6f 20 65 72 72 6f 72 20 2a 2f 0a  ns, no error */.
2a4f0 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
2a500 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e 42 79  e3_malloc64( nBy
2a510 74 65 2a 32 20 2b 20 32 30 20 2b 20 6e 43 6f 6c  te*2 + 20 + nCol
2a520 2a 32 20 29 3b 0a 20 20 20 20 69 66 28 20 7a 53  *2 );.    if( zS
2a530 71 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ql==0 ){.      r
2a540 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
2a550 2c 20 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66  , "Error: out of
2a560 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20   memory\n");.   
2a570 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e     xCloser(sCtx.
2a580 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  in);.      retur
2a590 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  n 1;.    }.    s
2a5a0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2a5b0 6e 42 79 74 65 2b 32 30 2c 20 7a 53 71 6c 2c 20  nByte+20, zSql, 
2a5c0 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5c 22 25  "INSERT INTO \"%
2a5d0 77 5c 22 20 56 41 4c 55 45 53 28 3f 22 2c 20 7a  w\" VALUES(?", z
2a5e0 54 61 62 6c 65 29 3b 0a 20 20 20 20 6a 20 3d 20  Table);.    j = 
2a5f0 73 74 72 6c 65 6e 33 30 28 7a 53 71 6c 29 3b 0a  strlen30(zSql);.
2a600 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e      for(i=1; i<n
2a610 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
2a620 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 2c 27   zSql[j++] = ','
2a630 3b 0a 20 20 20 20 20 20 7a 53 71 6c 5b 6a 2b 2b  ;.      zSql[j++
2a640 5d 20 3d 20 27 3f 27 3b 0a 20 20 20 20 7d 0a 20  ] = '?';.    }. 
2a650 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27     zSql[j++] = '
2a660 29 27 3b 0a 20 20 20 20 7a 53 71 6c 5b 6a 5d 20  )';.    zSql[j] 
2a670 3d 20 30 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  = 0;.    rc = sq
2a680 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
2a690 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31  (p->db, zSql, -1
2a6a0 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
2a6b0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2a6c0 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63  Sql);.    if( rc
2a6d0 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
2a6e0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
2a6f0 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c  rror: %s\n", sql
2a700 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64  ite3_errmsg(p->d
2a710 62 29 29 3b 0a 20 20 20 20 20 20 69 66 20 28 70  b));.      if (p
2a720 53 74 6d 74 29 20 73 71 6c 69 74 65 33 5f 66 69  Stmt) sqlite3_fi
2a730 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20  nalize(pStmt);. 
2a740 20 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74       xCloser(sCt
2a750 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20 72 65 74  x.in);.      ret
2a760 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
2a770 20 6e 65 65 64 43 6f 6d 6d 69 74 20 3d 20 73 71   needCommit = sq
2a780 6c 69 74 65 33 5f 67 65 74 5f 61 75 74 6f 63 6f  lite3_get_autoco
2a790 6d 6d 69 74 28 70 2d 3e 64 62 29 3b 0a 20 20 20  mmit(p->db);.   
2a7a0 20 69 66 28 20 6e 65 65 64 43 6f 6d 6d 69 74 20   if( needCommit 
2a7b0 29 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70  ) sqlite3_exec(p
2a7c0 2d 3e 64 62 2c 20 22 42 45 47 49 4e 22 2c 20 30  ->db, "BEGIN", 0
2a7d0 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 64 6f 7b  , 0, 0);.    do{
2a7e0 0a 20 20 20 20 20 20 69 6e 74 20 73 74 61 72 74  .      int start
2a7f0 4c 69 6e 65 20 3d 20 73 43 74 78 2e 6e 4c 69 6e  Line = sCtx.nLin
2a800 65 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  e;.      for(i=0
2a810 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a  ; i<nCol; i++){.
2a820 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20          char *z 
2a830 3d 20 78 52 65 61 64 28 26 73 43 74 78 29 3b 0a  = xRead(&sCtx);.
2a840 20 20 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20          /*.     
2a850 20 20 20 2a 2a 20 44 69 64 20 77 65 20 72 65 61     ** Did we rea
2a860 63 68 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 20 62  ch end-of-file b
2a870 65 66 6f 72 65 20 66 69 6e 64 69 6e 67 20 61 6e  efore finding an
2a880 79 20 63 6f 6c 75 6d 6e 73 3f 0a 20 20 20 20 20  y columns?.     
2a890 20 20 20 2a 2a 20 49 66 20 73 6f 2c 20 73 74 6f     ** If so, sto
2a8a0 70 20 69 6e 73 74 65 61 64 20 6f 66 20 4e 55 4c  p instead of NUL
2a8b0 4c 20 66 69 6c 6c 69 6e 67 20 74 68 65 20 72 65  L filling the re
2a8c0 6d 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 73 2e  maining columns.
2a8d0 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
2a8e0 20 20 20 20 69 66 28 20 7a 3d 3d 30 20 26 26 20      if( z==0 && 
2a8f0 69 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  i==0 ) break;.  
2a900 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20 20 20        /*.       
2a910 20 2a 2a 20 44 69 64 20 77 65 20 72 65 61 63 68   ** Did we reach
2a920 20 65 6e 64 2d 6f 66 2d 66 69 6c 65 20 4f 52 20   end-of-file OR 
2a930 65 6e 64 2d 6f 66 2d 6c 69 6e 65 20 62 65 66 6f  end-of-line befo
2a940 72 65 20 66 69 6e 64 69 6e 67 20 61 6e 79 0a 20  re finding any. 
2a950 20 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e         ** column
2a960 73 20 69 6e 20 41 53 43 49 49 20 6d 6f 64 65 3f  s in ASCII mode?
2a970 20 20 49 66 20 73 6f 2c 20 73 74 6f 70 20 69 6e    If so, stop in
2a980 73 74 65 61 64 20 6f 66 20 4e 55 4c 4c 20 66 69  stead of NULL fi
2a990 6c 6c 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a  lling.        **
2a9a0 20 74 68 65 20 72 65 6d 61 69 6e 69 6e 67 20 63   the remaining c
2a9b0 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20 20 20 20 20  olumns..        
2a9c0 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  */.        if( p
2a9d0 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 41 73 63  ->mode==MODE_Asc
2a9e0 69 69 20 26 26 20 28 7a 3d 3d 30 20 7c 7c 20 7a  ii && (z==0 || z
2a9f0 5b 30 5d 3d 3d 30 29 20 26 26 20 69 3d 3d 30 20  [0]==0) && i==0 
2aa00 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
2aa10 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65   sqlite3_bind_te
2aa20 78 74 28 70 53 74 6d 74 2c 20 69 2b 31 2c 20 7a  xt(pStmt, i+1, z
2aa30 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52 41  , -1, SQLITE_TRA
2aa40 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 20 20 20  NSIENT);.       
2aa50 20 69 66 28 20 69 3c 6e 43 6f 6c 2d 31 20 26 26   if( i<nCol-1 &&
2aa60 20 73 43 74 78 2e 63 54 65 72 6d 21 3d 73 43 74   sCtx.cTerm!=sCt
2aa70 78 2e 63 43 6f 6c 53 65 70 20 29 7b 0a 20 20 20  x.cColSep ){.   
2aa80 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2aa90 74 66 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25  tf(stderr, "%s:%
2aaa0 64 3a 20 65 78 70 65 63 74 65 64 20 25 64 20 63  d: expected %d c
2aab0 6f 6c 75 6d 6e 73 20 62 75 74 20 66 6f 75 6e 64  olumns but found
2aac0 20 25 64 20 2d 20 22 0a 20 20 20 20 20 20 20 20   %d - ".        
2aad0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aae0 20 20 22 66 69 6c 6c 69 6e 67 20 74 68 65 20 72    "filling the r
2aaf0 65 73 74 20 77 69 74 68 20 4e 55 4c 4c 5c 6e 22  est with NULL\n"
2ab00 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2ab10 20 20 20 20 20 20 20 20 20 20 20 20 73 43 74 78              sCtx
2ab20 2e 7a 46 69 6c 65 2c 20 73 74 61 72 74 4c 69 6e  .zFile, startLin
2ab30 65 2c 20 6e 43 6f 6c 2c 20 69 2b 31 29 3b 0a 20  e, nCol, i+1);. 
2ab40 20 20 20 20 20 20 20 20 20 69 20 2b 3d 20 32 3b           i += 2;
2ab50 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
2ab60 28 20 69 3c 3d 6e 43 6f 6c 20 29 7b 20 73 71 6c  ( i<=nCol ){ sql
2ab70 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c 28 70  ite3_bind_null(p
2ab80 53 74 6d 74 2c 20 69 29 3b 20 69 2b 2b 3b 20 7d  Stmt, i); i++; }
2ab90 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2aba0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 73 43 74   }.      if( sCt
2abb0 78 2e 63 54 65 72 6d 3d 3d 73 43 74 78 2e 63 43  x.cTerm==sCtx.cC
2abc0 6f 6c 53 65 70 20 29 7b 0a 20 20 20 20 20 20 20  olSep ){.       
2abd0 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 20 20 78   do{.          x
2abe0 52 65 61 64 28 26 73 43 74 78 29 3b 0a 20 20 20  Read(&sCtx);.   
2abf0 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
2ac00 20 20 20 20 7d 77 68 69 6c 65 28 20 73 43 74 78      }while( sCtx
2ac10 2e 63 54 65 72 6d 3d 3d 73 43 74 78 2e 63 43 6f  .cTerm==sCtx.cCo
2ac20 6c 53 65 70 20 29 3b 0a 20 20 20 20 20 20 20 20  lSep );.        
2ac30 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
2ac40 72 72 2c 20 22 25 73 3a 25 64 3a 20 65 78 70 65  rr, "%s:%d: expe
2ac50 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e 73 20  cted %d columns 
2ac60 62 75 74 20 66 6f 75 6e 64 20 25 64 20 2d 20 22  but found %d - "
2ac70 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ac80 20 20 20 20 20 20 20 20 20 22 65 78 74 72 61 73           "extras
2ac90 20 69 67 6e 6f 72 65 64 5c 6e 22 2c 0a 20 20 20   ignored\n",.   
2aca0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2acb0 20 20 20 20 20 73 43 74 78 2e 7a 46 69 6c 65 2c       sCtx.zFile,
2acc0 20 73 74 61 72 74 4c 69 6e 65 2c 20 6e 43 6f 6c   startLine, nCol
2acd0 2c 20 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , i);.      }.  
2ace0 20 20 20 20 69 66 28 20 69 3e 3d 6e 43 6f 6c 20      if( i>=nCol 
2acf0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2ad00 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a  e3_step(pStmt);.
2ad10 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2ad20 69 74 65 33 5f 72 65 73 65 74 28 70 53 74 6d 74  ite3_reset(pStmt
2ad30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72  );.        if( r
2ad40 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
2ad50 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
2ad60 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25  rintf(stderr, "%
2ad70 73 3a 25 64 3a 20 49 4e 53 45 52 54 20 66 61 69  s:%d: INSERT fai
2ad80 6c 65 64 3a 20 25 73 5c 6e 22 2c 20 73 43 74 78  led: %s\n", sCtx
2ad90 2e 7a 46 69 6c 65 2c 0a 20 20 20 20 20 20 20 20  .zFile,.        
2ada0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
2adb0 61 72 74 4c 69 6e 65 2c 20 73 71 6c 69 74 65 33  artLine, sqlite3
2adc0 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
2add0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ade0 20 7d 0a 20 20 20 20 7d 77 68 69 6c 65 28 20 73   }.    }while( s
2adf0 43 74 78 2e 63 54 65 72 6d 21 3d 45 4f 46 20 29  Ctx.cTerm!=EOF )
2ae00 3b 0a 0a 20 20 20 20 78 43 6c 6f 73 65 72 28 73  ;..    xCloser(s
2ae10 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 73 71 6c  Ctx.in);.    sql
2ae20 69 74 65 33 5f 66 72 65 65 28 73 43 74 78 2e 7a  ite3_free(sCtx.z
2ae30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
2ae40 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
2ae50 20 20 20 20 69 66 28 20 6e 65 65 64 43 6f 6d 6d      if( needComm
2ae60 69 74 20 29 20 73 71 6c 69 74 65 33 5f 65 78 65  it ) sqlite3_exe
2ae70 63 28 70 2d 3e 64 62 2c 20 22 43 4f 4d 4d 49 54  c(p->db, "COMMIT
2ae80 22 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  ", 0, 0, 0);.  }
2ae90 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51  else..#ifndef SQ
2aea0 4c 49 54 45 5f 55 4e 54 45 53 54 41 42 4c 45 0a  LITE_UNTESTABLE.
2aeb0 20 20 69 66 28 20 63 3d 3d 27 69 27 20 26 26 20    if( c=='i' && 
2aec0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2aed0 2c 20 22 69 6d 70 6f 73 74 65 72 22 2c 20 6e 29  , "imposter", n)
2aee0 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20  ==0 ){.    char 
2aef0 2a 7a 53 71 6c 3b 0a 20 20 20 20 63 68 61 72 20  *zSql;.    char 
2af00 2a 7a 43 6f 6c 6c 69 73 74 20 3d 20 30 3b 0a 20  *zCollist = 0;. 
2af10 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
2af20 2a 70 53 74 6d 74 3b 0a 20 20 20 20 69 6e 74 20  *pStmt;.    int 
2af30 74 6e 75 6d 20 3d 20 30 3b 0a 20 20 20 20 69 6e  tnum = 0;.    in
2af40 74 20 69 3b 0a 20 20 20 20 69 66 28 20 6e 41 72  t i;.    if( nAr
2af50 67 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 75 74  g!=3 ){.      ut
2af60 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2af70 2c 20 22 55 73 61 67 65 3a 20 2e 69 6d 70 6f 73  , "Usage: .impos
2af80 74 65 72 20 49 4e 44 45 58 20 49 4d 50 4f 53 54  ter INDEX IMPOST
2af90 45 52 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  ER\n");.      rc
2afa0 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f   = 1;.      goto
2afb0 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
2afc0 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70  it;.    }.    op
2afd0 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
2afe0 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
2aff0 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
2b000 72 6f 6f 74 70 61 67 65 20 46 52 4f 4d 20 73 71  rootpage FROM sq
2b010 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20  lite_master".   
2b020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b030 20 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20          " WHERE 
2b040 6e 61 6d 65 3d 27 25 71 27 20 41 4e 44 20 74 79  name='%q' AND ty
2b050 70 65 3d 27 69 6e 64 65 78 27 22 2c 20 61 7a 41  pe='index'", azA
2b060 72 67 5b 31 5d 29 3b 0a 20 20 20 20 73 71 6c 69  rg[1]);.    sqli
2b070 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
2b080 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
2b090 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
2b0a0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
2b0b0 6c 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  l);.    if( sqli
2b0c0 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
2b0d0 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20  =SQLITE_ROW ){. 
2b0e0 20 20 20 20 20 74 6e 75 6d 20 3d 20 73 71 6c 69       tnum = sqli
2b0f0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
2b100 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 7d 0a  Stmt, 0);.    }.
2b110 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61      sqlite3_fina
2b120 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20  lize(pStmt);.   
2b130 20 69 66 28 20 74 6e 75 6d 3d 3d 30 20 29 7b 0a   if( tnum==0 ){.
2b140 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2b150 66 28 73 74 64 65 72 72 2c 20 22 6e 6f 20 73 75  f(stderr, "no su
2b160 63 68 20 69 6e 64 65 78 3a 20 5c 22 25 73 5c 22  ch index: \"%s\"
2b170 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  \n", azArg[1]);.
2b180 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
2b190 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
2b1a0 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
2b1b0 7d 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c  }.    zSql = sql
2b1c0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 50 52  ite3_mprintf("PR
2b1d0 41 47 4d 41 20 69 6e 64 65 78 5f 78 69 6e 66 6f  AGMA index_xinfo
2b1e0 3d 27 25 71 27 22 2c 20 61 7a 41 72 67 5b 31 5d  ='%q'", azArg[1]
2b1f0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
2b200 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
2b210 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
2b220 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
2b230 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
2b240 6c 29 3b 0a 20 20 20 20 69 20 3d 20 30 3b 0a 20  l);.    i = 0;. 
2b250 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65     while( sqlite
2b260 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53  3_step(pStmt)==S
2b270 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20  QLITE_ROW ){.   
2b280 20 20 20 63 68 61 72 20 7a 4c 61 62 65 6c 5b 32     char zLabel[2
2b290 30 5d 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  0];.      const 
2b2a0 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 28 63 6f  char *zCol = (co
2b2b0 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
2b2c0 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
2b2d0 74 6d 74 2c 32 29 3b 0a 20 20 20 20 20 20 69 2b  tmt,2);.      i+
2b2e0 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6f  +;.      if( zCo
2b2f0 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l==0 ){.        
2b300 69 66 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  if( sqlite3_colu
2b310 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 31 29 3d  mn_int(pStmt,1)=
2b320 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20  =-1 ){.         
2b330 20 7a 43 6f 6c 20 3d 20 22 5f 52 4f 57 49 44 5f   zCol = "_ROWID_
2b340 22 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  ";.        }else
2b350 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
2b360 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
2b370 65 6f 66 28 7a 4c 61 62 65 6c 29 2c 7a 4c 61 62  eof(zLabel),zLab
2b380 65 6c 2c 22 65 78 70 72 25 64 22 2c 69 29 3b 0a  el,"expr%d",i);.
2b390 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c 20 3d            zCol =
2b3a0 20 7a 4c 61 62 65 6c 3b 0a 20 20 20 20 20 20 20   zLabel;.       
2b3b0 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
2b3c0 20 69 66 28 20 7a 43 6f 6c 6c 69 73 74 3d 3d 30   if( zCollist==0
2b3d0 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c   ){.        zCol
2b3e0 6c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 5f 6d  list = sqlite3_m
2b3f0 70 72 69 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c  printf("\"%w\"",
2b400 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 65   zCol);.      }e
2b410 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 43 6f  lse{.        zCo
2b420 6c 6c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 5f  llist = sqlite3_
2b430 6d 70 72 69 6e 74 66 28 22 25 7a 2c 5c 22 25 77  mprintf("%z,\"%w
2b440 5c 22 22 2c 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a  \"", zCollist, z
2b450 43 6f 6c 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Col);.      }.  
2b460 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f    }.    sqlite3_
2b470 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
2b480 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  .    zSql = sqli
2b490 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
2b4a0 20 20 20 20 20 20 20 22 43 52 45 41 54 45 20 54         "CREATE T
2b4b0 41 42 4c 45 20 5c 22 25 77 5c 22 28 25 73 2c 50  ABLE \"%w\"(%s,P
2b4c0 52 49 4d 41 52 59 20 4b 45 59 28 25 73 29 29 57  RIMARY KEY(%s))W
2b4d0 49 54 48 4f 55 54 20 52 4f 57 49 44 22 2c 0a 20  ITHOUT ROWID",. 
2b4e0 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b 32           azArg[2
2b4f0 5d 2c 20 7a 43 6f 6c 6c 69 73 74 2c 20 7a 43 6f  ], zCollist, zCo
2b500 6c 6c 69 73 74 29 3b 0a 20 20 20 20 73 71 6c 69  llist);.    sqli
2b510 74 65 33 5f 66 72 65 65 28 7a 43 6f 6c 6c 69 73  te3_free(zCollis
2b520 74 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  t);.    rc = sql
2b530 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
2b540 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  l(SQLITE_TESTCTR
2b550 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e 64  L_IMPOSTER, p->d
2b560 62 2c 20 22 6d 61 69 6e 22 2c 20 31 2c 20 74 6e  b, "main", 1, tn
2b570 75 6d 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d  um);.    if( rc=
2b580 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
2b590 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
2b5a0 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 53 71  _exec(p->db, zSq
2b5b0 6c 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  l, 0, 0, 0);.   
2b5c0 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f     sqlite3_test_
2b5d0 63 6f 6e 74 72 6f 6c 28 53 51 4c 49 54 45 5f 54  control(SQLITE_T
2b5e0 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52  ESTCTRL_IMPOSTER
2b5f0 2c 20 70 2d 3e 64 62 2c 20 22 6d 61 69 6e 22 2c  , p->db, "main",
2b600 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   0, 0);.      if
2b610 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
2b620 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
2b630 72 72 2c 20 22 45 72 72 6f 72 20 69 6e 20 5b 25  rr, "Error in [%
2b640 73 5d 3a 20 25 73 5c 6e 22 2c 20 7a 53 71 6c 2c  s]: %s\n", zSql,
2b650 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
2b660 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 7d  p->db));.      }
2b670 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 75 74  else{.        ut
2b680 66 38 5f 70 72 69 6e 74 66 28 73 74 64 6f 75 74  f8_printf(stdout
2b690 2c 20 22 25 73 3b 5c 6e 22 2c 20 7a 53 71 6c 29  , "%s;\n", zSql)
2b6a0 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  ;.        raw_pr
2b6b0 69 6e 74 66 28 73 74 64 6f 75 74 2c 0a 20 20 20  intf(stdout,.   
2b6c0 20 20 20 20 20 20 20 20 22 57 41 52 4e 49 4e 47          "WARNING
2b6d0 3a 20 77 72 69 74 69 6e 67 20 74 6f 20 61 6e 20  : writing to an 
2b6e0 69 6d 70 6f 73 74 65 72 20 74 61 62 6c 65 20 77  imposter table w
2b6f0 69 6c 6c 20 63 6f 72 72 75 70 74 20 74 68 65 20  ill corrupt the 
2b700 69 6e 64 65 78 21 5c 6e 22 0a 20 20 20 20 20 20  index!\n".      
2b710 20 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20    );.      }.   
2b720 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61   }else{.      ra
2b730 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2b740 20 22 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52   "SQLITE_TESTCTR
2b750 4c 5f 49 4d 50 4f 53 54 45 52 20 72 65 74 75 72  L_IMPOSTER retur
2b760 6e 73 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20  ns %d\n", rc);. 
2b770 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
2b780 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66   }.    sqlite3_f
2b790 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 65 6c  ree(zSql);.  }el
2b7a0 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65  se.#endif /* !de
2b7b0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
2b7c0 54 5f 54 45 53 54 5f 43 4f 4e 54 52 4f 4c 29 20  T_TEST_CONTROL) 
2b7d0 2a 2f 0a 0a 23 69 66 64 65 66 20 53 51 4c 49 54  */..#ifdef SQLIT
2b7e0 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52 41 43 45  E_ENABLE_IOTRACE
2b7f0 0a 20 20 69 66 28 20 63 3d 3d 27 69 27 20 26 26  .  if( c=='i' &&
2b800 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2b810 5d 2c 20 22 69 6f 74 72 61 63 65 22 2c 20 6e 29  ], "iotrace", n)
2b820 3d 3d 30 20 29 7b 0a 20 20 20 20 53 51 4c 49 54  ==0 ){.    SQLIT
2b830 45 5f 41 50 49 20 65 78 74 65 72 6e 20 76 6f 69  E_API extern voi
2b840 64 20 28 53 51 4c 49 54 45 5f 43 44 45 43 4c 20  d (SQLITE_CDECL 
2b850 2a 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 29  *sqlite3IoTrace)
2b860 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 20 2e 2e  (const char*, ..
2b870 2e 29 3b 0a 20 20 20 20 69 66 28 20 69 6f 74 72  .);.    if( iotr
2b880 61 63 65 20 26 26 20 69 6f 74 72 61 63 65 21 3d  ace && iotrace!=
2b890 73 74 64 6f 75 74 20 29 20 66 63 6c 6f 73 65 28  stdout ) fclose(
2b8a0 69 6f 74 72 61 63 65 29 3b 0a 20 20 20 20 69 6f  iotrace);.    io
2b8b0 74 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 69  trace = 0;.    i
2b8c0 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20  f( nArg<2 ){.   
2b8d0 20 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63     sqlite3IoTrac
2b8e0 65 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65  e = 0;.    }else
2b8f0 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72   if( strcmp(azAr
2b900 67 5b 31 5d 2c 20 22 2d 22 29 3d 3d 30 20 29 7b  g[1], "-")==0 ){
2b910 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f  .      sqlite3Io
2b920 54 72 61 63 65 20 3d 20 69 6f 74 72 61 63 65 50  Trace = iotraceP
2b930 72 69 6e 74 66 3b 0a 20 20 20 20 20 20 69 6f 74  rintf;.      iot
2b940 72 61 63 65 20 3d 20 73 74 64 6f 75 74 3b 0a 20  race = stdout;. 
2b950 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2b960 69 6f 74 72 61 63 65 20 3d 20 66 6f 70 65 6e 28  iotrace = fopen(
2b970 61 7a 41 72 67 5b 31 5d 2c 20 22 77 22 29 3b 0a  azArg[1], "w");.
2b980 20 20 20 20 20 20 69 66 28 20 69 6f 74 72 61 63        if( iotrac
2b990 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
2b9a0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
2b9b0 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e  rr, "Error: cann
2b9c0 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e  ot open \"%s\"\n
2b9d0 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ", azArg[1]);.  
2b9e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 49 6f 54        sqlite3IoT
2b9f0 72 61 63 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  race = 0;.      
2ba00 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
2ba10 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
2ba20 71 6c 69 74 65 33 49 6f 54 72 61 63 65 20 3d 20  qlite3IoTrace = 
2ba30 69 6f 74 72 61 63 65 50 72 69 6e 74 66 3b 0a 20  iotracePrintf;. 
2ba40 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
2ba50 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69  else.#endif..  i
2ba60 66 28 20 63 3d 3d 27 6c 27 20 26 26 20 6e 3e 3d  f( c=='l' && n>=
2ba70 35 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  5 && strncmp(azA
2ba80 72 67 5b 30 5d 2c 20 22 6c 69 6d 69 74 73 22 2c  rg[0], "limits",
2ba90 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74   n)==0 ){.    st
2baa0 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63  atic const struc
2bab0 74 20 7b 0a 20 20 20 20 20 20 20 63 6f 6e 73 74  t {.       const
2bac0 20 63 68 61 72 20 2a 7a 4c 69 6d 69 74 4e 61 6d   char *zLimitNam
2bad0 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20  e;   /* Name of 
2bae0 61 20 6c 69 6d 69 74 20 2a 2f 0a 20 20 20 20 20  a limit */.     
2baf0 20 20 69 6e 74 20 6c 69 6d 69 74 43 6f 64 65 3b    int limitCode;
2bb00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
2bb10 6e 74 65 67 65 72 20 63 6f 64 65 20 66 6f 72 20  nteger code for 
2bb20 74 68 61 74 20 6c 69 6d 69 74 20 2a 2f 0a 20 20  that limit */.  
2bb30 20 20 7d 20 61 4c 69 6d 69 74 5b 5d 20 3d 20 7b    } aLimit[] = {
2bb40 0a 20 20 20 20 20 20 7b 20 22 6c 65 6e 67 74 68  .      { "length
2bb50 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ",              
2bb60 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 4c    SQLITE_LIMIT_L
2bb70 45 4e 47 54 48 20 20 20 20 20 20 20 20 20 20 20  ENGTH           
2bb80 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20           },.    
2bb90 20 20 7b 20 22 73 71 6c 5f 6c 65 6e 67 74 68 22    { "sql_length"
2bba0 2c 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c  ,            SQL
2bbb0 49 54 45 5f 4c 49 4d 49 54 5f 53 51 4c 5f 4c 45  ITE_LIMIT_SQL_LE
2bbc0 4e 47 54 48 20 20 20 20 20 20 20 20 20 20 20 20  NGTH            
2bbd0 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
2bbe0 63 6f 6c 75 6d 6e 22 2c 20 20 20 20 20 20 20 20  column",        
2bbf0 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
2bc00 49 4d 49 54 5f 43 4f 4c 55 4d 4e 20 20 20 20 20  IMIT_COLUMN     
2bc10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
2bc20 2c 0a 20 20 20 20 20 20 7b 20 22 65 78 70 72 5f  ,.      { "expr_
2bc30 64 65 70 74 68 22 2c 20 20 20 20 20 20 20 20 20  depth",         
2bc40 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
2bc50 45 58 50 52 5f 44 45 50 54 48 20 20 20 20 20 20  EXPR_DEPTH      
2bc60 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2bc70 20 20 20 7b 20 22 63 6f 6d 70 6f 75 6e 64 5f 73     { "compound_s
2bc80 65 6c 65 63 74 22 2c 20 20 20 20 20 20 20 53 51  elect",       SQ
2bc90 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4d 50 4f  LITE_LIMIT_COMPO
2bca0 55 4e 44 5f 53 45 4c 45 43 54 20 20 20 20 20 20  UND_SELECT      
2bcb0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
2bcc0 22 76 64 62 65 5f 6f 70 22 2c 20 20 20 20 20 20  "vdbe_op",      
2bcd0 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f           SQLITE_
2bce0 4c 49 4d 49 54 5f 56 44 42 45 5f 4f 50 20 20 20  LIMIT_VDBE_OP   
2bcf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd00 7d 2c 0a 20 20 20 20 20 20 7b 20 22 66 75 6e 63  },.      { "func
2bd10 74 69 6f 6e 5f 61 72 67 22 2c 20 20 20 20 20 20  tion_arg",      
2bd20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
2bd30 5f 46 55 4e 43 54 49 4f 4e 5f 41 52 47 20 20 20  _FUNCTION_ARG   
2bd40 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
2bd50 20 20 20 20 7b 20 22 61 74 74 61 63 68 65 64 22      { "attached"
2bd60 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53  ,              S
2bd70 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 41 54 54 41  QLITE_LIMIT_ATTA
2bd80 43 48 45 44 20 20 20 20 20 20 20 20 20 20 20 20  CHED            
2bd90 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
2bda0 20 22 6c 69 6b 65 5f 70 61 74 74 65 72 6e 5f 6c   "like_pattern_l
2bdb0 65 6e 67 74 68 22 2c 20 20 20 53 51 4c 49 54 45  ength",   SQLITE
2bdc0 5f 4c 49 4d 49 54 5f 4c 49 4b 45 5f 50 41 54 54  _LIMIT_LIKE_PATT
2bdd0 45 52 4e 5f 4c 45 4e 47 54 48 20 20 20 20 20 20  ERN_LENGTH      
2bde0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 76 61 72   },.      { "var
2bdf0 69 61 62 6c 65 5f 6e 75 6d 62 65 72 22 2c 20 20  iable_number",  
2be00 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49       SQLITE_LIMI
2be10 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
2be20 52 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20  R           },. 
2be30 20 20 20 20 20 7b 20 22 74 72 69 67 67 65 72 5f       { "trigger_
2be40 64 65 70 74 68 22 2c 20 20 20 20 20 20 20 20 20  depth",         
2be50 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 54 52 49  SQLITE_LIMIT_TRI
2be60 47 47 45 52 5f 44 45 50 54 48 20 20 20 20 20 20  GGER_DEPTH      
2be70 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
2be80 7b 20 22 77 6f 72 6b 65 72 5f 74 68 72 65 61 64  { "worker_thread
2be90 73 22 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54  s",        SQLIT
2bea0 45 5f 4c 49 4d 49 54 5f 57 4f 52 4b 45 52 5f 54  E_LIMIT_WORKER_T
2beb0 48 52 45 41 44 53 20 20 20 20 20 20 20 20 20 20  HREADS          
2bec0 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20    },.    };.    
2bed0 69 6e 74 20 69 2c 20 6e 32 3b 0a 20 20 20 20 6f  int i, n2;.    o
2bee0 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
2bef0 20 20 69 66 28 20 6e 41 72 67 3d 3d 31 20 29 7b    if( nArg==1 ){
2bf00 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
2bf10 69 3c 41 72 72 61 79 53 69 7a 65 28 61 4c 69 6d  i<ArraySize(aLim
2bf20 69 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  it); i++){.     
2bf30 20 20 20 70 72 69 6e 74 66 28 22 25 32 30 73 20     printf("%20s 
2bf40 25 64 5c 6e 22 2c 20 61 4c 69 6d 69 74 5b 69 5d  %d\n", aLimit[i]
2bf50 2e 7a 4c 69 6d 69 74 4e 61 6d 65 2c 0a 20 20 20  .zLimitName,.   
2bf60 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
2bf70 74 65 33 5f 6c 69 6d 69 74 28 70 2d 3e 64 62 2c  te3_limit(p->db,
2bf80 20 61 4c 69 6d 69 74 5b 69 5d 2e 6c 69 6d 69 74   aLimit[i].limit
2bf90 43 6f 64 65 2c 20 2d 31 29 29 3b 0a 20 20 20 20  Code, -1));.    
2bfa0 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69 66    }.    }else if
2bfb0 28 20 6e 41 72 67 3e 33 20 29 7b 0a 20 20 20 20  ( nArg>3 ){.    
2bfc0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2bfd0 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 6c 69  err, "Usage: .li
2bfe0 6d 69 74 20 4e 41 4d 45 20 3f 4e 45 57 2d 56 41  mit NAME ?NEW-VA
2bff0 4c 55 45 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20  LUE?\n");.      
2c000 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f  rc = 1;.      go
2c010 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
2c020 65 78 69 74 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  exit;.    }else{
2c030 0a 20 20 20 20 20 20 69 6e 74 20 69 4c 69 6d 69  .      int iLimi
2c040 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 6e 32  t = -1;.      n2
2c050 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 41 72   = strlen30(azAr
2c060 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 66 6f 72  g[1]);.      for
2c070 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
2c080 65 28 61 4c 69 6d 69 74 29 3b 20 69 2b 2b 29 7b  e(aLimit); i++){
2c090 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
2c0a0 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 61 4c  ite3_strnicmp(aL
2c0b0 69 6d 69 74 5b 69 5d 2e 7a 4c 69 6d 69 74 4e 61  imit[i].zLimitNa
2c0c0 6d 65 2c 20 61 7a 41 72 67 5b 31 5d 2c 20 6e 32  me, azArg[1], n2
2c0d0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2c0e0 20 20 69 66 28 20 69 4c 69 6d 69 74 3c 30 20 29    if( iLimit<0 )
2c0f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 4c  {.            iL
2c100 69 6d 69 74 20 3d 20 69 3b 0a 20 20 20 20 20 20  imit = i;.      
2c110 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2c120 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2c130 74 66 28 73 74 64 65 72 72 2c 20 22 61 6d 62 69  tf(stderr, "ambi
2c140 67 75 6f 75 73 20 6c 69 6d 69 74 3a 20 5c 22 25  guous limit: \"%
2c150 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d  s\"\n", azArg[1]
2c160 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
2c170 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
2c180 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
2c190 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20  mand_exit;.     
2c1a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2c1b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2c1c0 66 28 20 69 4c 69 6d 69 74 3c 30 20 29 7b 0a 20  f( iLimit<0 ){. 
2c1d0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2c1e0 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e 6b 6e  tf(stderr, "unkn
2c1f0 6f 77 6e 20 6c 69 6d 69 74 3a 20 5c 22 25 73 5c  own limit: \"%s\
2c200 22 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  "\n".           
2c210 20 20 20 20 20 20 20 20 20 20 20 20 20 22 65 6e               "en
2c220 74 65 72 20 5c 22 2e 6c 69 6d 69 74 73 5c 22 20  ter \".limits\" 
2c230 77 69 74 68 20 6e 6f 20 61 72 67 75 6d 65 6e 74  with no argument
2c240 73 20 66 6f 72 20 61 20 6c 69 73 74 2e 5c 6e 22  s for a list.\n"
2c250 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
2c260 20 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67             azArg
2c270 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 72 63  [1]);.        rc
2c280 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 1;.        go
2c290 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
2c2a0 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  exit;.      }.  
2c2b0 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 33 20      if( nArg==3 
2c2c0 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
2c2d0 65 33 5f 6c 69 6d 69 74 28 70 2d 3e 64 62 2c 20  e3_limit(p->db, 
2c2e0 61 4c 69 6d 69 74 5b 69 4c 69 6d 69 74 5d 2e 6c  aLimit[iLimit].l
2c2f0 69 6d 69 74 43 6f 64 65 2c 0a 20 20 20 20 20 20  imitCode,.      
2c300 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c310 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75  (int)integerValu
2c320 65 28 61 7a 41 72 67 5b 32 5d 29 29 3b 0a 20 20  e(azArg[2]));.  
2c330 20 20 20 20 7d 0a 20 20 20 20 20 20 70 72 69 6e      }.      prin
2c340 74 66 28 22 25 32 30 73 20 25 64 5c 6e 22 2c 20  tf("%20s %d\n", 
2c350 61 4c 69 6d 69 74 5b 69 4c 69 6d 69 74 5d 2e 7a  aLimit[iLimit].z
2c360 4c 69 6d 69 74 4e 61 6d 65 2c 0a 20 20 20 20 20  LimitName,.     
2c370 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
2c380 6c 69 6d 69 74 28 70 2d 3e 64 62 2c 20 61 4c 69  limit(p->db, aLi
2c390 6d 69 74 5b 69 4c 69 6d 69 74 5d 2e 6c 69 6d 69  mit[iLimit].limi
2c3a0 74 43 6f 64 65 2c 20 2d 31 29 29 3b 0a 20 20 20  tCode, -1));.   
2c3b0 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
2c3c0 28 20 63 3d 3d 27 6c 27 20 26 26 20 6e 3e 32 20  ( c=='l' && n>2 
2c3d0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2c3e0 5b 30 5d 2c 20 22 6c 69 6e 74 22 2c 20 6e 29 3d  [0], "lint", n)=
2c3f0 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64  =0 ){.    open_d
2c400 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 6c 69 6e  b(p, 0);.    lin
2c410 74 44 6f 74 43 6f 6d 6d 61 6e 64 28 70 2c 20 61  tDotCommand(p, a
2c420 7a 41 72 67 2c 20 6e 41 72 67 29 3b 0a 20 20 7d  zArg, nArg);.  }
2c430 65 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51  else..#ifndef SQ
2c440 4c 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45  LITE_OMIT_LOAD_E
2c450 58 54 45 4e 53 49 4f 4e 0a 20 20 69 66 28 20 63  XTENSION.  if( c
2c460 3d 3d 27 6c 27 20 26 26 20 73 74 72 6e 63 6d 70  =='l' && strncmp
2c470 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 6f 61 64  (azArg[0], "load
2c480 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
2c490 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c  const char *zFil
2c4a0 65 2c 20 2a 7a 50 72 6f 63 3b 0a 20 20 20 20 63  e, *zProc;.    c
2c4b0 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30  har *zErrMsg = 0
2c4c0 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32  ;.    if( nArg<2
2c4d0 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
2c4e0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
2c4f0 61 67 65 3a 20 2e 6c 6f 61 64 20 46 49 4c 45 20  age: .load FILE 
2c500 3f 45 4e 54 52 59 50 4f 49 4e 54 3f 5c 6e 22 29  ?ENTRYPOINT?\n")
2c510 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
2c520 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
2c530 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
2c540 20 20 7d 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20    }.    zFile = 
2c550 61 7a 41 72 67 5b 31 5d 3b 0a 20 20 20 20 7a 50  azArg[1];.    zP
2c560 72 6f 63 20 3d 20 6e 41 72 67 3e 3d 33 20 3f 20  roc = nArg>=3 ? 
2c570 61 7a 41 72 67 5b 32 5d 20 3a 20 30 3b 0a 20 20  azArg[2] : 0;.  
2c580 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b    open_db(p, 0);
2c590 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
2c5a0 33 5f 6c 6f 61 64 5f 65 78 74 65 6e 73 69 6f 6e  3_load_extension
2c5b0 28 70 2d 3e 64 62 2c 20 7a 46 69 6c 65 2c 20 7a  (p->db, zFile, z
2c5c0 50 72 6f 63 2c 20 26 7a 45 72 72 4d 73 67 29 3b  Proc, &zErrMsg);
2c5d0 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2c5e0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2c5f0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
2c600 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e  rr, "Error: %s\n
2c610 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ", zErrMsg);.   
2c620 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2c630 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
2c640 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
2c650 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20  }else.#endif..  
2c660 69 66 28 20 63 3d 3d 27 6c 27 20 26 26 20 73 74  if( c=='l' && st
2c670 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2c680 22 6c 6f 67 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  "log", n)==0 ){.
2c690 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 32 20      if( nArg!=2 
2c6a0 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
2c6b0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
2c6c0 67 65 3a 20 2e 6c 6f 67 20 46 49 4c 45 4e 41 4d  ge: .log FILENAM
2c6d0 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  E\n");.      rc 
2c6e0 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  = 1;.    }else{.
2c6f0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
2c700 20 2a 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67 5b   *zFile = azArg[
2c710 31 5d 3b 0a 20 20 20 20 20 20 6f 75 74 70 75 74  1];.      output
2c720 5f 66 69 6c 65 5f 63 6c 6f 73 65 28 70 2d 3e 70  _file_close(p->p
2c730 4c 6f 67 29 3b 0a 20 20 20 20 20 20 70 2d 3e 70  Log);.      p->p
2c740 4c 6f 67 20 3d 20 6f 75 74 70 75 74 5f 66 69 6c  Log = output_fil
2c750 65 5f 6f 70 65 6e 28 7a 46 69 6c 65 29 3b 0a 20  e_open(zFile);. 
2c760 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
2c770 69 66 28 20 63 3d 3d 27 6d 27 20 26 26 20 73 74  if( c=='m' && st
2c780 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2c790 22 6d 6f 64 65 22 2c 20 6e 29 3d 3d 30 20 29 7b  "mode", n)==0 ){
2c7a0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
2c7b0 2a 7a 4d 6f 64 65 20 3d 20 6e 41 72 67 3e 3d 32  *zMode = nArg>=2
2c7c0 20 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20 22 22   ? azArg[1] : ""
2c7d0 3b 0a 20 20 20 20 69 6e 74 20 6e 32 20 3d 20 28  ;.    int n2 = (
2c7e0 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4d 6f 64 65  int)strlen(zMode
2c7f0 29 3b 0a 20 20 20 20 69 6e 74 20 63 32 20 3d 20  );.    int c2 = 
2c800 7a 4d 6f 64 65 5b 30 5d 3b 0a 20 20 20 20 69 66  zMode[0];.    if
2c810 28 20 63 32 3d 3d 27 6c 27 20 26 26 20 6e 32 3e  ( c2=='l' && n2>
2c820 32 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  2 && strncmp(azA
2c830 72 67 5b 31 5d 2c 22 6c 69 6e 65 73 22 2c 6e 32  rg[1],"lines",n2
2c840 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  )==0 ){.      p-
2c850 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 6e  >mode = MODE_Lin
2c860 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  e;.      sqlite3
2c870 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
2c880 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72  (p->rowSeparator
2c890 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ), p->rowSeparat
2c8a0 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20  or, SEP_Row);.  
2c8b0 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d    }else if( c2==
2c8c0 27 63 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'c' && strncmp(a
2c8d0 7a 41 72 67 5b 31 5d 2c 22 63 6f 6c 75 6d 6e 73  zArg[1],"columns
2c8e0 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ",n2)==0 ){.    
2c8f0 20 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45    p->mode = MODE
2c900 5f 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 73  _Column;.      s
2c910 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2c920 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70  sizeof(p->rowSep
2c930 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53  arator), p->rowS
2c940 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 6f  eparator, SEP_Ro
2c950 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  w);.    }else if
2c960 28 20 63 32 3d 3d 27 6c 27 20 26 26 20 6e 32 3e  ( c2=='l' && n2>
2c970 32 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  2 && strncmp(azA
2c980 72 67 5b 31 5d 2c 22 6c 69 73 74 22 2c 6e 32 29  rg[1],"list",n2)
2c990 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
2c9a0 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74  mode = MODE_List
2c9b0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2c9c0 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
2c9d0 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
2c9e0 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
2c9f0 72 2c 20 53 45 50 5f 43 6f 6c 75 6d 6e 29 3b 0a  r, SEP_Column);.
2ca00 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
2ca10 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
2ca20 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20  >rowSeparator), 
2ca30 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c  p->rowSeparator,
2ca40 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20 7d   SEP_Row);.    }
2ca50 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 68 27  else if( c2=='h'
2ca60 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2ca70 67 5b 31 5d 2c 22 68 74 6d 6c 22 2c 6e 32 29 3d  g[1],"html",n2)=
2ca80 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d  =0 ){.      p->m
2ca90 6f 64 65 20 3d 20 4d 4f 44 45 5f 48 74 6d 6c 3b  ode = MODE_Html;
2caa0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63  .    }else if( c
2cab0 32 3d 3d 27 74 27 20 26 26 20 73 74 72 6e 63 6d  2=='t' && strncm
2cac0 70 28 61 7a 41 72 67 5b 31 5d 2c 22 74 63 6c 22  p(azArg[1],"tcl"
2cad0 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,n2)==0 ){.     
2cae0 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
2caf0 54 63 6c 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  Tcl;.      sqlit
2cb00 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
2cb10 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74  of(p->colSeparat
2cb20 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72  or), p->colSepar
2cb30 61 74 6f 72 2c 20 53 45 50 5f 53 70 61 63 65 29  ator, SEP_Space)
2cb40 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
2cb50 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
2cb60 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 29  p->rowSeparator)
2cb70 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
2cb80 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20 20 20  r, SEP_Row);.   
2cb90 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27   }else if( c2=='
2cba0 63 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  c' && strncmp(az
2cbb0 41 72 67 5b 31 5d 2c 22 63 73 76 22 2c 6e 32 29  Arg[1],"csv",n2)
2cbc0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
2cbd0 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43 73 76 3b  mode = MODE_Csv;
2cbe0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
2cbf0 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70  nprintf(sizeof(p
2cc00 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c  ->colSeparator),
2cc10 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
2cc20 2c 20 53 45 50 5f 43 6f 6d 6d 61 29 3b 0a 20 20  , SEP_Comma);.  
2cc30 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
2cc40 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72  intf(sizeof(p->r
2cc50 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d  owSeparator), p-
2cc60 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53  >rowSeparator, S
2cc70 45 50 5f 43 72 4c 66 29 3b 0a 20 20 20 20 7d 65  EP_CrLf);.    }e
2cc80 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 74 27 20  lse if( c2=='t' 
2cc90 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
2cca0 5b 31 5d 2c 22 74 61 62 73 22 2c 6e 32 29 3d 3d  [1],"tabs",n2)==
2ccb0 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  0 ){.      p->mo
2ccc0 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a  de = MODE_List;.
2ccd0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
2cce0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
2ccf0 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20  >colSeparator), 
2cd00 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c  p->colSeparator,
2cd10 20 53 45 50 5f 54 61 62 29 3b 0a 20 20 20 20 7d   SEP_Tab);.    }
2cd20 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 69 27  else if( c2=='i'
2cd30 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2cd40 67 5b 31 5d 2c 22 69 6e 73 65 72 74 22 2c 6e 32  g[1],"insert",n2
2cd50 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  )==0 ){.      p-
2cd60 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 49 6e 73  >mode = MODE_Ins
2cd70 65 72 74 3b 0a 20 20 20 20 20 20 73 65 74 5f 74  ert;.      set_t
2cd80 61 62 6c 65 5f 6e 61 6d 65 28 70 2c 20 6e 41 72  able_name(p, nAr
2cd90 67 3e 3d 33 20 3f 20 61 7a 41 72 67 5b 32 5d 20  g>=3 ? azArg[2] 
2cda0 3a 20 22 74 61 62 6c 65 22 29 3b 0a 20 20 20 20  : "table");.    
2cdb0 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 71  }else if( c2=='q
2cdc0 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
2cdd0 72 67 5b 31 5d 2c 22 71 75 6f 74 65 22 2c 6e 32  rg[1],"quote",n2
2cde0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d  )==0 ){.      p-
2cdf0 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 51 75 6f  >mode = MODE_Quo
2ce00 74 65 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  te;.    }else if
2ce10 28 20 63 32 3d 3d 27 61 27 20 26 26 20 73 74 72  ( c2=='a' && str
2ce20 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 61  ncmp(azArg[1],"a
2ce30 73 63 69 69 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a  scii",n2)==0 ){.
2ce40 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20        p->mode = 
2ce50 4d 4f 44 45 5f 41 73 63 69 69 3b 0a 20 20 20 20  MODE_Ascii;.    
2ce60 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
2ce70 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c  tf(sizeof(p->col
2ce80 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63  Separator), p->c
2ce90 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50  olSeparator, SEP
2cea0 5f 55 6e 69 74 29 3b 0a 20 20 20 20 20 20 73 71  _Unit);.      sq
2ceb0 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
2cec0 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70 61  izeof(p->rowSepa
2ced0 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53 65  rator), p->rowSe
2cee0 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 52 65 63  parator, SEP_Rec
2cef0 6f 72 64 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  ord);.    }else 
2cf00 69 66 28 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20  if( nArg==1 ){. 
2cf10 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2cf20 70 2d 3e 6f 75 74 2c 20 22 63 75 72 72 65 6e 74  p->out, "current
2cf30 20 6f 75 74 70 75 74 20 6d 6f 64 65 3a 20 25 73   output mode: %s
2cf40 5c 6e 22 2c 20 6d 6f 64 65 44 65 73 63 72 5b 70  \n", modeDescr[p
2cf50 2d 3e 6d 6f 64 65 5d 29 3b 0a 20 20 20 20 7d 65  ->mode]);.    }e
2cf60 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
2cf70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
2cf80 72 72 6f 72 3a 20 6d 6f 64 65 20 73 68 6f 75 6c  rror: mode shoul
2cf90 64 20 62 65 20 6f 6e 65 20 6f 66 3a 20 22 0a 20  d be one of: ". 
2cfa0 20 20 20 20 20 20 20 20 22 61 73 63 69 69 20 63          "ascii c
2cfb0 6f 6c 75 6d 6e 20 63 73 76 20 68 74 6d 6c 20 69  olumn csv html i
2cfc0 6e 73 65 72 74 20 6c 69 6e 65 20 6c 69 73 74 20  nsert line list 
2cfd0 71 75 6f 74 65 20 74 61 62 73 20 74 63 6c 5c 6e  quote tabs tcl\n
2cfe0 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
2cff0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 63  ;.    }.    p->c
2d000 4d 6f 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a  Mode = p->mode;.
2d010 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
2d020 3d 3d 27 6e 27 20 26 26 20 73 74 72 6e 63 6d 70  =='n' && strncmp
2d030 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6e 75 6c 6c  (azArg[0], "null
2d040 76 61 6c 75 65 22 2c 20 6e 29 3d 3d 30 20 29 7b  value", n)==0 ){
2d050 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32  .    if( nArg==2
2d060 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2d070 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
2d080 66 28 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 2c  f(p->nullValue),
2d090 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 2c 0a 20   p->nullValue,. 
2d0a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d0b0 20 20 20 20 20 20 22 25 2e 2a 73 22 2c 20 28 69        "%.*s", (i
2d0c0 6e 74 29 41 72 72 61 79 53 69 7a 65 28 70 2d 3e  nt)ArraySize(p->
2d0d0 6e 75 6c 6c 56 61 6c 75 65 29 2d 31 2c 20 61 7a  nullValue)-1, az
2d0e0 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c  Arg[1]);.    }el
2d0f0 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
2d100 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
2d110 61 67 65 3a 20 2e 6e 75 6c 6c 76 61 6c 75 65 20  age: .nullvalue 
2d120 53 54 52 49 4e 47 5c 6e 22 29 3b 0a 20 20 20 20  STRING\n");.    
2d130 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
2d140 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
2d150 3d 3d 27 6f 27 20 26 26 20 73 74 72 6e 63 6d 70  =='o' && strncmp
2d160 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f 70 65 6e  (azArg[0], "open
2d170 22 2c 20 6e 29 3d 3d 30 20 26 26 20 6e 3e 3d 32  ", n)==0 && n>=2
2d180 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 4e   ){.    char *zN
2d190 65 77 46 69 6c 65 6e 61 6d 65 3b 20 20 2f 2a 20  ewFilename;  /* 
2d1a0 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
2d1b0 62 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65  base file to ope
2d1c0 6e 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 4e 61  n */.    int iNa
2d1d0 6d 65 20 3d 20 31 3b 20 20 20 20 20 20 20 2f 2a  me = 1;       /*
2d1e0 20 49 6e 64 65 78 20 69 6e 20 61 7a 41 72 67 5b   Index in azArg[
2d1f0 5d 20 6f 66 20 74 68 65 20 66 69 6c 65 6e 61 6d  ] of the filenam
2d200 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 65 77  e */.    int new
2d210 46 6c 61 67 20 3d 20 30 3b 20 20 20 20 20 2f 2a  Flag = 0;     /*
2d220 20 54 72 75 65 20 74 6f 20 64 65 6c 65 74 65 20   True to delete 
2d230 66 69 6c 65 20 62 65 66 6f 72 65 20 6f 70 65 6e  file before open
2d240 69 6e 67 20 2a 2f 0a 20 20 20 20 2f 2a 20 43 6c  ing */.    /* Cl
2d250 6f 73 65 20 74 68 65 20 65 78 69 73 74 69 6e 67  ose the existing
2d260 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 20   database */.   
2d270 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61   session_close_a
2d280 6c 6c 28 70 29 3b 0a 20 20 20 20 73 71 6c 69 74  ll(p);.    sqlit
2d290 65 33 5f 63 6c 6f 73 65 28 70 2d 3e 64 62 29 3b  e3_close(p->db);
2d2a0 0a 20 20 20 20 70 2d 3e 64 62 20 3d 20 30 3b 0a  .    p->db = 0;.
2d2b0 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61      p->zDbFilena
2d2c0 6d 65 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69  me = 0;.    sqli
2d2d0 74 65 33 5f 66 72 65 65 28 70 2d 3e 7a 46 72 65  te3_free(p->zFre
2d2e0 65 4f 6e 43 6c 6f 73 65 29 3b 0a 20 20 20 20 70  eOnClose);.    p
2d2f0 2d 3e 7a 46 72 65 65 4f 6e 43 6c 6f 73 65 20 3d  ->zFreeOnClose =
2d300 20 30 3b 0a 20 20 20 20 2f 2a 20 43 68 65 63 6b   0;.    /* Check
2d310 20 66 6f 72 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e   for command-lin
2d320 65 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  e arguments */. 
2d330 20 20 20 66 6f 72 28 69 4e 61 6d 65 3d 31 3b 20     for(iName=1; 
2d340 69 4e 61 6d 65 3c 6e 41 72 67 20 26 26 20 61 7a  iName<nArg && az
2d350 41 72 67 5b 69 4e 61 6d 65 5d 5b 30 5d 3d 3d 27  Arg[iName][0]=='
2d360 2d 27 3b 20 69 4e 61 6d 65 2b 2b 29 7b 0a 20 20  -'; iName++){.  
2d370 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
2d380 7a 20 3d 20 61 7a 41 72 67 5b 69 4e 61 6d 65 5d  z = azArg[iName]
2d390 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 70 74 69  ;.      if( opti
2d3a0 6f 6e 4d 61 74 63 68 28 7a 2c 22 6e 65 77 22 29  onMatch(z,"new")
2d3b0 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 65 77 46   ){.        newF
2d3c0 6c 61 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  lag = 1;.      }
2d3d0 65 6c 73 65 20 69 66 28 20 7a 5b 30 5d 3d 3d 27  else if( z[0]=='
2d3e0 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  -' ){.        ut
2d3f0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2d400 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f  , "unknown optio
2d410 6e 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20 20  n: %s\n", z);.  
2d420 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
2d430 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
2d440 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
2d450 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
2d460 2f 2a 20 49 66 20 61 20 66 69 6c 65 6e 61 6d 65  /* If a filename
2d470 20 69 73 20 73 70 65 63 69 66 69 65 64 2c 20 74   is specified, t
2d480 72 79 20 74 6f 20 6f 70 65 6e 20 69 74 20 66 69  ry to open it fi
2d490 72 73 74 20 2a 2f 0a 20 20 20 20 7a 4e 65 77 46  rst */.    zNewF
2d4a0 69 6c 65 6e 61 6d 65 20 3d 20 6e 41 72 67 3e 69  ilename = nArg>i
2d4b0 4e 61 6d 65 20 3f 20 73 71 6c 69 74 65 33 5f 6d  Name ? sqlite3_m
2d4c0 70 72 69 6e 74 66 28 22 25 73 22 2c 20 61 7a 41  printf("%s", azA
2d4d0 72 67 5b 69 4e 61 6d 65 5d 29 20 3a 20 30 3b 0a  rg[iName]) : 0;.
2d4e0 20 20 20 20 69 66 28 20 7a 4e 65 77 46 69 6c 65      if( zNewFile
2d4f0 6e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20 69 66  name ){.      if
2d500 28 20 6e 65 77 46 6c 61 67 20 29 20 73 68 65 6c  ( newFlag ) shel
2d510 6c 44 65 6c 65 74 65 46 69 6c 65 28 7a 4e 65 77  lDeleteFile(zNew
2d520 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Filename);.     
2d530 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20   p->zDbFilename 
2d540 3d 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 3b 0a  = zNewFilename;.
2d550 20 20 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c        open_db(p,
2d560 20 31 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   1);.      if( p
2d570 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ->db==0 ){.     
2d580 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
2d590 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63  tderr, "Error: c
2d5a0 61 6e 6e 6f 74 20 6f 70 65 6e 20 27 25 73 27 5c  annot open '%s'\
2d5b0 6e 22 2c 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65  n", zNewFilename
2d5c0 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2d5d0 65 33 5f 66 72 65 65 28 7a 4e 65 77 46 69 6c 65  e3_free(zNewFile
2d5e0 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c  name);.      }el
2d5f0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 2d 3e 7a  se{.        p->z
2d600 46 72 65 65 4f 6e 43 6c 6f 73 65 20 3d 20 7a 4e  FreeOnClose = zN
2d610 65 77 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20  ewFilename;.    
2d620 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
2d630 28 20 70 2d 3e 64 62 3d 3d 30 20 29 7b 0a 20 20  ( p->db==0 ){.  
2d640 20 20 20 20 2f 2a 20 41 73 20 61 20 66 61 6c 6c      /* As a fall
2d650 2d 62 61 63 6b 20 6f 70 65 6e 20 61 20 54 45 4d  -back open a TEM
2d660 50 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20  P database */.  
2d670 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61      p->zDbFilena
2d680 6d 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 6f 70  me = 0;.      op
2d690 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
2d6a0 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66   }.  }else..  if
2d6b0 28 20 63 3d 3d 27 6f 27 0a 20 20 20 26 26 20 28  ( c=='o'.   && (
2d6c0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2d6d0 2c 20 22 6f 75 74 70 75 74 22 2c 20 6e 29 3d 3d  , "output", n)==
2d6e0 30 20 7c 7c 20 73 74 72 6e 63 6d 70 28 61 7a 41  0 || strncmp(azA
2d6f0 72 67 5b 30 5d 2c 20 22 6f 6e 63 65 22 2c 20 6e  rg[0], "once", n
2d700 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 63  )==0).  ){.    c
2d710 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69 6c 65  onst char *zFile
2d720 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41   = nArg>=2 ? azA
2d730 72 67 5b 31 5d 20 3a 20 22 73 74 64 6f 75 74 22  rg[1] : "stdout"
2d740 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 32  ;.    if( nArg>2
2d750 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
2d760 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
2d770 73 61 67 65 3a 20 2e 25 73 20 46 49 4c 45 5c 6e  sage: .%s FILE\n
2d780 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20  ", azArg[0]);.  
2d790 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2d7a0 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
2d7b0 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  and_exit;.    }.
2d7c0 20 20 20 20 69 66 28 20 6e 3e 31 20 26 26 20 73      if( n>1 && s
2d7d0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2d7e0 20 22 6f 6e 63 65 22 2c 20 6e 29 3d 3d 30 20 29   "once", n)==0 )
2d7f0 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72 67  {.      if( nArg
2d800 3c 32 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61  <2 ){.        ra
2d810 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2d820 20 22 55 73 61 67 65 3a 20 2e 6f 6e 63 65 20 46   "Usage: .once F
2d830 49 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  ILE\n");.       
2d840 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
2d850 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
2d860 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d  nd_exit;.      }
2d870 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 43 6f 75  .      p->outCou
2d880 6e 74 20 3d 20 32 3b 0a 20 20 20 20 7d 65 6c 73  nt = 2;.    }els
2d890 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6f 75 74 43  e{.      p->outC
2d8a0 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  ount = 0;.    }.
2d8b0 20 20 20 20 6f 75 74 70 75 74 5f 72 65 73 65 74      output_reset
2d8c0 28 70 29 3b 0a 20 20 20 20 69 66 28 20 7a 46 69  (p);.    if( zFi
2d8d0 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69  le[0]=='|' ){.#i
2d8e0 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  fdef SQLITE_OMIT
2d8f0 5f 50 4f 50 45 4e 0a 20 20 20 20 20 20 72 61 77  _POPEN.      raw
2d900 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2d910 22 45 72 72 6f 72 3a 20 70 69 70 65 73 20 61 72  "Error: pipes ar
2d920 65 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20  e not supported 
2d930 69 6e 20 74 68 69 73 20 4f 53 5c 6e 22 29 3b 0a  in this OS\n");.
2d940 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
2d950 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64      p->out = std
2d960 6f 75 74 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  out;.#else.     
2d970 20 70 2d 3e 6f 75 74 20 3d 20 70 6f 70 65 6e 28   p->out = popen(
2d980 7a 46 69 6c 65 20 2b 20 31 2c 20 22 77 22 29 3b  zFile + 1, "w");
2d990 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f 75  .      if( p->ou
2d9a0 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
2d9b0 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
2d9c0 72 72 2c 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f  rr,"Error: canno
2d9d0 74 20 6f 70 65 6e 20 70 69 70 65 20 5c 22 25 73  t open pipe \"%s
2d9e0 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 20 2b 20 31  \"\n", zFile + 1
2d9f0 29 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 75  );.        p->ou
2da00 74 20 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20 20  t = stdout;.    
2da10 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2da20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2da30 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2da40 66 28 73 69 7a 65 6f 66 28 70 2d 3e 6f 75 74 66  f(sizeof(p->outf
2da50 69 6c 65 29 2c 20 70 2d 3e 6f 75 74 66 69 6c 65  ile), p->outfile
2da60 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65 29 3b 0a  , "%s", zFile);.
2da70 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
2da80 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2da90 70 2d 3e 6f 75 74 20 3d 20 6f 75 74 70 75 74 5f  p->out = output_
2daa0 66 69 6c 65 5f 6f 70 65 6e 28 7a 46 69 6c 65 29  file_open(zFile)
2dab0 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6f  ;.      if( p->o
2dac0 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ut==0 ){.       
2dad0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 46 69 6c   if( strcmp(zFil
2dae0 65 2c 22 6f 66 66 22 29 21 3d 30 20 29 7b 0a 20  e,"off")!=0 ){. 
2daf0 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
2db00 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72  intf(stderr,"Err
2db10 6f 72 3a 20 63 61 6e 6e 6f 74 20 77 72 69 74 65  or: cannot write
2db20 20 74 6f 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a   to \"%s\"\n", z
2db30 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  File);.        }
2db40 0a 20 20 20 20 20 20 20 20 70 2d 3e 6f 75 74 20  .        p->out 
2db50 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20 20 20 20  = stdout;.      
2db60 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
2db70 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
2db80 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
2db90 66 28 73 69 7a 65 6f 66 28 70 2d 3e 6f 75 74 66  f(sizeof(p->outf
2dba0 69 6c 65 29 2c 20 70 2d 3e 6f 75 74 66 69 6c 65  ile), p->outfile
2dbb0 2c 20 22 25 73 22 2c 20 7a 46 69 6c 65 29 3b 0a  , "%s", zFile);.
2dbc0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2dbd0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
2dbe0 27 70 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73  'p' && n>=3 && s
2dbf0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2dc00 20 22 70 72 69 6e 74 22 2c 20 6e 29 3d 3d 30 20   "print", n)==0 
2dc10 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  ){.    int i;.  
2dc20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72    for(i=1; i<nAr
2dc30 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  g; i++){.      i
2dc40 66 28 20 69 3e 31 20 29 20 72 61 77 5f 70 72 69  f( i>1 ) raw_pri
2dc50 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 22 29  ntf(p->out, " ")
2dc60 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  ;.      utf8_pri
2dc70 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
2dc80 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20  , azArg[i]);.   
2dc90 20 7d 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74   }.    raw_print
2dca0 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b  f(p->out, "\n");
2dcb0 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
2dcc0 63 3d 3d 27 70 27 20 26 26 20 73 74 72 6e 63 6d  c=='p' && strncm
2dcd0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 70 72 6f  p(azArg[0], "pro
2dce0 6d 70 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  mpt", n)==0 ){. 
2dcf0 20 20 20 69 66 28 20 6e 41 72 67 20 3e 3d 20 32     if( nArg >= 2
2dd00 29 20 7b 0a 20 20 20 20 20 20 73 74 72 6e 63 70  ) {.      strncp
2dd10 79 28 6d 61 69 6e 50 72 6f 6d 70 74 2c 61 7a 41  y(mainPrompt,azA
2dd20 72 67 5b 31 5d 2c 28 69 6e 74 29 41 72 72 61 79  rg[1],(int)Array
2dd30 53 69 7a 65 28 6d 61 69 6e 50 72 6f 6d 70 74 29  Size(mainPrompt)
2dd40 2d 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  -1);.    }.    i
2dd50 66 28 20 6e 41 72 67 20 3e 3d 20 33 29 20 7b 0a  f( nArg >= 3) {.
2dd60 20 20 20 20 20 20 73 74 72 6e 63 70 79 28 63 6f        strncpy(co
2dd70 6e 74 69 6e 75 65 50 72 6f 6d 70 74 2c 61 7a 41  ntinuePrompt,azA
2dd80 72 67 5b 32 5d 2c 28 69 6e 74 29 41 72 72 61 79  rg[2],(int)Array
2dd90 53 69 7a 65 28 63 6f 6e 74 69 6e 75 65 50 72 6f  Size(continuePro
2dda0 6d 70 74 29 2d 31 29 3b 0a 20 20 20 20 7d 0a 20  mpt)-1);.    }. 
2ddb0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
2ddc0 3d 27 71 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='q' && strncmp(
2ddd0 61 7a 41 72 67 5b 30 5d 2c 20 22 71 75 69 74 22  azArg[0], "quit"
2dde0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  , n)==0 ){.    r
2ddf0 63 20 3d 20 32 3b 0a 20 20 7d 65 6c 73 65 0a 0a  c = 2;.  }else..
2de00 20 20 69 66 28 20 63 3d 3d 27 72 27 20 26 26 20    if( c=='r' && 
2de10 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28  n>=3 && strncmp(
2de20 61 7a 41 72 67 5b 30 5d 2c 20 22 72 65 61 64 22  azArg[0], "read"
2de30 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 46  , n)==0 ){.    F
2de40 49 4c 45 20 2a 61 6c 74 3b 0a 20 20 20 20 69 66  ILE *alt;.    if
2de50 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20 20  ( nArg!=2 ){.   
2de60 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2de70 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 72  derr, "Usage: .r
2de80 65 61 64 20 46 49 4c 45 5c 6e 22 29 3b 0a 20 20  ead FILE\n");.  
2de90 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2dea0 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
2deb0 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  and_exit;.    }.
2dec0 20 20 20 20 61 6c 74 20 3d 20 66 6f 70 65 6e 28      alt = fopen(
2ded0 61 7a 41 72 67 5b 31 5d 2c 20 22 72 62 22 29 3b  azArg[1], "rb");
2dee0 0a 20 20 20 20 69 66 28 20 61 6c 74 3d 3d 30 20  .    if( alt==0 
2def0 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
2df00 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72  intf(stderr,"Err
2df10 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20  or: cannot open 
2df20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a 41 72 67  \"%s\"\n", azArg
2df30 5b 31 5d 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  [1]);.      rc =
2df40 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   1;.    }else{. 
2df50 20 20 20 20 20 72 63 20 3d 20 70 72 6f 63 65 73       rc = proces
2df60 73 5f 69 6e 70 75 74 28 70 2c 20 61 6c 74 29 3b  s_input(p, alt);
2df70 0a 20 20 20 20 20 20 66 63 6c 6f 73 65 28 61 6c  .      fclose(al
2df80 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  t);.    }.  }els
2df90 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 72 27 20  e..  if( c=='r' 
2dfa0 26 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63  && n>=3 && strnc
2dfb0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 72 65  mp(azArg[0], "re
2dfc0 73 74 6f 72 65 22 2c 20 6e 29 3d 3d 30 20 29 7b  store", n)==0 ){
2dfd0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
2dfe0 2a 7a 53 72 63 46 69 6c 65 3b 0a 20 20 20 20 63  *zSrcFile;.    c
2dff0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a  onst char *zDb;.
2e000 20 20 20 20 73 71 6c 69 74 65 33 20 2a 70 53 72      sqlite3 *pSr
2e010 63 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  c;.    sqlite3_b
2e020 61 63 6b 75 70 20 2a 70 42 61 63 6b 75 70 3b 0a  ackup *pBackup;.
2e030 20 20 20 20 69 6e 74 20 6e 54 69 6d 65 6f 75 74      int nTimeout
2e040 20 3d 20 30 3b 0a 0a 20 20 20 20 69 66 28 20 6e   = 0;..    if( n
2e050 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg==2 ){.      
2e060 7a 53 72 63 46 69 6c 65 20 3d 20 61 7a 41 72 67  zSrcFile = azArg
2e070 5b 31 5d 3b 0a 20 20 20 20 20 20 7a 44 62 20 3d  [1];.      zDb =
2e080 20 22 6d 61 69 6e 22 3b 0a 20 20 20 20 7d 65 6c   "main";.    }el
2e090 73 65 20 69 66 28 20 6e 41 72 67 3d 3d 33 20 29  se if( nArg==3 )
2e0a0 7b 0a 20 20 20 20 20 20 7a 53 72 63 46 69 6c 65  {.      zSrcFile
2e0b0 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 20 20 20   = azArg[2];.   
2e0c0 20 20 20 7a 44 62 20 3d 20 61 7a 41 72 67 5b 31     zDb = azArg[1
2e0d0 5d 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  ];.    }else{.  
2e0e0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
2e0f0 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
2e100 72 65 73 74 6f 72 65 20 3f 44 42 3f 20 46 49 4c  restore ?DB? FIL
2e110 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  E\n");.      rc 
2e120 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20  = 1;.      goto 
2e130 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
2e140 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 63 20  t;.    }.    rc 
2e150 3d 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a  = sqlite3_open(z
2e160 53 72 63 46 69 6c 65 2c 20 26 70 53 72 63 29 3b  SrcFile, &pSrc);
2e170 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51 4c  .    if( rc!=SQL
2e180 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2e190 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
2e1a0 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e  rr, "Error: cann
2e1b0 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e  ot open \"%s\"\n
2e1c0 22 2c 20 7a 53 72 63 46 69 6c 65 29 3b 0a 20 20  ", zSrcFile);.  
2e1d0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73      sqlite3_clos
2e1e0 65 28 70 53 72 63 29 3b 0a 20 20 20 20 20 20 72  e(pSrc);.      r
2e1f0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
2e200 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
2e210 3b 0a 20 20 20 20 70 42 61 63 6b 75 70 20 3d 20  ;.    pBackup = 
2e220 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 69  sqlite3_backup_i
2e230 6e 69 74 28 70 2d 3e 64 62 2c 20 7a 44 62 2c 20  nit(p->db, zDb, 
2e240 70 53 72 63 2c 20 22 6d 61 69 6e 22 29 3b 0a 20  pSrc, "main");. 
2e250 20 20 20 69 66 28 20 70 42 61 63 6b 75 70 3d 3d     if( pBackup==
2e260 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  0 ){.      utf8_
2e270 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2e280 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 73 71  Error: %s\n", sq
2e290 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e  lite3_errmsg(p->
2e2a0 64 62 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  db));.      sqli
2e2b0 74 65 33 5f 63 6c 6f 73 65 28 70 53 72 63 29 3b  te3_close(pSrc);
2e2c0 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
2e2d0 0a 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65  .    }.    while
2e2e0 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65 33 5f  ( (rc = sqlite3_
2e2f0 62 61 63 6b 75 70 5f 73 74 65 70 28 70 42 61 63  backup_step(pBac
2e300 6b 75 70 2c 31 30 30 29 29 3d 3d 53 51 4c 49 54  kup,100))==SQLIT
2e310 45 5f 4f 4b 0a 20 20 20 20 20 20 20 20 20 20 7c  E_OK.          |
2e320 7c 20 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53  | rc==SQLITE_BUS
2e330 59 20 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  Y  ){.      if( 
2e340 72 63 3d 3d 53 51 4c 49 54 45 5f 42 55 53 59 20  rc==SQLITE_BUSY 
2e350 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  ){.        if( n
2e360 54 69 6d 65 6f 75 74 2b 2b 20 3e 3d 20 33 20 29  Timeout++ >= 3 )
2e370 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2e380 73 71 6c 69 74 65 33 5f 73 6c 65 65 70 28 31 30  sqlite3_sleep(10
2e390 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
2e3a0 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62 61  }.    sqlite3_ba
2e3b0 63 6b 75 70 5f 66 69 6e 69 73 68 28 70 42 61 63  ckup_finish(pBac
2e3c0 6b 75 70 29 3b 0a 20 20 20 20 69 66 28 20 72 63  kup);.    if( rc
2e3d0 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b  ==SQLITE_DONE ){
2e3e0 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  .      rc = 0;. 
2e3f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 3d     }else if( rc=
2e400 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 7c 7c 20  =SQLITE_BUSY || 
2e410 72 63 3d 3d 53 51 4c 49 54 45 5f 4c 4f 43 4b 45  rc==SQLITE_LOCKE
2e420 44 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  D ){.      raw_p
2e430 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
2e440 72 72 6f 72 3a 20 73 6f 75 72 63 65 20 64 61 74  rror: source dat
2e450 61 62 61 73 65 20 69 73 20 62 75 73 79 5c 6e 22  abase is busy\n"
2e460 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
2e470 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2e480 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
2e490 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73  derr, "Error: %s
2e4a0 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
2e4b0 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
2e4c0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
2e4d0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c 6f  .    sqlite3_clo
2e4e0 73 65 28 70 53 72 63 29 3b 0a 20 20 7d 65 6c 73  se(pSrc);.  }els
2e4f0 65 0a 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27  e...  if( c=='s'
2e500 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
2e510 67 5b 30 5d 2c 20 22 73 63 61 6e 73 74 61 74 73  g[0], "scanstats
2e520 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
2e530 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20  if( nArg==2 ){. 
2e540 20 20 20 20 20 70 2d 3e 73 63 61 6e 73 74 61 74       p->scanstat
2e550 73 4f 6e 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c  sOn = booleanVal
2e560 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 23 69  ue(azArg[1]);.#i
2e570 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  fndef SQLITE_ENA
2e580 42 4c 45 5f 53 54 4d 54 5f 53 43 41 4e 53 54 41  BLE_STMT_SCANSTA
2e590 54 55 53 0a 20 20 20 20 20 20 72 61 77 5f 70 72  TUS.      raw_pr
2e5a0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 57 61  intf(stderr, "Wa
2e5b0 72 6e 69 6e 67 3a 20 2e 73 63 61 6e 73 74 61 74  rning: .scanstat
2e5c0 73 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65 20  s not available 
2e5d0 69 6e 20 74 68 69 73 20 62 75 69 6c 64 2e 5c 6e  in this build.\n
2e5e0 22 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d  ");.#endif.    }
2e5f0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
2e600 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2e610 55 73 61 67 65 3a 20 2e 73 63 61 6e 73 74 61 74  Usage: .scanstat
2e620 73 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20  s on|off\n");.  
2e630 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
2e640 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  }.  }else..  if(
2e650 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72 6e 63   c=='s' && strnc
2e660 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73 63  mp(azArg[0], "sc
2e670 68 65 6d 61 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  hema", n)==0 ){.
2e680 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73 53      ShellText sS
2e690 65 6c 65 63 74 3b 0a 20 20 20 20 53 68 65 6c 6c  elect;.    Shell
2e6a0 53 74 61 74 65 20 64 61 74 61 3b 0a 20 20 20 20  State data;.    
2e6b0 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
2e6c0 30 3b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61  0;.    const cha
2e6d0 72 20 2a 7a 44 69 76 20 3d 20 22 28 22 3b 0a 20  r *zDiv = "(";. 
2e6e0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
2e6f0 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 69 6e  Name = 0;.    in
2e700 74 20 69 53 63 68 65 6d 61 20 3d 20 30 3b 0a 20  t iSchema = 0;. 
2e710 20 20 20 69 6e 74 20 62 44 65 62 75 67 20 3d 20     int bDebug = 
2e720 30 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 0a  0;.    int ii;..
2e730 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
2e740 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64  );.    memcpy(&d
2e750 61 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64  ata, p, sizeof(d
2e760 61 74 61 29 29 3b 0a 20 20 20 20 64 61 74 61 2e  ata));.    data.
2e770 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a  showHeader = 0;.
2e780 20 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d      data.cMode =
2e790 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44   data.mode = MOD
2e7a0 45 5f 53 65 6d 69 3b 0a 20 20 20 20 69 6e 69 74  E_Semi;.    init
2e7b0 54 65 78 74 28 26 73 53 65 6c 65 63 74 29 3b 0a  Text(&sSelect);.
2e7c0 20 20 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69      for(ii=1; ii
2e7d0 3c 6e 41 72 67 3b 20 69 69 2b 2b 29 7b 0a 20 20  <nArg; ii++){.  
2e7e0 20 20 20 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61      if( optionMa
2e7f0 74 63 68 28 61 7a 41 72 67 5b 69 69 5d 2c 22 69  tch(azArg[ii],"i
2e800 6e 64 65 6e 74 22 29 20 29 7b 0a 20 20 20 20 20  ndent") ){.     
2e810 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20     data.cMode = 
2e820 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45  data.mode = MODE
2e830 5f 50 72 65 74 74 79 3b 0a 20 20 20 20 20 20 7d  _Pretty;.      }
2e840 65 6c 73 65 20 69 66 28 20 6f 70 74 69 6f 6e 4d  else if( optionM
2e850 61 74 63 68 28 61 7a 41 72 67 5b 69 69 5d 2c 22  atch(azArg[ii],"
2e860 64 65 62 75 67 22 29 20 29 7b 0a 20 20 20 20 20  debug") ){.     
2e870 20 20 20 62 44 65 62 75 67 20 3d 20 31 3b 0a 20     bDebug = 1;. 
2e880 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a       }else if( z
2e890 4e 61 6d 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Name==0 ){.     
2e8a0 20 20 20 7a 4e 61 6d 65 20 3d 20 61 7a 41 72 67     zName = azArg
2e8b0 5b 69 69 5d 3b 0a 20 20 20 20 20 20 7d 65 6c 73  [ii];.      }els
2e8c0 65 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  e{.        raw_p
2e8d0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
2e8e0 73 61 67 65 3a 20 2e 73 63 68 65 6d 61 20 3f 2d  sage: .schema ?-
2e8f0 2d 69 6e 64 65 6e 74 3f 20 3f 4c 49 4b 45 2d 50  -indent? ?LIKE-P
2e900 41 54 54 45 52 4e 3f 5c 6e 22 29 3b 0a 20 20 20  ATTERN?\n");.   
2e910 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
2e920 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
2e930 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
2e940 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
2e950 66 28 20 7a 4e 61 6d 65 21 3d 30 20 29 7b 0a 20  f( zName!=0 ){. 
2e960 20 20 20 20 20 69 6e 74 20 69 73 4d 61 73 74 65       int isMaste
2e970 72 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 72 6c  r = sqlite3_strl
2e980 69 6b 65 28 7a 4e 61 6d 65 2c 20 22 73 71 6c 69  ike(zName, "sqli
2e990 74 65 5f 6d 61 73 74 65 72 22 2c 20 30 29 3d 3d  te_master", 0)==
2e9a0 30 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 4d  0;.      if( isM
2e9b0 61 73 74 65 72 20 7c 7c 20 73 71 6c 69 74 65 33  aster || sqlite3
2e9c0 5f 73 74 72 6c 69 6b 65 28 7a 4e 61 6d 65 2c 22  _strlike(zName,"
2e9d0 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
2e9e0 65 72 22 2c 30 29 3d 3d 30 20 29 7b 0a 20 20 20  er",0)==0 ){.   
2e9f0 20 20 20 20 20 63 68 61 72 20 2a 6e 65 77 5f 61       char *new_a
2ea00 72 67 76 5b 32 5d 2c 20 2a 6e 65 77 5f 63 6f 6c  rgv[2], *new_col
2ea10 76 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20 6e 65  v[2];.        ne
2ea20 77 5f 61 72 67 76 5b 30 5d 20 3d 20 73 71 6c 69  w_argv[0] = sqli
2ea30 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20  te3_mprintf(.   
2ea40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ea50 20 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45     "CREATE TABLE
2ea60 20 25 73 20 28 5c 6e 22 0a 20 20 20 20 20 20 20   %s (\n".       
2ea70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2ea80 20 20 74 79 70 65 20 74 65 78 74 2c 5c 6e 22 0a    type text,\n".
2ea90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eaa0 20 20 20 20 20 20 22 20 20 6e 61 6d 65 20 74 65        "  name te
2eab0 78 74 2c 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  xt,\n".         
2eac0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20               "  
2ead0 74 62 6c 5f 6e 61 6d 65 20 74 65 78 74 2c 5c 6e  tbl_name text,\n
2eae0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
2eaf0 20 20 20 20 20 20 20 20 22 20 20 72 6f 6f 74 70          "  rootp
2eb00 61 67 65 20 69 6e 74 65 67 65 72 2c 5c 6e 22 0a  age integer,\n".
2eb10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb20 20 20 20 20 20 20 22 20 20 73 71 6c 20 74 65 78        "  sql tex
2eb30 74 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20  t\n".           
2eb40 20 20 20 20 20 20 20 20 20 20 20 22 29 22 2c 20             ")", 
2eb50 69 73 4d 61 73 74 65 72 20 3f 20 22 73 71 6c 69  isMaster ? "sqli
2eb60 74 65 5f 6d 61 73 74 65 72 22 20 3a 20 22 73 71  te_master" : "sq
2eb70 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72  lite_temp_master
2eb80 22 29 3b 0a 20 20 20 20 20 20 20 20 6e 65 77 5f  ");.        new_
2eb90 61 72 67 76 5b 31 5d 20 3d 20 30 3b 0a 20 20 20  argv[1] = 0;.   
2eba0 20 20 20 20 20 6e 65 77 5f 63 6f 6c 76 5b 30 5d       new_colv[0]
2ebb0 20 3d 20 22 73 71 6c 22 3b 0a 20 20 20 20 20 20   = "sql";.      
2ebc0 20 20 6e 65 77 5f 63 6f 6c 76 5b 31 5d 20 3d 20    new_colv[1] = 
2ebd0 30 3b 0a 20 20 20 20 20 20 20 20 63 61 6c 6c 62  0;.        callb
2ebe0 61 63 6b 28 26 64 61 74 61 2c 20 31 2c 20 6e 65  ack(&data, 1, ne
2ebf0 77 5f 61 72 67 76 2c 20 6e 65 77 5f 63 6f 6c 76  w_argv, new_colv
2ec00 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
2ec10 65 33 5f 66 72 65 65 28 6e 65 77 5f 61 72 67 76  e3_free(new_argv
2ec20 5b 30 5d 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  [0]);.      }.  
2ec30 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 44 69 76    }.    if( zDiv
2ec40 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2ec50 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20  3_stmt *pStmt = 
2ec60 30 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71  0;.      rc = sq
2ec70 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
2ec80 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54 20  (p->db, "SELECT 
2ec90 6e 61 6d 65 20 46 52 4f 4d 20 70 72 61 67 6d 61  name FROM pragma
2eca0 5f 64 61 74 61 62 61 73 65 5f 6c 69 73 74 22 2c  _database_list",
2ecb0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ecc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
2ecd0 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
2ece0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
2ecf0 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
2ed00 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
2ed10 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  r: %s\n", sqlite
2ed20 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29  3_errmsg(p->db))
2ed30 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
2ed40 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
2ed50 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
2ed60 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  1;.        goto 
2ed70 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
2ed80 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
2ed90 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
2eda0 6c 65 63 74 2c 20 22 53 45 4c 45 43 54 20 73 71  lect, "SELECT sq
2edb0 6c 20 46 52 4f 4d 22 2c 20 30 29 3b 0a 20 20 20  l FROM", 0);.   
2edc0 20 20 20 69 53 63 68 65 6d 61 20 3d 20 30 3b 0a     iSchema = 0;.
2edd0 20 20 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c        while( sql
2ede0 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
2edf0 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b 0a  ==SQLITE_ROW ){.
2ee00 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
2ee10 61 72 20 2a 7a 44 62 20 3d 20 28 63 6f 6e 73 74  ar *zDb = (const
2ee20 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63   char*)sqlite3_c
2ee30 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
2ee40 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 63 68  , 0);.        ch
2ee50 61 72 20 7a 53 63 4e 75 6d 5b 33 30 5d 3b 0a 20  ar zScNum[30];. 
2ee60 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
2ee70 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
2ee80 53 63 4e 75 6d 29 2c 20 7a 53 63 4e 75 6d 2c 20  ScNum), zScNum, 
2ee90 22 25 64 22 2c 20 2b 2b 69 53 63 68 65 6d 61 29  "%d", ++iSchema)
2eea0 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ;.        append
2eeb0 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a  Text(&sSelect, z
2eec0 44 69 76 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Div, 0);.       
2eed0 20 7a 44 69 76 20 3d 20 22 20 55 4e 49 4f 4e 20   zDiv = " UNION 
2eee0 41 4c 4c 20 22 3b 0a 20 20 20 20 20 20 20 20 61  ALL ";.        a
2eef0 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
2ef00 63 74 2c 20 22 53 45 4c 45 43 54 20 73 68 65 6c  ct, "SELECT shel
2ef10 6c 5f 61 64 64 5f 73 63 68 65 6d 61 28 73 71 6c  l_add_schema(sql
2ef20 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ,", 0);.        
2ef30 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69  if( sqlite3_stri
2ef40 63 6d 70 28 7a 44 62 2c 20 22 6d 61 69 6e 22 29  cmp(zDb, "main")
2ef50 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
2ef60 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
2ef70 6c 65 63 74 2c 20 7a 44 62 2c 20 27 22 27 29 3b  lect, zDb, '"');
2ef80 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
2ef90 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e 64            append
2efa0 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22  Text(&sSelect, "
2efb0 4e 55 4c 4c 22 2c 20 30 29 3b 0a 20 20 20 20 20  NULL", 0);.     
2efc0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 70 70     }.        app
2efd0 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
2efe0 2c 20 22 2c 6e 61 6d 65 29 20 41 53 20 73 71 6c  , ",name) AS sql
2eff0 2c 20 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65  , type, tbl_name
2f000 2c 20 6e 61 6d 65 2c 20 72 6f 77 69 64 2c 22 2c  , name, rowid,",
2f010 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70   0);.        app
2f020 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
2f030 2c 20 7a 53 63 4e 75 6d 2c 20 30 29 3b 0a 20 20  , zScNum, 0);.  
2f040 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
2f050 28 26 73 53 65 6c 65 63 74 2c 20 22 20 41 53 20  (&sSelect, " AS 
2f060 73 6e 75 6d 2c 20 22 2c 20 30 29 3b 0a 20 20 20  snum, ", 0);.   
2f070 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
2f080 26 73 53 65 6c 65 63 74 2c 20 7a 44 62 2c 20 27  &sSelect, zDb, '
2f090 5c 27 27 29 3b 0a 20 20 20 20 20 20 20 20 61 70  \'');.        ap
2f0a0 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63  pendText(&sSelec
2f0b0 74 2c 20 22 20 41 53 20 73 6e 61 6d 65 20 46 52  t, " AS sname FR
2f0c0 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  OM ", 0);.      
2f0d0 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
2f0e0 65 6c 65 63 74 2c 20 7a 44 62 2c 20 27 22 27 29  elect, zDb, '"')
2f0f0 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ;.        append
2f100 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22  Text(&sSelect, "
2f110 2e 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 2c  .sqlite_master",
2f120 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
2f130 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
2f140 69 7a 65 28 70 53 74 6d 74 29 3b 0a 23 69 66 64  ize(pStmt);.#ifd
2f150 65 66 20 53 51 4c 49 54 45 5f 49 4e 54 52 4f 53  ef SQLITE_INTROS
2f160 50 45 43 54 49 4f 4e 5f 50 52 41 47 4d 41 53 0a  PECTION_PRAGMAS.
2f170 20 20 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 20        if( zName 
2f180 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  ){.        appen
2f190 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 0a  dText(&sSelect,.
2f1a0 20 20 20 20 20 20 20 20 20 20 20 22 20 55 4e 49             " UNI
2f1b0 4f 4e 20 41 4c 4c 20 53 45 4c 45 43 54 20 73 68  ON ALL SELECT sh
2f1c0 65 6c 6c 5f 6d 6f 64 75 6c 65 5f 73 63 68 65 6d  ell_module_schem
2f1d0 61 28 6e 61 6d 65 29 2c 22 0a 20 20 20 20 20 20  a(name),".      
2f1e0 20 20 20 20 20 22 20 27 74 61 62 6c 65 27 2c 20       " 'table', 
2f1f0 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20 6e 61 6d 65  name, name, name
2f200 2c 20 39 65 2b 39 39 2c 20 27 6d 61 69 6e 27 20  , 9e+99, 'main' 
2f210 46 52 4f 4d 20 70 72 61 67 6d 61 5f 6d 6f 64 75  FROM pragma_modu
2f220 6c 65 5f 6c 69 73 74 22 2c 20 30 29 3b 0a 20 20  le_list", 0);.  
2f230 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
2f240 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
2f250 53 65 6c 65 63 74 2c 20 22 29 20 57 48 45 52 45  Select, ") WHERE
2f260 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   ", 0);.      if
2f270 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20  ( zName ){.     
2f280 20 20 20 63 68 61 72 20 2a 7a 51 61 72 67 20 3d     char *zQarg =
2f290 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
2f2a0 28 22 25 51 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20  ("%Q", zName);. 
2f2b0 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63 68         if( strch
2f2c0 72 28 7a 4e 61 6d 65 2c 20 27 2e 27 29 20 29 7b  r(zName, '.') ){
2f2d0 0a 20 20 20 20 20 20 20 20 20 20 61 70 70 65 6e  .          appen
2f2e0 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20  dText(&sSelect, 
2f2f0 22 6c 6f 77 65 72 28 70 72 69 6e 74 66 28 27 25  "lower(printf('%
2f300 73 2e 25 73 27 2c 73 6e 61 6d 65 2c 74 62 6c 5f  s.%s',sname,tbl_
2f310 6e 61 6d 65 29 29 22 2c 20 30 29 3b 0a 20 20 20  name))", 0);.   
2f320 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
2f330 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
2f340 28 26 73 53 65 6c 65 63 74 2c 20 22 6c 6f 77 65  (&sSelect, "lowe
2f350 72 28 74 62 6c 5f 6e 61 6d 65 29 22 2c 20 30 29  r(tbl_name)", 0)
2f360 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2f370 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
2f380 73 53 65 6c 65 63 74 2c 20 73 74 72 63 68 72 28  sSelect, strchr(
2f390 7a 4e 61 6d 65 2c 20 27 2a 27 29 20 3f 20 22 20  zName, '*') ? " 
2f3a0 47 4c 4f 42 20 22 20 3a 20 22 20 4c 49 4b 45 20  GLOB " : " LIKE 
2f3b0 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61  ", 0);.        a
2f3c0 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
2f3d0 63 74 2c 20 7a 51 61 72 67 2c 20 30 29 3b 0a 20  ct, zQarg, 0);. 
2f3e0 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
2f3f0 74 28 26 73 53 65 6c 65 63 74 2c 20 22 20 41 4e  t(&sSelect, " AN
2f400 44 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  D ", 0);.       
2f410 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51   sqlite3_free(zQ
2f420 61 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  arg);.      }.  
2f430 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
2f440 73 53 65 6c 65 63 74 2c 20 22 74 79 70 65 21 3d  sSelect, "type!=
2f450 27 6d 65 74 61 27 20 41 4e 44 20 73 71 6c 20 49  'meta' AND sql I
2f460 53 20 4e 4f 54 20 4e 55 4c 4c 22 0a 20 20 20 20  S NOT NULL".    
2f470 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f480 20 20 20 20 20 20 20 22 20 4f 52 44 45 52 20 42         " ORDER B
2f490 59 20 73 6e 75 6d 2c 20 72 6f 77 69 64 22 2c 20  Y snum, rowid", 
2f4a0 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 62 44  0);.      if( bD
2f4b0 65 62 75 67 20 29 7b 0a 20 20 20 20 20 20 20 20  ebug ){.        
2f4c0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
2f4d0 75 74 2c 20 22 53 51 4c 3a 20 25 73 3b 5c 6e 22  ut, "SQL: %s;\n"
2f4e0 2c 20 73 53 65 6c 65 63 74 2e 7a 29 3b 0a 20 20  , sSelect.z);.  
2f4f0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
2f500 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
2f510 65 78 65 63 28 70 2d 3e 64 62 2c 20 73 53 65 6c  exec(p->db, sSel
2f520 65 63 74 2e 7a 2c 20 63 61 6c 6c 62 61 63 6b 2c  ect.z, callback,
2f530 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67   &data, &zErrMsg
2f540 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2f550 20 66 72 65 65 54 65 78 74 28 26 73 53 65 6c 65   freeText(&sSele
2f560 63 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ct);.    }.    i
2f570 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  f( zErrMsg ){.  
2f580 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2f590 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 25  stderr,"Error: %
2f5a0 73 5c 6e 22 2c 20 7a 45 72 72 4d 73 67 29 3b 0a  s\n", zErrMsg);.
2f5b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
2f5c0 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20  ee(zErrMsg);.   
2f5d0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
2f5e0 65 6c 73 65 20 69 66 28 20 72 63 20 21 3d 20 53  else if( rc != S
2f5f0 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20  QLITE_OK ){.    
2f600 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2f610 65 72 72 2c 22 45 72 72 6f 72 3a 20 71 75 65 72  err,"Error: quer
2f620 79 69 6e 67 20 73 63 68 65 6d 61 20 69 6e 66 6f  ying schema info
2f630 72 6d 61 74 69 6f 6e 5c 6e 22 29 3b 0a 20 20 20  rmation\n");.   
2f640 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
2f650 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d  else{.      rc =
2f660 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   0;.    }.  }els
2f670 65 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  e..#if defined(S
2f680 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26 20  QLITE_DEBUG) && 
2f690 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
2f6a0 4e 41 42 4c 45 5f 53 45 4c 45 43 54 54 52 41 43  NABLE_SELECTTRAC
2f6b0 45 29 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20  E).  if( c=='s' 
2f6c0 26 26 20 6e 3d 3d 31 31 20 26 26 20 73 74 72 6e  && n==11 && strn
2f6d0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73  cmp(azArg[0], "s
2f6e0 65 6c 65 63 74 74 72 61 63 65 22 2c 20 6e 29 3d  electtrace", n)=
2f6f0 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
2f700 33 53 65 6c 65 63 74 54 72 61 63 65 20 3d 20 28  3SelectTrace = (
2f710 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75 65  int)integerValue
2f720 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 7d 65  (azArg[1]);.  }e
2f730 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20  lse.#endif..#if 
2f740 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
2f750 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 20  NABLE_SESSION). 
2f760 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20 73   if( c=='s' && s
2f770 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2f780 22 73 65 73 73 69 6f 6e 22 2c 6e 29 3d 3d 30 20  "session",n)==0 
2f790 26 26 20 6e 3e 3d 33 20 29 7b 0a 20 20 20 20 4f  && n>=3 ){.    O
2f7a0 70 65 6e 53 65 73 73 69 6f 6e 20 2a 70 53 65 73  penSession *pSes
2f7b0 73 69 6f 6e 20 3d 20 26 70 2d 3e 61 53 65 73 73  sion = &p->aSess
2f7c0 69 6f 6e 5b 30 5d 3b 0a 20 20 20 20 63 68 61 72  ion[0];.    char
2f7d0 20 2a 2a 61 7a 43 6d 64 20 3d 20 26 61 7a 41 72   **azCmd = &azAr
2f7e0 67 5b 31 5d 3b 0a 20 20 20 20 69 6e 74 20 69 53  g[1];.    int iS
2f7f0 65 73 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20  es = 0;.    int 
2f800 6e 43 6d 64 20 3d 20 6e 41 72 67 20 2d 20 31 3b  nCmd = nArg - 1;
2f810 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
2f820 69 66 28 20 6e 41 72 67 3c 3d 31 20 29 20 67 6f  if( nArg<=1 ) go
2f830 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61  to session_synta
2f840 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 6f 70 65  x_error;.    ope
2f850 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20  n_db(p, 0);.    
2f860 69 66 28 20 6e 41 72 67 3e 3d 33 20 29 7b 0a 20  if( nArg>=3 ){. 
2f870 20 20 20 20 20 66 6f 72 28 69 53 65 73 3d 30 3b       for(iSes=0;
2f880 20 69 53 65 73 3c 70 2d 3e 6e 53 65 73 73 69 6f   iSes<p->nSessio
2f890 6e 3b 20 69 53 65 73 2b 2b 29 7b 0a 20 20 20 20  n; iSes++){.    
2f8a0 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 70      if( strcmp(p
2f8b0 2d 3e 61 53 65 73 73 69 6f 6e 5b 69 53 65 73 5d  ->aSession[iSes]
2f8c0 2e 7a 4e 61 6d 65 2c 20 61 7a 41 72 67 5b 31 5d  .zName, azArg[1]
2f8d0 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  )==0 ) break;.  
2f8e0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
2f8f0 69 53 65 73 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e  iSes<p->nSession
2f900 20 29 7b 0a 20 20 20 20 20 20 20 20 70 53 65 73   ){.        pSes
2f910 73 69 6f 6e 20 3d 20 26 70 2d 3e 61 53 65 73 73  sion = &p->aSess
2f920 69 6f 6e 5b 69 53 65 73 5d 3b 0a 20 20 20 20 20  ion[iSes];.     
2f930 20 20 20 61 7a 43 6d 64 2b 2b 3b 0a 20 20 20 20     azCmd++;.    
2f940 20 20 20 20 6e 43 6d 64 2d 2d 3b 0a 20 20 20 20      nCmd--;.    
2f950 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
2f960 20 70 53 65 73 73 69 6f 6e 20 3d 20 26 70 2d 3e   pSession = &p->
2f970 61 53 65 73 73 69 6f 6e 5b 30 5d 3b 0a 20 20 20  aSession[0];.   
2f980 20 20 20 20 20 69 53 65 73 20 3d 20 30 3b 0a 20       iSes = 0;. 
2f990 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
2f9a0 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 61 74    /* .session at
2f9b0 74 61 63 68 20 54 41 42 4c 45 0a 20 20 20 20 2a  tach TABLE.    *
2f9c0 2a 20 49 6e 76 6f 6b 65 20 74 68 65 20 73 71 6c  * Invoke the sql
2f9d0 69 74 65 33 73 65 73 73 69 6f 6e 5f 61 74 74 61  ite3session_atta
2f9e0 63 68 28 29 20 69 6e 74 65 72 66 61 63 65 20 74  ch() interface t
2f9f0 6f 20 61 74 74 61 63 68 20 61 20 70 61 72 74 69  o attach a parti
2fa00 63 75 6c 61 72 0a 20 20 20 20 2a 2a 20 74 61 62  cular.    ** tab
2fa10 6c 65 20 73 6f 20 74 68 61 74 20 69 74 20 69 73  le so that it is
2fa20 20 6e 65 76 65 72 20 66 69 6c 74 65 72 65 64 2e   never filtered.
2fa30 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
2fa40 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c  strcmp(azCmd[0],
2fa50 22 61 74 74 61 63 68 22 29 3d 3d 30 20 29 7b 0a  "attach")==0 ){.
2fa60 20 20 20 20 20 20 69 66 28 20 6e 43 6d 64 21 3d        if( nCmd!=
2fa70 32 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e  2 ) goto session
2fa80 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20  _syntax_error;. 
2fa90 20 20 20 20 20 69 66 28 20 70 53 65 73 73 69 6f       if( pSessio
2faa0 6e 2d 3e 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20  n->p==0 ){.     
2fab0 20 20 20 73 65 73 73 69 6f 6e 5f 6e 6f 74 5f 6f     session_not_o
2fac0 70 65 6e 3a 0a 20 20 20 20 20 20 20 20 72 61 77  pen:.        raw
2fad0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2fae0 22 45 52 52 4f 52 3a 20 4e 6f 20 73 65 73 73 69  "ERROR: No sessi
2faf0 6f 6e 73 20 61 72 65 20 6f 70 65 6e 5c 6e 22 29  ons are open\n")
2fb00 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2fb10 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69         rc = sqli
2fb20 74 65 33 73 65 73 73 69 6f 6e 5f 61 74 74 61 63  te3session_attac
2fb30 68 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 61  h(pSession->p, a
2fb40 7a 43 6d 64 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zCmd[1]);.      
2fb50 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20    if( rc ){.    
2fb60 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2fb70 28 73 74 64 65 72 72 2c 20 22 45 52 52 4f 52 3a  (stderr, "ERROR:
2fb80 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f   sqlite3session_
2fb90 61 74 74 61 63 68 28 29 20 72 65 74 75 72 6e 73  attach() returns
2fba0 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20   %d\n", rc);.   
2fbb0 20 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20         rc = 0;. 
2fbc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
2fbd0 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20  .    }else..    
2fbe0 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 63 68 61 6e  /* .session chan
2fbf0 67 65 73 65 74 20 46 49 4c 45 0a 20 20 20 20 2a  geset FILE.    *
2fc00 2a 20 2e 73 65 73 73 69 6f 6e 20 70 61 74 63 68  * .session patch
2fc10 73 65 74 20 46 49 4c 45 0a 20 20 20 20 2a 2a 20  set FILE.    ** 
2fc20 57 72 69 74 65 20 61 20 63 68 61 6e 67 65 73 65  Write a changese
2fc30 74 20 6f 72 20 70 61 74 63 68 73 65 74 20 69 6e  t or patchset in
2fc40 74 6f 20 61 20 66 69 6c 65 2e 20 20 54 68 65 20  to a file.  The 
2fc50 66 69 6c 65 20 69 73 20 6f 76 65 72 77 72 69 74  file is overwrit
2fc60 74 65 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ten..    */.    
2fc70 69 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64  if( strcmp(azCmd
2fc80 5b 30 5d 2c 22 63 68 61 6e 67 65 73 65 74 22 29  [0],"changeset")
2fc90 3d 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28 61 7a  ==0 || strcmp(az
2fca0 43 6d 64 5b 30 5d 2c 22 70 61 74 63 68 73 65 74  Cmd[0],"patchset
2fcb0 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 46  ")==0 ){.      F
2fcc0 49 4c 45 20 2a 6f 75 74 20 3d 20 30 3b 0a 20 20  ILE *out = 0;.  
2fcd0 20 20 20 20 69 66 28 20 6e 43 6d 64 21 3d 32 20      if( nCmd!=2 
2fce0 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73  ) goto session_s
2fcf0 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20  yntax_error;.   
2fd00 20 20 20 69 66 28 20 70 53 65 73 73 69 6f 6e 2d     if( pSession-
2fd10 3e 70 3d 3d 30 20 29 20 67 6f 74 6f 20 73 65 73  >p==0 ) goto ses
2fd20 73 69 6f 6e 5f 6e 6f 74 5f 6f 70 65 6e 3b 0a 20  sion_not_open;. 
2fd30 20 20 20 20 20 6f 75 74 20 3d 20 66 6f 70 65 6e       out = fopen
2fd40 28 61 7a 43 6d 64 5b 31 5d 2c 20 22 77 62 22 29  (azCmd[1], "wb")
2fd50 3b 0a 20 20 20 20 20 20 69 66 28 20 6f 75 74 3d  ;.      if( out=
2fd60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  =0 ){.        ut
2fd70 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
2fd80 2c 20 22 45 52 52 4f 52 3a 20 63 61 6e 6e 6f 74  , "ERROR: cannot
2fd90 20 6f 70 65 6e 20 5c 22 25 73 5c 22 20 66 6f 72   open \"%s\" for
2fda0 20 77 72 69 74 69 6e 67 5c 6e 22 2c 20 61 7a 43   writing\n", azC
2fdb0 6d 64 5b 31 5d 29 3b 0a 20 20 20 20 20 20 7d 65  md[1]);.      }e
2fdc0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
2fdd0 20 73 7a 43 68 6e 67 3b 0a 20 20 20 20 20 20 20   szChng;.       
2fde0 20 76 6f 69 64 20 2a 70 43 68 6e 67 3b 0a 20 20   void *pChng;.  
2fdf0 20 20 20 20 20 20 69 66 28 20 61 7a 43 6d 64 5b        if( azCmd[
2fe00 30 5d 5b 30 5d 3d 3d 27 63 27 20 29 7b 0a 20 20  0][0]=='c' ){.  
2fe10 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
2fe20 69 74 65 33 73 65 73 73 69 6f 6e 5f 63 68 61 6e  ite3session_chan
2fe30 67 65 73 65 74 28 70 53 65 73 73 69 6f 6e 2d 3e  geset(pSession->
2fe40 70 2c 20 26 73 7a 43 68 6e 67 2c 20 26 70 43 68  p, &szChng, &pCh
2fe50 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  ng);.        }el
2fe60 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 63  se{.          rc
2fe70 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f   = sqlite3sessio
2fe80 6e 5f 70 61 74 63 68 73 65 74 28 70 53 65 73 73  n_patchset(pSess
2fe90 69 6f 6e 2d 3e 70 2c 20 26 73 7a 43 68 6e 67 2c  ion->p, &szChng,
2fea0 20 26 70 43 68 6e 67 29 3b 0a 20 20 20 20 20 20   &pChng);.      
2feb0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
2fec0 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  rc ){.          
2fed0 70 72 69 6e 74 66 28 22 45 72 72 6f 72 3a 20 65  printf("Error: e
2fee0 72 72 6f 72 20 63 6f 64 65 20 25 64 5c 6e 22 2c  rror code %d\n",
2fef0 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 20 20   rc);.          
2ff00 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  rc = 0;.        
2ff10 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 43  }.        if( pC
2ff20 68 6e 67 0a 20 20 20 20 20 20 20 20 20 20 26 26  hng.          &&
2ff30 20 66 77 72 69 74 65 28 70 43 68 6e 67 2c 20 73   fwrite(pChng, s
2ff40 7a 43 68 6e 67 2c 20 31 2c 20 6f 75 74 29 21 3d  zChng, 1, out)!=
2ff50 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  1 ){.          r
2ff60 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
2ff70 2c 20 22 45 52 52 4f 52 3a 20 46 61 69 6c 65 64  , "ERROR: Failed
2ff80 20 74 6f 20 77 72 69 74 65 20 65 6e 74 69 72 65   to write entire
2ff90 20 25 64 2d 62 79 74 65 20 6f 75 74 70 75 74 5c   %d-byte output\
2ffa0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
2ffb0 20 20 20 20 20 20 73 7a 43 68 6e 67 29 3b 0a 20        szChng);. 
2ffc0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2ffd0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 43   sqlite3_free(pC
2ffe0 68 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 66 63  hng);.        fc
2fff0 6c 6f 73 65 28 6f 75 74 29 3b 0a 20 20 20 20 20  lose(out);.     
30000 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20   }.    }else..  
30010 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 63 6c    /* .session cl
30020 6f 73 65 0a 20 20 20 20 2a 2a 20 43 6c 6f 73 65  ose.    ** Close
30030 20 74 68 65 20 69 64 65 6e 74 69 66 69 65 64 20   the identified 
30040 73 65 73 73 69 6f 6e 0a 20 20 20 20 2a 2f 0a 20  session.    */. 
30050 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61 7a     if( strcmp(az
30060 43 6d 64 5b 30 5d 2c 20 22 63 6c 6f 73 65 22 29  Cmd[0], "close")
30070 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
30080 20 6e 43 6d 64 21 3d 31 20 29 20 67 6f 74 6f 20   nCmd!=1 ) goto 
30090 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65  session_syntax_e
300a0 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 66 28 20  rror;.      if( 
300b0 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20  p->nSession ){. 
300c0 20 20 20 20 20 20 20 73 65 73 73 69 6f 6e 5f 63         session_c
300d0 6c 6f 73 65 28 70 53 65 73 73 69 6f 6e 29 3b 0a  lose(pSession);.
300e0 20 20 20 20 20 20 20 20 70 2d 3e 61 53 65 73 73          p->aSess
300f0 69 6f 6e 5b 69 53 65 73 5d 20 3d 20 70 2d 3e 61  ion[iSes] = p->a
30100 53 65 73 73 69 6f 6e 5b 2d 2d 70 2d 3e 6e 53 65  Session[--p->nSe
30110 73 73 69 6f 6e 5d 3b 0a 20 20 20 20 20 20 7d 0a  ssion];.      }.
30120 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f      }else..    /
30130 2a 20 2e 73 65 73 73 69 6f 6e 20 65 6e 61 62 6c  * .session enabl
30140 65 20 3f 42 4f 4f 4c 45 41 4e 3f 0a 20 20 20 20  e ?BOOLEAN?.    
30150 2a 2a 20 51 75 65 72 79 20 6f 72 20 73 65 74 20  ** Query or set 
30160 74 68 65 20 65 6e 61 62 6c 65 20 66 6c 61 67 0a  the enable flag.
30170 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
30180 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 20  trcmp(azCmd[0], 
30190 22 65 6e 61 62 6c 65 22 29 3d 3d 30 20 29 7b 0a  "enable")==0 ){.
301a0 20 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20        int ii;.  
301b0 20 20 20 20 69 66 28 20 6e 43 6d 64 3e 32 20 29      if( nCmd>2 )
301c0 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79   goto session_sy
301d0 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20  ntax_error;.    
301e0 20 20 69 69 20 3d 20 6e 43 6d 64 3d 3d 31 20 3f    ii = nCmd==1 ?
301f0 20 2d 31 20 3a 20 62 6f 6f 6c 65 61 6e 56 61 6c   -1 : booleanVal
30200 75 65 28 61 7a 43 6d 64 5b 31 5d 29 3b 0a 20 20  ue(azCmd[1]);.  
30210 20 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 73 73      if( p->nSess
30220 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ion ){.        i
30230 69 20 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69  i = sqlite3sessi
30240 6f 6e 5f 65 6e 61 62 6c 65 28 70 53 65 73 73 69  on_enable(pSessi
30250 6f 6e 2d 3e 70 2c 20 69 69 29 3b 0a 20 20 20 20  on->p, ii);.    
30260 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
30270 70 2d 3e 6f 75 74 2c 20 22 73 65 73 73 69 6f 6e  p->out, "session
30280 20 25 73 20 65 6e 61 62 6c 65 20 66 6c 61 67 20   %s enable flag 
30290 3d 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20  = %d\n",.       
302a0 20 20 20 20 20 20 20 20 20 20 20 20 20 70 53 65               pSe
302b0 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 2c 20 69 69  ssion->zName, ii
302c0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
302d0 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65  else..    /* .se
302e0 73 73 69 6f 6e 20 66 69 6c 74 65 72 20 47 4c 4f  ssion filter GLO
302f0 42 20 2e 2e 2e 2e 0a 20 20 20 20 2a 2a 20 53 65  B .....    ** Se
30300 74 20 61 20 6c 69 73 74 20 6f 66 20 47 4c 4f 42  t a list of GLOB
30310 20 70 61 74 74 65 72 6e 73 20 6f 66 20 74 61 62   patterns of tab
30320 6c 65 20 6e 61 6d 65 73 20 74 6f 20 62 65 20 65  le names to be e
30330 78 63 6c 75 64 65 64 2e 0a 20 20 20 20 2a 2f 0a  xcluded..    */.
30340 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
30350 7a 43 6d 64 5b 30 5d 2c 20 22 66 69 6c 74 65 72  zCmd[0], "filter
30360 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
30370 6e 74 20 69 69 2c 20 6e 42 79 74 65 3b 0a 20 20  nt ii, nByte;.  
30380 20 20 20 20 69 66 28 20 6e 43 6d 64 3c 32 20 29      if( nCmd<2 )
30390 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79   goto session_sy
303a0 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20  ntax_error;.    
303b0 20 20 69 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f    if( p->nSessio
303c0 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72  n ){.        for
303d0 28 69 69 3d 30 3b 20 69 69 3c 70 53 65 73 73 69  (ii=0; ii<pSessi
303e0 6f 6e 2d 3e 6e 46 69 6c 74 65 72 3b 20 69 69 2b  on->nFilter; ii+
303f0 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71  +){.          sq
30400 6c 69 74 65 33 5f 66 72 65 65 28 70 53 65 73 73  lite3_free(pSess
30410 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 69 69  ion->azFilter[ii
30420 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
30430 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
30440 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46  ee(pSession->azF
30450 69 6c 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  ilter);.        
30460 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 70  nByte = sizeof(p
30470 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65  Session->azFilte
30480 72 5b 30 5d 29 2a 28 6e 43 6d 64 2d 31 29 3b 0a  r[0])*(nCmd-1);.
30490 20 20 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e          pSession
304a0 2d 3e 61 7a 46 69 6c 74 65 72 20 3d 20 73 71 6c  ->azFilter = sql
304b0 69 74 65 33 5f 6d 61 6c 6c 6f 63 28 20 6e 42 79  ite3_malloc( nBy
304c0 74 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  te );.        if
304d0 28 20 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69  ( pSession->azFi
304e0 6c 74 65 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  lter==0 ){.     
304f0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
30500 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20  stderr, "Error: 
30510 6f 75 74 20 6f 72 20 6d 65 6d 6f 72 79 5c 6e 22  out or memory\n"
30520 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78 69  );.          exi
30530 74 28 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  t(1);.        }.
30540 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 31          for(ii=1
30550 3b 20 69 69 3c 6e 43 6d 64 3b 20 69 69 2b 2b 29  ; ii<nCmd; ii++)
30560 7b 0a 20 20 20 20 20 20 20 20 20 20 70 53 65 73  {.          pSes
30570 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 69  sion->azFilter[i
30580 69 2d 31 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d  i-1] = sqlite3_m
30590 70 72 69 6e 74 66 28 22 25 73 22 2c 20 61 7a 43  printf("%s", azC
305a0 6d 64 5b 69 69 5d 29 3b 0a 20 20 20 20 20 20 20  md[ii]);.       
305b0 20 7d 0a 20 20 20 20 20 20 20 20 70 53 65 73 73   }.        pSess
305c0 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72 20 3d 20 69  ion->nFilter = i
305d0 69 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  i-1;.      }.   
305e0 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e   }else..    /* .
305f0 73 65 73 73 69 6f 6e 20 69 6e 64 69 72 65 63 74  session indirect
30600 20 3f 42 4f 4f 4c 45 41 4e 3f 0a 20 20 20 20 2a   ?BOOLEAN?.    *
30610 2a 20 51 75 65 72 79 20 6f 72 20 73 65 74 20 74  * Query or set t
30620 68 65 20 69 6e 64 69 72 65 63 74 20 66 6c 61 67  he indirect flag
30630 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
30640 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c  strcmp(azCmd[0],
30650 20 22 69 6e 64 69 72 65 63 74 22 29 3d 3d 30 20   "indirect")==0 
30660 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69 3b  ){.      int ii;
30670 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6d 64 3e  .      if( nCmd>
30680 32 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e  2 ) goto session
30690 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20  _syntax_error;. 
306a0 20 20 20 20 20 69 69 20 3d 20 6e 43 6d 64 3d 3d       ii = nCmd==
306b0 31 20 3f 20 2d 31 20 3a 20 62 6f 6f 6c 65 61 6e  1 ? -1 : boolean
306c0 56 61 6c 75 65 28 61 7a 43 6d 64 5b 31 5d 29 3b  Value(azCmd[1]);
306d0 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53  .      if( p->nS
306e0 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  ession ){.      
306f0 20 20 69 69 20 3d 20 73 71 6c 69 74 65 33 73 65    ii = sqlite3se
30700 73 73 69 6f 6e 5f 69 6e 64 69 72 65 63 74 28 70  ssion_indirect(p
30710 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 69 69 29 3b  Session->p, ii);
30720 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
30730 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 73 65  intf(p->out, "se
30740 73 73 69 6f 6e 20 25 73 20 69 6e 64 69 72 65 63  ssion %s indirec
30750 74 20 66 6c 61 67 20 3d 20 25 64 5c 6e 22 2c 0a  t flag = %d\n",.
30760 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30770 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e      pSession->zN
30780 61 6d 65 2c 20 69 69 29 3b 0a 20 20 20 20 20 20  ame, ii);.      
30790 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20  }.    }else..   
307a0 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 69 73 65   /* .session ise
307b0 6d 70 74 79 0a 20 20 20 20 2a 2a 20 44 65 74 65  mpty.    ** Dete
307c0 72 6d 69 6e 65 20 69 66 20 74 68 65 20 73 65 73  rmine if the ses
307d0 73 69 6f 6e 20 69 73 20 65 6d 70 74 79 0a 20 20  sion is empty.  
307e0 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72    */.    if( str
307f0 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22 69  cmp(azCmd[0], "i
30800 73 65 6d 70 74 79 22 29 3d 3d 30 20 29 7b 0a 20  sempty")==0 ){. 
30810 20 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20       int ii;.   
30820 20 20 20 69 66 28 20 6e 43 6d 64 21 3d 31 20 29     if( nCmd!=1 )
30830 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79   goto session_sy
30840 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20  ntax_error;.    
30850 20 20 69 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f    if( p->nSessio
30860 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 69 20  n ){.        ii 
30870 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e  = sqlite3session
30880 5f 69 73 65 6d 70 74 79 28 70 53 65 73 73 69 6f  _isempty(pSessio
30890 6e 2d 3e 70 29 3b 0a 20 20 20 20 20 20 20 20 75  n->p);.        u
308a0 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
308b0 74 2c 20 22 73 65 73 73 69 6f 6e 20 25 73 20 69  t, "session %s i
308c0 73 65 6d 70 74 79 20 66 6c 61 67 20 3d 20 25 64  sempty flag = %d
308d0 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \n",.           
308e0 20 20 20 20 20 20 20 20 20 70 53 65 73 73 69 6f           pSessio
308f0 6e 2d 3e 7a 4e 61 6d 65 2c 20 69 69 29 3b 0a 20  n->zName, ii);. 
30900 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
30910 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f  ..    /* .sessio
30920 6e 20 6c 69 73 74 0a 20 20 20 20 2a 2a 20 4c 69  n list.    ** Li
30930 73 74 20 61 6c 6c 20 63 75 72 72 65 6e 74 6c 79  st all currently
30940 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e 73 0a 20   open sessions. 
30950 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74     */.    if( st
30960 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 6c  rcmp(azCmd[0],"l
30970 69 73 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ist")==0 ){.    
30980 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
30990 6e 53 65 73 73 69 6f 6e 3b 20 69 2b 2b 29 7b 0a  nSession; i++){.
309a0 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
309b0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 64 20  ntf(p->out, "%d 
309c0 25 73 5c 6e 22 2c 20 69 2c 20 70 2d 3e 61 53 65  %s\n", i, p->aSe
309d0 73 73 69 6f 6e 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  ssion[i].zName);
309e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c  .      }.    }el
309f0 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73  se..    /* .sess
30a00 69 6f 6e 20 6f 70 65 6e 20 44 42 20 4e 41 4d 45  ion open DB NAME
30a10 0a 20 20 20 20 2a 2a 20 4f 70 65 6e 20 61 20 6e  .    ** Open a n
30a20 65 77 20 73 65 73 73 69 6f 6e 20 63 61 6c 6c 65  ew session calle
30a30 64 20 4e 41 4d 45 20 6f 6e 20 74 68 65 20 61 74  d NAME on the at
30a40 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65 20  tached database 
30a50 44 42 2e 0a 20 20 20 20 2a 2a 20 44 42 20 69 73  DB..    ** DB is
30a60 20 6e 6f 72 6d 61 6c 6c 79 20 22 6d 61 69 6e 22   normally "main"
30a70 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
30a80 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d   strcmp(azCmd[0]
30a90 2c 22 6f 70 65 6e 22 29 3d 3d 30 20 29 7b 0a 20  ,"open")==0 ){. 
30aa0 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
30ab0 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6d 64  ;.      if( nCmd
30ac0 21 3d 33 20 29 20 67 6f 74 6f 20 73 65 73 73 69  !=3 ) goto sessi
30ad0 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b  on_syntax_error;
30ae0 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 61  .      zName = a
30af0 7a 43 6d 64 5b 32 5d 3b 0a 20 20 20 20 20 20 69  zCmd[2];.      i
30b00 66 28 20 7a 4e 61 6d 65 5b 30 5d 3d 3d 30 20 29  f( zName[0]==0 )
30b10 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79   goto session_sy
30b20 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20  ntax_error;.    
30b30 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
30b40 6e 53 65 73 73 69 6f 6e 3b 20 69 2b 2b 29 7b 0a  nSession; i++){.
30b50 20 20 20 20 20 20 20 20 69 66 28 20 73 74 72 63          if( strc
30b60 6d 70 28 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 69  mp(p->aSession[i
30b70 5d 2e 7a 4e 61 6d 65 2c 7a 4e 61 6d 65 29 3d 3d  ].zName,zName)==
30b80 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75  0 ){.          u
30b90 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
30ba0 72 2c 20 22 53 65 73 73 69 6f 6e 20 5c 22 25 73  r, "Session \"%s
30bb0 5c 22 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  \" already exist
30bc0 73 5c 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20  s\n", zName);.  
30bd0 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74          goto met
30be0 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
30bf0 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
30c00 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  }.      if( p->n
30c10 53 65 73 73 69 6f 6e 3e 3d 41 72 72 61 79 53 69  Session>=ArraySi
30c20 7a 65 28 70 2d 3e 61 53 65 73 73 69 6f 6e 29 20  ze(p->aSession) 
30c30 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  ){.        raw_p
30c40 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 4d  rintf(stderr, "M
30c50 61 78 69 6d 75 6d 20 6f 66 20 25 64 20 73 65 73  aximum of %d ses
30c60 73 69 6f 6e 73 5c 6e 22 2c 20 41 72 72 61 79 53  sions\n", ArrayS
30c70 69 7a 65 28 70 2d 3e 61 53 65 73 73 69 6f 6e 29  ize(p->aSession)
30c80 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  );.        goto 
30c90 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
30ca0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
30cb0 20 70 53 65 73 73 69 6f 6e 20 3d 20 26 70 2d 3e   pSession = &p->
30cc0 61 53 65 73 73 69 6f 6e 5b 70 2d 3e 6e 53 65 73  aSession[p->nSes
30cd0 73 69 6f 6e 5d 3b 0a 20 20 20 20 20 20 72 63 20  sion];.      rc 
30ce0 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e  = sqlite3session
30cf0 5f 63 72 65 61 74 65 28 70 2d 3e 64 62 2c 20 61  _create(p->db, a
30d00 7a 43 6d 64 5b 31 5d 2c 20 26 70 53 65 73 73 69  zCmd[1], &pSessi
30d10 6f 6e 2d 3e 70 29 3b 0a 20 20 20 20 20 20 69 66  on->p);.      if
30d20 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
30d30 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
30d40 72 2c 20 22 43 61 6e 6e 6f 74 20 6f 70 65 6e 20  r, "Cannot open 
30d50 73 65 73 73 69 6f 6e 3a 20 65 72 72 6f 72 20 63  session: error c
30d60 6f 64 65 3d 25 64 5c 6e 22 2c 20 72 63 29 3b 0a  ode=%d\n", rc);.
30d70 20 20 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a          rc = 0;.
30d80 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74          goto met
30d90 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
30da0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53        }.      pS
30db0 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72 20  ession->nFilter 
30dc0 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  = 0;.      sqlit
30dd0 65 33 73 65 73 73 69 6f 6e 5f 74 61 62 6c 65 5f  e3session_table_
30de0 66 69 6c 74 65 72 28 70 53 65 73 73 69 6f 6e 2d  filter(pSession-
30df0 3e 70 2c 20 73 65 73 73 69 6f 6e 5f 66 69 6c 74  >p, session_filt
30e00 65 72 2c 20 70 53 65 73 73 69 6f 6e 29 3b 0a 20  er, pSession);. 
30e10 20 20 20 20 20 70 2d 3e 6e 53 65 73 73 69 6f 6e       p->nSession
30e20 2b 2b 3b 0a 20 20 20 20 20 20 70 53 65 73 73 69  ++;.      pSessi
30e30 6f 6e 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  on->zName = sqli
30e40 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
30e50 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 65  , zName);.    }e
30e60 6c 73 65 0a 20 20 20 20 2f 2a 20 49 66 20 6e 6f  lse.    /* If no
30e70 20 63 6f 6d 6d 61 6e 64 20 6e 61 6d 65 20 6d 61   command name ma
30e80 74 63 68 65 73 2c 20 73 68 6f 77 20 61 20 73 79  tches, show a sy
30e90 6e 74 61 78 20 65 72 72 6f 72 20 2a 2f 0a 20 20  ntax error */.  
30ea0 20 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78    session_syntax
30eb0 5f 65 72 72 6f 72 3a 0a 20 20 20 20 73 65 73 73  _error:.    sess
30ec0 69 6f 6e 5f 68 65 6c 70 28 70 29 3b 0a 20 20 7d  ion_help(p);.  }
30ed0 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 23 69 66  else.#endif..#if
30ee0 64 65 66 20 53 51 4c 49 54 45 5f 44 45 42 55 47  def SQLITE_DEBUG
30ef0 0a 20 20 2f 2a 20 55 6e 64 6f 63 75 6d 65 6e 74  .  /* Undocument
30f00 65 64 20 63 6f 6d 6d 61 6e 64 73 20 66 6f 72 20  ed commands for 
30f10 69 6e 74 65 72 6e 61 6c 20 74 65 73 74 69 6e 67  internal testing
30f20 2e 20 20 53 75 62 6a 65 63 74 20 74 6f 20 63 68  .  Subject to ch
30f30 61 6e 67 65 0a 20 20 2a 2a 20 77 69 74 68 6f 75  ange.  ** withou
30f40 74 20 6e 6f 74 69 63 65 2e 20 2a 2f 0a 20 20 69  t notice. */.  i
30f50 66 28 20 63 3d 3d 27 73 27 20 26 26 20 6e 3e 3d  f( c=='s' && n>=
30f60 31 30 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  10 && strncmp(az
30f70 41 72 67 5b 30 5d 2c 20 22 73 65 6c 66 74 65 73  Arg[0], "selftes
30f80 74 2d 22 2c 20 39 29 3d 3d 30 20 29 7b 0a 20 20  t-", 9)==0 ){.  
30f90 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61 7a    if( strncmp(az
30fa0 41 72 67 5b 30 5d 2b 39 2c 20 22 62 6f 6f 6c 65  Arg[0]+9, "boole
30fb0 61 6e 22 2c 20 6e 2d 39 29 3d 3d 30 20 29 7b 0a  an", n-9)==0 ){.
30fc0 20 20 20 20 20 20 69 6e 74 20 69 2c 20 76 3b 0a        int i, v;.
30fd0 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69        for(i=1; i
30fe0 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
30ff0 20 20 20 20 20 76 20 3d 20 62 6f 6f 6c 65 61 6e       v = boolean
31000 56 61 6c 75 65 28 61 7a 41 72 67 5b 69 5d 29 3b  Value(azArg[i]);
31010 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
31020 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
31030 3a 20 25 64 20 30 78 25 78 5c 6e 22 2c 20 61 7a  : %d 0x%x\n", az
31040 41 72 67 5b 69 5d 2c 20 76 2c 20 76 29 3b 0a 20  Arg[i], v, v);. 
31050 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
31060 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61 7a 41   if( strncmp(azA
31070 72 67 5b 30 5d 2b 39 2c 20 22 69 6e 74 65 67 65  rg[0]+9, "intege
31080 72 22 2c 20 6e 2d 39 29 3d 3d 30 20 29 7b 0a 20  r", n-9)==0 ){. 
31090 20 20 20 20 20 69 6e 74 20 69 3b 20 73 71 6c 69       int i; sqli
310a0 74 65 33 5f 69 6e 74 36 34 20 76 3b 0a 20 20 20  te3_int64 v;.   
310b0 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41     for(i=1; i<nA
310c0 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
310d0 20 20 63 68 61 72 20 7a 42 75 66 5b 32 30 30 5d    char zBuf[200]
310e0 3b 0a 20 20 20 20 20 20 20 20 76 20 3d 20 69 6e  ;.        v = in
310f0 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67  tegerValue(azArg
31100 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 73 71  [i]);.        sq
31110 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
31120 69 7a 65 6f 66 28 7a 42 75 66 29 2c 7a 42 75 66  izeof(zBuf),zBuf
31130 2c 22 25 73 3a 20 25 6c 6c 64 20 30 78 25 6c 6c  ,"%s: %lld 0x%ll
31140 78 5c 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 2c 76  x\n", azArg[i],v
31150 2c 76 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66  ,v);.        utf
31160 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
31170 20 22 25 73 22 2c 20 7a 42 75 66 29 3b 0a 20 20   "%s", zBuf);.  
31180 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
31190 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66  lse.#endif..  if
311a0 28 20 63 3d 3d 27 73 27 20 26 26 20 6e 3e 3d 34  ( c=='s' && n>=4
311b0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
311c0 67 5b 30 5d 2c 22 73 65 6c 66 74 65 73 74 22 2c  g[0],"selftest",
311d0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  n)==0 ){.    int
311e0 20 62 49 73 49 6e 69 74 20 3d 20 30 3b 20 20 20   bIsInit = 0;   
311f0 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
31200 20 69 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20   initialize the 
31210 53 45 4c 46 54 45 53 54 20 74 61 62 6c 65 20 2a  SELFTEST table *
31220 2f 0a 20 20 20 20 69 6e 74 20 62 56 65 72 62 6f  /.    int bVerbo
31230 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  se = 0;        /
31240 2a 20 56 65 72 62 6f 73 65 20 6f 75 74 70 75 74  * Verbose output
31250 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 53 65 6c   */.    int bSel
31260 66 74 65 73 74 45 78 69 73 74 73 3b 20 20 20 20  ftestExists;    
31270 20 2f 2a 20 54 72 75 65 20 69 66 20 53 45 4c 46   /* True if SELF
31280 54 45 53 54 20 61 6c 72 65 61 64 79 20 65 78 69  TEST already exi
31290 73 74 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  sts */.    int i
312a0 2c 20 6b 3b 20 20 20 20 20 20 20 20 20 20 20 20  , k;            
312b0 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
312c0 74 65 72 73 20 2a 2f 0a 20 20 20 20 69 6e 74 20  ters */.    int 
312d0 6e 54 65 73 74 20 3d 20 30 3b 20 20 20 20 20 20  nTest = 0;      
312e0 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
312f0 66 20 74 65 73 74 73 20 72 75 6e 73 20 2a 2f 0a  f tests runs */.
31300 20 20 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30      int nErr = 0
31310 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
31320 4e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  Number of errors
31330 20 73 65 65 6e 20 2a 2f 0a 20 20 20 20 53 68 65   seen */.    She
31340 6c 6c 54 65 78 74 20 73 74 72 3b 20 20 20 20 20  llText str;     
31350 20 20 20 20 20 20 2f 2a 20 41 6e 73 77 65 72 20        /* Answer 
31360 66 6f 72 20 61 20 71 75 65 72 79 20 2a 2f 0a 20  for a query */. 
31370 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
31380 2a 70 53 74 6d 74 20 3d 20 30 3b 20 2f 2a 20 51  *pStmt = 0; /* Q
31390 75 65 72 79 20 61 67 61 69 6e 73 74 20 74 68 65  uery against the
313a0 20 53 45 4c 46 54 45 53 54 20 74 61 62 6c 65 20   SELFTEST table 
313b0 2a 2f 0a 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28  */..    open_db(
313c0 70 2c 30 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d  p,0);.    for(i=
313d0 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  1; i<nArg; i++){
313e0 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
313f0 72 20 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 3b  r *z = azArg[i];
31400 0a 20 20 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d  .      if( z[0]=
31410 3d 27 2d 27 20 26 26 20 7a 5b 31 5d 3d 3d 27 2d  ='-' && z[1]=='-
31420 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 69  ' ) z++;.      i
31430 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 69 6e  f( strcmp(z,"-in
31440 69 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  it")==0 ){.     
31450 20 20 20 62 49 73 49 6e 69 74 20 3d 20 31 3b 0a     bIsInit = 1;.
31460 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20        }else.    
31470 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22    if( strcmp(z,"
31480 2d 76 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  -v")==0 ){.     
31490 20 20 20 62 56 65 72 62 6f 73 65 2b 2b 3b 0a 20     bVerbose++;. 
314a0 20 20 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20       }else.     
314b0 20 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f   {.        utf8_
314c0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
314d0 55 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 20 5c  Unknown option \
314e0 22 25 73 5c 22 20 6f 6e 20 5c 22 25 73 5c 22 5c  "%s\" on \"%s\"\
314f0 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
31500 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b 69 5d          azArg[i]
31510 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 20  , azArg[0]);.   
31520 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
31530 73 74 64 65 72 72 2c 20 22 53 68 6f 75 6c 64 20  stderr, "Should 
31540 62 65 20 6f 6e 65 20 6f 66 3a 20 2d 2d 69 6e 69  be one of: --ini
31550 74 20 2d 76 5c 6e 22 29 3b 0a 20 20 20 20 20 20  t -v\n");.      
31560 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
31570 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
31580 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  and_exit;.      
31590 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
315a0 73 71 6c 69 74 65 33 5f 74 61 62 6c 65 5f 63 6f  sqlite3_table_co
315b0 6c 75 6d 6e 5f 6d 65 74 61 64 61 74 61 28 70 2d  lumn_metadata(p-
315c0 3e 64 62 2c 22 6d 61 69 6e 22 2c 22 73 65 6c 66  >db,"main","self
315d0 74 65 73 74 22 2c 30 2c 30 2c 30 2c 30 2c 30 2c  test",0,0,0,0,0,
315e0 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 21 3d  0).           !=
315f0 20 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20   SQLITE_OK ){.  
31600 20 20 20 20 62 53 65 6c 66 74 65 73 74 45 78 69      bSelftestExi
31610 73 74 73 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c  sts = 0;.    }el
31620 73 65 7b 0a 20 20 20 20 20 20 62 53 65 6c 66 74  se{.      bSelft
31630 65 73 74 45 78 69 73 74 73 20 3d 20 31 3b 0a 20  estExists = 1;. 
31640 20 20 20 7d 0a 20 20 20 20 69 66 28 20 62 49 73     }.    if( bIs
31650 49 6e 69 74 20 29 7b 0a 20 20 20 20 20 20 63 72  Init ){.      cr
31660 65 61 74 65 53 65 6c 66 74 65 73 74 54 61 62 6c  eateSelftestTabl
31670 65 28 70 29 3b 0a 20 20 20 20 20 20 62 53 65 6c  e(p);.      bSel
31680 66 74 65 73 74 45 78 69 73 74 73 20 3d 20 31 3b  ftestExists = 1;
31690 0a 20 20 20 20 7d 0a 20 20 20 20 69 6e 69 74 54  .    }.    initT
316a0 65 78 74 28 26 73 74 72 29 3b 0a 20 20 20 20 61  ext(&str);.    a
316b0 70 70 65 6e 64 54 65 78 74 28 26 73 74 72 2c 20  ppendText(&str, 
316c0 22 78 22 2c 20 30 29 3b 0a 20 20 20 20 66 6f 72  "x", 0);.    for
316d0 28 6b 3d 62 53 65 6c 66 74 65 73 74 45 78 69 73  (k=bSelftestExis
316e0 74 73 3b 20 6b 3e 3d 30 3b 20 6b 2d 2d 29 7b 0a  ts; k>=0; k--){.
316f0 20 20 20 20 20 20 69 66 28 20 6b 3d 3d 31 20 29        if( k==1 )
31700 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
31710 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
31720 32 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  2(p->db,.       
31730 20 20 20 20 20 22 53 45 4c 45 43 54 20 74 6e 6f       "SELECT tno
31740 2c 6f 70 2c 63 6d 64 2c 61 6e 73 20 46 52 4f 4d  ,op,cmd,ans FROM
31750 20 73 65 6c 66 74 65 73 74 20 4f 52 44 45 52 20   selftest ORDER 
31760 42 59 20 74 6e 6f 22 2c 0a 20 20 20 20 20 20 20  BY tno",.       
31770 20 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c       -1, &pStmt,
31780 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   0);.      }else
31790 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73  {.        rc = s
317a0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
317b0 32 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  2(p->db,.       
317c0 20 20 20 22 56 41 4c 55 45 53 28 30 2c 27 6d 65     "VALUES(0,'me
317d0 6d 6f 27 2c 27 4d 69 73 73 69 6e 67 20 53 45 4c  mo','Missing SEL
317e0 46 54 45 53 54 20 74 61 62 6c 65 20 2d 20 64 65  FTEST table - de
317f0 66 61 75 6c 74 20 63 68 65 63 6b 73 20 6f 6e 6c  fault checks onl
31800 79 27 2c 27 27 29 2c 22 0a 20 20 20 20 20 20 20  y',''),".       
31810 20 20 20 22 20 20 20 20 20 20 28 31 2c 27 72 75     "      (1,'ru
31820 6e 27 2c 27 50 52 41 47 4d 41 20 69 6e 74 65 67  n','PRAGMA integ
31830 72 69 74 79 5f 63 68 65 63 6b 27 2c 27 6f 6b 27  rity_check','ok'
31840 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 2d 31  )",.          -1
31850 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
31860 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
31870 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61  rc ){.        ra
31880 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
31890 20 22 45 72 72 6f 72 20 71 75 65 72 79 69 6e 67   "Error querying
318a0 20 74 68 65 20 73 65 6c 66 74 65 73 74 20 74 61   the selftest ta
318b0 62 6c 65 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  ble\n");.       
318c0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
318d0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
318e0 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
318f0 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
31900 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  and_exit;.      
31910 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 31 3b  }.      for(i=1;
31920 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
31930 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
31940 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
31950 69 6e 74 20 74 6e 6f 20 3d 20 73 71 6c 69 74 65  int tno = sqlite
31960 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74  3_column_int(pSt
31970 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  mt, 0);.        
31980 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20  const char *zOp 
31990 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
319a0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
319b0 78 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20  xt(pStmt, 1);.  
319c0 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
319d0 20 2a 7a 53 71 6c 20 3d 20 28 63 6f 6e 73 74 20   *zSql = (const 
319e0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
319f0 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
31a00 20 32 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e   2);.        con
31a10 73 74 20 63 68 61 72 20 2a 7a 41 6e 73 20 3d 20  st char *zAns = 
31a20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
31a30 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
31a40 28 70 53 74 6d 74 2c 20 33 29 3b 0a 0a 20 20 20  (pStmt, 3);..   
31a50 20 20 20 20 20 6b 20 3d 20 30 3b 0a 20 20 20 20       k = 0;.    
31a60 20 20 20 20 69 66 28 20 62 56 65 72 62 6f 73 65      if( bVerbose
31a70 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  >0 ){.          
31a80 63 68 61 72 20 2a 7a 51 75 6f 74 65 20 3d 20 73  char *zQuote = s
31a90 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
31aa0 25 71 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20  %q", zSql);.    
31ab0 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25 64        printf("%d
31ac0 3a 20 25 73 20 25 73 5c 6e 22 2c 20 74 6e 6f 2c  : %s %s\n", tno,
31ad0 20 7a 4f 70 2c 20 7a 53 71 6c 29 3b 0a 20 20 20   zOp, zSql);.   
31ae0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
31af0 72 65 65 28 7a 51 75 6f 74 65 29 3b 0a 20 20 20  ree(zQuote);.   
31b00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
31b10 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c 22 6d  f( strcmp(zOp,"m
31b20 65 6d 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  emo")==0 ){.    
31b30 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
31b40 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22  f(p->out, "%s\n"
31b50 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20  , zSql);.       
31b60 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69   }else.        i
31b70 66 28 20 73 74 72 63 6d 70 28 7a 4f 70 2c 22 72  f( strcmp(zOp,"r
31b80 75 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  un")==0 ){.     
31b90 20 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 4d       char *zErrM
31ba0 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  sg = 0;.        
31bb0 20 20 73 74 72 2e 6e 20 3d 20 30 3b 0a 20 20 20    str.n = 0;.   
31bc0 20 20 20 20 20 20 20 73 74 72 2e 7a 5b 30 5d 20         str.z[0] 
31bd0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 72  = 0;.          r
31be0 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
31bf0 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 63 61  (p->db, zSql, ca
31c00 70 74 75 72 65 4f 75 74 70 75 74 43 61 6c 6c 62  ptureOutputCallb
31c10 61 63 6b 2c 20 26 73 74 72 2c 20 26 7a 45 72 72  ack, &str, &zErr
31c20 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Msg);.          
31c30 6e 54 65 73 74 2b 2b 3b 0a 20 20 20 20 20 20 20  nTest++;.       
31c40 20 20 20 69 66 28 20 62 56 65 72 62 6f 73 65 20     if( bVerbose 
31c50 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  ){.            u
31c60 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
31c70 74 2c 20 22 52 65 73 75 6c 74 3a 20 25 73 5c 6e  t, "Result: %s\n
31c80 22 2c 20 73 74 72 2e 7a 29 3b 0a 20 20 20 20 20  ", str.z);.     
31c90 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
31ca0 20 69 66 28 20 72 63 20 7c 7c 20 7a 45 72 72 4d   if( rc || zErrM
31cb0 73 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  sg ){.          
31cc0 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20    nErr++;.      
31cd0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
31ce0 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
31cf0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
31d00 64 3a 20 65 72 72 6f 72 2d 63 6f 64 65 2d 25 64  d: error-code-%d
31d10 3a 20 25 73 5c 6e 22 2c 20 74 6e 6f 2c 20 72 63  : %s\n", tno, rc
31d20 2c 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20  , zErrMsg);.    
31d30 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
31d40 66 72 65 65 28 7a 45 72 72 4d 73 67 29 3b 0a 20  free(zErrMsg);. 
31d50 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69           }else i
31d60 66 28 20 73 74 72 63 6d 70 28 7a 41 6e 73 2c 73  f( strcmp(zAns,s
31d70 74 72 2e 7a 29 21 3d 30 20 29 7b 0a 20 20 20 20  tr.z)!=0 ){.    
31d80 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a          nErr++;.
31d90 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
31da0 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
31db0 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
31dc0 75 74 2c 20 22 25 64 3a 20 45 78 70 65 63 74 65  ut, "%d: Expecte
31dd0 64 3a 20 5b 25 73 5d 5c 6e 22 2c 20 74 6e 6f 2c  d: [%s]\n", tno,
31de0 20 7a 41 6e 73 29 3b 0a 20 20 20 20 20 20 20 20   zAns);.        
31df0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
31e00 70 2d 3e 6f 75 74 2c 20 22 25 64 3a 20 20 20 20  p->out, "%d:    
31e10 20 20 47 6f 74 3a 20 5b 25 73 5d 5c 6e 22 2c 20    Got: [%s]\n", 
31e20 74 6e 6f 2c 20 73 74 72 2e 7a 29 3b 0a 20 20 20  tno, str.z);.   
31e30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
31e40 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 7b   }else.        {
31e50 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f  .          utf8_
31e60 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20  printf(stderr,. 
31e70 20 20 20 20 20 20 20 20 20 20 20 22 55 6e 6b 6e             "Unkn
31e80 6f 77 6e 20 6f 70 65 72 61 74 69 6f 6e 20 5c 22  own operation \"
31e90 25 73 5c 22 20 6f 6e 20 73 65 6c 66 74 65 73 74  %s\" on selftest
31ea0 20 6c 69 6e 65 20 25 64 5c 6e 22 2c 20 7a 4f 70   line %d\n", zOp
31eb0 2c 20 74 6e 6f 29 3b 0a 20 20 20 20 20 20 20 20  , tno);.        
31ec0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
31ed0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
31ee0 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 2f 2a 20     }.      } /* 
31ef0 45 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20 72 6f  End loop over ro
31f00 77 73 20 6f 66 20 63 6f 6e 74 65 6e 74 20 66 72  ws of content fr
31f10 6f 6d 20 53 45 4c 46 54 45 53 54 20 2a 2f 0a 20  om SELFTEST */. 
31f20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
31f30 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
31f40 20 20 7d 20 2f 2a 20 45 6e 64 20 6c 6f 6f 70 20    } /* End loop 
31f50 6f 76 65 72 20 6b 20 2a 2f 0a 20 20 20 20 66 72  over k */.    fr
31f60 65 65 54 65 78 74 28 26 73 74 72 29 3b 0a 20 20  eeText(&str);.  
31f70 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
31f80 3e 6f 75 74 2c 20 22 25 64 20 65 72 72 6f 72 73  >out, "%d errors
31f90 20 6f 75 74 20 6f 66 20 25 64 20 74 65 73 74 73   out of %d tests
31fa0 5c 6e 22 2c 20 6e 45 72 72 2c 20 6e 54 65 73 74  \n", nErr, nTest
31fb0 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66  );.  }else..  if
31fc0 28 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72 6e  ( c=='s' && strn
31fd0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73  cmp(azArg[0], "s
31fe0 65 70 61 72 61 74 6f 72 22 2c 20 6e 29 3d 3d 30  eparator", n)==0
31ff0 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
32000 3c 32 20 7c 7c 20 6e 41 72 67 3e 33 20 29 7b 0a  <2 || nArg>3 ){.
32010 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
32020 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
32030 20 2e 73 65 70 61 72 61 74 6f 72 20 43 4f 4c 20   .separator COL 
32040 3f 52 4f 57 3f 5c 6e 22 29 3b 0a 20 20 20 20 20  ?ROW?\n");.     
32050 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20   rc = 1;.    }. 
32060 20 20 20 69 66 28 20 6e 41 72 67 3e 3d 32 20 29     if( nArg>=2 )
32070 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
32080 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28  snprintf(sizeof(
32090 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
320a0 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
320b0 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
320c0 20 20 20 20 20 20 20 20 20 20 22 25 2e 2a 73 22            "%.*s"
320d0 2c 20 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65  , (int)ArraySize
320e0 28 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72  (p->colSeparator
320f0 29 2d 31 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  )-1, azArg[1]);.
32100 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41      }.    if( nA
32110 72 67 3e 3d 33 20 29 7b 0a 20 20 20 20 20 20 73  rg>=3 ){.      s
32120 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
32130 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70  sizeof(p->rowSep
32140 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53  arator), p->rowS
32150 65 70 61 72 61 74 6f 72 2c 0a 20 20 20 20 20 20  eparator,.      
32160 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32170 20 22 25 2e 2a 73 22 2c 20 28 69 6e 74 29 41 72   "%.*s", (int)Ar
32180 72 61 79 53 69 7a 65 28 70 2d 3e 72 6f 77 53 65  raySize(p->rowSe
32190 70 61 72 61 74 6f 72 29 2d 31 2c 20 61 7a 41 72  parator)-1, azAr
321a0 67 5b 32 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  g[2]);.    }.  }
321b0 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
321c0 73 27 20 26 26 20 6e 3e 3d 34 20 26 26 20 73 74  s' && n>=4 && st
321d0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22  rncmp(azArg[0],"
321e0 73 68 61 33 73 75 6d 22 2c 6e 29 3d 3d 30 20 29  sha3sum",n)==0 )
321f0 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
32200 20 2a 7a 4c 69 6b 65 20 3d 20 30 3b 20 20 20 2f   *zLike = 0;   /
32210 2a 20 57 68 69 63 68 20 74 61 62 6c 65 20 74 6f  * Which table to
32220 20 63 68 65 63 6b 73 75 6d 2e 20 30 20 6d 65 61   checksum. 0 mea
32230 6e 73 20 65 76 65 72 79 74 68 69 6e 67 20 2a 2f  ns everything */
32240 0a 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20  .    int i;     
32250 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
32260 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f   Loop counter */
32270 0a 20 20 20 20 69 6e 74 20 62 53 63 68 65 6d 61  .    int bSchema
32280 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a   = 0;         /*
32290 20 41 6c 73 6f 20 68 61 73 68 20 74 68 65 20 73   Also hash the s
322a0 63 68 65 6d 61 20 2a 2f 0a 20 20 20 20 69 6e 74  chema */.    int
322b0 20 62 53 65 70 61 72 61 74 65 20 3d 20 30 3b 20   bSeparate = 0; 
322c0 20 20 20 20 20 20 2f 2a 20 48 61 73 68 20 65 61        /* Hash ea
322d0 63 68 20 74 61 62 6c 65 20 73 65 70 61 72 61 74  ch table separat
322e0 65 6c 79 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69  ely */.    int i
322f0 53 69 7a 65 20 3d 20 32 32 34 3b 20 20 20 20 20  Size = 224;     
32300 20 20 20 20 2f 2a 20 48 61 73 68 20 61 6c 67 6f      /* Hash algo
32310 72 69 74 68 6d 20 74 6f 20 75 73 65 20 2a 2f 0a  rithm to use */.
32320 20 20 20 20 69 6e 74 20 62 44 65 62 75 67 20 3d      int bDebug =
32330 20 30 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20   0;          /* 
32340 4f 6e 6c 79 20 73 68 6f 77 20 74 68 65 20 71 75  Only show the qu
32350 65 72 79 20 74 68 61 74 20 77 6f 75 6c 64 20 68  ery that would h
32360 61 76 65 20 72 75 6e 20 2a 2f 0a 20 20 20 20 73  ave run */.    s
32370 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74  qlite3_stmt *pSt
32380 6d 74 3b 20 20 20 20 20 2f 2a 20 46 6f 72 20 71  mt;     /* For q
32390 75 65 72 79 69 6e 67 20 74 61 62 6c 65 73 20 6e  uerying tables n
323a0 61 6d 65 73 20 2a 2f 0a 20 20 20 20 63 68 61 72  ames */.    char
323b0 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20 20   *zSql;         
323c0 20 20 20 20 20 2f 2a 20 53 51 4c 20 74 6f 20 62       /* SQL to b
323d0 65 20 72 75 6e 20 2a 2f 0a 20 20 20 20 63 68 61  e run */.    cha
323e0 72 20 2a 7a 53 65 70 3b 20 20 20 20 20 20 20 20  r *zSep;        
323f0 20 20 20 20 20 20 2f 2a 20 53 65 70 61 72 61 74        /* Separat
32400 6f 72 20 2a 2f 0a 20 20 20 20 53 68 65 6c 6c 54  or */.    ShellT
32410 65 78 74 20 73 53 71 6c 3b 20 20 20 20 20 20 20  ext sSql;       
32420 20 20 20 2f 2a 20 43 6f 6d 70 6c 65 74 65 20 53     /* Complete S
32430 51 4c 20 66 6f 72 20 74 68 65 20 71 75 65 72 79  QL for the query
32440 20 74 6f 20 72 75 6e 20 74 68 65 20 68 61 73 68   to run the hash
32450 20 2a 2f 0a 20 20 20 20 53 68 65 6c 6c 54 65 78   */.    ShellTex
32460 74 20 73 51 75 65 72 79 3b 20 20 20 20 20 20 20  t sQuery;       
32470 20 2f 2a 20 53 65 74 20 6f 66 20 71 75 65 72 69   /* Set of queri
32480 65 73 20 75 73 65 64 20 74 6f 20 72 65 61 64 20  es used to read 
32490 61 6c 6c 20 63 6f 6e 74 65 6e 74 20 2a 2f 0a 20  all content */. 
324a0 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
324b0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69  ;.    for(i=1; i
324c0 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
324d0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
324e0 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20   = azArg[i];.   
324f0 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27     if( z[0]=='-'
32500 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 2b 2b 3b   ){.        z++;
32510 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 30  .        if( z[0
32520 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a 20 20  ]=='-' ) z++;.  
32530 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
32540 28 7a 2c 22 73 63 68 65 6d 61 22 29 3d 3d 30 20  (z,"schema")==0 
32550 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 53 63  ){.          bSc
32560 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20 20 20 20  hema = 1;.      
32570 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20    }else.        
32580 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 73 68  if( strcmp(z,"sh
32590 61 33 2d 32 32 34 22 29 3d 3d 30 20 7c 7c 20 73  a3-224")==0 || s
325a0 74 72 63 6d 70 28 7a 2c 22 73 68 61 33 2d 32 35  trcmp(z,"sha3-25
325b0 36 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 20  6")==0.         
325c0 7c 7c 20 73 74 72 63 6d 70 28 7a 2c 22 73 68 61  || strcmp(z,"sha
325d0 33 2d 33 38 34 22 29 3d 3d 30 20 7c 7c 20 73 74  3-384")==0 || st
325e0 72 63 6d 70 28 7a 2c 22 73 68 61 33 2d 35 31 32  rcmp(z,"sha3-512
325f0 22 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b  ")==0.        ){
32600 0a 20 20 20 20 20 20 20 20 20 20 69 53 69 7a 65  .          iSize
32610 20 3d 20 61 74 6f 69 28 26 7a 5b 35 5d 29 3b 0a   = atoi(&z[5]);.
32620 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20 20          }else.  
32630 20 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70        if( strcmp
32640 28 7a 2c 22 64 65 62 75 67 22 29 3d 3d 30 20 29  (z,"debug")==0 )
32650 7b 0a 20 20 20 20 20 20 20 20 20 20 62 44 65 62  {.          bDeb
32660 75 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  ug = 1;.        
32670 7d 65 6c 73 65 0a 20 20 20 20 20 20 20 20 7b 0a  }else.        {.
32680 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
32690 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
326a0 6e 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 20 5c 22  nknown option \"
326b0 25 73 5c 22 20 6f 6e 20 5c 22 25 73 5c 22 5c 6e  %s\" on \"%s\"\n
326c0 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
326d0 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b 69           azArg[i
326e0 5d 2c 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20  ], azArg[0]);.  
326f0 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
32700 74 66 28 73 74 64 65 72 72 2c 20 22 53 68 6f 75  tf(stderr, "Shou
32710 6c 64 20 62 65 20 6f 6e 65 20 6f 66 3a 20 2d 2d  ld be one of: --
32720 73 63 68 65 6d 61 22 0a 20 20 20 20 20 20 20 20  schema".        
32730 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32740 20 20 20 20 20 22 20 2d 2d 73 68 61 33 2d 32 32       " --sha3-22
32750 34 20 2d 2d 73 68 61 33 2d 32 35 35 20 2d 2d 73  4 --sha3-255 --s
32760 68 61 33 2d 33 38 34 20 2d 2d 73 68 61 33 2d 35  ha3-384 --sha3-5
32770 31 32 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  12\n");.        
32780 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
32790 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
327a0 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
327b0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
327c0 65 20 69 66 28 20 7a 4c 69 6b 65 20 29 7b 0a 20  e if( zLike ){. 
327d0 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
327e0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
327f0 3a 20 2e 73 68 61 33 73 75 6d 20 3f 4f 50 54 49  : .sha3sum ?OPTI
32800 4f 4e 53 3f 20 3f 4c 49 4b 45 2d 50 41 54 54 45  ONS? ?LIKE-PATTE
32810 52 4e 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20  RN?\n");.       
32820 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
32830 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
32840 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d  nd_exit;.      }
32850 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 7a 4c  else{.        zL
32860 69 6b 65 20 3d 20 7a 3b 0a 20 20 20 20 20 20 20  ike = z;.       
32870 20 62 53 65 70 61 72 61 74 65 20 3d 20 31 3b 0a   bSeparate = 1;.
32880 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
32890 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 73 71 6c  te3_strlike("sql
328a0 69 74 65 5f 25 22 2c 20 7a 4c 69 6b 65 2c 20 30  ite_%", zLike, 0
328b0 29 3d 3d 30 20 29 20 62 53 63 68 65 6d 61 20 3d  )==0 ) bSchema =
328c0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
328d0 7d 0a 20 20 20 20 69 66 28 20 62 53 63 68 65 6d  }.    if( bSchem
328e0 61 20 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20  a ){.      zSql 
328f0 3d 20 22 53 45 4c 45 43 54 20 6c 6f 77 65 72 28  = "SELECT lower(
32900 6e 61 6d 65 29 20 46 52 4f 4d 20 73 71 6c 69 74  name) FROM sqlit
32910 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20  e_master".      
32920 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20 74         " WHERE t
32930 79 70 65 3d 27 74 61 62 6c 65 27 20 41 4e 44 20  ype='table' AND 
32940 63 6f 61 6c 65 73 63 65 28 72 6f 6f 74 70 61 67  coalesce(rootpag
32950 65 2c 30 29 3e 31 22 0a 20 20 20 20 20 20 20 20  e,0)>1".        
32960 20 20 20 20 20 22 20 55 4e 49 4f 4e 20 41 4c 4c       " UNION ALL
32970 20 53 45 4c 45 43 54 20 27 73 71 6c 69 74 65 5f   SELECT 'sqlite_
32980 6d 61 73 74 65 72 27 22 0a 20 20 20 20 20 20 20  master'".       
32990 20 20 20 20 20 20 22 20 4f 52 44 45 52 20 42 59        " ORDER BY
329a0 20 31 20 63 6f 6c 6c 61 74 65 20 6e 6f 63 61 73   1 collate nocas
329b0 65 22 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  e";.    }else{. 
329c0 20 20 20 20 20 7a 53 71 6c 20 3d 20 22 53 45 4c       zSql = "SEL
329d0 45 43 54 20 6c 6f 77 65 72 28 6e 61 6d 65 29 20  ECT lower(name) 
329e0 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74  FROM sqlite_mast
329f0 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  er".            
32a00 20 22 20 57 48 45 52 45 20 74 79 70 65 3d 27 74   " WHERE type='t
32a10 61 62 6c 65 27 20 41 4e 44 20 63 6f 61 6c 65 73  able' AND coales
32a20 63 65 28 72 6f 6f 74 70 61 67 65 2c 30 29 3e 31  ce(rootpage,0)>1
32a30 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 22  ".             "
32a40 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 4c 49   AND name NOT LI
32a50 4b 45 20 27 73 71 6c 69 74 65 5f 25 27 22 0a 20  KE 'sqlite_%'". 
32a60 20 20 20 20 20 20 20 20 20 20 20 20 22 20 4f 52              " OR
32a70 44 45 52 20 42 59 20 31 20 63 6f 6c 6c 61 74 65  DER BY 1 collate
32a80 20 6e 6f 63 61 73 65 22 3b 0a 20 20 20 20 7d 0a   nocase";.    }.
32a90 20 20 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70      sqlite3_prep
32aa0 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 53  are_v2(p->db, zS
32ab0 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
32ac0 30 29 3b 0a 20 20 20 20 69 6e 69 74 54 65 78 74  0);.    initText
32ad0 28 26 73 51 75 65 72 79 29 3b 0a 20 20 20 20 69  (&sQuery);.    i
32ae0 6e 69 74 54 65 78 74 28 26 73 53 71 6c 29 3b 0a  nitText(&sSql);.
32af0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
32b00 73 53 71 6c 2c 20 22 57 49 54 48 20 5b 73 68 61  sSql, "WITH [sha
32b10 33 73 75 6d 24 71 75 65 72 79 5d 28 61 2c 62 29  3sum$query](a,b)
32b20 20 41 53 28 22 2c 30 29 3b 0a 20 20 20 20 7a 53   AS(",0);.    zS
32b30 65 70 20 3d 20 22 56 41 4c 55 45 53 28 22 3b 0a  ep = "VALUES(";.
32b40 20 20 20 20 77 68 69 6c 65 28 20 53 51 4c 49 54      while( SQLIT
32b50 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f 73  E_ROW==sqlite3_s
32b60 74 65 70 28 70 53 74 6d 74 29 20 29 7b 0a 20 20  tep(pStmt) ){.  
32b70 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
32b80 7a 54 61 62 20 3d 20 28 63 6f 6e 73 74 20 63 68  zTab = (const ch
32b90 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
32ba0 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 30 29  mn_text(pStmt,0)
32bb0 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6b  ;.      if( zLik
32bc0 65 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72  e && sqlite3_str
32bd0 6c 69 6b 65 28 7a 4c 69 6b 65 2c 20 7a 54 61 62  like(zLike, zTab
32be0 2c 20 30 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  , 0)!=0 ) contin
32bf0 75 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  ue;.      if( st
32c00 72 6e 63 6d 70 28 7a 54 61 62 2c 20 22 73 71 6c  rncmp(zTab, "sql
32c10 69 74 65 5f 22 2c 37 29 21 3d 30 20 29 7b 0a 20  ite_",7)!=0 ){. 
32c20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
32c30 74 28 26 73 51 75 65 72 79 2c 22 53 45 4c 45 43  t(&sQuery,"SELEC
32c40 54 20 2a 20 46 52 4f 4d 20 22 2c 20 30 29 3b 0a  T * FROM ", 0);.
32c50 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
32c60 78 74 28 26 73 51 75 65 72 79 2c 7a 54 61 62 2c  xt(&sQuery,zTab,
32c70 27 22 27 29 3b 0a 20 20 20 20 20 20 20 20 61 70  '"');.        ap
32c80 70 65 6e 64 54 65 78 74 28 26 73 51 75 65 72 79  pendText(&sQuery
32c90 2c 22 20 4e 4f 54 20 49 4e 44 45 58 45 44 3b 22  ," NOT INDEXED;"
32ca0 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 0);.      }els
32cb0 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54 61  e if( strcmp(zTa
32cc0 62 2c 20 22 73 71 6c 69 74 65 5f 6d 61 73 74 65  b, "sqlite_maste
32cd0 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r")==0 ){.      
32ce0 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 51    appendText(&sQ
32cf0 75 65 72 79 2c 22 53 45 4c 45 43 54 20 74 79 70  uery,"SELECT typ
32d00 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c  e,name,tbl_name,
32d10 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  sql FROM sqlite_
32d20 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20 20 20  master".        
32d30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32d40 20 20 20 22 20 4f 52 44 45 52 20 42 59 20 6e 61     " ORDER BY na
32d50 6d 65 3b 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  me;", 0);.      
32d60 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
32d70 28 7a 54 61 62 2c 20 22 73 71 6c 69 74 65 5f 73  (zTab, "sqlite_s
32d80 65 71 75 65 6e 63 65 22 29 3d 3d 30 20 29 7b 0a  equence")==0 ){.
32d90 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
32da0 78 74 28 26 73 51 75 65 72 79 2c 22 53 45 4c 45  xt(&sQuery,"SELE
32db0 43 54 20 6e 61 6d 65 2c 73 65 71 20 46 52 4f 4d  CT name,seq FROM
32dc0 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65   sqlite_sequence
32dd0 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
32de0 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20 4f               " O
32df0 52 44 45 52 20 42 59 20 6e 61 6d 65 3b 22 2c 20  RDER BY name;", 
32e00 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  0);.      }else 
32e10 69 66 28 20 73 74 72 63 6d 70 28 7a 54 61 62 2c  if( strcmp(zTab,
32e20 20 22 73 71 6c 69 74 65 5f 73 74 61 74 31 22 29   "sqlite_stat1")
32e30 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ==0 ){.        a
32e40 70 70 65 6e 64 54 65 78 74 28 26 73 51 75 65 72  ppendText(&sQuer
32e50 79 2c 22 53 45 4c 45 43 54 20 74 62 6c 2c 69 64  y,"SELECT tbl,id
32e60 78 2c 73 74 61 74 20 46 52 4f 4d 20 73 71 6c 69  x,stat FROM sqli
32e70 74 65 5f 73 74 61 74 31 22 0a 20 20 20 20 20 20  te_stat1".      
32e80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
32e90 20 20 20 20 20 22 20 4f 52 44 45 52 20 42 59 20       " ORDER BY 
32ea0 74 62 6c 2c 69 64 78 3b 22 2c 20 30 29 3b 0a 20  tbl,idx;", 0);. 
32eb0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
32ec0 74 72 63 6d 70 28 7a 54 61 62 2c 20 22 73 71 6c  trcmp(zTab, "sql
32ed0 69 74 65 5f 73 74 61 74 33 22 29 3d 3d 30 0a 20  ite_stat3")==0. 
32ee0 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73              || s
32ef0 74 72 63 6d 70 28 7a 54 61 62 2c 20 22 73 71 6c  trcmp(zTab, "sql
32f00 69 74 65 5f 73 74 61 74 34 22 29 3d 3d 30 20 29  ite_stat4")==0 )
32f10 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  {.        append
32f20 54 65 78 74 28 26 73 51 75 65 72 79 2c 20 22 53  Text(&sQuery, "S
32f30 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 22 2c 20  ELECT * FROM ", 
32f40 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65  0);.        appe
32f50 6e 64 54 65 78 74 28 26 73 51 75 65 72 79 2c 20  ndText(&sQuery, 
32f60 7a 54 61 62 2c 20 30 29 3b 0a 20 20 20 20 20 20  zTab, 0);.      
32f70 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 51    appendText(&sQ
32f80 75 65 72 79 2c 20 22 20 4f 52 44 45 52 20 42 59  uery, " ORDER BY
32f90 20 74 62 6c 2c 20 69 64 78 2c 20 72 6f 77 69 64   tbl, idx, rowid
32fa0 3b 5c 6e 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  ;\n", 0);.      
32fb0 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65  }.      appendTe
32fc0 78 74 28 26 73 53 71 6c 2c 20 7a 53 65 70 2c 20  xt(&sSql, zSep, 
32fd0 30 29 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64  0);.      append
32fe0 54 65 78 74 28 26 73 53 71 6c 2c 20 73 51 75 65  Text(&sSql, sQue
32ff0 72 79 2e 7a 2c 20 27 5c 27 27 29 3b 0a 20 20 20  ry.z, '\'');.   
33000 20 20 20 73 51 75 65 72 79 2e 6e 20 3d 20 30 3b     sQuery.n = 0;
33010 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
33020 74 28 26 73 53 71 6c 2c 20 22 2c 22 2c 20 30 29  t(&sSql, ",", 0)
33030 3b 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65  ;.      appendTe
33040 78 74 28 26 73 53 71 6c 2c 20 7a 54 61 62 2c 20  xt(&sSql, zTab, 
33050 27 5c 27 27 29 3b 0a 20 20 20 20 20 20 7a 53 65  '\'');.      zSe
33060 70 20 3d 20 22 29 2c 28 22 3b 0a 20 20 20 20 7d  p = "),(";.    }
33070 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
33080 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
33090 20 20 69 66 28 20 62 53 65 70 61 72 61 74 65 20    if( bSeparate 
330a0 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20  ){.      zSql = 
330b0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
330c0 0a 20 20 20 20 20 20 20 20 20 20 22 25 73 29 29  .          "%s))
330d0 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 53 45  ".          " SE
330e0 4c 45 43 54 20 6c 6f 77 65 72 28 68 65 78 28 73  LECT lower(hex(s
330f0 68 61 33 5f 71 75 65 72 79 28 61 2c 25 64 29 29  ha3_query(a,%d))
33100 29 20 41 53 20 68 61 73 68 2c 20 62 20 41 53 20  ) AS hash, b AS 
33110 6c 61 62 65 6c 22 0a 20 20 20 20 20 20 20 20 20  label".         
33120 20 22 20 20 20 46 52 4f 4d 20 5b 73 68 61 33 73   "   FROM [sha3s
33130 75 6d 24 71 75 65 72 79 5d 22 2c 0a 20 20 20 20  um$query]",.    
33140 20 20 20 20 20 20 73 53 71 6c 2e 7a 2c 20 69 53        sSql.z, iS
33150 69 7a 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ize);.    }else{
33160 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71  .      zSql = sq
33170 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20  lite3_mprintf(. 
33180 20 20 20 20 20 20 20 20 20 22 25 73 29 29 22 0a           "%s))".
33190 20 20 20 20 20 20 20 20 20 20 22 20 53 45 4c 45            " SELE
331a0 43 54 20 6c 6f 77 65 72 28 68 65 78 28 73 68 61  CT lower(hex(sha
331b0 33 5f 71 75 65 72 79 28 67 72 6f 75 70 5f 63 6f  3_query(group_co
331c0 6e 63 61 74 28 61 2c 27 27 29 2c 25 64 29 29 29  ncat(a,''),%d)))
331d0 20 41 53 20 68 61 73 68 22 0a 20 20 20 20 20 20   AS hash".      
331e0 20 20 20 20 22 20 20 20 46 52 4f 4d 20 5b 73 68      "   FROM [sh
331f0 61 33 73 75 6d 24 71 75 65 72 79 5d 22 2c 0a 20  a3sum$query]",. 
33200 20 20 20 20 20 20 20 20 20 73 53 71 6c 2e 7a 2c           sSql.z,
33210 20 69 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 20   iSize);.    }. 
33220 20 20 20 66 72 65 65 54 65 78 74 28 26 73 51 75     freeText(&sQu
33230 65 72 79 29 3b 0a 20 20 20 20 66 72 65 65 54 65  ery);.    freeTe
33240 78 74 28 26 73 53 71 6c 29 3b 0a 20 20 20 20 69  xt(&sSql);.    i
33250 66 28 20 62 44 65 62 75 67 20 29 7b 0a 20 20 20  f( bDebug ){.   
33260 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
33270 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a  ->out, "%s\n", z
33280 53 71 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  Sql);.    }else{
33290 0a 20 20 20 20 20 20 73 68 65 6c 6c 5f 65 78 65  .      shell_exe
332a0 63 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 73  c(p->db, zSql, s
332b0 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20 70  hell_callback, p
332c0 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
332d0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
332e0 6c 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69  l);.  }else..  i
332f0 66 28 20 63 3d 3d 27 73 27 0a 20 20 20 26 26 20  f( c=='s'.   && 
33300 28 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30  (strncmp(azArg[0
33310 5d 2c 20 22 73 68 65 6c 6c 22 2c 20 6e 29 3d 3d  ], "shell", n)==
33320 30 20 7c 7c 20 73 74 72 6e 63 6d 70 28 61 7a 41  0 || strncmp(azA
33330 72 67 5b 30 5d 2c 22 73 79 73 74 65 6d 22 2c 6e  rg[0],"system",n
33340 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20 63  )==0).  ){.    c
33350 68 61 72 20 2a 7a 43 6d 64 3b 0a 20 20 20 20 69  har *zCmd;.    i
33360 6e 74 20 69 2c 20 78 3b 0a 20 20 20 20 69 66 28  nt i, x;.    if(
33370 20 6e 41 72 67 3c 32 20 29 7b 0a 20 20 20 20 20   nArg<2 ){.     
33380 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
33390 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73 79 73  rr, "Usage: .sys
333a0 74 65 6d 20 43 4f 4d 4d 41 4e 44 5c 6e 22 29 3b  tem COMMAND\n");
333b0 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
333c0 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63       goto meta_c
333d0 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20  ommand_exit;.   
333e0 20 7d 0a 20 20 20 20 7a 43 6d 64 20 3d 20 73 71   }.    zCmd = sq
333f0 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 73 74  lite3_mprintf(st
33400 72 63 68 72 28 61 7a 41 72 67 5b 31 5d 2c 27 20  rchr(azArg[1],' 
33410 27 29 3d 3d 30 3f 22 25 73 22 3a 22 5c 22 25 73  ')==0?"%s":"\"%s
33420 5c 22 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a  \"", azArg[1]);.
33430 20 20 20 20 66 6f 72 28 69 3d 32 3b 20 69 3c 6e      for(i=2; i<n
33440 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
33450 20 7a 43 6d 64 20 3d 20 73 71 6c 69 74 65 33 5f   zCmd = sqlite3_
33460 6d 70 72 69 6e 74 66 28 73 74 72 63 68 72 28 61  mprintf(strchr(a
33470 7a 41 72 67 5b 69 5d 2c 27 20 27 29 3d 3d 30 3f  zArg[i],' ')==0?
33480 22 25 7a 20 25 73 22 3a 22 25 7a 20 5c 22 25 73  "%z %s":"%z \"%s
33490 5c 22 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  \"",.           
334a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
334b0 20 20 7a 43 6d 64 2c 20 61 7a 41 72 67 5b 69 5d    zCmd, azArg[i]
334c0 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 78 20 3d  );.    }.    x =
334d0 20 73 79 73 74 65 6d 28 7a 43 6d 64 29 3b 0a 20   system(zCmd);. 
334e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
334f0 7a 43 6d 64 29 3b 0a 20 20 20 20 69 66 28 20 78  zCmd);.    if( x
33500 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74   ) raw_printf(st
33510 64 65 72 72 2c 20 22 53 79 73 74 65 6d 20 63 6f  derr, "System co
33520 6d 6d 61 6e 64 20 72 65 74 75 72 6e 73 20 25 64  mmand returns %d
33530 5c 6e 22 2c 20 78 29 3b 0a 20 20 7d 65 6c 73 65  \n", x);.  }else
33540 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26  ..  if( c=='s' &
33550 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
33560 30 5d 2c 20 22 73 68 6f 77 22 2c 20 6e 29 3d 3d  0], "show", n)==
33570 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  0 ){.    static 
33580 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 42 6f  const char *azBo
33590 6f 6c 5b 5d 20 3d 20 7b 20 22 6f 66 66 22 2c 20  ol[] = { "off", 
335a0 22 6f 6e 22 2c 20 22 74 72 69 67 67 65 72 22 2c  "on", "trigger",
335b0 20 22 66 75 6c 6c 22 7d 3b 0a 20 20 20 20 69 6e   "full"};.    in
335c0 74 20 69 3b 0a 20 20 20 20 69 66 28 20 6e 41 72  t i;.    if( nAr
335d0 67 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 61  g!=1 ){.      ra
335e0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
335f0 20 22 55 73 61 67 65 3a 20 2e 73 68 6f 77 5c 6e   "Usage: .show\n
33600 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  ");.      rc = 1
33610 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74  ;.      goto met
33620 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a  a_command_exit;.
33630 20 20 20 20 7d 0a 20 20 20 20 75 74 66 38 5f 70      }.    utf8_p
33640 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
33650 31 32 2e 31 32 73 3a 20 25 73 5c 6e 22 2c 22 65  12.12s: %s\n","e
33660 63 68 6f 22 2c 0a 20 20 20 20 20 20 20 20 20 20  cho",.          
33670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33680 20 20 20 20 20 20 20 20 61 7a 42 6f 6f 6c 5b 53          azBool[S
33690 68 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20 53  hellHasFlag(p, S
336a0 48 46 4c 47 5f 45 63 68 6f 29 5d 29 3b 0a 20 20  HFLG_Echo)]);.  
336b0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
336c0 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32 73 3a 20  >out, "%12.12s: 
336d0 25 73 5c 6e 22 2c 22 65 71 70 22 2c 20 61 7a 42  %s\n","eqp", azB
336e0 6f 6f 6c 5b 70 2d 3e 61 75 74 6f 45 51 50 26 33  ool[p->autoEQP&3
336f0 5d 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69  ]);.    utf8_pri
33700 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31 32  ntf(p->out, "%12
33710 2e 31 32 73 3a 20 25 73 5c 6e 22 2c 22 65 78 70  .12s: %s\n","exp
33720 6c 61 69 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  lain",.         
33730 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78  p->mode==MODE_Ex
33740 70 6c 61 69 6e 20 3f 20 22 6f 6e 22 20 3a 20 70  plain ? "on" : p
33750 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20 3f 20  ->autoExplain ? 
33760 22 61 75 74 6f 22 20 3a 20 22 6f 66 66 22 29 3b  "auto" : "off");
33770 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
33780 28 70 2d 3e 6f 75 74 2c 22 25 31 32 2e 31 32 73  (p->out,"%12.12s
33790 3a 20 25 73 5c 6e 22 2c 22 68 65 61 64 65 72 73  : %s\n","headers
337a0 22 2c 20 61 7a 42 6f 6f 6c 5b 70 2d 3e 73 68 6f  ", azBool[p->sho
337b0 77 48 65 61 64 65 72 21 3d 30 5d 29 3b 0a 20 20  wHeader!=0]);.  
337c0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
337d0 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32 73 3a 20  >out, "%12.12s: 
337e0 25 73 5c 6e 22 2c 22 6d 6f 64 65 22 2c 20 6d 6f  %s\n","mode", mo
337f0 64 65 44 65 73 63 72 5b 70 2d 3e 6d 6f 64 65 5d  deDescr[p->mode]
33800 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  );.    utf8_prin
33810 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31 32 2e  tf(p->out, "%12.
33820 31 32 73 3a 20 22 2c 20 22 6e 75 6c 6c 76 61 6c  12s: ", "nullval
33830 75 65 22 29 3b 0a 20 20 20 20 20 20 6f 75 74 70  ue");.      outp
33840 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  ut_c_string(p->o
33850 75 74 2c 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65  ut, p->nullValue
33860 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  );.      raw_pri
33870 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22  ntf(p->out, "\n"
33880 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  );.    utf8_prin
33890 74 66 28 70 2d 3e 6f 75 74 2c 22 25 31 32 2e 31  tf(p->out,"%12.1
338a0 32 73 3a 20 25 73 5c 6e 22 2c 22 6f 75 74 70 75  2s: %s\n","outpu
338b0 74 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  t",.            
338c0 73 74 72 6c 65 6e 33 30 28 70 2d 3e 6f 75 74 66  strlen30(p->outf
338d0 69 6c 65 29 20 3f 20 70 2d 3e 6f 75 74 66 69 6c  ile) ? p->outfil
338e0 65 20 3a 20 22 73 74 64 6f 75 74 22 29 3b 0a 20  e : "stdout");. 
338f0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
33900 2d 3e 6f 75 74 2c 22 25 31 32 2e 31 32 73 3a 20  ->out,"%12.12s: 
33910 22 2c 20 22 63 6f 6c 73 65 70 61 72 61 74 6f 72  ", "colseparator
33920 22 29 3b 0a 20 20 20 20 20 20 6f 75 74 70 75 74  ");.      output
33930 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  _c_string(p->out
33940 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  , p->colSeparato
33950 72 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  r);.      raw_pr
33960 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e  intf(p->out, "\n
33970 22 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69  ");.    utf8_pri
33980 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25 31 32 2e  ntf(p->out,"%12.
33990 31 32 73 3a 20 22 2c 20 22 72 6f 77 73 65 70 61  12s: ", "rowsepa
339a0 72 61 74 6f 72 22 29 3b 0a 20 20 20 20 20 20 6f  rator");.      o
339b0 75 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 70  utput_c_string(p
339c0 2d 3e 6f 75 74 2c 20 70 2d 3e 72 6f 77 53 65 70  ->out, p->rowSep
339d0 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 72  arator);.      r
339e0 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
339f0 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 75 74 66  , "\n");.    utf
33a00 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
33a10 20 22 25 31 32 2e 31 32 73 3a 20 25 73 5c 6e 22   "%12.12s: %s\n"
33a20 2c 22 73 74 61 74 73 22 2c 20 61 7a 42 6f 6f 6c  ,"stats", azBool
33a30 5b 70 2d 3e 73 74 61 74 73 4f 6e 21 3d 30 5d 29  [p->statsOn!=0])
33a40 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  ;.    utf8_print
33a50 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31 32 2e 31  f(p->out, "%12.1
33a60 32 73 3a 20 22 2c 20 22 77 69 64 74 68 22 29 3b  2s: ", "width");
33a70 0a 20 20 20 20 66 6f 72 20 28 69 3d 30 3b 69 3c  .    for (i=0;i<
33a80 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28 70  (int)ArraySize(p
33a90 2d 3e 63 6f 6c 57 69 64 74 68 29 20 26 26 20 70  ->colWidth) && p
33aa0 2d 3e 63 6f 6c 57 69 64 74 68 5b 69 5d 20 21 3d  ->colWidth[i] !=
33ab0 20 30 3b 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20   0;i++) {.      
33ac0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
33ad0 74 2c 20 22 25 64 20 22 2c 20 70 2d 3e 63 6f 6c  t, "%d ", p->col
33ae0 57 69 64 74 68 5b 69 5d 29 3b 0a 20 20 20 20 7d  Width[i]);.    }
33af0 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
33b00 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  p->out, "\n");. 
33b10 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
33b20 2d 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32 73 3a  ->out, "%12.12s:
33b30 20 25 73 5c 6e 22 2c 20 22 66 69 6c 65 6e 61 6d   %s\n", "filenam
33b40 65 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  e",.            
33b50 20 20 20 20 70 2d 3e 7a 44 62 46 69 6c 65 6e 61      p->zDbFilena
33b60 6d 65 20 3f 20 70 2d 3e 7a 44 62 46 69 6c 65 6e  me ? p->zDbFilen
33b70 61 6d 65 20 3a 20 22 22 29 3b 0a 20 20 7d 65 6c  ame : "");.  }el
33b80 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 73 27  se..  if( c=='s'
33b90 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
33ba0 67 5b 30 5d 2c 20 22 73 74 61 74 73 22 2c 20 6e  g[0], "stats", n
33bb0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20  )==0 ){.    if( 
33bc0 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20  nArg==2 ){.     
33bd0 20 70 2d 3e 73 74 61 74 73 4f 6e 20 3d 20 62 6f   p->statsOn = bo
33be0 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67  oleanValue(azArg
33bf0 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  [1]);.    }else 
33c00 69 66 28 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20  if( nArg==1 ){. 
33c10 20 20 20 20 20 64 69 73 70 6c 61 79 5f 73 74 61       display_sta
33c20 74 73 28 70 2d 3e 64 62 2c 20 70 2c 20 30 29 3b  ts(p->db, p, 0);
33c30 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
33c40 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
33c50 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73 74  err, "Usage: .st
33c60 61 74 73 20 3f 6f 6e 7c 6f 66 66 3f 5c 6e 22 29  ats ?on|off?\n")
33c70 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
33c80 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
33c90 20 69 66 28 20 28 63 3d 3d 27 74 27 20 26 26 20   if( (c=='t' && 
33ca0 6e 3e 31 20 26 26 20 73 74 72 6e 63 6d 70 28 61  n>1 && strncmp(a
33cb0 7a 41 72 67 5b 30 5d 2c 20 22 74 61 62 6c 65 73  zArg[0], "tables
33cc0 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 20 7c 7c 20  ", n)==0).   || 
33cd0 28 63 3d 3d 27 69 27 20 26 26 20 28 73 74 72 6e  (c=='i' && (strn
33ce0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69  cmp(azArg[0], "i
33cf0 6e 64 69 63 65 73 22 2c 20 6e 29 3d 3d 30 0a 20  ndices", n)==0. 
33d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
33d10 7c 7c 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  || strncmp(azArg
33d20 5b 30 5d 2c 20 22 69 6e 64 65 78 65 73 22 2c 20  [0], "indexes", 
33d30 6e 29 3d 3d 30 29 20 29 0a 20 20 29 7b 0a 20 20  n)==0) ).  ){.  
33d40 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
33d50 70 53 74 6d 74 3b 0a 20 20 20 20 63 68 61 72 20  pStmt;.    char 
33d60 2a 2a 61 7a 52 65 73 75 6c 74 3b 0a 20 20 20 20  **azResult;.    
33d70 69 6e 74 20 6e 52 6f 77 2c 20 6e 41 6c 6c 6f 63  int nRow, nAlloc
33d80 3b 0a 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20  ;.    int ii;.  
33d90 20 20 53 68 65 6c 6c 54 65 78 74 20 73 3b 0a 20    ShellText s;. 
33da0 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 29 3b     initText(&s);
33db0 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
33dc0 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  0);.    rc = sql
33dd0 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
33de0 70 2d 3e 64 62 2c 20 22 50 52 41 47 4d 41 20 64  p->db, "PRAGMA d
33df0 61 74 61 62 61 73 65 5f 6c 69 73 74 22 2c 20 2d  atabase_list", -
33e00 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
33e10 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75     if( rc ) retu
33e20 72 6e 20 73 68 65 6c 6c 44 61 74 61 62 61 73 65  rn shellDatabase
33e30 45 72 72 6f 72 28 70 2d 3e 64 62 29 3b 0a 0a 20  Error(p->db);.. 
33e40 20 20 20 69 66 28 20 6e 41 72 67 3e 32 20 26 26     if( nArg>2 &&
33e50 20 63 3d 3d 27 69 27 20 29 7b 0a 20 20 20 20 20   c=='i' ){.     
33e60 20 2f 2a 20 49 74 20 69 73 20 61 6e 20 68 69 73   /* It is an his
33e70 74 6f 72 69 63 61 6c 20 61 63 63 69 64 65 6e 74  torical accident
33e80 20 74 68 61 74 20 74 68 65 20 2e 69 6e 64 65 78   that the .index
33e90 65 73 20 63 6f 6d 6d 61 6e 64 20 73 68 6f 77 73  es command shows
33ea0 20 61 6e 20 65 72 72 6f 72 0a 20 20 20 20 20 20   an error.      
33eb0 2a 2a 20 77 68 65 6e 20 63 61 6c 6c 65 64 20 77  ** when called w
33ec0 69 74 68 20 74 68 65 20 77 72 6f 6e 67 20 6e 75  ith the wrong nu
33ed0 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
33ee0 73 20 77 68 65 72 65 61 73 20 74 68 65 20 2e 74  s whereas the .t
33ef0 61 62 6c 65 73 0a 20 20 20 20 20 20 2a 2a 20 63  ables.      ** c
33f00 6f 6d 6d 61 6e 64 20 64 6f 65 73 20 6e 6f 74 2e  ommand does not.
33f10 20 2a 2f 0a 20 20 20 20 20 20 72 61 77 5f 70 72   */.      raw_pr
33f20 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
33f30 61 67 65 3a 20 2e 69 6e 64 65 78 65 73 20 3f 4c  age: .indexes ?L
33f40 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e 22 29  IKE-PATTERN?\n")
33f50 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
33f60 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
33f70 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
33f80 20 20 7d 0a 20 20 20 20 66 6f 72 28 69 69 3d 30    }.    for(ii=0
33f90 3b 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ; sqlite3_step(p
33fa0 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Stmt)==SQLITE_RO
33fb0 57 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20  W; ii++){.      
33fc0 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e  const char *zDbN
33fd0 61 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  ame = (const cha
33fe0 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
33ff0 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 31 29  n_text(pStmt, 1)
34000 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 44 62 4e  ;.      if( zDbN
34010 61 6d 65 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ame==0 ) continu
34020 65 3b 0a 20 20 20 20 20 20 69 66 28 20 73 2e 7a  e;.      if( s.z
34030 20 26 26 20 73 2e 7a 5b 30 5d 20 29 20 61 70 70   && s.z[0] ) app
34040 65 6e 64 54 65 78 74 28 26 73 2c 20 22 20 55 4e  endText(&s, " UN
34050 49 4f 4e 20 41 4c 4c 20 22 2c 20 30 29 3b 0a 20  ION ALL ", 0);. 
34060 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
34070 5f 73 74 72 69 63 6d 70 28 7a 44 62 4e 61 6d 65  _stricmp(zDbName
34080 2c 20 22 6d 61 69 6e 22 29 3d 3d 30 20 29 7b 0a  , "main")==0 ){.
34090 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
340a0 78 74 28 26 73 2c 20 22 53 45 4c 45 43 54 20 6e  xt(&s, "SELECT n
340b0 61 6d 65 20 46 52 4f 4d 20 22 2c 20 30 29 3b 0a  ame FROM ", 0);.
340c0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
340d0 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
340e0 26 73 2c 20 22 53 45 4c 45 43 54 20 22 2c 20 30  &s, "SELECT ", 0
340f0 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e  );.        appen
34100 64 54 65 78 74 28 26 73 2c 20 7a 44 62 4e 61 6d  dText(&s, zDbNam
34110 65 2c 20 27 5c 27 27 29 3b 0a 20 20 20 20 20 20  e, '\'');.      
34120 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c    appendText(&s,
34130 20 22 7c 7c 27 2e 27 7c 7c 6e 61 6d 65 20 46 52   "||'.'||name FR
34140 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  OM ", 0);.      
34150 7d 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65  }.      appendTe
34160 78 74 28 26 73 2c 20 7a 44 62 4e 61 6d 65 2c 20  xt(&s, zDbName, 
34170 27 22 27 29 3b 0a 20 20 20 20 20 20 61 70 70 65  '"');.      appe
34180 6e 64 54 65 78 74 28 26 73 2c 20 22 2e 73 71 6c  ndText(&s, ".sql
34190 69 74 65 5f 6d 61 73 74 65 72 20 22 2c 20 30 29  ite_master ", 0)
341a0 3b 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27  ;.      if( c=='
341b0 74 27 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70  t' ){.        ap
341c0 70 65 6e 64 54 65 78 74 28 26 73 2c 22 20 57 48  pendText(&s," WH
341d0 45 52 45 20 74 79 70 65 20 49 4e 20 28 27 74 61  ERE type IN ('ta
341e0 62 6c 65 27 2c 27 76 69 65 77 27 29 22 0a 20 20  ble','view')".  
341f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34200 20 20 20 20 22 20 20 20 41 4e 44 20 6e 61 6d 65      "   AND name
34210 20 4e 4f 54 20 4c 49 4b 45 20 27 73 71 6c 69 74   NOT LIKE 'sqlit
34220 65 5f 25 27 22 0a 20 20 20 20 20 20 20 20 20 20  e_%'".          
34230 20 20 20 20 20 20 20 20 20 20 20 20 22 20 20 20              "   
34240 41 4e 44 20 6e 61 6d 65 20 4c 49 4b 45 20 3f 31  AND name LIKE ?1
34250 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ", 0);.      }el
34260 73 65 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65  se{.        appe
34270 6e 64 54 65 78 74 28 26 73 2c 22 20 57 48 45 52  ndText(&s," WHER
34280 45 20 74 79 70 65 3d 27 69 6e 64 65 78 27 22 0a  E type='index'".
34290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
342a0 20 20 20 20 20 20 22 20 20 20 41 4e 44 20 74 62        "   AND tb
342b0 6c 5f 6e 61 6d 65 20 4c 49 4b 45 20 3f 31 22 2c  l_name LIKE ?1",
342c0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
342d0 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69   }.    rc = sqli
342e0 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
342f0 6d 74 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54  mt);.    appendT
34300 65 78 74 28 26 73 2c 20 22 20 4f 52 44 45 52 20  ext(&s, " ORDER 
34310 42 59 20 31 22 2c 20 30 29 3b 0a 20 20 20 20 72  BY 1", 0);.    r
34320 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
34330 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 73 2e  are_v2(p->db, s.
34340 7a 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  z, -1, &pStmt, 0
34350 29 3b 0a 20 20 20 20 66 72 65 65 54 65 78 74 28  );.    freeText(
34360 26 73 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20  &s);.    if( rc 
34370 29 20 72 65 74 75 72 6e 20 73 68 65 6c 6c 44 61  ) return shellDa
34380 74 61 62 61 73 65 45 72 72 6f 72 28 70 2d 3e 64  tabaseError(p->d
34390 62 29 3b 0a 0a 20 20 20 20 2f 2a 20 52 75 6e 20  b);..    /* Run 
343a0 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
343b0 74 20 70 72 65 70 61 72 65 64 20 62 79 20 74 68  t prepared by th
343c0 65 20 61 62 6f 76 65 20 62 6c 6f 63 6b 2e 20 53  e above block. S
343d0 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73  tore the results
343e0 0a 20 20 20 20 2a 2a 20 61 73 20 61 6e 20 61 72  .    ** as an ar
343f0 72 61 79 20 6f 66 20 6e 75 6c 2d 74 65 72 6d 69  ray of nul-termi
34400 6e 61 74 65 64 20 73 74 72 69 6e 67 73 20 69 6e  nated strings in
34410 20 61 7a 52 65 73 75 6c 74 5b 5d 2e 20 20 2a 2f   azResult[].  */
34420 0a 20 20 20 20 6e 52 6f 77 20 3d 20 6e 41 6c 6c  .    nRow = nAll
34430 6f 63 20 3d 20 30 3b 0a 20 20 20 20 61 7a 52 65  oc = 0;.    azRe
34440 73 75 6c 74 20 3d 20 30 3b 0a 20 20 20 20 69 66  sult = 0;.    if
34450 28 20 6e 41 72 67 3e 31 20 29 7b 0a 20 20 20 20  ( nArg>1 ){.    
34460 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74    sqlite3_bind_t
34470 65 78 74 28 70 53 74 6d 74 2c 20 31 2c 20 61 7a  ext(pStmt, 1, az
34480 41 72 67 5b 31 5d 2c 20 2d 31 2c 20 53 51 4c 49  Arg[1], -1, SQLI
34490 54 45 5f 54 52 41 4e 53 49 45 4e 54 29 3b 0a 20  TE_TRANSIENT);. 
344a0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
344b0 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 74 65 78  sqlite3_bind_tex
344c0 74 28 70 53 74 6d 74 2c 20 31 2c 20 22 25 22 2c  t(pStmt, 1, "%",
344d0 20 2d 31 2c 20 53 51 4c 49 54 45 5f 53 54 41 54   -1, SQLITE_STAT
344e0 49 43 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  IC);.    }.    w
344f0 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74  hile( sqlite3_st
34500 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
34510 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 69  E_ROW ){.      i
34520 66 28 20 6e 52 6f 77 3e 3d 6e 41 6c 6c 6f 63 20  f( nRow>=nAlloc 
34530 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
34540 2a 2a 61 7a 4e 65 77 3b 0a 20 20 20 20 20 20 20  **azNew;.       
34550 20 69 6e 74 20 6e 32 20 3d 20 6e 41 6c 6c 6f 63   int n2 = nAlloc
34560 2a 32 20 2b 20 31 30 3b 0a 20 20 20 20 20 20 20  *2 + 10;.       
34570 20 61 7a 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   azNew = sqlite3
34580 5f 72 65 61 6c 6c 6f 63 36 34 28 61 7a 52 65 73  _realloc64(azRes
34590 75 6c 74 2c 20 73 69 7a 65 6f 66 28 61 7a 52 65  ult, sizeof(azRe
345a0 73 75 6c 74 5b 30 5d 29 2a 6e 32 29 3b 0a 20 20  sult[0])*n2);.  
345b0 20 20 20 20 20 20 69 66 28 20 61 7a 4e 65 77 3d        if( azNew=
345c0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
345d0 72 63 20 3d 20 73 68 65 6c 6c 4e 6f 6d 65 6d 45  rc = shellNomemE
345e0 72 72 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20  rror();.        
345f0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
34600 20 7d 0a 20 20 20 20 20 20 20 20 6e 41 6c 6c 6f   }.        nAllo
34610 63 20 3d 20 6e 32 3b 0a 20 20 20 20 20 20 20 20  c = n2;.        
34620 61 7a 52 65 73 75 6c 74 20 3d 20 61 7a 4e 65 77  azResult = azNew
34630 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
34640 61 7a 52 65 73 75 6c 74 5b 6e 52 6f 77 5d 20 3d  azResult[nRow] =
34650 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
34660 28 22 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 63  ("%s", sqlite3_c
34670 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74  olumn_text(pStmt
34680 2c 20 30 29 29 3b 0a 20 20 20 20 20 20 69 66 28  , 0));.      if(
34690 20 30 3d 3d 61 7a 52 65 73 75 6c 74 5b 6e 52 6f   0==azResult[nRo
346a0 77 5d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63  w] ){.        rc
346b0 20 3d 20 73 68 65 6c 6c 4e 6f 6d 65 6d 45 72 72   = shellNomemErr
346c0 6f 72 28 29 3b 0a 20 20 20 20 20 20 20 20 62 72  or();.        br
346d0 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
346e0 20 20 20 6e 52 6f 77 2b 2b 3b 0a 20 20 20 20 7d     nRow++;.    }
346f0 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
34700 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
34710 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20  !=SQLITE_OK ){. 
34720 20 20 20 20 20 72 63 20 3d 20 73 68 65 6c 6c 44       rc = shellD
34730 61 74 61 62 61 73 65 45 72 72 6f 72 28 70 2d 3e  atabaseError(p->
34740 64 62 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  db);.    }..    
34750 2f 2a 20 50 72 65 74 74 79 2d 70 72 69 6e 74 20  /* Pretty-print 
34760 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20  the contents of 
34770 61 72 72 61 79 20 61 7a 52 65 73 75 6c 74 5b 5d  array azResult[]
34780 20 74 6f 20 74 68 65 20 6f 75 74 70 75 74 20 2a   to the output *
34790 2f 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 30 20  /.    if( rc==0 
347a0 26 26 20 6e 52 6f 77 3e 30 20 29 7b 0a 20 20 20  && nRow>0 ){.   
347b0 20 20 20 69 6e 74 20 6c 65 6e 2c 20 6d 61 78 6c     int len, maxl
347c0 65 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e  en = 0;.      in
347d0 74 20 69 2c 20 6a 3b 0a 20 20 20 20 20 20 69 6e  t i, j;.      in
347e0 74 20 6e 50 72 69 6e 74 43 6f 6c 2c 20 6e 50 72  t nPrintCol, nPr
347f0 69 6e 74 52 6f 77 3b 0a 20 20 20 20 20 20 66 6f  intRow;.      fo
34800 72 28 69 3d 30 3b 20 69 3c 6e 52 6f 77 3b 20 69  r(i=0; i<nRow; i
34810 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6c 65 6e  ++){.        len
34820 20 3d 20 73 74 72 6c 65 6e 33 30 28 61 7a 52 65   = strlen30(azRe
34830 73 75 6c 74 5b 69 5d 29 3b 0a 20 20 20 20 20 20  sult[i]);.      
34840 20 20 69 66 28 20 6c 65 6e 3e 6d 61 78 6c 65 6e    if( len>maxlen
34850 20 29 20 6d 61 78 6c 65 6e 20 3d 20 6c 65 6e 3b   ) maxlen = len;
34860 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
34870 50 72 69 6e 74 43 6f 6c 20 3d 20 38 30 2f 28 6d  PrintCol = 80/(m
34880 61 78 6c 65 6e 2b 32 29 3b 0a 20 20 20 20 20 20  axlen+2);.      
34890 69 66 28 20 6e 50 72 69 6e 74 43 6f 6c 3c 31 20  if( nPrintCol<1 
348a0 29 20 6e 50 72 69 6e 74 43 6f 6c 20 3d 20 31 3b  ) nPrintCol = 1;
348b0 0a 20 20 20 20 20 20 6e 50 72 69 6e 74 52 6f 77  .      nPrintRow
348c0 20 3d 20 28 6e 52 6f 77 20 2b 20 6e 50 72 69 6e   = (nRow + nPrin
348d0 74 43 6f 6c 20 2d 20 31 29 2f 6e 50 72 69 6e 74  tCol - 1)/nPrint
348e0 43 6f 6c 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  Col;.      for(i
348f0 3d 30 3b 20 69 3c 6e 50 72 69 6e 74 52 6f 77 3b  =0; i<nPrintRow;
34900 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 66   i++){.        f
34910 6f 72 28 6a 3d 69 3b 20 6a 3c 6e 52 6f 77 3b 20  or(j=i; j<nRow; 
34920 6a 2b 3d 6e 50 72 69 6e 74 52 6f 77 29 7b 0a 20  j+=nPrintRow){. 
34930 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a           char *z
34940 53 70 20 3d 20 6a 3c 6e 50 72 69 6e 74 52 6f 77  Sp = j<nPrintRow
34950 20 3f 20 22 22 20 3a 20 22 20 20 22 3b 0a 20 20   ? "" : "  ";.  
34960 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
34970 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 25  ntf(p->out, "%s%
34980 2d 2a 73 22 2c 20 7a 53 70 2c 20 6d 61 78 6c 65  -*s", zSp, maxle
34990 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
349a0 20 20 20 20 20 20 20 20 20 61 7a 52 65 73 75 6c           azResul
349b0 74 5b 6a 5d 20 3f 20 61 7a 52 65 73 75 6c 74 5b  t[j] ? azResult[
349c0 6a 5d 3a 22 22 29 3b 0a 20 20 20 20 20 20 20 20  j]:"");.        
349d0 7d 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72  }.        raw_pr
349e0 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e  intf(p->out, "\n
349f0 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ");.      }.    
34a00 7d 0a 0a 20 20 20 20 66 6f 72 28 69 69 3d 30 3b  }..    for(ii=0;
34a10 20 69 69 3c 6e 52 6f 77 3b 20 69 69 2b 2b 29 20   ii<nRow; ii++) 
34a20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 52  sqlite3_free(azR
34a30 65 73 75 6c 74 5b 69 69 5d 29 3b 0a 20 20 20 20  esult[ii]);.    
34a40 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61 7a 52  sqlite3_free(azR
34a50 65 73 75 6c 74 29 3b 0a 20 20 7d 65 6c 73 65 0a  esult);.  }else.
34a60 0a 20 20 2f 2a 20 42 65 67 69 6e 20 72 65 64 69  .  /* Begin redi
34a70 72 65 63 74 69 6e 67 20 6f 75 74 70 75 74 20 74  recting output t
34a80 6f 20 74 68 65 20 66 69 6c 65 20 22 74 65 73 74  o the file "test
34a90 63 61 73 65 2d 6f 75 74 2e 74 78 74 22 20 2a 2f  case-out.txt" */
34aa0 0a 20 20 69 66 28 20 63 3d 3d 27 74 27 20 26 26  .  if( c=='t' &&
34ab0 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 30 5d   strcmp(azArg[0]
34ac0 2c 22 74 65 73 74 63 61 73 65 22 29 3d 3d 30 20  ,"testcase")==0 
34ad0 29 7b 0a 20 20 20 20 6f 75 74 70 75 74 5f 72 65  ){.    output_re
34ae0 73 65 74 28 70 29 3b 0a 20 20 20 20 70 2d 3e 6f  set(p);.    p->o
34af0 75 74 20 3d 20 6f 75 74 70 75 74 5f 66 69 6c 65  ut = output_file
34b00 5f 6f 70 65 6e 28 22 74 65 73 74 63 61 73 65 2d  _open("testcase-
34b10 6f 75 74 2e 74 78 74 22 29 3b 0a 20 20 20 20 69  out.txt");.    i
34b20 66 28 20 70 2d 3e 6f 75 74 3d 3d 30 20 29 7b 0a  f( p->out==0 ){.
34b30 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
34b40 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
34b50 20 63 61 6e 6e 6f 74 20 6f 70 65 6e 20 27 74 65   cannot open 'te
34b60 73 74 63 61 73 65 2d 6f 75 74 2e 74 78 74 27 5c  stcase-out.txt'\
34b70 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  n");.    }.    i
34b80 66 28 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20 20  f( nArg>=2 ){.  
34b90 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
34ba0 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 7a  intf(sizeof(p->z
34bb0 54 65 73 74 63 61 73 65 29 2c 20 70 2d 3e 7a 54  Testcase), p->zT
34bc0 65 73 74 63 61 73 65 2c 20 22 25 73 22 2c 20 61  estcase, "%s", a
34bd0 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d 65  zArg[1]);.    }e
34be0 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
34bf0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
34c00 6f 66 28 70 2d 3e 7a 54 65 73 74 63 61 73 65 29  of(p->zTestcase)
34c10 2c 20 70 2d 3e 7a 54 65 73 74 63 61 73 65 2c 20  , p->zTestcase, 
34c20 22 3f 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  "?");.    }.  }e
34c30 6c 73 65 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  lse..#ifndef SQL
34c40 49 54 45 5f 55 4e 54 45 53 54 41 42 4c 45 0a 20  ITE_UNTESTABLE. 
34c50 20 69 66 28 20 63 3d 3d 27 74 27 20 26 26 20 6e   if( c=='t' && n
34c60 3e 3d 38 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=8 && strncmp(a
34c70 7a 41 72 67 5b 30 5d 2c 20 22 74 65 73 74 63 74  zArg[0], "testct
34c80 72 6c 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  rl", n)==0 ){.  
34c90 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73    static const s
34ca0 74 72 75 63 74 20 7b 0a 20 20 20 20 20 20 20 63  truct {.       c
34cb0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 74 72 6c  onst char *zCtrl
34cc0 4e 61 6d 65 3b 20 20 20 2f 2a 20 4e 61 6d 65 20  Name;   /* Name 
34cd0 6f 66 20 61 20 74 65 73 74 2d 63 6f 6e 74 72 6f  of a test-contro
34ce0 6c 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  l option */.    
34cf0 20 20 20 69 6e 74 20 63 74 72 6c 43 6f 64 65 3b     int ctrlCode;
34d00 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
34d10 6e 74 65 67 65 72 20 63 6f 64 65 20 66 6f 72 20  nteger code for 
34d20 74 68 61 74 20 6f 70 74 69 6f 6e 20 2a 2f 0a 20  that option */. 
34d30 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
34d40 20 2a 7a 55 73 61 67 65 3b 20 20 20 20 20 20 2f   *zUsage;      /
34d50 2a 20 55 73 61 67 65 20 6e 6f 74 65 73 20 2a 2f  * Usage notes */
34d60 0a 20 20 20 20 7d 20 61 43 74 72 6c 5b 5d 20 3d  .    } aCtrl[] =
34d70 20 7b 0a 20 20 20 20 20 20 7b 20 22 61 6c 77 61   {.      { "alwa
34d80 79 73 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  ys",            
34d90 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
34da0 5f 41 4c 57 41 59 53 2c 20 20 20 20 20 20 20 20  _ALWAYS,        
34db0 22 42 4f 4f 4c 45 41 4e 22 20 20 20 20 20 20 20  "BOOLEAN"       
34dc0 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
34dd0 22 61 73 73 65 72 74 22 2c 20 20 20 20 20 20 20  "assert",       
34de0 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53        SQLITE_TES
34df0 54 43 54 52 4c 5f 41 53 53 45 52 54 2c 20 20 20  TCTRL_ASSERT,   
34e00 20 20 20 20 20 22 42 4f 4f 4c 45 41 4e 22 20 20       "BOOLEAN"  
34e10 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
34e20 20 2f 2a 7b 20 22 62 65 6e 69 67 6e 5f 6d 61 6c   /*{ "benign_mal
34e30 6c 6f 63 5f 68 6f 6f 6b 73 22 2c 53 51 4c 49 54  loc_hooks",SQLIT
34e40 45 5f 54 45 53 54 43 54 52 4c 5f 42 45 4e 49 47  E_TESTCTRL_BENIG
34e50 4e 5f 4d 41 4c 4c 4f 43 5f 48 4f 4f 4b 53 2c 20  N_MALLOC_HOOKS, 
34e60 22 22 20 20 20 20 20 20 20 20 20 20 7d 2c 2a 2f  ""          },*/
34e70 0a 20 20 20 20 2f 2a 7b 20 22 62 69 74 76 65 63  .    /*{ "bitvec
34e80 5f 74 65 73 74 22 2c 20 20 20 20 20 20 20 20 53  _test",        S
34e90 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42  QLITE_TESTCTRL_B
34ea0 49 54 56 45 43 5f 54 45 53 54 2c 20 20 20 22 22  ITVEC_TEST,   ""
34eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34ec0 7d 2c 2a 2f 0a 20 20 20 20 20 20 7b 20 22 62 79  },*/.      { "by
34ed0 74 65 6f 72 64 65 72 22 2c 20 20 20 20 20 20 20  teorder",       
34ee0 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54     SQLITE_TESTCT
34ef0 52 4c 5f 42 59 54 45 4f 52 44 45 52 2c 20 20 20  RL_BYTEORDER,   
34f00 20 20 22 22 20 20 20 20 20 20 20 20 20 20 20 20    ""            
34f10 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a         },.    /*
34f20 7b 20 22 66 61 75 6c 74 5f 69 6e 73 74 61 6c 6c  { "fault_install
34f30 22 2c 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54  ",      SQLITE_T
34f40 45 53 54 43 54 52 4c 5f 46 41 55 4c 54 5f 49 4e  ESTCTRL_FAULT_IN
34f50 53 54 41 4c 4c 2c 20 22 22 20 20 20 20 20 20 20  STALL, ""       
34f60 20 20 20 20 20 20 20 20 20 7d 2c 20 2a 2f 0a 20           }, */. 
34f70 20 20 20 20 20 7b 20 22 69 6d 70 6f 73 74 65 72       { "imposter
34f80 22 2c 20 20 20 20 20 20 20 20 20 20 20 53 51 4c  ",           SQL
34f90 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50  ITE_TESTCTRL_IMP
34fa0 4f 53 54 45 52 2c 20 20 20 22 53 43 48 45 4d 41  OSTER,   "SCHEMA
34fb0 20 4f 4e 2f 4f 46 46 20 52 4f 4f 54 50 41 47 45   ON/OFF ROOTPAGE
34fc0 22 7d 2c 0a 23 69 66 64 65 66 20 53 51 4c 49 54  "},.#ifdef SQLIT
34fd0 45 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20 20 20 20  E_N_KEYWORD.    
34fe0 20 20 7b 20 22 69 73 6b 65 79 77 6f 72 64 22 2c    { "iskeyword",
34ff0 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
35000 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45 59 57  _TESTCTRL_ISKEYW
35010 4f 52 44 2c 20 20 20 20 20 22 49 44 45 4e 54 49  ORD,     "IDENTI
35020 46 49 45 52 22 20 20 20 20 20 20 20 20 20 7d 2c  FIER"         },
35030 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 20  .#endif.      { 
35040 22 6c 6f 63 61 6c 74 69 6d 65 5f 66 61 75 6c 74  "localtime_fault
35050 22 2c 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53  ",    SQLITE_TES
35060 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d 45 5f  TCTRL_LOCALTIME_
35070 46 41 55 4c 54 2c 22 42 4f 4f 4c 45 41 4e 22 20  FAULT,"BOOLEAN" 
35080 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
35090 20 20 20 7b 20 22 6e 65 76 65 72 5f 63 6f 72 72     { "never_corr
350a0 75 70 74 22 2c 20 20 20 20 20 20 53 51 4c 49 54  upt",      SQLIT
350b0 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56 45 52  E_TESTCTRL_NEVER
350c0 5f 43 4f 52 52 55 50 54 2c 20 22 42 4f 4f 4c 45  _CORRUPT, "BOOLE
350d0 41 4e 22 20 20 20 20 20 20 20 20 20 20 20 20 7d  AN"            }
350e0 2c 0a 20 20 20 20 20 20 7b 20 22 6f 70 74 69 6d  ,.      { "optim
350f0 69 7a 61 74 69 6f 6e 73 22 2c 20 20 20 20 20 20  izations",      
35100 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
35110 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 2c 20 22  OPTIMIZATIONS, "
35120 44 49 53 41 42 4c 45 2d 4d 41 53 4b 22 20 20 20  DISABLE-MASK"   
35130 20 20 20 20 7d 2c 0a 23 69 66 64 65 66 20 59 59      },.#ifdef YY
35140 43 4f 56 45 52 41 47 45 0a 20 20 20 20 20 20 7b  COVERAGE.      {
35150 20 22 70 61 72 73 65 72 5f 63 6f 76 65 72 61 67   "parser_coverag
35160 65 22 2c 20 20 20 20 53 51 4c 49 54 45 5f 54 45  e",    SQLITE_TE
35170 53 54 43 54 52 4c 5f 50 41 52 53 45 52 5f 43 4f  STCTRL_PARSER_CO
35180 56 45 52 41 47 45 2c 20 22 22 20 20 20 20 20 20  VERAGE, ""      
35190 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 23 65             },.#e
351a0 6e 64 69 66 0a 20 20 20 20 20 20 7b 20 22 70 65  ndif.      { "pe
351b0 6e 64 69 6e 67 5f 62 79 74 65 22 2c 20 20 20 20  nding_byte",    
351c0 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54     SQLITE_TESTCT
351d0 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 2c  RL_PENDING_BYTE,
351e0 20 20 22 4f 46 46 53 45 54 20 20 22 20 20 20 20    "OFFSET  "    
351f0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
35200 7b 20 22 70 72 6e 67 5f 72 65 73 65 74 22 2c 20  { "prng_reset", 
35210 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54          SQLITE_T
35220 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53  ESTCTRL_PRNG_RES
35230 45 54 2c 20 20 20 20 22 22 20 20 20 20 20 20 20  ET,    ""       
35240 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
35250 20 20 20 20 20 7b 20 22 70 72 6e 67 5f 72 65 73       { "prng_res
35260 74 6f 72 65 22 2c 20 20 20 20 20 20 20 53 51 4c  tore",       SQL
35270 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
35280 47 5f 52 45 53 54 4f 52 45 2c 20 20 22 22 20 20  G_RESTORE,  ""  
35290 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
352a0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 70 72 6e   },.      { "prn
352b0 67 5f 73 61 76 65 22 2c 20 20 20 20 20 20 20 20  g_save",        
352c0 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52    SQLITE_TESTCTR
352d0 4c 5f 50 52 4e 47 5f 53 41 56 45 2c 20 20 20 20  L_PRNG_SAVE,    
352e0 20 22 22 20 20 20 20 20 20 20 20 20 20 20 20 20   ""             
352f0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
35300 20 22 72 65 73 65 72 76 65 22 2c 20 20 20 20 20   "reserve",     
35310 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45         SQLITE_TE
35320 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45 2c 20  STCTRL_RESERVE, 
35330 20 20 20 20 20 20 22 42 59 54 45 53 2d 4f 46 2d        "BYTES-OF-
35340 52 45 53 45 52 56 45 22 20 20 20 7d 2c 0a 20 20  RESERVE"   },.  
35350 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 74 65 73    };.    int tes
35360 74 63 74 72 6c 20 3d 20 2d 31 3b 0a 20 20 20 20  tctrl = -1;.    
35370 69 6e 74 20 69 43 74 72 6c 20 3d 20 2d 31 3b 0a  int iCtrl = -1;.
35380 20 20 20 20 69 6e 74 20 72 63 32 20 3d 20 30 3b      int rc2 = 0;
35390 20 20 20 20 2f 2a 20 30 3a 20 75 73 61 67 65 2e      /* 0: usage.
353a0 20 20 31 3a 20 25 64 20 20 32 3a 20 25 78 20 20    1: %d  2: %x  
353b0 33 3a 20 6e 6f 2d 6f 75 74 70 75 74 20 2a 2f 0a  3: no-output */.
353c0 20 20 20 20 69 6e 74 20 69 73 4f 6b 20 3d 20 30      int isOk = 0
353d0 3b 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 32 3b  ;.    int i, n2;
353e0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
353f0 2a 7a 43 6d 64 20 3d 20 30 3b 0a 0a 20 20 20 20  *zCmd = 0;..    
35400 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
35410 20 20 20 7a 43 6d 64 20 3d 20 6e 41 72 67 3e 3d     zCmd = nArg>=
35420 32 20 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20 22  2 ? azArg[1] : "
35430 68 65 6c 70 22 3b 0a 0a 20 20 20 20 2f 2a 20 54  help";..    /* T
35440 68 65 20 61 72 67 75 6d 65 6e 74 20 63 61 6e 20  he argument can 
35450 6f 70 74 69 6f 6e 61 6c 6c 79 20 62 65 67 69 6e  optionally begin
35460 20 77 69 74 68 20 22 2d 22 20 6f 72 20 22 2d 2d   with "-" or "--
35470 22 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 43 6d  " */.    if( zCm
35480 64 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 7a 43 6d  d[0]=='-' && zCm
35490 64 5b 31 5d 20 29 7b 0a 20 20 20 20 20 20 7a 43  d[1] ){.      zC
354a0 6d 64 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20  md++;.      if( 
354b0 7a 43 6d 64 5b 30 5d 3d 3d 27 2d 27 20 26 26 20  zCmd[0]=='-' && 
354c0 7a 43 6d 64 5b 31 5d 20 29 20 7a 43 6d 64 2b 2b  zCmd[1] ) zCmd++
354d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
354e0 2d 2d 68 65 6c 70 20 6c 69 73 74 73 20 61 6c 6c  --help lists all
354f0 20 74 65 73 74 2d 63 6f 6e 74 72 6f 6c 73 20 2a   test-controls *
35500 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  /.    if( strcmp
35510 28 7a 43 6d 64 2c 22 68 65 6c 70 22 29 3d 3d 30  (zCmd,"help")==0
35520 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70   ){.      utf8_p
35530 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 41  rintf(p->out, "A
35540 76 61 69 6c 61 62 6c 65 20 74 65 73 74 2d 63 6f  vailable test-co
35550 6e 74 72 6f 6c 73 3a 5c 6e 22 29 3b 0a 20 20 20  ntrols:\n");.   
35560 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72     for(i=0; i<Ar
35570 72 61 79 53 69 7a 65 28 61 43 74 72 6c 29 3b 20  raySize(aCtrl); 
35580 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 75 74  i++){.        ut
35590 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
355a0 2c 20 22 20 20 2e 74 65 73 74 63 74 72 6c 20 25  , "  .testctrl %
355b0 73 20 25 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20  s %s\n",.       
355c0 20 20 20 20 20 20 20 20 20 20 20 20 20 61 43 74               aCt
355d0 72 6c 5b 69 5d 2e 7a 43 74 72 6c 4e 61 6d 65 2c  rl[i].zCtrlName,
355e0 20 61 43 74 72 6c 5b 69 5d 2e 7a 55 73 61 67 65   aCtrl[i].zUsage
355f0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
35600 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67   rc = 1;.      g
35610 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
35620 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 0a 20 20  _exit;.    }..  
35630 20 20 2f 2a 20 63 6f 6e 76 65 72 74 20 74 65 73    /* convert tes
35640 74 63 74 72 6c 20 74 65 78 74 20 6f 70 74 69 6f  tctrl text optio
35650 6e 20 74 6f 20 76 61 6c 75 65 2e 20 61 6c 6c 6f  n to value. allo
35660 77 20 61 6e 79 20 75 6e 69 71 75 65 20 70 72 65  w any unique pre
35670 66 69 78 0a 20 20 20 20 2a 2a 20 6f 66 20 74 68  fix.    ** of th
35680 65 20 6f 70 74 69 6f 6e 20 6e 61 6d 65 2c 20 6f  e option name, o
35690 72 20 61 20 6e 75 6d 65 72 69 63 61 6c 20 76 61  r a numerical va
356a0 6c 75 65 2e 20 2a 2f 0a 20 20 20 20 6e 32 20 3d  lue. */.    n2 =
356b0 20 73 74 72 6c 65 6e 33 30 28 7a 43 6d 64 29 3b   strlen30(zCmd);
356c0 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
356d0 41 72 72 61 79 53 69 7a 65 28 61 43 74 72 6c 29  ArraySize(aCtrl)
356e0 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
356f0 28 20 73 74 72 6e 63 6d 70 28 7a 43 6d 64 2c 20  ( strncmp(zCmd, 
35700 61 43 74 72 6c 5b 69 5d 2e 7a 43 74 72 6c 4e 61  aCtrl[i].zCtrlNa
35710 6d 65 2c 20 6e 32 29 3d 3d 30 20 29 7b 0a 20 20  me, n2)==0 ){.  
35720 20 20 20 20 20 20 69 66 28 20 74 65 73 74 63 74        if( testct
35730 72 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20  rl<0 ){.        
35740 20 20 74 65 73 74 63 74 72 6c 20 3d 20 61 43 74    testctrl = aCt
35750 72 6c 5b 69 5d 2e 63 74 72 6c 43 6f 64 65 3b 0a  rl[i].ctrlCode;.
35760 20 20 20 20 20 20 20 20 20 20 69 43 74 72 6c 20            iCtrl 
35770 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = i;.        }el
35780 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74  se{.          ut
35790 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
357a0 2c 20 22 45 72 72 6f 72 3a 20 61 6d 62 69 67 75  , "Error: ambigu
357b0 6f 75 73 20 74 65 73 74 2d 63 6f 6e 74 72 6f 6c  ous test-control
357c0 3a 20 5c 22 25 73 5c 22 5c 6e 22 0a 20 20 20 20  : \"%s\"\n".    
357d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
357e0 20 20 20 20 20 20 20 20 20 20 22 55 73 65 20 5c            "Use \
357f0 22 2e 74 65 73 74 63 74 72 6c 20 2d 2d 68 65 6c  ".testctrl --hel
35800 70 5c 22 20 66 6f 72 20 68 65 6c 70 5c 6e 22 2c  p\" for help\n",
35810 20 7a 43 6d 64 29 3b 0a 20 20 20 20 20 20 20 20   zCmd);.        
35820 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
35830 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
35840 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
35850 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
35860 20 20 7d 0a 20 20 20 20 69 66 28 20 74 65 73 74    }.    if( test
35870 63 74 72 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  ctrl<0 ){.      
35880 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
35890 72 72 2c 22 45 72 72 6f 72 3a 20 75 6e 6b 6e 6f  rr,"Error: unkno
358a0 77 6e 20 74 65 73 74 2d 63 6f 6e 74 72 6f 6c 3a  wn test-control:
358b0 20 25 73 5c 6e 22 0a 20 20 20 20 20 20 20 20 20   %s\n".         
358c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
358d0 22 55 73 65 20 5c 22 2e 74 65 73 74 63 74 72 6c  "Use \".testctrl
358e0 20 2d 2d 68 65 6c 70 5c 22 20 66 6f 72 20 68 65   --help\" for he
358f0 6c 70 5c 6e 22 2c 20 7a 43 6d 64 29 3b 0a 20 20  lp\n", zCmd);.  
35900 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
35910 77 69 74 63 68 28 74 65 73 74 63 74 72 6c 29 7b  witch(testctrl){
35920 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 71 6c  ..        /* sql
35930 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f  ite3_test_contro
35940 6c 28 69 6e 74 2c 20 64 62 2c 20 69 6e 74 29 20  l(int, db, int) 
35950 2a 2f 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  */.        case 
35960 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
35970 4f 50 54 49 4d 49 5a 41 54 49 4f 4e 53 3a 0a 20  OPTIMIZATIONS:. 
35980 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
35990 54 45 5f 54 45 53 54 43 54 52 4c 5f 52 45 53 45  TE_TESTCTRL_RESE
359a0 52 56 45 3a 0a 20 20 20 20 20 20 20 20 20 20 69  RVE:.          i
359b0 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20 20  f( nArg==3 ){.  
359c0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70            int op
359d0 74 20 3d 20 28 69 6e 74 29 73 74 72 74 6f 6c 28  t = (int)strtol(
359e0 61 7a 41 72 67 5b 32 5d 2c 20 30 2c 20 30 29 3b  azArg[2], 0, 0);
359f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 32  .            rc2
35a00 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f   = sqlite3_test_
35a10 63 6f 6e 74 72 6f 6c 28 74 65 73 74 63 74 72 6c  control(testctrl
35a20 2c 20 70 2d 3e 64 62 2c 20 6f 70 74 29 3b 0a 20  , p->db, opt);. 
35a30 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 6b 20             isOk 
35a40 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 3;.          }
35a50 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
35a60 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 71  ;..        /* sq
35a70 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
35a80 6f 6c 28 69 6e 74 29 20 2a 2f 0a 20 20 20 20 20  ol(int) */.     
35a90 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
35aa0 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 53 41 56  ESTCTRL_PRNG_SAV
35ab0 45 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  E:.        case 
35ac0 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f  SQLITE_TESTCTRL_
35ad0 50 52 4e 47 5f 52 45 53 54 4f 52 45 3a 0a 20 20  PRNG_RESTORE:.  
35ae0 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
35af0 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f  E_TESTCTRL_PRNG_
35b00 52 45 53 45 54 3a 0a 20 20 20 20 20 20 20 20 63  RESET:.        c
35b10 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
35b20 54 52 4c 5f 42 59 54 45 4f 52 44 45 52 3a 0a 20  TRL_BYTEORDER:. 
35b30 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 41 72           if( nAr
35b40 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20  g==2 ){.        
35b50 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
35b60 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 74  3_test_control(t
35b70 65 73 74 63 74 72 6c 29 3b 0a 20 20 20 20 20 20  estctrl);.      
35b80 20 20 20 20 20 20 69 73 4f 6b 20 3d 20 74 65 73        isOk = tes
35b90 74 63 74 72 6c 3d 3d 53 51 4c 49 54 45 5f 54 45  tctrl==SQLITE_TE
35ba0 53 54 43 54 52 4c 5f 42 59 54 45 4f 52 44 45 52  STCTRL_BYTEORDER
35bb0 20 3f 20 31 20 3a 20 33 3b 0a 20 20 20 20 20 20   ? 1 : 3;.      
35bc0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
35bd0 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20  break;..        
35be0 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f  /* sqlite3_test_
35bf0 63 6f 6e 74 72 6f 6c 28 69 6e 74 2c 20 75 69 6e  control(int, uin
35c00 74 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 61  t) */.        ca
35c10 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
35c20 52 4c 5f 50 45 4e 44 49 4e 47 5f 42 59 54 45 3a  RL_PENDING_BYTE:
35c30 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
35c40 41 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20  Arg==3 ){.      
35c50 20 20 20 20 20 20 75 6e 73 69 67 6e 65 64 20 69        unsigned i
35c60 6e 74 20 6f 70 74 20 3d 20 28 75 6e 73 69 67 6e  nt opt = (unsign
35c70 65 64 20 69 6e 74 29 69 6e 74 65 67 65 72 56 61  ed int)integerVa
35c80 6c 75 65 28 61 7a 41 72 67 5b 32 5d 29 3b 0a 20  lue(azArg[2]);. 
35c90 20 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d             rc2 =
35ca0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
35cb0 6e 74 72 6f 6c 28 74 65 73 74 63 74 72 6c 2c 20  ntrol(testctrl, 
35cc0 6f 70 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  opt);.          
35cd0 20 20 69 73 4f 6b 20 3d 20 33 3b 0a 20 20 20 20    isOk = 3;.    
35ce0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
35cf0 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20    break;..      
35d00 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74 65 73    /* sqlite3_tes
35d10 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 2c 20 69  t_control(int, i
35d20 6e 74 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  nt) */.        c
35d30 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
35d40 54 52 4c 5f 41 53 53 45 52 54 3a 0a 20 20 20 20  TRL_ASSERT:.    
35d50 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
35d60 54 45 53 54 43 54 52 4c 5f 41 4c 57 41 59 53 3a  TESTCTRL_ALWAYS:
35d70 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
35d80 41 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20  Arg==3 ){.      
35d90 20 20 20 20 20 20 69 6e 74 20 6f 70 74 20 3d 20        int opt = 
35da0 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41  booleanValue(azA
35db0 72 67 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[2]);.        
35dc0 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
35dd0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 74  3_test_control(t
35de0 65 73 74 63 74 72 6c 2c 20 6f 70 74 29 3b 0a 20  estctrl, opt);. 
35df0 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 6b 20             isOk 
35e00 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
35e10 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
35e20 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 71  ;..        /* sq
35e30 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
35e40 6f 6c 28 69 6e 74 2c 20 69 6e 74 29 20 2a 2f 0a  ol(int, int) */.
35e50 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
35e60 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 4c 4f 43  ITE_TESTCTRL_LOC
35e70 41 4c 54 49 4d 45 5f 46 41 55 4c 54 3a 0a 20 20  ALTIME_FAULT:.  
35e80 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
35e90 45 5f 54 45 53 54 43 54 52 4c 5f 4e 45 56 45 52  E_TESTCTRL_NEVER
35ea0 5f 43 4f 52 52 55 50 54 3a 0a 20 20 20 20 20 20  _CORRUPT:.      
35eb0 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 33 20      if( nArg==3 
35ec0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
35ed0 6e 74 20 6f 70 74 20 3d 20 62 6f 6f 6c 65 61 6e  nt opt = boolean
35ee0 56 61 6c 75 65 28 61 7a 41 72 67 5b 32 5d 29 3b  Value(azArg[2]);
35ef0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 63 32  .            rc2
35f00 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f   = sqlite3_test_
35f10 63 6f 6e 74 72 6f 6c 28 74 65 73 74 63 74 72 6c  control(testctrl
35f20 2c 20 6f 70 74 29 3b 0a 20 20 20 20 20 20 20 20  , opt);.        
35f30 20 20 20 20 69 73 4f 6b 20 3d 20 33 3b 0a 20 20      isOk = 3;.  
35f40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
35f50 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20      break;..    
35f60 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f 74      /* sqlite3_t
35f70 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74 2c  est_control(int,
35f80 20 63 68 61 72 20 2a 29 20 2a 2f 0a 23 69 66 64   char *) */.#ifd
35f90 65 66 20 53 51 4c 49 54 45 5f 4e 5f 4b 45 59 57  ef SQLITE_N_KEYW
35fa0 4f 52 44 0a 20 20 20 20 20 20 20 20 63 61 73 65  ORD.        case
35fb0 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
35fc0 5f 49 53 4b 45 59 57 4f 52 44 3a 0a 20 20 20 20  _ISKEYWORD:.    
35fd0 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d        if( nArg==
35fe0 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  3 ){.           
35ff0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 6f 70 74   const char *opt
36000 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 20 20 20   = azArg[2];.   
36010 20 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73           rc2 = s
36020 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74  qlite3_test_cont
36030 72 6f 6c 28 74 65 73 74 63 74 72 6c 2c 20 6f 70  rol(testctrl, op
36040 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
36050 69 73 4f 6b 20 3d 20 31 3b 0a 20 20 20 20 20 20  isOk = 1;.      
36060 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
36070 62 72 65 61 6b 3b 0a 23 65 6e 64 69 66 0a 0a 20  break;.#endif.. 
36080 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
36090 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50 4f  TE_TESTCTRL_IMPO
360a0 53 54 45 52 3a 0a 20 20 20 20 20 20 20 20 20 20  STER:.          
360b0 69 66 28 20 6e 41 72 67 3d 3d 35 20 29 7b 0a 20  if( nArg==5 ){. 
360c0 20 20 20 20 20 20 20 20 20 20 20 72 63 32 20 3d             rc2 =
360d0 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f   sqlite3_test_co
360e0 6e 74 72 6f 6c 28 74 65 73 74 63 74 72 6c 2c 20  ntrol(testctrl, 
360f0 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20  p->db,.         
36100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36110 20 61 7a 41 72 67 5b 32 5d 2c 0a 20 20 20 20 20   azArg[2],.     
36120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36130 20 20 20 20 20 69 6e 74 65 67 65 72 56 61 6c 75       integerValu
36140 65 28 61 7a 41 72 67 5b 33 5d 29 2c 0a 20 20 20  e(azArg[3]),.   
36150 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36160 20 20 20 20 20 20 20 69 6e 74 65 67 65 72 56 61         integerVa
36170 6c 75 65 28 61 7a 41 72 67 5b 34 5d 29 29 3b 0a  lue(azArg[4]));.
36180 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 6b              isOk
36190 20 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20   = 3;.          
361a0 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  }.          brea
361b0 6b 3b 0a 0a 23 69 66 64 65 66 20 59 59 43 4f 56  k;..#ifdef YYCOV
361c0 45 52 41 47 45 0a 20 20 20 20 20 20 20 20 63 61  ERAGE.        ca
361d0 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
361e0 52 4c 5f 50 41 52 53 45 52 5f 43 4f 56 45 52 41  RL_PARSER_COVERA
361f0 47 45 3a 0a 20 20 20 20 20 20 20 20 20 20 69 66  GE:.          if
36200 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20  ( nArg==2 ){.   
36210 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
36220 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 74 65  _test_control(te
36230 73 74 63 74 72 6c 2c 20 70 2d 3e 6f 75 74 29 3b  stctrl, p->out);
36240 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f  .            isO
36250 6b 20 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20  k = 3;.         
36260 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
36270 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
36280 69 73 4f 6b 3d 3d 30 20 26 26 20 69 43 74 72 6c  isOk==0 && iCtrl
36290 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66  >=0 ){.      utf
362a0 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
362b0 20 22 55 73 61 67 65 3a 20 2e 74 65 73 74 63 74   "Usage: .testct
362c0 72 6c 20 25 73 20 25 73 5c 6e 22 2c 20 7a 43 6d  rl %s %s\n", zCm
362d0 64 2c 20 61 43 74 72 6c 5b 69 43 74 72 6c 5d 2e  d, aCtrl[iCtrl].
362e0 7a 55 73 61 67 65 29 3b 0a 20 20 20 20 20 20 72  zUsage);.      r
362f0 63 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65  c = 1;.    }else
36300 20 69 66 28 20 69 73 4f 6b 3d 3d 31 20 29 7b 0a   if( isOk==1 ){.
36310 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
36320 28 70 2d 3e 6f 75 74 2c 20 22 25 64 5c 6e 22 2c  (p->out, "%d\n",
36330 20 72 63 32 29 3b 0a 20 20 20 20 7d 65 6c 73 65   rc2);.    }else
36340 20 69 66 28 20 69 73 4f 6b 3d 3d 32 20 29 7b 0a   if( isOk==2 ){.
36350 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
36360 28 70 2d 3e 6f 75 74 2c 20 22 30 78 25 30 38 78  (p->out, "0x%08x
36370 5c 6e 22 2c 20 72 63 32 29 3b 0a 20 20 20 20 7d  \n", rc2);.    }
36380 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20  .  }else.#endif 
36390 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
363a0 54 45 5f 55 4e 54 45 53 54 41 42 4c 45 29 20 2a  TE_UNTESTABLE) *
363b0 2f 0a 0a 20 20 69 66 28 20 63 3d 3d 27 74 27 20  /..  if( c=='t' 
363c0 26 26 20 6e 3e 34 20 26 26 20 73 74 72 6e 63 6d  && n>4 && strncm
363d0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 74 69 6d  p(azArg[0], "tim
363e0 65 6f 75 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  eout", n)==0 ){.
363f0 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
36400 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 62  );.    sqlite3_b
36410 75 73 79 5f 74 69 6d 65 6f 75 74 28 70 2d 3e 64  usy_timeout(p->d
36420 62 2c 20 6e 41 72 67 3e 3d 32 20 3f 20 28 69 6e  b, nArg>=2 ? (in
36430 74 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61  t)integerValue(a
36440 7a 41 72 67 5b 31 5d 29 20 3a 20 30 29 3b 0a 20  zArg[1]) : 0);. 
36450 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
36460 3d 27 74 27 20 26 26 20 6e 3e 3d 35 20 26 26 20  ='t' && n>=5 && 
36470 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
36480 2c 20 22 74 69 6d 65 72 22 2c 20 6e 29 3d 3d 30  , "timer", n)==0
36490 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
364a0 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 65 6e 61  ==2 ){.      ena
364b0 62 6c 65 54 69 6d 65 72 20 3d 20 62 6f 6f 6c 65  bleTimer = boole
364c0 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d  anValue(azArg[1]
364d0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 65 6e 61  );.      if( ena
364e0 62 6c 65 54 69 6d 65 72 20 26 26 20 21 48 41 53  bleTimer && !HAS
364f0 5f 54 49 4d 45 52 20 29 7b 0a 20 20 20 20 20 20  _TIMER ){.      
36500 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
36510 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 74 69 6d  err, "Error: tim
36520 65 72 20 6e 6f 74 20 61 76 61 69 6c 61 62 6c 65  er not available
36530 20 6f 6e 20 74 68 69 73 20 73 79 73 74 65 6d 2e   on this system.
36540 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 65 6e  \n");.        en
36550 61 62 6c 65 54 69 6d 65 72 20 3d 20 30 3b 0a 20  ableTimer = 0;. 
36560 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65       }.    }else
36570 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
36580 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
36590 65 3a 20 2e 74 69 6d 65 72 20 6f 6e 7c 6f 66 66  e: .timer on|off
365a0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
365b0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73   1;.    }.  }els
365c0 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 74 27 20  e..  if( c=='t' 
365d0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
365e0 5b 30 5d 2c 20 22 74 72 61 63 65 22 2c 20 6e 29  [0], "trace", n)
365f0 3d 3d 30 20 29 7b 0a 20 20 20 20 6f 70 65 6e 5f  ==0 ){.    open_
36600 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 69 66  db(p, 0);.    if
36610 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20 20  ( nArg!=2 ){.   
36620 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
36630 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 74  derr, "Usage: .t
36640 72 61 63 65 20 46 49 4c 45 7c 6f 66 66 5c 6e 22  race FILE|off\n"
36650 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
36660 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61  .      goto meta
36670 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
36680 20 20 20 7d 0a 20 20 20 20 6f 75 74 70 75 74 5f     }.    output_
36690 66 69 6c 65 5f 63 6c 6f 73 65 28 70 2d 3e 74 72  file_close(p->tr
366a0 61 63 65 4f 75 74 29 3b 0a 20 20 20 20 70 2d 3e  aceOut);.    p->
366b0 74 72 61 63 65 4f 75 74 20 3d 20 6f 75 74 70 75  traceOut = outpu
366c0 74 5f 66 69 6c 65 5f 6f 70 65 6e 28 61 7a 41 72  t_file_open(azAr
366d0 67 5b 31 5d 29 3b 0a 23 69 66 20 21 64 65 66 69  g[1]);.#if !defi
366e0 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
366f0 54 52 41 43 45 29 20 26 26 20 21 64 65 66 69 6e  TRACE) && !defin
36700 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46  ed(SQLITE_OMIT_F
36710 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54 29 0a 20  LOATING_POINT). 
36720 20 20 20 69 66 28 20 70 2d 3e 74 72 61 63 65 4f     if( p->traceO
36730 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73  ut==0 ){.      s
36740 71 6c 69 74 65 33 5f 74 72 61 63 65 5f 76 32 28  qlite3_trace_v2(
36750 70 2d 3e 64 62 2c 20 30 2c 20 30 2c 20 30 29 3b  p->db, 0, 0, 0);
36760 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
36770 20 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 5f    sqlite3_trace_
36780 76 32 28 70 2d 3e 64 62 2c 20 53 51 4c 49 54 45  v2(p->db, SQLITE
36790 5f 54 52 41 43 45 5f 53 54 4d 54 2c 20 73 71 6c  _TRACE_STMT, sql
367a0 5f 74 72 61 63 65 5f 63 61 6c 6c 62 61 63 6b 2c  _trace_callback,
367b0 70 2d 3e 74 72 61 63 65 4f 75 74 29 3b 0a 20 20  p->traceOut);.  
367c0 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 65 6c    }.#endif.  }el
367d0 73 65 0a 0a 23 69 66 20 53 51 4c 49 54 45 5f 55  se..#if SQLITE_U
367e0 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54 49  SER_AUTHENTICATI
367f0 4f 4e 0a 20 20 69 66 28 20 63 3d 3d 27 75 27 20  ON.  if( c=='u' 
36800 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
36810 5b 30 5d 2c 20 22 75 73 65 72 22 2c 20 6e 29 3d  [0], "user", n)=
36820 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41  =0 ){.    if( nA
36830 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 61  rg<2 ){.      ra
36840 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
36850 20 22 55 73 61 67 65 3a 20 2e 75 73 65 72 20 53   "Usage: .user S
36860 55 42 43 4f 4d 4d 41 4e 44 20 2e 2e 2e 5c 6e 22  UBCOMMAND ...\n"
36870 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
36880 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61  .      goto meta
36890 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
368a0 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62     }.    open_db
368b0 28 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  (p, 0);.    if( 
368c0 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  strcmp(azArg[1],
368d0 22 6c 6f 67 69 6e 22 29 3d 3d 30 20 29 7b 0a 20  "login")==0 ){. 
368e0 20 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 34       if( nArg!=4
368f0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f   ){.        raw_
36900 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
36910 55 73 61 67 65 3a 20 2e 75 73 65 72 20 6c 6f 67  Usage: .user log
36920 69 6e 20 55 53 45 52 20 50 41 53 53 57 4f 52 44  in USER PASSWORD
36930 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63  \n");.        rc
36940 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f   = 1;.        go
36950 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
36960 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  exit;.      }.  
36970 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
36980 5f 75 73 65 72 5f 61 75 74 68 65 6e 74 69 63 61  _user_authentica
36990 74 65 28 70 2d 3e 64 62 2c 20 61 7a 41 72 67 5b  te(p->db, azArg[
369a0 32 5d 2c 20 61 7a 41 72 67 5b 33 5d 2c 0a 20 20  2], azArg[3],.  
369b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
369c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
369d0 20 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 61 7a    (int)strlen(az
369e0 41 72 67 5b 33 5d 29 29 3b 0a 20 20 20 20 20 20  Arg[3]));.      
369f0 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
36a00 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
36a10 64 65 72 72 2c 20 22 41 75 74 68 65 6e 74 69 63  derr, "Authentic
36a20 61 74 69 6f 6e 20 66 61 69 6c 65 64 20 66 6f 72  ation failed for
36a30 20 75 73 65 72 20 25 73 5c 6e 22 2c 20 61 7a 41   user %s\n", azA
36a40 72 67 5b 32 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[2]);.        
36a50 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  rc = 1;.      }.
36a60 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
36a70 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 61  rcmp(azArg[1],"a
36a80 64 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  dd")==0 ){.     
36a90 20 69 66 28 20 6e 41 72 67 21 3d 35 20 29 7b 0a   if( nArg!=5 ){.
36aa0 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
36ab0 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
36ac0 65 3a 20 2e 75 73 65 72 20 61 64 64 20 55 53 45  e: .user add USE
36ad0 52 20 50 41 53 53 57 4f 52 44 20 49 53 41 44 4d  R PASSWORD ISADM
36ae0 49 4e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  IN\n");.        
36af0 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
36b00 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
36b10 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a  d_exit;.      }.
36b20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74        rc = sqlit
36b30 65 33 5f 75 73 65 72 5f 61 64 64 28 70 2d 3e 64  e3_user_add(p->d
36b40 62 2c 20 61 7a 41 72 67 5b 32 5d 2c 0a 20 20 20  b, azArg[2],.   
36b50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36b60 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b 33           azArg[3
36b70 5d 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 61  ], (int)strlen(a
36b80 7a 41 72 67 5b 33 5d 29 2c 0a 20 20 20 20 20 20  zArg[3]),.      
36b90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36ba0 20 20 20 20 20 20 62 6f 6f 6c 65 61 6e 56 61 6c        booleanVal
36bb0 75 65 28 61 7a 41 72 67 5b 34 5d 29 29 3b 0a 20  ue(azArg[4]));. 
36bc0 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20       if( rc ){. 
36bd0 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
36be0 66 28 73 74 64 65 72 72 2c 20 22 55 73 65 72 2d  f(stderr, "User-
36bf0 41 64 64 20 66 61 69 6c 65 64 3a 20 25 64 5c 6e  Add failed: %d\n
36c00 22 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  ", rc);.        
36c10 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  rc = 1;.      }.
36c20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
36c30 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22 65  rcmp(azArg[1],"e
36c40 64 69 74 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  dit")==0 ){.    
36c50 20 20 69 66 28 20 6e 41 72 67 21 3d 35 20 29 7b    if( nArg!=5 ){
36c60 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
36c70 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
36c80 67 65 3a 20 2e 75 73 65 72 20 65 64 69 74 20 55  ge: .user edit U
36c90 53 45 52 20 50 41 53 53 57 4f 52 44 20 49 53 41  SER PASSWORD ISA
36ca0 44 4d 49 4e 5c 6e 22 29 3b 0a 20 20 20 20 20 20  DMIN\n");.      
36cb0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
36cc0 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
36cd0 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20  and_exit;.      
36ce0 7d 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  }.      rc = sql
36cf0 69 74 65 33 5f 75 73 65 72 5f 63 68 61 6e 67 65  ite3_user_change
36d00 28 70 2d 3e 64 62 2c 20 61 7a 41 72 67 5b 32 5d  (p->db, azArg[2]
36d10 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
36d20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
36d30 61 7a 41 72 67 5b 33 5d 2c 20 28 69 6e 74 29 73  azArg[3], (int)s
36d40 74 72 6c 65 6e 28 61 7a 41 72 67 5b 33 5d 29 2c  trlen(azArg[3]),
36d50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
36d60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62                 b
36d70 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72  ooleanValue(azAr
36d80 67 5b 34 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  g[4]));.      if
36d90 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20  ( rc ){.        
36da0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
36db0 72 2c 20 22 55 73 65 72 2d 45 64 69 74 20 66 61  r, "User-Edit fa
36dc0 69 6c 65 64 3a 20 25 64 5c 6e 22 2c 20 72 63 29  iled: %d\n", rc)
36dd0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
36de0 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
36df0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 61  lse if( strcmp(a
36e00 7a 41 72 67 5b 31 5d 2c 22 64 65 6c 65 74 65 22  zArg[1],"delete"
36e10 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66  )==0 ){.      if
36e20 28 20 6e 41 72 67 21 3d 33 20 29 7b 0a 20 20 20  ( nArg!=3 ){.   
36e30 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
36e40 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
36e50 2e 75 73 65 72 20 64 65 6c 65 74 65 20 55 53 45  .user delete USE
36e60 52 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72  R\n");.        r
36e70 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67  c = 1;.        g
36e80 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
36e90 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20  _exit;.      }. 
36ea0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
36eb0 33 5f 75 73 65 72 5f 64 65 6c 65 74 65 28 70 2d  3_user_delete(p-
36ec0 3e 64 62 2c 20 61 7a 41 72 67 5b 32 5d 29 3b 0a  >db, azArg[2]);.
36ed0 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a        if( rc ){.
36ee0 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
36ef0 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 65 72  tf(stderr, "User
36f00 2d 44 65 6c 65 74 65 20 66 61 69 6c 65 64 3a 20  -Delete failed: 
36f10 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20  %d\n", rc);.    
36f20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
36f30 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
36f40 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
36f50 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
36f60 2e 75 73 65 72 20 6c 6f 67 69 6e 7c 61 64 64 7c  .user login|add|
36f70 65 64 69 74 7c 64 65 6c 65 74 65 20 2e 2e 2e 5c  edit|delete ...\
36f80 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
36f90 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  1;.      goto me
36fa0 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
36fb0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23  .    }.  }else.#
36fc0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
36fd0 55 53 45 52 5f 41 55 54 48 45 4e 54 49 43 41 54  USER_AUTHENTICAT
36fe0 49 4f 4e 20 2a 2f 0a 0a 20 20 69 66 28 20 63 3d  ION */..  if( c=
36ff0 3d 27 76 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='v' && strncmp(
37000 61 7a 41 72 67 5b 30 5d 2c 20 22 76 65 72 73 69  azArg[0], "versi
37010 6f 6e 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  on", n)==0 ){.  
37020 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
37030 3e 6f 75 74 2c 20 22 53 51 4c 69 74 65 20 25 73  >out, "SQLite %s
37040 20 25 73 5c 6e 22 20 2f 2a 65 78 74 72 61 2d 76   %s\n" /*extra-v
37050 65 72 73 69 6f 6e 2d 69 6e 66 6f 2a 2f 2c 0a 20  ersion-info*/,. 
37060 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
37070 69 62 76 65 72 73 69 6f 6e 28 29 2c 20 73 71 6c  ibversion(), sql
37080 69 74 65 33 5f 73 6f 75 72 63 65 69 64 28 29 29  ite3_sourceid())
37090 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
370a0 20 63 3d 3d 27 76 27 20 26 26 20 73 74 72 6e 63   c=='v' && strnc
370b0 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 76 66  mp(azArg[0], "vf
370c0 73 69 6e 66 6f 22 2c 20 6e 29 3d 3d 30 20 29 7b  sinfo", n)==0 ){
370d0 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20  .    const char 
370e0 2a 7a 44 62 4e 61 6d 65 20 3d 20 6e 41 72 67 3d  *zDbName = nArg=
370f0 3d 32 20 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20  =2 ? azArg[1] : 
37100 22 6d 61 69 6e 22 3b 0a 20 20 20 20 73 71 6c 69  "main";.    sqli
37110 74 65 33 5f 76 66 73 20 2a 70 56 66 73 20 3d 20  te3_vfs *pVfs = 
37120 30 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e 64 62  0;.    if( p->db
37130 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
37140 33 5f 66 69 6c 65 5f 63 6f 6e 74 72 6f 6c 28 70  3_file_control(p
37150 2d 3e 64 62 2c 20 7a 44 62 4e 61 6d 65 2c 20 53  ->db, zDbName, S
37160 51 4c 49 54 45 5f 46 43 4e 54 4c 5f 56 46 53 5f  QLITE_FCNTL_VFS_
37170 50 4f 49 4e 54 45 52 2c 20 26 70 56 66 73 29 3b  POINTER, &pVfs);
37180 0a 20 20 20 20 20 20 69 66 28 20 70 56 66 73 20  .      if( pVfs 
37190 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
371a0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
371b0 76 66 73 2e 7a 4e 61 6d 65 20 20 20 20 20 20 3d  vfs.zName      =
371c0 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 70 56 66 73   \"%s\"\n", pVfs
371d0 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  ->zName);.      
371e0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
371f0 6f 75 74 2c 20 22 76 66 73 2e 69 56 65 72 73 69  out, "vfs.iVersi
37200 6f 6e 20 20 20 3d 20 25 64 5c 6e 22 2c 20 70 56  on   = %d\n", pV
37210 66 73 2d 3e 69 56 65 72 73 69 6f 6e 29 3b 0a 20  fs->iVersion);. 
37220 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
37230 66 28 70 2d 3e 6f 75 74 2c 20 22 76 66 73 2e 73  f(p->out, "vfs.s
37240 7a 4f 73 46 69 6c 65 20 20 20 3d 20 25 64 5c 6e  zOsFile   = %d\n
37250 22 2c 20 70 56 66 73 2d 3e 73 7a 4f 73 46 69 6c  ", pVfs->szOsFil
37260 65 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f  e);.        raw_
37270 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
37280 76 66 73 2e 6d 78 50 61 74 68 6e 61 6d 65 20 3d  vfs.mxPathname =
37290 20 25 64 5c 6e 22 2c 20 70 56 66 73 2d 3e 6d 78   %d\n", pVfs->mx
372a0 50 61 74 68 6e 61 6d 65 29 3b 0a 20 20 20 20 20  Pathname);.     
372b0 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
372c0 0a 0a 20 20 69 66 28 20 63 3d 3d 27 76 27 20 26  ..  if( c=='v' &
372d0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
372e0 30 5d 2c 20 22 76 66 73 6c 69 73 74 22 2c 20 6e  0], "vfslist", n
372f0 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
37300 74 65 33 5f 76 66 73 20 2a 70 56 66 73 3b 0a 20  te3_vfs *pVfs;. 
37310 20 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a     sqlite3_vfs *
37320 70 43 75 72 72 65 6e 74 20 3d 20 30 3b 0a 20 20  pCurrent = 0;.  
37330 20 20 69 66 28 20 70 2d 3e 64 62 20 29 7b 0a 20    if( p->db ){. 
37340 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c       sqlite3_fil
37350 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 2c  e_control(p->db,
37360 20 22 6d 61 69 6e 22 2c 20 53 51 4c 49 54 45 5f   "main", SQLITE_
37370 46 43 4e 54 4c 5f 56 46 53 5f 50 4f 49 4e 54 45  FCNTL_VFS_POINTE
37380 52 2c 20 26 70 43 75 72 72 65 6e 74 29 3b 0a 20  R, &pCurrent);. 
37390 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 70 56 66     }.    for(pVf
373a0 73 3d 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69  s=sqlite3_vfs_fi
373b0 6e 64 28 30 29 3b 20 70 56 66 73 3b 20 70 56 66  nd(0); pVfs; pVf
373c0 73 3d 70 56 66 73 2d 3e 70 4e 65 78 74 29 7b 0a  s=pVfs->pNext){.
373d0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
373e0 66 28 70 2d 3e 6f 75 74 2c 20 22 76 66 73 2e 7a  f(p->out, "vfs.z
373f0 4e 61 6d 65 20 20 20 20 20 20 3d 20 5c 22 25 73  Name      = \"%s
37400 5c 22 25 73 5c 6e 22 2c 20 70 56 66 73 2d 3e 7a  \"%s\n", pVfs->z
37410 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
37420 20 70 56 66 73 3d 3d 70 43 75 72 72 65 6e 74 20   pVfs==pCurrent 
37430 3f 20 22 20 20 3c 2d 2d 2d 20 43 55 52 52 45 4e  ? "  <--- CURREN
37440 54 22 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20  T" : "");.      
37450 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
37460 74 2c 20 22 76 66 73 2e 69 56 65 72 73 69 6f 6e  t, "vfs.iVersion
37470 20 20 20 3d 20 25 64 5c 6e 22 2c 20 70 56 66 73     = %d\n", pVfs
37480 2d 3e 69 56 65 72 73 69 6f 6e 29 3b 0a 20 20 20  ->iVersion);.   
37490 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
374a0 3e 6f 75 74 2c 20 22 76 66 73 2e 73 7a 4f 73 46  >out, "vfs.szOsF
374b0 69 6c 65 20 20 20 3d 20 25 64 5c 6e 22 2c 20 70  ile   = %d\n", p
374c0 56 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a  Vfs->szOsFile);.
374d0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
374e0 28 70 2d 3e 6f 75 74 2c 20 22 76 66 73 2e 6d 78  (p->out, "vfs.mx
374f0 50 61 74 68 6e 61 6d 65 20 3d 20 25 64 5c 6e 22  Pathname = %d\n"
37500 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e 61  , pVfs->mxPathna
37510 6d 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  me);.      if( p
37520 56 66 73 2d 3e 70 4e 65 78 74 20 29 7b 0a 20 20  Vfs->pNext ){.  
37530 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
37540 28 70 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d  (p->out, "------
37550 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37560 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22  -------------\n"
37570 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
37580 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
37590 63 3d 3d 27 76 27 20 26 26 20 73 74 72 6e 63 6d  c=='v' && strncm
375a0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 76 66 73  p(azArg[0], "vfs
375b0 6e 61 6d 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  name", n)==0 ){.
375c0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
375d0 7a 44 62 4e 61 6d 65 20 3d 20 6e 41 72 67 3d 3d  zDbName = nArg==
375e0 32 20 3f 20 61 7a 41 72 67 5b 31 5d 20 3a 20 22  2 ? azArg[1] : "
375f0 6d 61 69 6e 22 3b 0a 20 20 20 20 63 68 61 72 20  main";.    char 
37600 2a 7a 56 66 73 4e 61 6d 65 20 3d 20 30 3b 0a 20  *zVfsName = 0;. 
37610 20 20 20 69 66 28 20 70 2d 3e 64 62 20 29 7b 0a     if( p->db ){.
37620 20 20 20 20