/ Hex Artifact Content
Login

Artifact 23b0207a222c1a1fcd0a3b9d790c79c0713212d63be94d96c0be0e62ccac3cd0:


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: 20 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f 74 79   include <sys/ty
0800: 70 65 73 2e 68 3e 0a 23 65 6e 64 69 66 0a 0a 23  pes.h>.#endif..#
0810: 69 66 20 48 41 56 45 5f 52 45 41 44 4c 49 4e 45  if HAVE_READLINE
0820: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 72 65 61 64  .# include <read
0830: 6c 69 6e 65 2f 72 65 61 64 6c 69 6e 65 2e 68 3e  line/readline.h>
0840: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 72 65 61 64  .# include <read
0850: 6c 69 6e 65 2f 68 69 73 74 6f 72 79 2e 68 3e 0a  line/history.h>.
0860: 23 65 6e 64 69 66 0a 0a 23 69 66 20 48 41 56 45  #endif..#if HAVE
0870: 5f 45 44 49 54 4c 49 4e 45 0a 23 20 69 6e 63 6c  _EDITLINE.# incl
0880: 75 64 65 20 3c 65 64 69 74 6c 69 6e 65 2f 72 65  ude <editline/re
0890: 61 64 6c 69 6e 65 2e 68 3e 0a 23 65 6e 64 69 66  adline.h>.#endif
08a0: 0a 0a 23 69 66 20 48 41 56 45 5f 45 44 49 54 4c  ..#if HAVE_EDITL
08b0: 49 4e 45 20 7c 7c 20 48 41 56 45 5f 52 45 41 44  INE || HAVE_READ
08c0: 4c 49 4e 45 0a 0a 23 20 64 65 66 69 6e 65 20 73  LINE..# define s
08d0: 68 65 6c 6c 5f 61 64 64 5f 68 69 73 74 6f 72 79  hell_add_history
08e0: 28 58 29 20 61 64 64 5f 68 69 73 74 6f 72 79 28  (X) add_history(
08f0: 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c  X).# define shel
0900: 6c 5f 72 65 61 64 5f 68 69 73 74 6f 72 79 28 58  l_read_history(X
0910: 29 20 72 65 61 64 5f 68 69 73 74 6f 72 79 28 58  ) read_history(X
0920: 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c  ).# define shell
0930: 5f 77 72 69 74 65 5f 68 69 73 74 6f 72 79 28 58  _write_history(X
0940: 29 20 77 72 69 74 65 5f 68 69 73 74 6f 72 79 28  ) write_history(
0950: 58 29 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c  X).# define shel
0960: 6c 5f 73 74 69 66 6c 65 5f 68 69 73 74 6f 72 79  l_stifle_history
0970: 28 58 29 20 73 74 69 66 6c 65 5f 68 69 73 74 6f  (X) stifle_histo
0980: 72 79 28 58 29 0a 23 20 64 65 66 69 6e 65 20 73  ry(X).# define s
0990: 68 65 6c 6c 5f 72 65 61 64 6c 69 6e 65 28 58 29  hell_readline(X)
09a0: 20 72 65 61 64 6c 69 6e 65 28 58 29 0a 0a 23 65   readline(X)..#e
09b0: 6c 69 66 20 48 41 56 45 5f 4c 49 4e 45 4e 4f 49  lif HAVE_LINENOI
09c0: 53 45 0a 0a 23 20 69 6e 63 6c 75 64 65 20 22 6c  SE..# include "l
09d0: 69 6e 65 6e 6f 69 73 65 2e 68 22 0a 23 20 64 65  inenoise.h".# de
09e0: 66 69 6e 65 20 73 68 65 6c 6c 5f 61 64 64 5f 68  fine shell_add_h
09f0: 69 73 74 6f 72 79 28 58 29 20 6c 69 6e 65 6e 6f  istory(X) lineno
0a00: 69 73 65 48 69 73 74 6f 72 79 41 64 64 28 58 29  iseHistoryAdd(X)
0a10: 0a 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f  .# define shell_
0a20: 72 65 61 64 5f 68 69 73 74 6f 72 79 28 58 29 20  read_history(X) 
0a30: 6c 69 6e 65 6e 6f 69 73 65 48 69 73 74 6f 72 79  linenoiseHistory
0a40: 4c 6f 61 64 28 58 29 0a 23 20 64 65 66 69 6e 65  Load(X).# define
0a50: 20 73 68 65 6c 6c 5f 77 72 69 74 65 5f 68 69 73   shell_write_his
0a60: 74 6f 72 79 28 58 29 20 6c 69 6e 65 6e 6f 69 73  tory(X) linenois
0a70: 65 48 69 73 74 6f 72 79 53 61 76 65 28 58 29 0a  eHistorySave(X).
0a80: 23 20 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 73  # define shell_s
0a90: 74 69 66 6c 65 5f 68 69 73 74 6f 72 79 28 58 29  tifle_history(X)
0aa0: 20 6c 69 6e 65 6e 6f 69 73 65 48 69 73 74 6f 72   linenoiseHistor
0ab0: 79 53 65 74 4d 61 78 4c 65 6e 28 58 29 0a 23 20  ySetMaxLen(X).# 
0ac0: 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 72 65 61  define shell_rea
0ad0: 64 6c 69 6e 65 28 58 29 20 6c 69 6e 65 6e 6f 69  dline(X) linenoi
0ae0: 73 65 28 58 29 0a 0a 23 65 6c 73 65 0a 0a 23 20  se(X)..#else..# 
0af0: 64 65 66 69 6e 65 20 73 68 65 6c 6c 5f 72 65 61  define shell_rea
0b00: 64 5f 68 69 73 74 6f 72 79 28 58 29 0a 23 20 64  d_history(X).# d
0b10: 65 66 69 6e 65 20 73 68 65 6c 6c 5f 77 72 69 74  efine shell_writ
0b20: 65 5f 68 69 73 74 6f 72 79 28 58 29 0a 23 20 64  e_history(X).# d
0b30: 65 66 69 6e 65 20 73 68 65 6c 6c 5f 73 74 69 66  efine shell_stif
0b40: 6c 65 5f 68 69 73 74 6f 72 79 28 58 29 0a 0a 23  le_history(X)..#
0b50: 20 64 65 66 69 6e 65 20 53 48 45 4c 4c 5f 55 53   define SHELL_US
0b60: 45 5f 4c 4f 43 41 4c 5f 47 45 54 4c 49 4e 45 20  E_LOCAL_GETLINE 
0b70: 31 0a 23 65 6e 64 69 66 0a 0a 0a 23 69 66 20 64  1.#endif...#if d
0b80: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c  efined(_WIN32) |
0b90: 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29  | defined(WIN32)
0ba0: 0a 23 20 69 6e 63 6c 75 64 65 20 3c 69 6f 2e 68  .# include <io.h
0bb0: 3e 0a 23 20 69 6e 63 6c 75 64 65 20 3c 66 63 6e  >.# include <fcn
0bc0: 74 6c 2e 68 3e 0a 23 20 64 65 66 69 6e 65 20 69  tl.h>.# define i
0bd0: 73 61 74 74 79 28 68 29 20 5f 69 73 61 74 74 79  satty(h) _isatty
0be0: 28 68 29 0a 23 20 69 66 6e 64 65 66 20 61 63 63  (h).# ifndef acc
0bf0: 65 73 73 0a 23 20 20 64 65 66 69 6e 65 20 61 63  ess.#  define ac
0c00: 63 65 73 73 28 66 2c 6d 29 20 5f 61 63 63 65 73  cess(f,m) _acces
0c10: 73 28 28 66 29 2c 28 6d 29 29 0a 23 20 65 6e 64  s((f),(m)).# end
0c20: 69 66 0a 23 20 75 6e 64 65 66 20 70 6f 70 65 6e  if.# undef popen
0c30: 0a 23 20 64 65 66 69 6e 65 20 70 6f 70 65 6e 20  .# define popen 
0c40: 5f 70 6f 70 65 6e 0a 23 20 75 6e 64 65 66 20 70  _popen.# undef p
0c50: 63 6c 6f 73 65 0a 23 20 64 65 66 69 6e 65 20 70  close.# define p
0c60: 63 6c 6f 73 65 20 5f 70 63 6c 6f 73 65 0a 23 65  close _pclose.#e
0c70: 6c 73 65 0a 20 2f 2a 20 4d 61 6b 65 20 73 75 72  lse. /* Make sur
0c80: 65 20 69 73 61 74 74 79 28 29 20 68 61 73 20 61  e isatty() has a
0c90: 20 70 72 6f 74 6f 74 79 70 65 2e 20 2a 2f 0a 20   prototype. */. 
0ca0: 65 78 74 65 72 6e 20 69 6e 74 20 69 73 61 74 74  extern int isatt
0cb0: 79 28 69 6e 74 29 3b 0a 0a 23 20 69 66 20 21 64  y(int);..# if !d
0cc0: 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29 20  efined(__RTP__) 
0cd0: 26 26 20 21 64 65 66 69 6e 65 64 28 5f 57 52 53  && !defined(_WRS
0ce0: 5f 4b 45 52 4e 45 4c 29 0a 20 20 2f 2a 20 70 6f  _KERNEL).  /* po
0cf0: 70 65 6e 20 61 6e 64 20 70 63 6c 6f 73 65 20 61  pen and pclose a
0d00: 72 65 20 6e 6f 74 20 43 38 39 20 66 75 6e 63 74  re not C89 funct
0d10: 69 6f 6e 73 20 61 6e 64 20 73 6f 20 61 72 65 0a  ions and so are.
0d20: 20 20 2a 2a 20 73 6f 6d 65 74 69 6d 65 73 20 6f    ** sometimes o
0d30: 6d 69 74 74 65 64 20 66 72 6f 6d 20 74 68 65 20  mitted from the 
0d40: 3c 73 74 64 69 6f 2e 68 3e 20 68 65 61 64 65 72  <stdio.h> header
0d50: 20 2a 2f 0a 20 20 20 65 78 74 65 72 6e 20 46 49   */.   extern FI
0d60: 4c 45 20 2a 70 6f 70 65 6e 28 63 6f 6e 73 74 20  LE *popen(const 
0d70: 63 68 61 72 2a 2c 63 6f 6e 73 74 20 63 68 61 72  char*,const char
0d80: 2a 29 3b 0a 20 20 20 65 78 74 65 72 6e 20 69 6e  *);.   extern in
0d90: 74 20 70 63 6c 6f 73 65 28 46 49 4c 45 2a 29 3b  t pclose(FILE*);
0da0: 0a 23 20 65 6c 73 65 0a 23 20 20 64 65 66 69 6e  .# else.#  defin
0db0: 65 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f  e SQLITE_OMIT_PO
0dc0: 50 45 4e 20 31 0a 23 20 65 6e 64 69 66 0a 23 65  PEN 1.# endif.#e
0dd0: 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e 65  ndif..#if define
0de0: 64 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a 2f 2a  d(_WIN32_WCE)./*
0df0: 20 57 69 6e 64 6f 77 73 20 43 45 20 28 61 72 6d   Windows CE (arm
0e00: 2d 77 69 6e 63 65 2d 6d 69 6e 67 77 33 32 63 65  -wince-mingw32ce
0e10: 2d 67 63 63 29 20 64 6f 65 73 20 6e 6f 74 20 70  -gcc) does not p
0e20: 72 6f 76 69 64 65 20 69 73 61 74 74 79 28 29 0a  rovide isatty().
0e30: 20 2a 20 74 68 75 73 20 77 65 20 61 6c 77 61 79   * thus we alway
0e40: 73 20 61 73 73 75 6d 65 20 74 68 61 74 20 77 65  s assume that we
0e50: 20 68 61 76 65 20 61 20 63 6f 6e 73 6f 6c 65 2e   have a console.
0e60: 20 54 68 61 74 20 63 61 6e 20 62 65 0a 20 2a 20   That can be. * 
0e70: 6f 76 65 72 72 69 64 64 65 6e 20 77 69 74 68 20  overridden with 
0e80: 74 68 65 20 2d 62 61 74 63 68 20 63 6f 6d 6d 61  the -batch comma
0e90: 6e 64 20 6c 69 6e 65 20 6f 70 74 69 6f 6e 2e 0a  nd line option..
0ea0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 69 73 61 74   */.#define isat
0eb0: 74 79 28 78 29 20 31 0a 23 65 6e 64 69 66 0a 0a  ty(x) 1.#endif..
0ec0: 2f 2a 20 63 74 79 70 65 20 6d 61 63 72 6f 73 20  /* ctype macros 
0ed0: 74 68 61 74 20 77 6f 72 6b 20 77 69 74 68 20 73  that work with s
0ee0: 69 67 6e 65 64 20 63 68 61 72 61 63 74 65 72 73  igned characters
0ef0: 20 2a 2f 0a 23 64 65 66 69 6e 65 20 49 73 53 70   */.#define IsSp
0f00: 61 63 65 28 58 29 20 20 69 73 73 70 61 63 65 28  ace(X)  isspace(
0f10: 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 58  (unsigned char)X
0f20: 29 0a 23 64 65 66 69 6e 65 20 49 73 44 69 67 69  ).#define IsDigi
0f30: 74 28 58 29 20 20 69 73 64 69 67 69 74 28 28 75  t(X)  isdigit((u
0f40: 6e 73 69 67 6e 65 64 20 63 68 61 72 29 58 29 0a  nsigned char)X).
0f50: 23 64 65 66 69 6e 65 20 54 6f 4c 6f 77 65 72 28  #define ToLower(
0f60: 58 29 20 20 28 63 68 61 72 29 74 6f 6c 6f 77 65  X)  (char)tolowe
0f70: 72 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61 72  r((unsigned char
0f80: 29 58 29 0a 0a 23 69 66 20 64 65 66 69 6e 65 64  )X)..#if defined
0f90: 28 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69  (_WIN32) || defi
0fa0: 6e 65 64 28 57 49 4e 33 32 29 0a 23 69 6e 63 6c  ned(WIN32).#incl
0fb0: 75 64 65 20 3c 77 69 6e 64 6f 77 73 2e 68 3e 0a  ude <windows.h>.
0fc0: 0a 2f 2a 20 73 74 72 69 6e 67 20 63 6f 6e 76 65  ./* string conve
0fd0: 72 73 69 6f 6e 20 72 6f 75 74 69 6e 65 73 20 6f  rsion routines o
0fe0: 6e 6c 79 20 6e 65 65 64 65 64 20 6f 6e 20 57 69  nly needed on Wi
0ff0: 6e 33 32 20 2a 2f 0a 65 78 74 65 72 6e 20 63 68  n32 */.extern ch
1000: 61 72 20 2a 73 71 6c 69 74 65 33 5f 77 69 6e 33  ar *sqlite3_win3
1010: 32 5f 75 6e 69 63 6f 64 65 5f 74 6f 5f 75 74 66  2_unicode_to_utf
1020: 38 28 4c 50 43 57 53 54 52 29 3b 0a 65 78 74 65  8(LPCWSTR);.exte
1030: 72 6e 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33  rn char *sqlite3
1040: 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75  _win32_mbcs_to_u
1050: 74 66 38 5f 76 32 28 63 6f 6e 73 74 20 63 68 61  tf8_v2(const cha
1060: 72 20 2a 2c 20 69 6e 74 29 3b 0a 65 78 74 65 72  r *, int);.exter
1070: 6e 20 63 68 61 72 20 2a 73 71 6c 69 74 65 33 5f  n char *sqlite3_
1080: 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 6d 62  win32_utf8_to_mb
1090: 63 73 5f 76 32 28 63 6f 6e 73 74 20 63 68 61 72  cs_v2(const char
10a0: 20 2a 2c 20 69 6e 74 29 3b 0a 65 78 74 65 72 6e   *, int);.extern
10b0: 20 4c 50 57 53 54 52 20 73 71 6c 69 74 65 33 5f   LPWSTR sqlite3_
10c0: 77 69 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 75 6e  win32_utf8_to_un
10d0: 69 63 6f 64 65 28 63 6f 6e 73 74 20 63 68 61 72  icode(const char
10e0: 20 2a 7a 54 65 78 74 29 3b 0a 23 65 6e 64 69 66   *zText);.#endif
10f0: 0a 0a 2f 2a 20 4f 6e 20 57 69 6e 64 6f 77 73 2c  ../* On Windows,
1100: 20 77 65 20 6e 6f 72 6d 61 6c 6c 79 20 72 75 6e   we normally run
1110: 20 77 69 74 68 20 6f 75 74 70 75 74 20 6d 6f 64   with output mod
1120: 65 20 6f 66 20 54 45 58 54 20 73 6f 20 74 68 61  e of TEXT so tha
1130: 74 20 5c 6e 20 63 68 61 72 61 63 74 65 72 73 0a  t \n characters.
1140: 2a 2a 20 61 72 65 20 61 75 74 6f 6d 61 74 69 63  ** are automatic
1150: 61 6c 6c 79 20 74 72 61 6e 73 6c 61 74 65 64 20  ally translated 
1160: 69 6e 74 6f 20 5c 72 5c 6e 2e 20 20 48 6f 77 65  into \r\n.  Howe
1170: 76 65 72 2c 20 74 68 69 73 20 62 65 68 61 76 69  ver, this behavi
1180: 6f 72 20 6e 65 65 64 73 0a 2a 2a 20 74 6f 20 62  or needs.** to b
1190: 65 20 64 69 73 61 62 6c 65 64 20 69 6e 20 73 6f  e disabled in so
11a0: 6d 65 20 63 61 73 65 73 20 28 65 78 3a 20 77 68  me cases (ex: wh
11b0: 65 6e 20 67 65 6e 65 72 61 74 69 6e 67 20 43 53  en generating CS
11c0: 56 20 6f 75 74 70 75 74 20 61 6e 64 20 77 68 65  V output and whe
11d0: 6e 0a 2a 2a 20 72 65 6e 64 65 72 69 6e 67 20 71  n.** rendering q
11e0: 75 6f 74 65 64 20 73 74 72 69 6e 67 73 20 74 68  uoted strings th
11f0: 61 74 20 63 6f 6e 74 61 69 6e 20 5c 6e 20 63 68  at contain \n ch
1200: 61 72 61 63 74 65 72 73 29 2e 20 20 54 68 65 20  aracters).  The 
1210: 66 6f 6c 6c 6f 77 69 6e 67 0a 2a 2a 20 72 6f 75  following.** rou
1220: 74 69 6e 65 73 20 74 61 6b 65 20 63 61 72 65 20  tines take care 
1230: 6f 66 20 74 68 61 74 2e 0a 2a 2f 0a 23 69 66 20  of that..*/.#if 
1240: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20  defined(_WIN32) 
1250: 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32  || defined(WIN32
1260: 29 0a 73 74 61 74 69 63 20 76 6f 69 64 20 73 65  ).static void se
1270: 74 42 69 6e 61 72 79 4d 6f 64 65 28 46 49 4c 45  tBinaryMode(FILE
1280: 20 2a 66 69 6c 65 2c 20 69 6e 74 20 69 73 4f 75   *file, int isOu
1290: 74 70 75 74 29 7b 0a 20 20 69 66 28 20 69 73 4f  tput){.  if( isO
12a0: 75 74 70 75 74 20 29 20 66 66 6c 75 73 68 28 66  utput ) fflush(f
12b0: 69 6c 65 29 3b 0a 20 20 5f 73 65 74 6d 6f 64 65  ile);.  _setmode
12c0: 28 5f 66 69 6c 65 6e 6f 28 66 69 6c 65 29 2c 20  (_fileno(file), 
12d0: 5f 4f 5f 42 49 4e 41 52 59 29 3b 0a 7d 0a 73 74  _O_BINARY);.}.st
12e0: 61 74 69 63 20 76 6f 69 64 20 73 65 74 54 65 78  atic void setTex
12f0: 74 4d 6f 64 65 28 46 49 4c 45 20 2a 66 69 6c 65  tMode(FILE *file
1300: 2c 20 69 6e 74 20 69 73 4f 75 74 70 75 74 29 7b  , int isOutput){
1310: 0a 20 20 69 66 28 20 69 73 4f 75 74 70 75 74 20  .  if( isOutput 
1320: 29 20 66 66 6c 75 73 68 28 66 69 6c 65 29 3b 0a  ) fflush(file);.
1330: 20 20 5f 73 65 74 6d 6f 64 65 28 5f 66 69 6c 65    _setmode(_file
1340: 6e 6f 28 66 69 6c 65 29 2c 20 5f 4f 5f 54 45 58  no(file), _O_TEX
1350: 54 29 3b 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65  T);.}.#else.# de
1360: 66 69 6e 65 20 73 65 74 42 69 6e 61 72 79 4d 6f  fine setBinaryMo
1370: 64 65 28 58 2c 59 29 0a 23 20 64 65 66 69 6e 65  de(X,Y).# define
1380: 20 73 65 74 54 65 78 74 4d 6f 64 65 28 58 2c 59   setTextMode(X,Y
1390: 29 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 20 54 72  ).#endif.../* Tr
13a0: 75 65 20 69 66 20 74 68 65 20 74 69 6d 65 72 20  ue if the timer 
13b0: 69 73 20 65 6e 61 62 6c 65 64 20 2a 2f 0a 73 74  is enabled */.st
13c0: 61 74 69 63 20 69 6e 74 20 65 6e 61 62 6c 65 54  atic int enableT
13d0: 69 6d 65 72 20 3d 20 30 3b 0a 0a 2f 2a 20 52 65  imer = 0;../* Re
13e0: 74 75 72 6e 20 74 68 65 20 63 75 72 72 65 6e 74  turn the current
13f0: 20 77 61 6c 6c 2d 63 6c 6f 63 6b 20 74 69 6d 65   wall-clock time
1400: 20 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69 74   */.static sqlit
1410: 65 33 5f 69 6e 74 36 34 20 74 69 6d 65 4f 66 44  e3_int64 timeOfD
1420: 61 79 28 76 6f 69 64 29 7b 0a 20 20 73 74 61 74  ay(void){.  stat
1430: 69 63 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a  ic sqlite3_vfs *
1440: 63 6c 6f 63 6b 56 66 73 20 3d 20 30 3b 0a 20 20  clockVfs = 0;.  
1450: 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 74 3b  sqlite3_int64 t;
1460: 0a 20 20 69 66 28 20 63 6c 6f 63 6b 56 66 73 3d  .  if( clockVfs=
1470: 3d 30 20 29 20 63 6c 6f 63 6b 56 66 73 20 3d 20  =0 ) clockVfs = 
1480: 73 71 6c 69 74 65 33 5f 76 66 73 5f 66 69 6e 64  sqlite3_vfs_find
1490: 28 30 29 3b 0a 20 20 69 66 28 20 63 6c 6f 63 6b  (0);.  if( clock
14a0: 56 66 73 2d 3e 69 56 65 72 73 69 6f 6e 3e 3d 32  Vfs->iVersion>=2
14b0: 20 26 26 20 63 6c 6f 63 6b 56 66 73 2d 3e 78 43   && clockVfs->xC
14c0: 75 72 72 65 6e 74 54 69 6d 65 49 6e 74 36 34 21  urrentTimeInt64!
14d0: 3d 30 20 29 7b 0a 20 20 20 20 63 6c 6f 63 6b 56  =0 ){.    clockV
14e0: 66 73 2d 3e 78 43 75 72 72 65 6e 74 54 69 6d 65  fs->xCurrentTime
14f0: 49 6e 74 36 34 28 63 6c 6f 63 6b 56 66 73 2c 20  Int64(clockVfs, 
1500: 26 74 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  &t);.  }else{.  
1510: 20 20 64 6f 75 62 6c 65 20 72 3b 0a 20 20 20 20    double r;.    
1520: 63 6c 6f 63 6b 56 66 73 2d 3e 78 43 75 72 72 65  clockVfs->xCurre
1530: 6e 74 54 69 6d 65 28 63 6c 6f 63 6b 56 66 73 2c  ntTime(clockVfs,
1540: 20 26 72 29 3b 0a 20 20 20 20 74 20 3d 20 28 73   &r);.    t = (s
1550: 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28 72 2a  qlite3_int64)(r*
1560: 38 36 34 30 30 30 30 30 2e 30 29 3b 0a 20 20 7d  86400000.0);.  }
1570: 0a 20 20 72 65 74 75 72 6e 20 74 3b 0a 7d 0a 0a  .  return t;.}..
1580: 23 69 66 20 21 64 65 66 69 6e 65 64 28 5f 57 49  #if !defined(_WI
1590: 4e 33 32 29 20 26 26 20 21 64 65 66 69 6e 65 64  N32) && !defined
15a0: 28 57 49 4e 33 32 29 20 26 26 20 21 64 65 66 69  (WIN32) && !defi
15b0: 6e 65 64 28 5f 5f 6d 69 6e 75 78 29 0a 23 69 6e  ned(__minux).#in
15c0: 63 6c 75 64 65 20 3c 73 79 73 2f 74 69 6d 65 2e  clude <sys/time.
15d0: 68 3e 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73  h>.#include <sys
15e0: 2f 72 65 73 6f 75 72 63 65 2e 68 3e 0a 0a 2f 2a  /resource.h>../*
15f0: 20 56 78 57 6f 72 6b 73 20 64 6f 65 73 20 6e 6f   VxWorks does no
1600: 74 20 73 75 70 70 6f 72 74 20 67 65 74 72 75 73  t support getrus
1610: 61 67 65 28 29 20 61 73 20 66 61 72 20 61 73 20  age() as far as 
1620: 77 65 20 63 61 6e 20 64 65 74 65 72 6d 69 6e 65  we can determine
1630: 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28   */.#if defined(
1640: 5f 57 52 53 5f 4b 45 52 4e 45 4c 29 20 7c 7c 20  _WRS_KERNEL) || 
1650: 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f 5f 29  defined(__RTP__)
1660: 0a 73 74 72 75 63 74 20 72 75 73 61 67 65 20 7b  .struct rusage {
1670: 0a 20 20 73 74 72 75 63 74 20 74 69 6d 65 76 61  .  struct timeva
1680: 6c 20 72 75 5f 75 74 69 6d 65 3b 20 2f 2a 20 75  l ru_utime; /* u
1690: 73 65 72 20 43 50 55 20 74 69 6d 65 20 75 73 65  ser CPU time use
16a0: 64 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 74 69  d */.  struct ti
16b0: 6d 65 76 61 6c 20 72 75 5f 73 74 69 6d 65 3b 20  meval ru_stime; 
16c0: 2f 2a 20 73 79 73 74 65 6d 20 43 50 55 20 74 69  /* system CPU ti
16d0: 6d 65 20 75 73 65 64 20 2a 2f 0a 7d 3b 0a 23 64  me used */.};.#d
16e0: 65 66 69 6e 65 20 67 65 74 72 75 73 61 67 65 28  efine getrusage(
16f0: 41 2c 42 29 20 6d 65 6d 73 65 74 28 42 2c 30 2c  A,B) memset(B,0,
1700: 73 69 7a 65 6f 66 28 2a 42 29 29 0a 23 65 6e 64  sizeof(*B)).#end
1710: 69 66 0a 0a 2f 2a 20 53 61 76 65 64 20 72 65 73  if../* Saved res
1720: 6f 75 72 63 65 20 69 6e 66 6f 72 6d 61 74 69 6f  ource informatio
1730: 6e 20 66 6f 72 20 74 68 65 20 62 65 67 69 6e 6e  n for the beginn
1740: 69 6e 67 20 6f 66 20 61 6e 20 6f 70 65 72 61 74  ing of an operat
1750: 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 73 74  ion */.static st
1760: 72 75 63 74 20 72 75 73 61 67 65 20 73 42 65 67  ruct rusage sBeg
1770: 69 6e 3b 20 20 2f 2a 20 43 50 55 20 74 69 6d 65  in;  /* CPU time
1780: 20 61 74 20 73 74 61 72 74 20 2a 2f 0a 73 74 61   at start */.sta
1790: 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  tic sqlite3_int6
17a0: 34 20 69 42 65 67 69 6e 3b 20 20 2f 2a 20 57 61  4 iBegin;  /* Wa
17b0: 6c 6c 2d 63 6c 6f 63 6b 20 74 69 6d 65 20 61 74  ll-clock time at
17c0: 20 73 74 61 72 74 20 2a 2f 0a 0a 2f 2a 0a 2a 2a   start */../*.**
17d0: 20 42 65 67 69 6e 20 74 69 6d 69 6e 67 20 61 6e   Begin timing an
17e0: 20 6f 70 65 72 61 74 69 6f 6e 0a 2a 2f 0a 73 74   operation.*/.st
17f0: 61 74 69 63 20 76 6f 69 64 20 62 65 67 69 6e 54  atic void beginT
1800: 69 6d 65 72 28 76 6f 69 64 29 7b 0a 20 20 69 66  imer(void){.  if
1810: 28 20 65 6e 61 62 6c 65 54 69 6d 65 72 20 29 7b  ( enableTimer ){
1820: 0a 20 20 20 20 67 65 74 72 75 73 61 67 65 28 52  .    getrusage(R
1830: 55 53 41 47 45 5f 53 45 4c 46 2c 20 26 73 42 65  USAGE_SELF, &sBe
1840: 67 69 6e 29 3b 0a 20 20 20 20 69 42 65 67 69 6e  gin);.    iBegin
1850: 20 3d 20 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a   = timeOfDay();.
1860: 20 20 7d 0a 7d 0a 0a 2f 2a 20 52 65 74 75 72 6e    }.}../* Return
1870: 20 74 68 65 20 64 69 66 66 65 72 65 6e 63 65 20   the difference 
1880: 6f 66 20 74 77 6f 20 74 69 6d 65 5f 73 74 72 75  of two time_stru
1890: 63 74 73 20 69 6e 20 73 65 63 6f 6e 64 73 20 2a  cts in seconds *
18a0: 2f 0a 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20  /.static double 
18b0: 74 69 6d 65 44 69 66 66 28 73 74 72 75 63 74 20  timeDiff(struct 
18c0: 74 69 6d 65 76 61 6c 20 2a 70 53 74 61 72 74 2c  timeval *pStart,
18d0: 20 73 74 72 75 63 74 20 74 69 6d 65 76 61 6c 20   struct timeval 
18e0: 2a 70 45 6e 64 29 7b 0a 20 20 72 65 74 75 72 6e  *pEnd){.  return
18f0: 20 28 70 45 6e 64 2d 3e 74 76 5f 75 73 65 63 20   (pEnd->tv_usec 
1900: 2d 20 70 53 74 61 72 74 2d 3e 74 76 5f 75 73 65  - pStart->tv_use
1910: 63 29 2a 30 2e 30 30 30 30 30 31 20 2b 0a 20 20  c)*0.000001 +.  
1920: 20 20 20 20 20 20 20 28 64 6f 75 62 6c 65 29 28         (double)(
1930: 70 45 6e 64 2d 3e 74 76 5f 73 65 63 20 2d 20 70  pEnd->tv_sec - p
1940: 53 74 61 72 74 2d 3e 74 76 5f 73 65 63 29 3b 0a  Start->tv_sec);.
1950: 7d 0a 0a 2f 2a 0a 2a 2a 20 50 72 69 6e 74 20 74  }../*.** Print t
1960: 68 65 20 74 69 6d 69 6e 67 20 72 65 73 75 6c 74  he timing result
1970: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  s..*/.static voi
1980: 64 20 65 6e 64 54 69 6d 65 72 28 76 6f 69 64 29  d endTimer(void)
1990: 7b 0a 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69  {.  if( enableTi
19a0: 6d 65 72 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  mer ){.    sqlit
19b0: 65 33 5f 69 6e 74 36 34 20 69 45 6e 64 20 3d 20  e3_int64 iEnd = 
19c0: 74 69 6d 65 4f 66 44 61 79 28 29 3b 0a 20 20 20  timeOfDay();.   
19d0: 20 73 74 72 75 63 74 20 72 75 73 61 67 65 20 73   struct rusage s
19e0: 45 6e 64 3b 0a 20 20 20 20 67 65 74 72 75 73 61  End;.    getrusa
19f0: 67 65 28 52 55 53 41 47 45 5f 53 45 4c 46 2c 20  ge(RUSAGE_SELF, 
1a00: 26 73 45 6e 64 29 3b 0a 20 20 20 20 70 72 69 6e  &sEnd);.    prin
1a10: 74 66 28 22 52 75 6e 20 54 69 6d 65 3a 20 72 65  tf("Run Time: re
1a20: 61 6c 20 25 2e 33 66 20 75 73 65 72 20 25 66 20  al %.3f user %f 
1a30: 73 79 73 20 25 66 5c 6e 22 2c 0a 20 20 20 20 20  sys %f\n",.     
1a40: 20 20 28 69 45 6e 64 20 2d 20 69 42 65 67 69 6e    (iEnd - iBegin
1a50: 29 2a 30 2e 30 30 31 2c 0a 20 20 20 20 20 20 20  )*0.001,.       
1a60: 74 69 6d 65 44 69 66 66 28 26 73 42 65 67 69 6e  timeDiff(&sBegin
1a70: 2e 72 75 5f 75 74 69 6d 65 2c 20 26 73 45 6e 64  .ru_utime, &sEnd
1a80: 2e 72 75 5f 75 74 69 6d 65 29 2c 0a 20 20 20 20  .ru_utime),.    
1a90: 20 20 20 74 69 6d 65 44 69 66 66 28 26 73 42 65     timeDiff(&sBe
1aa0: 67 69 6e 2e 72 75 5f 73 74 69 6d 65 2c 20 26 73  gin.ru_stime, &s
1ab0: 45 6e 64 2e 72 75 5f 73 74 69 6d 65 29 29 3b 0a  End.ru_stime));.
1ac0: 20 20 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 42    }.}..#define B
1ad0: 45 47 49 4e 5f 54 49 4d 45 52 20 62 65 67 69 6e  EGIN_TIMER begin
1ae0: 54 69 6d 65 72 28 29 0a 23 64 65 66 69 6e 65 20  Timer().#define 
1af0: 45 4e 44 5f 54 49 4d 45 52 20 65 6e 64 54 69 6d  END_TIMER endTim
1b00: 65 72 28 29 0a 23 64 65 66 69 6e 65 20 48 41 53  er().#define HAS
1b10: 5f 54 49 4d 45 52 20 31 0a 0a 23 65 6c 69 66 20  _TIMER 1..#elif 
1b20: 28 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29  (defined(_WIN32)
1b30: 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33   || defined(WIN3
1b40: 32 29 29 0a 0a 2f 2a 20 53 61 76 65 64 20 72 65  2))../* Saved re
1b50: 73 6f 75 72 63 65 20 69 6e 66 6f 72 6d 61 74 69  source informati
1b60: 6f 6e 20 66 6f 72 20 74 68 65 20 62 65 67 69 6e  on for the begin
1b70: 6e 69 6e 67 20 6f 66 20 61 6e 20 6f 70 65 72 61  ning of an opera
1b80: 74 69 6f 6e 20 2a 2f 0a 73 74 61 74 69 63 20 48  tion */.static H
1b90: 41 4e 44 4c 45 20 68 50 72 6f 63 65 73 73 3b 0a  ANDLE hProcess;.
1ba0: 73 74 61 74 69 63 20 46 49 4c 45 54 49 4d 45 20  static FILETIME 
1bb0: 66 74 4b 65 72 6e 65 6c 42 65 67 69 6e 3b 0a 73  ftKernelBegin;.s
1bc0: 74 61 74 69 63 20 46 49 4c 45 54 49 4d 45 20 66  tatic FILETIME f
1bd0: 74 55 73 65 72 42 65 67 69 6e 3b 0a 73 74 61 74  tUserBegin;.stat
1be0: 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34  ic sqlite3_int64
1bf0: 20 66 74 57 61 6c 6c 42 65 67 69 6e 3b 0a 74 79   ftWallBegin;.ty
1c00: 70 65 64 65 66 20 42 4f 4f 4c 20 28 57 49 4e 41  pedef BOOL (WINA
1c10: 50 49 20 2a 47 45 54 50 52 4f 43 54 49 4d 45 53  PI *GETPROCTIMES
1c20: 29 28 48 41 4e 44 4c 45 2c 20 4c 50 46 49 4c 45  )(HANDLE, LPFILE
1c30: 54 49 4d 45 2c 20 4c 50 46 49 4c 45 54 49 4d 45  TIME, LPFILETIME
1c40: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
1c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c60: 20 20 20 20 20 20 4c 50 46 49 4c 45 54 49 4d 45        LPFILETIME
1c70: 2c 20 4c 50 46 49 4c 45 54 49 4d 45 29 3b 0a 73  , LPFILETIME);.s
1c80: 74 61 74 69 63 20 47 45 54 50 52 4f 43 54 49 4d  tatic GETPROCTIM
1c90: 45 53 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d  ES getProcessTim
1ca0: 65 73 41 64 64 72 20 3d 20 4e 55 4c 4c 3b 0a 0a  esAddr = NULL;..
1cb0: 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  /*.** Check to s
1cc0: 65 65 20 69 66 20 77 65 20 68 61 76 65 20 74 69  ee if we have ti
1cd0: 6d 65 72 20 73 75 70 70 6f 72 74 2e 20 20 52 65  mer support.  Re
1ce0: 74 75 72 6e 20 31 20 69 66 20 6e 65 63 65 73 73  turn 1 if necess
1cf0: 61 72 79 0a 2a 2a 20 73 75 70 70 6f 72 74 20 66  ary.** support f
1d00: 6f 75 6e 64 20 28 6f 72 20 66 6f 75 6e 64 20 70  ound (or found p
1d10: 72 65 76 69 6f 75 73 6c 79 29 2e 0a 2a 2f 0a 73  reviously)..*/.s
1d20: 74 61 74 69 63 20 69 6e 74 20 68 61 73 54 69 6d  tatic int hasTim
1d30: 65 72 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20  er(void){.  if( 
1d40: 67 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41  getProcessTimesA
1d50: 64 64 72 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ddr ){.    retur
1d60: 6e 20 31 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  n 1;.  } else {.
1d70: 20 20 20 20 2f 2a 20 47 65 74 50 72 6f 63 65 73      /* GetProces
1d80: 73 54 69 6d 65 73 28 29 20 69 73 6e 27 74 20 73  sTimes() isn't s
1d90: 75 70 70 6f 72 74 65 64 20 69 6e 20 57 49 4e 39  upported in WIN9
1da0: 35 20 61 6e 64 20 73 6f 6d 65 20 6f 74 68 65 72  5 and some other
1db0: 20 57 69 6e 64 6f 77 73 0a 20 20 20 20 2a 2a 20   Windows.    ** 
1dc0: 76 65 72 73 69 6f 6e 73 2e 20 53 65 65 20 69 66  versions. See if
1dd0: 20 74 68 65 20 76 65 72 73 69 6f 6e 20 77 65 20   the version we 
1de0: 61 72 65 20 72 75 6e 6e 69 6e 67 20 6f 6e 20 68  are running on h
1df0: 61 73 20 69 74 2c 20 61 6e 64 20 69 66 20 69 74  as it, and if it
1e00: 0a 20 20 20 20 2a 2a 20 64 6f 65 73 2c 20 73 61  .    ** does, sa
1e10: 76 65 20 6f 66 66 20 61 20 70 6f 69 6e 74 65 72  ve off a pointer
1e20: 20 74 6f 20 69 74 20 61 6e 64 20 74 68 65 20 63   to it and the c
1e30: 75 72 72 65 6e 74 20 70 72 6f 63 65 73 73 20 68  urrent process h
1e40: 61 6e 64 6c 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  andle..    */.  
1e50: 20 20 68 50 72 6f 63 65 73 73 20 3d 20 47 65 74    hProcess = Get
1e60: 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73 28 29  CurrentProcess()
1e70: 3b 0a 20 20 20 20 69 66 28 20 68 50 72 6f 63 65  ;.    if( hProce
1e80: 73 73 20 29 7b 0a 20 20 20 20 20 20 48 49 4e 53  ss ){.      HINS
1e90: 54 41 4e 43 45 20 68 69 6e 73 74 4c 69 62 20 3d  TANCE hinstLib =
1ea0: 20 4c 6f 61 64 4c 69 62 72 61 72 79 28 54 45 58   LoadLibrary(TEX
1eb0: 54 28 22 4b 65 72 6e 65 6c 33 32 2e 64 6c 6c 22  T("Kernel32.dll"
1ec0: 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 4e 55  ));.      if( NU
1ed0: 4c 4c 20 21 3d 20 68 69 6e 73 74 4c 69 62 20 29  LL != hinstLib )
1ee0: 7b 0a 20 20 20 20 20 20 20 20 67 65 74 50 72 6f  {.        getPro
1ef0: 63 65 73 73 54 69 6d 65 73 41 64 64 72 20 3d 0a  cessTimesAddr =.
1f00: 20 20 20 20 20 20 20 20 20 20 20 20 28 47 45 54              (GET
1f10: 50 52 4f 43 54 49 4d 45 53 29 20 47 65 74 50 72  PROCTIMES) GetPr
1f20: 6f 63 41 64 64 72 65 73 73 28 68 69 6e 73 74 4c  ocAddress(hinstL
1f30: 69 62 2c 20 22 47 65 74 50 72 6f 63 65 73 73 54  ib, "GetProcessT
1f40: 69 6d 65 73 22 29 3b 0a 20 20 20 20 20 20 20 20  imes");.        
1f50: 69 66 28 20 4e 55 4c 4c 20 21 3d 20 67 65 74 50  if( NULL != getP
1f60: 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72 20  rocessTimesAddr 
1f70: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  ){.          ret
1f80: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  urn 1;.        }
1f90: 0a 20 20 20 20 20 20 20 20 46 72 65 65 4c 69 62  .        FreeLib
1fa0: 72 61 72 79 28 68 69 6e 73 74 4c 69 62 29 3b 0a  rary(hinstLib);.
1fb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
1fc0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
1fd0: 0a 2f 2a 0a 2a 2a 20 42 65 67 69 6e 20 74 69 6d  ./*.** Begin tim
1fe0: 69 6e 67 20 61 6e 20 6f 70 65 72 61 74 69 6f 6e  ing an operation
1ff0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
2000: 62 65 67 69 6e 54 69 6d 65 72 28 76 6f 69 64 29  beginTimer(void)
2010: 7b 0a 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69  {.  if( enableTi
2020: 6d 65 72 20 26 26 20 67 65 74 50 72 6f 63 65 73  mer && getProces
2030: 73 54 69 6d 65 73 41 64 64 72 20 29 7b 0a 20 20  sTimesAddr ){.  
2040: 20 20 46 49 4c 45 54 49 4d 45 20 66 74 43 72 65    FILETIME ftCre
2050: 61 74 69 6f 6e 2c 20 66 74 45 78 69 74 3b 0a 20  ation, ftExit;. 
2060: 20 20 20 67 65 74 50 72 6f 63 65 73 73 54 69 6d     getProcessTim
2070: 65 73 41 64 64 72 28 68 50 72 6f 63 65 73 73 2c  esAddr(hProcess,
2080: 26 66 74 43 72 65 61 74 69 6f 6e 2c 26 66 74 45  &ftCreation,&ftE
2090: 78 69 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xit,.           
20a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 66 74               &ft
20b0: 4b 65 72 6e 65 6c 42 65 67 69 6e 2c 26 66 74 55  KernelBegin,&ftU
20c0: 73 65 72 42 65 67 69 6e 29 3b 0a 20 20 20 20 66  serBegin);.    f
20d0: 74 57 61 6c 6c 42 65 67 69 6e 20 3d 20 74 69 6d  tWallBegin = tim
20e0: 65 4f 66 44 61 79 28 29 3b 0a 20 20 7d 0a 7d 0a  eOfDay();.  }.}.
20f0: 0a 2f 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64  ./* Return the d
2100: 69 66 66 65 72 65 6e 63 65 20 6f 66 20 74 77 6f  ifference of two
2110: 20 46 49 4c 45 54 49 4d 45 20 73 74 72 75 63 74   FILETIME struct
2120: 73 20 69 6e 20 73 65 63 6f 6e 64 73 20 2a 2f 0a  s in seconds */.
2130: 73 74 61 74 69 63 20 64 6f 75 62 6c 65 20 74 69  static double ti
2140: 6d 65 44 69 66 66 28 46 49 4c 45 54 49 4d 45 20  meDiff(FILETIME 
2150: 2a 70 53 74 61 72 74 2c 20 46 49 4c 45 54 49 4d  *pStart, FILETIM
2160: 45 20 2a 70 45 6e 64 29 7b 0a 20 20 73 71 6c 69  E *pEnd){.  sqli
2170: 74 65 5f 69 6e 74 36 34 20 69 36 34 53 74 61 72  te_int64 i64Star
2180: 74 20 3d 20 2a 28 28 73 71 6c 69 74 65 5f 69 6e  t = *((sqlite_in
2190: 74 36 34 20 2a 29 20 70 53 74 61 72 74 29 3b 0a  t64 *) pStart);.
21a0: 20 20 73 71 6c 69 74 65 5f 69 6e 74 36 34 20 69    sqlite_int64 i
21b0: 36 34 45 6e 64 20 3d 20 2a 28 28 73 71 6c 69 74  64End = *((sqlit
21c0: 65 5f 69 6e 74 36 34 20 2a 29 20 70 45 6e 64 29  e_int64 *) pEnd)
21d0: 3b 0a 20 20 72 65 74 75 72 6e 20 28 64 6f 75 62  ;.  return (doub
21e0: 6c 65 29 20 28 28 69 36 34 45 6e 64 20 2d 20 69  le) ((i64End - i
21f0: 36 34 53 74 61 72 74 29 20 2f 20 31 30 30 30 30  64Start) / 10000
2200: 30 30 30 2e 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  000.0);.}../*.**
2210: 20 50 72 69 6e 74 20 74 68 65 20 74 69 6d 69 6e   Print the timin
2220: 67 20 72 65 73 75 6c 74 73 2e 0a 2a 2f 0a 73 74  g results..*/.st
2230: 61 74 69 63 20 76 6f 69 64 20 65 6e 64 54 69 6d  atic void endTim
2240: 65 72 28 76 6f 69 64 29 7b 0a 20 20 69 66 28 20  er(void){.  if( 
2250: 65 6e 61 62 6c 65 54 69 6d 65 72 20 26 26 20 67  enableTimer && g
2260: 65 74 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64  etProcessTimesAd
2270: 64 72 29 7b 0a 20 20 20 20 46 49 4c 45 54 49 4d  dr){.    FILETIM
2280: 45 20 66 74 43 72 65 61 74 69 6f 6e 2c 20 66 74  E ftCreation, ft
2290: 45 78 69 74 2c 20 66 74 4b 65 72 6e 65 6c 45 6e  Exit, ftKernelEn
22a0: 64 2c 20 66 74 55 73 65 72 45 6e 64 3b 0a 20 20  d, ftUserEnd;.  
22b0: 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 20    sqlite3_int64 
22c0: 66 74 57 61 6c 6c 45 6e 64 20 3d 20 74 69 6d 65  ftWallEnd = time
22d0: 4f 66 44 61 79 28 29 3b 0a 20 20 20 20 67 65 74  OfDay();.    get
22e0: 50 72 6f 63 65 73 73 54 69 6d 65 73 41 64 64 72  ProcessTimesAddr
22f0: 28 68 50 72 6f 63 65 73 73 2c 26 66 74 43 72 65  (hProcess,&ftCre
2300: 61 74 69 6f 6e 2c 26 66 74 45 78 69 74 2c 26 66  ation,&ftExit,&f
2310: 74 4b 65 72 6e 65 6c 45 6e 64 2c 26 66 74 55 73  tKernelEnd,&ftUs
2320: 65 72 45 6e 64 29 3b 0a 20 20 20 20 70 72 69 6e  erEnd);.    prin
2330: 74 66 28 22 52 75 6e 20 54 69 6d 65 3a 20 72 65  tf("Run Time: re
2340: 61 6c 20 25 2e 33 66 20 75 73 65 72 20 25 66 20  al %.3f user %f 
2350: 73 79 73 20 25 66 5c 6e 22 2c 0a 20 20 20 20 20  sys %f\n",.     
2360: 20 20 28 66 74 57 61 6c 6c 45 6e 64 20 2d 20 66    (ftWallEnd - f
2370: 74 57 61 6c 6c 42 65 67 69 6e 29 2a 30 2e 30 30  tWallBegin)*0.00
2380: 31 2c 0a 20 20 20 20 20 20 20 74 69 6d 65 44 69  1,.       timeDi
2390: 66 66 28 26 66 74 55 73 65 72 42 65 67 69 6e 2c  ff(&ftUserBegin,
23a0: 20 26 66 74 55 73 65 72 45 6e 64 29 2c 0a 20 20   &ftUserEnd),.  
23b0: 20 20 20 20 20 74 69 6d 65 44 69 66 66 28 26 66       timeDiff(&f
23c0: 74 4b 65 72 6e 65 6c 42 65 67 69 6e 2c 20 26 66  tKernelBegin, &f
23d0: 74 4b 65 72 6e 65 6c 45 6e 64 29 29 3b 0a 20 20  tKernelEnd));.  
23e0: 7d 0a 7d 0a 0a 23 64 65 66 69 6e 65 20 42 45 47  }.}..#define BEG
23f0: 49 4e 5f 54 49 4d 45 52 20 62 65 67 69 6e 54 69  IN_TIMER beginTi
2400: 6d 65 72 28 29 0a 23 64 65 66 69 6e 65 20 45 4e  mer().#define EN
2410: 44 5f 54 49 4d 45 52 20 65 6e 64 54 69 6d 65 72  D_TIMER endTimer
2420: 28 29 0a 23 64 65 66 69 6e 65 20 48 41 53 5f 54  ().#define HAS_T
2430: 49 4d 45 52 20 68 61 73 54 69 6d 65 72 28 29 0a  IMER hasTimer().
2440: 0a 23 65 6c 73 65 0a 23 64 65 66 69 6e 65 20 42  .#else.#define B
2450: 45 47 49 4e 5f 54 49 4d 45 52 0a 23 64 65 66 69  EGIN_TIMER.#defi
2460: 6e 65 20 45 4e 44 5f 54 49 4d 45 52 0a 23 64 65  ne END_TIMER.#de
2470: 66 69 6e 65 20 48 41 53 5f 54 49 4d 45 52 20 30  fine HAS_TIMER 0
2480: 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 55  .#endif../*.** U
2490: 73 65 64 20 74 6f 20 70 72 65 76 65 6e 74 20 77  sed to prevent w
24a0: 61 72 6e 69 6e 67 73 20 61 62 6f 75 74 20 75 6e  arnings about un
24b0: 75 73 65 64 20 70 61 72 61 6d 65 74 65 72 73 0a  used parameters.
24c0: 2a 2f 0a 23 64 65 66 69 6e 65 20 55 4e 55 53 45  */.#define UNUSE
24d0: 44 5f 50 41 52 41 4d 45 54 45 52 28 78 29 20 28  D_PARAMETER(x) (
24e0: 76 6f 69 64 29 28 78 29 0a 0a 2f 2a 0a 2a 2a 20  void)(x)../*.** 
24f0: 49 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  If the following
2500: 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20 74 68   flag is set, th
2510: 65 6e 20 63 6f 6d 6d 61 6e 64 20 65 78 65 63 75  en command execu
2520: 74 69 6f 6e 20 73 74 6f 70 73 0a 2a 2a 20 61 74  tion stops.** at
2530: 20 61 6e 20 65 72 72 6f 72 20 69 66 20 77 65 20   an error if we 
2540: 61 72 65 20 6e 6f 74 20 69 6e 74 65 72 61 63 74  are not interact
2550: 69 76 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ive..*/.static i
2560: 6e 74 20 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72  nt bail_on_error
2570: 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 72   = 0;../*.** Thr
2580: 65 61 74 20 73 74 64 69 6e 20 61 73 20 61 6e 20  eat stdin as an 
2590: 69 6e 74 65 72 61 63 74 69 76 65 20 69 6e 70 75  interactive inpu
25a0: 74 20 69 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  t if the followi
25b0: 6e 67 20 76 61 72 69 61 62 6c 65 0a 2a 2a 20 69  ng variable.** i
25c0: 73 20 74 72 75 65 2e 20 20 4f 74 68 65 72 77 69  s true.  Otherwi
25d0: 73 65 2c 20 61 73 73 75 6d 65 20 73 74 64 69 6e  se, assume stdin
25e0: 20 69 73 20 63 6f 6e 6e 65 63 74 65 64 20 74 6f   is connected to
25f0: 20 61 20 66 69 6c 65 20 6f 72 20 70 69 70 65 2e   a file or pipe.
2600: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
2610: 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63 74  tdin_is_interact
2620: 69 76 65 20 3d 20 31 3b 0a 0a 2f 2a 0a 2a 2a 20  ive = 1;../*.** 
2630: 4f 6e 20 57 69 6e 64 6f 77 73 20 73 79 73 74 65  On Windows syste
2640: 6d 73 20 77 65 20 68 61 76 65 20 74 6f 20 6b 6e  ms we have to kn
2650: 6f 77 20 69 66 20 73 74 61 6e 64 61 72 64 20 6f  ow if standard o
2660: 75 74 70 75 74 20 69 73 20 61 20 63 6f 6e 73 6f  utput is a conso
2670: 6c 65 0a 2a 2a 20 69 6e 20 6f 72 64 65 72 20 74  le.** in order t
2680: 6f 20 74 72 61 6e 73 6c 61 74 65 20 55 54 46 2d  o translate UTF-
2690: 38 20 69 6e 74 6f 20 4d 42 43 53 2e 20 20 54 68  8 into MBCS.  Th
26a0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 76 61 72 69  e following vari
26b0: 61 62 6c 65 20 69 73 0a 2a 2a 20 74 72 75 65 20  able is.** true 
26c0: 69 66 20 74 72 61 6e 73 6c 61 74 69 6f 6e 20 69  if translation i
26d0: 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73  s required..*/.s
26e0: 74 61 74 69 63 20 69 6e 74 20 73 74 64 6f 75 74  tatic int stdout
26f0: 5f 69 73 5f 63 6f 6e 73 6f 6c 65 20 3d 20 31 3b  _is_console = 1;
2700: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
2710: 6f 77 69 6e 67 20 69 73 20 74 68 65 20 6f 70 65  owing is the ope
2720: 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  n SQLite databas
2730: 65 2e 20 20 57 65 20 6d 61 6b 65 20 61 20 70 6f  e.  We make a po
2740: 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74 68 69 73  inter.** to this
2750: 20 64 61 74 61 62 61 73 65 20 61 20 73 74 61 74   database a stat
2760: 69 63 20 76 61 72 69 61 62 6c 65 20 73 6f 20 74  ic variable so t
2770: 68 61 74 20 69 74 20 63 61 6e 20 62 65 20 61 63  hat it can be ac
2780: 63 65 73 73 65 64 0a 2a 2a 20 62 79 20 74 68 65  cessed.** by the
2790: 20 53 49 47 49 4e 54 20 68 61 6e 64 6c 65 72 20   SIGINT handler 
27a0: 74 6f 20 69 6e 74 65 72 72 75 70 74 20 64 61 74  to interrupt dat
27b0: 61 62 61 73 65 20 70 72 6f 63 65 73 73 69 6e 67  abase processing
27c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 73 71 6c 69  ..*/.static sqli
27d0: 74 65 33 20 2a 67 6c 6f 62 61 6c 44 62 20 3d 20  te3 *globalDb = 
27e0: 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54 72 75 65 20 69  0;../*.** True i
27f0: 66 20 61 6e 20 69 6e 74 65 72 72 75 70 74 20 28  f an interrupt (
2800: 43 6f 6e 74 72 6f 6c 2d 43 29 20 68 61 73 20 62  Control-C) has b
2810: 65 65 6e 20 72 65 63 65 69 76 65 64 2e 0a 2a 2f  een received..*/
2820: 0a 73 74 61 74 69 63 20 76 6f 6c 61 74 69 6c 65  .static volatile
2830: 20 69 6e 74 20 73 65 65 6e 49 6e 74 65 72 72 75   int seenInterru
2840: 70 74 20 3d 20 30 3b 0a 0a 2f 2a 0a 2a 2a 20 54  pt = 0;../*.** T
2850: 68 69 73 20 69 73 20 74 68 65 20 6e 61 6d 65 20  his is the name 
2860: 6f 66 20 6f 75 72 20 70 72 6f 67 72 61 6d 2e 20  of our program. 
2870: 49 74 20 69 73 20 73 65 74 20 69 6e 20 6d 61 69  It is set in mai
2880: 6e 28 29 2c 20 75 73 65 64 0a 2a 2a 20 69 6e 20  n(), used.** in 
2890: 61 20 6e 75 6d 62 65 72 20 6f 66 20 6f 74 68 65  a number of othe
28a0: 72 20 70 6c 61 63 65 73 2c 20 6d 6f 73 74 6c 79  r places, mostly
28b0: 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61   for error messa
28c0: 67 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ges..*/.static c
28d0: 68 61 72 20 2a 41 72 67 76 30 3b 0a 0a 2f 2a 0a  har *Argv0;../*.
28e0: 2a 2a 20 50 72 6f 6d 70 74 20 73 74 72 69 6e 67  ** Prompt string
28f0: 73 2e 20 49 6e 69 74 69 61 6c 69 7a 65 64 20 69  s. Initialized i
2900: 6e 20 6d 61 69 6e 2e 20 53 65 74 74 61 62 6c 65  n main. Settable
2910: 20 77 69 74 68 0a 2a 2a 20 20 20 2e 70 72 6f 6d   with.**   .prom
2920: 70 74 20 6d 61 69 6e 20 63 6f 6e 74 69 6e 75 65  pt main continue
2930: 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20  .*/.static char 
2940: 6d 61 69 6e 50 72 6f 6d 70 74 5b 32 30 5d 3b 20  mainPrompt[20]; 
2950: 20 20 20 20 2f 2a 20 46 69 72 73 74 20 6c 69 6e      /* First lin
2960: 65 20 70 72 6f 6d 70 74 2e 20 64 65 66 61 75 6c  e prompt. defaul
2970: 74 3a 20 22 73 71 6c 69 74 65 3e 20 22 2a 2f 0a  t: "sqlite> "*/.
2980: 73 74 61 74 69 63 20 63 68 61 72 20 63 6f 6e 74  static char cont
2990: 69 6e 75 65 50 72 6f 6d 70 74 5b 32 30 5d 3b 20  inuePrompt[20]; 
29a0: 2f 2a 20 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 20  /* Continuation 
29b0: 70 72 6f 6d 70 74 2e 20 64 65 66 61 75 6c 74 3a  prompt. default:
29c0: 20 22 20 20 20 2e 2e 2e 3e 20 22 20 2a 2f 0a 0a   "   ...> " */..
29d0: 2f 2a 0a 2a 2a 20 52 65 6e 64 65 72 20 6f 75 74  /*.** Render out
29e0: 70 75 74 20 6c 69 6b 65 20 66 70 72 69 6e 74 66  put like fprintf
29f0: 28 29 2e 20 20 45 78 63 65 70 74 2c 20 69 66 20  ().  Except, if 
2a00: 74 68 65 20 6f 75 74 70 75 74 20 69 73 20 67 6f  the output is go
2a10: 69 6e 67 20 74 6f 20 74 68 65 0a 2a 2a 20 63 6f  ing to the.** co
2a20: 6e 73 6f 6c 65 20 61 6e 64 20 69 66 20 74 68 69  nsole and if thi
2a30: 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 6f 6e 20  s is running on 
2a40: 61 20 57 69 6e 64 6f 77 73 20 6d 61 63 68 69 6e  a Windows machin
2a50: 65 2c 20 74 72 61 6e 73 6c 61 74 65 20 74 68 65  e, translate the
2a60: 0a 2a 2a 20 6f 75 74 70 75 74 20 66 72 6f 6d 20  .** output from 
2a70: 55 54 46 2d 38 20 69 6e 74 6f 20 4d 42 43 53 2e  UTF-8 into MBCS.
2a80: 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .*/.#if defined(
2a90: 5f 57 49 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e  _WIN32) || defin
2aa0: 65 64 28 57 49 4e 33 32 29 0a 76 6f 69 64 20 75  ed(WIN32).void u
2ab0: 74 66 38 5f 70 72 69 6e 74 66 28 46 49 4c 45 20  tf8_printf(FILE 
2ac0: 2a 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72  *out, const char
2ad0: 20 2a 7a 46 6f 72 6d 61 74 2c 20 2e 2e 2e 29 7b   *zFormat, ...){
2ae0: 0a 20 20 76 61 5f 6c 69 73 74 20 61 70 3b 0a 20  .  va_list ap;. 
2af0: 20 76 61 5f 73 74 61 72 74 28 61 70 2c 20 7a 46   va_start(ap, zF
2b00: 6f 72 6d 61 74 29 3b 0a 20 20 69 66 28 20 73 74  ormat);.  if( st
2b10: 64 6f 75 74 5f 69 73 5f 63 6f 6e 73 6f 6c 65 20  dout_is_console 
2b20: 26 26 20 28 6f 75 74 3d 3d 73 74 64 6f 75 74 20  && (out==stdout 
2b30: 7c 7c 20 6f 75 74 3d 3d 73 74 64 65 72 72 29 20  || out==stderr) 
2b40: 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 31 20  ){.    char *z1 
2b50: 3d 20 73 71 6c 69 74 65 33 5f 76 6d 70 72 69 6e  = sqlite3_vmprin
2b60: 74 66 28 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b  tf(zFormat, ap);
2b70: 0a 20 20 20 20 63 68 61 72 20 2a 7a 32 20 3d 20  .    char *z2 = 
2b80: 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75 74  sqlite3_win32_ut
2b90: 66 38 5f 74 6f 5f 6d 62 63 73 5f 76 32 28 7a 31  f8_to_mbcs_v2(z1
2ba0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
2bb0: 33 5f 66 72 65 65 28 7a 31 29 3b 0a 20 20 20 20  3_free(z1);.    
2bc0: 66 70 75 74 73 28 7a 32 2c 20 6f 75 74 29 3b 0a  fputs(z2, out);.
2bd0: 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65      sqlite3_free
2be0: 28 7a 32 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  (z2);.  }else{. 
2bf0: 20 20 20 76 66 70 72 69 6e 74 66 28 6f 75 74 2c     vfprintf(out,
2c00: 20 7a 46 6f 72 6d 61 74 2c 20 61 70 29 3b 0a 20   zFormat, ap);. 
2c10: 20 7d 0a 20 20 76 61 5f 65 6e 64 28 61 70 29 3b   }.  va_end(ap);
2c20: 0a 7d 0a 23 65 6c 69 66 20 21 64 65 66 69 6e 65  .}.#elif !define
2c30: 64 28 75 74 66 38 5f 70 72 69 6e 74 66 29 0a 23  d(utf8_printf).#
2c40: 20 64 65 66 69 6e 65 20 75 74 66 38 5f 70 72 69   define utf8_pri
2c50: 6e 74 66 20 66 70 72 69 6e 74 66 0a 23 65 6e 64  ntf fprintf.#end
2c60: 69 66 0a 0a 2f 2a 0a 2a 2a 20 52 65 6e 64 65 72  if../*.** Render
2c70: 20 6f 75 74 70 75 74 20 6c 69 6b 65 20 66 70 72   output like fpr
2c80: 69 6e 74 66 28 29 2e 20 20 54 68 69 73 20 73 68  intf().  This sh
2c90: 6f 75 6c 64 20 6e 6f 74 20 62 65 20 75 73 65 64  ould not be used
2ca0: 20 6f 6e 20 61 6e 79 74 68 69 6e 67 20 74 68 61   on anything tha
2cb0: 74 0a 2a 2a 20 69 6e 63 6c 75 64 65 73 20 73 74  t.** includes st
2cc0: 72 69 6e 67 20 66 6f 72 6d 61 74 74 69 6e 67 20  ring formatting 
2cd0: 28 65 2e 67 2e 20 22 25 73 22 29 2e 0a 2a 2f 0a  (e.g. "%s")..*/.
2ce0: 23 69 66 20 21 64 65 66 69 6e 65 64 28 72 61 77  #if !defined(raw
2cf0: 5f 70 72 69 6e 74 66 29 0a 23 20 64 65 66 69 6e  _printf).# defin
2d00: 65 20 72 61 77 5f 70 72 69 6e 74 66 20 66 70 72  e raw_printf fpr
2d10: 69 6e 74 66 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a  intf.#endif../*.
2d20: 2a 2a 20 57 72 69 74 65 20 49 2f 4f 20 74 72 61  ** Write I/O tra
2d30: 63 65 73 20 74 6f 20 74 68 65 20 66 6f 6c 6c 6f  ces to the follo
2d40: 77 69 6e 67 20 73 74 72 65 61 6d 2e 0a 2a 2f 0a  wing stream..*/.
2d50: 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e  #ifdef SQLITE_EN
2d60: 41 42 4c 45 5f 49 4f 54 52 41 43 45 0a 73 74 61  ABLE_IOTRACE.sta
2d70: 74 69 63 20 46 49 4c 45 20 2a 69 6f 74 72 61 63  tic FILE *iotrac
2d80: 65 20 3d 20 30 3b 0a 23 65 6e 64 69 66 0a 0a 2f  e = 0;.#endif../
2d90: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
2da0: 65 20 77 6f 72 6b 73 20 6c 69 6b 65 20 70 72 69  e works like pri
2db0: 6e 74 66 20 69 6e 20 74 68 61 74 20 69 74 73 20  ntf in that its 
2dc0: 66 69 72 73 74 20 61 72 67 75 6d 65 6e 74 20 69  first argument i
2dd0: 73 20 61 0a 2a 2a 20 66 6f 72 6d 61 74 20 73 74  s a.** format st
2de0: 72 69 6e 67 20 61 6e 64 20 73 75 62 73 65 71 75  ring and subsequ
2df0: 65 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 61 72  ent arguments ar
2e00: 65 20 76 61 6c 75 65 73 20 74 6f 20 62 65 20 73  e values to be s
2e10: 75 62 73 74 69 74 75 74 65 64 0a 2a 2a 20 69 6e  ubstituted.** in
2e20: 20 70 6c 61 63 65 20 6f 66 20 25 20 66 69 65 6c   place of % fiel
2e30: 64 73 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20  ds.  The result 
2e40: 6f 66 20 66 6f 72 6d 61 74 74 69 6e 67 20 74 68  of formatting th
2e50: 69 73 20 73 74 72 69 6e 67 0a 2a 2a 20 69 73 20  is string.** is 
2e60: 77 72 69 74 74 65 6e 20 74 6f 20 69 6f 74 72 61  written to iotra
2e70: 63 65 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 53 51  ce..*/.#ifdef SQ
2e80: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 49 4f 54 52  LITE_ENABLE_IOTR
2e90: 41 43 45 0a 73 74 61 74 69 63 20 76 6f 69 64 20  ACE.static void 
2ea0: 53 51 4c 49 54 45 5f 43 44 45 43 4c 20 69 6f 74  SQLITE_CDECL iot
2eb0: 72 61 63 65 50 72 69 6e 74 66 28 63 6f 6e 73 74  racePrintf(const
2ec0: 20 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20   char *zFormat, 
2ed0: 2e 2e 2e 29 7b 0a 20 20 76 61 5f 6c 69 73 74 20  ...){.  va_list 
2ee0: 61 70 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 20  ap;.  char *z;. 
2ef0: 20 69 66 28 20 69 6f 74 72 61 63 65 3d 3d 30 20   if( iotrace==0 
2f00: 29 20 72 65 74 75 72 6e 3b 0a 20 20 76 61 5f 73  ) return;.  va_s
2f10: 74 61 72 74 28 61 70 2c 20 7a 46 6f 72 6d 61 74  tart(ap, zFormat
2f20: 29 3b 0a 20 20 7a 20 3d 20 73 71 6c 69 74 65 33  );.  z = sqlite3
2f30: 5f 76 6d 70 72 69 6e 74 66 28 7a 46 6f 72 6d 61  _vmprintf(zForma
2f40: 74 2c 20 61 70 29 3b 0a 20 20 76 61 5f 65 6e 64  t, ap);.  va_end
2f50: 28 61 70 29 3b 0a 20 20 75 74 66 38 5f 70 72 69  (ap);.  utf8_pri
2f60: 6e 74 66 28 69 6f 74 72 61 63 65 2c 20 22 25 73  ntf(iotrace, "%s
2f70: 22 2c 20 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33  ", z);.  sqlite3
2f80: 5f 66 72 65 65 28 7a 29 3b 0a 7d 0a 23 65 6e 64  _free(z);.}.#end
2f90: 69 66 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74  if../*.** Output
2fa0: 20 73 74 72 69 6e 67 20 7a 55 74 66 20 74 6f 20   string zUtf to 
2fb0: 73 74 72 65 61 6d 20 70 4f 75 74 20 61 73 20 77  stream pOut as w
2fc0: 20 63 68 61 72 61 63 74 65 72 73 2e 20 20 49 66   characters.  If
2fd0: 20 77 20 69 73 20 6e 65 67 61 74 69 76 65 2c 0a   w is negative,.
2fe0: 2a 2a 20 74 68 65 6e 20 72 69 67 68 74 2d 6a 75  ** then right-ju
2ff0: 73 74 69 66 79 20 74 68 65 20 74 65 78 74 2e 20  stify the text. 
3000: 20 57 20 69 73 20 74 68 65 20 77 69 64 74 68 20   W is the width 
3010: 69 6e 20 55 54 46 2d 38 20 63 68 61 72 61 63 74  in UTF-8 charact
3020: 65 72 73 2c 20 6e 6f 74 0a 2a 2a 20 69 6e 20 62  ers, not.** in b
3030: 79 74 65 73 2e 20 20 54 68 69 73 20 69 73 20 64  ytes.  This is d
3040: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 74 68  ifferent from th
3050: 65 20 25 2a 2e 2a 73 20 73 70 65 63 69 66 69 63  e %*.*s specific
3060: 61 74 69 6f 6e 20 69 6e 20 70 72 69 6e 74 66 0a  ation in printf.
3070: 2a 2a 20 73 69 6e 63 65 20 77 69 74 68 20 25 2a  ** since with %*
3080: 2e 2a 73 20 74 68 65 20 77 69 64 74 68 20 69 73  .*s the width is
3090: 20 6d 65 61 73 75 72 65 64 20 69 6e 20 62 79 74   measured in byt
30a0: 65 73 2c 20 6e 6f 74 20 63 68 61 72 61 63 74 65  es, not characte
30b0: 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  rs..*/.static vo
30c0: 69 64 20 75 74 66 38 5f 77 69 64 74 68 5f 70 72  id utf8_width_pr
30d0: 69 6e 74 28 46 49 4c 45 20 2a 70 4f 75 74 2c 20  int(FILE *pOut, 
30e0: 69 6e 74 20 77 2c 20 63 6f 6e 73 74 20 63 68 61  int w, const cha
30f0: 72 20 2a 7a 55 74 66 29 7b 0a 20 20 69 6e 74 20  r *zUtf){.  int 
3100: 69 3b 0a 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e  i;.  int n;.  in
3110: 74 20 61 77 20 3d 20 77 3c 30 20 3f 20 2d 77 20  t aw = w<0 ? -w 
3120: 3a 20 77 3b 0a 20 20 63 68 61 72 20 7a 42 75 66  : w;.  char zBuf
3130: 5b 31 30 30 30 5d 3b 0a 20 20 69 66 28 20 61 77  [1000];.  if( aw
3140: 3e 28 69 6e 74 29 73 69 7a 65 6f 66 28 7a 42 75  >(int)sizeof(zBu
3150: 66 29 2f 33 20 29 20 61 77 20 3d 20 28 69 6e 74  f)/3 ) aw = (int
3160: 29 73 69 7a 65 6f 66 28 7a 42 75 66 29 2f 33 3b  )sizeof(zBuf)/3;
3170: 0a 20 20 66 6f 72 28 69 3d 6e 3d 30 3b 20 7a 55  .  for(i=n=0; zU
3180: 74 66 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  tf[i]; i++){.   
3190: 20 69 66 28 20 28 7a 55 74 66 5b 69 5d 26 30 78   if( (zUtf[i]&0x
31a0: 63 30 29 21 3d 30 78 38 30 20 29 7b 0a 20 20 20  c0)!=0x80 ){.   
31b0: 20 20 20 6e 2b 2b 3b 0a 20 20 20 20 20 20 69 66     n++;.      if
31c0: 28 20 6e 3d 3d 61 77 20 29 7b 0a 20 20 20 20 20  ( n==aw ){.     
31d0: 20 20 20 64 6f 7b 20 69 2b 2b 3b 20 7d 77 68 69     do{ i++; }whi
31e0: 6c 65 28 20 28 7a 55 74 66 5b 69 5d 26 30 78 63  le( (zUtf[i]&0xc
31f0: 30 29 3d 3d 30 78 38 30 20 29 3b 0a 20 20 20 20  0)==0x80 );.    
3200: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
3210: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69   }.    }.  }.  i
3220: 66 28 20 6e 3e 3d 61 77 20 29 7b 0a 20 20 20 20  f( n>=aw ){.    
3230: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 4f 75 74  utf8_printf(pOut
3240: 2c 20 22 25 2e 2a 73 22 2c 20 69 2c 20 7a 55 74  , "%.*s", i, zUt
3250: 66 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  f);.  }else if( 
3260: 77 3c 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f  w<0 ){.    utf8_
3270: 70 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 25 2a  printf(pOut, "%*
3280: 73 25 73 22 2c 20 61 77 2d 6e 2c 20 22 22 2c 20  s%s", aw-n, "", 
3290: 7a 55 74 66 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  zUtf);.  }else{.
32a0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
32b0: 70 4f 75 74 2c 20 22 25 73 25 2a 73 22 2c 20 7a  pOut, "%s%*s", z
32c0: 55 74 66 2c 20 61 77 2d 6e 2c 20 22 22 29 3b 0a  Utf, aw-n, "");.
32d0: 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 44 65    }.}.../*.** De
32e0: 74 65 72 6d 69 6e 65 73 20 69 66 20 61 20 73 74  termines if a st
32f0: 72 69 6e 67 20 69 73 20 61 20 6e 75 6d 62 65 72  ring is a number
3300: 20 6f 66 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74   of not..*/.stat
3310: 69 63 20 69 6e 74 20 69 73 4e 75 6d 62 65 72 28  ic int isNumber(
3320: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69  const char *z, i
3330: 6e 74 20 2a 72 65 61 6c 6e 75 6d 29 7b 0a 20 20  nt *realnum){.  
3340: 69 66 28 20 2a 7a 3d 3d 27 2d 27 20 7c 7c 20 2a  if( *z=='-' || *
3350: 7a 3d 3d 27 2b 27 20 29 20 7a 2b 2b 3b 0a 20 20  z=='+' ) z++;.  
3360: 69 66 28 20 21 49 73 44 69 67 69 74 28 2a 7a 29  if( !IsDigit(*z)
3370: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
3380: 3b 0a 20 20 7d 0a 20 20 7a 2b 2b 3b 0a 20 20 69  ;.  }.  z++;.  i
3390: 66 28 20 72 65 61 6c 6e 75 6d 20 29 20 2a 72 65  f( realnum ) *re
33a0: 61 6c 6e 75 6d 20 3d 20 30 3b 0a 20 20 77 68 69  alnum = 0;.  whi
33b0: 6c 65 28 20 49 73 44 69 67 69 74 28 2a 7a 29 20  le( IsDigit(*z) 
33c0: 29 7b 20 7a 2b 2b 3b 20 7d 0a 20 20 69 66 28 20  ){ z++; }.  if( 
33d0: 2a 7a 3d 3d 27 2e 27 20 29 7b 0a 20 20 20 20 7a  *z=='.' ){.    z
33e0: 2b 2b 3b 0a 20 20 20 20 69 66 28 20 21 49 73 44  ++;.    if( !IsD
33f0: 69 67 69 74 28 2a 7a 29 20 29 20 72 65 74 75 72  igit(*z) ) retur
3400: 6e 20 30 3b 0a 20 20 20 20 77 68 69 6c 65 28 20  n 0;.    while( 
3410: 49 73 44 69 67 69 74 28 2a 7a 29 20 29 7b 20 7a  IsDigit(*z) ){ z
3420: 2b 2b 3b 20 7d 0a 20 20 20 20 69 66 28 20 72 65  ++; }.    if( re
3430: 61 6c 6e 75 6d 20 29 20 2a 72 65 61 6c 6e 75 6d  alnum ) *realnum
3440: 20 3d 20 31 3b 0a 20 20 7d 0a 20 20 69 66 28 20   = 1;.  }.  if( 
3450: 2a 7a 3d 3d 27 65 27 20 7c 7c 20 2a 7a 3d 3d 27  *z=='e' || *z=='
3460: 45 27 20 29 7b 0a 20 20 20 20 7a 2b 2b 3b 0a 20  E' ){.    z++;. 
3470: 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2b 27 20 7c     if( *z=='+' |
3480: 7c 20 2a 7a 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b  | *z=='-' ) z++;
3490: 0a 20 20 20 20 69 66 28 20 21 49 73 44 69 67 69  .    if( !IsDigi
34a0: 74 28 2a 7a 29 20 29 20 72 65 74 75 72 6e 20 30  t(*z) ) return 0
34b0: 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 49 73 44  ;.    while( IsD
34c0: 69 67 69 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b  igit(*z) ){ z++;
34d0: 20 7d 0a 20 20 20 20 69 66 28 20 72 65 61 6c 6e   }.    if( realn
34e0: 75 6d 20 29 20 2a 72 65 61 6c 6e 75 6d 20 3d 20  um ) *realnum = 
34f0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
3500: 2a 7a 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  *z==0;.}../*.** 
3510: 43 6f 6d 70 75 74 65 20 61 20 73 74 72 69 6e 67  Compute a string
3520: 20 6c 65 6e 67 74 68 20 74 68 61 74 20 69 73 20   length that is 
3530: 6c 69 6d 69 74 65 64 20 74 6f 20 77 68 61 74 20  limited to what 
3540: 63 61 6e 20 62 65 20 73 74 6f 72 65 64 20 69 6e  can be stored in
3550: 0a 2a 2a 20 6c 6f 77 65 72 20 33 30 20 62 69 74  .** lower 30 bit
3560: 73 20 6f 66 20 61 20 33 32 2d 62 69 74 20 73 69  s of a 32-bit si
3570: 67 6e 65 64 20 69 6e 74 65 67 65 72 2e 0a 2a 2f  gned integer..*/
3580: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74 72 6c  .static int strl
3590: 65 6e 33 30 28 63 6f 6e 73 74 20 63 68 61 72 20  en30(const char 
35a0: 2a 7a 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  *z){.  const cha
35b0: 72 20 2a 7a 32 20 3d 20 7a 3b 0a 20 20 77 68 69  r *z2 = z;.  whi
35c0: 6c 65 28 20 2a 7a 32 20 29 7b 20 7a 32 2b 2b 3b  le( *z2 ){ z2++;
35d0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 78 33 66   }.  return 0x3f
35e0: 66 66 66 66 66 66 20 26 20 28 69 6e 74 29 28 7a  ffffff & (int)(z
35f0: 32 20 2d 20 7a 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  2 - z);.}../*.**
3600: 20 52 65 74 75 72 6e 20 74 68 65 20 6c 65 6e 67   Return the leng
3610: 74 68 20 6f 66 20 61 20 73 74 72 69 6e 67 20 69  th of a string i
3620: 6e 20 63 68 61 72 61 63 74 65 72 73 2e 20 20 4d  n characters.  M
3630: 75 6c 74 69 62 79 74 65 20 55 54 46 38 20 63 68  ultibyte UTF8 ch
3640: 61 72 61 63 74 65 72 73 0a 2a 2a 20 63 6f 75 6e  aracters.** coun
3650: 74 20 61 73 20 61 20 73 69 6e 67 6c 65 20 63 68  t as a single ch
3660: 61 72 61 63 74 65 72 2e 0a 2a 2f 0a 73 74 61 74  aracter..*/.stat
3670: 69 63 20 69 6e 74 20 73 74 72 6c 65 6e 43 68 61  ic int strlenCha
3680: 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  r(const char *z)
3690: 7b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b 0a 20  {.  int n = 0;. 
36a0: 20 77 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20   while( *z ){.  
36b0: 20 20 69 66 28 20 28 30 78 63 30 26 2a 28 7a 2b    if( (0xc0&*(z+
36c0: 2b 29 29 21 3d 30 78 38 30 20 29 20 6e 2b 2b 3b  +))!=0x80 ) n++;
36d0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
36e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
36f0: 6f 75 74 69 6e 65 20 72 65 61 64 73 20 61 20 6c  outine reads a l
3700: 69 6e 65 20 6f 66 20 74 65 78 74 20 66 72 6f 6d  ine of text from
3710: 20 46 49 4c 45 20 69 6e 2c 20 73 74 6f 72 65 73   FILE in, stores
3720: 0a 2a 2a 20 74 68 65 20 74 65 78 74 20 69 6e 20  .** the text in 
3730: 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 20  memory obtained 
3740: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e  from malloc() an
3750: 64 20 72 65 74 75 72 6e 73 20 61 20 70 6f 69 6e  d returns a poin
3760: 74 65 72 0a 2a 2a 20 74 6f 20 74 68 65 20 74 65  ter.** to the te
3770: 78 74 2e 20 20 4e 55 4c 4c 20 69 73 20 72 65 74  xt.  NULL is ret
3780: 75 72 6e 65 64 20 61 74 20 65 6e 64 20 6f 66 20  urned at end of 
3790: 66 69 6c 65 2c 20 6f 72 20 69 66 20 6d 61 6c 6c  file, or if mall
37a0: 6f 63 28 29 0a 2a 2a 20 66 61 69 6c 73 2e 0a 2a  oc().** fails..*
37b0: 2a 0a 2a 2a 20 49 66 20 7a 4c 69 6e 65 20 69 73  *.** If zLine is
37c0: 20 6e 6f 74 20 4e 55 4c 4c 20 74 68 65 6e 20 69   not NULL then i
37d0: 74 20 69 73 20 61 20 6d 61 6c 6c 6f 63 65 64 20  t is a malloced 
37e0: 62 75 66 66 65 72 20 72 65 74 75 72 6e 65 64 20  buffer returned 
37f0: 66 72 6f 6d 0a 2a 2a 20 61 20 70 72 65 76 69 6f  from.** a previo
3800: 75 73 20 63 61 6c 6c 20 74 6f 20 74 68 69 73 20  us call to this 
3810: 72 6f 75 74 69 6e 65 20 74 68 61 74 20 6d 61 79  routine that may
3820: 20 62 65 20 72 65 75 73 65 64 2e 0a 2a 2f 0a 73   be reused..*/.s
3830: 74 61 74 69 63 20 63 68 61 72 20 2a 6c 6f 63 61  tatic char *loca
3840: 6c 5f 67 65 74 6c 69 6e 65 28 63 68 61 72 20 2a  l_getline(char *
3850: 7a 4c 69 6e 65 2c 20 46 49 4c 45 20 2a 69 6e 29  zLine, FILE *in)
3860: 7b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 20 3d 20  {.  int nLine = 
3870: 7a 4c 69 6e 65 3d 3d 30 20 3f 20 30 20 3a 20 31  zLine==0 ? 0 : 1
3880: 30 30 3b 0a 20 20 69 6e 74 20 6e 20 3d 20 30 3b  00;.  int n = 0;
3890: 0a 0a 20 20 77 68 69 6c 65 28 20 31 20 29 7b 0a  ..  while( 1 ){.
38a0: 20 20 20 20 69 66 28 20 6e 2b 31 30 30 3e 6e 4c      if( n+100>nL
38b0: 69 6e 65 20 29 7b 0a 20 20 20 20 20 20 6e 4c 69  ine ){.      nLi
38c0: 6e 65 20 3d 20 6e 4c 69 6e 65 2a 32 20 2b 20 31  ne = nLine*2 + 1
38d0: 30 30 3b 0a 20 20 20 20 20 20 7a 4c 69 6e 65 20  00;.      zLine 
38e0: 3d 20 72 65 61 6c 6c 6f 63 28 7a 4c 69 6e 65 2c  = realloc(zLine,
38f0: 20 6e 4c 69 6e 65 29 3b 0a 20 20 20 20 20 20 69   nLine);.      i
3900: 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 20 72 65  f( zLine==0 ) re
3910: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
3920: 20 20 69 66 28 20 66 67 65 74 73 28 26 7a 4c 69    if( fgets(&zLi
3930: 6e 65 5b 6e 5d 2c 20 6e 4c 69 6e 65 20 2d 20 6e  ne[n], nLine - n
3940: 2c 20 69 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  , in)==0 ){.    
3950: 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
3960: 20 20 20 20 20 20 66 72 65 65 28 7a 4c 69 6e 65        free(zLine
3970: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
3980: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
3990: 20 20 20 7a 4c 69 6e 65 5b 6e 5d 20 3d 20 30 3b     zLine[n] = 0;
39a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
39b0: 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 7a    }.    while( z
39c0: 4c 69 6e 65 5b 6e 5d 20 29 20 6e 2b 2b 3b 0a 20  Line[n] ) n++;. 
39d0: 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 7a 4c     if( n>0 && zL
39e0: 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 6e 27 20 29  ine[n-1]=='\n' )
39f0: 7b 0a 20 20 20 20 20 20 6e 2d 2d 3b 0a 20 20 20  {.      n--;.   
3a00: 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 7a 4c     if( n>0 && zL
3a10: 69 6e 65 5b 6e 2d 31 5d 3d 3d 27 5c 72 27 20 29  ine[n-1]=='\r' )
3a20: 20 6e 2d 2d 3b 0a 20 20 20 20 20 20 7a 4c 69 6e   n--;.      zLin
3a30: 65 5b 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  e[n] = 0;.      
3a40: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
3a50: 0a 23 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49  .#if defined(_WI
3a60: 4e 33 32 29 20 7c 7c 20 64 65 66 69 6e 65 64 28  N32) || defined(
3a70: 57 49 4e 33 32 29 0a 20 20 2f 2a 20 46 6f 72 20  WIN32).  /* For 
3a80: 69 6e 74 65 72 61 63 74 69 76 65 20 69 6e 70 75  interactive inpu
3a90: 74 20 6f 6e 20 57 69 6e 64 6f 77 73 20 73 79 73  t on Windows sys
3aa0: 74 65 6d 73 2c 20 74 72 61 6e 73 6c 61 74 65 20  tems, translate 
3ab0: 74 68 65 0a 20 20 2a 2a 20 6d 75 6c 74 69 2d 62  the.  ** multi-b
3ac0: 79 74 65 20 63 68 61 72 61 63 74 65 72 73 65 74  yte characterset
3ad0: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 74 6f   characters into
3ae0: 20 55 54 46 2d 38 2e 20 2a 2f 0a 20 20 69 66 28   UTF-8. */.  if(
3af0: 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61   stdin_is_intera
3b00: 63 74 69 76 65 20 26 26 20 69 6e 3d 3d 73 74 64  ctive && in==std
3b10: 69 6e 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  in ){.    char *
3b20: 7a 54 72 61 6e 73 20 3d 20 73 71 6c 69 74 65 33  zTrans = sqlite3
3b30: 5f 77 69 6e 33 32 5f 6d 62 63 73 5f 74 6f 5f 75  _win32_mbcs_to_u
3b40: 74 66 38 5f 76 32 28 7a 4c 69 6e 65 2c 20 30 29  tf8_v2(zLine, 0)
3b50: 3b 0a 20 20 20 20 69 66 28 20 7a 54 72 61 6e 73  ;.    if( zTrans
3b60: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54   ){.      int nT
3b70: 72 61 6e 73 20 3d 20 73 74 72 6c 65 6e 33 30 28  rans = strlen30(
3b80: 7a 54 72 61 6e 73 29 2b 31 3b 0a 20 20 20 20 20  zTrans)+1;.     
3b90: 20 69 66 28 20 6e 54 72 61 6e 73 3e 6e 4c 69 6e   if( nTrans>nLin
3ba0: 65 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69  e ){.        zLi
3bb0: 6e 65 20 3d 20 72 65 61 6c 6c 6f 63 28 7a 4c 69  ne = realloc(zLi
3bc0: 6e 65 2c 20 6e 54 72 61 6e 73 29 3b 0a 20 20 20  ne, nTrans);.   
3bd0: 20 20 20 20 20 69 66 28 20 7a 4c 69 6e 65 3d 3d       if( zLine==
3be0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  0 ){.          s
3bf0: 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 54 72 61  qlite3_free(zTra
3c00: 6e 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72  ns);.          r
3c10: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
3c20: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
3c30: 20 6d 65 6d 63 70 79 28 7a 4c 69 6e 65 2c 20 7a   memcpy(zLine, z
3c40: 54 72 61 6e 73 2c 20 6e 54 72 61 6e 73 29 3b 0a  Trans, nTrans);.
3c50: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
3c60: 65 65 28 7a 54 72 61 6e 73 29 3b 0a 20 20 20 20  ee(zTrans);.    
3c70: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20  }.  }.#endif /* 
3c80: 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20  defined(_WIN32) 
3c90: 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32  || defined(WIN32
3ca0: 29 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 7a 4c  ) */.  return zL
3cb0: 69 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  ine;.}../*.** Re
3cc0: 74 72 69 65 76 65 20 61 20 73 69 6e 67 6c 65 20  trieve a single 
3cd0: 6c 69 6e 65 20 6f 66 20 69 6e 70 75 74 20 74 65  line of input te
3ce0: 78 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 69 6e 3d  xt..**.** If in=
3cf0: 3d 30 20 74 68 65 6e 20 72 65 61 64 20 66 72 6f  =0 then read fro
3d00: 6d 20 73 74 61 6e 64 61 72 64 20 69 6e 70 75 74  m standard input
3d10: 20 61 6e 64 20 70 72 6f 6d 70 74 20 62 65 66 6f   and prompt befo
3d20: 72 65 20 65 61 63 68 20 6c 69 6e 65 2e 0a 2a 2a  re each line..**
3d30: 20 49 66 20 69 73 43 6f 6e 74 69 6e 75 61 74 69   If isContinuati
3d40: 6f 6e 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  on is true, then
3d50: 20 61 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20   a continuation 
3d60: 70 72 6f 6d 70 74 20 69 73 20 61 70 70 72 6f 70  prompt is approp
3d70: 72 69 61 74 65 2e 0a 2a 2a 20 49 66 20 69 73 43  riate..** If isC
3d80: 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 69 73 20 7a  ontinuation is z
3d90: 65 72 6f 2c 20 74 68 65 6e 20 74 68 65 20 6d 61  ero, then the ma
3da0: 69 6e 20 70 72 6f 6d 70 74 20 73 68 6f 75 6c 64  in prompt should
3db0: 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20   be used..**.** 
3dc0: 49 66 20 7a 50 72 69 6f 72 20 69 73 20 6e 6f 74  If zPrior is not
3dd0: 20 4e 55 4c 4c 20 74 68 65 6e 20 69 74 20 69 73   NULL then it is
3de0: 20 61 20 62 75 66 66 65 72 20 66 72 6f 6d 20 61   a buffer from a
3df0: 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 74   prior call to t
3e00: 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e 65 20 74  his.** routine t
3e10: 68 61 74 20 63 61 6e 20 62 65 20 72 65 75 73 65  hat can be reuse
3e20: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 73  d..**.** The res
3e30: 75 6c 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ult is stored in
3e40: 20 73 70 61 63 65 20 6f 62 74 61 69 6e 65 64 20   space obtained 
3e50: 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 20 61 6e  from malloc() an
3e60: 64 20 6d 75 73 74 20 65 69 74 68 65 72 0a 2a 2a  d must either.**
3e70: 20 62 65 20 66 72 65 65 64 20 62 79 20 74 68 65   be freed by the
3e80: 20 63 61 6c 6c 65 72 20 6f 72 20 65 6c 73 65 20   caller or else 
3e90: 70 61 73 73 65 64 20 62 61 63 6b 20 69 6e 74 6f  passed back into
3ea0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 76 69   this routine vi
3eb0: 61 20 74 68 65 0a 2a 2a 20 7a 50 72 69 6f 72 20  a the.** zPrior 
3ec0: 61 72 67 75 6d 65 6e 74 20 66 6f 72 20 72 65 75  argument for reu
3ed0: 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68  se..*/.static ch
3ee0: 61 72 20 2a 6f 6e 65 5f 69 6e 70 75 74 5f 6c 69  ar *one_input_li
3ef0: 6e 65 28 46 49 4c 45 20 2a 69 6e 2c 20 63 68 61  ne(FILE *in, cha
3f00: 72 20 2a 7a 50 72 69 6f 72 2c 20 69 6e 74 20 69  r *zPrior, int i
3f10: 73 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 29 7b 0a  sContinuation){.
3f20: 20 20 63 68 61 72 20 2a 7a 50 72 6f 6d 70 74 3b    char *zPrompt;
3f30: 0a 20 20 63 68 61 72 20 2a 7a 52 65 73 75 6c 74  .  char *zResult
3f40: 3b 0a 20 20 69 66 28 20 69 6e 21 3d 30 20 29 7b  ;.  if( in!=0 ){
3f50: 0a 20 20 20 20 7a 52 65 73 75 6c 74 20 3d 20 6c  .    zResult = l
3f60: 6f 63 61 6c 5f 67 65 74 6c 69 6e 65 28 7a 50 72  ocal_getline(zPr
3f70: 69 6f 72 2c 20 69 6e 29 3b 0a 20 20 7d 65 6c 73  ior, in);.  }els
3f80: 65 7b 0a 20 20 20 20 7a 50 72 6f 6d 70 74 20 3d  e{.    zPrompt =
3f90: 20 69 73 43 6f 6e 74 69 6e 75 61 74 69 6f 6e 20   isContinuation 
3fa0: 3f 20 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74  ? continuePrompt
3fb0: 20 3a 20 6d 61 69 6e 50 72 6f 6d 70 74 3b 0a 23   : mainPrompt;.#
3fc0: 69 66 20 53 48 45 4c 4c 5f 55 53 45 5f 4c 4f 43  if SHELL_USE_LOC
3fd0: 41 4c 5f 47 45 54 4c 49 4e 45 0a 20 20 20 20 70  AL_GETLINE.    p
3fe0: 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 50 72 6f  rintf("%s", zPro
3ff0: 6d 70 74 29 3b 0a 20 20 20 20 66 66 6c 75 73 68  mpt);.    fflush
4000: 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 7a 52  (stdout);.    zR
4010: 65 73 75 6c 74 20 3d 20 6c 6f 63 61 6c 5f 67 65  esult = local_ge
4020: 74 6c 69 6e 65 28 7a 50 72 69 6f 72 2c 20 73 74  tline(zPrior, st
4030: 64 69 6e 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20  din);.#else.    
4040: 66 72 65 65 28 7a 50 72 69 6f 72 29 3b 0a 20 20  free(zPrior);.  
4050: 20 20 7a 52 65 73 75 6c 74 20 3d 20 73 68 65 6c    zResult = shel
4060: 6c 5f 72 65 61 64 6c 69 6e 65 28 7a 50 72 6f 6d  l_readline(zProm
4070: 70 74 29 3b 0a 20 20 20 20 69 66 28 20 7a 52 65  pt);.    if( zRe
4080: 73 75 6c 74 20 26 26 20 2a 7a 52 65 73 75 6c 74  sult && *zResult
4090: 20 29 20 73 68 65 6c 6c 5f 61 64 64 5f 68 69 73   ) shell_add_his
40a0: 74 6f 72 79 28 7a 52 65 73 75 6c 74 29 3b 0a 23  tory(zResult);.#
40b0: 65 6e 64 69 66 0a 20 20 7d 0a 20 20 72 65 74 75  endif.  }.  retu
40c0: 72 6e 20 7a 52 65 73 75 6c 74 3b 0a 7d 0a 2f 2a  rn zResult;.}./*
40d0: 0a 2a 2a 20 41 20 76 61 72 69 61 62 6c 65 20 6c  .** A variable l
40e0: 65 6e 67 74 68 20 73 74 72 69 6e 67 20 74 6f 20  ength string to 
40f0: 77 68 69 63 68 20 6f 6e 65 20 63 61 6e 20 61 70  which one can ap
4100: 70 65 6e 64 20 74 65 78 74 2e 0a 2a 2f 0a 74 79  pend text..*/.ty
4110: 70 65 64 65 66 20 73 74 72 75 63 74 20 53 68 65  pedef struct She
4120: 6c 6c 54 65 78 74 20 53 68 65 6c 6c 54 65 78 74  llText ShellText
4130: 3b 0a 73 74 72 75 63 74 20 53 68 65 6c 6c 54 65  ;.struct ShellTe
4140: 78 74 20 7b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a  xt {.  char *z;.
4150: 20 20 69 6e 74 20 6e 3b 0a 20 20 69 6e 74 20 6e    int n;.  int n
4160: 41 6c 6c 6f 63 3b 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a  Alloc;.};../*.**
4170: 20 49 6e 69 74 69 61 6c 69 7a 65 20 61 6e 64 20   Initialize and 
4180: 64 65 73 74 72 6f 79 20 61 20 53 68 65 6c 6c 54  destroy a ShellT
4190: 65 78 74 20 6f 62 6a 65 63 74 0a 2a 2f 0a 73 74  ext object.*/.st
41a0: 61 74 69 63 20 76 6f 69 64 20 69 6e 69 74 54 65  atic void initTe
41b0: 78 74 28 53 68 65 6c 6c 54 65 78 74 20 2a 70 29  xt(ShellText *p)
41c0: 7b 0a 20 20 6d 65 6d 73 65 74 28 70 2c 20 30 2c  {.  memset(p, 0,
41d0: 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a 7d 0a   sizeof(*p));.}.
41e0: 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
41f0: 54 65 78 74 28 53 68 65 6c 6c 54 65 78 74 20 2a  Text(ShellText *
4200: 70 29 7b 0a 20 20 66 72 65 65 28 70 2d 3e 7a 29  p){.  free(p->z)
4210: 3b 0a 20 20 69 6e 69 74 54 65 78 74 28 70 29 3b  ;.  initText(p);
4220: 0a 7d 0a 0a 2f 2a 20 7a 49 6e 20 69 73 20 65 69  .}../* zIn is ei
4230: 74 68 65 72 20 61 20 70 6f 69 6e 74 65 72 20 74  ther a pointer t
4240: 6f 20 61 20 4e 55 4c 4c 2d 74 65 72 6d 69 6e 61  o a NULL-termina
4250: 74 65 64 20 73 74 72 69 6e 67 20 69 6e 20 6d 65  ted string in me
4260: 6d 6f 72 79 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  mory obtained.**
4270: 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29 2c 20   from malloc(), 
4280: 6f 72 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65  or a NULL pointe
4290: 72 2e 20 54 68 65 20 73 74 72 69 6e 67 20 70 6f  r. The string po
42a0: 69 6e 74 65 64 20 74 6f 20 62 79 20 7a 41 70 70  inted to by zApp
42b0: 65 6e 64 20 69 73 0a 2a 2a 20 61 64 64 65 64 20  end is.** added 
42c0: 74 6f 20 7a 49 6e 2c 20 61 6e 64 20 74 68 65 20  to zIn, and the 
42d0: 72 65 73 75 6c 74 20 72 65 74 75 72 6e 65 64 20  result returned 
42e0: 69 6e 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e  in memory obtain
42f0: 65 64 20 66 72 6f 6d 20 6d 61 6c 6c 6f 63 28 29  ed from malloc()
4300: 2e 0a 2a 2a 20 7a 49 6e 2c 20 69 66 20 69 74 20  ..** zIn, if it 
4310: 77 61 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 69 73  was not NULL, is
4320: 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66   freed..**.** If
4330: 20 74 68 65 20 74 68 69 72 64 20 61 72 67 75 6d   the third argum
4340: 65 6e 74 2c 20 71 75 6f 74 65 2c 20 69 73 20 6e  ent, quote, is n
4350: 6f 74 20 27 5c 30 27 2c 20 74 68 65 6e 20 69 74  ot '\0', then it
4360: 20 69 73 20 75 73 65 64 20 61 73 20 61 0a 2a 2a   is used as a.**
4370: 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72   quote character
4380: 20 66 6f 72 20 7a 41 70 70 65 6e 64 2e 0a 2a 2f   for zAppend..*/
4390: 0a 73 74 61 74 69 63 20 76 6f 69 64 20 61 70 70  .static void app
43a0: 65 6e 64 54 65 78 74 28 53 68 65 6c 6c 54 65 78  endText(ShellTex
43b0: 74 20 2a 70 2c 20 63 68 61 72 20 63 6f 6e 73 74  t *p, char const
43c0: 20 2a 7a 41 70 70 65 6e 64 2c 20 63 68 61 72 20   *zAppend, char 
43d0: 71 75 6f 74 65 29 7b 0a 20 20 69 6e 74 20 6c 65  quote){.  int le
43e0: 6e 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e  n;.  int i;.  in
43f0: 74 20 6e 41 70 70 65 6e 64 20 3d 20 73 74 72 6c  t nAppend = strl
4400: 65 6e 33 30 28 7a 41 70 70 65 6e 64 29 3b 0a 0a  en30(zAppend);..
4410: 20 20 6c 65 6e 20 3d 20 6e 41 70 70 65 6e 64 2b    len = nAppend+
4420: 70 2d 3e 6e 2b 31 3b 0a 20 20 69 66 28 20 71 75  p->n+1;.  if( qu
4430: 6f 74 65 20 29 7b 0a 20 20 20 20 6c 65 6e 20 2b  ote ){.    len +
4440: 3d 20 32 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  = 2;.    for(i=0
4450: 3b 20 69 3c 6e 41 70 70 65 6e 64 3b 20 69 2b 2b  ; i<nAppend; i++
4460: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 70  ){.      if( zAp
4470: 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65 20 29  pend[i]==quote )
4480: 20 6c 65 6e 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20   len++;.    }.  
4490: 7d 0a 0a 20 20 69 66 28 20 70 2d 3e 6e 2b 6c 65  }..  if( p->n+le
44a0: 6e 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63 20 29 7b 0a  n>=p->nAlloc ){.
44b0: 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f 63 20 3d 20      p->nAlloc = 
44c0: 70 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 6c 65  p->nAlloc*2 + le
44d0: 6e 20 2b 20 32 30 3b 0a 20 20 20 20 70 2d 3e 7a  n + 20;.    p->z
44e0: 20 3d 20 72 65 61 6c 6c 6f 63 28 70 2d 3e 7a 2c   = realloc(p->z,
44f0: 20 70 2d 3e 6e 41 6c 6c 6f 63 29 3b 0a 20 20 20   p->nAlloc);.   
4500: 20 69 66 28 20 70 2d 3e 7a 3d 3d 30 20 29 7b 0a   if( p->z==0 ){.
4510: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 70 2c 20        memset(p, 
4520: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 29 29 3b 0a  0, sizeof(*p));.
4530: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
4540: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 71    }.  }..  if( q
4550: 75 6f 74 65 20 29 7b 0a 20 20 20 20 63 68 61 72  uote ){.    char
4560: 20 2a 7a 43 73 72 20 3d 20 70 2d 3e 7a 2b 70 2d   *zCsr = p->z+p-
4570: 3e 6e 3b 0a 20 20 20 20 2a 7a 43 73 72 2b 2b 20  >n;.    *zCsr++ 
4580: 3d 20 71 75 6f 74 65 3b 0a 20 20 20 20 66 6f 72  = quote;.    for
4590: 28 69 3d 30 3b 20 69 3c 6e 41 70 70 65 6e 64 3b  (i=0; i<nAppend;
45a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 2a 7a 43   i++){.      *zC
45b0: 73 72 2b 2b 20 3d 20 7a 41 70 70 65 6e 64 5b 69  sr++ = zAppend[i
45c0: 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 70  ];.      if( zAp
45d0: 70 65 6e 64 5b 69 5d 3d 3d 71 75 6f 74 65 20 29  pend[i]==quote )
45e0: 20 2a 7a 43 73 72 2b 2b 20 3d 20 71 75 6f 74 65   *zCsr++ = quote
45f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2a 7a 43 73  ;.    }.    *zCs
4600: 72 2b 2b 20 3d 20 71 75 6f 74 65 3b 0a 20 20 20  r++ = quote;.   
4610: 20 70 2d 3e 6e 20 3d 20 28 69 6e 74 29 28 7a 43   p->n = (int)(zC
4620: 73 72 20 2d 20 70 2d 3e 7a 29 3b 0a 20 20 20 20  sr - p->z);.    
4630: 2a 7a 43 73 72 20 3d 20 27 5c 30 27 3b 0a 20 20  *zCsr = '\0';.  
4640: 7d 65 6c 73 65 7b 0a 20 20 20 20 6d 65 6d 63 70  }else{.    memcp
4650: 79 28 70 2d 3e 7a 2b 70 2d 3e 6e 2c 20 7a 41 70  y(p->z+p->n, zAp
4660: 70 65 6e 64 2c 20 6e 41 70 70 65 6e 64 29 3b 0a  pend, nAppend);.
4670: 20 20 20 20 70 2d 3e 6e 20 2b 3d 20 6e 41 70 70      p->n += nApp
4680: 65 6e 64 3b 0a 20 20 20 20 70 2d 3e 7a 5b 70 2d  end;.    p->z[p-
4690: 3e 6e 5d 20 3d 20 27 5c 30 27 3b 0a 20 20 7d 0a  >n] = '\0';.  }.
46a0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70 74  }../*.** Attempt
46b0: 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66   to determine if
46c0: 20 69 64 65 6e 74 69 66 69 65 72 20 7a 4e 61 6d   identifier zNam
46d0: 65 20 6e 65 65 64 73 20 74 6f 20 62 65 20 71 75  e needs to be qu
46e0: 6f 74 65 64 2c 20 65 69 74 68 65 72 0a 2a 2a 20  oted, either.** 
46f0: 62 65 63 61 75 73 65 20 69 74 20 63 6f 6e 74 61  because it conta
4700: 69 6e 73 20 6e 6f 6e 2d 61 6c 70 68 61 6e 75 6d  ins non-alphanum
4710: 65 72 69 63 20 63 68 61 72 61 63 74 65 72 73 2c  eric characters,
4720: 20 6f 72 20 62 65 63 61 75 73 65 20 69 74 20 69   or because it i
4730: 73 20 61 6e 0a 2a 2a 20 53 51 4c 69 74 65 20 6b  s an.** SQLite k
4740: 65 79 77 6f 72 64 2e 20 20 42 65 20 63 6f 6e 73  eyword.  Be cons
4750: 65 72 76 61 74 69 76 65 20 69 6e 20 74 68 69 73  ervative in this
4760: 20 65 73 74 69 6d 61 74 65 3a 20 20 57 68 65 6e   estimate:  When
4770: 20 69 6e 20 64 6f 75 62 74 20 61 73 73 75 6d 65   in doubt assume
4780: 0a 2a 2a 20 74 68 61 74 20 71 75 6f 74 69 6e 67  .** that quoting
4790: 20 69 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2a   is required..**
47a0: 0a 2a 2a 20 52 65 74 75 72 6e 20 27 22 27 20 69  .** Return '"' i
47b0: 66 20 71 75 6f 74 69 6e 67 20 69 73 20 72 65 71  f quoting is req
47c0: 75 69 72 65 64 2e 20 20 52 65 74 75 72 6e 20 30  uired.  Return 0
47d0: 20 69 66 20 6e 6f 20 71 75 6f 74 69 6e 67 20 69   if no quoting i
47e0: 73 20 72 65 71 75 69 72 65 64 2e 0a 2a 2f 0a 73  s required..*/.s
47f0: 74 61 74 69 63 20 63 68 61 72 20 71 75 6f 74 65  tatic char quote
4800: 43 68 61 72 28 63 6f 6e 73 74 20 63 68 61 72 20  Char(const char 
4810: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 2f 2a 20 41 6c  *zName){.  /* Al
4820: 6c 20 53 51 4c 69 74 65 20 6b 65 79 77 6f 72 64  l SQLite keyword
4830: 73 2c 20 69 6e 20 61 6c 70 68 61 62 65 74 69 63  s, in alphabetic
4840: 61 6c 20 6f 72 64 65 72 20 2a 2f 0a 20 20 73 74  al order */.  st
4850: 61 74 69 63 20 63 6f 6e 73 74 20 63 68 61 72 20  atic const char 
4860: 2a 61 7a 4b 65 79 77 6f 72 64 73 5b 5d 20 3d 20  *azKeywords[] = 
4870: 7b 0a 20 20 20 20 22 41 42 4f 52 54 22 2c 20 22  {.    "ABORT", "
4880: 41 43 54 49 4f 4e 22 2c 20 22 41 44 44 22 2c 20  ACTION", "ADD", 
4890: 22 41 46 54 45 52 22 2c 20 22 41 4c 4c 22 2c 20  "AFTER", "ALL", 
48a0: 22 41 4c 54 45 52 22 2c 20 22 41 4e 41 4c 59 5a  "ALTER", "ANALYZ
48b0: 45 22 2c 20 22 41 4e 44 22 2c 20 22 41 53 22 2c  E", "AND", "AS",
48c0: 0a 20 20 20 20 22 41 53 43 22 2c 20 22 41 54 54  .    "ASC", "ATT
48d0: 41 43 48 22 2c 20 22 41 55 54 4f 49 4e 43 52 45  ACH", "AUTOINCRE
48e0: 4d 45 4e 54 22 2c 20 22 42 45 46 4f 52 45 22 2c  MENT", "BEFORE",
48f0: 20 22 42 45 47 49 4e 22 2c 20 22 42 45 54 57 45   "BEGIN", "BETWE
4900: 45 4e 22 2c 20 22 42 59 22 2c 0a 20 20 20 20 22  EN", "BY",.    "
4910: 43 41 53 43 41 44 45 22 2c 20 22 43 41 53 45 22  CASCADE", "CASE"
4920: 2c 20 22 43 41 53 54 22 2c 20 22 43 48 45 43 4b  , "CAST", "CHECK
4930: 22 2c 20 22 43 4f 4c 4c 41 54 45 22 2c 20 22 43  ", "COLLATE", "C
4940: 4f 4c 55 4d 4e 22 2c 20 22 43 4f 4d 4d 49 54 22  OLUMN", "COMMIT"
4950: 2c 0a 20 20 20 20 22 43 4f 4e 46 4c 49 43 54 22  ,.    "CONFLICT"
4960: 2c 20 22 43 4f 4e 53 54 52 41 49 4e 54 22 2c 20  , "CONSTRAINT", 
4970: 22 43 52 45 41 54 45 22 2c 20 22 43 52 4f 53 53  "CREATE", "CROSS
4980: 22 2c 20 22 43 55 52 52 45 4e 54 5f 44 41 54 45  ", "CURRENT_DATE
4990: 22 2c 0a 20 20 20 20 22 43 55 52 52 45 4e 54 5f  ",.    "CURRENT_
49a0: 54 49 4d 45 22 2c 20 22 43 55 52 52 45 4e 54 5f  TIME", "CURRENT_
49b0: 54 49 4d 45 53 54 41 4d 50 22 2c 20 22 44 41 54  TIMESTAMP", "DAT
49c0: 41 42 41 53 45 22 2c 20 22 44 45 46 41 55 4c 54  ABASE", "DEFAULT
49d0: 22 2c 20 22 44 45 46 45 52 52 41 42 4c 45 22 2c  ", "DEFERRABLE",
49e0: 0a 20 20 20 20 22 44 45 46 45 52 52 45 44 22 2c  .    "DEFERRED",
49f0: 20 22 44 45 4c 45 54 45 22 2c 20 22 44 45 53 43   "DELETE", "DESC
4a00: 22 2c 20 22 44 45 54 41 43 48 22 2c 20 22 44 49  ", "DETACH", "DI
4a10: 53 54 49 4e 43 54 22 2c 20 22 44 52 4f 50 22 2c  STINCT", "DROP",
4a20: 20 22 45 41 43 48 22 2c 0a 20 20 20 20 22 45 4c   "EACH",.    "EL
4a30: 53 45 22 2c 20 22 45 4e 44 22 2c 20 22 45 53 43  SE", "END", "ESC
4a40: 41 50 45 22 2c 20 22 45 58 43 45 50 54 22 2c 20  APE", "EXCEPT", 
4a50: 22 45 58 43 4c 55 53 49 56 45 22 2c 20 22 45 58  "EXCLUSIVE", "EX
4a60: 49 53 54 53 22 2c 20 22 45 58 50 4c 41 49 4e 22  ISTS", "EXPLAIN"
4a70: 2c 0a 20 20 20 20 22 46 41 49 4c 22 2c 20 22 46  ,.    "FAIL", "F
4a80: 4f 52 22 2c 20 22 46 4f 52 45 49 47 4e 22 2c 20  OR", "FOREIGN", 
4a90: 22 46 52 4f 4d 22 2c 20 22 46 55 4c 4c 22 2c 20  "FROM", "FULL", 
4aa0: 22 47 4c 4f 42 22 2c 20 22 47 52 4f 55 50 22 2c  "GLOB", "GROUP",
4ab0: 20 22 48 41 56 49 4e 47 22 2c 20 22 49 46 22 2c   "HAVING", "IF",
4ac0: 0a 20 20 20 20 22 49 47 4e 4f 52 45 22 2c 20 22  .    "IGNORE", "
4ad0: 49 4d 4d 45 44 49 41 54 45 22 2c 20 22 49 4e 22  IMMEDIATE", "IN"
4ae0: 2c 20 22 49 4e 44 45 58 22 2c 20 22 49 4e 44 45  , "INDEX", "INDE
4af0: 58 45 44 22 2c 20 22 49 4e 49 54 49 41 4c 4c 59  XED", "INITIALLY
4b00: 22 2c 20 22 49 4e 4e 45 52 22 2c 0a 20 20 20 20  ", "INNER",.    
4b10: 22 49 4e 53 45 52 54 22 2c 20 22 49 4e 53 54 45  "INSERT", "INSTE
4b20: 41 44 22 2c 20 22 49 4e 54 45 52 53 45 43 54 22  AD", "INTERSECT"
4b30: 2c 20 22 49 4e 54 4f 22 2c 20 22 49 53 22 2c 20  , "INTO", "IS", 
4b40: 22 49 53 4e 55 4c 4c 22 2c 20 22 4a 4f 49 4e 22  "ISNULL", "JOIN"
4b50: 2c 20 22 4b 45 59 22 2c 0a 20 20 20 20 22 4c 45  , "KEY",.    "LE
4b60: 46 54 22 2c 20 22 4c 49 4b 45 22 2c 20 22 4c 49  FT", "LIKE", "LI
4b70: 4d 49 54 22 2c 20 22 4d 41 54 43 48 22 2c 20 22  MIT", "MATCH", "
4b80: 4e 41 54 55 52 41 4c 22 2c 20 22 4e 4f 22 2c 20  NATURAL", "NO", 
4b90: 22 4e 4f 54 22 2c 20 22 4e 4f 54 4e 55 4c 4c 22  "NOT", "NOTNULL"
4ba0: 2c 0a 20 20 20 20 22 4e 55 4c 4c 22 2c 20 22 4f  ,.    "NULL", "O
4bb0: 46 22 2c 20 22 4f 46 46 53 45 54 22 2c 20 22 4f  F", "OFFSET", "O
4bc0: 4e 22 2c 20 22 4f 52 22 2c 20 22 4f 52 44 45 52  N", "OR", "ORDER
4bd0: 22 2c 20 22 4f 55 54 45 52 22 2c 20 22 50 4c 41  ", "OUTER", "PLA
4be0: 4e 22 2c 20 22 50 52 41 47 4d 41 22 2c 0a 20 20  N", "PRAGMA",.  
4bf0: 20 20 22 50 52 49 4d 41 52 59 22 2c 20 22 51 55    "PRIMARY", "QU
4c00: 45 52 59 22 2c 20 22 52 41 49 53 45 22 2c 20 22  ERY", "RAISE", "
4c10: 52 45 43 55 52 53 49 56 45 22 2c 20 22 52 45 46  RECURSIVE", "REF
4c20: 45 52 45 4e 43 45 53 22 2c 20 22 52 45 47 45 58  ERENCES", "REGEX
4c30: 50 22 2c 0a 20 20 20 20 22 52 45 49 4e 44 45 58  P",.    "REINDEX
4c40: 22 2c 20 22 52 45 4c 45 41 53 45 22 2c 20 22 52  ", "RELEASE", "R
4c50: 45 4e 41 4d 45 22 2c 20 22 52 45 50 4c 41 43 45  ENAME", "REPLACE
4c60: 22 2c 20 22 52 45 53 54 52 49 43 54 22 2c 20 22  ", "RESTRICT", "
4c70: 52 49 47 48 54 22 2c 0a 20 20 20 20 22 52 4f 4c  RIGHT",.    "ROL
4c80: 4c 42 41 43 4b 22 2c 20 22 52 4f 57 22 2c 20 22  LBACK", "ROW", "
4c90: 53 41 56 45 50 4f 49 4e 54 22 2c 20 22 53 45 4c  SAVEPOINT", "SEL
4ca0: 45 43 54 22 2c 20 22 53 45 54 22 2c 20 22 54 41  ECT", "SET", "TA
4cb0: 42 4c 45 22 2c 20 22 54 45 4d 50 22 2c 0a 20 20  BLE", "TEMP",.  
4cc0: 20 20 22 54 45 4d 50 4f 52 41 52 59 22 2c 20 22    "TEMPORARY", "
4cd0: 54 48 45 4e 22 2c 20 22 54 4f 22 2c 20 22 54 52  THEN", "TO", "TR
4ce0: 41 4e 53 41 43 54 49 4f 4e 22 2c 20 22 54 52 49  ANSACTION", "TRI
4cf0: 47 47 45 52 22 2c 20 22 55 4e 49 4f 4e 22 2c 20  GGER", "UNION", 
4d00: 22 55 4e 49 51 55 45 22 2c 0a 20 20 20 20 22 55  "UNIQUE",.    "U
4d10: 50 44 41 54 45 22 2c 20 22 55 53 49 4e 47 22 2c  PDATE", "USING",
4d20: 20 22 56 41 43 55 55 4d 22 2c 20 22 56 41 4c 55   "VACUUM", "VALU
4d30: 45 53 22 2c 20 22 56 49 45 57 22 2c 20 22 56 49  ES", "VIEW", "VI
4d40: 52 54 55 41 4c 22 2c 20 22 57 48 45 4e 22 2c 20  RTUAL", "WHEN", 
4d50: 22 57 48 45 52 45 22 2c 0a 20 20 20 20 22 57 49  "WHERE",.    "WI
4d60: 54 48 22 2c 20 22 57 49 54 48 4f 55 54 22 2c 0a  TH", "WITHOUT",.
4d70: 20 20 7d 3b 0a 20 20 69 6e 74 20 69 2c 20 6c 77    };.  int i, lw
4d80: 72 2c 20 75 70 72 2c 20 6d 69 64 2c 20 63 3b 0a  r, upr, mid, c;.
4d90: 20 20 69 66 28 20 21 69 73 61 6c 70 68 61 28 28    if( !isalpha((
4da0: 75 6e 73 69 67 6e 65 64 20 63 68 61 72 29 7a 4e  unsigned char)zN
4db0: 61 6d 65 5b 30 5d 29 20 26 26 20 7a 4e 61 6d 65  ame[0]) && zName
4dc0: 5b 30 5d 21 3d 27 5f 27 20 29 20 72 65 74 75 72  [0]!='_' ) retur
4dd0: 6e 20 27 22 27 3b 0a 20 20 66 6f 72 28 69 3d 30  n '"';.  for(i=0
4de0: 3b 20 7a 4e 61 6d 65 5b 69 5d 3b 20 69 2b 2b 29  ; zName[i]; i++)
4df0: 7b 0a 20 20 20 20 69 66 28 20 21 69 73 61 6c 6e  {.    if( !isaln
4e00: 75 6d 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  um((unsigned cha
4e10: 72 29 7a 4e 61 6d 65 5b 69 5d 29 20 26 26 20 7a  r)zName[i]) && z
4e20: 4e 61 6d 65 5b 69 5d 21 3d 27 5f 27 20 29 20 72  Name[i]!='_' ) r
4e30: 65 74 75 72 6e 20 27 22 27 3b 0a 20 20 7d 0a 20  eturn '"';.  }. 
4e40: 20 6c 77 72 20 3d 20 30 3b 0a 20 20 75 70 72 20   lwr = 0;.  upr 
4e50: 3d 20 73 69 7a 65 6f 66 28 61 7a 4b 65 79 77 6f  = sizeof(azKeywo
4e60: 72 64 73 29 2f 73 69 7a 65 6f 66 28 61 7a 4b 65  rds)/sizeof(azKe
4e70: 79 77 6f 72 64 73 5b 30 5d 29 20 2d 20 31 3b 0a  ywords[0]) - 1;.
4e80: 20 20 77 68 69 6c 65 28 20 6c 77 72 3c 3d 75 70    while( lwr<=up
4e90: 72 20 29 7b 0a 20 20 20 20 6d 69 64 20 3d 20 28  r ){.    mid = (
4ea0: 6c 77 72 2b 75 70 72 29 2f 32 3b 0a 20 20 20 20  lwr+upr)/2;.    
4eb0: 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 72 69  c = sqlite3_stri
4ec0: 63 6d 70 28 61 7a 4b 65 79 77 6f 72 64 73 5b 6d  cmp(azKeywords[m
4ed0: 69 64 5d 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20  id], zName);.   
4ee0: 20 69 66 28 20 63 3d 3d 30 20 29 20 72 65 74 75   if( c==0 ) retu
4ef0: 72 6e 20 27 22 27 3b 0a 20 20 20 20 69 66 28 20  rn '"';.    if( 
4f00: 63 3c 30 20 29 7b 0a 20 20 20 20 20 20 6c 77 72  c<0 ){.      lwr
4f10: 20 3d 20 6d 69 64 2b 31 3b 0a 20 20 20 20 7d 65   = mid+1;.    }e
4f20: 6c 73 65 7b 0a 20 20 20 20 20 20 75 70 72 20 3d  lse{.      upr =
4f30: 20 6d 69 64 2d 31 3b 0a 20 20 20 20 7d 0a 20 20   mid-1;.    }.  
4f40: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
4f50: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  ./*.** Construct
4f60: 20 61 20 66 61 6b 65 20 6f 62 6a 65 63 74 20 6e   a fake object n
4f70: 61 6d 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6c  ame and column l
4f80: 69 73 74 20 74 6f 20 64 65 73 63 72 69 62 65 20  ist to describe 
4f90: 74 68 65 20 73 74 72 75 63 74 75 72 65 0a 2a 2a  the structure.**
4fa0: 20 6f 66 20 74 68 65 20 76 69 65 77 2c 20 76 69   of the view, vi
4fb0: 72 74 75 61 6c 20 74 61 62 6c 65 2c 20 6f 72 20  rtual table, or 
4fc0: 74 61 62 6c 65 20 76 61 6c 75 65 64 20 66 75 6e  table valued fun
4fd0: 63 74 69 6f 6e 20 7a 53 63 68 65 6d 61 2e 7a 4e  ction zSchema.zN
4fe0: 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63  ame..*/.static c
4ff0: 68 61 72 20 2a 73 68 65 6c 6c 46 61 6b 65 53 63  har *shellFakeSc
5000: 68 65 6d 61 28 0a 20 20 73 71 6c 69 74 65 33 20  hema(.  sqlite3 
5010: 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20 20  *db,            
5020: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
5030: 63 6f 6e 6e 65 63 74 69 6f 6e 20 63 6f 6e 74 61  connection conta
5040: 69 6e 69 6e 67 20 74 68 65 20 76 74 61 62 20 2a  ining the vtab *
5050: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
5060: 7a 53 63 68 65 6d 61 2c 20 20 20 20 2f 2a 20 53  zSchema,    /* S
5070: 63 68 65 6d 61 20 6f 66 20 74 68 65 20 64 61 74  chema of the dat
5080: 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 20 74 68  abase holding th
5090: 65 20 76 74 61 62 20 2a 2f 0a 20 20 63 6f 6e 73  e vtab */.  cons
50a0: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20 20 20  t char *zName   
50b0: 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20      /* The name 
50c0: 6f 66 20 74 68 65 20 76 69 72 74 75 61 6c 20 74  of the virtual t
50d0: 61 62 6c 65 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  able */.){.  sql
50e0: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
50f0: 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 53   = 0;.  char *zS
5100: 71 6c 3b 0a 20 20 53 68 65 6c 6c 54 65 78 74 20  ql;.  ShellText 
5110: 73 3b 0a 20 20 63 68 61 72 20 63 51 75 6f 74 65  s;.  char cQuote
5120: 3b 0a 20 20 63 68 61 72 20 2a 7a 44 69 76 20 3d  ;.  char *zDiv =
5130: 20 22 28 22 3b 0a 20 20 69 6e 74 20 6e 52 6f 77   "(";.  int nRow
5140: 20 3d 20 30 3b 0a 0a 20 20 7a 53 71 6c 20 3d 20   = 0;..  zSql = 
5150: 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
5160: 22 50 52 41 47 4d 41 20 5c 22 25 77 5c 22 2e 74  "PRAGMA \"%w\".t
5170: 61 62 6c 65 5f 69 6e 66 6f 3d 25 51 3b 22 2c 0a  able_info=%Q;",.
5180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5190: 20 20 20 20 20 20 20 20 20 7a 53 63 68 65 6d 61           zSchema
51a0: 20 3f 20 7a 53 63 68 65 6d 61 20 3a 20 22 6d 61   ? zSchema : "ma
51b0: 69 6e 22 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 73  in", zName);.  s
51c0: 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
51d0: 32 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  2(db, zSql, -1, 
51e0: 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71  &pStmt, 0);.  sq
51f0: 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29  lite3_free(zSql)
5200: 3b 0a 20 20 69 6e 69 74 54 65 78 74 28 26 73 29  ;.  initText(&s)
5210: 3b 0a 20 20 69 66 28 20 7a 53 63 68 65 6d 61 20  ;.  if( zSchema 
5220: 29 7b 0a 20 20 20 20 63 51 75 6f 74 65 20 3d 20  ){.    cQuote = 
5230: 71 75 6f 74 65 43 68 61 72 28 7a 53 63 68 65 6d  quoteChar(zSchem
5240: 61 29 3b 0a 20 20 20 20 69 66 28 20 63 51 75 6f  a);.    if( cQuo
5250: 74 65 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  te && sqlite3_st
5260: 72 69 63 6d 70 28 7a 53 63 68 65 6d 61 2c 22 74  ricmp(zSchema,"t
5270: 65 6d 70 22 29 3d 3d 30 20 29 20 63 51 75 6f 74  emp")==0 ) cQuot
5280: 65 20 3d 20 30 3b 0a 20 20 20 20 61 70 70 65 6e  e = 0;.    appen
5290: 64 54 65 78 74 28 26 73 2c 20 7a 53 63 68 65 6d  dText(&s, zSchem
52a0: 61 2c 20 63 51 75 6f 74 65 29 3b 0a 20 20 20 20  a, cQuote);.    
52b0: 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20 22  appendText(&s, "
52c0: 2e 22 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 63 51  .", 0);.  }.  cQ
52d0: 75 6f 74 65 20 3d 20 71 75 6f 74 65 43 68 61 72  uote = quoteChar
52e0: 28 7a 4e 61 6d 65 29 3b 0a 20 20 61 70 70 65 6e  (zName);.  appen
52f0: 64 54 65 78 74 28 26 73 2c 20 7a 4e 61 6d 65 2c  dText(&s, zName,
5300: 20 63 51 75 6f 74 65 29 3b 0a 20 20 77 68 69 6c   cQuote);.  whil
5310: 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28  e( sqlite3_step(
5320: 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52  pStmt)==SQLITE_R
5330: 4f 57 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  OW ){.    const 
5340: 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 28 63 6f  char *zCol = (co
5350: 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
5360: 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
5370: 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 6e 52 6f  tmt, 1);.    nRo
5380: 77 2b 2b 3b 0a 20 20 20 20 61 70 70 65 6e 64 54  w++;.    appendT
5390: 65 78 74 28 26 73 2c 20 7a 44 69 76 2c 20 30 29  ext(&s, zDiv, 0)
53a0: 3b 0a 20 20 20 20 7a 44 69 76 20 3d 20 22 2c 22  ;.    zDiv = ","
53b0: 3b 0a 20 20 20 20 63 51 75 6f 74 65 20 3d 20 71  ;.    cQuote = q
53c0: 75 6f 74 65 43 68 61 72 28 7a 43 6f 6c 29 3b 0a  uoteChar(zCol);.
53d0: 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
53e0: 73 2c 20 7a 43 6f 6c 2c 20 63 51 75 6f 74 65 29  s, zCol, cQuote)
53f0: 3b 0a 20 20 7d 0a 20 20 61 70 70 65 6e 64 54 65  ;.  }.  appendTe
5400: 78 74 28 26 73 2c 20 22 29 22 2c 20 30 29 3b 0a  xt(&s, ")", 0);.
5410: 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
5420: 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 69 66 28  ze(pStmt);.  if(
5430: 20 6e 52 6f 77 3d 3d 30 20 29 7b 0a 20 20 20 20   nRow==0 ){.    
5440: 66 72 65 65 54 65 78 74 28 26 73 29 3b 0a 20 20  freeText(&s);.  
5450: 20 20 73 2e 7a 20 3d 20 30 3b 0a 20 20 7d 0a 20    s.z = 0;.  }. 
5460: 20 72 65 74 75 72 6e 20 73 2e 7a 3b 0a 7d 0a 0a   return s.z;.}..
5470: 2f 2a 0a 2a 2a 20 53 51 4c 20 66 75 6e 63 74 69  /*.** SQL functi
5480: 6f 6e 3a 20 20 73 68 65 6c 6c 5f 6d 6f 64 75 6c  on:  shell_modul
5490: 65 5f 73 63 68 65 6d 61 28 58 29 0a 2a 2a 0a 2a  e_schema(X).**.*
54a0: 2a 20 52 65 74 75 72 6e 20 61 20 66 61 6b 65 20  * Return a fake 
54b0: 73 63 68 65 6d 61 20 66 6f 72 20 74 68 65 20 74  schema for the t
54c0: 61 62 6c 65 2d 76 61 6c 75 65 64 20 66 75 6e 63  able-valued func
54d0: 74 69 6f 6e 20 6f 72 20 65 70 6f 6e 79 6d 6f 75  tion or eponymou
54e0: 73 20 76 69 72 74 75 61 6c 0a 2a 2a 20 74 61 62  s virtual.** tab
54f0: 6c 65 20 58 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  le X..*/.static 
5500: 76 6f 69 64 20 73 68 65 6c 6c 4d 6f 64 75 6c 65  void shellModule
5510: 53 63 68 65 6d 61 28 0a 20 20 73 71 6c 69 74 65  Schema(.  sqlite
5520: 33 5f 63 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c  3_context *pCtx,
5530: 0a 20 20 69 6e 74 20 6e 56 61 6c 2c 0a 20 20 73  .  int nVal,.  s
5540: 71 6c 69 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61  qlite3_value **a
5550: 70 56 61 6c 0a 29 7b 0a 20 20 63 6f 6e 73 74 20  pVal.){.  const 
5560: 63 68 61 72 20 2a 7a 4e 61 6d 65 20 3d 20 28 63  char *zName = (c
5570: 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74  onst char*)sqlit
5580: 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28 61 70  e3_value_text(ap
5590: 56 61 6c 5b 30 5d 29 3b 0a 20 20 63 68 61 72 20  Val[0]);.  char 
55a0: 2a 7a 46 61 6b 65 20 3d 20 73 68 65 6c 6c 46 61  *zFake = shellFa
55b0: 6b 65 53 63 68 65 6d 61 28 73 71 6c 69 74 65 33  keSchema(sqlite3
55c0: 5f 63 6f 6e 74 65 78 74 5f 64 62 5f 68 61 6e 64  _context_db_hand
55d0: 6c 65 28 70 43 74 78 29 2c 20 30 2c 20 7a 4e 61  le(pCtx), 0, zNa
55e0: 6d 65 29 3b 0a 20 20 69 66 28 20 7a 46 61 6b 65  me);.  if( zFake
55f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f   ){.    sqlite3_
5600: 72 65 73 75 6c 74 5f 74 65 78 74 28 70 43 74 78  result_text(pCtx
5610: 2c 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  , sqlite3_mprint
5620: 66 28 22 2f 2a 20 25 7a 20 2a 2f 22 2c 20 7a 46  f("/* %z */", zF
5630: 61 6b 65 29 2c 0a 20 20 20 20 20 20 20 20 20 20  ake),.          
5640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31                -1
5650: 2c 20 73 71 6c 69 74 65 33 5f 66 72 65 65 29 3b  , sqlite3_free);
5660: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 51  .  }.}../*.** SQ
5670: 4c 20 66 75 6e 63 74 69 6f 6e 3a 20 20 73 68 65  L function:  she
5680: 6c 6c 5f 61 64 64 5f 73 63 68 65 6d 61 28 53 2c  ll_add_schema(S,
5690: 58 29 0a 2a 2a 0a 2a 2a 20 41 64 64 20 74 68 65  X).**.** Add the
56a0: 20 73 63 68 65 6d 61 20 6e 61 6d 65 20 58 20 74   schema name X t
56b0: 6f 20 74 68 65 20 43 52 45 41 54 45 20 73 74 61  o the CREATE sta
56c0: 74 65 6d 65 6e 74 20 69 6e 20 53 20 61 6e 64 20  tement in S and 
56d0: 72 65 74 75 72 6e 20 74 68 65 20 72 65 73 75 6c  return the resul
56e0: 74 2e 0a 2a 2a 20 45 78 61 6d 70 6c 65 73 3a 0a  t..** Examples:.
56f0: 2a 2a 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20  **.**    CREATE 
5700: 54 41 42 4c 45 20 74 31 28 78 29 20 20 20 2d 3e  TABLE t1(x)   ->
5710: 20 20 20 43 52 45 41 54 45 20 54 41 42 4c 45 20     CREATE TABLE 
5720: 78 79 7a 2e 74 31 28 78 29 3b 0a 2a 2a 0a 2a 2a  xyz.t1(x);.**.**
5730: 20 41 6c 73 6f 20 77 6f 72 6b 73 20 6f 6e 0a 2a   Also works on.*
5740: 2a 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20 49  *.**    CREATE I
5750: 4e 44 45 58 0a 2a 2a 20 20 20 20 43 52 45 41 54  NDEX.**    CREAT
5760: 45 20 55 4e 49 51 55 45 20 49 4e 44 45 58 0a 2a  E UNIQUE INDEX.*
5770: 2a 20 20 20 20 43 52 45 41 54 45 20 56 49 45 57  *    CREATE VIEW
5780: 0a 2a 2a 20 20 20 20 43 52 45 41 54 45 20 54 52  .**    CREATE TR
5790: 49 47 47 45 52 0a 2a 2a 20 20 20 20 43 52 45 41  IGGER.**    CREA
57a0: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45  TE VIRTUAL TABLE
57b0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 55 44 46 20  .**.** This UDF 
57c0: 69 73 20 75 73 65 64 20 62 79 20 74 68 65 20 2e  is used by the .
57d0: 73 63 68 65 6d 61 20 63 6f 6d 6d 61 6e 64 20 74  schema command t
57e0: 6f 20 69 6e 73 65 72 74 20 74 68 65 20 73 63 68  o insert the sch
57f0: 65 6d 61 20 6e 61 6d 65 20 6f 66 0a 2a 2a 20 61  ema name of.** a
5800: 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
5810: 73 20 69 6e 74 6f 20 74 68 65 20 6d 69 64 64 6c  s into the middl
5820: 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74 65 5f  e of the sqlite_
5830: 6d 61 73 74 65 72 2e 73 71 6c 20 66 69 65 6c 64  master.sql field
5840: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
5850: 20 73 68 65 6c 6c 41 64 64 53 63 68 65 6d 61 4e   shellAddSchemaN
5860: 61 6d 65 28 0a 20 20 73 71 6c 69 74 65 33 5f 63  ame(.  sqlite3_c
5870: 6f 6e 74 65 78 74 20 2a 70 43 74 78 2c 0a 20 20  ontext *pCtx,.  
5880: 69 6e 74 20 6e 56 61 6c 2c 0a 20 20 73 71 6c 69  int nVal,.  sqli
5890: 74 65 33 5f 76 61 6c 75 65 20 2a 2a 61 70 56 61  te3_value **apVa
58a0: 6c 0a 29 7b 0a 20 20 73 74 61 74 69 63 20 63 6f  l.){.  static co
58b0: 6e 73 74 20 63 68 61 72 20 2a 61 50 72 65 66 69  nst char *aPrefi
58c0: 78 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 22 54 41  x[] = {.     "TA
58d0: 42 4c 45 22 2c 0a 20 20 20 20 20 22 49 4e 44 45  BLE",.     "INDE
58e0: 58 22 2c 0a 20 20 20 20 20 22 55 4e 49 51 55 45  X",.     "UNIQUE
58f0: 20 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 56   INDEX",.     "V
5900: 49 45 57 22 2c 0a 20 20 20 20 20 22 54 52 49 47  IEW",.     "TRIG
5910: 47 45 52 22 2c 0a 20 20 20 20 20 22 56 49 52 54  GER",.     "VIRT
5920: 55 41 4c 20 54 41 42 4c 45 22 0a 20 20 7d 3b 0a  UAL TABLE".  };.
5930: 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 63    int i = 0;.  c
5940: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 20 3d  onst char *zIn =
5950: 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
5960: 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
5970: 28 61 70 56 61 6c 5b 30 5d 29 3b 0a 20 20 63 6f  (apVal[0]);.  co
5980: 6e 73 74 20 63 68 61 72 20 2a 7a 53 63 68 65 6d  nst char *zSchem
5990: 61 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  a = (const char*
59a0: 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74  )sqlite3_value_t
59b0: 65 78 74 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20  ext(apVal[1]);. 
59c0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
59d0: 6d 65 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  me = (const char
59e0: 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75 65 5f  *)sqlite3_value_
59f0: 74 65 78 74 28 61 70 56 61 6c 5b 32 5d 29 3b 0a  text(apVal[2]);.
5a00: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
5a10: 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74 5f  sqlite3_context_
5a20: 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78 29 3b  db_handle(pCtx);
5a30: 0a 20 20 69 66 28 20 7a 49 6e 21 3d 30 20 26 26  .  if( zIn!=0 &&
5a40: 20 73 74 72 6e 63 6d 70 28 7a 49 6e 2c 20 22 43   strncmp(zIn, "C
5a50: 52 45 41 54 45 20 22 2c 20 37 29 3d 3d 30 20 29  REATE ", 7)==0 )
5a60: 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  {.    for(i=0; i
5a70: 3c 28 69 6e 74 29 28 73 69 7a 65 6f 66 28 61 50  <(int)(sizeof(aP
5a80: 72 65 66 69 78 29 2f 73 69 7a 65 6f 66 28 61 50  refix)/sizeof(aP
5a90: 72 65 66 69 78 5b 30 5d 29 29 3b 20 69 2b 2b 29  refix[0])); i++)
5aa0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  {.      int n = 
5ab0: 73 74 72 6c 65 6e 33 30 28 61 50 72 65 66 69 78  strlen30(aPrefix
5ac0: 5b 69 5d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  [i]);.      if( 
5ad0: 73 74 72 6e 63 6d 70 28 7a 49 6e 2b 37 2c 20 61  strncmp(zIn+7, a
5ae0: 50 72 65 66 69 78 5b 69 5d 2c 20 6e 29 3d 3d 30  Prefix[i], n)==0
5af0: 20 26 26 20 7a 49 6e 5b 6e 2b 37 5d 3d 3d 27 20   && zIn[n+7]==' 
5b00: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ' ){.        cha
5b10: 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20  r *z = 0;.      
5b20: 20 20 63 68 61 72 20 2a 7a 46 61 6b 65 20 3d 20    char *zFake = 
5b30: 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  0;.        if( z
5b40: 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20  Schema ){.      
5b50: 20 20 20 20 63 68 61 72 20 63 51 75 6f 74 65 20      char cQuote 
5b60: 3d 20 71 75 6f 74 65 43 68 61 72 28 7a 53 63 68  = quoteChar(zSch
5b70: 65 6d 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ema);.          
5b80: 69 66 28 20 63 51 75 6f 74 65 20 26 26 20 73 71  if( cQuote && sq
5b90: 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 53  lite3_stricmp(zS
5ba0: 63 68 65 6d 61 2c 22 74 65 6d 70 22 29 21 3d 30  chema,"temp")!=0
5bb0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
5bc0: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
5bd0: 6e 74 66 28 22 25 2e 2a 73 20 5c 22 25 77 5c 22  ntf("%.*s \"%w\"
5be0: 2e 25 73 22 2c 20 6e 2b 37 2c 20 7a 49 6e 2c 20  .%s", n+7, zIn, 
5bf0: 7a 53 63 68 65 6d 61 2c 20 7a 49 6e 2b 6e 2b 38  zSchema, zIn+n+8
5c00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  );.          }el
5c10: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
5c20: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
5c30: 6e 74 66 28 22 25 2e 2a 73 20 25 73 2e 25 73 22  ntf("%.*s %s.%s"
5c40: 2c 20 6e 2b 37 2c 20 7a 49 6e 2c 20 7a 53 63 68  , n+7, zIn, zSch
5c50: 65 6d 61 2c 20 7a 49 6e 2b 6e 2b 38 29 3b 0a 20  ema, zIn+n+8);. 
5c60: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
5c70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
5c80: 20 7a 4e 61 6d 65 0a 20 20 20 20 20 20 20 20 20   zName.         
5c90: 26 26 20 61 50 72 65 66 69 78 5b 69 5d 5b 30 5d  && aPrefix[i][0]
5ca0: 3d 3d 27 56 27 0a 20 20 20 20 20 20 20 20 20 26  =='V'.         &
5cb0: 26 20 28 7a 46 61 6b 65 20 3d 20 73 68 65 6c 6c  & (zFake = shell
5cc0: 46 61 6b 65 53 63 68 65 6d 61 28 64 62 2c 20 7a  FakeSchema(db, z
5cd0: 53 63 68 65 6d 61 2c 20 7a 4e 61 6d 65 29 29 21  Schema, zName))!
5ce0: 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  =0.        ){.  
5cf0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 3d 3d 30          if( z==0
5d00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
5d10: 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69  z = sqlite3_mpri
5d20: 6e 74 66 28 22 25 73 5c 6e 2f 2a 20 25 7a 20 2a  ntf("%s\n/* %z *
5d30: 2f 22 2c 20 7a 49 6e 2c 20 7a 46 61 6b 65 29 3b  /", zIn, zFake);
5d40: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
5d50: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 20  {.            z 
5d60: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
5d70: 66 28 22 25 7a 5c 6e 2f 2a 20 25 7a 20 2a 2f 22  f("%z\n/* %z */"
5d80: 2c 20 7a 2c 20 7a 46 61 6b 65 29 3b 0a 20 20 20  , z, zFake);.   
5d90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
5da0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a   }.        if( z
5db0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
5dc0: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
5dd0: 74 28 70 43 74 78 2c 20 7a 2c 20 2d 31 2c 20 73  t(pCtx, z, -1, s
5de0: 71 6c 69 74 65 33 5f 66 72 65 65 29 3b 0a 20 20  qlite3_free);.  
5df0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
5e00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
5e10: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71  }.    }.  }.  sq
5e20: 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 76 61 6c  lite3_result_val
5e30: 75 65 28 70 43 74 78 2c 20 61 70 56 61 6c 5b 30  ue(pCtx, apVal[0
5e40: 5d 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65  ]);.}../*.** The
5e50: 20 73 6f 75 72 63 65 20 63 6f 64 65 20 66 6f 72   source code for
5e60: 20 73 65 76 65 72 61 6c 20 72 75 6e 2d 74 69 6d   several run-tim
5e70: 65 20 6c 6f 61 64 61 62 6c 65 20 65 78 74 65 6e  e loadable exten
5e80: 73 69 6f 6e 73 20 69 73 20 69 6e 73 65 72 74 65  sions is inserte
5e90: 64 0a 2a 2a 20 62 65 6c 6f 77 20 62 79 20 74 68  d.** below by th
5ea0: 65 20 2e 2e 2f 74 6f 6f 6c 2f 6d 6b 73 68 65 6c  e ../tool/mkshel
5eb0: 6c 63 2e 74 63 6c 20 73 63 72 69 70 74 2e 20 20  lc.tcl script.  
5ec0: 42 65 66 6f 72 65 20 70 72 6f 63 65 73 73 69 6e  Before processin
5ed0: 67 20 74 68 61 74 20 69 6e 63 6c 75 64 65 64 0a  g that included.
5ee0: 2a 2a 20 63 6f 64 65 2c 20 77 65 20 6e 65 65 64  ** code, we need
5ef0: 20 74 6f 20 6f 76 65 72 72 69 64 65 20 73 6f 6d   to override som
5f00: 65 20 6d 61 63 72 6f 73 20 74 6f 20 6d 61 6b 65  e macros to make
5f10: 20 74 68 65 20 69 6e 63 6c 75 64 65 64 20 70 72   the included pr
5f20: 6f 67 72 61 6d 20 63 6f 64 65 0a 2a 2a 20 77 6f  ogram code.** wo
5f30: 72 6b 20 68 65 72 65 20 69 6e 20 74 68 65 20 6d  rk here in the m
5f40: 69 64 64 6c 65 20 6f 66 20 74 68 69 73 20 72 65  iddle of this re
5f50: 67 75 6c 61 72 20 70 72 6f 67 72 61 6d 2e 0a 2a  gular program..*
5f60: 2f 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45  /.#define SQLITE
5f70: 5f 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 31  _EXTENSION_INIT1
5f80: 0a 23 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f  .#define SQLITE_
5f90: 45 58 54 45 4e 53 49 4f 4e 5f 49 4e 49 54 32 28  EXTENSION_INIT2(
5fa0: 58 29 20 28 76 6f 69 64 29 28 58 29 0a 0a 49 4e  X) (void)(X)..IN
5fb0: 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73  CLUDE ../ext/mis
5fc0: 63 2f 73 68 61 74 68 72 65 65 2e 63 0a 49 4e 43  c/shathree.c.INC
5fd0: 4c 55 44 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63  LUDE ../ext/misc
5fe0: 2f 66 69 6c 65 69 6f 2e 63 0a 49 4e 43 4c 55 44  /fileio.c.INCLUD
5ff0: 45 20 2e 2e 2f 65 78 74 2f 6d 69 73 63 2f 63 6f  E ../ext/misc/co
6000: 6d 70 6c 65 74 69 6f 6e 2e 63 0a 49 4e 43 4c 55  mpletion.c.INCLU
6010: 44 45 20 2e 2e 2f 65 78 74 2f 65 78 70 65 72 74  DE ../ext/expert
6020: 2f 73 71 6c 69 74 65 33 65 78 70 65 72 74 2e 68  /sqlite3expert.h
6030: 0a 49 4e 43 4c 55 44 45 20 2e 2e 2f 65 78 74 2f  .INCLUDE ../ext/
6040: 65 78 70 65 72 74 2f 73 71 6c 69 74 65 33 65 78  expert/sqlite3ex
6050: 70 65 72 74 2e 63 0a 0a 23 69 66 20 64 65 66 69  pert.c..#if defi
6060: 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c  ned(SQLITE_ENABL
6070: 45 5f 53 45 53 53 49 4f 4e 29 0a 2f 2a 0a 2a 2a  E_SESSION)./*.**
6080: 20 53 74 61 74 65 20 69 6e 66 6f 72 6d 61 74 69   State informati
6090: 6f 6e 20 66 6f 72 20 61 20 73 69 6e 67 6c 65 20  on for a single 
60a0: 6f 70 65 6e 20 73 65 73 73 69 6f 6e 0a 2a 2f 0a  open session.*/.
60b0: 74 79 70 65 64 65 66 20 73 74 72 75 63 74 20 4f  typedef struct O
60c0: 70 65 6e 53 65 73 73 69 6f 6e 20 4f 70 65 6e 53  penSession OpenS
60d0: 65 73 73 69 6f 6e 3b 0a 73 74 72 75 63 74 20 4f  ession;.struct O
60e0: 70 65 6e 53 65 73 73 69 6f 6e 20 7b 0a 20 20 63  penSession {.  c
60f0: 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 20 20 20 20  har *zName;     
6100: 20 20 20 20 20 20 20 20 2f 2a 20 53 79 6d 62 6f          /* Symbo
6110: 6c 69 63 20 6e 61 6d 65 20 66 6f 72 20 74 68 69  lic name for thi
6120: 73 20 73 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 69  s session */.  i
6130: 6e 74 20 6e 46 69 6c 74 65 72 3b 20 20 20 20 20  nt nFilter;     
6140: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
6150: 72 20 6f 66 20 78 46 69 6c 74 65 72 20 72 65 6a  r of xFilter rej
6160: 65 63 74 69 6f 6e 20 47 4c 4f 42 20 70 61 74 74  ection GLOB patt
6170: 65 72 6e 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a  erns */.  char *
6180: 2a 61 7a 46 69 6c 74 65 72 3b 20 20 20 20 20 20  *azFilter;      
6190: 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 78     /* Array of x
61a0: 46 69 6c 74 65 72 20 72 65 6a 65 63 74 69 6f 6e  Filter rejection
61b0: 20 47 4c 4f 42 20 70 61 74 74 65 72 6e 73 20 2a   GLOB patterns *
61c0: 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 65 73 73  /.  sqlite3_sess
61d0: 69 6f 6e 20 2a 70 3b 20 20 20 20 20 20 2f 2a 20  ion *p;      /* 
61e0: 54 68 65 20 6f 70 65 6e 20 73 65 73 73 69 6f 6e  The open session
61f0: 20 2a 2f 0a 7d 3b 0a 23 65 6e 64 69 66 0a 0a 2f   */.};.#endif../
6200: 2a 0a 2a 2a 20 53 68 65 6c 6c 20 6f 75 74 70 75  *.** Shell outpu
6210: 74 20 6d 6f 64 65 20 69 6e 66 6f 72 6d 61 74 69  t mode informati
6220: 6f 6e 20 66 72 6f 6d 20 62 65 66 6f 72 65 20 22  on from before "
6230: 2e 65 78 70 6c 61 69 6e 20 6f 6e 22 2c 0a 2a 2a  .explain on",.**
6240: 20 73 61 76 65 64 20 73 6f 20 74 68 61 74 20 69   saved so that i
6250: 74 20 63 61 6e 20 62 65 20 72 65 73 74 6f 72 65  t can be restore
6260: 64 20 62 79 20 22 2e 65 78 70 6c 61 69 6e 20 6f  d by ".explain o
6270: 66 66 22 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73  ff".*/.typedef s
6280: 74 72 75 63 74 20 53 61 76 65 64 4d 6f 64 65 49  truct SavedModeI
6290: 6e 66 6f 20 53 61 76 65 64 4d 6f 64 65 49 6e 66  nfo SavedModeInf
62a0: 6f 3b 0a 73 74 72 75 63 74 20 53 61 76 65 64 4d  o;.struct SavedM
62b0: 6f 64 65 49 6e 66 6f 20 7b 0a 20 20 69 6e 74 20  odeInfo {.  int 
62c0: 76 61 6c 69 64 3b 20 20 20 20 20 20 20 20 20 20  valid;          
62d0: 2f 2a 20 49 73 20 74 68 65 72 65 20 6c 65 67 69  /* Is there legi
62e0: 74 20 64 61 74 61 20 69 6e 20 68 65 72 65 3f 20  t data in here? 
62f0: 2a 2f 0a 20 20 69 6e 74 20 6d 6f 64 65 3b 20 20  */.  int mode;  
6300: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 6f 64 65           /* Mode
6310: 20 70 72 69 6f 72 20 74 6f 20 22 2e 65 78 70 6c   prior to ".expl
6320: 61 69 6e 20 6f 6e 22 20 2a 2f 0a 20 20 69 6e 74  ain on" */.  int
6330: 20 73 68 6f 77 48 65 61 64 65 72 3b 20 20 20 20   showHeader;    
6340: 20 2f 2a 20 54 68 65 20 22 2e 68 65 61 64 65 72   /* The ".header
6350: 22 20 73 65 74 74 69 6e 67 20 70 72 69 6f 72 20  " setting prior 
6360: 74 6f 20 22 2e 65 78 70 6c 61 69 6e 20 6f 6e 22  to ".explain on"
6370: 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6c 57 69 64   */.  int colWid
6380: 74 68 5b 31 30 30 5d 3b 20 20 2f 2a 20 43 6f 6c  th[100];  /* Col
6390: 75 6d 6e 20 77 69 64 74 68 73 20 70 72 69 6f 72  umn widths prior
63a0: 20 74 6f 20 22 2e 65 78 70 6c 61 69 6e 20 6f 6e   to ".explain on
63b0: 22 20 2a 2f 0a 7d 3b 0a 0a 74 79 70 65 64 65 66  " */.};..typedef
63c0: 20 73 74 72 75 63 74 20 45 78 70 65 72 74 49 6e   struct ExpertIn
63d0: 66 6f 20 45 78 70 65 72 74 49 6e 66 6f 3b 0a 73  fo ExpertInfo;.s
63e0: 74 72 75 63 74 20 45 78 70 65 72 74 49 6e 66 6f  truct ExpertInfo
63f0: 20 7b 0a 20 20 73 71 6c 69 74 65 33 65 78 70 65   {.  sqlite3expe
6400: 72 74 20 2a 70 45 78 70 65 72 74 3b 0a 20 20 69  rt *pExpert;.  i
6410: 6e 74 20 62 56 65 72 62 6f 73 65 3b 0a 7d 3b 0a  nt bVerbose;.};.
6420: 0a 2f 2a 0a 2a 2a 20 53 74 61 74 65 20 69 6e 66  ./*.** State inf
6430: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
6440: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e  he database conn
6450: 65 63 74 69 6f 6e 20 69 73 20 63 6f 6e 74 61 69  ection is contai
6460: 6e 65 64 20 69 6e 20 61 6e 0a 2a 2a 20 69 6e 73  ned in an.** ins
6470: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 66 6f 6c  tance of the fol
6480: 6c 6f 77 69 6e 67 20 73 74 72 75 63 74 75 72 65  lowing structure
6490: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
64a0: 75 63 74 20 53 68 65 6c 6c 53 74 61 74 65 20 53  uct ShellState S
64b0: 68 65 6c 6c 53 74 61 74 65 3b 0a 73 74 72 75 63  hellState;.struc
64c0: 74 20 53 68 65 6c 6c 53 74 61 74 65 20 7b 0a 20  t ShellState {. 
64d0: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
64e0: 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 64          /* The d
64f0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 69 6e 74  atabase */.  int
6500: 20 61 75 74 6f 45 78 70 6c 61 69 6e 3b 20 20 20   autoExplain;   
6510: 20 20 20 20 2f 2a 20 41 75 74 6f 6d 61 74 69 63      /* Automatic
6520: 61 6c 6c 79 20 74 75 72 6e 20 6f 6e 20 2e 65 78  ally turn on .ex
6530: 70 6c 61 69 6e 20 6d 6f 64 65 20 2a 2f 0a 20 20  plain mode */.  
6540: 69 6e 74 20 61 75 74 6f 45 51 50 3b 20 20 20 20  int autoEQP;    
6550: 20 20 20 20 20 20 20 2f 2a 20 52 75 6e 20 45 58         /* Run EX
6560: 50 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e  PLAIN QUERY PLAN
6570: 20 70 72 69 6f 72 20 74 6f 20 73 65 61 63 68 20   prior to seach 
6580: 53 51 4c 20 73 74 6d 74 20 2a 2f 0a 20 20 69 6e  SQL stmt */.  in
6590: 74 20 73 74 61 74 73 4f 6e 3b 20 20 20 20 20 20  t statsOn;      
65a0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
65b0: 64 69 73 70 6c 61 79 20 6d 65 6d 6f 72 79 20 73  display memory s
65c0: 74 61 74 73 20 62 65 66 6f 72 65 20 65 61 63 68  tats before each
65d0: 20 66 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20 69   finalize */.  i
65e0: 6e 74 20 73 63 61 6e 73 74 61 74 73 4f 6e 3b 20  nt scanstatsOn; 
65f0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
6600: 20 64 69 73 70 6c 61 79 20 73 63 61 6e 20 73 74   display scan st
6610: 61 74 73 20 62 65 66 6f 72 65 20 65 61 63 68 20  ats before each 
6620: 66 69 6e 61 6c 69 7a 65 20 2a 2f 0a 20 20 69 6e  finalize */.  in
6630: 74 20 6f 75 74 43 6f 75 6e 74 3b 20 20 20 20 20  t outCount;     
6640: 20 20 20 20 20 2f 2a 20 52 65 76 65 72 74 20 74       /* Revert t
6650: 6f 20 73 74 64 6f 75 74 20 77 68 65 6e 20 72 65  o stdout when re
6660: 61 63 68 69 6e 67 20 7a 65 72 6f 20 2a 2f 0a 20  aching zero */. 
6670: 20 69 6e 74 20 63 6e 74 3b 20 20 20 20 20 20 20   int cnt;       
6680: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
6690: 72 20 6f 66 20 72 65 63 6f 72 64 73 20 64 69 73  r of records dis
66a0: 70 6c 61 79 65 64 20 73 6f 20 66 61 72 20 2a 2f  played so far */
66b0: 0a 20 20 46 49 4c 45 20 2a 6f 75 74 3b 20 20 20  .  FILE *out;   
66c0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 72 69            /* Wri
66d0: 74 65 20 72 65 73 75 6c 74 73 20 68 65 72 65 20  te results here 
66e0: 2a 2f 0a 20 20 46 49 4c 45 20 2a 74 72 61 63 65  */.  FILE *trace
66f0: 4f 75 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  Out;        /* O
6700: 75 74 70 75 74 20 66 6f 72 20 73 71 6c 69 74 65  utput for sqlite
6710: 33 5f 74 72 61 63 65 28 29 20 2a 2f 0a 20 20 69  3_trace() */.  i
6720: 6e 74 20 6e 45 72 72 3b 20 20 20 20 20 20 20 20  nt nErr;        
6730: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
6740: 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e 20 2a  of errors seen *
6750: 2f 0a 20 20 69 6e 74 20 6d 6f 64 65 3b 20 20 20  /.  int mode;   
6760: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6e             /* An
6770: 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 73 65 74   output mode set
6780: 74 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 63 4d  ting */.  int cM
6790: 6f 64 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  ode;            
67a0: 20 2f 2a 20 74 65 6d 70 6f 72 61 72 79 20 6f 75   /* temporary ou
67b0: 74 70 75 74 20 6d 6f 64 65 20 66 6f 72 20 74 68  tput mode for th
67c0: 65 20 63 75 72 72 65 6e 74 20 71 75 65 72 79 20  e current query 
67d0: 2a 2f 0a 20 20 69 6e 74 20 6e 6f 72 6d 61 6c 4d  */.  int normalM
67e0: 6f 64 65 3b 20 20 20 20 20 20 20 20 2f 2a 20 4f  ode;        /* O
67f0: 75 74 70 75 74 20 6d 6f 64 65 20 62 65 66 6f 72  utput mode befor
6800: 65 20 22 2e 65 78 70 6c 61 69 6e 20 6f 6e 22 20  e ".explain on" 
6810: 2a 2f 0a 20 20 69 6e 74 20 77 72 69 74 61 62 6c  */.  int writabl
6820: 65 53 63 68 65 6d 61 3b 20 20 20 20 2f 2a 20 54  eSchema;    /* T
6830: 72 75 65 20 69 66 20 50 52 41 47 4d 41 20 77 72  rue if PRAGMA wr
6840: 69 74 61 62 6c 65 5f 73 63 68 65 6d 61 3d 4f 4e  itable_schema=ON
6850: 20 2a 2f 0a 20 20 69 6e 74 20 73 68 6f 77 48 65   */.  int showHe
6860: 61 64 65 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  ader;        /* 
6870: 54 72 75 65 20 74 6f 20 73 68 6f 77 20 63 6f 6c  True to show col
6880: 75 6d 6e 20 6e 61 6d 65 73 20 69 6e 20 4c 69 73  umn names in Lis
6890: 74 20 6f 72 20 43 6f 6c 75 6d 6e 20 6d 6f 64 65  t or Column mode
68a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 68 65 63 6b   */.  int nCheck
68b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
68c0: 4e 75 6d 62 65 72 20 6f 66 20 22 2e 63 68 65 63  Number of ".chec
68d0: 6b 22 20 63 6f 6d 6d 61 6e 64 73 20 72 75 6e 20  k" commands run 
68e0: 2a 2f 0a 20 20 75 6e 73 69 67 6e 65 64 20 73 68  */.  unsigned sh
68f0: 65 6c 6c 46 6c 67 73 3b 20 20 20 20 2f 2a 20 56  ellFlgs;    /* V
6900: 61 72 69 6f 75 73 20 66 6c 61 67 73 20 2a 2f 0a  arious flags */.
6910: 20 20 63 68 61 72 20 2a 7a 44 65 73 74 54 61 62    char *zDestTab
6920: 6c 65 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  le;      /* Name
6930: 20 6f 66 20 64 65 73 74 69 6e 61 74 69 6f 6e 20   of destination 
6940: 74 61 62 6c 65 20 77 68 65 6e 20 4d 4f 44 45 5f  table when MODE_
6950: 49 6e 73 65 72 74 20 2a 2f 0a 20 20 63 68 61 72  Insert */.  char
6960: 20 7a 54 65 73 74 63 61 73 65 5b 33 30 5d 3b 20   zTestcase[30]; 
6970: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 63 75     /* Name of cu
6980: 72 72 65 6e 74 20 74 65 73 74 20 63 61 73 65 20  rrent test case 
6990: 2a 2f 0a 20 20 63 68 61 72 20 63 6f 6c 53 65 70  */.  char colSep
69a0: 61 72 61 74 6f 72 5b 32 30 5d 3b 20 2f 2a 20 43  arator[20]; /* C
69b0: 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72 20  olumn separator 
69c0: 63 68 61 72 61 63 74 65 72 20 66 6f 72 20 73 65  character for se
69d0: 76 65 72 61 6c 20 6d 6f 64 65 73 20 2a 2f 0a 20  veral modes */. 
69e0: 20 63 68 61 72 20 72 6f 77 53 65 70 61 72 61 74   char rowSeparat
69f0: 6f 72 5b 32 30 5d 3b 20 2f 2a 20 52 6f 77 20 73  or[20]; /* Row s
6a00: 65 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74  eparator charact
6a10: 65 72 20 66 6f 72 20 4d 4f 44 45 5f 41 73 63 69  er for MODE_Asci
6a20: 69 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 6c 57 69  i */.  int colWi
6a30: 64 74 68 5b 31 30 30 5d 3b 20 20 20 20 20 2f 2a  dth[100];     /*
6a40: 20 52 65 71 75 65 73 74 65 64 20 77 69 64 74 68   Requested width
6a50: 20 6f 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20   of each column 
6a60: 77 68 65 6e 20 69 6e 20 63 6f 6c 75 6d 6e 20 6d  when in column m
6a70: 6f 64 65 2a 2f 0a 20 20 69 6e 74 20 61 63 74 75  ode*/.  int actu
6a80: 61 6c 57 69 64 74 68 5b 31 30 30 5d 3b 20 20 2f  alWidth[100];  /
6a90: 2a 20 41 63 74 75 61 6c 20 77 69 64 74 68 20 6f  * Actual width o
6aa0: 66 20 65 61 63 68 20 63 6f 6c 75 6d 6e 20 2a 2f  f each column */
6ab0: 0a 20 20 63 68 61 72 20 6e 75 6c 6c 56 61 6c 75  .  char nullValu
6ac0: 65 5b 32 30 5d 3b 20 20 20 20 2f 2a 20 54 68 65  e[20];    /* The
6ad0: 20 74 65 78 74 20 74 6f 20 70 72 69 6e 74 20 77   text to print w
6ae0: 68 65 6e 20 61 20 4e 55 4c 4c 20 63 6f 6d 65 73  hen a NULL comes
6af0: 20 62 61 63 6b 20 66 72 6f 6d 0a 20 20 20 20 20   back from.     
6b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b10: 20 20 20 20 2a 2a 20 74 68 65 20 64 61 74 61 62      ** the datab
6b20: 61 73 65 20 2a 2f 0a 20 20 63 68 61 72 20 6f 75  ase */.  char ou
6b30: 74 66 69 6c 65 5b 46 49 4c 45 4e 41 4d 45 5f 4d  tfile[FILENAME_M
6b40: 41 58 5d 3b 20 2f 2a 20 46 69 6c 65 6e 61 6d 65  AX]; /* Filename
6b50: 20 66 6f 72 20 2a 6f 75 74 20 2a 2f 0a 20 20 63   for *out */.  c
6b60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 46 69  onst char *zDbFi
6b70: 6c 65 6e 61 6d 65 3b 20 20 20 20 2f 2a 20 6e 61  lename;    /* na
6b80: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
6b90: 73 65 20 66 69 6c 65 20 2a 2f 0a 20 20 63 68 61  se file */.  cha
6ba0: 72 20 2a 7a 46 72 65 65 4f 6e 43 6c 6f 73 65 3b  r *zFreeOnClose;
6bb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 46 69 6c 65           /* File
6bc0: 6e 61 6d 65 20 74 6f 20 66 72 65 65 20 77 68 65  name to free whe
6bd0: 6e 20 63 6c 6f 73 69 6e 67 20 2a 2f 0a 20 20 63  n closing */.  c
6be0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 56 66 73 3b  onst char *zVfs;
6bf0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
6c00: 6d 65 20 6f 66 20 56 46 53 20 74 6f 20 75 73 65  me of VFS to use
6c10: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 5f 73 74   */.  sqlite3_st
6c20: 6d 74 20 2a 70 53 74 6d 74 3b 20 20 20 2f 2a 20  mt *pStmt;   /* 
6c30: 43 75 72 72 65 6e 74 20 73 74 61 74 65 6d 65 6e  Current statemen
6c40: 74 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20 20 46  t if any. */.  F
6c50: 49 4c 45 20 2a 70 4c 6f 67 3b 20 20 20 20 20 20  ILE *pLog;      
6c60: 20 20 20 20 20 20 2f 2a 20 57 72 69 74 65 20 6c        /* Write l
6c70: 6f 67 20 6f 75 74 70 75 74 20 68 65 72 65 20 2a  og output here *
6c80: 2f 0a 20 20 69 6e 74 20 2a 61 69 49 6e 64 65 6e  /.  int *aiInden
6c90: 74 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 41 72  t;         /* Ar
6ca0: 72 61 79 20 6f 66 20 69 6e 64 65 6e 74 73 20 75  ray of indents u
6cb0: 73 65 64 20 69 6e 20 4d 4f 44 45 5f 45 78 70 6c  sed in MODE_Expl
6cc0: 61 69 6e 20 2a 2f 0a 20 20 69 6e 74 20 6e 49 6e  ain */.  int nIn
6cd0: 64 65 6e 74 3b 20 20 20 20 20 20 20 20 20 20 20  dent;           
6ce0: 2f 2a 20 53 69 7a 65 20 6f 66 20 61 72 72 61 79  /* Size of array
6cf0: 20 61 69 49 6e 64 65 6e 74 5b 5d 20 2a 2f 0a 20   aiIndent[] */. 
6d00: 20 69 6e 74 20 69 49 6e 64 65 6e 74 3b 20 20 20   int iIndent;   
6d10: 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65 78          /* Index
6d20: 20 6f 66 20 63 75 72 72 65 6e 74 20 6f 70 20 69   of current op i
6d30: 6e 20 61 69 49 6e 64 65 6e 74 5b 5d 20 2a 2f 0a  n aiIndent[] */.
6d40: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
6d50: 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f  TE_ENABLE_SESSIO
6d60: 4e 29 0a 20 20 69 6e 74 20 6e 53 65 73 73 69 6f  N).  int nSessio
6d70: 6e 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  n;             /
6d80: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 63 74 69  * Number of acti
6d90: 76 65 20 73 65 73 73 69 6f 6e 73 20 2a 2f 0a 20  ve sessions */. 
6da0: 20 4f 70 65 6e 53 65 73 73 69 6f 6e 20 61 53 65   OpenSession aSe
6db0: 73 73 69 6f 6e 5b 34 5d 3b 20 20 2f 2a 20 41 72  ssion[4];  /* Ar
6dc0: 72 61 79 20 6f 66 20 73 65 73 73 69 6f 6e 73 2e  ray of sessions.
6dd0: 20 20 5b 30 5d 20 69 73 20 69 6e 20 66 6f 63 75    [0] is in focu
6de0: 73 2e 20 2a 2f 0a 23 65 6e 64 69 66 0a 20 20 45  s. */.#endif.  E
6df0: 78 70 65 72 74 49 6e 66 6f 20 65 78 70 65 72 74  xpertInfo expert
6e00: 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 61 6c 69  ;        /* Vali
6e10: 64 20 69 66 20 70 72 65 76 69 6f 75 73 20 63 6f  d if previous co
6e20: 6d 6d 61 6e 64 20 77 61 73 20 22 2e 65 78 70 65  mmand was ".expe
6e30: 72 74 20 4f 50 54 2e 2e 2e 22 20 2a 2f 0a 7d 3b  rt OPT..." */.};
6e40: 0a 0a 2f 2a 20 41 6c 6c 6f 77 65 64 20 76 61 6c  ../* Allowed val
6e50: 75 65 73 20 66 6f 72 20 53 68 65 6c 6c 53 74 61  ues for ShellSta
6e60: 74 65 2e 61 75 74 6f 45 51 50 0a 2a 2f 0a 23 64  te.autoEQP.*/.#d
6e70: 65 66 69 6e 65 20 41 55 54 4f 45 51 50 5f 6f 66  efine AUTOEQP_of
6e80: 66 20 20 20 20 20 20 30 0a 23 64 65 66 69 6e 65  f      0.#define
6e90: 20 41 55 54 4f 45 51 50 5f 6f 6e 20 20 20 20 20   AUTOEQP_on     
6ea0: 20 20 31 0a 23 64 65 66 69 6e 65 20 41 55 54 4f    1.#define AUTO
6eb0: 45 51 50 5f 74 72 69 67 67 65 72 20 20 32 0a 23  EQP_trigger  2.#
6ec0: 64 65 66 69 6e 65 20 41 55 54 4f 45 51 50 5f 66  define AUTOEQP_f
6ed0: 75 6c 6c 20 20 20 20 20 33 0a 0a 2f 2a 0a 2a 2a  ull     3../*.**
6ee0: 20 54 68 65 73 65 20 61 72 65 20 74 68 65 20 61   These are the a
6ef0: 6c 6c 6f 77 65 64 20 73 68 65 6c 6c 46 6c 67 73  llowed shellFlgs
6f00: 20 76 61 6c 75 65 73 0a 2a 2f 0a 23 64 65 66 69   values.*/.#defi
6f10: 6e 65 20 53 48 46 4c 47 5f 50 61 67 65 63 61 63  ne SHFLG_Pagecac
6f20: 68 65 20 20 20 20 20 20 30 78 30 30 30 30 30 30  he      0x000000
6f30: 30 31 20 2f 2a 20 54 68 65 20 2d 2d 70 61 67 65  01 /* The --page
6f40: 63 61 63 68 65 20 6f 70 74 69 6f 6e 20 69 73 20  cache option is 
6f50: 75 73 65 64 20 2a 2f 0a 23 64 65 66 69 6e 65 20  used */.#define 
6f60: 53 48 46 4c 47 5f 4c 6f 6f 6b 61 73 69 64 65 20  SHFLG_Lookaside 
6f70: 20 20 20 20 20 30 78 30 30 30 30 30 30 30 32 20       0x00000002 
6f80: 2f 2a 20 4c 6f 6f 6b 61 73 69 64 65 20 6d 65 6d  /* Lookaside mem
6f90: 6f 72 79 20 69 73 20 75 73 65 64 20 2a 2f 0a 23  ory is used */.#
6fa0: 64 65 66 69 6e 65 20 53 48 46 4c 47 5f 42 61 63  define SHFLG_Bac
6fb0: 6b 73 6c 61 73 68 20 20 20 20 20 20 30 78 30 30  kslash      0x00
6fc0: 30 30 30 30 30 34 20 2f 2a 20 54 68 65 20 2d 2d  000004 /* The --
6fd0: 62 61 63 6b 73 6c 61 73 68 20 6f 70 74 69 6f 6e  backslash option
6fe0: 20 69 73 20 75 73 65 64 20 2a 2f 0a 23 64 65 66   is used */.#def
6ff0: 69 6e 65 20 53 48 46 4c 47 5f 50 72 65 73 65 72  ine SHFLG_Preser
7000: 76 65 52 6f 77 69 64 20 20 30 78 30 30 30 30 30  veRowid  0x00000
7010: 30 30 38 20 2f 2a 20 2e 64 75 6d 70 20 70 72 65  008 /* .dump pre
7020: 73 65 72 76 65 73 20 72 6f 77 69 64 20 76 61 6c  serves rowid val
7030: 75 65 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 53  ues */.#define S
7040: 48 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 20 20 20  HFLG_Newlines   
7050: 20 20 20 20 30 78 30 30 30 30 30 30 31 30 20 2f      0x00000010 /
7060: 2a 20 2e 64 75 6d 70 20 2d 2d 6e 65 77 6c 69 6e  * .dump --newlin
7070: 65 20 66 6c 61 67 20 2a 2f 0a 23 64 65 66 69 6e  e flag */.#defin
7080: 65 20 53 48 46 4c 47 5f 43 6f 75 6e 74 43 68 61  e SHFLG_CountCha
7090: 6e 67 65 73 20 20 20 30 78 30 30 30 30 30 30 32  nges   0x0000002
70a0: 30 20 2f 2a 20 2e 63 68 61 6e 67 65 73 20 73 65  0 /* .changes se
70b0: 74 74 69 6e 67 20 2a 2f 0a 23 64 65 66 69 6e 65  tting */.#define
70c0: 20 53 48 46 4c 47 5f 45 63 68 6f 20 20 20 20 20   SHFLG_Echo     
70d0: 20 20 20 20 20 20 30 78 30 30 30 30 30 30 34 30        0x00000040
70e0: 20 2f 2a 20 2e 65 63 68 6f 20 6f 72 20 2d 2d 65   /* .echo or --e
70f0: 63 68 6f 20 73 65 74 74 69 6e 67 20 2a 2f 0a 0a  cho setting */..
7100: 2f 2a 0a 2a 2a 20 4d 61 63 72 6f 73 20 66 6f 72  /*.** Macros for
7110: 20 74 65 73 74 69 6e 67 20 61 6e 64 20 73 65 74   testing and set
7120: 74 69 6e 67 20 73 68 65 6c 6c 46 6c 67 73 0a 2a  ting shellFlgs.*
7130: 2f 0a 23 64 65 66 69 6e 65 20 53 68 65 6c 6c 48  /.#define ShellH
7140: 61 73 46 6c 61 67 28 50 2c 58 29 20 20 20 20 28  asFlag(P,X)    (
7150: 28 28 50 29 2d 3e 73 68 65 6c 6c 46 6c 67 73 20  ((P)->shellFlgs 
7160: 26 20 28 58 29 29 21 3d 30 29 0a 23 64 65 66 69  & (X))!=0).#defi
7170: 6e 65 20 53 68 65 6c 6c 53 65 74 46 6c 61 67 28  ne ShellSetFlag(
7180: 50 2c 58 29 20 20 20 20 28 28 50 29 2d 3e 73 68  P,X)    ((P)->sh
7190: 65 6c 6c 46 6c 67 73 7c 3d 28 58 29 29 0a 23 64  ellFlgs|=(X)).#d
71a0: 65 66 69 6e 65 20 53 68 65 6c 6c 43 6c 65 61 72  efine ShellClear
71b0: 46 6c 61 67 28 50 2c 58 29 20 20 28 28 50 29 2d  Flag(P,X)  ((P)-
71c0: 3e 73 68 65 6c 6c 46 6c 67 73 26 3d 28 7e 28 58  >shellFlgs&=(~(X
71d0: 29 29 29 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65  )))../*.** These
71e0: 20 61 72 65 20 74 68 65 20 61 6c 6c 6f 77 65 64   are the allowed
71f0: 20 6d 6f 64 65 73 2e 0a 2a 2f 0a 23 64 65 66 69   modes..*/.#defi
7200: 6e 65 20 4d 4f 44 45 5f 4c 69 6e 65 20 20 20 20  ne MODE_Line    
7210: 20 30 20 20 2f 2a 20 4f 6e 65 20 63 6f 6c 75 6d   0  /* One colum
7220: 6e 20 70 65 72 20 6c 69 6e 65 2e 20 20 42 6c 61  n per line.  Bla
7230: 6e 6b 20 6c 69 6e 65 20 62 65 74 77 65 65 6e 20  nk line between 
7240: 72 65 63 6f 72 64 73 20 2a 2f 0a 23 64 65 66 69  records */.#defi
7250: 6e 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 20 20  ne MODE_Column  
7260: 20 31 20 20 2f 2a 20 4f 6e 65 20 72 65 63 6f 72   1  /* One recor
7270: 64 20 70 65 72 20 6c 69 6e 65 20 69 6e 20 6e 65  d per line in ne
7280: 61 74 20 63 6f 6c 75 6d 6e 73 20 2a 2f 0a 23 64  at columns */.#d
7290: 65 66 69 6e 65 20 4d 4f 44 45 5f 4c 69 73 74 20  efine MODE_List 
72a0: 20 20 20 20 32 20 20 2f 2a 20 4f 6e 65 20 72 65      2  /* One re
72b0: 63 6f 72 64 20 70 65 72 20 6c 69 6e 65 20 77 69  cord per line wi
72c0: 74 68 20 61 20 73 65 70 61 72 61 74 6f 72 20 2a  th a separator *
72d0: 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f 53  /.#define MODE_S
72e0: 65 6d 69 20 20 20 20 20 33 20 20 2f 2a 20 53 61  emi     3  /* Sa
72f0: 6d 65 20 61 73 20 4d 4f 44 45 5f 4c 69 73 74 20  me as MODE_List 
7300: 62 75 74 20 61 70 70 65 6e 64 20 22 3b 22 20 74  but append ";" t
7310: 6f 20 65 61 63 68 20 6c 69 6e 65 20 2a 2f 0a 23  o each line */.#
7320: 64 65 66 69 6e 65 20 4d 4f 44 45 5f 48 74 6d 6c  define MODE_Html
7330: 20 20 20 20 20 34 20 20 2f 2a 20 47 65 6e 65 72       4  /* Gener
7340: 61 74 65 20 61 6e 20 58 48 54 4d 4c 20 74 61 62  ate an XHTML tab
7350: 6c 65 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  le */.#define MO
7360: 44 45 5f 49 6e 73 65 72 74 20 20 20 35 20 20 2f  DE_Insert   5  /
7370: 2a 20 47 65 6e 65 72 61 74 65 20 53 51 4c 20 22  * Generate SQL "
7380: 69 6e 73 65 72 74 22 20 73 74 61 74 65 6d 65 6e  insert" statemen
7390: 74 73 20 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f  ts */.#define MO
73a0: 44 45 5f 51 75 6f 74 65 20 20 20 20 36 20 20 2f  DE_Quote    6  /
73b0: 2a 20 51 75 6f 74 65 20 76 61 6c 75 65 73 20 61  * Quote values a
73c0: 73 20 66 6f 72 20 53 51 4c 20 2a 2f 0a 23 64 65  s for SQL */.#de
73d0: 66 69 6e 65 20 4d 4f 44 45 5f 54 63 6c 20 20 20  fine MODE_Tcl   
73e0: 20 20 20 37 20 20 2f 2a 20 47 65 6e 65 72 61 74     7  /* Generat
73f0: 65 20 41 4e 53 49 2d 43 20 6f 72 20 54 43 4c 20  e ANSI-C or TCL 
7400: 71 75 6f 74 65 64 20 65 6c 65 6d 65 6e 74 73 20  quoted elements 
7410: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
7420: 43 73 76 20 20 20 20 20 20 38 20 20 2f 2a 20 51  Csv      8  /* Q
7430: 75 6f 74 65 20 73 74 72 69 6e 67 73 2c 20 6e 75  uote strings, nu
7440: 6d 62 65 72 73 20 61 72 65 20 70 6c 61 69 6e 20  mbers are plain 
7450: 2a 2f 0a 23 64 65 66 69 6e 65 20 4d 4f 44 45 5f  */.#define MODE_
7460: 45 78 70 6c 61 69 6e 20 20 39 20 20 2f 2a 20 4c  Explain  9  /* L
7470: 69 6b 65 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e 2c  ike MODE_Column,
7480: 20 62 75 74 20 64 6f 20 6e 6f 74 20 74 72 75 6e   but do not trun
7490: 63 61 74 65 20 64 61 74 61 20 2a 2f 0a 23 64 65  cate data */.#de
74a0: 66 69 6e 65 20 4d 4f 44 45 5f 41 73 63 69 69 20  fine MODE_Ascii 
74b0: 20 20 31 30 20 20 2f 2a 20 55 73 65 20 41 53 43    10  /* Use ASC
74c0: 49 49 20 75 6e 69 74 20 61 6e 64 20 72 65 63 6f  II unit and reco
74d0: 72 64 20 73 65 70 61 72 61 74 6f 72 73 20 28 30  rd separators (0
74e0: 78 31 46 2f 30 78 31 45 29 20 2a 2f 0a 23 64 65  x1F/0x1E) */.#de
74f0: 66 69 6e 65 20 4d 4f 44 45 5f 50 72 65 74 74 79  fine MODE_Pretty
7500: 20 20 31 31 20 20 2f 2a 20 50 72 65 74 74 79 2d    11  /* Pretty-
7510: 70 72 69 6e 74 20 73 63 68 65 6d 61 73 20 2a 2f  print schemas */
7520: 0a 0a 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63  ..static const c
7530: 68 61 72 20 2a 6d 6f 64 65 44 65 73 63 72 5b 5d  har *modeDescr[]
7540: 20 3d 20 7b 0a 20 20 22 6c 69 6e 65 22 2c 0a 20   = {.  "line",. 
7550: 20 22 63 6f 6c 75 6d 6e 22 2c 0a 20 20 22 6c 69   "column",.  "li
7560: 73 74 22 2c 0a 20 20 22 73 65 6d 69 22 2c 0a 20  st",.  "semi",. 
7570: 20 22 68 74 6d 6c 22 2c 0a 20 20 22 69 6e 73 65   "html",.  "inse
7580: 72 74 22 2c 0a 20 20 22 71 75 6f 74 65 22 2c 0a  rt",.  "quote",.
7590: 20 20 22 74 63 6c 22 2c 0a 20 20 22 63 73 76 22    "tcl",.  "csv"
75a0: 2c 0a 20 20 22 65 78 70 6c 61 69 6e 22 2c 0a 20  ,.  "explain",. 
75b0: 20 22 61 73 63 69 69 22 2c 0a 20 20 22 70 72 65   "ascii",.  "pre
75c0: 74 74 79 70 72 69 6e 74 22 2c 0a 7d 3b 0a 0a 2f  ttyprint",.};../
75d0: 2a 0a 2a 2a 20 54 68 65 73 65 20 61 72 65 20 74  *.** These are t
75e0: 68 65 20 63 6f 6c 75 6d 6e 2f 72 6f 77 2f 6c 69  he column/row/li
75f0: 6e 65 20 73 65 70 61 72 61 74 6f 72 73 20 75 73  ne separators us
7600: 65 64 20 62 79 20 74 68 65 20 76 61 72 69 6f 75  ed by the variou
7610: 73 0a 2a 2a 20 69 6d 70 6f 72 74 2f 65 78 70 6f  s.** import/expo
7620: 72 74 20 6d 6f 64 65 73 2e 0a 2a 2f 0a 23 64 65  rt modes..*/.#de
7630: 66 69 6e 65 20 53 45 50 5f 43 6f 6c 75 6d 6e 20  fine SEP_Column 
7640: 20 20 20 22 7c 22 0a 23 64 65 66 69 6e 65 20 53     "|".#define S
7650: 45 50 5f 52 6f 77 20 20 20 20 20 20 20 22 5c 6e  EP_Row       "\n
7660: 22 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 54 61  ".#define SEP_Ta
7670: 62 20 20 20 20 20 20 20 22 5c 74 22 0a 23 64 65  b       "\t".#de
7680: 66 69 6e 65 20 53 45 50 5f 53 70 61 63 65 20 20  fine SEP_Space  
7690: 20 20 20 22 20 22 0a 23 64 65 66 69 6e 65 20 53     " ".#define S
76a0: 45 50 5f 43 6f 6d 6d 61 20 20 20 20 20 22 2c 22  EP_Comma     ","
76b0: 0a 23 64 65 66 69 6e 65 20 53 45 50 5f 43 72 4c  .#define SEP_CrL
76c0: 66 20 20 20 20 20 20 22 5c 72 5c 6e 22 0a 23 64  f      "\r\n".#d
76d0: 65 66 69 6e 65 20 53 45 50 5f 55 6e 69 74 20 20  efine SEP_Unit  
76e0: 20 20 20 20 22 5c 78 31 46 22 0a 23 64 65 66 69      "\x1F".#defi
76f0: 6e 65 20 53 45 50 5f 52 65 63 6f 72 64 20 20 20  ne SEP_Record   
7700: 20 22 5c 78 31 45 22 0a 0a 2f 2a 0a 2a 2a 20 4e   "\x1E"../*.** N
7710: 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74  umber of element
7720: 73 20 69 6e 20 61 6e 20 61 72 72 61 79 0a 2a 2f  s in an array.*/
7730: 0a 23 64 65 66 69 6e 65 20 41 72 72 61 79 53 69  .#define ArraySi
7740: 7a 65 28 58 29 20 20 28 69 6e 74 29 28 73 69 7a  ze(X)  (int)(siz
7750: 65 6f 66 28 58 29 2f 73 69 7a 65 6f 66 28 58 5b  eof(X)/sizeof(X[
7760: 30 5d 29 29 0a 0a 2f 2a 0a 2a 2a 20 41 20 63 61  0]))../*.** A ca
7770: 6c 6c 62 61 63 6b 20 66 6f 72 20 74 68 65 20 73  llback for the s
7780: 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 69 6e 74  qlite3_log() int
7790: 65 72 66 61 63 65 2e 0a 2a 2f 0a 73 74 61 74 69  erface..*/.stati
77a0: 63 20 76 6f 69 64 20 73 68 65 6c 6c 4c 6f 67 28  c void shellLog(
77b0: 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74 20  void *pArg, int 
77c0: 69 45 72 72 43 6f 64 65 2c 20 63 6f 6e 73 74 20  iErrCode, const 
77d0: 63 68 61 72 20 2a 7a 4d 73 67 29 7b 0a 20 20 53  char *zMsg){.  S
77e0: 68 65 6c 6c 53 74 61 74 65 20 2a 70 20 3d 20 28  hellState *p = (
77f0: 53 68 65 6c 6c 53 74 61 74 65 2a 29 70 41 72 67  ShellState*)pArg
7800: 3b 0a 20 20 69 66 28 20 70 2d 3e 70 4c 6f 67 3d  ;.  if( p->pLog=
7810: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 75  =0 ) return;.  u
7820: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 70 4c  tf8_printf(p->pL
7830: 6f 67 2c 20 22 28 25 64 29 20 25 73 5c 6e 22 2c  og, "(%d) %s\n",
7840: 20 69 45 72 72 43 6f 64 65 2c 20 7a 4d 73 67 29   iErrCode, zMsg)
7850: 3b 0a 20 20 66 66 6c 75 73 68 28 70 2d 3e 70 4c  ;.  fflush(p->pL
7860: 6f 67 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75  og);.}../*.** Ou
7870: 74 70 75 74 20 74 68 65 20 67 69 76 65 6e 20 73  tput the given s
7880: 74 72 69 6e 67 20 61 73 20 61 20 68 65 78 2d 65  tring as a hex-e
7890: 6e 63 6f 64 65 64 20 62 6c 6f 62 20 28 65 67 2e  ncoded blob (eg.
78a0: 20 58 27 31 32 33 34 27 20 29 0a 2a 2f 0a 73 74   X'1234' ).*/.st
78b0: 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74  atic void output
78c0: 5f 68 65 78 5f 62 6c 6f 62 28 46 49 4c 45 20 2a  _hex_blob(FILE *
78d0: 6f 75 74 2c 20 63 6f 6e 73 74 20 76 6f 69 64 20  out, const void 
78e0: 2a 70 42 6c 6f 62 2c 20 69 6e 74 20 6e 42 6c 6f  *pBlob, int nBlo
78f0: 62 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63  b){.  int i;.  c
7900: 68 61 72 20 2a 7a 42 6c 6f 62 20 3d 20 28 63 68  har *zBlob = (ch
7910: 61 72 20 2a 29 70 42 6c 6f 62 3b 0a 20 20 72 61  ar *)pBlob;.  ra
7920: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 58 27  w_printf(out,"X'
7930: 22 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ");.  for(i=0; i
7940: 3c 6e 42 6c 6f 62 3b 20 69 2b 2b 29 7b 20 72 61  <nBlob; i++){ ra
7950: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 25 30  w_printf(out,"%0
7960: 32 78 22 2c 7a 42 6c 6f 62 5b 69 5d 26 30 78 66  2x",zBlob[i]&0xf
7970: 66 29 3b 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e  f); }.  raw_prin
7980: 74 66 28 6f 75 74 2c 22 27 22 29 3b 0a 7d 0a 0a  tf(out,"'");.}..
7990: 2f 2a 0a 2a 2a 20 46 69 6e 64 20 61 20 73 74 72  /*.** Find a str
79a0: 69 6e 67 20 74 68 61 74 20 69 73 20 6e 6f 74 20  ing that is not 
79b0: 66 6f 75 6e 64 20 61 6e 79 77 68 65 72 65 20 69  found anywhere i
79c0: 6e 20 7a 5b 5d 2e 20 20 52 65 74 75 72 6e 20 61  n z[].  Return a
79d0: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 74   pointer.** to t
79e0: 68 61 74 20 73 74 72 69 6e 67 2e 0a 2a 2a 0a 2a  hat string..**.*
79f0: 2a 20 54 72 79 20 74 6f 20 75 73 65 20 7a 41 20  * Try to use zA 
7a00: 61 6e 64 20 7a 42 20 66 69 72 73 74 2e 20 20 49  and zB first.  I
7a10: 66 20 62 6f 74 68 20 6f 66 20 74 68 6f 73 65 20  f both of those 
7a20: 61 72 65 20 61 6c 72 65 61 64 79 20 66 6f 75 6e  are already foun
7a30: 64 20 69 6e 20 7a 5b 5d 0a 2a 2a 20 74 68 65 6e  d in z[].** then
7a40: 20 6d 61 6b 65 20 75 70 20 73 6f 6d 65 20 73 74   make up some st
7a50: 72 69 6e 67 20 61 6e 64 20 73 74 6f 72 65 20 69  ring and store i
7a60: 74 20 69 6e 20 74 68 65 20 62 75 66 66 65 72 20  t in the buffer 
7a70: 7a 42 75 66 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  zBuf..*/.static 
7a80: 63 6f 6e 73 74 20 63 68 61 72 20 2a 75 6e 75 73  const char *unus
7a90: 65 64 5f 73 74 72 69 6e 67 28 0a 20 20 63 6f 6e  ed_string(.  con
7aa0: 73 74 20 63 68 61 72 20 2a 7a 2c 20 20 20 20 20  st char *z,     
7ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
7ac0: 2a 20 52 65 73 75 6c 74 20 6d 75 73 74 20 6e 6f  * Result must no
7ad0: 74 20 61 70 70 65 61 72 20 61 6e 79 77 68 65 72  t appear anywher
7ae0: 65 20 69 6e 20 7a 20 2a 2f 0a 20 20 63 6f 6e 73  e in z */.  cons
7af0: 74 20 63 68 61 72 20 2a 7a 41 2c 20 63 6f 6e 73  t char *zA, cons
7b00: 74 20 63 68 61 72 20 2a 7a 42 2c 20 20 20 2f 2a  t char *zB,   /*
7b10: 20 54 72 79 20 74 68 65 73 65 20 66 69 72 73 74   Try these first
7b20: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 42 75 66   */.  char *zBuf
7b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7b40: 20 20 20 20 20 20 20 20 2f 2a 20 53 70 61 63 65          /* Space
7b50: 20 74 6f 20 73 74 6f 72 65 20 61 20 67 65 6e 65   to store a gene
7b60: 72 61 74 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a  rated string */.
7b70: 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20 69 20  ){.  unsigned i 
7b80: 3d 20 30 3b 0a 20 20 69 66 28 20 73 74 72 73 74  = 0;.  if( strst
7b90: 72 28 7a 2c 20 7a 41 29 3d 3d 30 20 29 20 72 65  r(z, zA)==0 ) re
7ba0: 74 75 72 6e 20 7a 41 3b 0a 20 20 69 66 28 20 73  turn zA;.  if( s
7bb0: 74 72 73 74 72 28 7a 2c 20 7a 42 29 3d 3d 30 20  trstr(z, zB)==0 
7bc0: 29 20 72 65 74 75 72 6e 20 7a 42 3b 0a 20 20 64  ) return zB;.  d
7bd0: 6f 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73  o{.    sqlite3_s
7be0: 6e 70 72 69 6e 74 66 28 32 30 2c 7a 42 75 66 2c  nprintf(20,zBuf,
7bf0: 22 28 25 73 25 75 29 22 2c 20 7a 41 2c 20 69 2b  "(%s%u)", zA, i+
7c00: 2b 29 3b 0a 20 20 7d 77 68 69 6c 65 28 20 73 74  +);.  }while( st
7c10: 72 73 74 72 28 7a 2c 7a 42 75 66 29 21 3d 30 20  rstr(z,zBuf)!=0 
7c20: 29 3b 0a 20 20 72 65 74 75 72 6e 20 7a 42 75 66  );.  return zBuf
7c30: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75  ;.}../*.** Outpu
7c40: 74 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69  t the given stri
7c50: 6e 67 20 61 73 20 61 20 71 75 6f 74 65 64 20 73  ng as a quoted s
7c60: 74 72 69 6e 67 20 75 73 69 6e 67 20 53 51 4c 20  tring using SQL 
7c70: 71 75 6f 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69  quoting conventi
7c80: 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 61  ons..**.** See a
7c90: 6c 73 6f 3a 20 6f 75 74 70 75 74 5f 71 75 6f 74  lso: output_quot
7ca0: 65 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e  ed_escaped_strin
7cb0: 67 28 29 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  g().*/.static vo
7cc0: 69 64 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64  id output_quoted
7cd0: 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a 6f 75  _string(FILE *ou
7ce0: 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  t, const char *z
7cf0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 68  ){.  int i;.  ch
7d00: 61 72 20 63 3b 0a 20 20 73 65 74 42 69 6e 61 72  ar c;.  setBinar
7d10: 79 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a 20  yMode(out, 1);. 
7d20: 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20 7a   for(i=0; (c = z
7d30: 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27 5c  [i])!=0 && c!='\
7d40: 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28  ''; i++){}.  if(
7d50: 20 63 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66   c==0 ){.    utf
7d60: 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 25  8_printf(out,"'%
7d70: 73 27 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b  s'",z);.  }else{
7d80: 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
7d90: 6f 75 74 2c 20 22 27 22 29 3b 0a 20 20 20 20 77  out, "'");.    w
7da0: 68 69 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20  hile( *z ){.    
7db0: 20 20 66 6f 72 28 69 3d 30 3b 20 28 63 20 3d 20    for(i=0; (c = 
7dc0: 7a 5b 69 5d 29 21 3d 30 20 26 26 20 63 21 3d 27  z[i])!=0 && c!='
7dd0: 5c 27 27 3b 20 69 2b 2b 29 7b 7d 0a 20 20 20 20  \''; i++){}.    
7de0: 20 20 69 66 28 20 63 3d 3d 27 5c 27 27 20 29 20    if( c=='\'' ) 
7df0: 69 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 69  i++;.      if( i
7e00: 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
7e10: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 2e  _printf(out, "%.
7e20: 2a 73 22 2c 20 69 2c 20 7a 29 3b 0a 20 20 20 20  *s", i, z);.    
7e30: 20 20 20 20 7a 20 2b 3d 20 69 3b 0a 20 20 20 20      z += i;.    
7e40: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 3d    }.      if( c=
7e50: 3d 27 5c 27 27 20 29 7b 0a 20 20 20 20 20 20 20  ='\'' ){.       
7e60: 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
7e70: 20 22 27 22 29 3b 0a 20 20 20 20 20 20 20 20 63   "'");.        c
7e80: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
7e90: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 30 20  .      if( c==0 
7ea0: 29 7b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  ){.        break
7eb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7ec0: 7a 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  z++;.    }.    r
7ed0: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
7ee0: 27 22 29 3b 0a 20 20 7d 0a 20 20 73 65 74 54 65  '");.  }.  setTe
7ef0: 78 74 4d 6f 64 65 28 6f 75 74 2c 20 31 29 3b 0a  xtMode(out, 1);.
7f00: 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20  }../*.** Output 
7f10: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
7f20: 20 61 73 20 61 20 71 75 6f 74 65 64 20 73 74 72   as a quoted str
7f30: 69 6e 67 20 75 73 69 6e 67 20 53 51 4c 20 71 75  ing using SQL qu
7f40: 6f 74 69 6e 67 20 63 6f 6e 76 65 6e 74 69 6f 6e  oting convention
7f50: 73 2e 0a 2a 2a 20 41 64 64 69 74 69 6f 6e 61 6c  s..** Additional
7f60: 6c 6c 79 20 2c 20 65 73 63 61 70 65 20 74 68 65  lly , escape the
7f70: 20 22 5c 6e 22 20 61 6e 64 20 22 5c 72 22 20 63   "\n" and "\r" c
7f80: 68 61 72 61 63 74 65 72 73 20 73 6f 20 74 68 61  haracters so tha
7f90: 74 20 74 68 65 79 20 64 6f 20 6e 6f 74 0a 2a 2a  t they do not.**
7fa0: 20 67 65 74 20 63 6f 72 72 75 70 74 65 64 20 62   get corrupted b
7fb0: 79 20 65 6e 64 2d 6f 66 2d 6c 69 6e 65 20 74 72  y end-of-line tr
7fc0: 61 6e 73 6c 61 74 69 6f 6e 20 66 61 63 69 6c 69  anslation facili
7fd0: 74 69 65 73 20 69 6e 20 73 6f 6d 65 20 6f 70 65  ties in some ope
7fe0: 72 61 74 69 6e 67 0a 2a 2a 20 73 79 73 74 65 6d  rating.** system
7ff0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73  s..**.** This is
8000: 20 6c 69 6b 65 20 6f 75 74 70 75 74 5f 71 75 6f   like output_quo
8010: 74 65 64 5f 73 74 72 69 6e 67 28 29 20 62 75 74  ted_string() but
8020: 20 77 69 74 68 20 74 68 65 20 61 64 64 69 74 69   with the additi
8030: 6f 6e 20 6f 66 20 74 68 65 20 5c 72 5c 6e 0a 2a  on of the \r\n.*
8040: 2a 20 65 73 63 61 70 65 20 6d 65 63 68 61 6e 69  * escape mechani
8050: 73 6d 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  sm..*/.static vo
8060: 69 64 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64  id output_quoted
8070: 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28  _escaped_string(
8080: 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74  FILE *out, const
8090: 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e 74   char *z){.  int
80a0: 20 69 3b 0a 20 20 63 68 61 72 20 63 3b 0a 20 20   i;.  char c;.  
80b0: 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28 6f 75  setBinaryMode(ou
80c0: 74 2c 20 31 29 3b 0a 20 20 66 6f 72 28 69 3d 30  t, 1);.  for(i=0
80d0: 3b 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20  ; (c = z[i])!=0 
80e0: 26 26 20 63 21 3d 27 5c 27 27 20 26 26 20 63 21  && c!='\'' && c!
80f0: 3d 27 5c 6e 27 20 26 26 20 63 21 3d 27 5c 72 27  ='\n' && c!='\r'
8100: 3b 20 69 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 63  ; i++){}.  if( c
8110: 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66 38 5f  ==0 ){.    utf8_
8120: 70 72 69 6e 74 66 28 6f 75 74 2c 22 27 25 73 27  printf(out,"'%s'
8130: 22 2c 7a 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ",z);.  }else{. 
8140: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
8150: 4e 4c 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e 73  NL = 0;.    cons
8160: 74 20 63 68 61 72 20 2a 7a 43 52 20 3d 20 30 3b  t char *zCR = 0;
8170: 0a 20 20 20 20 69 6e 74 20 6e 4e 4c 20 3d 20 30  .    int nNL = 0
8180: 3b 0a 20 20 20 20 69 6e 74 20 6e 43 52 20 3d 20  ;.    int nCR = 
8190: 30 3b 0a 20 20 20 20 63 68 61 72 20 7a 42 75 66  0;.    char zBuf
81a0: 31 5b 32 30 5d 2c 20 7a 42 75 66 32 5b 32 30 5d  1[20], zBuf2[20]
81b0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a  ;.    for(i=0; z
81c0: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
81d0: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 6e 27 20   if( z[i]=='\n' 
81e0: 29 20 6e 4e 4c 2b 2b 3b 0a 20 20 20 20 20 20 69  ) nNL++;.      i
81f0: 66 28 20 7a 5b 69 5d 3d 3d 27 5c 72 27 20 29 20  f( z[i]=='\r' ) 
8200: 6e 43 52 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20  nCR++;.    }.   
8210: 20 69 66 28 20 6e 4e 4c 20 29 7b 0a 20 20 20 20   if( nNL ){.    
8220: 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74    raw_printf(out
8230: 2c 20 22 72 65 70 6c 61 63 65 28 22 29 3b 0a 20  , "replace(");. 
8240: 20 20 20 20 20 7a 4e 4c 20 3d 20 75 6e 75 73 65       zNL = unuse
8250: 64 5f 73 74 72 69 6e 67 28 7a 2c 20 22 5c 5c 6e  d_string(z, "\\n
8260: 22 2c 20 22 5c 5c 30 31 32 22 2c 20 7a 42 75 66  ", "\\012", zBuf
8270: 31 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  1);.    }.    if
8280: 28 20 6e 43 52 20 29 7b 0a 20 20 20 20 20 20 72  ( nCR ){.      r
8290: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
82a0: 72 65 70 6c 61 63 65 28 22 29 3b 0a 20 20 20 20  replace(");.    
82b0: 20 20 7a 43 52 20 3d 20 75 6e 75 73 65 64 5f 73    zCR = unused_s
82c0: 74 72 69 6e 67 28 7a 2c 20 22 5c 5c 72 22 2c 20  tring(z, "\\r", 
82d0: 22 5c 5c 30 31 35 22 2c 20 7a 42 75 66 32 29 3b  "\\015", zBuf2);
82e0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 61 77 5f 70  .    }.    raw_p
82f0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22 29 3b  rintf(out, "'");
8300: 0a 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 29  .    while( *z )
8310: 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  {.      for(i=0;
8320: 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 20 26   (c = z[i])!=0 &
8330: 26 20 63 21 3d 27 5c 6e 27 20 26 26 20 63 21 3d  & c!='\n' && c!=
8340: 27 5c 72 27 20 26 26 20 63 21 3d 27 5c 27 27 3b  '\r' && c!='\'';
8350: 20 69 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 69 66   i++){}.      if
8360: 28 20 63 3d 3d 27 5c 27 27 20 29 20 69 2b 2b 3b  ( c=='\'' ) i++;
8370: 0a 20 20 20 20 20 20 69 66 28 20 69 20 29 7b 0a  .      if( i ){.
8380: 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
8390: 6e 74 66 28 6f 75 74 2c 20 22 25 2e 2a 73 22 2c  ntf(out, "%.*s",
83a0: 20 69 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20 20   i, z);.        
83b0: 7a 20 2b 3d 20 69 3b 0a 20 20 20 20 20 20 7d 0a  z += i;.      }.
83c0: 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 27        if( c=='\'
83d0: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  ' ){.        raw
83e0: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 27 22  _printf(out, "'"
83f0: 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 69  );.        conti
8400: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
8410: 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
8420: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8430: 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 2b 2b 3b      }.      z++;
8440: 0a 20 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c  .      if( c=='\
8450: 6e 27 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61  n' ){.        ra
8460: 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  w_printf(out, "%
8470: 73 22 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20 20 20  s", zNL);.      
8480: 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20    continue;.    
8490: 20 20 7d 0a 20 20 20 20 20 20 72 61 77 5f 70 72    }.      raw_pr
84a0: 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c 20  intf(out, "%s", 
84b0: 7a 43 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  zCR);.    }.    
84c0: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20  raw_printf(out, 
84d0: 22 27 22 29 3b 0a 20 20 20 20 69 66 28 20 6e 43  "'");.    if( nC
84e0: 52 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  R ){.      raw_p
84f0: 72 69 6e 74 66 28 6f 75 74 2c 20 22 2c 27 25 73  rintf(out, ",'%s
8500: 27 2c 63 68 61 72 28 31 33 29 29 22 2c 20 7a 43  ',char(13))", zC
8510: 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  R);.    }.    if
8520: 28 20 6e 4e 4c 20 29 7b 0a 20 20 20 20 20 20 72  ( nNL ){.      r
8530: 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
8540: 2c 27 25 73 27 2c 63 68 61 72 28 31 30 29 29 22  ,'%s',char(10))"
8550: 2c 20 7a 4e 4c 29 3b 0a 20 20 20 20 7d 0a 20 20  , zNL);.    }.  
8560: 7d 0a 20 20 73 65 74 54 65 78 74 4d 6f 64 65 28  }.  setTextMode(
8570: 6f 75 74 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  out, 1);.}../*.*
8580: 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67 69 76  * Output the giv
8590: 65 6e 20 73 74 72 69 6e 67 20 61 73 20 61 20 71  en string as a q
85a0: 75 6f 74 65 64 20 61 63 63 6f 72 64 69 6e 67 20  uoted according 
85b0: 74 6f 20 43 20 6f 72 20 54 43 4c 20 71 75 6f 74  to C or TCL quot
85c0: 69 6e 67 20 72 75 6c 65 73 2e 0a 2a 2f 0a 73 74  ing rules..*/.st
85d0: 61 74 69 63 20 76 6f 69 64 20 6f 75 74 70 75 74  atic void output
85e0: 5f 63 5f 73 74 72 69 6e 67 28 46 49 4c 45 20 2a  _c_string(FILE *
85f0: 6f 75 74 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  out, const char 
8600: 2a 7a 29 7b 0a 20 20 75 6e 73 69 67 6e 65 64 20  *z){.  unsigned 
8610: 69 6e 74 20 63 3b 0a 20 20 66 70 75 74 63 28 27  int c;.  fputc('
8620: 22 27 2c 20 6f 75 74 29 3b 0a 20 20 77 68 69 6c  "', out);.  whil
8630: 65 28 20 28 63 20 3d 20 2a 28 7a 2b 2b 29 29 21  e( (c = *(z++))!
8640: 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 63 3d  =0 ){.    if( c=
8650: 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20 20 66  ='\\' ){.      f
8660: 70 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20  putc(c, out);.  
8670: 20 20 20 20 66 70 75 74 63 28 63 2c 20 6f 75 74      fputc(c, out
8680: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  );.    }else if(
8690: 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 20   c=='"' ){.     
86a0: 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74   fputc('\\', out
86b0: 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27  );.      fputc('
86c0: 22 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65  "', out);.    }e
86d0: 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 74 27 20  lse if( c=='\t' 
86e0: 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27  ){.      fputc('
86f0: 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20  \\', out);.     
8700: 20 66 70 75 74 63 28 27 74 27 2c 20 6f 75 74 29   fputc('t', out)
8710: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8720: 63 3d 3d 27 5c 6e 27 20 29 7b 0a 20 20 20 20 20  c=='\n' ){.     
8730: 20 66 70 75 74 63 28 27 5c 5c 27 2c 20 6f 75 74   fputc('\\', out
8740: 29 3b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27  );.      fputc('
8750: 6e 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 7d 65  n', out);.    }e
8760: 6c 73 65 20 69 66 28 20 63 3d 3d 27 5c 72 27 20  lse if( c=='\r' 
8770: 29 7b 0a 20 20 20 20 20 20 66 70 75 74 63 28 27  ){.      fputc('
8780: 5c 5c 27 2c 20 6f 75 74 29 3b 0a 20 20 20 20 20  \\', out);.     
8790: 20 66 70 75 74 63 28 27 72 27 2c 20 6f 75 74 29   fputc('r', out)
87a0: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
87b0: 21 69 73 70 72 69 6e 74 28 63 26 30 78 66 66 29  !isprint(c&0xff)
87c0: 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
87d0: 69 6e 74 66 28 6f 75 74 2c 20 22 5c 5c 25 30 33  intf(out, "\\%03
87e0: 6f 22 2c 20 63 26 30 78 66 66 29 3b 0a 20 20 20  o", c&0xff);.   
87f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 70   }else{.      fp
8800: 75 74 63 28 63 2c 20 6f 75 74 29 3b 0a 20 20 20  utc(c, out);.   
8810: 20 7d 0a 20 20 7d 0a 20 20 66 70 75 74 63 28 27   }.  }.  fputc('
8820: 22 27 2c 20 6f 75 74 29 3b 0a 7d 0a 0a 2f 2a 0a  "', out);.}../*.
8830: 2a 2a 20 4f 75 74 70 75 74 20 74 68 65 20 67 69  ** Output the gi
8840: 76 65 6e 20 73 74 72 69 6e 67 20 77 69 74 68 20  ven string with 
8850: 63 68 61 72 61 63 74 65 72 73 20 74 68 61 74 20  characters that 
8860: 61 72 65 20 73 70 65 63 69 61 6c 20 74 6f 0a 2a  are special to.*
8870: 2a 20 48 54 4d 4c 20 65 73 63 61 70 65 64 2e 0a  * HTML escaped..
8880: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6f  */.static void o
8890: 75 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e  utput_html_strin
88a0: 67 28 46 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e  g(FILE *out, con
88b0: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
88c0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  nt i;.  if( z==0
88d0: 20 29 20 7a 20 3d 20 22 22 3b 0a 20 20 77 68 69   ) z = "";.  whi
88e0: 6c 65 28 20 2a 7a 20 29 7b 0a 20 20 20 20 66 6f  le( *z ){.    fo
88f0: 72 28 69 3d 30 3b 20 20 20 7a 5b 69 5d 0a 20 20  r(i=0;   z[i].  
8900: 20 20 20 20 20 20 20 20 20 20 26 26 20 7a 5b 69            && z[i
8910: 5d 21 3d 27 3c 27 0a 20 20 20 20 20 20 20 20 20  ]!='<'.         
8920: 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 26 27 0a     && z[i]!='&'.
8930: 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20 7a              && z
8940: 5b 69 5d 21 3d 27 3e 27 0a 20 20 20 20 20 20 20  [i]!='>'.       
8950: 20 20 20 20 20 26 26 20 7a 5b 69 5d 21 3d 27 5c       && z[i]!='\
8960: 22 27 0a 20 20 20 20 20 20 20 20 20 20 20 20 26  "'.            &
8970: 26 20 7a 5b 69 5d 21 3d 27 5c 27 27 3b 0a 20 20  & z[i]!='\'';.  
8980: 20 20 20 20 20 20 69 2b 2b 29 7b 7d 0a 20 20 20        i++){}.   
8990: 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20   if( i>0 ){.    
89a0: 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75    utf8_printf(ou
89b0: 74 2c 22 25 2e 2a 73 22 2c 69 2c 7a 29 3b 0a 20  t,"%.*s",i,z);. 
89c0: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 5b 69     }.    if( z[i
89d0: 5d 3d 3d 27 3c 27 20 29 7b 0a 20 20 20 20 20 20  ]=='<' ){.      
89e0: 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22  raw_printf(out,"
89f0: 26 6c 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73  &lt;");.    }els
8a00: 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 26 27 20  e if( z[i]=='&' 
8a10: 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
8a20: 6e 74 66 28 6f 75 74 2c 22 26 61 6d 70 3b 22 29  ntf(out,"&amp;")
8a30: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
8a40: 7a 5b 69 5d 3d 3d 27 3e 27 20 29 7b 0a 20 20 20  z[i]=='>' ){.   
8a50: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75     raw_printf(ou
8a60: 74 2c 22 26 67 74 3b 22 29 3b 0a 20 20 20 20 7d  t,"&gt;");.    }
8a70: 65 6c 73 65 20 69 66 28 20 7a 5b 69 5d 3d 3d 27  else if( z[i]=='
8a80: 5c 22 27 20 29 7b 0a 20 20 20 20 20 20 72 61 77  \"' ){.      raw
8a90: 5f 70 72 69 6e 74 66 28 6f 75 74 2c 22 26 71 75  _printf(out,"&qu
8aa0: 6f 74 3b 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ot;");.    }else
8ab0: 20 69 66 28 20 7a 5b 69 5d 3d 3d 27 5c 27 27 20   if( z[i]=='\'' 
8ac0: 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
8ad0: 6e 74 66 28 6f 75 74 2c 22 26 23 33 39 3b 22 29  ntf(out,"&#39;")
8ae0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
8af0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8b00: 20 20 20 20 7a 20 2b 3d 20 69 20 2b 20 31 3b 0a      z += i + 1;.
8b10: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20    }.}../*.** If 
8b20: 61 20 66 69 65 6c 64 20 63 6f 6e 74 61 69 6e 73  a field contains
8b30: 20 61 6e 79 20 63 68 61 72 61 63 74 65 72 20 69   any character i
8b40: 64 65 6e 74 69 66 69 65 64 20 62 79 20 61 20 31  dentified by a 1
8b50: 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   in the followin
8b60: 67 0a 2a 2a 20 61 72 72 61 79 2c 20 74 68 65 6e  g.** array, then
8b70: 20 74 68 65 20 73 74 72 69 6e 67 20 6d 75 73 74   the string must
8b80: 20 62 65 20 71 75 6f 74 65 64 20 66 6f 72 20 43   be quoted for C
8b90: 53 56 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f  SV..*/.static co
8ba0: 6e 73 74 20 63 68 61 72 20 6e 65 65 64 43 73 76  nst char needCsv
8bb0: 51 75 6f 74 65 5b 5d 20 3d 20 7b 0a 20 20 31 2c  Quote[] = {.  1,
8bc0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
8bd0: 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c  1, 1,   1, 1, 1,
8be0: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a   1, 1, 1, 1, 1,.
8bf0: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
8c00: 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31   1, 1, 1,   1, 1
8c10: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
8c20: 20 31 2c 0a 20 20 31 2c 20 30 2c 20 31 2c 20 30   1,.  1, 0, 1, 0
8c30: 2c 20 30 2c 20 30 2c 20 30 2c 20 31 2c 20 20 20  , 0, 0, 0, 1,   
8c40: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
8c50: 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20  , 0, 0,.  0, 0, 
8c60: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
8c70: 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,   0, 0, 0, 0, 
8c80: 30 2c 20 30 2c 20 30 2c 20 30 2c 0a 20 20 30 2c  0, 0, 0, 0,.  0,
8c90: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20   0, 0, 0, 0, 0, 
8ca0: 30 2c 20 30 2c 20 20 20 30 2c 20 30 2c 20 30 2c  0, 0,   0, 0, 0,
8cb0: 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 0a   0, 0, 0, 0, 0,.
8cc0: 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c    0, 0, 0, 0, 0,
8cd0: 20 30 2c 20 30 2c 20 30 2c 20 20 20 30 2c 20 30   0, 0, 0,   0, 0
8ce0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c  , 0, 0, 0, 0, 0,
8cf0: 20 30 2c 0a 20 20 30 2c 20 30 2c 20 30 2c 20 30   0,.  0, 0, 0, 0
8d00: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 20 20  , 0, 0, 0, 0,   
8d10: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
8d20: 2c 20 30 2c 20 30 2c 0a 20 20 30 2c 20 30 2c 20  , 0, 0,.  0, 0, 
8d30: 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30  0, 0, 0, 0, 0, 0
8d40: 2c 20 20 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20  ,   0, 0, 0, 0, 
8d50: 30 2c 20 30 2c 20 30 2c 20 31 2c 0a 20 20 31 2c  0, 0, 0, 1,.  1,
8d60: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
8d70: 31 2c 20 31 2c 20 20 20 31 2c 20 31 2c 20 31 2c  1, 1,   1, 1, 1,
8d80: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 0a   1, 1, 1, 1, 1,.
8d90: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
8da0: 20 31 2c 20 31 2c 20 31 2c 20 20 20 31 2c 20 31   1, 1, 1,   1, 1
8db0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c  , 1, 1, 1, 1, 1,
8dc0: 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,.  1, 1, 1, 1
8dd0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 20  , 1, 1, 1, 1,   
8de0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
8df0: 2c 20 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20  , 1, 1,.  1, 1, 
8e00: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
8e10: 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,   1, 1, 1, 1, 
8e20: 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 20 20 31 2c  1, 1, 1, 1,.  1,
8e30: 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20   1, 1, 1, 1, 1, 
8e40: 31 2c 20 31 2c 20 20 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 31 2c 20 31 2c 0a   1, 1, 1, 1, 1,.
8e60: 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c    1, 1, 1, 1, 1,
8e70: 20 31 2c 20 31 2c 20 31 2c 20 20 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 31 2c  , 1, 1, 1, 1, 1,
8e90: 20 31 2c 0a 20 20 31 2c 20 31 2c 20 31 2c 20 31   1,.  1, 1, 1, 1
8ea0: 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 20 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 31 2c 20 31 2c 0a 20 20 31 2c 20 31 2c 20  , 1, 1,.  1, 1, 
8ed0: 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20 31  1, 1, 1, 1, 1, 1
8ee0: 2c 20 20 20 31 2c 20 31 2c 20 31 2c 20 31 2c 20  ,   1, 1, 1, 1, 
8ef0: 31 2c 20 31 2c 20 31 2c 20 31 2c 0a 7d 3b 0a 0a  1, 1, 1, 1,.};..
8f00: 2f 2a 0a 2a 2a 20 4f 75 74 70 75 74 20 61 20 73  /*.** Output a s
8f10: 69 6e 67 6c 65 20 74 65 72 6d 20 6f 66 20 43 53  ingle term of CS
8f20: 56 2e 20 20 41 63 74 75 61 6c 6c 79 2c 20 70 2d  V.  Actually, p-
8f30: 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 20 69 73  >colSeparator is
8f40: 20 75 73 65 64 20 66 6f 72 0a 2a 2a 20 74 68 65   used for.** the
8f50: 20 73 65 70 61 72 61 74 6f 72 2c 20 77 68 69 63   separator, whic
8f60: 68 20 6d 61 79 20 6f 72 20 6d 61 79 20 6e 6f 74  h may or may not
8f70: 20 62 65 20 61 20 63 6f 6d 6d 61 2e 20 20 70 2d   be a comma.  p-
8f80: 3e 6e 75 6c 6c 56 61 6c 75 65 20 69 73 0a 2a 2a  >nullValue is.**
8f90: 20 74 68 65 20 6e 75 6c 6c 20 76 61 6c 75 65 2e   the null value.
8fa0: 20 20 53 74 72 69 6e 67 73 20 61 72 65 20 71 75    Strings are qu
8fb0: 6f 74 65 64 20 69 66 20 6e 65 63 65 73 73 61 72  oted if necessar
8fc0: 79 2e 20 20 54 68 65 20 73 65 70 61 72 61 74 6f  y.  The separato
8fd0: 72 0a 2a 2a 20 69 73 20 6f 6e 6c 79 20 69 73 73  r.** is only iss
8fe0: 75 65 64 20 69 66 20 62 53 65 70 20 69 73 20 74  ued if bSep is t
8ff0: 72 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  rue..*/.static v
9000: 6f 69 64 20 6f 75 74 70 75 74 5f 63 73 76 28 53  oid output_csv(S
9010: 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f  hellState *p, co
9020: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
9030: 20 62 53 65 70 29 7b 0a 20 20 46 49 4c 45 20 2a   bSep){.  FILE *
9040: 6f 75 74 20 3d 20 70 2d 3e 6f 75 74 3b 0a 20 20  out = p->out;.  
9050: 69 66 28 20 7a 3d 3d 30 20 29 7b 0a 20 20 20 20  if( z==0 ){.    
9060: 75 74 66 38 5f 70 72 69 6e 74 66 28 6f 75 74 2c  utf8_printf(out,
9070: 22 25 73 22 2c 70 2d 3e 6e 75 6c 6c 56 61 6c 75  "%s",p->nullValu
9080: 65 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  e);.  }else{.   
9090: 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e 74 20   int i;.    int 
90a0: 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28  nSep = strlen30(
90b0: 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
90c0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 7a  ;.    for(i=0; z
90d0: 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  [i]; i++){.     
90e0: 20 69 66 28 20 6e 65 65 64 43 73 76 51 75 6f 74   if( needCsvQuot
90f0: 65 5b 28 28 75 6e 73 69 67 6e 65 64 20 63 68 61  e[((unsigned cha
9100: 72 2a 29 7a 29 5b 69 5d 5d 0a 20 20 20 20 20 20  r*)z)[i]].      
9110: 20 20 20 7c 7c 20 28 7a 5b 69 5d 3d 3d 70 2d 3e     || (z[i]==p->
9120: 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b 30 5d 20  colSeparator[0] 
9130: 26 26 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  &&.             
9140: 28 6e 53 65 70 3d 3d 31 20 7c 7c 20 6d 65 6d 63  (nSep==1 || memc
9150: 6d 70 28 7a 2c 20 70 2d 3e 63 6f 6c 53 65 70 61  mp(z, p->colSepa
9160: 72 61 74 6f 72 2c 20 6e 53 65 70 29 3d 3d 30 29  rator, nSep)==0)
9170: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d  ) ){.        i =
9180: 20 30 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61   0;.        brea
9190: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  k;.      }.    }
91a0: 0a 20 20 20 20 69 66 28 20 69 3d 3d 30 20 29 7b  .    if( i==0 ){
91b0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 51 75  .      char *zQu
91c0: 6f 74 65 64 20 3d 20 73 71 6c 69 74 65 33 5f 6d  oted = sqlite3_m
91d0: 70 72 69 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c  printf("\"%w\"",
91e0: 20 7a 29 3b 0a 20 20 20 20 20 20 75 74 66 38 5f   z);.      utf8_
91f0: 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22  printf(out, "%s"
9200: 2c 20 7a 51 75 6f 74 65 64 29 3b 0a 20 20 20 20  , zQuoted);.    
9210: 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
9220: 51 75 6f 74 65 64 29 3b 0a 20 20 20 20 7d 65 6c  Quoted);.    }el
9230: 73 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70  se{.      utf8_p
9240: 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 22 2c  rintf(out, "%s",
9250: 20 7a 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20   z);.    }.  }. 
9260: 20 69 66 28 20 62 53 65 70 20 29 7b 0a 20 20 20   if( bSep ){.   
9270: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
9280: 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f  out, "%s", p->co
9290: 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 7d  lSeparator);.  }
92a0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
92b0: 6f 75 74 69 6e 65 20 72 75 6e 73 20 77 68 65 6e  outine runs when
92c0: 20 74 68 65 20 75 73 65 72 20 70 72 65 73 73 65   the user presse
92d0: 73 20 43 74 72 6c 2d 43 0a 2a 2f 0a 73 74 61 74  s Ctrl-C.*/.stat
92e0: 69 63 20 76 6f 69 64 20 69 6e 74 65 72 72 75 70  ic void interrup
92f0: 74 5f 68 61 6e 64 6c 65 72 28 69 6e 74 20 4e 6f  t_handler(int No
9300: 74 55 73 65 64 29 7b 0a 20 20 55 4e 55 53 45 44  tUsed){.  UNUSED
9310: 5f 50 41 52 41 4d 45 54 45 52 28 4e 6f 74 55 73  _PARAMETER(NotUs
9320: 65 64 29 3b 0a 20 20 73 65 65 6e 49 6e 74 65 72  ed);.  seenInter
9330: 72 75 70 74 2b 2b 3b 0a 20 20 69 66 28 20 73 65  rupt++;.  if( se
9340: 65 6e 49 6e 74 65 72 72 75 70 74 3e 32 20 29 20  enInterrupt>2 ) 
9350: 65 78 69 74 28 31 29 3b 0a 20 20 69 66 28 20 67  exit(1);.  if( g
9360: 6c 6f 62 61 6c 44 62 20 29 20 73 71 6c 69 74 65  lobalDb ) sqlite
9370: 33 5f 69 6e 74 65 72 72 75 70 74 28 67 6c 6f 62  3_interrupt(glob
9380: 61 6c 44 62 29 3b 0a 7d 0a 0a 23 69 66 20 28 64  alDb);.}..#if (d
9390: 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c  efined(_WIN32) |
93a0: 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29  | defined(WIN32)
93b0: 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f 57  ) && !defined(_W
93c0: 49 4e 33 32 5f 57 43 45 29 0a 2f 2a 0a 2a 2a 20  IN32_WCE)./*.** 
93d0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 75 6e  This routine run
93e0: 73 20 66 6f 72 20 63 6f 6e 73 6f 6c 65 20 65 76  s for console ev
93f0: 65 6e 74 73 20 28 65 2e 67 2e 20 43 74 72 6c 2d  ents (e.g. Ctrl-
9400: 43 29 20 6f 6e 20 57 69 6e 33 32 0a 2a 2f 0a 73  C) on Win32.*/.s
9410: 74 61 74 69 63 20 42 4f 4f 4c 20 57 49 4e 41 50  tatic BOOL WINAP
9420: 49 20 43 6f 6e 73 6f 6c 65 43 74 72 6c 48 61 6e  I ConsoleCtrlHan
9430: 64 6c 65 72 28 0a 20 20 44 57 4f 52 44 20 64 77  dler(.  DWORD dw
9440: 43 74 72 6c 54 79 70 65 20 2f 2a 20 4f 6e 65 20  CtrlType /* One 
9450: 6f 66 20 74 68 65 20 43 54 52 4c 5f 2a 5f 45 56  of the CTRL_*_EV
9460: 45 4e 54 20 63 6f 6e 73 74 61 6e 74 73 20 2a 2f  ENT constants */
9470: 0a 29 7b 0a 20 20 69 66 28 20 64 77 43 74 72 6c  .){.  if( dwCtrl
9480: 54 79 70 65 3d 3d 43 54 52 4c 5f 43 5f 45 56 45  Type==CTRL_C_EVE
9490: 4e 54 20 29 7b 0a 20 20 20 20 69 6e 74 65 72 72  NT ){.    interr
94a0: 75 70 74 5f 68 61 6e 64 6c 65 72 28 30 29 3b 0a  upt_handler(0);.
94b0: 20 20 20 20 72 65 74 75 72 6e 20 54 52 55 45 3b      return TRUE;
94c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 46 41  .  }.  return FA
94d0: 4c 53 45 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 23  LSE;.}.#endif..#
94e0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
94f0: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
9500: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 74 68 65 20  ./*.** When the 
9510: 22 2e 61 75 74 68 20 4f 4e 22 20 69 73 20 73 65  ".auth ON" is se
9520: 74 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  t, the following
9530: 20 61 75 74 68 6f 72 69 7a 65 72 20 63 61 6c 6c   authorizer call
9540: 62 61 63 6b 20 69 73 0a 2a 2a 20 69 6e 76 6f 6b  back is.** invok
9550: 65 64 2e 20 20 49 74 20 61 6c 77 61 79 73 20 72  ed.  It always r
9560: 65 74 75 72 6e 73 20 53 51 4c 49 54 45 5f 4f 4b  eturns SQLITE_OK
9570: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9580: 73 68 65 6c 6c 41 75 74 68 28 0a 20 20 76 6f 69  shellAuth(.  voi
9590: 64 20 2a 70 43 6c 69 65 6e 74 44 61 74 61 2c 0a  d *pClientData,.
95a0: 20 20 69 6e 74 20 6f 70 2c 0a 20 20 63 6f 6e 73    int op,.  cons
95b0: 74 20 63 68 61 72 20 2a 7a 41 31 2c 0a 20 20 63  t char *zA1,.  c
95c0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 32 2c 0a  onst char *zA2,.
95d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41    const char *zA
95e0: 33 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  3,.  const char 
95f0: 2a 7a 41 34 0a 29 7b 0a 20 20 53 68 65 6c 6c 53  *zA4.){.  ShellS
9600: 74 61 74 65 20 2a 70 20 3d 20 28 53 68 65 6c 6c  tate *p = (Shell
9610: 53 74 61 74 65 2a 29 70 43 6c 69 65 6e 74 44 61  State*)pClientDa
9620: 74 61 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e  ta;.  static con
9630: 73 74 20 63 68 61 72 20 2a 61 7a 41 63 74 69 6f  st char *azActio
9640: 6e 5b 5d 20 3d 20 7b 20 30 2c 0a 20 20 20 20 20  n[] = { 0,.     
9650: 22 43 52 45 41 54 45 5f 49 4e 44 45 58 22 2c 20  "CREATE_INDEX", 
9660: 20 20 20 20 20 20 20 20 22 43 52 45 41 54 45 5f          "CREATE_
9670: 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20 20  TABLE",         
9680: 22 43 52 45 41 54 45 5f 54 45 4d 50 5f 49 4e 44  "CREATE_TEMP_IND
9690: 45 58 22 2c 0a 20 20 20 20 20 22 43 52 45 41 54  EX",.     "CREAT
96a0: 45 5f 54 45 4d 50 5f 54 41 42 4c 45 22 2c 20 20  E_TEMP_TABLE",  
96b0: 20 20 22 43 52 45 41 54 45 5f 54 45 4d 50 5f 54    "CREATE_TEMP_T
96c0: 52 49 47 47 45 52 22 2c 20 20 22 43 52 45 41 54  RIGGER",  "CREAT
96d0: 45 5f 54 45 4d 50 5f 56 49 45 57 22 2c 0a 20 20  E_TEMP_VIEW",.  
96e0: 20 20 20 22 43 52 45 41 54 45 5f 54 52 49 47 47     "CREATE_TRIGG
96f0: 45 52 22 2c 20 20 20 20 20 20 20 22 43 52 45 41  ER",       "CREA
9700: 54 45 5f 56 49 45 57 22 2c 20 20 20 20 20 20 20  TE_VIEW",       
9710: 20 20 20 22 44 45 4c 45 54 45 22 2c 0a 20 20 20     "DELETE",.   
9720: 20 20 22 44 52 4f 50 5f 49 4e 44 45 58 22 2c 20    "DROP_INDEX", 
9730: 20 20 20 20 20 20 20 20 20 20 22 44 52 4f 50 5f            "DROP_
9740: 54 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20 20  TABLE",         
9750: 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 49 4e 44    "DROP_TEMP_IND
9760: 45 58 22 2c 0a 20 20 20 20 20 22 44 52 4f 50 5f  EX",.     "DROP_
9770: 54 45 4d 50 5f 54 41 42 4c 45 22 2c 20 20 20 20  TEMP_TABLE",    
9780: 20 20 22 44 52 4f 50 5f 54 45 4d 50 5f 54 52 49    "DROP_TEMP_TRI
9790: 47 47 45 52 22 2c 20 20 20 20 22 44 52 4f 50 5f  GGER",    "DROP_
97a0: 54 45 4d 50 5f 56 49 45 57 22 2c 0a 20 20 20 20  TEMP_VIEW",.    
97b0: 20 22 44 52 4f 50 5f 54 52 49 47 47 45 52 22 2c   "DROP_TRIGGER",
97c0: 20 20 20 20 20 20 20 20 20 22 44 52 4f 50 5f 56           "DROP_V
97d0: 49 45 57 22 2c 20 20 20 20 20 20 20 20 20 20 20  IEW",           
97e0: 20 22 49 4e 53 45 52 54 22 2c 0a 20 20 20 20 20   "INSERT",.     
97f0: 22 50 52 41 47 4d 41 22 2c 20 20 20 20 20 20 20  "PRAGMA",       
9800: 20 20 20 20 20 20 20 20 22 52 45 41 44 22 2c 20          "READ", 
9810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9820: 22 53 45 4c 45 43 54 22 2c 0a 20 20 20 20 20 22  "SELECT",.     "
9830: 54 52 41 4e 53 41 43 54 49 4f 4e 22 2c 20 20 20  TRANSACTION",   
9840: 20 20 20 20 20 20 20 22 55 50 44 41 54 45 22 2c         "UPDATE",
9850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
9860: 41 54 54 41 43 48 22 2c 0a 20 20 20 20 20 22 44  ATTACH",.     "D
9870: 45 54 41 43 48 22 2c 20 20 20 20 20 20 20 20 20  ETACH",         
9880: 20 20 20 20 20 20 22 41 4c 54 45 52 5f 54 41 42        "ALTER_TAB
9890: 4c 45 22 2c 20 20 20 20 20 20 20 20 20 20 22 52  LE",          "R
98a0: 45 49 4e 44 45 58 22 2c 0a 20 20 20 20 20 22 41  EINDEX",.     "A
98b0: 4e 41 4c 59 5a 45 22 2c 20 20 20 20 20 20 20 20  NALYZE",        
98c0: 20 20 20 20 20 20 22 43 52 45 41 54 45 5f 56 54        "CREATE_VT
98d0: 41 42 4c 45 22 2c 20 20 20 20 20 20 20 20 22 44  ABLE",        "D
98e0: 52 4f 50 5f 56 54 41 42 4c 45 22 2c 0a 20 20 20  ROP_VTABLE",.   
98f0: 20 20 22 46 55 4e 43 54 49 4f 4e 22 2c 20 20 20    "FUNCTION",   
9900: 20 20 20 20 20 20 20 20 20 20 22 53 41 56 45 50            "SAVEP
9910: 4f 49 4e 54 22 2c 20 20 20 20 20 20 20 20 20 20  OINT",          
9920: 20 20 22 52 45 43 55 52 53 49 56 45 22 0a 20 20    "RECURSIVE".  
9930: 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 63 6f  };.  int i;.  co
9940: 6e 73 74 20 63 68 61 72 20 2a 61 7a 5b 34 5d 3b  nst char *az[4];
9950: 0a 20 20 61 7a 5b 30 5d 20 3d 20 7a 41 31 3b 0a  .  az[0] = zA1;.
9960: 20 20 61 7a 5b 31 5d 20 3d 20 7a 41 32 3b 0a 20    az[1] = zA2;. 
9970: 20 61 7a 5b 32 5d 20 3d 20 7a 41 33 3b 0a 20 20   az[2] = zA3;.  
9980: 61 7a 5b 33 5d 20 3d 20 7a 41 34 3b 0a 20 20 75  az[3] = zA4;.  u
9990: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
99a0: 74 2c 20 22 61 75 74 68 6f 72 69 7a 65 72 3a 20  t, "authorizer: 
99b0: 25 73 22 2c 20 61 7a 41 63 74 69 6f 6e 5b 6f 70  %s", azAction[op
99c0: 5d 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69  ]);.  for(i=0; i
99d0: 3c 34 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 72 61  <4; i++){.    ra
99e0: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
99f0: 20 22 20 22 29 3b 0a 20 20 20 20 69 66 28 20 61   " ");.    if( a
9a00: 7a 5b 69 5d 20 29 7b 0a 20 20 20 20 20 20 6f 75  z[i] ){.      ou
9a10: 74 70 75 74 5f 63 5f 73 74 72 69 6e 67 28 70 2d  tput_c_string(p-
9a20: 3e 6f 75 74 2c 20 61 7a 5b 69 5d 29 3b 0a 20 20  >out, az[i]);.  
9a30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
9a40: 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
9a50: 2c 20 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 7d  , "NULL");.    }
9a60: 0a 20 20 7d 0a 20 20 72 61 77 5f 70 72 69 6e 74  .  }.  raw_print
9a70: 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b  f(p->out, "\n");
9a80: 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  .  return SQLITE
9a90: 5f 4f 4b 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  _OK;.}.#endif../
9aa0: 2a 0a 2a 2a 20 50 72 69 6e 74 20 61 20 73 63 68  *.** Print a sch
9ab0: 65 6d 61 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ema statement.  
9ac0: 50 61 72 74 20 6f 66 20 4d 4f 44 45 5f 53 65 6d  Part of MODE_Sem
9ad0: 69 20 61 6e 64 20 4d 4f 44 45 5f 50 72 65 74 74  i and MODE_Prett
9ae0: 79 20 6f 75 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20  y output..**.** 
9af0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 6f 6e  This routine con
9b00: 76 65 72 74 73 20 73 6f 6d 65 20 43 52 45 41 54  verts some CREAT
9b10: 45 20 54 41 42 4c 45 20 73 74 61 74 65 6d 65 6e  E TABLE statemen
9b20: 74 73 20 66 6f 72 20 73 68 61 64 6f 77 20 74 61  ts for shadow ta
9b30: 62 6c 65 73 0a 2a 2a 20 69 6e 20 46 54 53 33 2f  bles.** in FTS3/
9b40: 34 2f 35 20 69 6e 74 6f 20 43 52 45 41 54 45 20  4/5 into CREATE 
9b50: 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49  TABLE IF NOT EXI
9b60: 53 54 53 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  STS statements..
9b70: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  */.static void p
9b80: 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28 46  rintSchemaLine(F
9b90: 49 4c 45 20 2a 6f 75 74 2c 20 63 6f 6e 73 74 20  ILE *out, const 
9ba0: 63 68 61 72 20 2a 7a 2c 20 63 6f 6e 73 74 20 63  char *z, const c
9bb0: 68 61 72 20 2a 7a 54 61 69 6c 29 7b 0a 20 20 69  har *zTail){.  i
9bc0: 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c  f( sqlite3_strgl
9bd0: 6f 62 28 22 43 52 45 41 54 45 20 54 41 42 4c 45  ob("CREATE TABLE
9be0: 20 5b 27 5c 22 5d 2a 22 2c 20 7a 29 3d 3d 30 20   ['\"]*", z)==0 
9bf0: 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
9c00: 74 66 28 6f 75 74 2c 20 22 43 52 45 41 54 45 20  tf(out, "CREATE 
9c10: 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58 49  TABLE IF NOT EXI
9c20: 53 54 53 20 25 73 25 73 22 2c 20 7a 2b 31 33 2c  STS %s%s", z+13,
9c30: 20 7a 54 61 69 6c 29 3b 0a 20 20 7d 65 6c 73 65   zTail);.  }else
9c40: 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
9c50: 66 28 6f 75 74 2c 20 22 25 73 25 73 22 2c 20 7a  f(out, "%s%s", z
9c60: 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7d 0a 7d 0a  , zTail);.  }.}.
9c70: 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 69 6e  static void prin
9c80: 74 53 63 68 65 6d 61 4c 69 6e 65 4e 28 46 49 4c  tSchemaLineN(FIL
9c90: 45 20 2a 6f 75 74 2c 20 63 68 61 72 20 2a 7a 2c  E *out, char *z,
9ca0: 20 69 6e 74 20 6e 2c 20 63 6f 6e 73 74 20 63 68   int n, const ch
9cb0: 61 72 20 2a 7a 54 61 69 6c 29 7b 0a 20 20 63 68  ar *zTail){.  ch
9cc0: 61 72 20 63 20 3d 20 7a 5b 6e 5d 3b 0a 20 20 7a  ar c = z[n];.  z
9cd0: 5b 6e 5d 20 3d 20 30 3b 0a 20 20 70 72 69 6e 74  [n] = 0;.  print
9ce0: 53 63 68 65 6d 61 4c 69 6e 65 28 6f 75 74 2c 20  SchemaLine(out, 
9cf0: 7a 2c 20 7a 54 61 69 6c 29 3b 0a 20 20 7a 5b 6e  z, zTail);.  z[n
9d00: 5d 20 3d 20 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ] = c;.}../*.** 
9d10: 54 68 69 73 20 69 73 20 74 68 65 20 63 61 6c 6c  This is the call
9d20: 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 74 68 61  back routine tha
9d30: 74 20 74 68 65 20 73 68 65 6c 6c 0a 2a 2a 20 69  t the shell.** i
9d40: 6e 76 6f 6b 65 73 20 66 6f 72 20 65 61 63 68 20  nvokes for each 
9d50: 72 6f 77 20 6f 66 20 61 20 71 75 65 72 79 20 72  row of a query r
9d60: 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  esult..*/.static
9d70: 20 69 6e 74 20 73 68 65 6c 6c 5f 63 61 6c 6c 62   int shell_callb
9d80: 61 63 6b 28 0a 20 20 76 6f 69 64 20 2a 70 41 72  ack(.  void *pAr
9d90: 67 2c 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20  g,.  int nArg,  
9da0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
9db0: 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75 6d 6e  of result column
9dc0: 73 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a  s */.  char **az
9dd0: 41 72 67 2c 20 20 20 20 2f 2a 20 54 65 78 74 20  Arg,    /* Text 
9de0: 6f 66 20 65 61 63 68 20 72 65 73 75 6c 74 20 63  of each result c
9df0: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 63 68 61 72 20  olumn */.  char 
9e00: 2a 2a 61 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20 43  **azCol,    /* C
9e10: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
9e20: 20 69 6e 74 20 2a 61 69 54 79 70 65 20 20 20 20   int *aiType    
9e30: 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 74 79 70 65    /* Column type
9e40: 73 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  s */.){.  int i;
9e50: 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
9e60: 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 2a 29   = (ShellState*)
9e70: 70 41 72 67 3b 0a 0a 20 20 69 66 28 20 61 7a 41  pArg;..  if( azA
9e80: 72 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  rg==0 ) return 0
9e90: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 63  ;.  switch( p->c
9ea0: 4d 6f 64 65 20 29 7b 0a 20 20 20 20 63 61 73 65  Mode ){.    case
9eb0: 20 4d 4f 44 45 5f 4c 69 6e 65 3a 20 7b 0a 20 20   MODE_Line: {.  
9ec0: 20 20 20 20 69 6e 74 20 77 20 3d 20 35 3b 0a 20      int w = 5;. 
9ed0: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d       if( azArg==
9ee0: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
9ef0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
9f00: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
9f10: 69 6e 74 20 6c 65 6e 20 3d 20 73 74 72 6c 65 6e  int len = strlen
9f20: 33 30 28 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a  30(azCol[i] ? az
9f30: 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a 20 20  Col[i] : "");.  
9f40: 20 20 20 20 20 20 69 66 28 20 6c 65 6e 3e 77 20        if( len>w 
9f50: 29 20 77 20 3d 20 6c 65 6e 3b 0a 20 20 20 20 20  ) w = len;.     
9f60: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   }.      if( p->
9f70: 63 6e 74 2b 2b 3e 30 20 29 20 75 74 66 38 5f 70  cnt++>0 ) utf8_p
9f80: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
9f90: 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  s", p->rowSepara
9fa0: 74 6f 72 29 3b 0a 20 20 20 20 20 20 66 6f 72 28  tor);.      for(
9fb0: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
9fc0: 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
9fd0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 25  printf(p->out,"%
9fe0: 2a 73 20 3d 20 25 73 25 73 22 2c 20 77 2c 20 61  *s = %s%s", w, a
9ff0: 7a 43 6f 6c 5b 69 5d 2c 0a 20 20 20 20 20 20 20  zCol[i],.       
a000: 20 20 20 20 20 20 20 20 20 61 7a 41 72 67 5b 69           azArg[i
a010: 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70  ] ? azArg[i] : p
a020: 2d 3e 6e 75 6c 6c 56 61 6c 75 65 2c 20 70 2d 3e  ->nullValue, p->
a030: 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  rowSeparator);. 
a040: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
a050: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
a060: 73 65 20 4d 4f 44 45 5f 45 78 70 6c 61 69 6e 3a  se MODE_Explain:
a070: 0a 20 20 20 20 63 61 73 65 20 4d 4f 44 45 5f 43  .    case MODE_C
a080: 6f 6c 75 6d 6e 3a 20 7b 0a 20 20 20 20 20 20 73  olumn: {.      s
a090: 74 61 74 69 63 20 63 6f 6e 73 74 20 69 6e 74 20  tatic const int 
a0a0: 61 45 78 70 6c 61 69 6e 57 69 64 74 68 73 5b 5d  aExplainWidths[]
a0b0: 20 3d 20 7b 34 2c 20 31 33 2c 20 34 2c 20 34 2c   = {4, 13, 4, 4,
a0c0: 20 34 2c 20 31 33 2c 20 32 2c 20 31 33 7d 3b 0a   4, 13, 2, 13};.
a0d0: 20 20 20 20 20 20 63 6f 6e 73 74 20 69 6e 74 20        const int 
a0e0: 2a 63 6f 6c 57 69 64 74 68 3b 0a 20 20 20 20 20  *colWidth;.     
a0f0: 20 69 6e 74 20 73 68 6f 77 48 64 72 3b 0a 20 20   int showHdr;.  
a100: 20 20 20 20 63 68 61 72 20 2a 72 6f 77 53 65 70      char *rowSep
a110: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63  ;.      if( p->c
a120: 4d 6f 64 65 3d 3d 4d 4f 44 45 5f 43 6f 6c 75 6d  Mode==MODE_Colum
a130: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6c  n ){.        col
a140: 57 69 64 74 68 20 3d 20 70 2d 3e 63 6f 6c 57 69  Width = p->colWi
a150: 64 74 68 3b 0a 20 20 20 20 20 20 20 20 73 68 6f  dth;.        sho
a160: 77 48 64 72 20 3d 20 70 2d 3e 73 68 6f 77 48 65  wHdr = p->showHe
a170: 61 64 65 72 3b 0a 20 20 20 20 20 20 20 20 72 6f  ader;.        ro
a180: 77 53 65 70 20 3d 20 70 2d 3e 72 6f 77 53 65 70  wSep = p->rowSep
a190: 61 72 61 74 6f 72 3b 0a 20 20 20 20 20 20 7d 65  arator;.      }e
a1a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 6f 6c  lse{.        col
a1b0: 57 69 64 74 68 20 3d 20 61 45 78 70 6c 61 69 6e  Width = aExplain
a1c0: 57 69 64 74 68 73 3b 0a 20 20 20 20 20 20 20 20  Widths;.        
a1d0: 73 68 6f 77 48 64 72 20 3d 20 31 3b 0a 20 20 20  showHdr = 1;.   
a1e0: 20 20 20 20 20 72 6f 77 53 65 70 20 3d 20 53 45       rowSep = SE
a1f0: 50 5f 52 6f 77 3b 0a 20 20 20 20 20 20 7d 0a 20  P_Row;.      }. 
a200: 20 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 2b       if( p->cnt+
a210: 2b 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  +==0 ){.        
a220: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
a230: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
a240: 20 69 6e 74 20 77 2c 20 6e 3b 0a 20 20 20 20 20   int w, n;.     
a250: 20 20 20 20 20 69 66 28 20 69 3c 41 72 72 61 79       if( i<Array
a260: 53 69 7a 65 28 70 2d 3e 63 6f 6c 57 69 64 74 68  Size(p->colWidth
a270: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
a280: 20 77 20 3d 20 63 6f 6c 57 69 64 74 68 5b 69 5d   w = colWidth[i]
a290: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
a2a0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 77  e{.            w
a2b0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
a2c0: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
a2d0: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  w==0 ){.        
a2e0: 20 20 20 20 77 20 3d 20 73 74 72 6c 65 6e 43 68      w = strlenCh
a2f0: 61 72 28 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a  ar(azCol[i] ? az
a300: 43 6f 6c 5b 69 5d 20 3a 20 22 22 29 3b 0a 20 20  Col[i] : "");.  
a310: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 77 3c            if( w<
a320: 31 30 20 29 20 77 20 3d 20 31 30 3b 0a 20 20 20  10 ) w = 10;.   
a330: 20 20 20 20 20 20 20 20 20 6e 20 3d 20 73 74 72           n = str
a340: 6c 65 6e 43 68 61 72 28 61 7a 41 72 67 20 26 26  lenChar(azArg &&
a350: 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72   azArg[i] ? azAr
a360: 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61  g[i] : p->nullVa
a370: 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  lue);.          
a380: 20 20 69 66 28 20 77 3c 6e 20 29 20 77 20 3d 20    if( w<n ) w = 
a390: 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  n;.          }. 
a3a0: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 41           if( i<A
a3b0: 72 72 61 79 53 69 7a 65 28 70 2d 3e 61 63 74 75  rraySize(p->actu
a3c0: 61 6c 57 69 64 74 68 29 20 29 7b 0a 20 20 20 20  alWidth) ){.    
a3d0: 20 20 20 20 20 20 20 20 70 2d 3e 61 63 74 75 61          p->actua
a3e0: 6c 57 69 64 74 68 5b 69 5d 20 3d 20 77 3b 0a 20  lWidth[i] = w;. 
a3f0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
a400: 20 20 20 20 20 69 66 28 20 73 68 6f 77 48 64 72       if( showHdr
a410: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
a420: 75 74 66 38 5f 77 69 64 74 68 5f 70 72 69 6e 74  utf8_width_print
a430: 28 70 2d 3e 6f 75 74 2c 20 77 2c 20 61 7a 43 6f  (p->out, w, azCo
a440: 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20  l[i]);.         
a450: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
a460: 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 69 3d 3d  ->out, "%s", i==
a470: 6e 41 72 67 2d 31 20 3f 20 72 6f 77 53 65 70 20  nArg-1 ? rowSep 
a480: 3a 20 22 20 20 22 29 3b 0a 20 20 20 20 20 20 20  : "  ");.       
a490: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
a4a0: 20 20 20 20 20 20 20 69 66 28 20 73 68 6f 77 48         if( showH
a4b0: 64 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  dr ){.          
a4c0: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b  for(i=0; i<nArg;
a4d0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
a4e0: 20 20 20 69 6e 74 20 77 3b 0a 20 20 20 20 20 20     int w;.      
a4f0: 20 20 20 20 20 20 69 66 28 20 69 3c 41 72 72 61        if( i<Arra
a500: 79 53 69 7a 65 28 70 2d 3e 61 63 74 75 61 6c 57  ySize(p->actualW
a510: 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20 20 20  idth) ){.       
a520: 20 20 20 20 20 20 20 20 77 20 3d 20 70 2d 3e 61          w = p->a
a530: 63 74 75 61 6c 57 69 64 74 68 5b 69 5d 3b 0a 20  ctualWidth[i];. 
a540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
a550: 28 20 77 3c 30 20 29 20 77 20 3d 20 2d 77 3b 0a  ( w<0 ) w = -w;.
a560: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
a570: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
a580: 20 20 77 20 3d 20 31 30 3b 0a 20 20 20 20 20 20    w = 10;.      
a590: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a5a0: 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
a5b0: 70 2d 3e 6f 75 74 2c 22 25 2d 2a 2e 2a 73 25 73  p->out,"%-*.*s%s
a5c0: 22 2c 77 2c 77 2c 0a 20 20 20 20 20 20 20 20 20  ",w,w,.         
a5d0: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 2d            "-----
a5e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a5f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a610: 2d 2d 2d 2d 2d 22 0a 20 20 20 20 20 20 20 20 20  -----".         
a620: 20 20 20 20 20 20 20 20 20 20 22 2d 2d 2d 2d 2d            "-----
a630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
a660: 2d 2d 2d 2d 2d 22 2c 0a 20 20 20 20 20 20 20 20  -----",.        
a670: 20 20 20 20 20 20 20 20 20 20 20 20 69 3d 3d 6e              i==n
a680: 41 72 67 2d 31 20 3f 20 72 6f 77 53 65 70 20 3a  Arg-1 ? rowSep :
a690: 20 22 20 20 22 29 3b 0a 20 20 20 20 20 20 20 20   "  ");.        
a6a0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
a6b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
a6c0: 61 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b  azArg==0 ) break
a6d0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
a6e0: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
a6f0: 20 20 20 20 20 20 20 69 6e 74 20 77 3b 0a 20 20         int w;.  
a700: 20 20 20 20 20 20 69 66 28 20 69 3c 41 72 72 61        if( i<Arra
a710: 79 53 69 7a 65 28 70 2d 3e 61 63 74 75 61 6c 57  ySize(p->actualW
a720: 69 64 74 68 29 20 29 7b 0a 20 20 20 20 20 20 20  idth) ){.       
a730: 20 20 20 20 77 20 3d 20 70 2d 3e 61 63 74 75 61      w = p->actua
a740: 6c 57 69 64 74 68 5b 69 5d 3b 0a 20 20 20 20 20  lWidth[i];.     
a750: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a760: 20 20 20 20 20 77 20 3d 20 31 30 3b 0a 20 20 20       w = 10;.   
a770: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
a780: 66 28 20 70 2d 3e 63 4d 6f 64 65 3d 3d 4d 4f 44  f( p->cMode==MOD
a790: 45 5f 45 78 70 6c 61 69 6e 20 26 26 20 61 7a 41  E_Explain && azA
a7a0: 72 67 5b 69 5d 20 26 26 20 73 74 72 6c 65 6e 43  rg[i] && strlenC
a7b0: 68 61 72 28 61 7a 41 72 67 5b 69 5d 29 3e 77 20  har(azArg[i])>w 
a7c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 77 20 3d  ){.          w =
a7d0: 20 73 74 72 6c 65 6e 43 68 61 72 28 61 7a 41 72   strlenChar(azAr
a7e0: 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  g[i]);.        }
a7f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3d 3d  .        if( i==
a800: 31 20 26 26 20 70 2d 3e 61 69 49 6e 64 65 6e 74  1 && p->aiIndent
a810: 20 26 26 20 70 2d 3e 70 53 74 6d 74 20 29 7b 0a   && p->pStmt ){.
a820: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 2d            if( p-
a830: 3e 69 49 6e 64 65 6e 74 3c 70 2d 3e 6e 49 6e 64  >iIndent<p->nInd
a840: 65 6e 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ent ){.         
a850: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
a860: 2d 3e 6f 75 74 2c 20 22 25 2a 2e 73 22 2c 20 70  ->out, "%*.s", p
a870: 2d 3e 61 69 49 6e 64 65 6e 74 5b 70 2d 3e 69 49  ->aiIndent[p->iI
a880: 6e 64 65 6e 74 5d 2c 20 22 22 29 3b 0a 20 20 20  ndent], "");.   
a890: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
a8a0: 20 20 20 70 2d 3e 69 49 6e 64 65 6e 74 2b 2b 3b     p->iIndent++;
a8b0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a8c0: 20 20 20 75 74 66 38 5f 77 69 64 74 68 5f 70 72     utf8_width_pr
a8d0: 69 6e 74 28 70 2d 3e 6f 75 74 2c 20 77 2c 20 61  int(p->out, w, a
a8e0: 7a 41 72 67 5b 69 5d 20 3f 20 61 7a 41 72 67 5b  zArg[i] ? azArg[
a8f0: 69 5d 20 3a 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75  i] : p->nullValu
a900: 65 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38  e);.        utf8
a910: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
a920: 22 25 73 22 2c 20 69 3d 3d 6e 41 72 67 2d 31 20  "%s", i==nArg-1 
a930: 3f 20 72 6f 77 53 65 70 20 3a 20 22 20 20 22 29  ? rowSep : "  ")
a940: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a950: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
a960: 20 63 61 73 65 20 4d 4f 44 45 5f 53 65 6d 69 3a   case MODE_Semi:
a970: 20 7b 20 20 20 2f 2a 20 2e 73 63 68 65 6d 61 20   {   /* .schema 
a980: 61 6e 64 20 2e 66 75 6c 6c 73 63 68 65 6d 61 20  and .fullschema 
a990: 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 20 20  output */.      
a9a0: 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e 65 28  printSchemaLine(
a9b0: 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 30 5d  p->out, azArg[0]
a9c0: 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20  , ";\n");.      
a9d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
a9e0: 20 63 61 73 65 20 4d 4f 44 45 5f 50 72 65 74 74   case MODE_Prett
a9f0: 79 3a 20 7b 20 20 2f 2a 20 2e 73 63 68 65 6d 61  y: {  /* .schema
aa00: 20 61 6e 64 20 2e 66 75 6c 6c 73 63 68 65 6d 61   and .fullschema
aa10: 20 77 69 74 68 20 2d 2d 69 6e 64 65 6e 74 20 2a   with --indent *
aa20: 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 3b  /.      char *z;
aa30: 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20  .      int j;.  
aa40: 20 20 20 20 69 6e 74 20 6e 50 61 72 65 6e 20 3d      int nParen =
aa50: 20 30 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63   0;.      char c
aa60: 45 6e 64 20 3d 20 30 3b 0a 20 20 20 20 20 20 63  End = 0;.      c
aa70: 68 61 72 20 63 3b 0a 20 20 20 20 20 20 69 6e 74  har c;.      int
aa80: 20 6e 4c 69 6e 65 20 3d 20 30 3b 0a 20 20 20 20   nLine = 0;.    
aa90: 20 20 61 73 73 65 72 74 28 20 6e 41 72 67 3d 3d    assert( nArg==
aaa0: 31 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 61  1 );.      if( a
aab0: 7a 41 72 67 5b 30 5d 3d 3d 30 20 29 20 62 72 65  zArg[0]==0 ) bre
aac0: 61 6b 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71  ak;.      if( sq
aad0: 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 43  lite3_strlike("C
aae0: 52 45 41 54 45 20 56 49 45 57 25 22 2c 20 61 7a  REATE VIEW%", az
aaf0: 41 72 67 5b 30 5d 2c 20 30 29 3d 3d 30 0a 20 20  Arg[0], 0)==0.  
ab00: 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33 5f       || sqlite3_
ab10: 73 74 72 6c 69 6b 65 28 22 43 52 45 41 54 45 20  strlike("CREATE 
ab20: 54 52 49 47 25 22 2c 20 61 7a 41 72 67 5b 30 5d  TRIG%", azArg[0]
ab30: 2c 20 30 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b  , 0)==0.      ){
ab40: 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
ab50: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
ab60: 3b 5c 6e 22 2c 20 61 7a 41 72 67 5b 30 5d 29 3b  ;\n", azArg[0]);
ab70: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
ab80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 20        }.      z 
ab90: 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
aba0: 66 28 22 25 73 22 2c 20 61 7a 41 72 67 5b 30 5d  f("%s", azArg[0]
abb0: 29 3b 0a 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a  );.      j = 0;.
abc0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 49        for(i=0; I
abd0: 73 53 70 61 63 65 28 7a 5b 69 5d 29 3b 20 69 2b  sSpace(z[i]); i+
abe0: 2b 29 7b 7d 0a 20 20 20 20 20 20 66 6f 72 28 3b  +){}.      for(;
abf0: 20 28 63 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20   (c = z[i])!=0; 
ac00: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
ac10: 28 20 49 73 53 70 61 63 65 28 63 29 20 29 7b 0a  ( IsSpace(c) ){.
ac20: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b            if( z[
ac30: 6a 2d 31 5d 3d 3d 27 5c 72 27 20 29 20 7a 5b 6a  j-1]=='\r' ) z[j
ac40: 2d 31 5d 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20  -1] = '\n';.    
ac50: 20 20 20 20 20 20 69 66 28 20 49 73 53 70 61 63        if( IsSpac
ac60: 65 28 7a 5b 6a 2d 31 5d 29 20 7c 7c 20 7a 5b 6a  e(z[j-1]) || z[j
ac70: 2d 31 5d 3d 3d 27 28 27 20 29 20 63 6f 6e 74 69  -1]=='(' ) conti
ac80: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  nue;.        }el
ac90: 73 65 20 69 66 28 20 28 63 3d 3d 27 28 27 20 7c  se if( (c=='(' |
aca0: 7c 20 63 3d 3d 27 29 27 29 20 26 26 20 6a 3e 30  | c==')') && j>0
acb0: 20 26 26 20 49 73 53 70 61 63 65 28 7a 5b 6a 2d   && IsSpace(z[j-
acc0: 31 5d 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  1]) ){.         
acd0: 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20 7d 0a   j--;.        }.
ace0: 20 20 20 20 20 20 20 20 7a 5b 6a 2b 2b 5d 20 3d          z[j++] =
acf0: 20 63 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   c;.      }.    
ad00: 20 20 77 68 69 6c 65 28 20 6a 3e 30 20 26 26 20    while( j>0 && 
ad10: 49 73 53 70 61 63 65 28 7a 5b 6a 2d 31 5d 29 20  IsSpace(z[j-1]) 
ad20: 29 7b 20 6a 2d 2d 3b 20 7d 0a 20 20 20 20 20 20  ){ j--; }.      
ad30: 7a 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20  z[j] = 0;.      
ad40: 69 66 28 20 73 74 72 6c 65 6e 33 30 28 7a 29 3e  if( strlen30(z)>
ad50: 3d 37 39 20 29 7b 0a 20 20 20 20 20 20 20 20 66  =79 ){.        f
ad60: 6f 72 28 69 3d 6a 3d 30 3b 20 28 63 20 3d 20 7a  or(i=j=0; (c = z
ad70: 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b 29 7b 0a 20  [i])!=0; i++){. 
ad80: 20 20 20 20 20 20 20 20 20 69 66 28 20 63 3d 3d           if( c==
ad90: 63 45 6e 64 20 29 7b 0a 20 20 20 20 20 20 20 20  cEnd ){.        
ada0: 20 20 20 20 63 45 6e 64 20 3d 20 30 3b 0a 20 20      cEnd = 0;.  
adb0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
adc0: 28 20 63 3d 3d 27 22 27 20 7c 7c 20 63 3d 3d 27  ( c=='"' || c=='
add0: 5c 27 27 20 7c 7c 20 63 3d 3d 27 60 27 20 29 7b  \'' || c=='`' ){
ade0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 45 6e  .            cEn
adf0: 64 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20 20  d = c;.         
ae00: 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 5b   }else if( c=='[
ae10: 27 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ' ){.           
ae20: 20 63 45 6e 64 20 3d 20 27 5d 27 3b 0a 20 20 20   cEnd = ']';.   
ae30: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
ae40: 20 63 3d 3d 27 28 27 20 29 7b 0a 20 20 20 20 20   c=='(' ){.     
ae50: 20 20 20 20 20 20 20 6e 50 61 72 65 6e 2b 2b 3b         nParen++;
ae60: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
ae70: 20 69 66 28 20 63 3d 3d 27 29 27 20 29 7b 0a 20   if( c==')' ){. 
ae80: 20 20 20 20 20 20 20 20 20 20 20 6e 50 61 72 65             nPare
ae90: 6e 2d 2d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  n--;.           
aea0: 20 69 66 28 20 6e 4c 69 6e 65 3e 30 20 26 26 20   if( nLine>0 && 
aeb0: 6e 50 61 72 65 6e 3d 3d 30 20 26 26 20 6a 3e 30  nParen==0 && j>0
aec0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
aed0: 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c 69 6e    printSchemaLin
aee0: 65 4e 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20 6a 2c  eN(p->out, z, j,
aef0: 20 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20   "\n");.        
af00: 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20 20 20        j = 0;.   
af10: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
af20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
af30: 20 7a 5b 6a 2b 2b 5d 20 3d 20 63 3b 0a 20 20 20   z[j++] = c;.   
af40: 20 20 20 20 20 20 20 69 66 28 20 6e 50 61 72 65         if( nPare
af50: 6e 3d 3d 31 20 26 26 20 28 63 3d 3d 27 28 27 20  n==1 && (c=='(' 
af60: 7c 7c 20 63 3d 3d 27 2c 27 20 7c 7c 20 63 3d 3d  || c==',' || c==
af70: 27 5c 6e 27 29 20 29 7b 0a 20 20 20 20 20 20 20  '\n') ){.       
af80: 20 20 20 20 20 69 66 28 20 63 3d 3d 27 5c 6e 27       if( c=='\n'
af90: 20 29 20 6a 2d 2d 3b 0a 20 20 20 20 20 20 20 20   ) j--;.        
afa0: 20 20 20 20 70 72 69 6e 74 53 63 68 65 6d 61 4c      printSchemaL
afb0: 69 6e 65 4e 28 70 2d 3e 6f 75 74 2c 20 7a 2c 20  ineN(p->out, z, 
afc0: 6a 2c 20 22 5c 6e 20 20 22 29 3b 0a 20 20 20 20  j, "\n  ");.    
afd0: 20 20 20 20 20 20 20 20 6a 20 3d 20 30 3b 0a 20          j = 0;. 
afe0: 20 20 20 20 20 20 20 20 20 20 20 6e 4c 69 6e 65             nLine
aff0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
b000: 77 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a  while( IsSpace(z
b010: 5b 69 2b 31 5d 29 20 29 7b 20 69 2b 2b 3b 20 7d  [i+1]) ){ i++; }
b020: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
b030: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a       }.        z
b040: 5b 6a 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d  [j] = 0;.      }
b050: 0a 20 20 20 20 20 20 70 72 69 6e 74 53 63 68 65  .      printSche
b060: 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c 20 7a  maLine(p->out, z
b070: 2c 20 22 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20  , ";\n");.      
b080: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
b090: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b0a0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f 44    }.    case MOD
b0b0: 45 5f 4c 69 73 74 3a 20 7b 0a 20 20 20 20 20 20  E_List: {.      
b0c0: 69 66 28 20 70 2d 3e 63 6e 74 2b 2b 3d 3d 30 20  if( p->cnt++==0 
b0d0: 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64 65 72  && p->showHeader
b0e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   ){.        for(
b0f0: 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b  i=0; i<nArg; i++
b100: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66  ){.          utf
b110: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
b120: 22 25 73 25 73 22 2c 61 7a 43 6f 6c 5b 69 5d 2c  "%s%s",azCol[i],
b130: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
b140: 20 20 20 69 3d 3d 6e 41 72 67 2d 31 20 3f 20 70     i==nArg-1 ? p
b150: 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 20 3a  ->rowSeparator :
b160: 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
b170: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
b180: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61     }.      if( a
b190: 7a 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b  zArg==0 ) break;
b1a0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
b1b0: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
b1c0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20        char *z = 
b1d0: 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20  azArg[i];.      
b1e0: 20 20 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d    if( z==0 ) z =
b1f0: 20 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 3b 0a 20   p->nullValue;. 
b200: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
b210: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
b220: 20 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28   z);.        if(
b230: 20 69 3c 6e 41 72 67 2d 31 20 29 7b 0a 20 20 20   i<nArg-1 ){.   
b240: 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
b250: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
b260: 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72   p->colSeparator
b270: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
b280: 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
b290: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
b2a0: 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61  "%s", p->rowSepa
b2b0: 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  rator);.        
b2c0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
b2d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
b2e0: 20 63 61 73 65 20 4d 4f 44 45 5f 48 74 6d 6c 3a   case MODE_Html:
b2f0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   {.      if( p->
b300: 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73  cnt++==0 && p->s
b310: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
b320: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
b330: 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b 0a  p->out,"<TR>");.
b340: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
b350: 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20   i<nArg; i++){. 
b360: 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
b370: 6e 74 66 28 70 2d 3e 6f 75 74 2c 22 3c 54 48 3e  ntf(p->out,"<TH>
b380: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75  ");.          ou
b390: 74 70 75 74 5f 68 74 6d 6c 5f 73 74 72 69 6e 67  tput_html_string
b3a0: 28 70 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69  (p->out, azCol[i
b3b0: 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 61  ]);.          ra
b3c0: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
b3d0: 22 3c 2f 54 48 3e 5c 6e 22 29 3b 0a 20 20 20 20  "</TH>\n");.    
b3e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 61      }.        ra
b3f0: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
b400: 22 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20  "</TR>\n");.    
b410: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 61 7a    }.      if( az
b420: 41 72 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  Arg==0 ) break;.
b430: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
b440: 28 70 2d 3e 6f 75 74 2c 22 3c 54 52 3e 22 29 3b  (p->out,"<TR>");
b450: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
b460: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
b470: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
b480: 28 70 2d 3e 6f 75 74 2c 22 3c 54 44 3e 22 29 3b  (p->out,"<TD>");
b490: 0a 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f  .        output_
b4a0: 68 74 6d 6c 5f 73 74 72 69 6e 67 28 70 2d 3e 6f  html_string(p->o
b4b0: 75 74 2c 20 61 7a 41 72 67 5b 69 5d 20 3f 20 61  ut, azArg[i] ? a
b4c0: 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e 75 6c  zArg[i] : p->nul
b4d0: 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20  lValue);.       
b4e0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
b4f0: 75 74 2c 22 3c 2f 54 44 3e 5c 6e 22 29 3b 0a 20  ut,"</TD>\n");. 
b500: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77       }.      raw
b510: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
b520: 3c 2f 54 52 3e 5c 6e 22 29 3b 0a 20 20 20 20 20  </TR>\n");.     
b530: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
b540: 20 20 63 61 73 65 20 4d 4f 44 45 5f 54 63 6c 3a    case MODE_Tcl:
b550: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   {.      if( p->
b560: 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73  cnt++==0 && p->s
b570: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
b580: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
b590: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
b5a0: 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73        output_c_s
b5b0: 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 61 7a 43  tring(p->out,azC
b5c0: 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69 5d  ol[i] ? azCol[i]
b5d0: 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20 20   : "");.        
b5e0: 20 20 69 66 28 69 3c 6e 41 72 67 2d 31 29 20 75    if(i<nArg-1) u
b5f0: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
b600: 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c 53  t, "%s", p->colS
b610: 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20  eparator);.     
b620: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66     }.        utf
b630: 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
b640: 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70   "%s", p->rowSep
b650: 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d  arator);.      }
b660: 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72 67  .      if( azArg
b670: 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  ==0 ) break;.   
b680: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41     for(i=0; i<nA
b690: 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rg; i++){.      
b6a0: 20 20 6f 75 74 70 75 74 5f 63 5f 73 74 72 69 6e    output_c_strin
b6b0: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b  g(p->out, azArg[
b6c0: 69 5d 20 3f 20 61 7a 41 72 67 5b 69 5d 20 3a 20  i] ? azArg[i] : 
b6d0: 70 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20  p->nullValue);. 
b6e0: 20 20 20 20 20 20 20 69 66 28 69 3c 6e 41 72 67         if(i<nArg
b6f0: 2d 31 29 20 75 74 66 38 5f 70 72 69 6e 74 66 28  -1) utf8_printf(
b700: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 70 2d  p->out, "%s", p-
b710: 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a  >colSeparator);.
b720: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 75 74        }.      ut
b730: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
b740: 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65  , "%s", p->rowSe
b750: 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20 20 20  parator);.      
b760: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
b770: 20 63 61 73 65 20 4d 4f 44 45 5f 43 73 76 3a 20   case MODE_Csv: 
b780: 7b 0a 20 20 20 20 20 20 73 65 74 42 69 6e 61 72  {.      setBinar
b790: 79 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29  yMode(p->out, 1)
b7a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 63  ;.      if( p->c
b7b0: 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73 68  nt++==0 && p->sh
b7c0: 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20 20  owHeader ){.    
b7d0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
b7e0: 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Arg; i++){.     
b7f0: 20 20 20 20 20 6f 75 74 70 75 74 5f 63 73 76 28       output_csv(
b800: 70 2c 20 61 7a 43 6f 6c 5b 69 5d 20 3f 20 61 7a  p, azCol[i] ? az
b810: 43 6f 6c 5b 69 5d 20 3a 20 22 22 2c 20 69 3c 6e  Col[i] : "", i<n
b820: 41 72 67 2d 31 29 3b 0a 20 20 20 20 20 20 20 20  Arg-1);.        
b830: 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  }.        utf8_p
b840: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
b850: 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  s", p->rowSepara
b860: 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  tor);.      }.  
b870: 20 20 20 20 69 66 28 20 6e 41 72 67 3e 30 20 29      if( nArg>0 )
b880: 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  {.        for(i=
b890: 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b  0; i<nArg; i++){
b8a0: 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70 75  .          outpu
b8b0: 74 5f 63 73 76 28 70 2c 20 61 7a 41 72 67 5b 69  t_csv(p, azArg[i
b8c0: 5d 2c 20 69 3c 6e 41 72 67 2d 31 29 3b 0a 20 20  ], i<nArg-1);.  
b8d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
b8e0: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
b8f0: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 72 6f 77  ut, "%s", p->row
b900: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
b910: 20 20 7d 0a 20 20 20 20 20 20 73 65 74 54 65 78    }.      setTex
b920: 74 4d 6f 64 65 28 70 2d 3e 6f 75 74 2c 20 31 29  tMode(p->out, 1)
b930: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
b940: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 4d 4f     }.    case MO
b950: 44 45 5f 49 6e 73 65 72 74 3a 20 7b 0a 20 20 20  DE_Insert: {.   
b960: 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d 30 20     if( azArg==0 
b970: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 75  ) break;.      u
b980: 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
b990: 74 2c 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 25  t,"INSERT INTO %
b9a0: 73 22 2c 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65  s",p->zDestTable
b9b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  );.      if( p->
b9c0: 73 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20  showHeader ){.  
b9d0: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
b9e0: 28 70 2d 3e 6f 75 74 2c 22 28 22 29 3b 0a 20 20  (p->out,"(");.  
b9f0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
ba00: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
ba10: 20 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29         if( i>0 )
ba20: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
ba30: 75 74 2c 20 22 2c 22 29 3b 0a 20 20 20 20 20 20  ut, ",");.      
ba40: 20 20 20 20 69 66 28 20 71 75 6f 74 65 43 68 61      if( quoteCha
ba50: 72 28 61 7a 43 6f 6c 5b 69 5d 29 20 29 7b 0a 20  r(azCol[i]) ){. 
ba60: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
ba70: 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  *z = sqlite3_mpr
ba80: 69 6e 74 66 28 22 5c 22 25 77 5c 22 22 2c 20 61  intf("\"%w\"", a
ba90: 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 20 20 20 20  zCol[i]);.      
baa0: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
bab0: 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20  f(p->out, "%s", 
bac0: 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  z);.            
bad0: 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29 3b  sqlite3_free(z);
bae0: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
baf0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 61  {.            ra
bb00: 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
bb10: 20 22 25 73 22 2c 20 61 7a 43 6f 6c 5b 69 5d 29   "%s", azCol[i])
bb20: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
bb30: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
bb40: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
bb50: 74 2c 22 29 22 29 3b 0a 20 20 20 20 20 20 7d 0a  t,")");.      }.
bb60: 20 20 20 20 20 20 70 2d 3e 63 6e 74 2b 2b 3b 0a        p->cnt++;.
bb70: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
bb80: 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
bb90: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
bba0: 70 2d 3e 6f 75 74 2c 20 69 3e 30 20 3f 20 22 2c  p->out, i>0 ? ",
bbb0: 22 20 3a 20 22 20 56 41 4c 55 45 53 28 22 29 3b  " : " VALUES(");
bbc0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 61 7a  .        if( (az
bbd0: 41 72 67 5b 69 5d 3d 3d 30 29 20 7c 7c 20 28 61  Arg[i]==0) || (a
bbe0: 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65 5b  iType && aiType[
bbf0: 69 5d 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29  i]==SQLITE_NULL)
bc00: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74   ){.          ut
bc10: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
bc20: 2c 22 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20  ,"NULL");.      
bc30: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79    }else if( aiTy
bc40: 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d  pe && aiType[i]=
bc50: 3d 53 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a  =SQLITE_TEXT ){.
bc60: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 53 68            if( Sh
bc70: 65 6c 6c 48 61 73 46 6c 61 67 28 70 2c 20 53 48  ellHasFlag(p, SH
bc80: 46 4c 47 5f 4e 65 77 6c 69 6e 65 73 29 20 29 7b  FLG_Newlines) ){
bc90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f 75 74  .            out
bca0: 70 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e  put_quoted_strin
bcb0: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b  g(p->out, azArg[
bcc0: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  i]);.          }
bcd0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
bce0: 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f    output_quoted_
bcf0: 65 73 63 61 70 65 64 5f 73 74 72 69 6e 67 28 70  escaped_string(p
bd00: 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29  ->out, azArg[i])
bd10: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
bd20: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
bd30: 61 69 54 79 70 65 20 26 26 20 61 69 54 79 70 65  aiType && aiType
bd40: 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e 54 45  [i]==SQLITE_INTE
bd50: 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 20  GER ){.         
bd60: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
bd70: 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b  out,"%s", azArg[
bd80: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  i]);.        }el
bd90: 73 65 20 69 66 28 20 61 69 54 79 70 65 20 26 26  se if( aiType &&
bda0: 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49   aiType[i]==SQLI
bdb0: 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20  TE_FLOAT ){.    
bdc0: 20 20 20 20 20 20 63 68 61 72 20 7a 5b 35 30 5d        char z[50]
bdd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 64 6f 75 62  ;.          doub
bde0: 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33 5f 63  le r = sqlite3_c
bdf0: 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70 2d 3e  olumn_double(p->
be00: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
be10: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
be20: 72 69 6e 74 66 28 35 30 2c 7a 2c 22 25 21 2e 32  rintf(50,z,"%!.2
be30: 30 67 22 2c 20 72 29 3b 0a 20 20 20 20 20 20 20  0g", r);.       
be40: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
be50: 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29 3b 0a  >out, "%s", z);.
be60: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
be70: 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79  ( aiType && aiTy
be80: 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 42 4c  pe[i]==SQLITE_BL
be90: 4f 42 20 26 26 20 70 2d 3e 70 53 74 6d 74 20 29  OB && p->pStmt )
bea0: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  {.          cons
beb0: 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62 20 3d 20  t void *pBlob = 
bec0: 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
bed0: 6c 6f 62 28 70 2d 3e 70 53 74 6d 74 2c 20 69 29  lob(p->pStmt, i)
bee0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  ;.          int 
bef0: 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65 33 5f  nBlob = sqlite3_
bf00: 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 2d 3e  column_bytes(p->
bf10: 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
bf20: 20 20 20 20 20 6f 75 74 70 75 74 5f 68 65 78 5f       output_hex_
bf30: 62 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20 70 42 6c  blob(p->out, pBl
bf40: 6f 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20 20 20  ob, nBlob);.    
bf50: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 69 73      }else if( is
bf60: 4e 75 6d 62 65 72 28 61 7a 41 72 67 5b 69 5d 2c  Number(azArg[i],
bf70: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   0) ){.         
bf80: 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
bf90: 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72 67 5b  out,"%s", azArg[
bfa0: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  i]);.        }el
bfb0: 73 65 20 69 66 28 20 53 68 65 6c 6c 48 61 73 46  se if( ShellHasF
bfc0: 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65 77  lag(p, SHFLG_New
bfd0: 6c 69 6e 65 73 29 20 29 7b 0a 20 20 20 20 20 20  lines) ){.      
bfe0: 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74 65      output_quote
bff0: 64 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c  d_string(p->out,
c000: 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20   azArg[i]);.    
c010: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c020: 20 20 20 20 20 6f 75 74 70 75 74 5f 71 75 6f 74       output_quot
c030: 65 64 5f 65 73 63 61 70 65 64 5f 73 74 72 69 6e  ed_escaped_strin
c040: 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41 72 67 5b  g(p->out, azArg[
c050: 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  i]);.        }. 
c060: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 61 77       }.      raw
c070: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
c080: 29 3b 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62 72  );\n");.      br
c090: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
c0a0: 61 73 65 20 4d 4f 44 45 5f 51 75 6f 74 65 3a 20  ase MODE_Quote: 
c0b0: 7b 0a 20 20 20 20 20 20 69 66 28 20 61 7a 41 72  {.      if( azAr
c0c0: 67 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20  g==0 ) break;.  
c0d0: 20 20 20 20 69 66 28 20 70 2d 3e 63 6e 74 3d 3d      if( p->cnt==
c0e0: 30 20 26 26 20 70 2d 3e 73 68 6f 77 48 65 61 64  0 && p->showHead
c0f0: 65 72 20 29 7b 0a 20 20 20 20 20 20 20 20 66 6f  er ){.        fo
c100: 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=0; i<nArg; i
c110: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
c120: 66 28 20 69 3e 30 20 29 20 72 61 77 5f 70 72 69  f( i>0 ) raw_pri
c130: 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 22 29  ntf(p->out, ",")
c140: 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 75 74 70  ;.          outp
c150: 75 74 5f 71 75 6f 74 65 64 5f 73 74 72 69 6e 67  ut_quoted_string
c160: 28 70 2d 3e 6f 75 74 2c 20 61 7a 43 6f 6c 5b 69  (p->out, azCol[i
c170: 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
c180: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
c190: 28 70 2d 3e 6f 75 74 2c 22 5c 6e 22 29 3b 0a 20  (p->out,"\n");. 
c1a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 2d 3e       }.      p->
c1b0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72  cnt++;.      for
c1c0: 28 69 3d 30 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=0; i<nArg; i+
c1d0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
c1e0: 69 3e 30 20 29 20 72 61 77 5f 70 72 69 6e 74 66  i>0 ) raw_printf
c1f0: 28 70 2d 3e 6f 75 74 2c 20 22 2c 22 29 3b 0a 20  (p->out, ",");. 
c200: 20 20 20 20 20 20 20 69 66 28 20 28 61 7a 41 72         if( (azAr
c210: 67 5b 69 5d 3d 3d 30 29 20 7c 7c 20 28 61 69 54  g[i]==0) || (aiT
c220: 79 70 65 20 26 26 20 61 69 54 79 70 65 5b 69 5d  ype && aiType[i]
c230: 3d 3d 53 51 4c 49 54 45 5f 4e 55 4c 4c 29 20 29  ==SQLITE_NULL) )
c240: 7b 0a 20 20 20 20 20 20 20 20 20 20 75 74 66 38  {.          utf8
c250: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 22  _printf(p->out,"
c260: 4e 55 4c 4c 22 29 3b 0a 20 20 20 20 20 20 20 20  NULL");.        
c270: 7d 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65  }else if( aiType
c280: 20 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53   && aiType[i]==S
c290: 51 4c 49 54 45 5f 54 45 58 54 20 29 7b 0a 20 20  QLITE_TEXT ){.  
c2a0: 20 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 71          output_q
c2b0: 75 6f 74 65 64 5f 73 74 72 69 6e 67 28 70 2d 3e  uoted_string(p->
c2c0: 6f 75 74 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a  out, azArg[i]);.
c2d0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
c2e0: 28 20 61 69 54 79 70 65 20 26 26 20 61 69 54 79  ( aiType && aiTy
c2f0: 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f 49 4e  pe[i]==SQLITE_IN
c300: 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20  TEGER ){.       
c310: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
c320: 2d 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72  ->out,"%s", azAr
c330: 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  g[i]);.        }
c340: 65 6c 73 65 20 69 66 28 20 61 69 54 79 70 65 20  else if( aiType 
c350: 26 26 20 61 69 54 79 70 65 5b 69 5d 3d 3d 53 51  && aiType[i]==SQ
c360: 4c 49 54 45 5f 46 4c 4f 41 54 20 29 7b 0a 20 20  LITE_FLOAT ){.  
c370: 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 5b 35          char z[5
c380: 30 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 64 6f  0];.          do
c390: 75 62 6c 65 20 72 20 3d 20 73 71 6c 69 74 65 33  uble r = sqlite3
c3a0: 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28 70  _column_double(p
c3b0: 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  ->pStmt, i);.   
c3c0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
c3d0: 6e 70 72 69 6e 74 66 28 35 30 2c 7a 2c 22 25 21  nprintf(50,z,"%!
c3e0: 2e 32 30 67 22 2c 20 72 29 3b 0a 20 20 20 20 20  .20g", r);.     
c3f0: 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
c400: 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 29  p->out, "%s", z)
c410: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
c420: 69 66 28 20 61 69 54 79 70 65 20 26 26 20 61 69  if( aiType && ai
c430: 54 79 70 65 5b 69 5d 3d 3d 53 51 4c 49 54 45 5f  Type[i]==SQLITE_
c440: 42 4c 4f 42 20 26 26 20 70 2d 3e 70 53 74 6d 74  BLOB && p->pStmt
c450: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   ){.          co
c460: 6e 73 74 20 76 6f 69 64 20 2a 70 42 6c 6f 62 20  nst void *pBlob 
c470: 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
c480: 5f 62 6c 6f 62 28 70 2d 3e 70 53 74 6d 74 2c 20  _blob(p->pStmt, 
c490: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 6e  i);.          in
c4a0: 74 20 6e 42 6c 6f 62 20 3d 20 73 71 6c 69 74 65  t nBlob = sqlite
c4b0: 33 5f 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70  3_column_bytes(p
c4c0: 2d 3e 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20  ->pStmt, i);.   
c4d0: 20 20 20 20 20 20 20 6f 75 74 70 75 74 5f 68 65         output_he
c4e0: 78 5f 62 6c 6f 62 28 70 2d 3e 6f 75 74 2c 20 70  x_blob(p->out, p
c4f0: 42 6c 6f 62 2c 20 6e 42 6c 6f 62 29 3b 0a 20 20  Blob, nBlob);.  
c500: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
c510: 69 73 4e 75 6d 62 65 72 28 61 7a 41 72 67 5b 69  isNumber(azArg[i
c520: 5d 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20  ], 0) ){.       
c530: 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
c540: 2d 3e 6f 75 74 2c 22 25 73 22 2c 20 61 7a 41 72  ->out,"%s", azAr
c550: 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d  g[i]);.        }
c560: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
c570: 6f 75 74 70 75 74 5f 71 75 6f 74 65 64 5f 73 74  output_quoted_st
c580: 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 61 7a 41  ring(p->out, azA
c590: 72 67 5b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[i]);.        
c5a0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
c5b0: 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
c5c0: 74 2c 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 62  t,"\n");.      b
c5d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
c5e0: 63 61 73 65 20 4d 4f 44 45 5f 41 73 63 69 69 3a  case MODE_Ascii:
c5f0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   {.      if( p->
c600: 63 6e 74 2b 2b 3d 3d 30 20 26 26 20 70 2d 3e 73  cnt++==0 && p->s
c610: 68 6f 77 48 65 61 64 65 72 20 29 7b 0a 20 20 20  howHeader ){.   
c620: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
c630: 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
c640: 20 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 20        if( i>0 ) 
c650: 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
c660: 75 74 2c 20 22 25 73 22 2c 20 70 2d 3e 63 6f 6c  ut, "%s", p->col
c670: 53 65 70 61 72 61 74 6f 72 29 3b 0a 20 20 20 20  Separator);.    
c680: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
c690: 66 28 70 2d 3e 6f 75 74 2c 22 25 73 22 2c 61 7a  f(p->out,"%s",az
c6a0: 43 6f 6c 5b 69 5d 20 3f 20 61 7a 43 6f 6c 5b 69  Col[i] ? azCol[i
c6b0: 5d 20 3a 20 22 22 29 3b 0a 20 20 20 20 20 20 20  ] : "");.       
c6c0: 20 7d 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f   }.        utf8_
c6d0: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
c6e0: 25 73 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72  %s", p->rowSepar
c6f0: 61 74 6f 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  ator);.      }. 
c700: 20 20 20 20 20 69 66 28 20 61 7a 41 72 67 3d 3d       if( azArg==
c710: 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  0 ) break;.     
c720: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 41 72 67   for(i=0; i<nArg
c730: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
c740: 69 66 28 20 69 3e 30 20 29 20 75 74 66 38 5f 70  if( i>0 ) utf8_p
c750: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
c760: 73 22 2c 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61  s", p->colSepara
c770: 74 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 75 74  tor);.        ut
c780: 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
c790: 2c 22 25 73 22 2c 61 7a 41 72 67 5b 69 5d 20 3f  ,"%s",azArg[i] ?
c7a0: 20 61 7a 41 72 67 5b 69 5d 20 3a 20 70 2d 3e 6e   azArg[i] : p->n
c7b0: 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20 20 20 20  ullValue);.     
c7c0: 20 7d 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72   }.      utf8_pr
c7d0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73  intf(p->out, "%s
c7e0: 22 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ", p->rowSeparat
c7f0: 6f 72 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  or);.      break
c800: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
c810: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
c820: 20 54 68 69 73 20 69 73 20 74 68 65 20 63 61 6c   This is the cal
c830: 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 74 68  lback routine th
c840: 61 74 20 74 68 65 20 53 51 4c 69 74 65 20 6c 69  at the SQLite li
c850: 62 72 61 72 79 0a 2a 2a 20 69 6e 76 6f 6b 65 73  brary.** invokes
c860: 20 66 6f 72 20 65 61 63 68 20 72 6f 77 20 6f 66   for each row of
c870: 20 61 20 71 75 65 72 79 20 72 65 73 75 6c 74 2e   a query result.
c880: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63  .*/.static int c
c890: 61 6c 6c 62 61 63 6b 28 76 6f 69 64 20 2a 70 41  allback(void *pA
c8a0: 72 67 2c 20 69 6e 74 20 6e 41 72 67 2c 20 63 68  rg, int nArg, ch
c8b0: 61 72 20 2a 2a 61 7a 41 72 67 2c 20 63 68 61 72  ar **azArg, char
c8c0: 20 2a 2a 61 7a 43 6f 6c 29 7b 0a 20 20 2f 2a 20   **azCol){.  /* 
c8d0: 73 69 6e 63 65 20 77 65 20 64 6f 6e 27 74 20 68  since we don't h
c8e0: 61 76 65 20 74 79 70 65 20 69 6e 66 6f 2c 20 63  ave type info, c
c8f0: 61 6c 6c 20 74 68 65 20 73 68 65 6c 6c 5f 63 61  all the shell_ca
c900: 6c 6c 62 61 63 6b 20 77 69 74 68 20 61 20 4e 55  llback with a NU
c910: 4c 4c 20 76 61 6c 75 65 20 2a 2f 0a 20 20 72 65  LL value */.  re
c920: 74 75 72 6e 20 73 68 65 6c 6c 5f 63 61 6c 6c 62  turn shell_callb
c930: 61 63 6b 28 70 41 72 67 2c 20 6e 41 72 67 2c 20  ack(pArg, nArg, 
c940: 61 7a 41 72 67 2c 20 61 7a 43 6f 6c 2c 20 4e 55  azArg, azCol, NU
c950: 4c 4c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  LL);.}../*.** Th
c960: 69 73 20 69 73 20 74 68 65 20 63 61 6c 6c 62 61  is is the callba
c970: 63 6b 20 72 6f 75 74 69 6e 65 20 66 72 6f 6d 20  ck routine from 
c980: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 29 20 74  sqlite3_exec() t
c990: 68 61 74 20 61 70 70 65 6e 64 73 20 61 6c 6c 0a  hat appends all.
c9a0: 2a 2a 20 6f 75 74 70 75 74 20 6f 6e 74 6f 20 74  ** output onto t
c9b0: 68 65 20 65 6e 64 20 6f 66 20 61 20 53 68 65 6c  he end of a Shel
c9c0: 6c 54 65 78 74 20 6f 62 6a 65 63 74 2e 0a 2a 2f  lText object..*/
c9d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 63 61 70 74  .static int capt
c9e0: 75 72 65 4f 75 74 70 75 74 43 61 6c 6c 62 61 63  ureOutputCallbac
c9f0: 6b 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e  k(void *pArg, in
ca00: 74 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61  t nArg, char **a
ca10: 7a 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 29  zArg, char **az)
ca20: 7b 0a 20 20 53 68 65 6c 6c 54 65 78 74 20 2a 70  {.  ShellText *p
ca30: 20 3d 20 28 53 68 65 6c 6c 54 65 78 74 2a 29 70   = (ShellText*)p
ca40: 41 72 67 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  Arg;.  int i;.  
ca50: 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52  UNUSED_PARAMETER
ca60: 28 61 7a 29 3b 0a 20 20 69 66 28 20 61 7a 41 72  (az);.  if( azAr
ca70: 67 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  g==0 ) return 0;
ca80: 0a 20 20 69 66 28 20 70 2d 3e 6e 20 29 20 61 70  .  if( p->n ) ap
ca90: 70 65 6e 64 54 65 78 74 28 70 2c 20 22 7c 22 2c  pendText(p, "|",
caa0: 20 30 29 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20   0);.  for(i=0; 
cab0: 69 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20  i<nArg; i++){.  
cac0: 20 20 69 66 28 20 69 20 29 20 61 70 70 65 6e 64    if( i ) append
cad0: 54 65 78 74 28 70 2c 20 22 2c 22 2c 20 30 29 3b  Text(p, ",", 0);
cae0: 0a 20 20 20 20 69 66 28 20 61 7a 41 72 67 5b 69  .    if( azArg[i
caf0: 5d 20 29 20 61 70 70 65 6e 64 54 65 78 74 28 70  ] ) appendText(p
cb00: 2c 20 61 7a 41 72 67 5b 69 5d 2c 20 30 29 3b 0a  , azArg[i], 0);.
cb10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
cb20: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
cb30: 65 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  e an appropriate
cb40: 20 53 45 4c 46 54 45 53 54 20 74 61 62 6c 65 20   SELFTEST table 
cb50: 69 6e 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61  in the main data
cb60: 62 61 73 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  base..*/.static 
cb70: 76 6f 69 64 20 63 72 65 61 74 65 53 65 6c 66 74  void createSelft
cb80: 65 73 74 54 61 62 6c 65 28 53 68 65 6c 6c 53 74  estTable(ShellSt
cb90: 61 74 65 20 2a 70 29 7b 0a 20 20 63 68 61 72 20  ate *p){.  char 
cba0: 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  *zErrMsg = 0;.  
cbb0: 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
cbc0: 64 62 2c 0a 20 20 20 20 22 53 41 56 45 50 4f 49  db,.    "SAVEPOI
cbd0: 4e 54 20 73 65 6c 66 74 65 73 74 5f 69 6e 69 74  NT selftest_init
cbe0: 3b 5c 6e 22 0a 20 20 20 20 22 43 52 45 41 54 45  ;\n".    "CREATE
cbf0: 20 54 41 42 4c 45 20 49 46 20 4e 4f 54 20 45 58   TABLE IF NOT EX
cc00: 49 53 54 53 20 73 65 6c 66 74 65 73 74 28 5c 6e  ISTS selftest(\n
cc10: 22 0a 20 20 20 20 22 20 20 74 6e 6f 20 49 4e 54  ".    "  tno INT
cc20: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
cc30: 2c 5c 6e 22 20 20 20 2f 2a 20 54 65 73 74 20 6e  ,\n"   /* Test n
cc40: 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 22 20 20  umber */.    "  
cc50: 6f 70 20 54 45 58 54 2c 5c 6e 22 20 20 20 20 20  op TEXT,\n"     
cc60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
cc70: 20 4f 70 65 72 61 74 6f 72 3a 20 20 6d 65 6d 6f   Operator:  memo
cc80: 20 72 75 6e 20 2a 2f 0a 20 20 20 20 22 20 20 63   run */.    "  c
cc90: 6d 64 20 54 45 58 54 2c 5c 6e 22 20 20 20 20 20  md TEXT,\n"     
cca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ccb0: 43 6f 6d 6d 61 6e 64 20 74 65 78 74 20 2a 2f 0a  Command text */.
ccc0: 20 20 20 20 22 20 20 61 6e 73 20 54 45 58 54 5c      "  ans TEXT\
ccd0: 6e 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20  n"              
cce0: 20 20 20 20 20 2f 2a 20 44 65 73 69 72 65 64 20       /* Desired 
ccf0: 61 6e 73 77 65 72 20 2a 2f 0a 20 20 20 20 22 29  answer */.    ")
cd00: 3b 22 0a 20 20 20 20 22 43 52 45 41 54 45 20 54  ;".    "CREATE T
cd10: 45 4d 50 20 54 41 42 4c 45 20 5b 5f 73 68 65 6c  EMP TABLE [_shel
cd20: 6c 24 73 65 6c 66 5d 28 6f 70 2c 63 6d 64 2c 61  l$self](op,cmd,a
cd30: 6e 73 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53  ns);\n".    "INS
cd40: 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c  ERT INTO [_shell
cd50: 24 73 65 6c 66 5d 28 72 6f 77 69 64 2c 6f 70 2c  $self](rowid,op,
cd60: 63 6d 64 29 5c 6e 22 0a 20 20 20 20 22 20 20 56  cmd)\n".    "  V
cd70: 41 4c 55 45 53 28 63 6f 61 6c 65 73 63 65 28 28  ALUES(coalesce((
cd80: 53 45 4c 45 43 54 20 28 6d 61 78 28 74 6e 6f 29  SELECT (max(tno)
cd90: 2b 31 30 30 29 2f 31 30 20 46 52 4f 4d 20 73 65  +100)/10 FROM se
cda0: 6c 66 74 65 73 74 29 2c 31 30 29 2c 5c 6e 22 0a  lftest),10),\n".
cdb0: 20 20 20 20 22 20 20 20 20 20 20 20 20 20 27 6d      "         'm
cdc0: 65 6d 6f 27 2c 27 54 65 73 74 73 20 67 65 6e 65  emo','Tests gene
cdd0: 72 61 74 65 64 20 62 79 20 2d 2d 69 6e 69 74 27  rated by --init'
cde0: 29 3b 5c 6e 22 0a 20 20 20 20 22 49 4e 53 45 52  );\n".    "INSER
cdf0: 54 20 49 4e 54 4f 20 5b 5f 73 68 65 6c 6c 24 73  T INTO [_shell$s
ce00: 65 6c 66 5d 5c 6e 22 0a 20 20 20 20 22 20 20 53  elf]\n".    "  S
ce10: 45 4c 45 43 54 20 27 72 75 6e 27 2c 5c 6e 22 0a  ELECT 'run',\n".
ce20: 20 20 20 20 22 20 20 20 20 27 53 45 4c 45 43 54      "    'SELECT
ce30: 20 68 65 78 28 73 68 61 33 5f 71 75 65 72 79 28   hex(sha3_query(
ce40: 27 27 53 45 4c 45 43 54 20 74 79 70 65 2c 6e 61  ''SELECT type,na
ce50: 6d 65 2c 74 62 6c 5f 6e 61 6d 65 2c 73 71 6c 20  me,tbl_name,sql 
ce60: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
ce70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce80: 20 20 20 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f     "FROM sqlite_
ce90: 6d 61 73 74 65 72 20 4f 52 44 45 52 20 42 59 20  master ORDER BY 
cea0: 32 27 27 2c 32 32 34 29 29 27 2c 5c 6e 22 0a 20  2'',224))',\n". 
ceb0: 20 20 20 22 20 20 20 20 68 65 78 28 73 68 61 33     "    hex(sha3
cec0: 5f 71 75 65 72 79 28 27 53 45 4c 45 43 54 20 74  _query('SELECT t
ced0: 79 70 65 2c 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d  ype,name,tbl_nam
cee0: 65 2c 73 71 6c 20 22 0a 20 20 20 20 20 20 20 20  e,sql ".        
cef0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf00: 20 20 22 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d    "FROM sqlite_m
cf10: 61 73 74 65 72 20 4f 52 44 45 52 20 42 59 20 32  aster ORDER BY 2
cf20: 27 2c 32 32 34 29 29 3b 5c 6e 22 0a 20 20 20 20  ',224));\n".    
cf30: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73  "INSERT INTO [_s
cf40: 68 65 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20 20  hell$self]\n".  
cf50: 20 20 22 20 20 53 45 4c 45 43 54 20 27 72 75 6e    "  SELECT 'run
cf60: 27 2c 22 0a 20 20 20 20 22 20 20 20 20 27 53 45  ',".    "    'SE
cf70: 4c 45 43 54 20 68 65 78 28 73 68 61 33 5f 71 75  LECT hex(sha3_qu
cf80: 65 72 79 28 27 27 53 45 4c 45 43 54 20 2a 20 46  ery(''SELECT * F
cf90: 52 4f 4d 20 5c 22 27 20 7c 7c 22 0a 20 20 20 20  ROM \"' ||".    
cfa0: 22 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28  "        printf(
cfb0: 27 25 77 27 2c 6e 61 6d 65 29 20 7c 7c 20 27 5c  '%w',name) || '\
cfc0: 22 20 4e 4f 54 20 49 4e 44 45 58 45 44 27 27 2c  " NOT INDEXED'',
cfd0: 32 32 34 29 29 27 2c 5c 6e 22 0a 20 20 20 20 22  224))',\n".    "
cfe0: 20 20 20 20 68 65 78 28 73 68 61 33 5f 71 75 65      hex(sha3_que
cff0: 72 79 28 70 72 69 6e 74 66 28 27 53 45 4c 45 43  ry(printf('SELEC
d000: 54 20 2a 20 46 52 4f 4d 20 5c 22 25 77 5c 22 20  T * FROM \"%w\" 
d010: 4e 4f 54 20 49 4e 44 45 58 45 44 27 2c 6e 61 6d  NOT INDEXED',nam
d020: 65 29 2c 32 32 34 29 29 5c 6e 22 0a 20 20 20 20  e),224))\n".    
d030: 22 20 20 46 52 4f 4d 20 28 5c 6e 22 0a 20 20 20  "  FROM (\n".   
d040: 20 22 20 20 20 20 53 45 4c 45 43 54 20 6e 61 6d   "    SELECT nam
d050: 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61  e FROM sqlite_ma
d060: 73 74 65 72 5c 6e 22 0a 20 20 20 20 22 20 20 20  ster\n".    "   
d070: 20 20 57 48 45 52 45 20 74 79 70 65 3d 27 74 61    WHERE type='ta
d080: 62 6c 65 27 5c 6e 22 0a 20 20 20 20 22 20 20 20  ble'\n".    "   
d090: 20 20 20 20 41 4e 44 20 6e 61 6d 65 3c 3e 27 73      AND name<>'s
d0a0: 65 6c 66 74 65 73 74 27 5c 6e 22 0a 20 20 20 20  elftest'\n".    
d0b0: 22 20 20 20 20 20 20 20 41 4e 44 20 63 6f 61 6c  "       AND coal
d0c0: 65 73 63 65 28 72 6f 6f 74 70 61 67 65 2c 30 29  esce(rootpage,0)
d0d0: 3e 30 5c 6e 22 0a 20 20 20 20 22 20 20 29 5c 6e  >0\n".    "  )\n
d0e0: 22 0a 20 20 20 20 22 20 4f 52 44 45 52 20 42 59  ".    " ORDER BY
d0f0: 20 6e 61 6d 65 3b 5c 6e 22 0a 20 20 20 20 22 49   name;\n".    "I
d100: 4e 53 45 52 54 20 49 4e 54 4f 20 5b 5f 73 68 65  NSERT INTO [_she
d110: 6c 6c 24 73 65 6c 66 5d 5c 6e 22 0a 20 20 20 20  ll$self]\n".    
d120: 22 20 20 56 41 4c 55 45 53 28 27 72 75 6e 27 2c  "  VALUES('run',
d130: 27 50 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74  'PRAGMA integrit
d140: 79 5f 63 68 65 63 6b 27 2c 27 6f 6b 27 29 3b 5c  y_check','ok');\
d150: 6e 22 0a 20 20 20 20 22 49 4e 53 45 52 54 20 49  n".    "INSERT I
d160: 4e 54 4f 20 73 65 6c 66 74 65 73 74 28 74 6e 6f  NTO selftest(tno
d170: 2c 6f 70 2c 63 6d 64 2c 61 6e 73 29 22 0a 20 20  ,op,cmd,ans)".  
d180: 20 20 22 20 20 53 45 4c 45 43 54 20 72 6f 77 69    "  SELECT rowi
d190: 64 2a 31 30 2c 6f 70 2c 63 6d 64 2c 61 6e 73 20  d*10,op,cmd,ans 
d1a0: 46 52 4f 4d 20 5b 5f 73 68 65 6c 6c 24 73 65 6c  FROM [_shell$sel
d1b0: 66 5d 3b 5c 6e 22 0a 20 20 20 20 22 44 52 4f 50  f];\n".    "DROP
d1c0: 20 54 41 42 4c 45 20 5b 5f 73 68 65 6c 6c 24 73   TABLE [_shell$s
d1d0: 65 6c 66 5d 3b 22 0a 20 20 20 20 2c 30 2c 30 2c  elf];".    ,0,0,
d1e0: 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 69 66 28  &zErrMsg);.  if(
d1f0: 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20 20 20   zErrMsg ){.    
d200: 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
d210: 72 72 2c 20 22 53 45 4c 46 54 45 53 54 20 69 6e  rr, "SELFTEST in
d220: 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 61 69  itialization fai
d230: 6c 75 72 65 3a 20 25 73 5c 6e 22 2c 20 7a 45 72  lure: %s\n", zEr
d240: 72 4d 73 67 29 3b 0a 20 20 20 20 73 71 6c 69 74  rMsg);.    sqlit
d250: 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67 29  e3_free(zErrMsg)
d260: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  ;.  }.  sqlite3_
d270: 65 78 65 63 28 70 2d 3e 64 62 2c 20 22 52 45 4c  exec(p->db, "REL
d280: 45 41 53 45 20 73 65 6c 66 74 65 73 74 5f 69 6e  EASE selftest_in
d290: 69 74 22 2c 30 2c 30 2c 30 29 3b 0a 7d 0a 0a 0a  it",0,0,0);.}...
d2a0: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 64 65  /*.** Set the de
d2b0: 73 74 69 6e 61 74 69 6f 6e 20 74 61 62 6c 65 20  stination table 
d2c0: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 53 68 65  field of the She
d2d0: 6c 6c 53 74 61 74 65 20 73 74 72 75 63 74 75 72  llState structur
d2e0: 65 20 74 6f 0a 2a 2a 20 74 68 65 20 6e 61 6d 65  e to.** the name
d2f0: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 67 69   of the table gi
d300: 76 65 6e 2e 20 20 45 73 63 61 70 65 20 61 6e 79  ven.  Escape any
d310: 20 71 75 6f 74 65 20 63 68 61 72 61 63 74 65 72   quote character
d320: 73 20 69 6e 20 74 68 65 0a 2a 2a 20 74 61 62 6c  s in the.** tabl
d330: 65 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  e name..*/.stati
d340: 63 20 76 6f 69 64 20 73 65 74 5f 74 61 62 6c 65  c void set_table
d350: 5f 6e 61 6d 65 28 53 68 65 6c 6c 53 74 61 74 65  _name(ShellState
d360: 20 2a 70 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *p, const char 
d370: 2a 7a 4e 61 6d 65 29 7b 0a 20 20 69 6e 74 20 69  *zName){.  int i
d380: 2c 20 6e 3b 0a 20 20 63 68 61 72 20 63 51 75 6f  , n;.  char cQuo
d390: 74 65 3b 0a 20 20 63 68 61 72 20 2a 7a 3b 0a 0a  te;.  char *z;..
d3a0: 20 20 69 66 28 20 70 2d 3e 7a 44 65 73 74 54 61    if( p->zDestTa
d3b0: 62 6c 65 20 29 7b 0a 20 20 20 20 66 72 65 65 28  ble ){.    free(
d3c0: 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 29 3b 0a  p->zDestTable);.
d3d0: 20 20 20 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c      p->zDestTabl
d3e0: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  e = 0;.  }.  if(
d3f0: 20 7a 4e 61 6d 65 3d 3d 30 20 29 20 72 65 74 75   zName==0 ) retu
d400: 72 6e 3b 0a 20 20 63 51 75 6f 74 65 20 3d 20 71  rn;.  cQuote = q
d410: 75 6f 74 65 43 68 61 72 28 7a 4e 61 6d 65 29 3b  uoteChar(zName);
d420: 0a 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28  .  n = strlen30(
d430: 7a 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20 63 51  zName);.  if( cQ
d440: 75 6f 74 65 20 29 20 6e 20 2b 3d 20 6e 2b 32 3b  uote ) n += n+2;
d450: 0a 20 20 7a 20 3d 20 70 2d 3e 7a 44 65 73 74 54  .  z = p->zDestT
d460: 61 62 6c 65 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e  able = malloc( n
d470: 2b 31 20 29 3b 0a 20 20 69 66 28 20 7a 3d 3d 30  +1 );.  if( z==0
d480: 20 29 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e   ){.    raw_prin
d490: 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f 72  tf(stderr,"Error
d4a0: 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c  : out of memory\
d4b0: 6e 22 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29  n");.    exit(1)
d4c0: 3b 0a 20 20 7d 0a 20 20 6e 20 3d 20 30 3b 0a 20  ;.  }.  n = 0;. 
d4d0: 20 69 66 28 20 63 51 75 6f 74 65 20 29 20 7a 5b   if( cQuote ) z[
d4e0: 6e 2b 2b 5d 20 3d 20 63 51 75 6f 74 65 3b 0a 20  n++] = cQuote;. 
d4f0: 20 66 6f 72 28 69 3d 30 3b 20 7a 4e 61 6d 65 5b   for(i=0; zName[
d500: 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 7a 5b  i]; i++){.    z[
d510: 6e 2b 2b 5d 20 3d 20 7a 4e 61 6d 65 5b 69 5d 3b  n++] = zName[i];
d520: 0a 20 20 20 20 69 66 28 20 7a 4e 61 6d 65 5b 69  .    if( zName[i
d530: 5d 3d 3d 63 51 75 6f 74 65 20 29 20 7a 5b 6e 2b  ]==cQuote ) z[n+
d540: 2b 5d 20 3d 20 63 51 75 6f 74 65 3b 0a 20 20 7d  +] = cQuote;.  }
d550: 0a 20 20 69 66 28 20 63 51 75 6f 74 65 20 29 20  .  if( cQuote ) 
d560: 7a 5b 6e 2b 2b 5d 20 3d 20 63 51 75 6f 74 65 3b  z[n++] = cQuote;
d570: 0a 20 20 7a 5b 6e 5d 20 3d 20 30 3b 0a 7d 0a 0a  .  z[n] = 0;.}..
d580: 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75 74 65 20 61  ./*.** Execute a
d590: 20 71 75 65 72 79 20 73 74 61 74 65 6d 65 6e 74   query statement
d5a0: 20 74 68 61 74 20 77 69 6c 6c 20 67 65 6e 65 72   that will gener
d5b0: 61 74 65 20 53 51 4c 20 6f 75 74 70 75 74 2e 20  ate SQL output. 
d5c0: 20 50 72 69 6e 74 0a 2a 2a 20 74 68 65 20 72 65   Print.** the re
d5d0: 73 75 6c 74 20 63 6f 6c 75 6d 6e 73 2c 20 63 6f  sult columns, co
d5e0: 6d 6d 61 2d 73 65 70 61 72 61 74 65 64 2c 20 6f  mma-separated, o
d5f0: 6e 20 61 20 6c 69 6e 65 20 61 6e 64 20 74 68 65  n a line and the
d600: 6e 20 61 64 64 20 61 0a 2a 2a 20 73 65 6d 69 63  n add a.** semic
d610: 6f 6c 6f 6e 20 74 65 72 6d 69 6e 61 74 6f 72 20  olon terminator 
d620: 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68  to the end of th
d630: 61 74 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 49  at line..**.** I
d640: 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
d650: 63 6f 6c 75 6d 6e 73 20 69 73 20 31 20 61 6e 64  columns is 1 and
d660: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 63 6f 6e   that column con
d670: 74 61 69 6e 73 20 74 65 78 74 20 22 2d 2d 22 0a  tains text "--".
d680: 2a 2a 20 74 68 65 6e 20 77 72 69 74 65 20 74 68  ** then write th
d690: 65 20 73 65 6d 69 63 6f 6c 6f 6e 20 6f 6e 20 61  e semicolon on a
d6a0: 20 73 65 70 61 72 61 74 65 20 6c 69 6e 65 2e 20   separate line. 
d6b0: 20 54 68 61 74 20 77 61 79 2c 20 69 66 20 61 0a   That way, if a.
d6c0: 2a 2a 20 22 2d 2d 22 20 63 6f 6d 6d 65 6e 74 20  ** "--" comment 
d6d0: 6f 63 63 75 72 73 20 61 74 20 74 68 65 20 65 6e  occurs at the en
d6e0: 64 20 6f 66 20 74 68 65 20 73 74 61 74 65 6d 65  d of the stateme
d6f0: 6e 74 2c 20 74 68 65 20 63 6f 6d 6d 65 6e 74 0a  nt, the comment.
d700: 2a 2a 20 77 6f 6e 27 74 20 63 6f 6e 73 75 6d 65  ** won't consume
d710: 20 74 68 65 20 73 65 6d 69 63 6f 6c 6f 6e 20 74   the semicolon t
d720: 65 72 6d 69 6e 61 74 6f 72 2e 0a 2a 2f 0a 73 74  erminator..*/.st
d730: 61 74 69 63 20 69 6e 74 20 72 75 6e 5f 74 61 62  atic int run_tab
d740: 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28 0a 20  le_dump_query(. 
d750: 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20   ShellState *p, 
d760: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 65            /* Que
d770: 72 79 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ry context */.  
d780: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 65 6c  const char *zSel
d790: 65 63 74 2c 20 20 20 20 20 2f 2a 20 53 45 4c 45  ect,     /* SELE
d7a0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20  CT statement to 
d7b0: 65 78 74 72 61 63 74 20 63 6f 6e 74 65 6e 74 20  extract content 
d7c0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
d7d0: 2a 7a 46 69 72 73 74 52 6f 77 20 20 20 20 2f 2a  *zFirstRow    /*
d7e0: 20 50 72 69 6e 74 20 62 65 66 6f 72 65 20 66 69   Print before fi
d7f0: 72 73 74 20 72 6f 77 2c 20 69 66 20 6e 6f 74 20  rst row, if not 
d800: 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  NULL */.){.  sql
d810: 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 65 6c 65  ite3_stmt *pSele
d820: 63 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  ct;.  int rc;.  
d830: 69 6e 74 20 6e 52 65 73 75 6c 74 3b 0a 20 20 69  int nResult;.  i
d840: 6e 74 20 69 3b 0a 20 20 63 6f 6e 73 74 20 63 68  nt i;.  const ch
d850: 61 72 20 2a 7a 3b 0a 20 20 72 63 20 3d 20 73 71  ar *z;.  rc = sq
d860: 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
d870: 28 70 2d 3e 64 62 2c 20 7a 53 65 6c 65 63 74 2c  (p->db, zSelect,
d880: 20 2d 31 2c 20 26 70 53 65 6c 65 63 74 2c 20 30   -1, &pSelect, 0
d890: 29 3b 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c  );.  if( rc!=SQL
d8a0: 49 54 45 5f 4f 4b 20 7c 7c 20 21 70 53 65 6c 65  ITE_OK || !pSele
d8b0: 63 74 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  ct ){.    utf8_p
d8c0: 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2f  rintf(p->out, "/
d8d0: 2a 2a 2a 2a 20 45 52 52 4f 52 3a 20 28 25 64 29  **** ERROR: (%d)
d8e0: 20 25 73 20 2a 2a 2a 2a 2a 2f 5c 6e 22 2c 20 72   %s *****/\n", r
d8f0: 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  c,.             
d900: 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73     sqlite3_errms
d910: 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 69  g(p->db));.    i
d920: 66 28 20 28 72 63 26 30 78 66 66 29 21 3d 53 51  f( (rc&0xff)!=SQ
d930: 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29 20 70  LITE_CORRUPT ) p
d940: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 72 65  ->nErr++;.    re
d950: 74 75 72 6e 20 72 63 3b 0a 20 20 7d 0a 20 20 72  turn rc;.  }.  r
d960: 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
d970: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 6e 52 65  (pSelect);.  nRe
d980: 73 75 6c 74 20 3d 20 73 71 6c 69 74 65 33 5f 63  sult = sqlite3_c
d990: 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 53 65 6c  olumn_count(pSel
d9a0: 65 63 74 29 3b 0a 20 20 77 68 69 6c 65 28 20 72  ect);.  while( r
d9b0: 63 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  c==SQLITE_ROW ){
d9c0: 0a 20 20 20 20 69 66 28 20 7a 46 69 72 73 74 52  .    if( zFirstR
d9d0: 6f 77 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  ow ){.      utf8
d9e0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
d9f0: 22 25 73 22 2c 20 7a 46 69 72 73 74 52 6f 77 29  "%s", zFirstRow)
da00: 3b 0a 20 20 20 20 20 20 7a 46 69 72 73 74 52 6f  ;.      zFirstRo
da10: 77 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  w = 0;.    }.   
da20: 20 7a 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72   z = (const char
da30: 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
da40: 5f 74 65 78 74 28 70 53 65 6c 65 63 74 2c 20 30  _text(pSelect, 0
da50: 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  );.    utf8_prin
da60: 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c  tf(p->out, "%s",
da70: 20 7a 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 31   z);.    for(i=1
da80: 3b 20 69 3c 6e 52 65 73 75 6c 74 3b 20 69 2b 2b  ; i<nResult; i++
da90: 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
daa0: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 2c 25  intf(p->out, ",%
dab0: 73 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  s", sqlite3_colu
dac0: 6d 6e 5f 74 65 78 74 28 70 53 65 6c 65 63 74 2c  mn_text(pSelect,
dad0: 20 69 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20   i));.    }.    
dae0: 69 66 28 20 7a 3d 3d 30 20 29 20 7a 20 3d 20 22  if( z==0 ) z = "
daf0: 22 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 7a 5b  ";.    while( z[
db00: 30 5d 20 26 26 20 28 7a 5b 30 5d 21 3d 27 2d 27  0] && (z[0]!='-'
db10: 20 7c 7c 20 7a 5b 31 5d 21 3d 27 2d 27 29 20 29   || z[1]!='-') )
db20: 20 7a 2b 2b 3b 0a 20 20 20 20 69 66 28 20 7a 5b   z++;.    if( z[
db30: 30 5d 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  0] ){.      raw_
db40: 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
db50: 5c 6e 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d 65 6c  \n;\n");.    }el
db60: 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  se{.      raw_pr
db70: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 3b 5c  intf(p->out, ";\
db80: 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  n");.    }.    r
db90: 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
dba0: 28 70 53 65 6c 65 63 74 29 3b 0a 20 20 7d 0a 20  (pSelect);.  }. 
dbb0: 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69   rc = sqlite3_fi
dbc0: 6e 61 6c 69 7a 65 28 70 53 65 6c 65 63 74 29 3b  nalize(pSelect);
dbd0: 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
dbe0: 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 75 74 66 38  E_OK ){.    utf8
dbf0: 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
dc00: 22 2f 2a 2a 2a 2a 20 45 52 52 4f 52 3a 20 28 25  "/**** ERROR: (%
dc10: 64 29 20 25 73 20 2a 2a 2a 2a 2a 2f 5c 6e 22 2c  d) %s *****/\n",
dc20: 20 72 63 2c 0a 20 20 20 20 20 20 20 20 20 20 20   rc,.           
dc30: 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65 72 72       sqlite3_err
dc40: 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
dc50: 20 69 66 28 20 28 72 63 26 30 78 66 66 29 21 3d   if( (rc&0xff)!=
dc60: 53 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 20 29  SQLITE_CORRUPT )
dc70: 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a   p->nErr++;.  }.
dc80: 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
dc90: 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 73  /*.** Allocate s
dca0: 70 61 63 65 20 61 6e 64 20 73 61 76 65 20 6f 66  pace and save of
dcb0: 66 20 63 75 72 72 65 6e 74 20 65 72 72 6f 72 20  f current error 
dcc0: 73 74 72 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69  string..*/.stati
dcd0: 63 20 63 68 61 72 20 2a 73 61 76 65 5f 65 72 72  c char *save_err
dce0: 5f 6d 73 67 28 0a 20 20 73 71 6c 69 74 65 33 20  _msg(.  sqlite3 
dcf0: 2a 64 62 20 20 20 20 20 20 20 20 20 20 20 20 2f  *db            /
dd00: 2a 20 44 61 74 61 62 61 73 65 20 74 6f 20 71 75  * Database to qu
dd10: 65 72 79 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  ery */.){.  int 
dd20: 6e 45 72 72 4d 73 67 20 3d 20 31 2b 73 74 72 6c  nErrMsg = 1+strl
dd30: 65 6e 33 30 28 73 71 6c 69 74 65 33 5f 65 72 72  en30(sqlite3_err
dd40: 6d 73 67 28 64 62 29 29 3b 0a 20 20 63 68 61 72  msg(db));.  char
dd50: 20 2a 7a 45 72 72 4d 73 67 20 3d 20 73 71 6c 69   *zErrMsg = sqli
dd60: 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 6e 45 72  te3_malloc64(nEr
dd70: 72 4d 73 67 29 3b 0a 20 20 69 66 28 20 7a 45 72  rMsg);.  if( zEr
dd80: 72 4d 73 67 20 29 7b 0a 20 20 20 20 6d 65 6d 63  rMsg ){.    memc
dd90: 70 79 28 7a 45 72 72 4d 73 67 2c 20 73 71 6c 69  py(zErrMsg, sqli
dda0: 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29 2c 20  te3_errmsg(db), 
ddb0: 6e 45 72 72 4d 73 67 29 3b 0a 20 20 7d 0a 20 20  nErrMsg);.  }.  
ddc0: 72 65 74 75 72 6e 20 7a 45 72 72 4d 73 67 3b 0a  return zErrMsg;.
ddd0: 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 6c 69 6e 75  }..#ifdef __linu
dde0: 78 5f 5f 0a 2f 2a 0a 2a 2a 20 41 74 74 65 6d 70  x__./*.** Attemp
ddf0: 74 20 74 6f 20 64 69 73 70 6c 61 79 20 49 2f 4f  t to display I/O
de00: 20 73 74 61 74 73 20 6f 6e 20 4c 69 6e 75 78 20   stats on Linux 
de10: 75 73 69 6e 67 20 2f 70 72 6f 63 2f 50 49 44 2f  using /proc/PID/
de20: 69 6f 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  io.*/.static voi
de30: 64 20 64 69 73 70 6c 61 79 4c 69 6e 75 78 49 6f  d displayLinuxIo
de40: 53 74 61 74 73 28 46 49 4c 45 20 2a 6f 75 74 29  Stats(FILE *out)
de50: 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 3b 0a 20 20  {.  FILE *in;.  
de60: 63 68 61 72 20 7a 5b 32 30 30 5d 3b 0a 20 20 73  char z[200];.  s
de70: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
de80: 73 69 7a 65 6f 66 28 7a 29 2c 20 7a 2c 20 22 2f  sizeof(z), z, "/
de90: 70 72 6f 63 2f 25 64 2f 69 6f 22 2c 20 67 65 74  proc/%d/io", get
dea0: 70 69 64 28 29 29 3b 0a 20 20 69 6e 20 3d 20 66  pid());.  in = f
deb0: 6f 70 65 6e 28 7a 2c 20 22 72 62 22 29 3b 0a 20  open(z, "rb");. 
dec0: 20 69 66 28 20 69 6e 3d 3d 30 20 29 20 72 65 74   if( in==0 ) ret
ded0: 75 72 6e 3b 0a 20 20 77 68 69 6c 65 28 20 66 67  urn;.  while( fg
dee0: 65 74 73 28 7a 2c 20 73 69 7a 65 6f 66 28 7a 29  ets(z, sizeof(z)
def0: 2c 20 69 6e 29 21 3d 30 20 29 7b 0a 20 20 20 20  , in)!=0 ){.    
df00: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74 72  static const str
df10: 75 63 74 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73  uct {.      cons
df20: 74 20 63 68 61 72 20 2a 7a 50 61 74 74 65 72 6e  t char *zPattern
df30: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
df40: 61 72 20 2a 7a 44 65 73 63 3b 0a 20 20 20 20 7d  ar *zDesc;.    }
df50: 20 61 54 72 61 6e 73 5b 5d 20 3d 20 7b 0a 20 20   aTrans[] = {.  
df60: 20 20 20 20 7b 20 22 72 63 68 61 72 3a 20 22 2c      { "rchar: ",
df70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
df80: 20 20 22 42 79 74 65 73 20 72 65 63 65 69 76 65    "Bytes receive
df90: 64 20 62 79 20 72 65 61 64 28 29 3a 22 20 7d 2c  d by read():" },
dfa0: 0a 20 20 20 20 20 20 7b 20 22 77 63 68 61 72 3a  .      { "wchar:
dfb0: 20 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20   ",             
dfc0: 20 20 20 20 20 22 42 79 74 65 73 20 73 65 6e 74       "Bytes sent
dfd0: 20 74 6f 20 77 72 69 74 65 28 29 3a 22 20 20 20   to write():"   
dfe0: 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 73 79 73   },.      { "sys
dff0: 63 72 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20  cr: ",          
e000: 20 20 20 20 20 20 20 20 22 52 65 61 64 28 29 20          "Read() 
e010: 73 79 73 74 65 6d 20 63 61 6c 6c 73 3a 22 20 20  system calls:"  
e020: 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
e030: 73 79 73 63 77 3a 20 22 2c 20 20 20 20 20 20 20  syscw: ",       
e040: 20 20 20 20 20 20 20 20 20 20 20 22 57 72 69 74             "Writ
e050: 65 28 29 20 73 79 73 74 65 6d 20 63 61 6c 6c 73  e() system calls
e060: 3a 22 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20  :"     },.      
e070: 7b 20 22 72 65 61 64 5f 62 79 74 65 73 3a 20 22  { "read_bytes: "
e080: 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 22 42  ,             "B
e090: 79 74 65 73 20 72 65 61 64 20 66 72 6f 6d 20 73  ytes read from s
e0a0: 74 6f 72 61 67 65 3a 22 20 20 7d 2c 0a 20 20 20  torage:"  },.   
e0b0: 20 20 20 7b 20 22 77 72 69 74 65 5f 62 79 74 65     { "write_byte
e0c0: 73 3a 20 22 2c 20 20 20 20 20 20 20 20 20 20 20  s: ",           
e0d0: 20 22 42 79 74 65 73 20 77 72 69 74 74 65 6e 20   "Bytes written 
e0e0: 74 6f 20 73 74 6f 72 61 67 65 3a 22 20 7d 2c 0a  to storage:" },.
e0f0: 20 20 20 20 20 20 7b 20 22 63 61 6e 63 65 6c 6c        { "cancell
e100: 65 64 5f 77 72 69 74 65 5f 62 79 74 65 73 3a 20  ed_write_bytes: 
e110: 22 2c 20 20 22 43 61 6e 63 65 6c 6c 65 64 20 77  ",  "Cancelled w
e120: 72 69 74 65 20 62 79 74 65 73 3a 22 20 20 20 20  rite bytes:"    
e130: 7d 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e  },.    };.    in
e140: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
e150: 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 54  ; i<ArraySize(aT
e160: 72 61 6e 73 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  rans); i++){.   
e170: 20 20 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29     int n = (int)
e180: 73 74 72 6c 65 6e 28 61 54 72 61 6e 73 5b 69 5d  strlen(aTrans[i]
e190: 2e 7a 50 61 74 74 65 72 6e 29 3b 0a 20 20 20 20  .zPattern);.    
e1a0: 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28 61 54    if( strncmp(aT
e1b0: 72 61 6e 73 5b 69 5d 2e 7a 50 61 74 74 65 72 6e  rans[i].zPattern
e1c0: 2c 20 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  , z, n)==0 ){.  
e1d0: 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
e1e0: 66 28 6f 75 74 2c 20 22 25 2d 33 36 73 20 25 73  f(out, "%-36s %s
e1f0: 22 2c 20 61 54 72 61 6e 73 5b 69 5d 2e 7a 44 65  ", aTrans[i].zDe
e200: 73 63 2c 20 26 7a 5b 6e 5d 29 3b 0a 20 20 20 20  sc, &z[n]);.    
e210: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
e220: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66   }.    }.  }.  f
e230: 63 6c 6f 73 65 28 69 6e 29 3b 0a 7d 0a 23 65 6e  close(in);.}.#en
e240: 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 44 69 73 70 6c  dif../*.** Displ
e250: 61 79 20 61 20 73 69 6e 67 6c 65 20 6c 69 6e 65  ay a single line
e260: 20 6f 66 20 73 74 61 74 75 73 20 75 73 69 6e 67   of status using
e270: 20 36 34 2d 62 69 74 20 76 61 6c 75 65 73 2e 0a   64-bit values..
e280: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 64  */.static void d
e290: 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 0a  isplayStatLine(.
e2a0: 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c    ShellState *p,
e2b0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e2c0: 68 65 20 73 68 65 6c 6c 20 63 6f 6e 74 65 78 74  he shell context
e2d0: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 4c 61 62   */.  char *zLab
e2e0: 65 6c 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  el,             
e2f0: 2f 2a 20 4c 61 62 65 6c 20 66 6f 72 20 74 68 69  /* Label for thi
e300: 73 20 6f 6e 65 20 6c 69 6e 65 20 2a 2f 0a 20 20  s one line */.  
e310: 63 68 61 72 20 2a 7a 46 6f 72 6d 61 74 2c 20 20  char *zFormat,  
e320: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
e330: 6d 61 74 20 66 6f 72 20 74 68 65 20 72 65 73 75  mat for the resu
e340: 6c 74 20 2a 2f 0a 20 20 69 6e 74 20 69 53 74 61  lt */.  int iSta
e350: 74 75 73 43 74 72 6c 2c 20 20 20 20 20 20 20 20  tusCtrl,        
e360: 20 20 2f 2a 20 57 68 69 63 68 20 73 74 61 74 75    /* Which statu
e370: 73 20 74 6f 20 64 69 73 70 6c 61 79 20 2a 2f 0a  s to display */.
e380: 20 20 69 6e 74 20 62 52 65 73 65 74 20 20 20 20    int bReset    
e390: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
e3a0: 72 75 65 20 74 6f 20 72 65 73 65 74 20 74 68 65  rue to reset the
e3b0: 20 73 74 61 74 73 20 2a 2f 0a 29 7b 0a 20 20 73   stats */.){.  s
e3c0: 71 6c 69 74 65 33 5f 69 6e 74 36 34 20 69 43 75  qlite3_int64 iCu
e3d0: 72 20 3d 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65  r = -1;.  sqlite
e3e0: 33 5f 69 6e 74 36 34 20 69 48 69 77 74 72 20 3d  3_int64 iHiwtr =
e3f0: 20 2d 31 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 50   -1;.  int i, nP
e400: 65 72 63 65 6e 74 3b 0a 20 20 63 68 61 72 20 7a  ercent;.  char z
e410: 4c 69 6e 65 5b 32 30 30 5d 3b 0a 20 20 73 71 6c  Line[200];.  sql
e420: 69 74 65 33 5f 73 74 61 74 75 73 36 34 28 69 53  ite3_status64(iS
e430: 74 61 74 75 73 43 74 72 6c 2c 20 26 69 43 75 72  tatusCtrl, &iCur
e440: 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65  , &iHiwtr, bRese
e450: 74 29 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 6e  t);.  for(i=0, n
e460: 50 65 72 63 65 6e 74 3d 30 3b 20 7a 46 6f 72 6d  Percent=0; zForm
e470: 61 74 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  at[i]; i++){.   
e480: 20 69 66 28 20 7a 46 6f 72 6d 61 74 5b 69 5d 3d   if( zFormat[i]=
e490: 3d 27 25 27 20 29 20 6e 50 65 72 63 65 6e 74 2b  ='%' ) nPercent+
e4a0: 2b 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6e 50 65  +;.  }.  if( nPe
e4b0: 72 63 65 6e 74 3e 31 20 29 7b 0a 20 20 20 20 73  rcent>1 ){.    s
e4c0: 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
e4d0: 73 69 7a 65 6f 66 28 7a 4c 69 6e 65 29 2c 20 7a  sizeof(zLine), z
e4e0: 4c 69 6e 65 2c 20 7a 46 6f 72 6d 61 74 2c 20 69  Line, zFormat, i
e4f0: 43 75 72 2c 20 69 48 69 77 74 72 29 3b 0a 20 20  Cur, iHiwtr);.  
e500: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
e510: 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
e520: 6f 66 28 7a 4c 69 6e 65 29 2c 20 7a 4c 69 6e 65  of(zLine), zLine
e530: 2c 20 7a 46 6f 72 6d 61 74 2c 20 69 48 69 77 74  , zFormat, iHiwt
e540: 72 29 3b 0a 20 20 7d 0a 20 20 72 61 77 5f 70 72  r);.  }.  raw_pr
e550: 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d  intf(p->out, "%-
e560: 33 36 73 20 25 73 5c 6e 22 2c 20 7a 4c 61 62 65  36s %s\n", zLabe
e570: 6c 2c 20 7a 4c 69 6e 65 29 3b 0a 7d 0a 0a 2f 2a  l, zLine);.}../*
e580: 0a 2a 2a 20 44 69 73 70 6c 61 79 20 6d 65 6d 6f  .** Display memo
e590: 72 79 20 73 74 61 74 73 2e 0a 2a 2f 0a 73 74 61  ry stats..*/.sta
e5a0: 74 69 63 20 69 6e 74 20 64 69 73 70 6c 61 79 5f  tic int display_
e5b0: 73 74 61 74 73 28 0a 20 20 73 71 6c 69 74 65 33  stats(.  sqlite3
e5c0: 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20 20   *db,           
e5d0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
e5e0: 20 74 6f 20 71 75 65 72 79 20 2a 2f 0a 20 20 53   to query */.  S
e5f0: 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 2c  hellState *pArg,
e600: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
e610: 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53 74  inter to ShellSt
e620: 61 74 65 20 2a 2f 0a 20 20 69 6e 74 20 62 52 65  ate */.  int bRe
e630: 73 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20  set             
e640: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f 20       /* True to 
e650: 72 65 73 65 74 20 74 68 65 20 73 74 61 74 73 20  reset the stats 
e660: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 43 75 72  */.){.  int iCur
e670: 3b 0a 20 20 69 6e 74 20 69 48 69 77 74 72 3b 0a  ;.  int iHiwtr;.
e680: 0a 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70  .  if( pArg && p
e690: 41 72 67 2d 3e 6f 75 74 20 29 7b 0a 20 20 20 20  Arg->out ){.    
e6a0: 64 69 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28  displayStatLine(
e6b0: 70 41 72 67 2c 20 22 4d 65 6d 6f 72 79 20 55 73  pArg, "Memory Us
e6c0: 65 64 3a 22 2c 0a 20 20 20 20 20 20 20 22 25 6c  ed:",.       "%l
e6d0: 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 20 62 79  ld (max %lld) by
e6e0: 74 65 73 22 2c 20 53 51 4c 49 54 45 5f 53 54 41  tes", SQLITE_STA
e6f0: 54 55 53 5f 4d 45 4d 4f 52 59 5f 55 53 45 44 2c  TUS_MEMORY_USED,
e700: 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 64 69   bReset);.    di
e710: 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41  splayStatLine(pA
e720: 72 67 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 4f  rg, "Number of O
e730: 75 74 73 74 61 6e 64 69 6e 67 20 41 6c 6c 6f 63  utstanding Alloc
e740: 61 74 69 6f 6e 73 3a 22 2c 0a 20 20 20 20 20 20  ations:",.      
e750: 20 22 25 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64   "%lld (max %lld
e760: 29 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55  )", SQLITE_STATU
e770: 53 5f 4d 41 4c 4c 4f 43 5f 43 4f 55 4e 54 2c 20  S_MALLOC_COUNT, 
e780: 62 52 65 73 65 74 29 3b 0a 20 20 20 20 69 66 28  bReset);.    if(
e790: 20 70 41 72 67 2d 3e 73 68 65 6c 6c 46 6c 67 73   pArg->shellFlgs
e7a0: 20 26 20 53 48 46 4c 47 5f 50 61 67 65 63 61 63   & SHFLG_Pagecac
e7b0: 68 65 20 29 7b 0a 20 20 20 20 20 20 64 69 73 70  he ){.      disp
e7c0: 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41 72 67  layStatLine(pArg
e7d0: 2c 20 22 4e 75 6d 62 65 72 20 6f 66 20 50 63 61  , "Number of Pca
e7e0: 63 68 65 20 50 61 67 65 73 20 55 73 65 64 3a 22  che Pages Used:"
e7f0: 2c 0a 20 20 20 20 20 20 20 20 20 22 25 6c 6c 64  ,.         "%lld
e800: 20 28 6d 61 78 20 25 6c 6c 64 29 20 70 61 67 65   (max %lld) page
e810: 73 22 2c 20 53 51 4c 49 54 45 5f 53 54 41 54 55  s", SQLITE_STATU
e820: 53 5f 50 41 47 45 43 41 43 48 45 5f 55 53 45 44  S_PAGECACHE_USED
e830: 2c 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 7d  , bReset);.    }
e840: 0a 20 20 20 20 64 69 73 70 6c 61 79 53 74 61 74  .    displayStat
e850: 4c 69 6e 65 28 70 41 72 67 2c 20 22 4e 75 6d 62  Line(pArg, "Numb
e860: 65 72 20 6f 66 20 50 63 61 63 68 65 20 4f 76 65  er of Pcache Ove
e870: 72 66 6c 6f 77 20 42 79 74 65 73 3a 22 2c 0a 20  rflow Bytes:",. 
e880: 20 20 20 20 20 20 22 25 6c 6c 64 20 28 6d 61 78        "%lld (max
e890: 20 25 6c 6c 64 29 20 62 79 74 65 73 22 2c 20 53   %lld) bytes", S
e8a0: 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50 41 47  QLITE_STATUS_PAG
e8b0: 45 43 41 43 48 45 5f 4f 56 45 52 46 4c 4f 57 2c  ECACHE_OVERFLOW,
e8c0: 20 62 52 65 73 65 74 29 3b 0a 20 20 20 20 64 69   bReset);.    di
e8d0: 73 70 6c 61 79 53 74 61 74 4c 69 6e 65 28 70 41  splayStatLine(pA
e8e0: 72 67 2c 20 22 4c 61 72 67 65 73 74 20 41 6c 6c  rg, "Largest All
e8f0: 6f 63 61 74 69 6f 6e 3a 22 2c 0a 20 20 20 20 20  ocation:",.     
e900: 20 20 22 25 6c 6c 64 20 62 79 74 65 73 22 2c 20    "%lld bytes", 
e910: 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 4d 41  SQLITE_STATUS_MA
e920: 4c 4c 4f 43 5f 53 49 5a 45 2c 20 62 52 65 73 65  LLOC_SIZE, bRese
e930: 74 29 3b 0a 20 20 20 20 64 69 73 70 6c 61 79 53  t);.    displayS
e940: 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 4c  tatLine(pArg, "L
e950: 61 72 67 65 73 74 20 50 63 61 63 68 65 20 41 6c  argest Pcache Al
e960: 6c 6f 63 61 74 69 6f 6e 3a 22 2c 0a 20 20 20 20  location:",.    
e970: 20 20 20 22 25 6c 6c 64 20 62 79 74 65 73 22 2c     "%lld bytes",
e980: 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50   SQLITE_STATUS_P
e990: 41 47 45 43 41 43 48 45 5f 53 49 5a 45 2c 20 62  AGECACHE_SIZE, b
e9a0: 52 65 73 65 74 29 3b 0a 23 69 66 64 65 66 20 59  Reset);.#ifdef Y
e9b0: 59 54 52 41 43 4b 4d 41 58 53 54 41 43 4b 44 45  YTRACKMAXSTACKDE
e9c0: 50 54 48 0a 20 20 20 20 64 69 73 70 6c 61 79 53  PTH.    displayS
e9d0: 74 61 74 4c 69 6e 65 28 70 41 72 67 2c 20 22 44  tatLine(pArg, "D
e9e0: 65 65 70 65 73 74 20 50 61 72 73 65 72 20 53 74  eepest Parser St
e9f0: 61 63 6b 3a 22 2c 0a 20 20 20 20 20 20 20 22 25  ack:",.       "%
ea00: 6c 6c 64 20 28 6d 61 78 20 25 6c 6c 64 29 22 2c  lld (max %lld)",
ea10: 20 53 51 4c 49 54 45 5f 53 54 41 54 55 53 5f 50   SQLITE_STATUS_P
ea20: 41 52 53 45 52 5f 53 54 41 43 4b 2c 20 62 52 65  ARSER_STACK, bRe
ea30: 73 65 74 29 3b 0a 23 65 6e 64 69 66 0a 20 20 7d  set);.#endif.  }
ea40: 0a 0a 20 20 69 66 28 20 70 41 72 67 20 26 26 20  ..  if( pArg && 
ea50: 70 41 72 67 2d 3e 6f 75 74 20 26 26 20 64 62 20  pArg->out && db 
ea60: 29 7b 0a 20 20 20 20 69 66 28 20 70 41 72 67 2d  ){.    if( pArg-
ea70: 3e 73 68 65 6c 6c 46 6c 67 73 20 26 20 53 48 46  >shellFlgs & SHF
ea80: 4c 47 5f 4c 6f 6f 6b 61 73 69 64 65 20 29 7b 0a  LG_Lookaside ){.
ea90: 20 20 20 20 20 20 69 48 69 77 74 72 20 3d 20 69        iHiwtr = i
eaa0: 43 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Cur = -1;.      
eab0: 73 71 6c 69 74 65 33 5f 64 62 5f 73 74 61 74 75  sqlite3_db_statu
eac0: 73 28 64 62 2c 20 53 51 4c 49 54 45 5f 44 42 53  s(db, SQLITE_DBS
ead0: 54 41 54 55 53 5f 4c 4f 4f 4b 41 53 49 44 45 5f  TATUS_LOOKASIDE_
eae0: 55 53 45 44 2c 0a 20 20 20 20 20 20 20 20 20 20  USED,.          
eaf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26 69                &i
eb00: 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 62 52  Cur, &iHiwtr, bR
eb10: 65 73 65 74 29 3b 0a 20 20 20 20 20 20 72 61 77  eset);.      raw
eb20: 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
eb30: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
eb40: 20 22 4c 6f 6f 6b 61 73 69 64 65 20 53 6c 6f 74   "Lookaside Slot
eb50: 73 20 55 73 65 64 3a 20 20 20 20 20 20 20 20 20  s Used:         
eb60: 20 20 20 20 20 20 20 25 64 20 28 6d 61 78 20 25         %d (max %
eb70: 64 29 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  d)\n",.         
eb80: 20 20 20 20 20 69 43 75 72 2c 20 69 48 69 77 74       iCur, iHiwt
eb90: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
eba0: 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20  3_db_status(db, 
ebb0: 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f  SQLITE_DBSTATUS_
ebc0: 4c 4f 4f 4b 41 53 49 44 45 5f 48 49 54 2c 0a 20  LOOKASIDE_HIT,. 
ebd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ebe0: 20 20 20 20 20 20 20 26 69 43 75 72 2c 20 26 69         &iCur, &i
ebf0: 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a  Hiwtr, bReset);.
ec00: 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
ec10: 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53 75 63  (pArg->out, "Suc
ec20: 63 65 73 73 66 75 6c 20 6c 6f 6f 6b 61 73 69 64  cessful lookasid
ec30: 65 20 61 74 74 65 6d 70 74 73 3a 20 20 20 20 20  e attempts:     
ec40: 20 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20    %d\n",.       
ec50: 20 20 20 20 20 20 20 69 48 69 77 74 72 29 3b 0a         iHiwtr);.
ec60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62        sqlite3_db
ec70: 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
ec80: 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f 4f 4b  TE_DBSTATUS_LOOK
ec90: 41 53 49 44 45 5f 4d 49 53 53 5f 53 49 5a 45 2c  ASIDE_MISS_SIZE,
eca0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
ecb0: 20 20 20 20 20 20 20 20 20 26 69 43 75 72 2c 20           &iCur, 
ecc0: 26 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29  &iHiwtr, bReset)
ecd0: 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  ;.      raw_prin
ece0: 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 4c  tf(pArg->out, "L
ecf0: 6f 6f 6b 61 73 69 64 65 20 66 61 69 6c 75 72 65  ookaside failure
ed00: 73 20 64 75 65 20 74 6f 20 73 69 7a 65 3a 20 20  s due to size:  
ed10: 20 20 20 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20      %d\n",.     
ed20: 20 20 20 20 20 20 20 20 20 69 48 69 77 74 72 29           iHiwtr)
ed30: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  ;.      sqlite3_
ed40: 64 62 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51  db_status(db, SQ
ed50: 4c 49 54 45 5f 44 42 53 54 41 54 55 53 5f 4c 4f  LITE_DBSTATUS_LO
ed60: 4f 4b 41 53 49 44 45 5f 4d 49 53 53 5f 46 55 4c  OKASIDE_MISS_FUL
ed70: 4c 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  L,.             
ed80: 20 20 20 20 20 20 20 20 20 20 20 26 69 43 75 72             &iCur
ed90: 2c 20 26 69 48 69 77 74 72 2c 20 62 52 65 73 65  , &iHiwtr, bRese
eda0: 74 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  t);.      raw_pr
edb0: 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20  intf(pArg->out, 
edc0: 22 4c 6f 6f 6b 61 73 69 64 65 20 66 61 69 6c 75  "Lookaside failu
edd0: 72 65 73 20 64 75 65 20 74 6f 20 4f 4f 4d 3a 20  res due to OOM: 
ede0: 20 20 20 20 20 20 25 64 5c 6e 22 2c 0a 20 20 20        %d\n",.   
edf0: 20 20 20 20 20 20 20 20 20 20 20 69 48 69 77 74             iHiwt
ee00: 72 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 48  r);.    }.    iH
ee10: 69 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31  iwtr = iCur = -1
ee20: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62  ;.    sqlite3_db
ee30: 5f 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49  _status(db, SQLI
ee40: 54 45 5f 44 42 53 54 41 54 55 53 5f 43 41 43 48  TE_DBSTATUS_CACH
ee50: 45 5f 55 53 45 44 2c 20 26 69 43 75 72 2c 20 26  E_USED, &iCur, &
ee60: 69 48 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b  iHiwtr, bReset);
ee70: 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
ee80: 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67 65  pArg->out, "Page
ee90: 72 20 48 65 61 70 20 55 73 61 67 65 3a 20 20 20  r Heap Usage:   
eea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
eeb0: 20 25 64 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20   %d bytes\n",.  
eec0: 20 20 20 20 20 20 20 20 20 20 69 43 75 72 29 3b            iCur);
eed0: 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43  .    iHiwtr = iC
eee0: 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c  ur = -1;.    sql
eef0: 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64  ite3_db_status(d
ef00: 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  b, SQLITE_DBSTAT
ef10: 55 53 5f 43 41 43 48 45 5f 48 49 54 2c 20 26 69  US_CACHE_HIT, &i
ef20: 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29  Cur, &iHiwtr, 1)
ef30: 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
ef40: 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67  (pArg->out, "Pag
ef50: 65 20 63 61 63 68 65 20 68 69 74 73 3a 20 20 20  e cache hits:   
ef60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ef70: 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a    %d\n", iCur);.
ef80: 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75      iHiwtr = iCu
ef90: 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69  r = -1;.    sqli
efa0: 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
efb0: 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
efc0: 53 5f 43 41 43 48 45 5f 4d 49 53 53 2c 20 26 69  S_CACHE_MISS, &i
efd0: 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 31 29  Cur, &iHiwtr, 1)
efe0: 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  ;.    raw_printf
eff0: 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61 67  (pArg->out, "Pag
f000: 65 20 63 61 63 68 65 20 6d 69 73 73 65 73 3a 20  e cache misses: 
f010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f020: 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a    %d\n", iCur);.
f030: 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43 75      iHiwtr = iCu
f040: 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c 69  r = -1;.    sqli
f050: 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64 62  te3_db_status(db
f060: 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54 55  , SQLITE_DBSTATU
f070: 53 5f 43 41 43 48 45 5f 57 52 49 54 45 2c 20 26  S_CACHE_WRITE, &
f080: 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20 31  iCur, &iHiwtr, 1
f090: 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  );.    raw_print
f0a0: 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 50 61  f(pArg->out, "Pa
f0b0: 67 65 20 63 61 63 68 65 20 77 72 69 74 65 73 3a  ge cache writes:
f0c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f0d0: 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b     %d\n", iCur);
f0e0: 0a 20 20 20 20 69 48 69 77 74 72 20 3d 20 69 43  .    iHiwtr = iC
f0f0: 75 72 20 3d 20 2d 31 3b 0a 20 20 20 20 73 71 6c  ur = -1;.    sql
f100: 69 74 65 33 5f 64 62 5f 73 74 61 74 75 73 28 64  ite3_db_status(d
f110: 62 2c 20 53 51 4c 49 54 45 5f 44 42 53 54 41 54  b, SQLITE_DBSTAT
f120: 55 53 5f 53 43 48 45 4d 41 5f 55 53 45 44 2c 20  US_SCHEMA_USED, 
f130: 26 69 43 75 72 2c 20 26 69 48 69 77 74 72 2c 20  &iCur, &iHiwtr, 
f140: 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77  bReset);.    raw
f150: 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
f160: 74 2c 20 22 53 63 68 65 6d 61 20 48 65 61 70 20  t, "Schema Heap 
f170: 55 73 61 67 65 3a 20 20 20 20 20 20 20 20 20 20  Usage:          
f180: 20 20 20 20 20 20 20 20 20 25 64 20 62 79 74 65           %d byte
f190: 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
f1a0: 20 20 69 43 75 72 29 3b 0a 20 20 20 20 69 48 69    iCur);.    iHi
f1b0: 77 74 72 20 3d 20 69 43 75 72 20 3d 20 2d 31 3b  wtr = iCur = -1;
f1c0: 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 64 62 5f  .    sqlite3_db_
f1d0: 73 74 61 74 75 73 28 64 62 2c 20 53 51 4c 49 54  status(db, SQLIT
f1e0: 45 5f 44 42 53 54 41 54 55 53 5f 53 54 4d 54 5f  E_DBSTATUS_STMT_
f1f0: 55 53 45 44 2c 20 26 69 43 75 72 2c 20 26 69 48  USED, &iCur, &iH
f200: 69 77 74 72 2c 20 62 52 65 73 65 74 29 3b 0a 20  iwtr, bReset);. 
f210: 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41     raw_printf(pA
f220: 72 67 2d 3e 6f 75 74 2c 20 22 53 74 61 74 65 6d  rg->out, "Statem
f230: 65 6e 74 20 48 65 61 70 2f 4c 6f 6f 6b 61 73 69  ent Heap/Lookasi
f240: 64 65 20 55 73 61 67 65 3a 20 20 20 20 20 20 25  de Usage:      %
f250: 64 20 62 79 74 65 73 5c 6e 22 2c 0a 20 20 20 20  d bytes\n",.    
f260: 20 20 20 20 20 20 20 20 69 43 75 72 29 3b 0a 20          iCur);. 
f270: 20 7d 0a 0a 20 20 69 66 28 20 70 41 72 67 20 26   }..  if( pArg &
f280: 26 20 70 41 72 67 2d 3e 6f 75 74 20 26 26 20 64  & pArg->out && d
f290: 62 20 26 26 20 70 41 72 67 2d 3e 70 53 74 6d 74  b && pArg->pStmt
f2a0: 20 29 7b 0a 20 20 20 20 69 43 75 72 20 3d 20 73   ){.    iCur = s
f2b0: 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74  qlite3_stmt_stat
f2c0: 75 73 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20  us(pArg->pStmt, 
f2d0: 53 51 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55  SQLITE_STMTSTATU
f2e0: 53 5f 46 55 4c 4c 53 43 41 4e 5f 53 54 45 50 2c  S_FULLSCAN_STEP,
f2f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
f300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f310: 62 52 65 73 65 74 29 3b 0a 20 20 20 20 72 61 77  bReset);.    raw
f320: 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
f330: 74 2c 20 22 46 75 6c 6c 73 63 61 6e 20 53 74 65  t, "Fullscan Ste
f340: 70 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  ps:             
f350: 20 20 20 20 20 20 20 20 20 25 64 5c 6e 22 2c 20           %d\n", 
f360: 69 43 75 72 29 3b 0a 20 20 20 20 69 43 75 72 20  iCur);.    iCur 
f370: 3d 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 5f 73  = sqlite3_stmt_s
f380: 74 61 74 75 73 28 70 41 72 67 2d 3e 70 53 74 6d  tatus(pArg->pStm
f390: 74 2c 20 53 51 4c 49 54 45 5f 53 54 4d 54 53 54  t, SQLITE_STMTST
f3a0: 41 54 55 53 5f 53 4f 52 54 2c 20 62 52 65 73 65  ATUS_SORT, bRese
f3b0: 74 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e  t);.    raw_prin
f3c0: 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 53  tf(pArg->out, "S
f3d0: 6f 72 74 20 4f 70 65 72 61 74 69 6f 6e 73 3a 20  ort Operations: 
f3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f3f0: 20 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29      %d\n", iCur)
f400: 3b 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c  ;.    iCur = sql
f410: 69 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73  ite3_stmt_status
f420: 28 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51  (pArg->pStmt, SQ
f430: 4c 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f  LITE_STMTSTATUS_
f440: 41 55 54 4f 49 4e 44 45 58 2c 62 52 65 73 65 74  AUTOINDEX,bReset
f450: 29 3b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74  );.    raw_print
f460: 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 41 75  f(pArg->out, "Au
f470: 74 6f 69 6e 64 65 78 20 49 6e 73 65 72 74 73 3a  toindex Inserts:
f480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f490: 20 20 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b     %d\n", iCur);
f4a0: 0a 20 20 20 20 69 43 75 72 20 3d 20 73 71 6c 69  .    iCur = sqli
f4b0: 74 65 33 5f 73 74 6d 74 5f 73 74 61 74 75 73 28  te3_stmt_status(
f4c0: 70 41 72 67 2d 3e 70 53 74 6d 74 2c 20 53 51 4c  pArg->pStmt, SQL
f4d0: 49 54 45 5f 53 54 4d 54 53 54 41 54 55 53 5f 56  ITE_STMTSTATUS_V
f4e0: 4d 5f 53 54 45 50 2c 20 62 52 65 73 65 74 29 3b  M_STEP, bReset);
f4f0: 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28  .    raw_printf(
f500: 70 41 72 67 2d 3e 6f 75 74 2c 20 22 56 69 72 74  pArg->out, "Virt
f510: 75 61 6c 20 4d 61 63 68 69 6e 65 20 53 74 65 70  ual Machine Step
f520: 73 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s:              
f530: 20 25 64 5c 6e 22 2c 20 69 43 75 72 29 3b 0a 20   %d\n", iCur);. 
f540: 20 7d 0a 0a 23 69 66 64 65 66 20 5f 5f 6c 69 6e   }..#ifdef __lin
f550: 75 78 5f 5f 0a 20 20 64 69 73 70 6c 61 79 4c 69  ux__.  displayLi
f560: 6e 75 78 49 6f 53 74 61 74 73 28 70 41 72 67 2d  nuxIoStats(pArg-
f570: 3e 6f 75 74 29 3b 0a 23 65 6e 64 69 66 0a 0a 20  >out);.#endif.. 
f580: 20 2f 2a 20 44 6f 20 6e 6f 74 20 72 65 6d 6f 76   /* Do not remov
f590: 65 20 74 68 69 73 20 6d 61 63 68 69 6e 65 20 72  e this machine r
f5a0: 65 61 64 61 62 6c 65 20 63 6f 6d 6d 65 6e 74 3a  eadable comment:
f5b0: 20 65 78 74 72 61 2d 73 74 61 74 73 2d 6f 75 74   extra-stats-out
f5c0: 70 75 74 2d 68 65 72 65 20 2a 2f 0a 0a 20 20 72  put-here */..  r
f5d0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
f5e0: 2a 20 44 69 73 70 6c 61 79 20 73 63 61 6e 20 73  * Display scan s
f5f0: 74 61 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tats..*/.static 
f600: 76 6f 69 64 20 64 69 73 70 6c 61 79 5f 73 63 61  void display_sca
f610: 6e 73 74 61 74 73 28 0a 20 20 73 71 6c 69 74 65  nstats(.  sqlite
f620: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20 20  3 *db,          
f630: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
f640: 61 62 61 73 65 20 74 6f 20 71 75 65 72 79 20 2a  abase to query *
f650: 2f 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a  /.  ShellState *
f660: 70 41 72 67 20 20 20 20 20 20 20 20 20 20 20 20  pArg            
f670: 20 20 20 20 2f 2a 20 50 6f 69 6e 74 65 72 20 74      /* Pointer t
f680: 6f 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 2f 0a  o ShellState */.
f690: 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  ){.#ifndef SQLIT
f6a0: 45 5f 45 4e 41 42 4c 45 5f 53 54 4d 54 5f 53 43  E_ENABLE_STMT_SC
f6b0: 41 4e 53 54 41 54 55 53 0a 20 20 55 4e 55 53 45  ANSTATUS.  UNUSE
f6c0: 44 5f 50 41 52 41 4d 45 54 45 52 28 64 62 29 3b  D_PARAMETER(db);
f6d0: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
f6e0: 54 45 52 28 70 41 72 67 29 3b 0a 23 65 6c 73 65  TER(pArg);.#else
f6f0: 0a 20 20 69 6e 74 20 69 2c 20 6b 2c 20 6e 2c 20  .  int i, k, n, 
f700: 6d 78 3b 0a 20 20 72 61 77 5f 70 72 69 6e 74 66  mx;.  raw_printf
f710: 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d  (pArg->out, "---
f720: 2d 2d 2d 2d 2d 20 73 63 61 6e 73 74 61 74 73 20  ----- scanstats 
f730: 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20  --------\n");.  
f740: 6d 78 20 3d 20 30 3b 0a 20 20 66 6f 72 28 6b 3d  mx = 0;.  for(k=
f750: 30 3b 20 6b 3c 3d 6d 78 3b 20 6b 2b 2b 29 7b 0a  0; k<=mx; k++){.
f760: 20 20 20 20 64 6f 75 62 6c 65 20 72 45 73 74 4c      double rEstL
f770: 6f 6f 70 20 3d 20 31 2e 30 3b 0a 20 20 20 20 66  oop = 1.0;.    f
f780: 6f 72 28 69 3d 6e 3d 30 3b 20 31 3b 20 69 2b 2b  or(i=n=0; 1; i++
f790: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
f7a0: 5f 73 74 6d 74 20 2a 70 20 3d 20 70 41 72 67 2d  _stmt *p = pArg-
f7b0: 3e 70 53 74 6d 74 3b 0a 20 20 20 20 20 20 73 71  >pStmt;.      sq
f7c0: 6c 69 74 65 33 5f 69 6e 74 36 34 20 6e 4c 6f 6f  lite3_int64 nLoo
f7d0: 70 2c 20 6e 56 69 73 69 74 3b 0a 20 20 20 20 20  p, nVisit;.     
f7e0: 20 64 6f 75 62 6c 65 20 72 45 73 74 3b 0a 20 20   double rEst;.  
f7f0: 20 20 20 20 69 6e 74 20 69 53 69 64 3b 0a 20 20      int iSid;.  
f800: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
f810: 7a 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20  zExplain;.      
f820: 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 6d 74  if( sqlite3_stmt
f830: 5f 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69  _scanstatus(p, i
f840: 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41  , SQLITE_SCANSTA
f850: 54 5f 4e 4c 4f 4f 50 2c 20 28 76 6f 69 64 2a 29  T_NLOOP, (void*)
f860: 26 6e 4c 6f 6f 70 29 20 29 7b 0a 20 20 20 20 20  &nLoop) ){.     
f870: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
f880: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  }.      sqlite3_
f890: 73 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28  stmt_scanstatus(
f8a0: 70 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41  p, i, SQLITE_SCA
f8b0: 4e 53 54 41 54 5f 53 45 4c 45 43 54 49 44 2c 20  NSTAT_SELECTID, 
f8c0: 28 76 6f 69 64 2a 29 26 69 53 69 64 29 3b 0a 20  (void*)&iSid);. 
f8d0: 20 20 20 20 20 69 66 28 20 69 53 69 64 3e 6d 78       if( iSid>mx
f8e0: 20 29 20 6d 78 20 3d 20 69 53 69 64 3b 0a 20 20   ) mx = iSid;.  
f8f0: 20 20 20 20 69 66 28 20 69 53 69 64 21 3d 6b 20      if( iSid!=k 
f900: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
f910: 20 20 69 66 28 20 6e 3d 3d 30 20 29 7b 0a 20 20    if( n==0 ){.  
f920: 20 20 20 20 20 20 72 45 73 74 4c 6f 6f 70 20 3d        rEstLoop =
f930: 20 28 64 6f 75 62 6c 65 29 6e 4c 6f 6f 70 3b 0a   (double)nLoop;.
f940: 20 20 20 20 20 20 20 20 69 66 28 20 6b 3e 30 20          if( k>0 
f950: 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72  ) raw_printf(pAr
f960: 67 2d 3e 6f 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d  g->out, "-------
f970: 2d 20 73 75 62 71 75 65 72 79 20 25 64 20 2d 2d  - subquery %d --
f980: 2d 2d 2d 2d 2d 5c 6e 22 2c 20 6b 29 3b 0a 20 20  -----\n", k);.  
f990: 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 2b 2b 3b      }.      n++;
f9a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
f9b0: 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 70  tmt_scanstatus(p
f9c0: 2c 20 69 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e  , i, SQLITE_SCAN
f9d0: 53 54 41 54 5f 4e 56 49 53 49 54 2c 20 28 76 6f  STAT_NVISIT, (vo
f9e0: 69 64 2a 29 26 6e 56 69 73 69 74 29 3b 0a 20 20  id*)&nVisit);.  
f9f0: 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74      sqlite3_stmt
fa00: 5f 73 63 61 6e 73 74 61 74 75 73 28 70 2c 20 69  _scanstatus(p, i
fa10: 2c 20 53 51 4c 49 54 45 5f 53 43 41 4e 53 54 41  , SQLITE_SCANSTA
fa20: 54 5f 45 53 54 2c 20 28 76 6f 69 64 2a 29 26 72  T_EST, (void*)&r
fa30: 45 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  Est);.      sqli
fa40: 74 65 33 5f 73 74 6d 74 5f 73 63 61 6e 73 74 61  te3_stmt_scansta
fa50: 74 75 73 28 70 2c 20 69 2c 20 53 51 4c 49 54 45  tus(p, i, SQLITE
fa60: 5f 53 43 41 4e 53 54 41 54 5f 45 58 50 4c 41 49  _SCANSTAT_EXPLAI
fa70: 4e 2c 20 28 76 6f 69 64 2a 29 26 7a 45 78 70 6c  N, (void*)&zExpl
fa80: 61 69 6e 29 3b 0a 20 20 20 20 20 20 75 74 66 38  ain);.      utf8
fa90: 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
faa0: 74 2c 20 22 4c 6f 6f 70 20 25 32 64 3a 20 25 73  t, "Loop %2d: %s
fab0: 5c 6e 22 2c 20 6e 2c 20 7a 45 78 70 6c 61 69 6e  \n", n, zExplain
fac0: 29 3b 0a 20 20 20 20 20 20 72 45 73 74 4c 6f 6f  );.      rEstLoo
fad0: 70 20 2a 3d 20 72 45 73 74 3b 0a 20 20 20 20 20  p *= rEst;.     
fae0: 20 72 61 77 5f 70 72 69 6e 74 66 28 70 41 72 67   raw_printf(pArg
faf0: 2d 3e 6f 75 74 2c 0a 20 20 20 20 20 20 20 20 20  ->out,.         
fb00: 20 22 20 20 20 20 20 20 20 20 20 6e 4c 6f 6f 70   "         nLoop
fb10: 3d 25 2d 38 6c 6c 64 20 6e 52 6f 77 3d 25 2d 38  =%-8lld nRow=%-8
fb20: 6c 6c 64 20 65 73 74 52 6f 77 3d 25 2d 38 6c 6c  lld estRow=%-8ll
fb30: 64 20 65 73 74 52 6f 77 2f 4c 6f 6f 70 3d 25 2d  d estRow/Loop=%-
fb40: 38 67 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  8g\n",.         
fb50: 20 6e 4c 6f 6f 70 2c 20 6e 56 69 73 69 74 2c 20   nLoop, nVisit, 
fb60: 28 73 71 6c 69 74 65 33 5f 69 6e 74 36 34 29 28  (sqlite3_int64)(
fb70: 72 45 73 74 4c 6f 6f 70 2b 30 2e 35 29 2c 20 72  rEstLoop+0.5), r
fb80: 45 73 74 0a 20 20 20 20 20 20 29 3b 0a 20 20 20  Est.      );.   
fb90: 20 7d 0a 20 20 7d 0a 20 20 72 61 77 5f 70 72 69   }.  }.  raw_pri
fba0: 6e 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 20 22  ntf(pArg->out, "
fbb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
fbc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b  -----------\n");
fbd0: 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a  .#endif.}../*.**
fbe0: 20 50 61 72 61 6d 65 74 65 72 20 61 7a 41 72 72   Parameter azArr
fbf0: 61 79 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 7a  ay points to a z
fc00: 65 72 6f 2d 74 65 72 6d 69 6e 61 74 65 64 20 61  ero-terminated a
fc10: 72 72 61 79 20 6f 66 20 73 74 72 69 6e 67 73 2e  rray of strings.
fc20: 20 7a 53 74 72 0a 2a 2a 20 70 6f 69 6e 74 73 20   zStr.** points 
fc30: 74 6f 20 61 20 73 69 6e 67 6c 65 20 6e 75 6c 2d  to a single nul-
fc40: 74 65 72 6d 69 6e 61 74 65 64 20 73 74 72 69 6e  terminated strin
fc50: 67 2e 20 52 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  g. Return non-ze
fc60: 72 6f 20 69 66 20 7a 53 74 72 0a 2a 2a 20 69 73  ro if zStr.** is
fc70: 20 65 71 75 61 6c 2c 20 61 63 63 6f 72 64 69 6e   equal, accordin
fc80: 67 20 74 6f 20 73 74 72 63 6d 70 28 29 2c 20 74  g to strcmp(), t
fc90: 6f 20 61 6e 79 20 6f 66 20 74 68 65 20 73 74 72  o any of the str
fca0: 69 6e 67 73 20 69 6e 20 74 68 65 20 61 72 72 61  ings in the arra
fcb0: 79 2e 0a 2a 2a 20 4f 74 68 65 72 77 69 73 65 2c  y..** Otherwise,
fcc0: 20 72 65 74 75 72 6e 20 7a 65 72 6f 2e 0a 2a 2f   return zero..*/
fcd0: 0a 73 74 61 74 69 63 20 69 6e 74 20 73 74 72 5f  .static int str_
fce0: 69 6e 5f 61 72 72 61 79 28 63 6f 6e 73 74 20 63  in_array(const c
fcf0: 68 61 72 20 2a 7a 53 74 72 2c 20 63 6f 6e 73 74  har *zStr, const
fd00: 20 63 68 61 72 20 2a 2a 61 7a 41 72 72 61 79 29   char **azArray)
fd10: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72  {.  int i;.  for
fd20: 28 69 3d 30 3b 20 61 7a 41 72 72 61 79 5b 69 5d  (i=0; azArray[i]
fd30: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
fd40: 30 3d 3d 73 74 72 63 6d 70 28 7a 53 74 72 2c 20  0==strcmp(zStr, 
fd50: 61 7a 41 72 72 61 79 5b 69 5d 29 20 29 20 72 65  azArray[i]) ) re
fd60: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
fd70: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
fd80: 20 49 66 20 63 6f 6d 70 69 6c 65 64 20 73 74 61   If compiled sta
fd90: 74 65 6d 65 6e 74 20 70 53 71 6c 20 61 70 70 65  tement pSql appe
fda0: 61 72 73 20 74 6f 20 62 65 20 61 6e 20 45 58 50  ars to be an EXP
fdb0: 4c 41 49 4e 20 73 74 61 74 65 6d 65 6e 74 2c 20  LAIN statement, 
fdc0: 61 6c 6c 6f 63 61 74 65 0a 2a 2a 20 61 6e 64 20  allocate.** and 
fdd0: 70 6f 70 75 6c 61 74 65 20 74 68 65 20 53 68 65  populate the She
fde0: 6c 6c 53 74 61 74 65 2e 61 69 49 6e 64 65 6e 74  llState.aiIndent
fdf0: 5b 5d 20 61 72 72 61 79 20 77 69 74 68 20 74 68  [] array with th
fe00: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 73  e number of.** s
fe10: 70 61 63 65 73 20 65 61 63 68 20 6f 70 63 6f 64  paces each opcod
fe20: 65 20 73 68 6f 75 6c 64 20 62 65 20 69 6e 64 65  e should be inde
fe30: 6e 74 65 64 20 62 65 66 6f 72 65 20 69 74 20 69  nted before it i
fe40: 73 20 6f 75 74 70 75 74 2e 0a 2a 2a 0a 2a 2a 20  s output..**.** 
fe50: 54 68 65 20 69 6e 64 65 6e 74 69 6e 67 20 72 75  The indenting ru
fe60: 6c 65 73 20 61 72 65 3a 0a 2a 2a 0a 2a 2a 20 20  les are:.**.**  
fe70: 20 20 20 2a 20 46 6f 72 20 65 61 63 68 20 22 4e     * For each "N
fe80: 65 78 74 22 2c 20 22 50 72 65 76 22 2c 20 22 56  ext", "Prev", "V
fe90: 4e 65 78 74 22 20 6f 72 20 22 56 50 72 65 76 22  Next" or "VPrev"
fea0: 20 69 6e 73 74 72 75 63 74 69 6f 6e 2c 20 69 6e   instruction, in
feb0: 64 65 6e 74 0a 2a 2a 20 20 20 20 20 20 20 61 6c  dent.**       al
fec0: 6c 20 6f 70 63 6f 64 65 73 20 74 68 61 74 20 6f  l opcodes that o
fed0: 63 63 75 72 20 62 65 74 77 65 65 6e 20 74 68 65  ccur between the
fee0: 20 70 32 20 6a 75 6d 70 20 64 65 73 74 69 6e 61   p2 jump destina
fef0: 74 69 6f 6e 20 61 6e 64 20 74 68 65 20 6f 70 63  tion and the opc
ff00: 6f 64 65 0a 2a 2a 20 20 20 20 20 20 20 69 74 73  ode.**       its
ff10: 65 6c 66 20 62 79 20 32 20 73 70 61 63 65 73 2e  elf by 2 spaces.
ff20: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 2a 20 46 6f 72  .**.**     * For
ff30: 20 65 61 63 68 20 22 47 6f 74 6f 22 2c 20 69 66   each "Goto", if
ff40: 20 74 68 65 20 6a 75 6d 70 20 64 65 73 74 69 6e   the jump destin
ff50: 61 74 69 6f 6e 20 69 73 20 65 61 72 6c 69 65 72  ation is earlier
ff60: 20 69 6e 20 74 68 65 20 70 72 6f 67 72 61 6d 0a   in the program.
ff70: 2a 2a 20 20 20 20 20 20 20 61 6e 64 20 65 6e 64  **       and end
ff80: 73 20 6f 6e 20 6f 6e 65 20 6f 66 3a 0a 2a 2a 20  s on one of:.** 
ff90: 20 20 20 20 20 20 20 20 20 59 69 65 6c 64 20 20           Yield  
ffa0: 53 65 65 6b 47 74 20 20 53 65 65 6b 4c 74 20 20  SeekGt  SeekLt  
ffb0: 52 6f 77 53 65 74 52 65 61 64 20 20 52 65 77 69  RowSetRead  Rewi
ffc0: 6e 64 0a 2a 2a 20 20 20 20 20 20 20 6f 72 20 69  nd.**       or i
ffd0: 66 20 74 68 65 20 50 31 20 70 61 72 61 6d 65 74  f the P1 paramet
ffe0: 65 72 20 69 73 20 6f 6e 65 20 69 6e 73 74 65 61  er is one instea
fff0: 64 20 6f 66 20 7a 65 72 6f 2c 0a 2a 2a 20 20 20  d of zero,.**   
10000 20 20 20 20 74 68 65 6e 20 69 6e 64 65 6e 74 20      then indent 
10010 61 6c 6c 20 6f 70 63 6f 64 65 73 20 62 65 74 77  all opcodes betw
10020 65 65 6e 20 74 68 65 20 65 61 72 6c 69 65 72 20  een the earlier 
10030 69 6e 73 74 72 75 63 74 69 6f 6e 0a 2a 2a 20 20  instruction.**  
10040 20 20 20 20 20 61 6e 64 20 22 47 6f 74 6f 22 20       and "Goto" 
10050 62 79 20 32 20 73 70 61 63 65 73 2e 0a 2a 2f 0a  by 2 spaces..*/.
10060 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
10070 61 69 6e 5f 64 61 74 61 5f 70 72 65 70 61 72 65  ain_data_prepare
10080 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20  (ShellState *p, 
10090 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
100a0 71 6c 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  ql){.  const cha
100b0 72 20 2a 7a 53 71 6c 3b 20 20 20 20 20 20 20 20  r *zSql;        
100c0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 74 65         /* The te
100d0 78 74 20 6f 66 20 74 68 65 20 53 51 4c 20 73 74  xt of the SQL st
100e0 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 63 6f 6e  atement */.  con
100f0 73 74 20 63 68 61 72 20 2a 7a 3b 20 20 20 20 20  st char *z;     
10100 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
10110 55 73 65 64 20 74 6f 20 63 68 65 63 6b 20 69 66  Used to check if
10120 20 74 68 69 73 20 69 73 20 61 6e 20 45 58 50 4c   this is an EXPL
10130 41 49 4e 20 2a 2f 0a 20 20 69 6e 74 20 2a 61 62  AIN */.  int *ab
10140 59 69 65 6c 64 20 3d 20 30 3b 20 20 20 20 20 20  Yield = 0;      
10150 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
10160 20 69 66 20 6f 70 20 69 73 20 61 6e 20 4f 50 5f   if op is an OP_
10170 59 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  Yield */.  int n
10180 41 6c 6c 6f 63 20 3d 20 30 3b 20 20 20 20 20 20  Alloc = 0;      
10190 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c             /* Al
101a0 6c 6f 63 61 74 65 64 20 73 69 7a 65 20 6f 66 20  located size of 
101b0 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 5d 2c 20 61  p->aiIndent[], a
101c0 62 59 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20  bYield */.  int 
101d0 69 4f 70 3b 20 20 20 20 20 20 20 20 20 20 20 20  iOp;            
101e0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
101f0 6e 64 65 78 20 6f 66 20 6f 70 65 72 61 74 69 6f  ndex of operatio
10200 6e 20 69 6e 20 70 2d 3e 61 69 49 6e 64 65 6e 74  n in p->aiIndent
10210 5b 5d 20 2a 2f 0a 0a 20 20 63 6f 6e 73 74 20 63  [] */..  const c
10220 68 61 72 20 2a 61 7a 4e 65 78 74 5b 5d 20 3d 20  har *azNext[] = 
10230 7b 20 22 4e 65 78 74 22 2c 20 22 50 72 65 76 22  { "Next", "Prev"
10240 2c 20 22 56 50 72 65 76 22 2c 20 22 56 4e 65 78  , "VPrev", "VNex
10250 74 22 2c 20 22 53 6f 72 74 65 72 4e 65 78 74 22  t", "SorterNext"
10260 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
10270 20 20 20 20 20 20 20 20 20 20 20 20 20 22 4e 65               "Ne
10280 78 74 49 66 4f 70 65 6e 22 2c 20 22 50 72 65 76  xtIfOpen", "Prev
10290 49 66 4f 70 65 6e 22 2c 20 30 20 7d 3b 0a 20 20  IfOpen", 0 };.  
102a0 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a 59 69  const char *azYi
102b0 65 6c 64 5b 5d 20 3d 20 7b 20 22 59 69 65 6c 64  eld[] = { "Yield
102c0 22 2c 20 22 53 65 65 6b 4c 54 22 2c 20 22 53 65  ", "SeekLT", "Se
102d0 65 6b 47 54 22 2c 20 22 52 6f 77 53 65 74 52 65  ekGT", "RowSetRe
102e0 61 64 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ad",.           
102f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10300 20 22 52 65 77 69 6e 64 22 2c 20 30 20 7d 3b 0a   "Rewind", 0 };.
10310 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 61 7a    const char *az
10320 47 6f 74 6f 5b 5d 20 3d 20 7b 20 22 47 6f 74 6f  Goto[] = { "Goto
10330 22 2c 20 30 20 7d 3b 0a 0a 20 20 2f 2a 20 54 72  ", 0 };..  /* Tr
10340 79 20 74 6f 20 66 69 67 75 72 65 20 6f 75 74 20  y to figure out 
10350 69 66 20 74 68 69 73 20 69 73 20 72 65 61 6c 6c  if this is reall
10360 79 20 61 6e 20 45 58 50 4c 41 49 4e 20 73 74 61  y an EXPLAIN sta
10370 74 65 6d 65 6e 74 2e 20 49 66 20 74 68 69 73 0a  tement. If this.
10380 20 20 2a 2a 20 63 61 6e 6e 6f 74 20 62 65 20 76    ** cannot be v
10390 65 72 69 66 69 65 64 2c 20 72 65 74 75 72 6e 20  erified, return 
103a0 65 61 72 6c 79 2e 20 20 2a 2f 0a 20 20 69 66 28  early.  */.  if(
103b0 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
103c0 63 6f 75 6e 74 28 70 53 71 6c 29 21 3d 38 20 29  count(pSql)!=8 )
103d0 7b 0a 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20 3d  {.    p->cMode =
103e0 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 72 65   p->mode;.    re
103f0 74 75 72 6e 3b 0a 20 20 7d 0a 20 20 7a 53 71 6c  turn;.  }.  zSql
10400 20 3d 20 73 71 6c 69 74 65 33 5f 73 71 6c 28 70   = sqlite3_sql(p
10410 53 71 6c 29 3b 0a 20 20 69 66 28 20 7a 53 71 6c  Sql);.  if( zSql
10420 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
10430 66 6f 72 28 7a 3d 7a 53 71 6c 3b 20 2a 7a 3d 3d  for(z=zSql; *z==
10440 27 20 27 20 7c 7c 20 2a 7a 3d 3d 27 5c 74 27 20  ' ' || *z=='\t' 
10450 7c 7c 20 2a 7a 3d 3d 27 5c 6e 27 20 7c 7c 20 2a  || *z=='\n' || *
10460 7a 3d 3d 27 5c 66 27 20 7c 7c 20 2a 7a 3d 3d 27  z=='\f' || *z=='
10470 5c 72 27 3b 20 7a 2b 2b 29 3b 0a 20 20 69 66 28  \r'; z++);.  if(
10480 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d   sqlite3_strnicm
10490 70 28 7a 2c 20 22 65 78 70 6c 61 69 6e 22 2c 20  p(z, "explain", 
104a0 37 29 20 29 7b 0a 20 20 20 20 70 2d 3e 63 4d 6f  7) ){.    p->cMo
104b0 64 65 20 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20  de = p->mode;.  
104c0 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 0a 20    return;.  }.. 
104d0 20 66 6f 72 28 69 4f 70 3d 30 3b 20 53 51 4c 49   for(iOp=0; SQLI
104e0 54 45 5f 52 4f 57 3d 3d 73 71 6c 69 74 65 33 5f  TE_ROW==sqlite3_
104f0 73 74 65 70 28 70 53 71 6c 29 3b 20 69 4f 70 2b  step(pSql); iOp+
10500 2b 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20  +){.    int i;. 
10510 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73     int iAddr = s
10520 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
10530 74 28 70 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20  t(pSql, 0);.    
10540 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4f 70 20  const char *zOp 
10550 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
10560 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
10570 78 74 28 70 53 71 6c 2c 20 31 29 3b 0a 0a 20 20  xt(pSql, 1);..  
10580 20 20 2f 2a 20 53 65 74 20 70 32 20 74 6f 20 74    /* Set p2 to t
10590 68 65 20 50 32 20 66 69 65 6c 64 20 6f 66 20 74  he P2 field of t
105a0 68 65 20 63 75 72 72 65 6e 74 20 6f 70 63 6f 64  he current opcod
105b0 65 2e 20 54 68 65 6e 2c 20 61 73 73 75 6d 69 6e  e. Then, assumin
105c0 67 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 70 32  g that.    ** p2
105d0 20 69 73 20 61 6e 20 69 6e 73 74 72 75 63 74 69   is an instructi
105e0 6f 6e 20 61 64 64 72 65 73 73 2c 20 73 65 74 20  on address, set 
105f0 76 61 72 69 61 62 6c 65 20 70 32 6f 70 20 74 6f  variable p2op to
10600 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
10610 61 74 0a 20 20 20 20 2a 2a 20 69 6e 73 74 72 75  at.    ** instru
10620 63 74 69 6f 6e 20 69 6e 20 74 68 65 20 61 69 49  ction in the aiI
10630 6e 64 65 6e 74 5b 5d 20 61 72 72 61 79 2e 20 70  ndent[] array. p
10640 32 20 61 6e 64 20 70 32 6f 70 20 6d 61 79 20 62  2 and p2op may b
10650 65 20 64 69 66 66 65 72 65 6e 74 20 69 66 0a 20  e different if. 
10660 20 20 20 2a 2a 20 74 68 65 20 63 75 72 72 65 6e     ** the curren
10670 74 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 69 73  t instruction is
10680 20 70 61 72 74 20 6f 66 20 61 20 73 75 62 2d 70   part of a sub-p
10690 72 6f 67 72 61 6d 20 67 65 6e 65 72 61 74 65 64  rogram generated
106a0 20 62 79 20 61 6e 0a 20 20 20 20 2a 2a 20 53 51   by an.    ** SQ
106b0 4c 20 74 72 69 67 67 65 72 20 6f 72 20 66 6f 72  L trigger or for
106c0 65 69 67 6e 20 6b 65 79 2e 20 20 2a 2f 0a 20 20  eign key.  */.  
106d0 20 20 69 6e 74 20 70 32 20 3d 20 73 71 6c 69 74    int p2 = sqlit
106e0 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
106f0 71 6c 2c 20 33 29 3b 0a 20 20 20 20 69 6e 74 20  ql, 3);.    int 
10700 70 32 6f 70 20 3d 20 28 70 32 20 2b 20 28 69 4f  p2op = (p2 + (iO
10710 70 2d 69 41 64 64 72 29 29 3b 0a 0a 20 20 20 20  p-iAddr));..    
10720 2f 2a 20 47 72 6f 77 20 74 68 65 20 70 2d 3e 61  /* Grow the p->a
10730 69 49 6e 64 65 6e 74 20 61 72 72 61 79 20 61 73  iIndent array as
10740 20 72 65 71 75 69 72 65 64 20 2a 2f 0a 20 20 20   required */.   
10750 20 69 66 28 20 69 4f 70 3e 3d 6e 41 6c 6c 6f 63   if( iOp>=nAlloc
10760 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 4f   ){.      if( iO
10770 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  p==0 ){.        
10780 2f 2a 20 44 6f 20 66 75 72 74 68 65 72 20 76 65  /* Do further ve
10790 72 66 69 63 61 74 69 6f 6e 20 74 68 61 74 20 74  rfication that t
107a0 68 69 73 20 69 73 20 65 78 70 6c 61 69 6e 20 6f  his is explain o
107b0 75 74 70 75 74 2e 20 20 41 62 6f 72 74 20 69 66  utput.  Abort if
107c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20 69  .        ** it i
107d0 73 20 6e 6f 74 20 2a 2f 0a 20 20 20 20 20 20 20  s not */.       
107e0 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 63 68   static const ch
107f0 61 72 20 2a 65 78 70 6c 61 69 6e 43 6f 6c 73 5b  ar *explainCols[
10800 5d 20 3d 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ] = {.          
10810 20 22 61 64 64 72 22 2c 20 22 6f 70 63 6f 64 65   "addr", "opcode
10820 22 2c 20 22 70 31 22 2c 20 22 70 32 22 2c 20 22  ", "p1", "p2", "
10830 70 33 22 2c 20 22 70 34 22 2c 20 22 70 35 22 2c  p3", "p4", "p5",
10840 20 22 63 6f 6d 6d 65 6e 74 22 20 7d 3b 0a 20 20   "comment" };.  
10850 20 20 20 20 20 20 69 6e 74 20 6a 6a 3b 0a 20 20        int jj;.  
10860 20 20 20 20 20 20 66 6f 72 28 6a 6a 3d 30 3b 20        for(jj=0; 
10870 6a 6a 3c 41 72 72 61 79 53 69 7a 65 28 65 78 70  jj<ArraySize(exp
10880 6c 61 69 6e 43 6f 6c 73 29 3b 20 6a 6a 2b 2b 29  lainCols); jj++)
10890 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
108a0 73 74 72 63 6d 70 28 73 71 6c 69 74 65 33 5f 63  strcmp(sqlite3_c
108b0 6f 6c 75 6d 6e 5f 6e 61 6d 65 28 70 53 71 6c 2c  olumn_name(pSql,
108c0 6a 6a 29 2c 65 78 70 6c 61 69 6e 43 6f 6c 73 5b  jj),explainCols[
108d0 6a 6a 5d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  jj])!=0 ){.     
108e0 20 20 20 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20         p->cMode 
108f0 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 20  = p->mode;.     
10900 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 72         sqlite3_r
10910 65 73 65 74 28 70 53 71 6c 29 3b 0a 20 20 20 20  eset(pSql);.    
10920 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a          return;.
10930 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
10940 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
10950 20 20 20 20 6e 41 6c 6c 6f 63 20 2b 3d 20 31 30      nAlloc += 10
10960 30 3b 0a 20 20 20 20 20 20 70 2d 3e 61 69 49 6e  0;.      p->aiIn
10970 64 65 6e 74 20 3d 20 28 69 6e 74 2a 29 73 71 6c  dent = (int*)sql
10980 69 74 65 33 5f 72 65 61 6c 6c 6f 63 36 34 28 70  ite3_realloc64(p
10990 2d 3e 61 69 49 6e 64 65 6e 74 2c 20 6e 41 6c 6c  ->aiIndent, nAll
109a0 6f 63 2a 73 69 7a 65 6f 66 28 69 6e 74 29 29 3b  oc*sizeof(int));
109b0 0a 20 20 20 20 20 20 61 62 59 69 65 6c 64 20 3d  .      abYield =
109c0 20 28 69 6e 74 2a 29 73 71 6c 69 74 65 33 5f 72   (int*)sqlite3_r
109d0 65 61 6c 6c 6f 63 36 34 28 61 62 59 69 65 6c 64  ealloc64(abYield
109e0 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28  , nAlloc*sizeof(
109f0 69 6e 74 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20  int));.    }.   
10a00 20 61 62 59 69 65 6c 64 5b 69 4f 70 5d 20 3d 20   abYield[iOp] = 
10a10 73 74 72 5f 69 6e 5f 61 72 72 61 79 28 7a 4f 70  str_in_array(zOp
10a20 2c 20 61 7a 59 69 65 6c 64 29 3b 0a 20 20 20 20  , azYield);.    
10a30 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 4f 70 5d  p->aiIndent[iOp]
10a40 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 6e 49 6e   = 0;.    p->nIn
10a50 64 65 6e 74 20 3d 20 69 4f 70 2b 31 3b 0a 0a 20  dent = iOp+1;.. 
10a60 20 20 20 69 66 28 20 73 74 72 5f 69 6e 5f 61 72     if( str_in_ar
10a70 72 61 79 28 7a 4f 70 2c 20 61 7a 4e 65 78 74 29  ray(zOp, azNext)
10a80 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   ){.      for(i=
10a90 70 32 6f 70 3b 20 69 3c 69 4f 70 3b 20 69 2b 2b  p2op; i<iOp; i++
10aa0 29 20 70 2d 3e 61 69 49 6e 64 65 6e 74 5b 69 5d  ) p->aiIndent[i]
10ab0 20 2b 3d 20 32 3b 0a 20 20 20 20 7d 0a 20 20 20   += 2;.    }.   
10ac0 20 69 66 28 20 73 74 72 5f 69 6e 5f 61 72 72 61   if( str_in_arra
10ad0 79 28 7a 4f 70 2c 20 61 7a 47 6f 74 6f 29 20 26  y(zOp, azGoto) &
10ae0 26 20 70 32 6f 70 3c 70 2d 3e 6e 49 6e 64 65 6e  & p2op<p->nInden
10af0 74 0a 20 20 20 20 20 26 26 20 28 61 62 59 69 65  t.     && (abYie
10b00 6c 64 5b 70 32 6f 70 5d 20 7c 7c 20 73 71 6c 69  ld[p2op] || sqli
10b10 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70  te3_column_int(p
10b20 53 71 6c 2c 20 32 29 29 0a 20 20 20 20 29 7b 0a  Sql, 2)).    ){.
10b30 20 20 20 20 20 20 66 6f 72 28 69 3d 70 32 6f 70        for(i=p2op
10b40 3b 20 69 3c 69 4f 70 3b 20 69 2b 2b 29 20 70 2d  ; i<iOp; i++) p-
10b50 3e 61 69 49 6e 64 65 6e 74 5b 69 5d 20 2b 3d 20  >aiIndent[i] += 
10b60 32 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  2;.    }.  }..  
10b70 70 2d 3e 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a  p->iIndent = 0;.
10b80 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
10b90 62 59 69 65 6c 64 29 3b 0a 20 20 73 71 6c 69 74  bYield);.  sqlit
10ba0 65 33 5f 72 65 73 65 74 28 70 53 71 6c 29 3b 0a  e3_reset(pSql);.
10bb0 7d 0a 0a 2f 2a 0a 2a 2a 20 46 72 65 65 20 74 68  }../*.** Free th
10bc0 65 20 61 72 72 61 79 20 61 6c 6c 6f 63 61 74 65  e array allocate
10bd0 64 20 62 79 20 65 78 70 6c 61 69 6e 5f 64 61 74  d by explain_dat
10be0 61 5f 70 72 65 70 61 72 65 28 29 2e 0a 2a 2f 0a  a_prepare()..*/.
10bf0 73 74 61 74 69 63 20 76 6f 69 64 20 65 78 70 6c  static void expl
10c00 61 69 6e 5f 64 61 74 61 5f 64 65 6c 65 74 65 28  ain_data_delete(
10c10 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a  ShellState *p){.
10c20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
10c30 2d 3e 61 69 49 6e 64 65 6e 74 29 3b 0a 20 20 70  ->aiIndent);.  p
10c40 2d 3e 61 69 49 6e 64 65 6e 74 20 3d 20 30 3b 0a  ->aiIndent = 0;.
10c50 20 20 70 2d 3e 6e 49 6e 64 65 6e 74 20 3d 20 30    p->nIndent = 0
10c60 3b 0a 20 20 70 2d 3e 69 49 6e 64 65 6e 74 20 3d  ;.  p->iIndent =
10c70 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 69 73   0;.}../*.** Dis
10c80 61 62 6c 65 20 61 6e 64 20 72 65 73 74 6f 72 65  able and restore
10c90 20 2e 77 68 65 72 65 74 72 61 63 65 20 61 6e 64   .wheretrace and
10ca0 20 2e 73 65 6c 65 63 74 74 72 61 63 65 20 73 65   .selecttrace se
10cb0 74 74 69 6e 67 73 2e 0a 2a 2f 0a 23 69 66 20 64  ttings..*/.#if d
10cc0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
10cd0 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28  BUG) && defined(
10ce0 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
10cf0 4c 45 43 54 54 52 41 43 45 29 0a 65 78 74 65 72  LECTTRACE).exter
10d00 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 53 65 6c  n int sqlite3Sel
10d10 65 63 74 54 72 61 63 65 3b 0a 73 74 61 74 69 63  ectTrace;.static
10d20 20 69 6e 74 20 73 61 76 65 64 53 65 6c 65 63 74   int savedSelect
10d30 54 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 23 69  Trace;.#endif.#i
10d40 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
10d50 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69 6e  _DEBUG) && defin
10d60 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
10d70 5f 57 48 45 52 45 54 52 41 43 45 29 0a 65 78 74  _WHERETRACE).ext
10d80 65 72 6e 20 69 6e 74 20 73 71 6c 69 74 65 33 57  ern int sqlite3W
10d90 68 65 72 65 54 72 61 63 65 3b 0a 73 74 61 74 69  hereTrace;.stati
10da0 63 20 69 6e 74 20 73 61 76 65 64 57 68 65 72 65  c int savedWhere
10db0 54 72 61 63 65 3b 0a 23 65 6e 64 69 66 0a 73 74  Trace;.#endif.st
10dc0 61 74 69 63 20 76 6f 69 64 20 64 69 73 61 62 6c  atic void disabl
10dd0 65 5f 64 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f  e_debug_trace_mo
10de0 64 65 73 28 76 6f 69 64 29 7b 0a 23 69 66 20 64  des(void){.#if d
10df0 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45  efined(SQLITE_DE
10e00 42 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28  BUG) && defined(
10e10 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45  SQLITE_ENABLE_SE
10e20 4c 45 43 54 54 52 41 43 45 29 0a 20 20 73 61 76  LECTTRACE).  sav
10e30 65 64 53 65 6c 65 63 74 54 72 61 63 65 20 3d 20  edSelectTrace = 
10e40 73 71 6c 69 74 65 33 53 65 6c 65 63 74 54 72 61  sqlite3SelectTra
10e50 63 65 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c  ce;.  sqlite3Sel
10e60 65 63 74 54 72 61 63 65 20 3d 20 30 3b 0a 23 65  ectTrace = 0;.#e
10e70 6e 64 69 66 0a 23 69 66 20 64 65 66 69 6e 65 64  ndif.#if defined
10e80 28 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26  (SQLITE_DEBUG) &
10e90 26 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  & defined(SQLITE
10ea0 5f 45 4e 41 42 4c 45 5f 57 48 45 52 45 54 52 41  _ENABLE_WHERETRA
10eb0 43 45 29 0a 20 20 73 61 76 65 64 57 68 65 72 65  CE).  savedWhere
10ec0 54 72 61 63 65 20 3d 20 73 71 6c 69 74 65 33 57  Trace = sqlite3W
10ed0 68 65 72 65 54 72 61 63 65 3b 0a 20 20 73 71 6c  hereTrace;.  sql
10ee0 69 74 65 33 57 68 65 72 65 54 72 61 63 65 20 3d  ite3WhereTrace =
10ef0 20 30 3b 0a 23 65 6e 64 69 66 0a 7d 0a 73 74 61   0;.#endif.}.sta
10f00 74 69 63 20 76 6f 69 64 20 72 65 73 74 6f 72 65  tic void restore
10f10 5f 64 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64  _debug_trace_mod
10f20 65 73 28 76 6f 69 64 29 7b 0a 23 69 66 20 64 65  es(void){.#if de
10f30 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
10f40 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  UG) && defined(S
10f50 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 4c  QLITE_ENABLE_SEL
10f60 45 43 54 54 52 41 43 45 29 0a 20 20 73 71 6c 69  ECTTRACE).  sqli
10f70 74 65 33 53 65 6c 65 63 74 54 72 61 63 65 20 3d  te3SelectTrace =
10f80 20 73 61 76 65 64 53 65 6c 65 63 74 54 72 61 63   savedSelectTrac
10f90 65 3b 0a 23 65 6e 64 69 66 0a 23 69 66 20 64 65  e;.#endif.#if de
10fa0 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 44 45 42  fined(SQLITE_DEB
10fb0 55 47 29 20 26 26 20 64 65 66 69 6e 65 64 28 53  UG) && defined(S
10fc0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 57 48 45  QLITE_ENABLE_WHE
10fd0 52 45 54 52 41 43 45 29 0a 20 20 73 71 6c 69 74  RETRACE).  sqlit
10fe0 65 33 57 68 65 72 65 54 72 61 63 65 20 3d 20 73  e3WhereTrace = s
10ff0 61 76 65 64 57 68 65 72 65 54 72 61 63 65 3b 0a  avedWhereTrace;.
11000 23 65 6e 64 69 66 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  #endif.}../*.** 
11010 52 75 6e 20 61 20 70 72 65 70 61 72 65 64 20 73  Run a prepared s
11020 74 61 74 65 6d 65 6e 74 0a 2a 2f 0a 73 74 61 74  tatement.*/.stat
11030 69 63 20 76 6f 69 64 20 65 78 65 63 5f 70 72 65  ic void exec_pre
11040 70 61 72 65 64 5f 73 74 6d 74 28 0a 20 20 53 68  pared_stmt(.  Sh
11050 65 6c 6c 53 74 61 74 65 20 2a 70 41 72 67 2c 20  ellState *pArg, 
11060 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
11080 2a 20 50 6f 69 6e 74 65 72 20 74 6f 20 53 68 65  * Pointer to She
11090 6c 6c 53 74 61 74 65 20 2a 2f 0a 20 20 73 71 6c  llState */.  sql
110a0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
110b0 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,               
110c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
110d0 20 53 74 61 74 6d 65 6e 74 20 74 6f 20 72 75 6e   Statment to run
110e0 20 2a 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c   */.  int (*xCal
110f0 6c 62 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74  lback)(void*,int
11100 2c 63 68 61 72 2a 2a 2c 63 68 61 72 2a 2a 2c 69  ,char**,char**,i
11110 6e 74 2a 29 20 20 20 2f 2a 20 43 61 6c 6c 62 61  nt*)   /* Callba
11120 63 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 29  ck function */.)
11130 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 2f  {.  int rc;..  /
11140 2a 20 70 65 72 66 6f 72 6d 20 74 68 65 20 66 69  * perform the fi
11150 72 73 74 20 73 74 65 70 2e 20 20 74 68 69 73 20  rst step.  this 
11160 77 69 6c 6c 20 74 65 6c 6c 20 75 73 20 69 66 20  will tell us if 
11170 77 65 0a 20 20 2a 2a 20 68 61 76 65 20 61 20 72  we.  ** have a r
11180 65 73 75 6c 74 20 73 65 74 20 6f 72 20 6e 6f 74  esult set or not
11190 20 61 6e 64 20 68 6f 77 20 77 69 64 65 20 69 74   and how wide it
111a0 20 69 73 2e 0a 20 20 2a 2f 0a 20 20 72 63 20 3d   is..  */.  rc =
111b0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
111c0 74 6d 74 29 3b 0a 20 20 2f 2a 20 69 66 20 77 65  tmt);.  /* if we
111d0 20 68 61 76 65 20 61 20 72 65 73 75 6c 74 20 73   have a result s
111e0 65 74 2e 2e 2e 20 2a 2f 0a 20 20 69 66 28 20 53  et... */.  if( S
111f0 51 4c 49 54 45 5f 52 4f 57 20 3d 3d 20 72 63 20  QLITE_ROW == rc 
11200 29 7b 0a 20 20 20 20 2f 2a 20 69 66 20 77 65 20  ){.    /* if we 
11210 68 61 76 65 20 61 20 63 61 6c 6c 62 61 63 6b 2e  have a callback.
11220 2e 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 78 43  .. */.    if( xC
11230 61 6c 6c 62 61 63 6b 20 29 7b 0a 20 20 20 20 20  allback ){.     
11240 20 2f 2a 20 61 6c 6c 6f 63 61 74 65 20 73 70 61   /* allocate spa
11250 63 65 20 66 6f 72 20 63 6f 6c 20 6e 61 6d 65 20  ce for col name 
11260 70 74 72 2c 20 76 61 6c 75 65 20 70 74 72 2c 20  ptr, value ptr, 
11270 61 6e 64 20 74 79 70 65 20 2a 2f 0a 20 20 20 20  and type */.    
11280 20 20 69 6e 74 20 6e 43 6f 6c 20 3d 20 73 71 6c    int nCol = sql
11290 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e  ite3_column_coun
112a0 74 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  t(pStmt);.      
112b0 76 6f 69 64 20 2a 70 44 61 74 61 20 3d 20 73 71  void *pData = sq
112c0 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36 34 28 33  lite3_malloc64(3
112d0 2a 6e 43 6f 6c 2a 73 69 7a 65 6f 66 28 63 6f 6e  *nCol*sizeof(con
112e0 73 74 20 63 68 61 72 2a 29 20 2b 20 31 29 3b 0a  st char*) + 1);.
112f0 20 20 20 20 20 20 69 66 28 20 21 70 44 61 74 61        if( !pData
11300 20 29 7b 0a 20 20 20 20 20 20 20 20 72 63 20 3d   ){.        rc =
11310 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
11320 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
11330 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c      char **azCol
11340 73 20 3d 20 28 63 68 61 72 20 2a 2a 29 70 44 61  s = (char **)pDa
11350 74 61 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  ta;      /* Name
11360 73 20 6f 66 20 72 65 73 75 6c 74 20 63 6f 6c 75  s of result colu
11370 6d 6e 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  mns */.        c
11380 68 61 72 20 2a 2a 61 7a 56 61 6c 73 20 3d 20 26  har **azVals = &
11390 61 7a 43 6f 6c 73 5b 6e 43 6f 6c 5d 3b 20 20 20  azCols[nCol];   
113a0 20 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 2a      /* Results *
113b0 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 2a 61  /.        int *a
113c0 69 54 79 70 65 73 20 3d 20 28 69 6e 74 20 2a 29  iTypes = (int *)
113d0 26 61 7a 56 61 6c 73 5b 6e 43 6f 6c 5d 3b 20 2f  &azVals[nCol]; /
113e0 2a 20 52 65 73 75 6c 74 20 74 79 70 65 73 20 2a  * Result types *
113f0 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 2c  /.        int i,
11400 20 78 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   x;.        asse
11410 72 74 28 73 69 7a 65 6f 66 28 69 6e 74 29 20 3c  rt(sizeof(int) <
11420 3d 20 73 69 7a 65 6f 66 28 63 68 61 72 20 2a 29  = sizeof(char *)
11430 29 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 61  );.        /* sa
11440 76 65 20 6f 66 66 20 70 74 72 73 20 74 6f 20 63  ve off ptrs to c
11450 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
11460 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20         for(i=0; 
11470 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20  i<nCol; i++){.  
11480 20 20 20 20 20 20 20 20 61 7a 43 6f 6c 73 5b 69          azCols[i
11490 5d 20 3d 20 28 63 68 61 72 20 2a 29 73 71 6c 69  ] = (char *)sqli
114a0 74 65 33 5f 63 6f 6c 75 6d 6e 5f 6e 61 6d 65 28  te3_column_name(
114b0 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20 20 20 20  pStmt, i);.     
114c0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64 6f 7b     }.        do{
114d0 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 65 78  .          /* ex
114e0 74 72 61 63 74 20 74 68 65 20 64 61 74 61 20 61  tract the data a
114f0 6e 64 20 64 61 74 61 20 74 79 70 65 73 20 2a 2f  nd data types */
11500 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
11510 3d 30 3b 20 69 3c 6e 43 6f 6c 3b 20 69 2b 2b 29  =0; i<nCol; i++)
11520 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 69  {.            ai
11530 54 79 70 65 73 5b 69 5d 20 3d 20 78 20 3d 20 73  Types[i] = x = s
11540 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 79  qlite3_column_ty
11550 70 65 28 70 53 74 6d 74 2c 20 69 29 3b 0a 20 20  pe(pStmt, i);.  
11560 20 20 20 20 20 20 20 20 20 20 69 66 28 20 78 3d            if( x=
11570 3d 53 51 4c 49 54 45 5f 42 4c 4f 42 20 26 26 20  =SQLITE_BLOB && 
11580 70 41 72 67 20 26 26 20 70 41 72 67 2d 3e 63 4d  pArg && pArg->cM
11590 6f 64 65 3d 3d 4d 4f 44 45 5f 49 6e 73 65 72 74  ode==MODE_Insert
115a0 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
115b0 20 20 61 7a 56 61 6c 73 5b 69 5d 20 3d 20 22 22    azVals[i] = ""
115c0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
115d0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
115e0 20 20 20 61 7a 56 61 6c 73 5b 69 5d 20 3d 20 28     azVals[i] = (
115f0 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f  char*)sqlite3_co
11600 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c  lumn_text(pStmt,
11610 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   i);.           
11620 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
11630 66 28 20 21 61 7a 56 61 6c 73 5b 69 5d 20 26 26  f( !azVals[i] &&
11640 20 28 61 69 54 79 70 65 73 5b 69 5d 21 3d 53 51   (aiTypes[i]!=SQ
11650 4c 49 54 45 5f 4e 55 4c 4c 29 20 29 7b 0a 20 20  LITE_NULL) ){.  
11660 20 20 20 20 20 20 20 20 20 20 20 20 72 63 20 3d              rc =
11670 20 53 51 4c 49 54 45 5f 4e 4f 4d 45 4d 3b 0a 20   SQLITE_NOMEM;. 
11680 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
11690 61 6b 3b 20 2f 2a 20 66 72 6f 6d 20 66 6f 72 20  ak; /* from for 
116a0 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  */.            }
116b0 0a 20 20 20 20 20 20 20 20 20 20 7d 20 2f 2a 20  .          } /* 
116c0 65 6e 64 20 66 6f 72 20 2a 2f 0a 0a 20 20 20 20  end for */..    
116d0 20 20 20 20 20 20 2f 2a 20 69 66 20 64 61 74 61        /* if data
116e0 20 61 6e 64 20 74 79 70 65 73 20 65 78 74 72 61   and types extra
116f0 63 74 65 64 20 73 75 63 63 65 73 73 66 75 6c 6c  cted successfull
11700 79 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  y... */.        
11710 20 20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57    if( SQLITE_ROW
11720 20 3d 3d 20 72 63 20 29 7b 0a 20 20 20 20 20 20   == rc ){.      
11730 20 20 20 20 20 20 2f 2a 20 63 61 6c 6c 20 74 68        /* call th
11740 65 20 73 75 70 70 6c 69 65 64 20 63 61 6c 6c 62  e supplied callb
11750 61 63 6b 20 77 69 74 68 20 74 68 65 20 72 65 73  ack with the res
11760 75 6c 74 20 72 6f 77 20 64 61 74 61 20 2a 2f 0a  ult row data */.
11770 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
11780 78 43 61 6c 6c 62 61 63 6b 28 70 41 72 67 2c 20  xCallback(pArg, 
11790 6e 43 6f 6c 2c 20 61 7a 56 61 6c 73 2c 20 61 7a  nCol, azVals, az
117a0 43 6f 6c 73 2c 20 61 69 54 79 70 65 73 29 20 29  Cols, aiTypes) )
117b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
117c0 72 63 20 3d 20 53 51 4c 49 54 45 5f 41 42 4f 52  rc = SQLITE_ABOR
117d0 54 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  T;.            }
117e0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
117f0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
11800 5f 73 74 65 70 28 70 53 74 6d 74 29 3b 0a 20 20  _step(pStmt);.  
11810 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
11820 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11830 7d 20 77 68 69 6c 65 28 20 53 51 4c 49 54 45 5f  } while( SQLITE_
11840 52 4f 57 20 3d 3d 20 72 63 20 29 3b 0a 20 20 20  ROW == rc );.   
11850 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
11860 65 28 70 44 61 74 61 29 3b 0a 20 20 20 20 20 20  e(pData);.      
11870 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
11880 20 20 20 64 6f 7b 0a 20 20 20 20 20 20 20 20 72     do{.        r
11890 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
118a0 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 7d  (pStmt);.      }
118b0 20 77 68 69 6c 65 28 20 72 63 20 3d 3d 20 53 51   while( rc == SQ
118c0 4c 49 54 45 5f 52 4f 57 20 29 3b 0a 20 20 20 20  LITE_ROW );.    
118d0 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  }.  }.}../*.** T
118e0 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  his function is 
118f0 63 61 6c 6c 65 64 20 74 6f 20 70 72 6f 63 65 73  called to proces
11900 73 20 53 51 4c 20 69 66 20 74 68 65 20 70 72 65  s SQL if the pre
11910 76 69 6f 75 73 20 73 68 65 6c 6c 20 63 6f 6d 6d  vious shell comm
11920 61 6e 64 0a 2a 2a 20 77 61 73 20 22 2e 65 78 70  and.** was ".exp
11930 65 72 74 22 2e 20 49 74 20 70 61 73 73 65 73 20  ert". It passes 
11940 74 68 65 20 53 51 4c 20 69 6e 20 74 68 65 20 73  the SQL in the s
11950 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74 20 64  econd argument d
11960 69 72 65 63 74 6c 79 20 74 6f 0a 2a 2a 20 74 68  irectly to.** th
11970 65 20 73 71 6c 69 74 65 33 65 78 70 65 72 74 20  e sqlite3expert 
11980 6f 62 6a 65 63 74 2e 0a 2a 2a 0a 2a 2a 20 49 66  object..**.** If
11990 20 73 75 63 63 65 73 73 66 75 6c 2c 20 53 51 4c   successful, SQL
119a0 49 54 45 5f 4f 4b 20 69 73 20 72 65 74 75 72 6e  ITE_OK is return
119b0 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 61  ed. Otherwise, a
119c0 6e 20 53 51 4c 69 74 65 20 65 72 72 6f 72 0a 2a  n SQLite error.*
119d0 2a 20 63 6f 64 65 2e 20 49 6e 20 74 68 69 73 20  * code. In this 
119e0 63 61 73 65 2c 20 28 2a 70 7a 45 72 72 29 20 6d  case, (*pzErr) m
119f0 61 79 20 62 65 20 73 65 74 20 74 6f 20 70 6f 69  ay be set to poi
11a00 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 63  nt to a buffer c
11a10 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a 20 61 6e 20  ontaining.** an 
11a20 45 6e 67 6c 69 73 68 20 6c 61 6e 67 75 61 67 65  English language
11a30 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 2e 20   error message. 
11a40 49 74 20 69 73 20 74 68 65 20 72 65 73 70 6f 6e  It is the respon
11a50 73 69 62 69 6c 69 74 79 20 6f 66 20 74 68 65 0a  sibility of the.
11a60 2a 2a 20 63 61 6c 6c 65 72 20 74 6f 20 65 76 65  ** caller to eve
11a70 6e 74 75 61 6c 6c 79 20 66 72 65 65 20 74 68 69  ntually free thi
11a80 73 20 62 75 66 66 65 72 20 75 73 69 6e 67 20 73  s buffer using s
11a90 71 6c 69 74 65 33 5f 66 72 65 65 28 29 2e 0a 2a  qlite3_free()..*
11aa0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
11ab0 65 72 74 48 61 6e 64 6c 65 53 51 4c 28 0a 20 20  ertHandleSQL(.  
11ac0 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74 61  ShellState *pSta
11ad0 74 65 2c 20 0a 20 20 63 6f 6e 73 74 20 63 68 61  te, .  const cha
11ae0 72 20 2a 7a 53 71 6c 2c 20 0a 20 20 63 68 61 72  r *zSql, .  char
11af0 20 2a 2a 70 7a 45 72 72 0a 29 7b 0a 20 20 61 73   **pzErr.){.  as
11b00 73 65 72 74 28 20 70 53 74 61 74 65 2d 3e 65 78  sert( pState->ex
11b10 70 65 72 74 2e 70 45 78 70 65 72 74 20 29 3b 0a  pert.pExpert );.
11b20 20 20 61 73 73 65 72 74 28 20 70 7a 45 72 72 3d    assert( pzErr=
11b30 3d 30 20 7c 7c 20 2a 70 7a 45 72 72 3d 3d 30 20  =0 || *pzErr==0 
11b40 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
11b50 74 65 33 5f 65 78 70 65 72 74 5f 73 71 6c 28 70  te3_expert_sql(p
11b60 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45  State->expert.pE
11b70 78 70 65 72 74 2c 20 7a 53 71 6c 2c 20 70 7a 45  xpert, zSql, pzE
11b80 72 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  rr);.}../*.** Th
11b90 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 63  is function is c
11ba0 61 6c 6c 65 64 20 65 69 74 68 65 72 20 74 6f 20  alled either to 
11bb0 73 69 6c 65 6e 74 6c 79 20 63 6c 65 61 6e 20 75  silently clean u
11bc0 70 20 74 68 65 20 6f 62 6a 65 63 74 0a 2a 2a 20  p the object.** 
11bd0 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20 22  created by the "
11be0 2e 65 78 70 65 72 74 22 20 63 6f 6d 6d 61 6e 64  .expert" command
11bf0 20 28 69 66 20 62 43 61 6e 63 65 6c 3d 3d 31 29   (if bCancel==1)
11c00 2c 20 6f 72 20 74 6f 20 67 65 6e 65 72 61 74 65  , or to generate
11c10 20 61 20 0a 2a 2a 20 72 65 70 6f 72 74 20 66 72   a .** report fr
11c20 6f 6d 20 69 74 20 61 6e 64 20 74 68 65 6e 20 63  om it and then c
11c30 6c 65 61 6e 20 69 74 20 75 70 20 28 69 66 20 62  lean it up (if b
11c40 43 61 6e 63 65 6c 3d 3d 30 29 2e 0a 2a 2a 0a 2a  Cancel==0)..**.*
11c50 2a 20 49 66 20 73 75 63 63 65 73 73 66 75 6c 2c  * If successful,
11c60 20 53 51 4c 49 54 45 5f 4f 4b 20 69 73 20 72 65   SQLITE_OK is re
11c70 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73  turned. Otherwis
11c80 65 2c 20 61 6e 20 53 51 4c 69 74 65 20 65 72 72  e, an SQLite err
11c90 6f 72 0a 2a 2a 20 63 6f 64 65 2e 20 49 6e 20 74  or.** code. In t
11ca0 68 69 73 20 63 61 73 65 2c 20 28 2a 70 7a 45 72  his case, (*pzEr
11cb0 72 29 20 6d 61 79 20 62 65 20 73 65 74 20 74 6f  r) may be set to
11cc0 20 70 6f 69 6e 74 20 74 6f 20 61 20 62 75 66 66   point to a buff
11cd0 65 72 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 2a 2a  er containing.**
11ce0 20 61 6e 20 45 6e 67 6c 69 73 68 20 6c 61 6e 67   an English lang
11cf0 75 61 67 65 20 65 72 72 6f 72 20 6d 65 73 73 61  uage error messa
11d00 67 65 2e 20 49 74 20 69 73 20 74 68 65 20 72 65  ge. It is the re
11d10 73 70 6f 6e 73 69 62 69 6c 69 74 79 20 6f 66 20  sponsibility of 
11d20 74 68 65 0a 2a 2a 20 63 61 6c 6c 65 72 20 74 6f  the.** caller to
11d30 20 65 76 65 6e 74 75 61 6c 6c 79 20 66 72 65 65   eventually free
11d40 20 74 68 69 73 20 62 75 66 66 65 72 20 75 73 69   this buffer usi
11d50 6e 67 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28  ng sqlite3_free(
11d60 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  )..*/.static int
11d70 20 65 78 70 65 72 74 46 69 6e 69 73 68 28 0a 20   expertFinish(. 
11d80 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53 74   ShellState *pSt
11d90 61 74 65 2c 0a 20 20 69 6e 74 20 62 43 61 6e 63  ate,.  int bCanc
11da0 65 6c 2c 0a 20 20 63 68 61 72 20 2a 2a 70 7a 45  el,.  char **pzE
11db0 72 72 0a 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  rr.){.  int rc =
11dc0 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 71   SQLITE_OK;.  sq
11dd0 6c 69 74 65 33 65 78 70 65 72 74 20 2a 70 20 3d  lite3expert *p =
11de0 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e   pState->expert.
11df0 70 45 78 70 65 72 74 3b 0a 20 20 61 73 73 65 72  pExpert;.  asser
11e00 74 28 20 70 20 29 3b 0a 20 20 61 73 73 65 72 74  t( p );.  assert
11e10 28 20 62 43 61 6e 63 65 6c 20 7c 7c 20 70 7a 45  ( bCancel || pzE
11e20 72 72 3d 3d 30 20 7c 7c 20 2a 70 7a 45 72 72 3d  rr==0 || *pzErr=
11e30 3d 30 20 29 3b 0a 20 20 69 66 28 20 62 43 61 6e  =0 );.  if( bCan
11e40 63 65 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 46 49  cel==0 ){.    FI
11e50 4c 45 20 2a 6f 75 74 20 3d 20 70 53 74 61 74 65  LE *out = pState
11e60 2d 3e 6f 75 74 3b 0a 20 20 20 20 69 6e 74 20 62  ->out;.    int b
11e70 56 65 72 62 6f 73 65 20 3d 20 70 53 74 61 74 65  Verbose = pState
11e80 2d 3e 65 78 70 65 72 74 2e 62 56 65 72 62 6f 73  ->expert.bVerbos
11e90 65 3b 0a 0a 20 20 20 20 72 63 20 3d 20 73 71 6c  e;..    rc = sql
11ea0 69 74 65 33 5f 65 78 70 65 72 74 5f 61 6e 61 6c  ite3_expert_anal
11eb0 79 7a 65 28 70 2c 20 70 7a 45 72 72 29 3b 0a 20  yze(p, pzErr);. 
11ec0 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
11ed0 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 69 6e  E_OK ){.      in
11ee0 74 20 6e 51 75 65 72 79 20 3d 20 73 71 6c 69 74  t nQuery = sqlit
11ef0 65 33 5f 65 78 70 65 72 74 5f 63 6f 75 6e 74 28  e3_expert_count(
11f00 70 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  p);.      int i;
11f10 0a 0a 20 20 20 20 20 20 69 66 28 20 62 56 65 72  ..      if( bVer
11f20 62 6f 73 65 20 29 7b 0a 20 20 20 20 20 20 20 20  bose ){.        
11f30 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 61 6e  const char *zCan
11f40 64 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 70 65  d = sqlite3_expe
11f50 72 74 5f 72 65 70 6f 72 74 28 70 2c 30 2c 45 58  rt_report(p,0,EX
11f60 50 45 52 54 5f 52 45 50 4f 52 54 5f 43 41 4e 44  PERT_REPORT_CAND
11f70 49 44 41 54 45 53 29 3b 0a 20 20 20 20 20 20 20  IDATES);.       
11f80 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
11f90 20 22 2d 2d 20 43 61 6e 64 69 64 61 74 65 73 20   "-- Candidates 
11fa0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
11fb0 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22  -------------\n"
11fc0 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  );.        raw_p
11fd0 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e  rintf(out, "%s\n
11fe0 22 2c 20 7a 43 61 6e 64 29 3b 0a 20 20 20 20 20  ", zCand);.     
11ff0 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   }.      for(i=0
12000 3b 20 69 3c 6e 51 75 65 72 79 3b 20 69 2b 2b 29  ; i<nQuery; i++)
12010 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
12020 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73 71 6c  char *zSql = sql
12030 69 74 65 33 5f 65 78 70 65 72 74 5f 72 65 70 6f  ite3_expert_repo
12040 72 74 28 70 2c 20 69 2c 20 45 58 50 45 52 54 5f  rt(p, i, EXPERT_
12050 52 45 50 4f 52 54 5f 53 51 4c 29 3b 0a 20 20 20  REPORT_SQL);.   
12060 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
12070 2a 7a 49 64 78 20 3d 20 73 71 6c 69 74 65 33 5f  *zIdx = sqlite3_
12080 65 78 70 65 72 74 5f 72 65 70 6f 72 74 28 70 2c  expert_report(p,
12090 20 69 2c 20 45 58 50 45 52 54 5f 52 45 50 4f 52   i, EXPERT_REPOR
120a0 54 5f 49 4e 44 45 58 45 53 29 3b 0a 20 20 20 20  T_INDEXES);.    
120b0 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
120c0 7a 45 51 50 20 3d 20 73 71 6c 69 74 65 33 5f 65  zEQP = sqlite3_e
120d0 78 70 65 72 74 5f 72 65 70 6f 72 74 28 70 2c 20  xpert_report(p, 
120e0 69 2c 20 45 58 50 45 52 54 5f 52 45 50 4f 52 54  i, EXPERT_REPORT
120f0 5f 50 4c 41 4e 29 3b 0a 20 20 20 20 20 20 20 20  _PLAN);.        
12100 69 66 28 20 7a 49 64 78 3d 3d 30 20 29 20 7a 49  if( zIdx==0 ) zI
12110 64 78 20 3d 20 22 28 6e 6f 20 6e 65 77 20 69 6e  dx = "(no new in
12120 64 65 78 65 73 29 5c 6e 22 3b 0a 20 20 20 20 20  dexes)\n";.     
12130 20 20 20 69 66 28 20 62 56 65 72 62 6f 73 65 20     if( bVerbose 
12140 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  ){.          raw
12150 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 2d 2d  _printf(out, "--
12160 20 51 75 65 72 79 20 25 64 20 2d 2d 2d 2d 2d 2d   Query %d ------
12170 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
12180 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 2c 69 2b  ----------\n",i+
12190 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 61  1);.          ra
121a0 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  w_printf(out, "%
121b0 73 5c 6e 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20  s\n\n", zSql);. 
121c0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
121d0 20 72 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c   raw_printf(out,
121e0 20 22 25 73 5c 6e 22 2c 20 7a 49 64 78 29 3b 0a   "%s\n", zIdx);.
121f0 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
12200 74 66 28 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20  tf(out, "%s\n", 
12210 7a 45 51 50 29 3b 0a 20 20 20 20 20 20 7d 0a 20  zEQP);.      }. 
12220 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74     }.  }.  sqlit
12230 65 33 5f 65 78 70 65 72 74 5f 64 65 73 74 72 6f  e3_expert_destro
12240 79 28 70 29 3b 0a 20 20 70 53 74 61 74 65 2d 3e  y(p);.  pState->
12250 65 78 70 65 72 74 2e 70 45 78 70 65 72 74 20 3d  expert.pExpert =
12260 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 72 63 3b   0;.  return rc;
12270 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 45 78 65 63 75  .}.../*.** Execu
12280 74 65 20 61 20 73 74 61 74 65 6d 65 6e 74 20 6f  te a statement o
12290 72 20 73 65 74 20 6f 66 20 73 74 61 74 65 6d 65  r set of stateme
122a0 6e 74 73 2e 20 20 50 72 69 6e 74 0a 2a 2a 20 61  nts.  Print.** a
122b0 6e 79 20 72 65 73 75 6c 74 20 72 6f 77 73 2f 63  ny result rows/c
122c0 6f 6c 75 6d 6e 73 20 64 65 70 65 6e 64 69 6e 67  olumns depending
122d0 20 6f 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   on the current 
122e0 6d 6f 64 65 0a 2a 2a 20 73 65 74 20 76 69 61 20  mode.** set via 
122f0 74 68 65 20 73 75 70 70 6c 69 65 64 20 63 61 6c  the supplied cal
12300 6c 62 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  lback..**.** Thi
12310 73 20 69 73 20 76 65 72 79 20 73 69 6d 69 6c 61  s is very simila
12320 72 20 74 6f 20 53 51 4c 69 74 65 27 73 20 62 75  r to SQLite's bu
12330 69 6c 74 2d 69 6e 20 73 71 6c 69 74 65 33 5f 65  ilt-in sqlite3_e
12340 78 65 63 28 29 0a 2a 2a 20 66 75 6e 63 74 69 6f  xec().** functio
12350 6e 20 65 78 63 65 70 74 20 69 74 20 74 61 6b 65  n except it take
12360 73 20 61 20 73 6c 69 67 68 74 6c 79 20 64 69 66  s a slightly dif
12370 66 65 72 65 6e 74 20 63 61 6c 6c 62 61 63 6b 0a  ferent callback.
12380 2a 2a 20 61 6e 64 20 63 61 6c 6c 62 61 63 6b 20  ** and callback 
12390 64 61 74 61 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  data argument..*
123a0 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73 68 65  /.static int she
123b0 6c 6c 5f 65 78 65 63 28 0a 20 20 73 71 6c 69 74  ll_exec(.  sqlit
123c0 65 33 20 2a 64 62 2c 20 20 20 20 20 20 20 20 20  e3 *db,         
123d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
123e0 20 20 20 20 20 2f 2a 20 41 6e 20 6f 70 65 6e 20       /* An open 
123f0 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f  database */.  co
12400 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 2c 20  nst char *zSql, 
12410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12420 20 20 20 20 20 20 20 20 2f 2a 20 53 51 4c 20 74          /* SQL t
12430 6f 20 62 65 20 65 76 61 6c 75 61 74 65 64 20 2a  o be evaluated *
12440 2f 0a 20 20 69 6e 74 20 28 2a 78 43 61 6c 6c 62  /.  int (*xCallb
12450 61 63 6b 29 28 76 6f 69 64 2a 2c 69 6e 74 2c 63  ack)(void*,int,c
12460 68 61 72 2a 2a 2c 63 68 61 72 2a 2a 2c 69 6e 74  har**,char**,int
12470 2a 29 2c 20 20 20 2f 2a 20 43 61 6c 6c 62 61 63  *),   /* Callbac
12480 6b 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20  k function */.  
12490 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
124b0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 28 6e 6f            /* (no
124c0 74 20 74 68 65 20 73 61 6d 65 20 61 73 20 73 71  t the same as sq
124d0 6c 69 74 65 33 5f 65 78 65 63 29 20 2a 2f 0a 20  lite3_exec) */. 
124e0 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 41 72   ShellState *pAr
124f0 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  g,              
12500 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 6f             /* Po
12510 69 6e 74 65 72 20 74 6f 20 53 68 65 6c 6c 53 74  inter to ShellSt
12520 61 74 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a  ate */.  char **
12530 70 7a 45 72 72 4d 73 67 20 20 20 20 20 20 20 20  pzErrMsg        
12540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12550 20 20 20 2f 2a 20 45 72 72 6f 72 20 6d 73 67 20     /* Error msg 
12560 77 72 69 74 74 65 6e 20 68 65 72 65 20 2a 2f 0a  written here */.
12570 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74 6d  ){.  sqlite3_stm
12580 74 20 2a 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b  t *pStmt = NULL;
12590 20 20 20 20 20 2f 2a 20 53 74 61 74 65 6d 65 6e       /* Statemen
125a0 74 20 74 6f 20 65 78 65 63 75 74 65 2e 20 2a 2f  t to execute. */
125b0 0a 20 20 69 6e 74 20 72 63 20 3d 20 53 51 4c 49  .  int rc = SQLI
125c0 54 45 5f 4f 4b 3b 20 20 20 20 20 20 20 20 20 20  TE_OK;          
125d0 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 43 6f 64     /* Return Cod
125e0 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63 32 3b 0a  e */.  int rc2;.
125f0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c    const char *zL
12600 65 66 74 6f 76 65 72 3b 20 20 20 20 20 20 20 20  eftover;        
12610 20 20 2f 2a 20 54 61 69 6c 20 6f 66 20 75 6e 70    /* Tail of unp
12620 72 6f 63 65 73 73 65 64 20 53 51 4c 20 2a 2f 0a  rocessed SQL */.
12630 0a 20 20 69 66 28 20 70 7a 45 72 72 4d 73 67 20  .  if( pzErrMsg 
12640 29 7b 0a 20 20 20 20 2a 70 7a 45 72 72 4d 73 67  ){.    *pzErrMsg
12650 20 3d 20 4e 55 4c 4c 3b 0a 20 20 7d 0a 0a 20 20   = NULL;.  }..  
12660 69 66 28 20 70 41 72 67 2d 3e 65 78 70 65 72 74  if( pArg->expert
12670 2e 70 45 78 70 65 72 74 20 29 7b 0a 20 20 20 20  .pExpert ){.    
12680 72 63 20 3d 20 65 78 70 65 72 74 48 61 6e 64 6c  rc = expertHandl
12690 65 53 51 4c 28 70 41 72 67 2c 20 7a 53 71 6c 2c  eSQL(pArg, zSql,
126a0 20 70 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20   pzErrMsg);.    
126b0 72 65 74 75 72 6e 20 65 78 70 65 72 74 46 69 6e  return expertFin
126c0 69 73 68 28 70 41 72 67 2c 20 28 72 63 21 3d 53  ish(pArg, (rc!=S
126d0 51 4c 49 54 45 5f 4f 4b 29 2c 20 70 7a 45 72 72  QLITE_OK), pzErr
126e0 4d 73 67 29 3b 0a 20 20 7d 0a 0a 20 20 77 68 69  Msg);.  }..  whi
126f0 6c 65 28 20 7a 53 71 6c 5b 30 5d 20 26 26 20 28  le( zSql[0] && (
12700 53 51 4c 49 54 45 5f 4f 4b 20 3d 3d 20 72 63 29  SQLITE_OK == rc)
12710 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20 63   ){.    static c
12720 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 74 6d 74  onst char *zStmt
12730 53 71 6c 3b 0a 20 20 20 20 72 63 20 3d 20 73 71  Sql;.    rc = sq
12740 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32  lite3_prepare_v2
12750 28 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  (db, zSql, -1, &
12760 70 53 74 6d 74 2c 20 26 7a 4c 65 66 74 6f 76 65  pStmt, &zLeftove
12770 72 29 3b 0a 20 20 20 20 69 66 28 20 53 51 4c 49  r);.    if( SQLI
12780 54 45 5f 4f 4b 20 21 3d 20 72 63 20 29 7b 0a 20  TE_OK != rc ){. 
12790 20 20 20 20 20 69 66 28 20 70 7a 45 72 72 4d 73       if( pzErrMs
127a0 67 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 7a  g ){.        *pz
127b0 45 72 72 4d 73 67 20 3d 20 73 61 76 65 5f 65 72  ErrMsg = save_er
127c0 72 5f 6d 73 67 28 64 62 29 3b 0a 20 20 20 20 20  r_msg(db);.     
127d0 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20   }.    }else{.  
127e0 20 20 20 20 69 66 28 20 21 70 53 74 6d 74 20 29      if( !pStmt )
127f0 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 74 68 69  {.        /* thi
12800 73 20 68 61 70 70 65 6e 73 20 66 6f 72 20 61 20  s happens for a 
12810 63 6f 6d 6d 65 6e 74 20 6f 72 20 77 68 69 74 65  comment or white
12820 2d 73 70 61 63 65 20 2a 2f 0a 20 20 20 20 20 20  -space */.      
12830 20 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 6f 76    zSql = zLeftov
12840 65 72 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c  er;.        whil
12850 65 28 20 49 73 53 70 61 63 65 28 7a 53 71 6c 5b  e( IsSpace(zSql[
12860 30 5d 29 20 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20  0]) ) zSql++;.  
12870 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
12880 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7a 53        }.      zS
12890 74 6d 74 53 71 6c 20 3d 20 73 71 6c 69 74 65 33  tmtSql = sqlite3
128a0 5f 73 71 6c 28 70 53 74 6d 74 29 3b 0a 20 20 20  _sql(pStmt);.   
128b0 20 20 20 69 66 28 20 7a 53 74 6d 74 53 71 6c 3d     if( zStmtSql=
128c0 3d 30 20 29 20 7a 53 74 6d 74 53 71 6c 20 3d 20  =0 ) zStmtSql = 
128d0 22 22 3b 0a 20 20 20 20 20 20 77 68 69 6c 65 28  "";.      while(
128e0 20 49 73 53 70 61 63 65 28 7a 53 74 6d 74 53 71   IsSpace(zStmtSq
128f0 6c 5b 30 5d 29 20 29 20 7a 53 74 6d 74 53 71 6c  l[0]) ) zStmtSql
12900 2b 2b 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 73 61  ++;..      /* sa
12910 76 65 20 6f 66 66 20 74 68 65 20 70 72 65 70 61  ve off the prepa
12920 72 65 64 20 73 74 61 74 6d 65 6e 74 20 68 61 6e  red statment han
12930 64 6c 65 20 61 6e 64 20 72 65 73 65 74 20 72 6f  dle and reset ro
12940 77 20 63 6f 75 6e 74 20 2a 2f 0a 20 20 20 20 20  w count */.     
12950 20 69 66 28 20 70 41 72 67 20 29 7b 0a 20 20 20   if( pArg ){.   
12960 20 20 20 20 20 70 41 72 67 2d 3e 70 53 74 6d 74       pArg->pStmt
12970 20 3d 20 70 53 74 6d 74 3b 0a 20 20 20 20 20 20   = pStmt;.      
12980 20 20 70 41 72 67 2d 3e 63 6e 74 20 3d 20 30 3b    pArg->cnt = 0;
12990 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20  .      }..      
129a0 2f 2a 20 65 63 68 6f 20 74 68 65 20 73 71 6c 20  /* echo the sql 
129b0 73 74 61 74 65 6d 65 6e 74 20 69 66 20 65 63 68  statement if ech
129c0 6f 20 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 66  o on */.      if
129d0 28 20 70 41 72 67 20 26 26 20 53 68 65 6c 6c 48  ( pArg && ShellH
129e0 61 73 46 6c 61 67 28 70 41 72 67 2c 20 53 48 46  asFlag(pArg, SHF
129f0 4c 47 5f 45 63 68 6f 29 20 29 7b 0a 20 20 20 20  LG_Echo) ){.    
12a00 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
12a10 70 41 72 67 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e  pArg->out, "%s\n
12a20 22 2c 20 7a 53 74 6d 74 53 71 6c 20 3f 20 7a 53  ", zStmtSql ? zS
12a30 74 6d 74 53 71 6c 20 3a 20 7a 53 71 6c 29 3b 0a  tmtSql : zSql);.
12a40 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f        }..      /
12a50 2a 20 53 68 6f 77 20 74 68 65 20 45 58 50 4c 41  * Show the EXPLA
12a60 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20 69 66  IN QUERY PLAN if
12a70 20 2e 65 71 70 20 69 73 20 6f 6e 20 2a 2f 0a 20   .eqp is on */. 
12a80 20 20 20 20 20 69 66 28 20 70 41 72 67 20 26 26       if( pArg &&
12a90 20 70 41 72 67 2d 3e 61 75 74 6f 45 51 50 20 26   pArg->autoEQP &
12aa0 26 20 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b  & sqlite3_strlik
12ab0 65 28 22 45 58 50 4c 41 49 4e 25 22 2c 7a 53 74  e("EXPLAIN%",zSt
12ac0 6d 74 53 71 6c 2c 30 29 21 3d 30 20 29 7b 0a 20  mtSql,0)!=0 ){. 
12ad0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
12ae0 74 6d 74 20 2a 70 45 78 70 6c 61 69 6e 3b 0a 20  tmt *pExplain;. 
12af0 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 45 51         char *zEQ
12b00 50 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74  P;.        int t
12b10 72 69 67 67 65 72 45 51 50 20 3d 20 30 3b 0a 20  riggerEQP = 0;. 
12b20 20 20 20 20 20 20 20 64 69 73 61 62 6c 65 5f 64         disable_d
12b30 65 62 75 67 5f 74 72 61 63 65 5f 6d 6f 64 65 73  ebug_trace_modes
12b40 28 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ();.        sqli
12b50 74 65 33 5f 64 62 5f 63 6f 6e 66 69 67 28 64 62  te3_db_config(db
12b60 2c 20 53 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49  , SQLITE_DBCONFI
12b70 47 5f 54 52 49 47 47 45 52 5f 45 51 50 2c 20 2d  G_TRIGGER_EQP, -
12b80 31 2c 20 26 74 72 69 67 67 65 72 45 51 50 29 3b  1, &triggerEQP);
12b90 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 41 72  .        if( pAr
12ba0 67 2d 3e 61 75 74 6f 45 51 50 3e 3d 41 55 54 4f  g->autoEQP>=AUTO
12bb0 45 51 50 5f 74 72 69 67 67 65 72 20 29 7b 0a 20  EQP_trigger ){. 
12bc0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
12bd0 5f 64 62 5f 63 6f 6e 66 69 67 28 64 62 2c 20 53  _db_config(db, S
12be0 51 4c 49 54 45 5f 44 42 43 4f 4e 46 49 47 5f 54  QLITE_DBCONFIG_T
12bf0 52 49 47 47 45 52 5f 45 51 50 2c 20 31 2c 20 30  RIGGER_EQP, 1, 0
12c00 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
12c10 20 20 20 20 20 7a 45 51 50 20 3d 20 73 71 6c 69       zEQP = sqli
12c20 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 45 58 50  te3_mprintf("EXP
12c30 4c 41 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 20  LAIN QUERY PLAN 
12c40 25 73 22 2c 20 7a 53 74 6d 74 53 71 6c 29 3b 0a  %s", zStmtSql);.
12c50 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c          rc = sql
12c60 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28  ite3_prepare_v2(
12c70 64 62 2c 20 7a 45 51 50 2c 20 2d 31 2c 20 26 70  db, zEQP, -1, &p
12c80 45 78 70 6c 61 69 6e 2c 20 30 29 3b 0a 20 20 20  Explain, 0);.   
12c90 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c       if( rc==SQL
12ca0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
12cb0 20 20 20 20 77 68 69 6c 65 28 20 73 71 6c 69 74      while( sqlit
12cc0 65 33 5f 73 74 65 70 28 70 45 78 70 6c 61 69 6e  e3_step(pExplain
12cd0 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
12ce0 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 61 77  .            raw
12cf0 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f 75  _printf(pArg->ou
12d00 74 2c 22 2d 2d 45 51 50 2d 2d 20 25 64 2c 22 2c  t,"--EQP-- %d,",
12d10 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69  sqlite3_column_i
12d20 6e 74 28 70 45 78 70 6c 61 69 6e 2c 20 30 29 29  nt(pExplain, 0))
12d30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 61  ;.            ra
12d40 77 5f 70 72 69 6e 74 66 28 70 41 72 67 2d 3e 6f  w_printf(pArg->o
12d50 75 74 2c 22 25 64 2c 22 2c 20 73 71 6c 69 74 65  ut,"%d,", sqlite
12d60 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 45 78  3_column_int(pEx
12d70 70 6c 61 69 6e 2c 20 31 29 29 3b 0a 20 20 20 20  plain, 1));.    
12d80 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
12d90 74 66 28 70 41 72 67 2d 3e 6f 75 74 2c 22 25 64  tf(pArg->out,"%d
12da0 2c 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ,", sqlite3_colu
12db0 6d 6e 5f 69 6e 74 28 70 45 78 70 6c 61 69 6e 2c  mn_int(pExplain,
12dc0 20 32 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20   2));.          
12dd0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 41    utf8_printf(pA
12de0 72 67 2d 3e 6f 75 74 2c 22 25 73 5c 6e 22 2c 20  rg->out,"%s\n", 
12df0 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74  sqlite3_column_t
12e00 65 78 74 28 70 45 78 70 6c 61 69 6e 2c 20 33 29  ext(pExplain, 3)
12e10 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
12e20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
12e30 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
12e40 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20 20  e(pExplain);.   
12e50 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
12e60 65 28 7a 45 51 50 29 3b 0a 20 20 20 20 20 20 20  e(zEQP);.       
12e70 20 69 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45   if( pArg->autoE
12e80 51 50 3e 3d 41 55 54 4f 45 51 50 5f 66 75 6c 6c  QP>=AUTOEQP_full
12e90 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
12ea0 20 41 6c 73 6f 20 64 6f 20 61 6e 20 45 58 50 4c   Also do an EXPL
12eb0 41 49 4e 20 66 6f 72 20 22 2e 65 71 70 20 66 75  AIN for ".eqp fu
12ec0 6c 6c 22 20 6d 6f 64 65 20 2a 2f 0a 20 20 20 20  ll" mode */.    
12ed0 20 20 20 20 20 20 7a 45 51 50 20 3d 20 73 71 6c        zEQP = sql
12ee0 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 45 58  ite3_mprintf("EX
12ef0 50 4c 41 49 4e 20 25 73 22 2c 20 7a 53 74 6d 74  PLAIN %s", zStmt
12f00 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Sql);.          
12f10 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
12f20 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 45 51 50  pare_v2(db, zEQP
12f30 2c 20 2d 31 2c 20 26 70 45 78 70 6c 61 69 6e 2c  , -1, &pExplain,
12f40 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69   0);.          i
12f50 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc==SQLITE_OK
12f60 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
12f70 70 41 72 67 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f  pArg->cMode = MO
12f80 44 45 5f 45 78 70 6c 61 69 6e 3b 0a 20 20 20 20  DE_Explain;.    
12f90 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e 5f          explain_
12fa0 64 61 74 61 5f 70 72 65 70 61 72 65 28 70 41 72  data_prepare(pAr
12fb0 67 2c 20 70 45 78 70 6c 61 69 6e 29 3b 0a 20 20  g, pExplain);.  
12fc0 20 20 20 20 20 20 20 20 20 20 65 78 65 63 5f 70            exec_p
12fd0 72 65 70 61 72 65 64 5f 73 74 6d 74 28 70 41 72  repared_stmt(pAr
12fe0 67 2c 20 70 45 78 70 6c 61 69 6e 2c 20 78 43 61  g, pExplain, xCa
12ff0 6c 6c 62 61 63 6b 29 3b 0a 20 20 20 20 20 20 20  llback);.       
13000 20 20 20 20 20 65 78 70 6c 61 69 6e 5f 64 61 74       explain_dat
13010 61 5f 64 65 6c 65 74 65 28 70 41 72 67 29 3b 0a  a_delete(pArg);.
13020 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
13030 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69        sqlite3_fi
13040 6e 61 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e 29  nalize(pExplain)
13050 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
13060 74 65 33 5f 66 72 65 65 28 7a 45 51 50 29 3b 0a  te3_free(zEQP);.
13070 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
13080 20 20 73 71 6c 69 74 65 33 5f 64 62 5f 63 6f 6e    sqlite3_db_con
13090 66 69 67 28 64 62 2c 20 53 51 4c 49 54 45 5f 44  fig(db, SQLITE_D
130a0 42 43 4f 4e 46 49 47 5f 54 52 49 47 47 45 52 5f  BCONFIG_TRIGGER_
130b0 45 51 50 2c 20 74 72 69 67 67 65 72 45 51 50 2c  EQP, triggerEQP,
130c0 20 30 29 3b 0a 20 20 20 20 20 20 20 20 72 65 73   0);.        res
130d0 74 6f 72 65 5f 64 65 62 75 67 5f 74 72 61 63 65  tore_debug_trace
130e0 5f 6d 6f 64 65 73 28 29 3b 0a 20 20 20 20 20 20  _modes();.      
130f0 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 41 72  }..      if( pAr
13100 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 41 72  g ){.        pAr
13110 67 2d 3e 63 4d 6f 64 65 20 3d 20 70 41 72 67 2d  g->cMode = pArg-
13120 3e 6d 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 69  >mode;.        i
13130 66 28 20 70 41 72 67 2d 3e 61 75 74 6f 45 78 70  f( pArg->autoExp
13140 6c 61 69 6e 0a 20 20 20 20 20 20 20 20 20 26 26  lain.         &&
13150 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f   sqlite3_column_
13160 63 6f 75 6e 74 28 70 53 74 6d 74 29 3d 3d 38 0a  count(pStmt)==8.
13170 20 20 20 20 20 20 20 20 20 26 26 20 73 71 6c 69           && sqli
13180 74 65 33 5f 73 74 72 6c 69 6b 65 28 22 45 58 50  te3_strlike("EXP
13190 4c 41 49 4e 25 22 2c 20 7a 53 74 6d 74 53 71 6c  LAIN%", zStmtSql
131a0 2c 30 29 3d 3d 30 0a 20 20 20 20 20 20 20 20 29  ,0)==0.        )
131b0 7b 0a 20 20 20 20 20 20 20 20 20 20 70 41 72 67  {.          pArg
131c0 2d 3e 63 4d 6f 64 65 20 3d 20 4d 4f 44 45 5f 45  ->cMode = MODE_E
131d0 78 70 6c 61 69 6e 3b 0a 20 20 20 20 20 20 20 20  xplain;.        
131e0 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66  }..        /* If
131f0 20 74 68 65 20 73 68 65 6c 6c 20 69 73 20 63 75   the shell is cu
13200 72 72 65 6e 74 6c 79 20 69 6e 20 22 2e 65 78 70  rrently in ".exp
13210 6c 61 69 6e 22 20 6d 6f 64 65 2c 20 67 61 74 68  lain" mode, gath
13220 65 72 20 74 68 65 20 65 78 74 72 61 0a 20 20 20  er the extra.   
13230 20 20 20 20 20 2a 2a 20 64 61 74 61 20 72 65 71       ** data req
13240 75 69 72 65 64 20 74 6f 20 61 64 64 20 69 6e 64  uired to add ind
13250 65 6e 74 73 20 74 6f 20 74 68 65 20 6f 75 74 70  ents to the outp
13260 75 74 2e 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  ut.*/.        if
13270 28 20 70 41 72 67 2d 3e 63 4d 6f 64 65 3d 3d 4d  ( pArg->cMode==M
13280 4f 44 45 5f 45 78 70 6c 61 69 6e 20 29 7b 0a 20  ODE_Explain ){. 
13290 20 20 20 20 20 20 20 20 20 65 78 70 6c 61 69 6e           explain
132a0 5f 64 61 74 61 5f 70 72 65 70 61 72 65 28 70 41  _data_prepare(pA
132b0 72 67 2c 20 70 53 74 6d 74 29 3b 0a 20 20 20 20  rg, pStmt);.    
132c0 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20      }.      }.. 
132d0 20 20 20 20 20 65 78 65 63 5f 70 72 65 70 61 72       exec_prepar
132e0 65 64 5f 73 74 6d 74 28 70 41 72 67 2c 20 70 53  ed_stmt(pArg, pS
132f0 74 6d 74 2c 20 78 43 61 6c 6c 62 61 63 6b 29 3b  tmt, xCallback);
13300 0a 20 20 20 20 20 20 65 78 70 6c 61 69 6e 5f 64  .      explain_d
13310 61 74 61 5f 64 65 6c 65 74 65 28 70 41 72 67 29  ata_delete(pArg)
13320 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 70 72 69 6e  ;..      /* prin
13330 74 20 75 73 61 67 65 20 73 74 61 74 73 20 69 66  t usage stats if
13340 20 73 74 61 74 73 20 6f 6e 20 2a 2f 0a 20 20 20   stats on */.   
13350 20 20 20 69 66 28 20 70 41 72 67 20 26 26 20 70     if( pArg && p
13360 41 72 67 2d 3e 73 74 61 74 73 4f 6e 20 29 7b 0a  Arg->statsOn ){.
13370 20 20 20 20 20 20 20 20 64 69 73 70 6c 61 79 5f          display_
13380 73 74 61 74 73 28 64 62 2c 20 70 41 72 67 2c 20  stats(db, pArg, 
13390 30 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20  0);.      }..   
133a0 20 20 20 2f 2a 20 70 72 69 6e 74 20 6c 6f 6f 70     /* print loop
133b0 2d 63 6f 75 6e 74 65 72 73 20 69 66 20 72 65 71  -counters if req
133c0 75 69 72 65 64 20 2a 2f 0a 20 20 20 20 20 20 69  uired */.      i
133d0 66 28 20 70 41 72 67 20 26 26 20 70 41 72 67 2d  f( pArg && pArg-
133e0 3e 73 63 61 6e 73 74 61 74 73 4f 6e 20 29 7b 0a  >scanstatsOn ){.
133f0 20 20 20 20 20 20 20 20 64 69 73 70 6c 61 79 5f          display_
13400 73 63 61 6e 73 74 61 74 73 28 64 62 2c 20 70 41  scanstats(db, pA
13410 72 67 29 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  rg);.      }..  
13420 20 20 20 20 2f 2a 20 46 69 6e 61 6c 69 7a 65 20      /* Finalize 
13430 74 68 65 20 73 74 61 74 65 6d 65 6e 74 20 6a 75  the statement ju
13440 73 74 20 65 78 65 63 75 74 65 64 2e 20 49 66 20  st executed. If 
13450 74 68 69 73 20 66 61 69 6c 73 2c 20 73 61 76 65  this fails, save
13460 20 61 0a 20 20 20 20 20 20 2a 2a 20 63 6f 70 79   a.      ** copy
13470 20 6f 66 20 74 68 65 20 65 72 72 6f 72 20 6d 65   of the error me
13480 73 73 61 67 65 2e 20 4f 74 68 65 72 77 69 73 65  ssage. Otherwise
13490 2c 20 73 65 74 20 7a 53 71 6c 20 74 6f 20 70 6f  , set zSql to po
134a0 69 6e 74 20 74 6f 20 74 68 65 0a 20 20 20 20 20  int to the.     
134b0 20 2a 2a 20 6e 65 78 74 20 73 74 61 74 65 6d 65   ** next stateme
134c0 6e 74 20 74 6f 20 65 78 65 63 75 74 65 2e 20 2a  nt to execute. *
134d0 2f 0a 20 20 20 20 20 20 72 63 32 20 3d 20 73 71  /.      rc2 = sq
134e0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
134f0 53 74 6d 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Stmt);.      if(
13500 20 72 63 21 3d 53 51 4c 49 54 45 5f 4e 4f 4d 45   rc!=SQLITE_NOME
13510 4d 20 29 20 72 63 20 3d 20 72 63 32 3b 0a 20 20  M ) rc = rc2;.  
13520 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
13530 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20  TE_OK ){.       
13540 20 7a 53 71 6c 20 3d 20 7a 4c 65 66 74 6f 76 65   zSql = zLeftove
13550 72 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  r;.        while
13560 28 20 49 73 53 70 61 63 65 28 7a 53 71 6c 5b 30  ( IsSpace(zSql[0
13570 5d 29 20 29 20 7a 53 71 6c 2b 2b 3b 0a 20 20 20  ]) ) zSql++;.   
13580 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 7a 45     }else if( pzE
13590 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 20  rrMsg ){.       
135a0 20 2a 70 7a 45 72 72 4d 73 67 20 3d 20 73 61 76   *pzErrMsg = sav
135b0 65 5f 65 72 72 5f 6d 73 67 28 64 62 29 3b 0a 20  e_err_msg(db);. 
135c0 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a       }..      /*
135d0 20 63 6c 65 61 72 20 73 61 76 65 64 20 73 74 6d   clear saved stm
135e0 74 20 68 61 6e 64 6c 65 20 2a 2f 0a 20 20 20 20  t handle */.    
135f0 20 20 69 66 28 20 70 41 72 67 20 29 7b 0a 20 20    if( pArg ){.  
13600 20 20 20 20 20 20 70 41 72 67 2d 3e 70 53 74 6d        pArg->pStm
13610 74 20 3d 20 4e 55 4c 4c 3b 0a 20 20 20 20 20 20  t = NULL;.      
13620 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 2f 2a 20 65  }.    }.  } /* e
13630 6e 64 20 77 68 69 6c 65 20 2a 2f 0a 0a 20 20 72  nd while */..  r
13640 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a  eturn rc;.}../*.
13650 2a 2a 20 52 65 6c 65 61 73 65 20 6d 65 6d 6f 72  ** Release memor
13660 79 20 70 72 65 76 69 6f 75 73 6c 79 20 61 6c 6c  y previously all
13670 6f 63 61 74 65 64 20 62 79 20 74 61 62 6c 65 43  ocated by tableC
13680 6f 6c 75 6d 6e 4c 69 73 74 28 29 2e 0a 2a 2f 0a  olumnList()..*/.
13690 73 74 61 74 69 63 20 76 6f 69 64 20 66 72 65 65  static void free
136a0 43 6f 6c 75 6d 6e 4c 69 73 74 28 63 68 61 72 20  ColumnList(char 
136b0 2a 2a 61 7a 43 6f 6c 29 7b 0a 20 20 69 6e 74 20  **azCol){.  int 
136c0 69 3b 0a 20 20 66 6f 72 28 69 3d 31 3b 20 61 7a  i;.  for(i=1; az
136d0 43 6f 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20  Col[i]; i++){.  
136e0 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 61    sqlite3_free(a
136f0 7a 43 6f 6c 5b 69 5d 29 3b 0a 20 20 7d 0a 20 20  zCol[i]);.  }.  
13700 2f 2a 20 61 7a 43 6f 6c 5b 30 5d 20 69 73 20 61  /* azCol[0] is a
13710 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 2a   static string *
13720 2f 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  /.  sqlite3_free
13730 28 61 7a 43 6f 6c 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (azCol);.}../*.*
13740 2a 20 52 65 74 75 72 6e 20 61 20 6c 69 73 74 20  * Return a list 
13750 6f 66 20 70 6f 69 6e 74 65 72 73 20 74 6f 20 73  of pointers to s
13760 74 72 69 6e 67 73 20 77 68 69 63 68 20 61 72 65  trings which are
13770 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 61 6c   the names of al
13780 6c 0a 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  l.** columns in 
13790 74 61 62 6c 65 20 7a 54 61 62 2e 20 20 20 54 68  table zTab.   Th
137a0 65 20 6d 65 6d 6f 72 79 20 74 6f 20 68 6f 6c 64  e memory to hold
137b0 20 74 68 65 20 6e 61 6d 65 73 20 69 73 20 64 79   the names is dy
137c0 6e 61 6d 69 63 61 6c 6c 79 0a 2a 2a 20 61 6c 6c  namically.** all
137d0 6f 63 61 74 65 64 20 61 6e 64 20 6d 75 73 74 20  ocated and must 
137e0 62 65 20 72 65 6c 65 61 73 65 64 20 62 79 20 74  be released by t
137f0 68 65 20 63 61 6c 6c 65 72 20 75 73 69 6e 67 20  he caller using 
13800 61 20 73 75 62 73 65 71 75 65 6e 74 20 63 61 6c  a subsequent cal
13810 6c 0a 2a 2a 20 74 6f 20 66 72 65 65 43 6f 6c 75  l.** to freeColu
13820 6d 6e 4c 69 73 74 28 29 2e 0a 2a 2a 0a 2a 2a 20  mnList()..**.** 
13830 54 68 65 20 61 7a 43 6f 6c 5b 30 5d 20 65 6e 74  The azCol[0] ent
13840 72 79 20 69 73 20 75 73 75 61 6c 6c 79 20 4e 55  ry is usually NU
13850 4c 4c 2e 20 20 48 6f 77 65 76 65 72 2c 20 69 66  LL.  However, if
13860 20 7a 54 61 62 20 63 6f 6e 74 61 69 6e 73 20 61   zTab contains a
13870 20 72 6f 77 69 64 0a 2a 2a 20 76 61 6c 75 65 20   rowid.** value 
13880 74 68 61 74 20 6e 65 65 64 73 20 74 6f 20 62 65  that needs to be
13890 20 70 72 65 73 65 72 76 65 64 2c 20 74 68 65 6e   preserved, then
138a0 20 61 7a 43 6f 6c 5b 30 5d 20 69 73 20 66 69 6c   azCol[0] is fil
138b0 6c 65 64 20 69 6e 20 77 69 74 68 20 74 68 65 0a  led in with the.
138c0 2a 2a 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 72  ** name of the r
138d0 6f 77 69 64 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a  owid column..**.
138e0 2a 2a 20 54 68 65 20 66 69 72 73 74 20 72 65 67  ** The first reg
138f0 75 6c 61 72 20 63 6f 6c 75 6d 6e 20 69 6e 20 74  ular column in t
13900 68 65 20 74 61 62 6c 65 20 69 73 20 61 7a 43 6f  he table is azCo
13910 6c 5b 31 5d 2e 20 20 54 68 65 20 6c 69 73 74 20  l[1].  The list 
13920 69 73 20 74 65 72 6d 69 6e 61 74 65 64 0a 2a 2a  is terminated.**
13930 20 62 79 20 61 6e 20 65 6e 74 72 79 20 77 69 74   by an entry wit
13940 68 20 61 7a 43 6f 6c 5b 69 5d 3d 3d 30 2e 0a 2a  h azCol[i]==0..*
13950 2f 0a 73 74 61 74 69 63 20 63 68 61 72 20 2a 2a  /.static char **
13960 74 61 62 6c 65 43 6f 6c 75 6d 6e 4c 69 73 74 28  tableColumnList(
13970 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63  ShellState *p, c
13980 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 29  onst char *zTab)
13990 7b 0a 20 20 63 68 61 72 20 2a 2a 61 7a 43 6f 6c  {.  char **azCol
139a0 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
139b0 73 74 6d 74 20 2a 70 53 74 6d 74 3b 0a 20 20 63  stmt *pStmt;.  c
139c0 68 61 72 20 2a 7a 53 71 6c 3b 0a 20 20 69 6e 74  har *zSql;.  int
139d0 20 6e 43 6f 6c 20 3d 20 30 3b 0a 20 20 69 6e 74   nCol = 0;.  int
139e0 20 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 69   nAlloc = 0;.  i
139f0 6e 74 20 6e 50 4b 20 3d 20 30 3b 20 20 20 20 20  nt nPK = 0;     
13a00 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 50    /* Number of P
13a10 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
13a20 6e 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69 6e 74  ns seen */.  int
13a30 20 69 73 49 50 4b 20 3d 20 30 3b 20 20 20 20 20   isIPK = 0;     
13a40 2f 2a 20 54 72 75 65 20 69 66 20 6f 6e 65 20 50  /* True if one P
13a50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
13a60 6e 20 6f 66 20 74 79 70 65 20 49 4e 54 45 47 45  n of type INTEGE
13a70 52 20 2a 2f 0a 20 20 69 6e 74 20 70 72 65 73 65  R */.  int prese
13a80 72 76 65 52 6f 77 69 64 20 3d 20 53 68 65 6c 6c  rveRowid = Shell
13a90 48 61 73 46 6c 61 67 28 70 2c 20 53 48 46 4c 47  HasFlag(p, SHFLG
13aa0 5f 50 72 65 73 65 72 76 65 52 6f 77 69 64 29 3b  _PreserveRowid);
13ab0 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 7a 53  .  int rc;..  zS
13ac0 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
13ad0 69 6e 74 66 28 22 50 52 41 47 4d 41 20 74 61 62  intf("PRAGMA tab
13ae0 6c 65 5f 69 6e 66 6f 3d 25 51 22 2c 20 7a 54 61  le_info=%Q", zTa
13af0 62 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  b);.  rc = sqlit
13b00 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
13b10 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26  >db, zSql, -1, &
13b20 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 73 71 6c  pStmt, 0);.  sql
13b30 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
13b40 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
13b50 72 6e 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 73  rn 0;.  while( s
13b60 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
13b70 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
13b80 7b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c 3e 3d  {.    if( nCol>=
13b90 6e 41 6c 6c 6f 63 2d 32 20 29 7b 0a 20 20 20 20  nAlloc-2 ){.    
13ba0 20 20 6e 41 6c 6c 6f 63 20 3d 20 6e 41 6c 6c 6f    nAlloc = nAllo
13bb0 63 2a 32 20 2b 20 6e 43 6f 6c 20 2b 20 31 30 3b  c*2 + nCol + 10;
13bc0 0a 20 20 20 20 20 20 61 7a 43 6f 6c 20 3d 20 73  .      azCol = s
13bd0 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63 28 61  qlite3_realloc(a
13be0 7a 43 6f 6c 2c 20 6e 41 6c 6c 6f 63 2a 73 69 7a  zCol, nAlloc*siz
13bf0 65 6f 66 28 61 7a 43 6f 6c 5b 30 5d 29 29 3b 0a  eof(azCol[0]));.
13c00 20 20 20 20 20 20 69 66 28 20 61 7a 43 6f 6c 3d        if( azCol=
13c10 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61  =0 ){.        ra
13c20 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
13c30 20 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20   "Error: out of 
13c40 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20  memory\n");.    
13c50 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20      exit(1);.   
13c60 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 61     }.    }.    a
13c70 7a 43 6f 6c 5b 2b 2b 6e 43 6f 6c 5d 20 3d 20 73  zCol[++nCol] = s
13c80 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
13c90 25 73 22 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c  %s", sqlite3_col
13ca0 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  umn_text(pStmt, 
13cb0 31 29 29 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  1));.    if( sql
13cc0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28  ite3_column_int(
13cd0 70 53 74 6d 74 2c 20 35 29 20 29 7b 0a 20 20 20  pStmt, 5) ){.   
13ce0 20 20 20 6e 50 4b 2b 2b 3b 0a 20 20 20 20 20 20     nPK++;.      
13cf0 69 66 28 20 6e 50 4b 3d 3d 31 0a 20 20 20 20 20  if( nPK==1.     
13d00 20 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74 72    && sqlite3_str
13d10 69 63 6d 70 28 28 63 6f 6e 73 74 20 63 68 61 72  icmp((const char
13d20 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
13d30 5f 74 65 78 74 28 70 53 74 6d 74 2c 32 29 2c 0a  _text(pStmt,2),.
13d40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13d50 20 20 20 20 20 20 20 20 20 20 22 49 4e 54 45 47            "INTEG
13d60 45 52 22 29 3d 3d 30 0a 20 20 20 20 20 20 29 7b  ER")==0.      ){
13d70 0a 20 20 20 20 20 20 20 20 69 73 49 50 4b 20 3d  .        isIPK =
13d80 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   1;.      }else{
13d90 0a 20 20 20 20 20 20 20 20 69 73 49 50 4b 20 3d  .        isIPK =
13da0 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   0;.      }.    
13db0 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f  }.  }.  sqlite3_
13dc0 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
13dd0 0a 20 20 69 66 28 20 61 7a 43 6f 6c 3d 3d 30 20  .  if( azCol==0 
13de0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 61 7a  ) return 0;.  az
13df0 43 6f 6c 5b 30 5d 20 3d 20 30 3b 0a 20 20 61 7a  Col[0] = 0;.  az
13e00 43 6f 6c 5b 6e 43 6f 6c 2b 31 5d 20 3d 20 30 3b  Col[nCol+1] = 0;
13e10 0a 0a 20 20 2f 2a 20 54 68 65 20 64 65 63 69 73  ..  /* The decis
13e20 69 6f 6e 20 6f 66 20 77 68 65 74 68 65 72 20 6f  ion of whether o
13e30 72 20 6e 6f 74 20 61 20 72 6f 77 69 64 20 72 65  r not a rowid re
13e40 61 6c 6c 79 20 6e 65 65 64 73 20 74 6f 20 62 65  ally needs to be
13e50 20 70 72 65 73 65 72 76 65 64 0a 20 20 2a 2a 20   preserved.  ** 
13e60 69 73 20 74 72 69 63 6b 79 2e 20 20 57 65 20 6e  is tricky.  We n
13e70 65 76 65 72 20 6e 65 65 64 20 74 6f 20 70 72 65  ever need to pre
13e80 73 65 72 76 65 20 61 20 72 6f 77 69 64 20 66 6f  serve a rowid fo
13e90 72 20 61 20 57 49 54 48 4f 55 54 20 52 4f 57 49  r a WITHOUT ROWI
13ea0 44 20 74 61 62 6c 65 0a 20 20 2a 2a 20 6f 72 20  D table.  ** or 
13eb0 61 20 74 61 62 6c 65 20 77 69 74 68 20 61 6e 20  a table with an 
13ec0 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
13ed0 4b 45 59 2e 20 20 57 65 20 61 72 65 20 75 6e 61  KEY.  We are una
13ee0 62 6c 65 20 74 6f 20 70 72 65 73 65 72 76 65 0a  ble to preserve.
13ef0 20 20 2a 2a 20 72 6f 77 69 64 73 20 6f 6e 20 74    ** rowids on t
13f00 61 62 6c 65 73 20 77 68 65 72 65 20 74 68 65 20  ables where the 
13f10 72 6f 77 69 64 20 69 73 20 69 6e 61 63 63 65 73  rowid is inacces
13f20 73 69 62 6c 65 20 62 65 63 61 75 73 65 20 74 68  sible because th
13f30 65 72 65 20 61 72 65 20 6f 74 68 65 72 0a 20 20  ere are other.  
13f40 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  ** columns in th
13f50 65 20 74 61 62 6c 65 20 6e 61 6d 65 64 20 22 72  e table named "r
13f60 6f 77 69 64 22 2c 20 22 5f 72 6f 77 69 64 5f 22  owid", "_rowid_"
13f70 2c 20 61 6e 64 20 22 6f 69 64 22 2e 0a 20 20 2a  , and "oid"..  *
13f80 2f 0a 20 20 69 66 28 20 70 72 65 73 65 72 76 65  /.  if( preserve
13f90 52 6f 77 69 64 20 26 26 20 69 73 49 50 4b 20 29  Rowid && isIPK )
13fa0 7b 0a 20 20 20 20 2f 2a 20 49 66 20 61 20 73 69  {.    /* If a si
13fb0 6e 67 6c 65 20 50 52 49 4d 41 52 59 20 4b 45 59  ngle PRIMARY KEY
13fc0 20 63 6f 6c 75 6d 6e 20 77 69 74 68 20 74 79 70   column with typ
13fd0 65 20 49 4e 54 45 47 45 52 20 77 61 73 20 73 65  e INTEGER was se
13fe0 65 6e 2c 20 74 68 65 6e 20 69 74 0a 20 20 20 20  en, then it.    
13ff0 2a 2a 20 6d 69 67 68 74 20 62 65 20 61 6e 20 61  ** might be an a
14000 6c 69 73 65 20 66 6f 72 20 74 68 65 20 52 4f 57  lise for the ROW
14010 49 44 2e 20 20 42 75 74 20 69 74 20 6d 69 67 68  ID.  But it migh
14020 74 20 61 6c 73 6f 20 62 65 20 61 20 57 49 54 48  t also be a WITH
14030 4f 55 54 20 52 4f 57 49 44 0a 20 20 20 20 2a 2a  OUT ROWID.    **
14040 20 74 61 62 6c 65 20 6f 72 20 61 20 49 4e 54 45   table or a INTE
14050 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
14060 44 45 53 43 20 63 6f 6c 75 6d 6e 2c 20 6e 65 69  DESC column, nei
14070 74 68 65 72 20 6f 66 20 77 68 69 63 68 20 61 72  ther of which ar
14080 65 0a 20 20 20 20 2a 2a 20 52 4f 57 49 44 20 61  e.    ** ROWID a
14090 6c 69 61 73 65 73 2e 20 20 54 6f 20 64 69 73 74  liases.  To dist
140a0 69 6e 67 75 69 73 68 20 74 68 65 73 65 20 63 61  inguish these ca
140b0 73 65 73 2c 20 63 68 65 63 6b 20 74 6f 20 73 65  ses, check to se
140c0 65 20 69 66 0a 20 20 20 20 2a 2a 20 74 68 65 72  e if.    ** ther
140d0 65 20 69 73 20 61 20 22 70 6b 22 20 65 6e 74 72  e is a "pk" entr
140e0 79 20 69 6e 20 22 50 52 41 47 4d 41 20 69 6e 64  y in "PRAGMA ind
140f0 65 78 5f 6c 69 73 74 22 2e 20 20 54 68 65 72 65  ex_list".  There
14100 20 77 69 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20   will be.    ** 
14110 6e 6f 20 22 70 6b 22 20 69 6e 64 65 78 20 69 66  no "pk" index if
14120 20 74 68 65 20 50 52 49 4d 41 52 59 20 4b 45 59   the PRIMARY KEY
14130 20 72 65 61 6c 6c 79 20 69 73 20 61 6e 20 61 6c   really is an al
14140 69 61 73 20 66 6f 72 20 74 68 65 20 52 4f 57 49  ias for the ROWI
14150 44 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 7a 53  D..    */.    zS
14160 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
14170 69 6e 74 66 28 22 53 45 4c 45 43 54 20 31 20 46  intf("SELECT 1 F
14180 52 4f 4d 20 70 72 61 67 6d 61 5f 69 6e 64 65 78  ROM pragma_index
14190 5f 6c 69 73 74 28 25 51 29 22 0a 20 20 20 20 20  _list(%Q)".     
141a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
141b0 20 20 20 20 20 20 22 20 57 48 45 52 45 20 6f 72        " WHERE or
141c0 69 67 69 6e 3d 27 70 6b 27 22 2c 20 7a 54 61 62  igin='pk'", zTab
141d0 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
141e0 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
141f0 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
14200 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
14210 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71  sqlite3_free(zSq
14220 6c 29 3b 0a 20 20 20 20 69 66 28 20 72 63 20 29  l);.    if( rc )
14230 7b 0a 20 20 20 20 20 20 66 72 65 65 43 6f 6c 75  {.      freeColu
14240 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c 29 3b 0a 20  mnList(azCol);. 
14250 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
14260 20 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71     }.    rc = sq
14270 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74  lite3_step(pStmt
14280 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
14290 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
142a0 20 20 20 20 70 72 65 73 65 72 76 65 52 6f 77 69      preserveRowi
142b0 64 20 3d 20 72 63 3d 3d 53 51 4c 49 54 45 5f 52  d = rc==SQLITE_R
142c0 4f 57 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 72  OW;.  }.  if( pr
142d0 65 73 65 72 76 65 52 6f 77 69 64 20 29 7b 0a 20  eserveRowid ){. 
142e0 20 20 20 2f 2a 20 4f 6e 6c 79 20 70 72 65 73 65     /* Only prese
142f0 72 76 65 20 74 68 65 20 72 6f 77 69 64 20 69 66  rve the rowid if
14300 20 77 65 20 63 61 6e 20 66 69 6e 64 20 61 20 6e   we can find a n
14310 61 6d 65 20 74 6f 20 75 73 65 20 66 6f 72 20 74  ame to use for t
14320 68 65 0a 20 20 20 20 2a 2a 20 72 6f 77 69 64 20  he.    ** rowid 
14330 2a 2f 0a 20 20 20 20 73 74 61 74 69 63 20 63 68  */.    static ch
14340 61 72 20 2a 61 7a 52 6f 77 69 64 5b 5d 20 3d 20  ar *azRowid[] = 
14350 7b 20 22 72 6f 77 69 64 22 2c 20 22 5f 72 6f 77  { "rowid", "_row
14360 69 64 5f 22 2c 20 22 6f 69 64 22 20 7d 3b 0a 20  id_", "oid" };. 
14370 20 20 20 69 6e 74 20 69 2c 20 6a 3b 0a 20 20 20     int i, j;.   
14380 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 33 3b 20 6a   for(j=0; j<3; j
14390 2b 2b 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 69  ++){.      for(i
143a0 3d 31 3b 20 69 3c 3d 6e 43 6f 6c 3b 20 69 2b 2b  =1; i<=nCol; i++
143b0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
143c0 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 61  qlite3_stricmp(a
143d0 7a 52 6f 77 69 64 5b 6a 5d 2c 61 7a 43 6f 6c 5b  zRowid[j],azCol[
143e0 69 5d 29 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  i])==0 ) break;.
143f0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
14400 28 20 69 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20 20  ( i>nCol ){.    
14410 20 20 20 20 2f 2a 20 41 74 20 74 68 69 73 20 70      /* At this p
14420 6f 69 6e 74 2c 20 77 65 20 6b 6e 6f 77 20 74 68  oint, we know th
14430 61 74 20 61 7a 52 6f 77 69 64 5b 6a 5d 20 69 73  at azRowid[j] is
14440 20 6e 6f 74 20 74 68 65 20 6e 61 6d 65 20 6f 66   not the name of
14450 20 61 6e 79 0a 20 20 20 20 20 20 20 20 2a 2a 20   any.        ** 
14460 6f 72 64 69 6e 61 72 79 20 63 6f 6c 75 6d 6e 20  ordinary column 
14470 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 20 20 56  in the table.  V
14480 65 72 69 66 79 20 74 68 61 74 20 61 7a 52 6f 77  erify that azRow
14490 69 64 5b 6a 5d 20 69 73 20 61 20 76 61 6c 69 64  id[j] is a valid
144a0 0a 20 20 20 20 20 20 20 20 2a 2a 20 6e 61 6d 65  .        ** name
144b0 20 66 6f 72 20 74 68 65 20 72 6f 77 69 64 20 62   for the rowid b
144c0 65 66 6f 72 65 20 61 64 64 69 6e 67 20 69 74 20  efore adding it 
144d0 74 6f 20 61 7a 43 6f 6c 5b 30 5d 2e 20 20 57 49  to azCol[0].  WI
144e0 54 48 4f 55 54 20 52 4f 57 49 44 0a 20 20 20 20  THOUT ROWID.    
144f0 20 20 20 20 2a 2a 20 74 61 62 6c 65 73 20 77 69      ** tables wi
14500 6c 6c 20 66 61 69 6c 20 74 68 69 73 20 6c 61 73  ll fail this las
14510 74 20 63 68 65 63 6b 20 2a 2f 0a 20 20 20 20 20  t check */.     
14520 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
14530 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74  table_column_met
14540 61 64 61 74 61 28 70 2d 3e 64 62 2c 30 2c 7a 54  adata(p->db,0,zT
14550 61 62 2c 61 7a 52 6f 77 69 64 5b 6a 5d 2c 30 2c  ab,azRowid[j],0,
14560 30 2c 30 2c 30 2c 30 29 3b 0a 20 20 20 20 20 20  0,0,0,0);.      
14570 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54 45    if( rc==SQLITE
14580 5f 4f 4b 20 29 20 61 7a 43 6f 6c 5b 30 5d 20 3d  _OK ) azCol[0] =
14590 20 61 7a 52 6f 77 69 64 5b 6a 5d 3b 0a 20 20 20   azRowid[j];.   
145a0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
145b0 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
145c0 72 65 74 75 72 6e 20 61 7a 43 6f 6c 3b 0a 7d 0a  return azCol;.}.
145d0 0a 2f 2a 0a 2a 2a 20 54 6f 67 67 6c 65 20 74 68  ./*.** Toggle th
145e0 65 20 72 65 76 65 72 73 65 5f 75 6e 6f 72 64 65  e reverse_unorde
145f0 72 65 64 5f 73 65 6c 65 63 74 73 20 73 65 74 74  red_selects sett
14600 69 6e 67 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ing..*/.static v
14610 6f 69 64 20 74 6f 67 67 6c 65 53 65 6c 65 63 74  oid toggleSelect
14620 4f 72 64 65 72 28 73 71 6c 69 74 65 33 20 2a 64  Order(sqlite3 *d
14630 62 29 7b 0a 20 20 73 71 6c 69 74 65 33 5f 73 74  b){.  sqlite3_st
14640 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20  mt *pStmt = 0;. 
14650 20 69 6e 74 20 69 53 65 74 74 69 6e 67 20 3d 20   int iSetting = 
14660 30 3b 0a 20 20 63 68 61 72 20 7a 53 74 6d 74 5b  0;.  char zStmt[
14670 31 30 30 5d 3b 0a 20 20 73 71 6c 69 74 65 33 5f  100];.  sqlite3_
14680 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 22  prepare_v2(db, "
14690 50 52 41 47 4d 41 20 72 65 76 65 72 73 65 5f 75  PRAGMA reverse_u
146a0 6e 6f 72 64 65 72 65 64 5f 73 65 6c 65 63 74 73  nordered_selects
146b0 22 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30  ", -1, &pStmt, 0
146c0 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  );.  if( sqlite3
146d0 5f 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51  _step(pStmt)==SQ
146e0 4c 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20  LITE_ROW ){.    
146f0 69 53 65 74 74 69 6e 67 20 3d 20 73 71 6c 69 74  iSetting = sqlit
14700 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53  e3_column_int(pS
14710 74 6d 74 2c 20 30 29 3b 0a 20 20 7d 0a 20 20 73  tmt, 0);.  }.  s
14720 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
14730 70 53 74 6d 74 29 3b 0a 20 20 73 71 6c 69 74 65  pStmt);.  sqlite
14740 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
14750 66 28 7a 53 74 6d 74 29 2c 20 7a 53 74 6d 74 2c  f(zStmt), zStmt,
14760 0a 20 20 20 20 20 20 20 22 50 52 41 47 4d 41 20  .       "PRAGMA 
14770 72 65 76 65 72 73 65 5f 75 6e 6f 72 64 65 72 65  reverse_unordere
14780 64 5f 73 65 6c 65 63 74 73 28 25 64 29 22 2c 20  d_selects(%d)", 
14790 21 69 53 65 74 74 69 6e 67 29 3b 0a 20 20 73 71  !iSetting);.  sq
147a0 6c 69 74 65 33 5f 65 78 65 63 28 64 62 2c 20 7a  lite3_exec(db, z
147b0 53 74 6d 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  Stmt, 0, 0, 0);.
147c0 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73  }../*.** This is
147d0 20 61 20 64 69 66 66 65 72 65 6e 74 20 63 61 6c   a different cal
147e0 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 20 75 73  lback routine us
147f0 65 64 20 66 6f 72 20 64 75 6d 70 69 6e 67 20 74  ed for dumping t
14800 68 65 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 20  he database..** 
14810 45 61 63 68 20 72 6f 77 20 72 65 63 65 69 76 65  Each row receive
14820 64 20 62 79 20 74 68 69 73 20 63 61 6c 6c 62 61  d by this callba
14830 63 6b 20 63 6f 6e 73 69 73 74 73 20 6f 66 20 61  ck consists of a
14840 20 74 61 62 6c 65 20 6e 61 6d 65 2c 0a 2a 2a 20   table name,.** 
14850 74 68 65 20 74 61 62 6c 65 20 74 79 70 65 20 28  the table type (
14860 22 69 6e 64 65 78 22 20 6f 72 20 22 74 61 62 6c  "index" or "tabl
14870 65 22 29 20 61 6e 64 20 53 51 4c 20 74 6f 20 63  e") and SQL to c
14880 72 65 61 74 65 20 74 68 65 20 74 61 62 6c 65 2e  reate the table.
14890 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
148a0 20 73 68 6f 75 6c 64 20 70 72 69 6e 74 20 74 65   should print te
148b0 78 74 20 73 75 66 66 69 63 69 65 6e 74 20 74 6f  xt sufficient to
148c0 20 72 65 63 72 65 61 74 65 20 74 68 65 20 74 61   recreate the ta
148d0 62 6c 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ble..*/.static i
148e0 6e 74 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b  nt dump_callback
148f0 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 69 6e 74  (void *pArg, int
14900 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a   nArg, char **az
14910 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a 4e 6f  Arg, char **azNo
14920 74 55 73 65 64 29 7b 0a 20 20 69 6e 74 20 72 63  tUsed){.  int rc
14930 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
14940 7a 54 61 62 6c 65 3b 0a 20 20 63 6f 6e 73 74 20  zTable;.  const 
14950 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 63  char *zType;.  c
14960 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b  onst char *zSql;
14970 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  .  ShellState *p
14980 20 3d 20 28 53 68 65 6c 6c 53 74 61 74 65 20 2a   = (ShellState *
14990 29 70 41 72 67 3b 0a 0a 20 20 55 4e 55 53 45 44  )pArg;..  UNUSED
149a0 5f 50 41 52 41 4d 45 54 45 52 28 61 7a 4e 6f 74  _PARAMETER(azNot
149b0 55 73 65 64 29 3b 0a 20 20 69 66 28 20 6e 41 72  Used);.  if( nAr
149c0 67 21 3d 33 20 7c 7c 20 61 7a 41 72 67 3d 3d 30  g!=3 || azArg==0
149d0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a   ) return 0;.  z
149e0 54 61 62 6c 65 20 3d 20 61 7a 41 72 67 5b 30 5d  Table = azArg[0]
149f0 3b 0a 20 20 7a 54 79 70 65 20 3d 20 61 7a 41 72  ;.  zType = azAr
14a00 67 5b 31 5d 3b 0a 20 20 7a 53 71 6c 20 3d 20 61  g[1];.  zSql = a
14a10 7a 41 72 67 5b 32 5d 3b 0a 0a 20 20 69 66 28 20  zArg[2];..  if( 
14a20 73 74 72 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22  strcmp(zTable, "
14a30 73 71 6c 69 74 65 5f 73 65 71 75 65 6e 63 65 22  sqlite_sequence"
14a40 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 61 77 5f  )==0 ){.    raw_
14a50 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
14a60 44 45 4c 45 54 45 20 46 52 4f 4d 20 73 71 6c 69  DELETE FROM sqli
14a70 74 65 5f 73 65 71 75 65 6e 63 65 3b 5c 6e 22 29  te_sequence;\n")
14a80 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71  ;.  }else if( sq
14a90 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28 22 73  lite3_strglob("s
14aa0 71 6c 69 74 65 5f 73 74 61 74 3f 22 2c 20 7a 54  qlite_stat?", zT
14ab0 61 62 6c 65 29 3d 3d 30 20 29 7b 0a 20 20 20 20  able)==0 ){.    
14ac0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
14ad0 74 2c 20 22 41 4e 41 4c 59 5a 45 20 73 71 6c 69  t, "ANALYZE sqli
14ae0 74 65 5f 6d 61 73 74 65 72 3b 5c 6e 22 29 3b 0a  te_master;\n");.
14af0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e    }else if( strn
14b00 63 6d 70 28 7a 54 61 62 6c 65 2c 20 22 73 71 6c  cmp(zTable, "sql
14b10 69 74 65 5f 22 2c 20 37 29 3d 3d 30 20 29 7b 0a  ite_", 7)==0 ){.
14b20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
14b30 7d 65 6c 73 65 20 69 66 28 20 73 74 72 6e 63 6d  }else if( strncm
14b40 70 28 7a 53 71 6c 2c 20 22 43 52 45 41 54 45 20  p(zSql, "CREATE 
14b50 56 49 52 54 55 41 4c 20 54 41 42 4c 45 22 2c 20  VIRTUAL TABLE", 
14b60 32 30 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63 68  20)==0 ){.    ch
14b70 61 72 20 2a 7a 49 6e 73 3b 0a 20 20 20 20 69 66  ar *zIns;.    if
14b80 28 20 21 70 2d 3e 77 72 69 74 61 62 6c 65 53 63  ( !p->writableSc
14b90 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 72 61  hema ){.      ra
14ba0 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
14bb0 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c   "PRAGMA writabl
14bc0 65 5f 73 63 68 65 6d 61 3d 4f 4e 3b 5c 6e 22 29  e_schema=ON;\n")
14bd0 3b 0a 20 20 20 20 20 20 70 2d 3e 77 72 69 74 61  ;.      p->writa
14be0 62 6c 65 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  bleSchema = 1;. 
14bf0 20 20 20 7d 0a 20 20 20 20 7a 49 6e 73 20 3d 20     }.    zIns = 
14c00 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
14c10 0a 20 20 20 20 20 20 20 22 49 4e 53 45 52 54 20  .       "INSERT 
14c20 49 4e 54 4f 20 73 71 6c 69 74 65 5f 6d 61 73 74  INTO sqlite_mast
14c30 65 72 28 74 79 70 65 2c 6e 61 6d 65 2c 74 62 6c  er(type,name,tbl
14c40 5f 6e 61 6d 65 2c 72 6f 6f 74 70 61 67 65 2c 73  _name,rootpage,s
14c50 71 6c 29 22 0a 20 20 20 20 20 20 20 22 56 41 4c  ql)".       "VAL
14c60 55 45 53 28 27 74 61 62 6c 65 27 2c 27 25 71 27  UES('table','%q'
14c70 2c 27 25 71 27 2c 30 2c 27 25 71 27 29 3b 22 2c  ,'%q',0,'%q');",
14c80 0a 20 20 20 20 20 20 20 7a 54 61 62 6c 65 2c 20  .       zTable, 
14c90 7a 54 61 62 6c 65 2c 20 7a 53 71 6c 29 3b 0a 20  zTable, zSql);. 
14ca0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
14cb0 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a  ->out, "%s\n", z
14cc0 49 6e 73 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  Ins);.    sqlite
14cd0 33 5f 66 72 65 65 28 7a 49 6e 73 29 3b 0a 20 20  3_free(zIns);.  
14ce0 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 65    return 0;.  }e
14cf0 6c 73 65 7b 0a 20 20 20 20 70 72 69 6e 74 53 63  lse{.    printSc
14d00 68 65 6d 61 4c 69 6e 65 28 70 2d 3e 6f 75 74 2c  hemaLine(p->out,
14d10 20 7a 53 71 6c 2c 20 22 3b 5c 6e 22 29 3b 0a 20   zSql, ";\n");. 
14d20 20 7d 0a 0a 20 20 69 66 28 20 73 74 72 63 6d 70   }..  if( strcmp
14d30 28 7a 54 79 70 65 2c 20 22 74 61 62 6c 65 22 29  (zType, "table")
14d40 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c  ==0 ){.    Shell
14d50 54 65 78 74 20 73 53 65 6c 65 63 74 3b 0a 20 20  Text sSelect;.  
14d60 20 20 53 68 65 6c 6c 54 65 78 74 20 73 54 61 62    ShellText sTab
14d70 6c 65 3b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61  le;.    char **a
14d80 7a 43 6f 6c 3b 0a 20 20 20 20 69 6e 74 20 69 3b  zCol;.    int i;
14d90 0a 20 20 20 20 63 68 61 72 20 2a 73 61 76 65 64  .    char *saved
14da0 44 65 73 74 54 61 62 6c 65 3b 0a 20 20 20 20 69  DestTable;.    i
14db0 6e 74 20 73 61 76 65 64 4d 6f 64 65 3b 0a 0a 20  nt savedMode;.. 
14dc0 20 20 20 61 7a 43 6f 6c 20 3d 20 74 61 62 6c 65     azCol = table
14dd0 43 6f 6c 75 6d 6e 4c 69 73 74 28 70 2c 20 7a 54  ColumnList(p, zT
14de0 61 62 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 61  able);.    if( a
14df0 7a 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20  zCol==0 ){.     
14e00 20 70 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20   p->nErr++;.    
14e10 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
14e20 7d 0a 0a 20 20 20 20 2f 2a 20 41 6c 77 61 79 73  }..    /* Always
14e30 20 71 75 6f 74 65 20 74 68 65 20 74 61 62 6c 65   quote the table
14e40 20 6e 61 6d 65 2c 20 65 76 65 6e 20 69 66 20 69   name, even if i
14e50 74 20 61 70 70 65 61 72 73 20 74 6f 20 62 65 20  t appears to be 
14e60 70 75 72 65 20 61 73 63 69 69 2c 0a 20 20 20 20  pure ascii,.    
14e70 2a 2a 20 69 6e 20 63 61 73 65 20 69 74 20 69 73  ** in case it is
14e80 20 61 20 6b 65 79 77 6f 72 64 2e 20 45 78 3a 20   a keyword. Ex: 
14e90 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 22 74 61   INSERT INTO "ta
14ea0 62 6c 65 22 20 2e 2e 2e 20 2a 2f 0a 20 20 20 20  ble" ... */.    
14eb0 69 6e 69 74 54 65 78 74 28 26 73 54 61 62 6c 65  initText(&sTable
14ec0 29 3b 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78  );.    appendTex
14ed0 74 28 26 73 54 61 62 6c 65 2c 20 7a 54 61 62 6c  t(&sTable, zTabl
14ee0 65 2c 20 71 75 6f 74 65 43 68 61 72 28 7a 54 61  e, quoteChar(zTa
14ef0 62 6c 65 29 29 3b 0a 20 20 20 20 2f 2a 20 49 66  ble));.    /* If
14f00 20 70 72 65 73 65 72 76 69 6e 67 20 74 68 65 20   preserving the 
14f10 72 6f 77 69 64 2c 20 61 64 64 20 61 20 63 6f 6c  rowid, add a col
14f20 75 6d 6e 20 6c 69 73 74 20 61 66 74 65 72 20 74  umn list after t
14f30 68 65 20 74 61 62 6c 65 20 6e 61 6d 65 2e 0a 20  he table name.. 
14f40 20 20 20 2a 2a 20 49 6e 20 6f 74 68 65 72 20 77     ** In other w
14f50 6f 72 64 73 3a 20 20 22 49 4e 53 45 52 54 20 49  ords:  "INSERT I
14f60 4e 54 4f 20 74 61 62 28 72 6f 77 69 64 2c 61 2c  NTO tab(rowid,a,
14f70 62 2c 63 2c 2e 2e 2e 29 20 56 41 4c 55 45 53 28  b,c,...) VALUES(
14f80 2e 2e 2e 29 22 0a 20 20 20 20 2a 2a 20 69 6e 73  ...)".    ** ins
14f90 74 65 61 64 20 6f 66 20 74 68 65 20 75 73 75 61  tead of the usua
14fa0 6c 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74  l "INSERT INTO t
14fb0 61 62 20 56 41 4c 55 45 53 28 2e 2e 2e 29 22 2e  ab VALUES(...)".
14fc0 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
14fd0 61 7a 43 6f 6c 5b 30 5d 20 29 7b 0a 20 20 20 20  azCol[0] ){.    
14fe0 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 54    appendText(&sT
14ff0 61 62 6c 65 2c 20 22 28 22 2c 20 30 29 3b 0a 20  able, "(", 0);. 
15000 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
15010 26 73 54 61 62 6c 65 2c 20 61 7a 43 6f 6c 5b 30  &sTable, azCol[0
15020 5d 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f 72  ], 0);.      for
15030 28 69 3d 31 3b 20 61 7a 43 6f 6c 5b 69 5d 3b 20  (i=1; azCol[i]; 
15040 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 70  i++){.        ap
15050 70 65 6e 64 54 65 78 74 28 26 73 54 61 62 6c 65  pendText(&sTable
15060 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 20  , ",", 0);.     
15070 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
15080 54 61 62 6c 65 2c 20 61 7a 43 6f 6c 5b 69 5d 2c  Table, azCol[i],
15090 20 71 75 6f 74 65 43 68 61 72 28 61 7a 43 6f 6c   quoteChar(azCol
150a0 5b 69 5d 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20  [i]));.      }. 
150b0 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
150c0 26 73 54 61 62 6c 65 2c 20 22 29 22 2c 20 30 29  &sTable, ")", 0)
150d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
150e0 42 75 69 6c 64 20 61 6e 20 61 70 70 72 6f 70 72  Build an appropr
150f0 69 61 74 65 20 53 45 4c 45 43 54 20 73 74 61 74  iate SELECT stat
15100 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 69 6e 69  ement */.    ini
15110 74 54 65 78 74 28 26 73 53 65 6c 65 63 74 29 3b  tText(&sSelect);
15120 0a 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28  .    appendText(
15130 26 73 53 65 6c 65 63 74 2c 20 22 53 45 4c 45 43  &sSelect, "SELEC
15140 54 20 22 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  T ", 0);.    if(
15150 20 61 7a 43 6f 6c 5b 30 5d 20 29 7b 0a 20 20 20   azCol[0] ){.   
15160 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
15170 53 65 6c 65 63 74 2c 20 61 7a 43 6f 6c 5b 30 5d  Select, azCol[0]
15180 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 70 70 65  , 0);.      appe
15190 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
151a0 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20 20 7d 0a   ",", 0);.    }.
151b0 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 61 7a 43      for(i=1; azC
151c0 6f 6c 5b 69 5d 3b 20 69 2b 2b 29 7b 0a 20 20 20  ol[i]; i++){.   
151d0 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
151e0 53 65 6c 65 63 74 2c 20 61 7a 43 6f 6c 5b 69 5d  Select, azCol[i]
151f0 2c 20 71 75 6f 74 65 43 68 61 72 28 61 7a 43 6f  , quoteChar(azCo
15200 6c 5b 69 5d 29 29 3b 0a 20 20 20 20 20 20 69 66  l[i]));.      if
15210 28 20 61 7a 43 6f 6c 5b 69 2b 31 5d 20 29 7b 0a  ( azCol[i+1] ){.
15220 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
15230 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 2c 22  xt(&sSelect, ","
15240 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
15250 20 20 7d 0a 20 20 20 20 66 72 65 65 43 6f 6c 75    }.    freeColu
15260 6d 6e 4c 69 73 74 28 61 7a 43 6f 6c 29 3b 0a 20  mnList(azCol);. 
15270 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
15280 53 65 6c 65 63 74 2c 20 22 20 46 52 4f 4d 20 22  Select, " FROM "
15290 2c 20 30 29 3b 0a 20 20 20 20 61 70 70 65 6e 64  , 0);.    append
152a0 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a  Text(&sSelect, z
152b0 54 61 62 6c 65 2c 20 71 75 6f 74 65 43 68 61 72  Table, quoteChar
152c0 28 7a 54 61 62 6c 65 29 29 3b 0a 0a 20 20 20 20  (zTable));..    
152d0 73 61 76 65 64 44 65 73 74 54 61 62 6c 65 20 3d  savedDestTable =
152e0 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c 65 3b 0a   p->zDestTable;.
152f0 20 20 20 20 73 61 76 65 64 4d 6f 64 65 20 3d 20      savedMode = 
15300 70 2d 3e 6d 6f 64 65 3b 0a 20 20 20 20 70 2d 3e  p->mode;.    p->
15310 7a 44 65 73 74 54 61 62 6c 65 20 3d 20 73 54 61  zDestTable = sTa
15320 62 6c 65 2e 7a 3b 0a 20 20 20 20 70 2d 3e 6d 6f  ble.z;.    p->mo
15330 64 65 20 3d 20 70 2d 3e 63 4d 6f 64 65 20 3d 20  de = p->cMode = 
15340 4d 4f 44 45 5f 49 6e 73 65 72 74 3b 0a 20 20 20  MODE_Insert;.   
15350 20 72 63 20 3d 20 73 68 65 6c 6c 5f 65 78 65 63   rc = shell_exec
15360 28 70 2d 3e 64 62 2c 20 73 53 65 6c 65 63 74 2e  (p->db, sSelect.
15370 7a 2c 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63  z, shell_callbac
15380 6b 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 69 66  k, p, 0);.    if
15390 28 20 28 72 63 26 30 78 66 66 29 3d 3d 53 51 4c  ( (rc&0xff)==SQL
153a0 49 54 45 5f 43 4f 52 52 55 50 54 20 29 7b 0a 20  ITE_CORRUPT ){. 
153b0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
153c0 70 2d 3e 6f 75 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a  p->out, "/******
153d0 20 43 4f 52 52 55 50 54 49 4f 4e 20 45 52 52 4f   CORRUPTION ERRO
153e0 52 20 2a 2a 2a 2a 2a 2a 2a 2f 5c 6e 22 29 3b 0a  R *******/\n");.
153f0 20 20 20 20 20 20 74 6f 67 67 6c 65 53 65 6c 65        toggleSele
15400 63 74 4f 72 64 65 72 28 70 2d 3e 64 62 29 3b 0a  ctOrder(p->db);.
15410 20 20 20 20 20 20 73 68 65 6c 6c 5f 65 78 65 63        shell_exec
15420 28 70 2d 3e 64 62 2c 20 73 53 65 6c 65 63 74 2e  (p->db, sSelect.
15430 7a 2c 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63  z, shell_callbac
15440 6b 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20 20 20  k, p, 0);.      
15450 74 6f 67 67 6c 65 53 65 6c 65 63 74 4f 72 64 65  toggleSelectOrde
15460 72 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20 7d 0a  r(p->db);.    }.
15470 20 20 20 20 70 2d 3e 7a 44 65 73 74 54 61 62 6c      p->zDestTabl
15480 65 20 3d 20 73 61 76 65 64 44 65 73 74 54 61 62  e = savedDestTab
15490 6c 65 3b 0a 20 20 20 20 70 2d 3e 6d 6f 64 65 20  le;.    p->mode 
154a0 3d 20 73 61 76 65 64 4d 6f 64 65 3b 0a 20 20 20  = savedMode;.   
154b0 20 66 72 65 65 54 65 78 74 28 26 73 54 61 62 6c   freeText(&sTabl
154c0 65 29 3b 0a 20 20 20 20 66 72 65 65 54 65 78 74  e);.    freeText
154d0 28 26 73 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  (&sSelect);.    
154e0 69 66 28 20 72 63 20 29 20 70 2d 3e 6e 45 72 72  if( rc ) p->nErr
154f0 2b 2b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ++;.  }.  return
15500 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 75 6e   0;.}../*.** Run
15510 20 7a 51 75 65 72 79 2e 20 20 55 73 65 20 64 75   zQuery.  Use du
15520 6d 70 5f 63 61 6c 6c 62 61 63 6b 28 29 20 61 73  mp_callback() as
15530 20 74 68 65 20 63 61 6c 6c 62 61 63 6b 20 72 6f   the callback ro
15540 75 74 69 6e 65 20 73 6f 20 74 68 61 74 0a 2a 2a  utine so that.**
15550 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66   the contents of
15560 20 74 68 65 20 71 75 65 72 79 20 61 72 65 20 6f   the query are o
15570 75 74 70 75 74 20 61 73 20 53 51 4c 20 73 74 61  utput as SQL sta
15580 74 65 6d 65 6e 74 73 2e 0a 2a 2a 0a 2a 2a 20 49  tements..**.** I
15590 66 20 77 65 20 67 65 74 20 61 20 53 51 4c 49 54  f we get a SQLIT
155a0 45 5f 43 4f 52 52 55 50 54 20 65 72 72 6f 72 2c  E_CORRUPT error,
155b0 20 72 65 72 75 6e 20 74 68 65 20 71 75 65 72 79   rerun the query
155c0 20 61 66 74 65 72 20 61 70 70 65 6e 64 69 6e 67   after appending
155d0 0a 2a 2a 20 22 4f 52 44 45 52 20 42 59 20 72 6f  .** "ORDER BY ro
155e0 77 69 64 20 44 45 53 43 22 20 74 6f 20 74 68 65  wid DESC" to the
155f0 20 65 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   end..*/.static 
15600 69 6e 74 20 72 75 6e 5f 73 63 68 65 6d 61 5f 64  int run_schema_d
15610 75 6d 70 5f 71 75 65 72 79 28 0a 20 20 53 68 65  ump_query(.  She
15620 6c 6c 53 74 61 74 65 20 2a 70 2c 0a 20 20 63 6f  llState *p,.  co
15630 6e 73 74 20 63 68 61 72 20 2a 7a 51 75 65 72 79  nst char *zQuery
15640 0a 29 7b 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20  .){.  int rc;.  
15650 63 68 61 72 20 2a 7a 45 72 72 20 3d 20 30 3b 0a  char *zErr = 0;.
15660 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 65    rc = sqlite3_e
15670 78 65 63 28 70 2d 3e 64 62 2c 20 7a 51 75 65 72  xec(p->db, zQuer
15680 79 2c 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b  y, dump_callback
15690 2c 20 70 2c 20 26 7a 45 72 72 29 3b 0a 20 20 69  , p, &zErr);.  i
156a0 66 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 43 4f  f( rc==SQLITE_CO
156b0 52 52 55 50 54 20 29 7b 0a 20 20 20 20 63 68 61  RRUPT ){.    cha
156c0 72 20 2a 7a 51 32 3b 0a 20 20 20 20 69 6e 74 20  r *zQ2;.    int 
156d0 6c 65 6e 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  len = strlen30(z
156e0 51 75 65 72 79 29 3b 0a 20 20 20 20 72 61 77 5f  Query);.    raw_
156f0 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
15700 2f 2a 2a 2a 2a 2a 2a 20 43 4f 52 52 55 50 54 49  /****** CORRUPTI
15710 4f 4e 20 45 52 52 4f 52 20 2a 2a 2a 2a 2a 2a 2a  ON ERROR *******
15720 2f 5c 6e 22 29 3b 0a 20 20 20 20 69 66 28 20 7a  /\n");.    if( z
15730 45 72 72 20 29 7b 0a 20 20 20 20 20 20 75 74 66  Err ){.      utf
15740 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
15750 20 22 2f 2a 2a 2a 2a 2a 2a 20 25 73 20 2a 2a 2a   "/****** %s ***
15760 2a 2a 2a 2f 5c 6e 22 2c 20 7a 45 72 72 29 3b 0a  ***/\n", zErr);.
15770 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
15780 65 65 28 7a 45 72 72 29 3b 0a 20 20 20 20 20 20  ee(zErr);.      
15790 7a 45 72 72 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  zErr = 0;.    }.
157a0 20 20 20 20 7a 51 32 20 3d 20 6d 61 6c 6c 6f 63      zQ2 = malloc
157b0 28 20 6c 65 6e 2b 31 30 30 20 29 3b 0a 20 20 20  ( len+100 );.   
157c0 20 69 66 28 20 7a 51 32 3d 3d 30 20 29 20 72 65   if( zQ2==0 ) re
157d0 74 75 72 6e 20 72 63 3b 0a 20 20 20 20 73 71 6c  turn rc;.    sql
157e0 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 6c 65  ite3_snprintf(le
157f0 6e 2b 31 30 30 2c 20 7a 51 32 2c 20 22 25 73 20  n+100, zQ2, "%s 
15800 4f 52 44 45 52 20 42 59 20 72 6f 77 69 64 20 44  ORDER BY rowid D
15810 45 53 43 22 2c 20 7a 51 75 65 72 79 29 3b 0a 20  ESC", zQuery);. 
15820 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
15830 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 51 32 2c  exec(p->db, zQ2,
15840 20 64 75 6d 70 5f 63 61 6c 6c 62 61 63 6b 2c 20   dump_callback, 
15850 70 2c 20 26 7a 45 72 72 29 3b 0a 20 20 20 20 69  p, &zErr);.    i
15860 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 75  f( rc ){.      u
15870 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
15880 74 2c 20 22 2f 2a 2a 2a 2a 2a 2a 20 45 52 52 4f  t, "/****** ERRO
15890 52 3a 20 25 73 20 2a 2a 2a 2a 2a 2a 2f 5c 6e 22  R: %s ******/\n"
158a0 2c 20 7a 45 72 72 29 3b 0a 20 20 20 20 7d 65 6c  , zErr);.    }el
158b0 73 65 7b 0a 20 20 20 20 20 20 72 63 20 3d 20 53  se{.      rc = S
158c0 51 4c 49 54 45 5f 43 4f 52 52 55 50 54 3b 0a 20  QLITE_CORRUPT;. 
158d0 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
158e0 5f 66 72 65 65 28 7a 45 72 72 29 3b 0a 20 20 20  _free(zErr);.   
158f0 20 66 72 65 65 28 7a 51 32 29 3b 0a 20 20 7d 0a   free(zQ2);.  }.
15900 20 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a    return rc;.}..
15910 2f 2a 0a 2a 2a 20 54 65 78 74 20 6f 66 20 61 20  /*.** Text of a 
15920 68 65 6c 70 20 6d 65 73 73 61 67 65 0a 2a 2f 0a  help message.*/.
15930 73 74 61 74 69 63 20 63 68 61 72 20 7a 48 65 6c  static char zHel
15940 70 5b 5d 20 3d 0a 23 69 66 6e 64 65 66 20 53 51  p[] =.#ifndef SQ
15950 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52  LITE_OMIT_AUTHOR
15960 49 5a 41 54 49 4f 4e 0a 20 20 22 2e 61 75 74 68  IZATION.  ".auth
15970 20 4f 4e 7c 4f 46 46 20 20 20 20 20 20 20 20 20   ON|OFF         
15980 20 20 53 68 6f 77 20 61 75 74 68 6f 72 69 7a 65    Show authorize
15990 72 20 63 61 6c 6c 62 61 63 6b 73 5c 6e 22 0a 23  r callbacks\n".#
159a0 65 6e 64 69 66 0a 20 20 22 2e 62 61 63 6b 75 70  endif.  ".backup
159b0 20 3f 44 42 3f 20 46 49 4c 45 20 20 20 20 20 20   ?DB? FILE      
159c0 42 61 63 6b 75 70 20 44 42 20 28 64 65 66 61 75  Backup DB (defau
159d0 6c 74 20 5c 22 6d 61 69 6e 5c 22 29 20 74 6f 20  lt \"main\") to 
159e0 46 49 4c 45 5c 6e 22 0a 20 20 22 2e 62 61 69 6c  FILE\n".  ".bail
159f0 20 6f 6e 7c 6f 66 66 20 20 20 20 20 20 20 20 20   on|off         
15a00 20 20 53 74 6f 70 20 61 66 74 65 72 20 68 69 74    Stop after hit
15a10 74 69 6e 67 20 61 6e 20 65 72 72 6f 72 2e 20 20  ting an error.  
15a20 44 65 66 61 75 6c 74 20 4f 46 46 5c 6e 22 0a 20  Default OFF\n". 
15a30 20 22 2e 62 69 6e 61 72 79 20 6f 6e 7c 6f 66 66   ".binary on|off
15a40 20 20 20 20 20 20 20 20 20 54 75 72 6e 20 62 69           Turn bi
15a50 6e 61 72 79 20 6f 75 74 70 75 74 20 6f 6e 20 6f  nary output on o
15a60 72 20 6f 66 66 2e 20 20 44 65 66 61 75 6c 74 20  r off.  Default 
15a70 4f 46 46 5c 6e 22 0a 20 20 22 2e 63 64 20 44 49  OFF\n".  ".cd DI
15a80 52 45 43 54 4f 52 59 20 20 20 20 20 20 20 20 20  RECTORY         
15a90 20 43 68 61 6e 67 65 20 74 68 65 20 77 6f 72 6b   Change the work
15aa0 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 74 6f  ing directory to
15ab0 20 44 49 52 45 43 54 4f 52 59 5c 6e 22 0a 20 20   DIRECTORY\n".  
15ac0 22 2e 63 68 61 6e 67 65 73 20 6f 6e 7c 6f 66 66  ".changes on|off
15ad0 20 20 20 20 20 20 20 20 53 68 6f 77 20 6e 75 6d          Show num
15ae0 62 65 72 20 6f 66 20 72 6f 77 73 20 63 68 61 6e  ber of rows chan
15af0 67 65 64 20 62 79 20 53 51 4c 5c 6e 22 0a 20 20  ged by SQL\n".  
15b00 22 2e 63 68 65 63 6b 20 47 4c 4f 42 20 20 20 20  ".check GLOB    
15b10 20 20 20 20 20 20 20 20 46 61 69 6c 20 69 66 20          Fail if 
15b20 6f 75 74 70 75 74 20 73 69 6e 63 65 20 2e 74 65  output since .te
15b30 73 74 63 61 73 65 20 64 6f 65 73 20 6e 6f 74 20  stcase does not 
15b40 6d 61 74 63 68 5c 6e 22 0a 20 20 22 2e 63 6c 6f  match\n".  ".clo
15b50 6e 65 20 4e 45 57 44 42 20 20 20 20 20 20 20 20  ne NEWDB        
15b60 20 20 20 43 6c 6f 6e 65 20 64 61 74 61 20 69 6e     Clone data in
15b70 74 6f 20 4e 45 57 44 42 20 66 72 6f 6d 20 74 68  to NEWDB from th
15b80 65 20 65 78 69 73 74 69 6e 67 20 64 61 74 61 62  e existing datab
15b90 61 73 65 5c 6e 22 0a 20 20 22 2e 64 61 74 61 62  ase\n".  ".datab
15ba0 61 73 65 73 20 20 20 20 20 20 20 20 20 20 20 20  ases            
15bb0 20 4c 69 73 74 20 6e 61 6d 65 73 20 61 6e 64 20   List names and 
15bc0 66 69 6c 65 73 20 6f 66 20 61 74 74 61 63 68 65  files of attache
15bd0 64 20 64 61 74 61 62 61 73 65 73 5c 6e 22 0a 20  d databases\n". 
15be0 20 22 2e 64 62 69 6e 66 6f 20 3f 44 42 3f 20 20   ".dbinfo ?DB?  
15bf0 20 20 20 20 20 20 20 20 20 53 68 6f 77 20 73 74           Show st
15c00 61 74 75 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  atus information
15c10 20 61 62 6f 75 74 20 74 68 65 20 64 61 74 61 62   about the datab
15c20 61 73 65 5c 6e 22 0a 20 20 22 2e 64 75 6d 70 20  ase\n".  ".dump 
15c30 3f 54 41 42 4c 45 3f 20 2e 2e 2e 20 20 20 20 20  ?TABLE? ...     
15c40 20 44 75 6d 70 20 74 68 65 20 64 61 74 61 62 61   Dump the databa
15c50 73 65 20 69 6e 20 61 6e 20 53 51 4c 20 74 65 78  se in an SQL tex
15c60 74 20 66 6f 72 6d 61 74 5c 6e 22 0a 20 20 22 20  t format\n".  " 
15c70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15c80 20 20 20 20 20 20 20 20 49 66 20 54 41 42 4c 45          If TABLE
15c90 20 73 70 65 63 69 66 69 65 64 2c 20 6f 6e 6c 79   specified, only
15ca0 20 64 75 6d 70 20 74 61 62 6c 65 73 20 6d 61 74   dump tables mat
15cb0 63 68 69 6e 67 5c 6e 22 0a 20 20 22 20 20 20 20  ching\n".  "    
15cc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15cd0 20 20 20 20 20 4c 49 4b 45 20 70 61 74 74 65 72       LIKE patter
15ce0 6e 20 54 41 42 4c 45 2e 5c 6e 22 0a 20 20 22 2e  n TABLE.\n".  ".
15cf0 65 63 68 6f 20 6f 6e 7c 6f 66 66 20 20 20 20 20  echo on|off     
15d00 20 20 20 20 20 20 54 75 72 6e 20 63 6f 6d 6d 61        Turn comma
15d10 6e 64 20 65 63 68 6f 20 6f 6e 20 6f 72 20 6f 66  nd echo on or of
15d20 66 5c 6e 22 0a 20 20 22 2e 65 71 70 20 6f 6e 7c  f\n".  ".eqp on|
15d30 6f 66 66 7c 66 75 6c 6c 20 20 20 20 20 20 20 45  off|full       E
15d40 6e 61 62 6c 65 20 6f 72 20 64 69 73 61 62 6c 65  nable or disable
15d50 20 61 75 74 6f 6d 61 74 69 63 20 45 58 50 4c 41   automatic EXPLA
15d60 49 4e 20 51 55 45 52 59 20 50 4c 41 4e 5c 6e 22  IN QUERY PLAN\n"
15d70 0a 20 20 22 2e 65 78 69 74 20 20 20 20 20 20 20  .  ".exit       
15d80 20 20 20 20 20 20 20 20 20 20 20 45 78 69 74 20             Exit 
15d90 74 68 69 73 20 70 72 6f 67 72 61 6d 5c 6e 22 0a  this program\n".
15da0 20 20 22 2e 65 78 70 65 72 74 20 20 20 20 20 20    ".expert      
15db0 20 20 20 20 20 20 20 20 20 20 45 58 50 45 52 49            EXPERI
15dc0 4d 45 4e 54 41 4c 2e 20 53 75 67 67 65 73 74 20  MENTAL. Suggest 
15dd0 69 6e 64 65 78 65 73 20 66 6f 72 20 73 70 65 63  indexes for spec
15de0 69 66 69 65 64 20 71 75 65 72 69 65 73 5c 6e 22  ified queries\n"
15df0 0a 2f 2a 20 42 65 63 61 75 73 65 20 65 78 70 6c  ./* Because expl
15e00 61 69 6e 20 6d 6f 64 65 20 63 6f 6d 65 73 20 6f  ain mode comes o
15e10 6e 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  n automatically 
15e20 6e 6f 77 2c 20 74 68 65 20 22 2e 65 78 70 6c 61  now, the ".expla
15e30 69 6e 22 20 6d 6f 64 65 0a 2a 2a 20 69 73 20 72  in" mode.** is r
15e40 65 6d 6f 76 65 64 20 66 72 6f 6d 20 74 68 65 20  emoved from the 
15e50 68 65 6c 70 20 73 63 72 65 65 6e 2e 20 20 49 74  help screen.  It
15e60 20 69 73 20 73 74 69 6c 6c 20 73 75 70 70 6f 72   is still suppor
15e70 74 65 64 20 66 6f 72 20 6c 65 67 61 63 79 2c 20  ted for legacy, 
15e80 68 6f 77 65 76 65 72 20 2a 2f 0a 2f 2a 22 2e 65  however */./*".e
15e90 78 70 6c 61 69 6e 20 3f 6f 6e 7c 6f 66 66 7c 61  xplain ?on|off|a
15ea0 75 74 6f 3f 20 54 75 72 6e 20 45 58 50 4c 41 49  uto? Turn EXPLAI
15eb0 4e 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 6f 6e  N output mode on
15ec0 20 6f 72 20 6f 66 66 20 6f 72 20 74 6f 20 61 75   or off or to au
15ed0 74 6f 6d 61 74 69 63 5c 6e 22 2a 2f 0a 20 20 22  tomatic\n"*/.  "
15ee0 2e 66 75 6c 6c 73 63 68 65 6d 61 20 3f 2d 2d 69  .fullschema ?--i
15ef0 6e 64 65 6e 74 3f 20 53 68 6f 77 20 73 63 68 65  ndent? Show sche
15f00 6d 61 20 61 6e 64 20 74 68 65 20 63 6f 6e 74 65  ma and the conte
15f10 6e 74 20 6f 66 20 73 71 6c 69 74 65 5f 73 74 61  nt of sqlite_sta
15f20 74 20 74 61 62 6c 65 73 5c 6e 22 0a 20 20 22 2e  t tables\n".  ".
15f30 68 65 61 64 65 72 73 20 6f 6e 7c 6f 66 66 20 20  headers on|off  
15f40 20 20 20 20 20 20 54 75 72 6e 20 64 69 73 70 6c        Turn displ
15f50 61 79 20 6f 66 20 68 65 61 64 65 72 73 20 6f 6e  ay of headers on
15f60 20 6f 72 20 6f 66 66 5c 6e 22 0a 20 20 22 2e 68   or off\n".  ".h
15f70 65 6c 70 20 20 20 20 20 20 20 20 20 20 20 20 20  elp             
15f80 20 20 20 20 20 53 68 6f 77 20 74 68 69 73 20 6d       Show this m
15f90 65 73 73 61 67 65 5c 6e 22 0a 20 20 22 2e 69 6d  essage\n".  ".im
15fa0 70 6f 72 74 20 46 49 4c 45 20 54 41 42 4c 45 20  port FILE TABLE 
15fb0 20 20 20 20 49 6d 70 6f 72 74 20 64 61 74 61 20      Import data 
15fc0 66 72 6f 6d 20 46 49 4c 45 20 69 6e 74 6f 20 54  from FILE into T
15fd0 41 42 4c 45 5c 6e 22 0a 23 69 66 6e 64 65 66 20  ABLE\n".#ifndef 
15fe0 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 53 54  SQLITE_OMIT_TEST
15ff0 5f 43 4f 4e 54 52 4f 4c 0a 20 20 22 2e 69 6d 70  _CONTROL.  ".imp
16000 6f 73 74 65 72 20 49 4e 44 45 58 20 54 41 42 4c  oster INDEX TABL
16010 45 20 20 43 72 65 61 74 65 20 69 6d 70 6f 73 74  E  Create impost
16020 65 72 20 74 61 62 6c 65 20 54 41 42 4c 45 20 6f  er table TABLE o
16030 6e 20 69 6e 64 65 78 20 49 4e 44 45 58 5c 6e 22  n index INDEX\n"
16040 0a 23 65 6e 64 69 66 0a 20 20 22 2e 69 6e 64 65  .#endif.  ".inde
16050 78 65 73 20 3f 54 41 42 4c 45 3f 20 20 20 20 20  xes ?TABLE?     
16060 20 20 53 68 6f 77 20 6e 61 6d 65 73 20 6f 66 20    Show names of 
16070 61 6c 6c 20 69 6e 64 65 78 65 73 5c 6e 22 0a 20  all indexes\n". 
16080 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
16090 20 20 20 20 20 20 20 20 20 20 20 49 66 20 54 41             If TA
160a0 42 4c 45 20 73 70 65 63 69 66 69 65 64 2c 20 6f  BLE specified, o
160b0 6e 6c 79 20 73 68 6f 77 20 69 6e 64 65 78 65 73  nly show indexes
160c0 20 66 6f 72 20 74 61 62 6c 65 73 5c 6e 22 0a 20   for tables\n". 
160d0 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
160e0 20 20 20 20 20 20 20 20 20 20 20 6d 61 74 63 68             match
160f0 69 6e 67 20 4c 49 4b 45 20 70 61 74 74 65 72 6e  ing LIKE pattern
16100 20 54 41 42 4c 45 2e 5c 6e 22 0a 23 69 66 64 65   TABLE.\n".#ifde
16110 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f  f SQLITE_ENABLE_
16120 49 4f 54 52 41 43 45 0a 20 20 22 2e 69 6f 74 72  IOTRACE.  ".iotr
16130 61 63 65 20 46 49 4c 45 20 20 20 20 20 20 20 20  ace FILE        
16140 20 20 45 6e 61 62 6c 65 20 49 2f 4f 20 64 69 61    Enable I/O dia
16150 67 6e 6f 73 74 69 63 20 6c 6f 67 67 69 6e 67 20  gnostic logging 
16160 74 6f 20 46 49 4c 45 5c 6e 22 0a 23 65 6e 64 69  to FILE\n".#endi
16170 66 0a 20 20 22 2e 6c 69 6d 69 74 20 3f 4c 49 4d  f.  ".limit ?LIM
16180 49 54 3f 20 3f 56 41 4c 3f 20 20 20 44 69 73 70  IT? ?VAL?   Disp
16190 6c 61 79 20 6f 72 20 63 68 61 6e 67 65 20 74 68  lay or change th
161a0 65 20 76 61 6c 75 65 20 6f 66 20 61 6e 20 53 51  e value of an SQ
161b0 4c 49 54 45 5f 4c 49 4d 49 54 5c 6e 22 0a 20 20  LITE_LIMIT\n".  
161c0 22 2e 6c 69 6e 74 20 4f 50 54 49 4f 4e 53 20 20  ".lint OPTIONS  
161d0 20 20 20 20 20 20 20 20 52 65 70 6f 72 74 20 70          Report p
161e0 6f 74 65 6e 74 69 61 6c 20 73 63 68 65 6d 61 20  otential schema 
161f0 69 73 73 75 65 73 2e 20 4f 70 74 69 6f 6e 73 3a  issues. Options:
16200 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20  \n".  "         
16210 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16220 66 6b 65 79 2d 69 6e 64 65 78 65 73 20 20 20 20  fkey-indexes    
16230 20 46 69 6e 64 20 6d 69 73 73 69 6e 67 20 66 6f   Find missing fo
16240 72 65 69 67 6e 20 6b 65 79 20 69 6e 64 65 78 65  reign key indexe
16250 73 5c 6e 22 0a 23 69 66 6e 64 65 66 20 53 51 4c  s\n".#ifndef SQL
16260 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
16270 54 45 4e 53 49 4f 4e 0a 20 20 22 2e 6c 6f 61 64  TENSION.  ".load
16280 20 46 49 4c 45 20 3f 45 4e 54 52 59 3f 20 20 20   FILE ?ENTRY?   
16290 20 20 4c 6f 61 64 20 61 6e 20 65 78 74 65 6e 73    Load an extens
162a0 69 6f 6e 20 6c 69 62 72 61 72 79 5c 6e 22 0a 23  ion library\n".#
162b0 65 6e 64 69 66 0a 20 20 22 2e 6c 6f 67 20 46 49  endif.  ".log FI
162c0 4c 45 7c 6f 66 66 20 20 20 20 20 20 20 20 20 20  LE|off          
162d0 54 75 72 6e 20 6c 6f 67 67 69 6e 67 20 6f 6e 20  Turn logging on 
162e0 6f 72 20 6f 66 66 2e 20 20 46 49 4c 45 20 63 61  or off.  FILE ca
162f0 6e 20 62 65 20 73 74 64 65 72 72 2f 73 74 64 6f  n be stderr/stdo
16300 75 74 5c 6e 22 0a 20 20 22 2e 6d 6f 64 65 20 4d  ut\n".  ".mode M
16310 4f 44 45 20 3f 54 41 42 4c 45 3f 20 20 20 20 20  ODE ?TABLE?     
16320 53 65 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 20  Set output mode 
16330 77 68 65 72 65 20 4d 4f 44 45 20 69 73 20 6f 6e  where MODE is on
16340 65 20 6f 66 3a 5c 6e 22 0a 20 20 22 20 20 20 20  e of:\n".  "    
16350 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16360 20 20 20 20 20 61 73 63 69 69 20 20 20 20 43 6f       ascii    Co
16370 6c 75 6d 6e 73 2f 72 6f 77 73 20 64 65 6c 69 6d  lumns/rows delim
16380 69 74 65 64 20 62 79 20 30 78 31 46 20 61 6e 64  ited by 0x1F and
16390 20 30 78 31 45 5c 6e 22 0a 20 20 22 20 20 20 20   0x1E\n".  "    
163a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163b0 20 20 20 20 20 63 73 76 20 20 20 20 20 20 43 6f       csv      Co
163c0 6d 6d 61 2d 73 65 70 61 72 61 74 65 64 20 76 61  mma-separated va
163d0 6c 75 65 73 5c 6e 22 0a 20 20 22 20 20 20 20 20  lues\n".  "     
163e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
163f0 20 20 20 20 63 6f 6c 75 6d 6e 20 20 20 4c 65 66      column   Lef
16400 74 2d 61 6c 69 67 6e 65 64 20 63 6f 6c 75 6d 6e  t-aligned column
16410 73 2e 20 20 28 53 65 65 20 2e 77 69 64 74 68 29  s.  (See .width)
16420 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20  \n".  "         
16430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16440 68 74 6d 6c 20 20 20 20 20 48 54 4d 4c 20 3c 74  html     HTML <t
16450 61 62 6c 65 3e 20 63 6f 64 65 5c 6e 22 0a 20 20  able> code\n".  
16460 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
16470 20 20 20 20 20 20 20 20 20 20 69 6e 73 65 72 74            insert
16480 20 20 20 53 51 4c 20 69 6e 73 65 72 74 20 73 74     SQL insert st
16490 61 74 65 6d 65 6e 74 73 20 66 6f 72 20 54 41 42  atements for TAB
164a0 4c 45 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20  LE\n".  "       
164b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
164c0 20 20 6c 69 6e 65 20 20 20 20 20 4f 6e 65 20 76    line     One v
164d0 61 6c 75 65 20 70 65 72 20 6c 69 6e 65 5c 6e 22  alue per line\n"
164e0 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
164f0 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 69 73               lis
16500 74 20 20 20 20 20 56 61 6c 75 65 73 20 64 65 6c  t     Values del
16510 69 6d 69 74 65 64 20 62 79 20 5c 22 7c 5c 22 5c  imited by \"|\"\
16520 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20  n".  "          
16530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 71                 q
16540 75 6f 74 65 20 20 20 20 45 73 63 61 70 65 20 61  uote    Escape a
16550 6e 73 77 65 72 73 20 61 73 20 66 6f 72 20 53 51  nswers as for SQ
16560 4c 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  L\n".  "        
16570 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16580 20 74 61 62 73 20 20 20 20 20 54 61 62 2d 73 65   tabs     Tab-se
16590 70 61 72 61 74 65 64 20 76 61 6c 75 65 73 5c 6e  parated values\n
165a0 22 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20  ".  "           
165b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 63                tc
165c0 6c 20 20 20 20 20 20 54 43 4c 20 6c 69 73 74 20  l      TCL list 
165d0 65 6c 65 6d 65 6e 74 73 5c 6e 22 0a 20 20 22 2e  elements\n".  ".
165e0 6e 75 6c 6c 76 61 6c 75 65 20 53 54 52 49 4e 47  nullvalue STRING
165f0 20 20 20 20 20 20 55 73 65 20 53 54 52 49 4e 47        Use STRING
16600 20 69 6e 20 70 6c 61 63 65 20 6f 66 20 4e 55 4c   in place of NUL
16610 4c 20 76 61 6c 75 65 73 5c 6e 22 0a 20 20 22 2e  L values\n".  ".
16620 6f 6e 63 65 20 46 49 4c 45 4e 41 4d 45 20 20 20  once FILENAME   
16630 20 20 20 20 20 20 4f 75 74 70 75 74 20 66 6f 72        Output for
16640 20 74 68 65 20 6e 65 78 74 20 53 51 4c 20 63 6f   the next SQL co
16650 6d 6d 61 6e 64 20 6f 6e 6c 79 20 74 6f 20 46 49  mmand only to FI
16660 4c 45 4e 41 4d 45 5c 6e 22 0a 20 20 22 2e 6f 70  LENAME\n".  ".op
16670 65 6e 20 3f 4f 50 54 49 4f 4e 53 3f 20 3f 46 49  en ?OPTIONS? ?FI
16680 4c 45 3f 20 43 6c 6f 73 65 20 65 78 69 73 74 69  LE? Close existi
16690 6e 67 20 64 61 74 61 62 61 73 65 20 61 6e 64 20  ng database and 
166a0 72 65 6f 70 65 6e 20 46 49 4c 45 5c 6e 22 0a 20  reopen FILE\n". 
166b0 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
166c0 20 20 20 20 20 20 20 20 20 20 20 54 68 65 20 2d             The -
166d0 2d 6e 65 77 20 6f 70 74 69 6f 6e 20 73 74 61 72  -new option star
166e0 74 73 20 77 69 74 68 20 61 6e 20 65 6d 70 74 79  ts with an empty
166f0 20 66 69 6c 65 5c 6e 22 0a 20 20 22 2e 6f 75 74   file\n".  ".out
16700 70 75 74 20 3f 46 49 4c 45 4e 41 4d 45 3f 20 20  put ?FILENAME?  
16710 20 20 20 53 65 6e 64 20 6f 75 74 70 75 74 20 74     Send output t
16720 6f 20 46 49 4c 45 4e 41 4d 45 20 6f 72 20 73 74  o FILENAME or st
16730 64 6f 75 74 5c 6e 22 0a 20 20 22 2e 70 72 69 6e  dout\n".  ".prin
16740 74 20 53 54 52 49 4e 47 2e 2e 2e 20 20 20 20 20  t STRING...     
16750 20 20 50 72 69 6e 74 20 6c 69 74 65 72 61 6c 20    Print literal 
16760 53 54 52 49 4e 47 5c 6e 22 0a 20 20 22 2e 70 72  STRING\n".  ".pr
16770 6f 6d 70 74 20 4d 41 49 4e 20 43 4f 4e 54 49 4e  ompt MAIN CONTIN
16780 55 45 20 20 52 65 70 6c 61 63 65 20 74 68 65 20  UE  Replace the 
16790 73 74 61 6e 64 61 72 64 20 70 72 6f 6d 70 74 73  standard prompts
167a0 5c 6e 22 0a 20 20 22 2e 71 75 69 74 20 20 20 20  \n".  ".quit    
167b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78                Ex
167c0 69 74 20 74 68 69 73 20 70 72 6f 67 72 61 6d 5c  it this program\
167d0 6e 22 0a 20 20 22 2e 72 65 61 64 20 46 49 4c 45  n".  ".read FILE
167e0 4e 41 4d 45 20 20 20 20 20 20 20 20 20 45 78 65  NAME         Exe
167f0 63 75 74 65 20 53 51 4c 20 69 6e 20 46 49 4c 45  cute SQL in FILE
16800 4e 41 4d 45 5c 6e 22 0a 20 20 22 2e 72 65 73 74  NAME\n".  ".rest
16810 6f 72 65 20 3f 44 42 3f 20 46 49 4c 45 20 20 20  ore ?DB? FILE   
16820 20 20 52 65 73 74 6f 72 65 20 63 6f 6e 74 65 6e    Restore conten
16830 74 20 6f 66 20 44 42 20 28 64 65 66 61 75 6c 74  t of DB (default
16840 20 5c 22 6d 61 69 6e 5c 22 29 20 66 72 6f 6d 20   \"main\") from 
16850 46 49 4c 45 5c 6e 22 0a 20 20 22 2e 73 61 76 65  FILE\n".  ".save
16860 20 46 49 4c 45 20 20 20 20 20 20 20 20 20 20 20   FILE           
16870 20 20 57 72 69 74 65 20 69 6e 2d 6d 65 6d 6f 72    Write in-memor
16880 79 20 64 61 74 61 62 61 73 65 20 69 6e 74 6f 20  y database into 
16890 46 49 4c 45 5c 6e 22 0a 20 20 22 2e 73 63 61 6e  FILE\n".  ".scan
168a0 73 74 61 74 73 20 6f 6e 7c 6f 66 66 20 20 20 20  stats on|off    
168b0 20 20 54 75 72 6e 20 73 71 6c 69 74 65 33 5f 73    Turn sqlite3_s
168c0 74 6d 74 5f 73 63 61 6e 73 74 61 74 75 73 28 29  tmt_scanstatus()
168d0 20 6d 65 74 72 69 63 73 20 6f 6e 20 6f 72 20 6f   metrics on or o
168e0 66 66 5c 6e 22 0a 20 20 22 2e 73 63 68 65 6d 61  ff\n".  ".schema
168f0 20 3f 50 41 54 54 45 52 4e 3f 20 20 20 20 20 20   ?PATTERN?      
16900 53 68 6f 77 20 74 68 65 20 43 52 45 41 54 45 20  Show the CREATE 
16910 73 74 61 74 65 6d 65 6e 74 73 20 6d 61 74 63 68  statements match
16920 69 6e 67 20 50 41 54 54 45 52 4e 5c 6e 22 0a 20  ing PATTERN\n". 
16930 20 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20   "              
16940 20 20 20 20 20 20 20 20 20 20 20 20 41 64 64 20              Add 
16950 2d 2d 69 6e 64 65 6e 74 20 66 6f 72 20 70 72 65  --indent for pre
16960 74 74 79 2d 70 72 69 6e 74 69 6e 67 5c 6e 22 0a  tty-printing\n".
16970 20 20 22 2e 73 65 6c 66 74 65 73 74 20 3f 2d 2d    ".selftest ?--
16980 69 6e 69 74 3f 20 20 20 20 20 52 75 6e 20 74 65  init?     Run te
16990 73 74 73 20 64 65 66 69 6e 65 64 20 69 6e 20 74  sts defined in t
169a0 68 65 20 53 45 4c 46 54 45 53 54 20 74 61 62 6c  he SELFTEST tabl
169b0 65 5c 6e 22 0a 20 20 22 2e 73 65 70 61 72 61 74  e\n".  ".separat
169c0 6f 72 20 43 4f 4c 20 3f 52 4f 57 3f 20 20 20 43  or COL ?ROW?   C
169d0 68 61 6e 67 65 20 74 68 65 20 63 6f 6c 75 6d 6e  hange the column
169e0 20 73 65 70 61 72 61 74 6f 72 20 61 6e 64 20 6f   separator and o
169f0 70 74 69 6f 6e 61 6c 6c 79 20 74 68 65 20 72 6f  ptionally the ro
16a00 77 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20  w\n".  "        
16a10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16a20 20 73 65 70 61 72 61 74 6f 72 20 66 6f 72 20 62   separator for b
16a30 6f 74 68 20 74 68 65 20 6f 75 74 70 75 74 20 6d  oth the output m
16a40 6f 64 65 20 61 6e 64 20 2e 69 6d 70 6f 72 74 5c  ode and .import\
16a50 6e 22 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  n".#if defined(S
16a60 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53 45 53  QLITE_ENABLE_SES
16a70 53 49 4f 4e 29 0a 20 20 22 2e 73 65 73 73 69 6f  SION).  ".sessio
16a80 6e 20 43 4d 44 20 2e 2e 2e 20 20 20 20 20 20 20  n CMD ...       
16a90 43 72 65 61 74 65 20 6f 72 20 63 6f 6e 74 72 6f  Create or contro
16aa0 6c 20 73 65 73 73 69 6f 6e 73 5c 6e 22 0a 23 65  l sessions\n".#e
16ab0 6e 64 69 66 0a 20 20 22 2e 73 68 61 33 73 75 6d  ndif.  ".sha3sum
16ac0 20 3f 4f 50 54 49 4f 4e 53 2e 2e 2e 3f 20 20 43   ?OPTIONS...?  C
16ad0 6f 6d 70 75 74 65 20 61 20 53 48 41 33 20 68 61  ompute a SHA3 ha
16ae0 73 68 20 6f 66 20 64 61 74 61 62 61 73 65 20 63  sh of database c
16af0 6f 6e 74 65 6e 74 5c 6e 22 0a 20 20 22 2e 73 68  ontent\n".  ".sh
16b00 65 6c 6c 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20  ell CMD ARGS... 
16b10 20 20 20 20 52 75 6e 20 43 4d 44 20 41 52 47 53      Run CMD ARGS
16b20 2e 2e 2e 20 69 6e 20 61 20 73 79 73 74 65 6d 20  ... in a system 
16b30 73 68 65 6c 6c 5c 6e 22 0a 20 20 22 2e 73 68 6f  shell\n".  ".sho
16b40 77 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  w               
16b50 20 20 20 53 68 6f 77 20 74 68 65 20 63 75 72 72     Show the curr
16b60 65 6e 74 20 76 61 6c 75 65 73 20 66 6f 72 20 76  ent values for v
16b70 61 72 69 6f 75 73 20 73 65 74 74 69 6e 67 73 5c  arious settings\
16b80 6e 22 0a 20 20 22 2e 73 74 61 74 73 20 3f 6f 6e  n".  ".stats ?on
16b90 7c 6f 66 66 3f 20 20 20 20 20 20 20 20 53 68 6f  |off?        Sho
16ba0 77 20 73 74 61 74 73 20 6f 72 20 74 75 72 6e 20  w stats or turn 
16bb0 73 74 61 74 73 20 6f 6e 20 6f 72 20 6f 66 66 5c  stats on or off\
16bc0 6e 22 0a 20 20 22 2e 73 79 73 74 65 6d 20 43 4d  n".  ".system CM
16bd0 44 20 41 52 47 53 2e 2e 2e 20 20 20 20 52 75 6e  D ARGS...    Run
16be0 20 43 4d 44 20 41 52 47 53 2e 2e 2e 20 69 6e 20   CMD ARGS... in 
16bf0 61 20 73 79 73 74 65 6d 20 73 68 65 6c 6c 5c 6e  a system shell\n
16c00 22 0a 20 20 22 2e 74 61 62 6c 65 73 20 3f 54 41  ".  ".tables ?TA
16c10 42 4c 45 3f 20 20 20 20 20 20 20 20 4c 69 73 74  BLE?        List
16c20 20 6e 61 6d 65 73 20 6f 66 20 74 61 62 6c 65 73   names of tables
16c30 5c 6e 22 0a 20 20 22 20 20 20 20 20 20 20 20 20  \n".  "         
16c40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16c50 49 66 20 54 41 42 4c 45 20 73 70 65 63 69 66 69  If TABLE specifi
16c60 65 64 2c 20 6f 6e 6c 79 20 6c 69 73 74 20 74 61  ed, only list ta
16c70 62 6c 65 73 20 6d 61 74 63 68 69 6e 67 5c 6e 22  bles matching\n"
16c80 0a 20 20 22 20 20 20 20 20 20 20 20 20 20 20 20  .  "            
16c90 20 20 20 20 20 20 20 20 20 20 20 20 20 4c 49 4b               LIK
16ca0 45 20 70 61 74 74 65 72 6e 20 54 41 42 4c 45 2e  E pattern TABLE.
16cb0 5c 6e 22 0a 20 20 22 2e 74 65 73 74 63 61 73 65  \n".  ".testcase
16cc0 20 4e 41 4d 45 20 20 20 20 20 20 20 20 20 42 65   NAME         Be
16cd0 67 69 6e 20 72 65 64 69 72 65 63 74 69 6e 67 20  gin redirecting 
16ce0 6f 75 74 70 75 74 20 74 6f 20 27 74 65 73 74 63  output to 'testc
16cf0 61 73 65 2d 6f 75 74 2e 74 78 74 27 5c 6e 22 0a  ase-out.txt'\n".
16d00 20 20 22 2e 74 69 6d 65 6f 75 74 20 4d 53 20 20    ".timeout MS  
16d10 20 20 20 20 20 20 20 20 20 20 54 72 79 20 6f 70            Try op
16d20 65 6e 69 6e 67 20 6c 6f 63 6b 65 64 20 74 61 62  ening locked tab
16d30 6c 65 73 20 66 6f 72 20 4d 53 20 6d 69 6c 6c 69  les for MS milli
16d40 73 65 63 6f 6e 64 73 5c 6e 22 0a 20 20 22 2e 74  seconds\n".  ".t
16d50 69 6d 65 72 20 6f 6e 7c 6f 66 66 20 20 20 20 20  imer on|off     
16d60 20 20 20 20 20 54 75 72 6e 20 53 51 4c 20 74 69       Turn SQL ti
16d70 6d 65 72 20 6f 6e 20 6f 72 20 6f 66 66 5c 6e 22  mer on or off\n"
16d80 0a 20 20 22 2e 74 72 61 63 65 20 46 49 4c 45 7c  .  ".trace FILE|
16d90 6f 66 66 20 20 20 20 20 20 20 20 4f 75 74 70 75  off        Outpu
16da0 74 20 65 61 63 68 20 53 51 4c 20 73 74 61 74 65  t each SQL state
16db0 6d 65 6e 74 20 61 73 20 69 74 20 69 73 20 72 75  ment as it is ru
16dc0 6e 5c 6e 22 0a 20 20 22 2e 76 66 73 69 6e 66 6f  n\n".  ".vfsinfo
16dd0 20 3f 41 55 58 3f 20 20 20 20 20 20 20 20 20 49   ?AUX?         I
16de0 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74  nformation about
16df0 20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 56   the top-level V
16e00 46 53 5c 6e 22 0a 20 20 22 2e 76 66 73 6c 69 73  FS\n".  ".vfslis
16e10 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t               
16e20 4c 69 73 74 20 61 6c 6c 20 61 76 61 69 6c 61 62  List all availab
16e30 6c 65 20 56 46 53 65 73 5c 6e 22 0a 20 20 22 2e  le VFSes\n".  ".
16e40 76 66 73 6e 61 6d 65 20 3f 41 55 58 3f 20 20 20  vfsname ?AUX?   
16e50 20 20 20 20 20 20 50 72 69 6e 74 20 74 68 65 20        Print the 
16e60 6e 61 6d 65 20 6f 66 20 74 68 65 20 56 46 53 20  name of the VFS 
16e70 73 74 61 63 6b 5c 6e 22 0a 20 20 22 2e 77 69 64  stack\n".  ".wid
16e80 74 68 20 4e 55 4d 31 20 4e 55 4d 32 20 2e 2e 2e  th NUM1 NUM2 ...
16e90 20 20 20 53 65 74 20 63 6f 6c 75 6d 6e 20 77 69     Set column wi
16ea0 64 74 68 73 20 66 6f 72 20 5c 22 63 6f 6c 75 6d  dths for \"colum
16eb0 6e 5c 22 20 6d 6f 64 65 5c 6e 22 0a 20 20 22 20  n\" mode\n".  " 
16ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ed0 20 20 20 20 20 20 20 20 4e 65 67 61 74 69 76 65          Negative
16ee0 20 76 61 6c 75 65 73 20 72 69 67 68 74 2d 6a 75   values right-ju
16ef0 73 74 69 66 79 5c 6e 22 0a 3b 0a 0a 23 69 66 20  stify\n".;..#if 
16f00 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
16f10 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a 2f  NABLE_SESSION)./
16f20 2a 0a 2a 2a 20 50 72 69 6e 74 20 68 65 6c 70 20  *.** Print help 
16f30 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 66 6f 72 20  information for 
16f40 74 68 65 20 22 2e 73 65 73 73 69 6f 6e 73 22 20  the ".sessions" 
16f50 63 6f 6d 6d 61 6e 64 0a 2a 2f 0a 76 6f 69 64 20  command.*/.void 
16f60 73 65 73 73 69 6f 6e 5f 68 65 6c 70 28 53 68 65  session_help(She
16f70 6c 6c 53 74 61 74 65 20 2a 70 29 7b 0a 20 20 72  llState *p){.  r
16f80 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
16f90 2c 0a 20 20 20 20 22 2e 73 65 73 73 69 6f 6e 20  ,.    ".session 
16fa0 3f 4e 41 4d 45 3f 20 53 55 42 43 4f 4d 4d 41 4e  ?NAME? SUBCOMMAN
16fb0 44 20 3f 41 52 47 53 2e 2e 2e 3f 5c 6e 22 0a 20  D ?ARGS...?\n". 
16fc0 20 20 20 22 49 66 20 3f 4e 41 4d 45 3f 20 69 73     "If ?NAME? is
16fd0 20 6f 6d 69 74 74 65 64 2c 20 74 68 65 20 66 69   omitted, the fi
16fe0 72 73 74 20 64 65 66 69 6e 65 64 20 73 65 73 73  rst defined sess
16ff0 69 6f 6e 20 69 73 20 75 73 65 64 2e 5c 6e 22 0a  ion is used.\n".
17000 20 20 20 20 22 53 75 62 63 6f 6d 6d 61 6e 64 73      "Subcommands
17010 3a 5c 6e 22 0a 20 20 20 20 22 20 20 20 61 74 74  :\n".    "   att
17020 61 63 68 20 54 41 42 4c 45 20 20 20 20 20 20 20  ach TABLE       
17030 20 20 20 20 20 20 41 74 74 61 63 68 20 54 41 42        Attach TAB
17040 4c 45 5c 6e 22 0a 20 20 20 20 22 20 20 20 63 68  LE\n".    "   ch
17050 61 6e 67 65 73 65 74 20 46 49 4c 45 20 20 20 20  angeset FILE    
17060 20 20 20 20 20 20 20 57 72 69 74 65 20 61 20 63         Write a c
17070 68 61 6e 67 65 73 65 74 20 69 6e 74 6f 20 46 49  hangeset into FI
17080 4c 45 5c 6e 22 0a 20 20 20 20 22 20 20 20 63 6c  LE\n".    "   cl
17090 6f 73 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ose             
170a0 20 20 20 20 20 20 20 43 6c 6f 73 65 20 6f 6e 65         Close one
170b0 20 73 65 73 73 69 6f 6e 5c 6e 22 0a 20 20 20 20   session\n".    
170c0 22 20 20 20 65 6e 61 62 6c 65 20 3f 42 4f 4f 4c  "   enable ?BOOL
170d0 45 41 4e 3f 20 20 20 20 20 20 20 20 20 53 65 74  EAN?         Set
170e0 20 6f 72 20 71 75 65 72 79 20 74 68 65 20 65 6e   or query the en
170f0 61 62 6c 65 20 62 69 74 5c 6e 22 0a 20 20 20 20  able bit\n".    
17100 22 20 20 20 66 69 6c 74 65 72 20 47 4c 4f 42 2e  "   filter GLOB.
17110 2e 2e 20 20 20 20 20 20 20 20 20 20 20 52 65 6a  ..           Rej
17120 65 63 74 20 74 61 62 6c 65 73 20 6d 61 74 63 68  ect tables match
17130 69 6e 67 20 47 4c 4f 42 73 5c 6e 22 0a 20 20 20  ing GLOBs\n".   
17140 20 22 20 20 20 69 6e 64 69 72 65 63 74 20 3f 42   "   indirect ?B
17150 4f 4f 4c 45 41 4e 3f 20 20 20 20 20 20 20 4d 61  OOLEAN?       Ma
17160 72 6b 20 6f 72 20 71 75 65 72 79 20 74 68 65 20  rk or query the 
17170 69 6e 64 69 72 65 63 74 20 73 74 61 74 75 73 5c  indirect status\
17180 6e 22 0a 20 20 20 20 22 20 20 20 69 73 65 6d 70  n".    "   isemp
17190 74 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ty              
171a0 20 20 20 20 51 75 65 72 79 20 77 68 65 74 68 65      Query whethe
171b0 72 20 74 68 65 20 73 65 73 73 69 6f 6e 20 69 73  r the session is
171c0 20 65 6d 70 74 79 5c 6e 22 0a 20 20 20 20 22 20   empty\n".    " 
171d0 20 20 6c 69 73 74 20 20 20 20 20 20 20 20 20 20    list          
171e0 20 20 20 20 20 20 20 20 20 20 20 4c 69 73 74 20             List 
171f0 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 73  currently open s
17200 65 73 73 69 6f 6e 20 6e 61 6d 65 73 5c 6e 22 0a  ession names\n".
17210 20 20 20 20 22 20 20 20 6f 70 65 6e 20 44 42 20      "   open DB 
17220 4e 41 4d 45 20 20 20 20 20 20 20 20 20 20 20 20  NAME            
17230 20 4f 70 65 6e 20 61 20 6e 65 77 20 73 65 73 73   Open a new sess
17240 69 6f 6e 20 6f 6e 20 44 42 5c 6e 22 0a 20 20 20  ion on DB\n".   
17250 20 22 20 20 20 70 61 74 63 68 73 65 74 20 46 49   "   patchset FI
17260 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 57 72  LE            Wr
17270 69 74 65 20 61 20 70 61 74 63 68 73 65 74 20 69  ite a patchset i
17280 6e 74 6f 20 46 49 4c 45 5c 6e 22 0a 20 20 29 3b  nto FILE\n".  );
17290 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 20 46  .}.#endif.../* F
172a0 6f 72 77 61 72 64 20 72 65 66 65 72 65 6e 63 65  orward reference
172b0 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 70   */.static int p
172c0 72 6f 63 65 73 73 5f 69 6e 70 75 74 28 53 68 65  rocess_input(She
172d0 6c 6c 53 74 61 74 65 20 2a 70 2c 20 46 49 4c 45  llState *p, FILE
172e0 20 2a 69 6e 29 3b 0a 0a 2f 2a 0a 2a 2a 20 52 65   *in);../*.** Re
172f0 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20 6f  ad the content o
17300 66 20 66 69 6c 65 20 7a 4e 61 6d 65 20 69 6e 74  f file zName int
17310 6f 20 6d 65 6d 6f 72 79 20 6f 62 74 61 69 6e 65  o memory obtaine
17320 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d  d from sqlite3_m
17330 61 6c 6c 6f 63 36 34 28 29 0a 2a 2a 20 61 6e 64  alloc64().** and
17340 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
17350 72 20 74 6f 20 74 68 65 20 62 75 66 66 65 72 2e  r to the buffer.
17360 20 54 68 65 20 63 61 6c 6c 65 72 20 69 73 20 72   The caller is r
17370 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 66  esponsible for f
17380 72 65 65 69 6e 67 0a 2a 2a 20 74 68 65 20 6d 65  reeing.** the me
17390 6d 6f 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70  mory..**.** If p
173a0 61 72 61 6d 65 74 65 72 20 70 6e 42 79 74 65 20  arameter pnByte 
173b0 69 73 20 6e 6f 74 20 4e 55 4c 4c 2c 20 28 2a 70  is not NULL, (*p
173c0 6e 42 79 74 65 29 20 69 73 20 73 65 74 20 74 6f  nByte) is set to
173d0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
173e0 79 74 65 73 0a 2a 2a 20 72 65 61 64 2e 0a 2a 2a  ytes.** read..**
173f0 0a 2a 2a 20 46 6f 72 20 63 6f 6e 76 65 6e 69 65  .** For convenie
17400 6e 63 65 2c 20 61 20 6e 75 6c 2d 74 65 72 6d 69  nce, a nul-termi
17410 6e 61 74 6f 72 20 62 79 74 65 20 69 73 20 61 6c  nator byte is al
17420 77 61 79 73 20 61 70 70 65 6e 64 65 64 20 74 6f  ways appended to
17430 20 74 68 65 20 64 61 74 61 20 72 65 61 64 0a 2a   the data read.*
17440 2a 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  * from the file 
17450 62 65 66 6f 72 65 20 74 68 65 20 62 75 66 66 65  before the buffe
17460 72 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 54  r is returned. T
17470 68 69 73 20 62 79 74 65 20 69 73 20 6e 6f 74 20  his byte is not 
17480 69 6e 63 6c 75 64 65 64 20 69 6e 0a 2a 2a 20 74  included in.** t
17490 68 65 20 66 69 6e 61 6c 20 76 61 6c 75 65 20 6f  he final value o
174a0 66 20 28 2a 70 6e 42 79 74 65 29 2c 20 69 66 20  f (*pnByte), if 
174b0 61 70 70 6c 69 63 61 62 6c 65 2e 0a 2a 2a 0a 2a  applicable..**.*
174c0 2a 20 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e  * NULL is return
174d0 65 64 20 69 66 20 61 6e 79 20 65 72 72 6f 72 20  ed if any error 
174e0 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2e 20  is encountered. 
174f0 54 68 65 20 66 69 6e 61 6c 20 76 61 6c 75 65 20  The final value 
17500 6f 66 20 2a 70 6e 42 79 74 65 0a 2a 2a 20 69 73  of *pnByte.** is
17510 20 75 6e 64 65 66 69 6e 65 64 20 69 6e 20 74 68   undefined in th
17520 69 73 20 63 61 73 65 2e 0a 2a 2f 0a 73 74 61 74  is case..*/.stat
17530 69 63 20 63 68 61 72 20 2a 72 65 61 64 46 69 6c  ic char *readFil
17540 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  e(const char *zN
17550 61 6d 65 2c 20 69 6e 74 20 2a 70 6e 42 79 74 65  ame, int *pnByte
17560 29 7b 0a 20 20 46 49 4c 45 20 2a 69 6e 20 3d 20  ){.  FILE *in = 
17570 66 6f 70 65 6e 28 7a 4e 61 6d 65 2c 20 22 72 62  fopen(zName, "rb
17580 22 29 3b 0a 20 20 6c 6f 6e 67 20 6e 49 6e 3b 0a  ");.  long nIn;.
17590 20 20 73 69 7a 65 5f 74 20 6e 52 65 61 64 3b 0a    size_t nRead;.
175a0 20 20 63 68 61 72 20 2a 70 42 75 66 3b 0a 20 20    char *pBuf;.  
175b0 69 66 28 20 69 6e 3d 3d 30 20 29 20 72 65 74 75  if( in==0 ) retu
175c0 72 6e 20 30 3b 0a 20 20 66 73 65 65 6b 28 69 6e  rn 0;.  fseek(in
175d0 2c 20 30 2c 20 53 45 45 4b 5f 45 4e 44 29 3b 0a  , 0, SEEK_END);.
175e0 20 20 6e 49 6e 20 3d 20 66 74 65 6c 6c 28 69 6e    nIn = ftell(in
175f0 29 3b 0a 20 20 72 65 77 69 6e 64 28 69 6e 29 3b  );.  rewind(in);
17600 0a 20 20 70 42 75 66 20 3d 20 73 71 6c 69 74 65  .  pBuf = sqlite
17610 33 5f 6d 61 6c 6c 6f 63 36 34 28 20 6e 49 6e 2b  3_malloc64( nIn+
17620 31 20 29 3b 0a 20 20 69 66 28 20 70 42 75 66 3d  1 );.  if( pBuf=
17630 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
17640 20 6e 52 65 61 64 20 3d 20 66 72 65 61 64 28 70   nRead = fread(p
17650 42 75 66 2c 20 6e 49 6e 2c 20 31 2c 20 69 6e 29  Buf, nIn, 1, in)
17660 3b 0a 20 20 66 63 6c 6f 73 65 28 69 6e 29 3b 0a  ;.  fclose(in);.
17670 20 20 69 66 28 20 6e 52 65 61 64 21 3d 31 20 29    if( nRead!=1 )
17680 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  {.    sqlite3_fr
17690 65 65 28 70 42 75 66 29 3b 0a 20 20 20 20 72 65  ee(pBuf);.    re
176a0 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 42  turn 0;.  }.  pB
176b0 75 66 5b 6e 49 6e 5d 20 3d 20 30 3b 0a 20 20 69  uf[nIn] = 0;.  i
176c0 66 28 20 70 6e 42 79 74 65 20 29 20 2a 70 6e 42  f( pnByte ) *pnB
176d0 79 74 65 20 3d 20 6e 49 6e 3b 0a 20 20 72 65 74  yte = nIn;.  ret
176e0 75 72 6e 20 70 42 75 66 3b 0a 7d 0a 0a 23 69 66  urn pBuf;.}..#if
176f0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
17700 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e 29 0a  ENABLE_SESSION).
17710 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 20 73 69  /*.** Close a si
17720 6e 67 6c 65 20 4f 70 65 6e 53 65 73 73 69 6f 6e  ngle OpenSession
17730 20 6f 62 6a 65 63 74 20 61 6e 64 20 72 65 6c 65   object and rele
17740 61 73 65 20 61 6c 6c 20 6f 66 20 69 74 73 20 61  ase all of its a
17750 73 73 6f 63 69 61 74 65 64 0a 2a 2a 20 72 65 73  ssociated.** res
17760 6f 75 72 63 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  ources..*/.stati
17770 63 20 76 6f 69 64 20 73 65 73 73 69 6f 6e 5f 63  c void session_c
17780 6c 6f 73 65 28 4f 70 65 6e 53 65 73 73 69 6f 6e  lose(OpenSession
17790 20 2a 70 53 65 73 73 69 6f 6e 29 7b 0a 20 20 69   *pSession){.  i
177a0 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33 73  nt i;.  sqlite3s
177b0 65 73 73 69 6f 6e 5f 64 65 6c 65 74 65 28 70 53  ession_delete(pS
177c0 65 73 73 69 6f 6e 2d 3e 70 29 3b 0a 20 20 73 71  ession->p);.  sq
177d0 6c 69 74 65 33 5f 66 72 65 65 28 70 53 65 73 73  lite3_free(pSess
177e0 69 6f 6e 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 66  ion->zName);.  f
177f0 6f 72 28 69 3d 30 3b 20 69 3c 70 53 65 73 73 69  or(i=0; i<pSessi
17800 6f 6e 2d 3e 6e 46 69 6c 74 65 72 3b 20 69 2b 2b  on->nFilter; i++
17810 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  ){.    sqlite3_f
17820 72 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e 61 7a  ree(pSession->az
17830 46 69 6c 74 65 72 5b 69 5d 29 3b 0a 20 20 7d 0a  Filter[i]);.  }.
17840 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70    sqlite3_free(p
17850 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65  Session->azFilte
17860 72 29 3b 0a 20 20 6d 65 6d 73 65 74 28 70 53 65  r);.  memset(pSe
17870 73 73 69 6f 6e 2c 20 30 2c 20 73 69 7a 65 6f 66  ssion, 0, sizeof
17880 28 4f 70 65 6e 53 65 73 73 69 6f 6e 29 29 3b 0a  (OpenSession));.
17890 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
178a0 43 6c 6f 73 65 20 61 6c 6c 20 4f 70 65 6e 53 65  Close all OpenSe
178b0 73 73 69 6f 6e 20 6f 62 6a 65 63 74 73 20 61 6e  ssion objects an
178c0 64 20 72 65 6c 65 61 73 65 20 61 6c 6c 20 61 73  d release all as
178d0 73 6f 63 69 61 74 65 64 20 72 65 73 6f 75 72 63  sociated resourc
178e0 65 73 2e 0a 2a 2f 0a 23 69 66 20 64 65 66 69 6e  es..*/.#if defin
178f0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
17900 5f 53 45 53 53 49 4f 4e 29 0a 73 74 61 74 69 63  _SESSION).static
17910 20 76 6f 69 64 20 73 65 73 73 69 6f 6e 5f 63 6c   void session_cl
17920 6f 73 65 5f 61 6c 6c 28 53 68 65 6c 6c 53 74 61  ose_all(ShellSta
17930 74 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 69 3b  te *p){.  int i;
17940 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
17950 3e 6e 53 65 73 73 69 6f 6e 3b 20 69 2b 2b 29 7b  >nSession; i++){
17960 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 63 6c 6f  .    session_clo
17970 73 65 28 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b  se(&p->aSession[
17980 69 5d 29 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 53  i]);.  }.  p->nS
17990 65 73 73 69 6f 6e 20 3d 20 30 3b 0a 7d 0a 23 65  ession = 0;.}.#e
179a0 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 73 65 73  lse.# define ses
179b0 73 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c 6c 28 58  sion_close_all(X
179c0 29 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  ).#endif../*.** 
179d0 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f  Implementation o
179e0 66 20 74 68 65 20 78 46 69 6c 74 65 72 20 66 75  f the xFilter fu
179f0 6e 63 74 69 6f 6e 20 66 6f 72 20 61 6e 20 6f 70  nction for an op
17a00 65 6e 20 73 65 73 73 69 6f 6e 2e 20 20 4f 6d 69  en session.  Omi
17a10 74 0a 2a 2a 20 61 6e 79 20 74 61 62 6c 65 73 20  t.** any tables 
17a20 6e 61 6d 65 64 20 62 79 20 22 2e 73 65 73 73 69  named by ".sessi
17a30 6f 6e 20 66 69 6c 74 65 72 22 20 62 75 74 20 6c  on filter" but l
17a40 65 74 20 61 6c 6c 20 6f 74 68 65 72 20 74 61 62  et all other tab
17a50 6c 65 20 74 68 72 6f 75 67 68 2e 0a 2a 2f 0a 23  le through..*/.#
17a60 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
17a70 45 5f 45 4e 41 42 4c 45 5f 53 45 53 53 49 4f 4e  E_ENABLE_SESSION
17a80 29 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 73  ).static int ses
17a90 73 69 6f 6e 5f 66 69 6c 74 65 72 28 76 6f 69 64  sion_filter(void
17aa0 20 2a 70 43 74 78 2c 20 63 6f 6e 73 74 20 63 68   *pCtx, const ch
17ab0 61 72 20 2a 7a 54 61 62 29 7b 0a 20 20 4f 70 65  ar *zTab){.  Ope
17ac0 6e 53 65 73 73 69 6f 6e 20 2a 70 53 65 73 73 69  nSession *pSessi
17ad0 6f 6e 20 3d 20 28 4f 70 65 6e 53 65 73 73 69 6f  on = (OpenSessio
17ae0 6e 2a 29 70 43 74 78 3b 0a 20 20 69 6e 74 20 69  n*)pCtx;.  int i
17af0 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
17b00 53 65 73 73 69 6f 6e 2d 3e 6e 46 69 6c 74 65 72  Session->nFilter
17b10 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
17b20 73 71 6c 69 74 65 33 5f 73 74 72 67 6c 6f 62 28  sqlite3_strglob(
17b30 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74  pSession->azFilt
17b40 65 72 5b 69 5d 2c 20 7a 54 61 62 29 3d 3d 30 20  er[i], zTab)==0 
17b50 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
17b60 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 23 65    return 1;.}.#e
17b70 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 4d 61 6b 65  ndif../*.** Make
17b80 20 73 75 72 65 20 74 68 65 20 64 61 74 61 62 61   sure the databa
17b90 73 65 20 69 73 20 6f 70 65 6e 2e 20 20 49 66 20  se is open.  If 
17ba0 69 74 20 69 73 20 6e 6f 74 2c 20 74 68 65 6e 20  it is not, then 
17bb0 6f 70 65 6e 20 69 74 2e 20 20 49 66 0a 2a 2a 20  open it.  If.** 
17bc0 74 68 65 20 64 61 74 61 62 61 73 65 20 66 61 69  the database fai
17bd0 6c 73 20 74 6f 20 6f 70 65 6e 2c 20 70 72 69 6e  ls to open, prin
17be0 74 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  t an error messa
17bf0 67 65 20 61 6e 64 20 65 78 69 74 2e 0a 2a 2f 0a  ge and exit..*/.
17c00 73 74 61 74 69 63 20 76 6f 69 64 20 6f 70 65 6e  static void open
17c10 5f 64 62 28 53 68 65 6c 6c 53 74 61 74 65 20 2a  _db(ShellState *
17c20 70 2c 20 69 6e 74 20 6b 65 65 70 41 6c 69 76 65  p, int keepAlive
17c30 29 7b 0a 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d  ){.  if( p->db==
17c40 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  0 ){.    sqlite3
17c50 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20  _initialize();. 
17c60 20 20 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28     sqlite3_open(
17c70 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 2c 20  p->zDbFilename, 
17c80 26 70 2d 3e 64 62 29 3b 0a 20 20 20 20 67 6c 6f  &p->db);.    glo
17c90 62 61 6c 44 62 20 3d 20 70 2d 3e 64 62 3b 0a 20  balDb = p->db;. 
17ca0 20 20 20 69 66 28 20 70 2d 3e 64 62 3d 3d 30 20     if( p->db==0 
17cb0 7c 7c 20 53 51 4c 49 54 45 5f 4f 4b 21 3d 73 71  || SQLITE_OK!=sq
17cc0 6c 69 74 65 33 5f 65 72 72 63 6f 64 65 28 70 2d  lite3_errcode(p-
17cd0 3e 64 62 29 20 29 7b 0a 20 20 20 20 20 20 75 74  >db) ){.      ut
17ce0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
17cf0 2c 22 45 72 72 6f 72 3a 20 75 6e 61 62 6c 65 20  ,"Error: unable 
17d00 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  to open database
17d10 20 5c 22 25 73 5c 22 3a 20 25 73 5c 6e 22 2c 0a   \"%s\": %s\n",.
17d20 20 20 20 20 20 20 20 20 20 20 70 2d 3e 7a 44 62            p->zDb
17d30 46 69 6c 65 6e 61 6d 65 2c 20 73 71 6c 69 74 65  Filename, sqlite
17d40 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29  3_errmsg(p->db))
17d50 3b 0a 20 20 20 20 20 20 69 66 28 20 6b 65 65 70  ;.      if( keep
17d60 41 6c 69 76 65 20 29 20 72 65 74 75 72 6e 3b 0a  Alive ) return;.
17d70 20 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20        exit(1);. 
17d80 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
17d90 49 54 45 5f 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58  ITE_OMIT_LOAD_EX
17da0 54 45 4e 53 49 4f 4e 0a 20 20 20 20 73 71 6c 69  TENSION.    sqli
17db0 74 65 33 5f 65 6e 61 62 6c 65 5f 6c 6f 61 64 5f  te3_enable_load_
17dc0 65 78 74 65 6e 73 69 6f 6e 28 70 2d 3e 64 62 2c  extension(p->db,
17dd0 20 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20   1);.#endif.    
17de0 73 71 6c 69 74 65 33 5f 66 69 6c 65 69 6f 5f 69  sqlite3_fileio_i
17df0 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20 30 29  nit(p->db, 0, 0)
17e00 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 73 68  ;.    sqlite3_sh
17e10 61 74 68 72 65 65 5f 69 6e 69 74 28 70 2d 3e 64  athree_init(p->d
17e20 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  b, 0, 0);.    sq
17e30 6c 69 74 65 33 5f 63 6f 6d 70 6c 65 74 69 6f 6e  lite3_completion
17e40 5f 69 6e 69 74 28 70 2d 3e 64 62 2c 20 30 2c 20  _init(p->db, 0, 
17e50 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
17e60 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28  create_function(
17e70 70 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 61 64  p->db, "shell_ad
17e80 64 5f 73 63 68 65 6d 61 22 2c 20 33 2c 20 53 51  d_schema", 3, SQ
17e90 4c 49 54 45 5f 55 54 46 38 2c 20 30 2c 0a 20 20  LITE_UTF8, 0,.  
17ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17eb0 20 20 20 20 20 20 20 20 20 20 73 68 65 6c 6c 41            shellA
17ec0 64 64 53 63 68 65 6d 61 4e 61 6d 65 2c 20 30 2c  ddSchemaName, 0,
17ed0 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   0);.    sqlite3
17ee0 5f 63 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e  _create_function
17ef0 28 70 2d 3e 64 62 2c 20 22 73 68 65 6c 6c 5f 6d  (p->db, "shell_m
17f00 6f 64 75 6c 65 5f 73 63 68 65 6d 61 22 2c 20 31  odule_schema", 1
17f10 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 2c 20 30  , SQLITE_UTF8, 0
17f20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
17f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 68                sh
17f40 65 6c 6c 4d 6f 64 75 6c 65 53 63 68 65 6d 61 2c  ellModuleSchema,
17f50 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 23   0, 0);.  }.}..#
17f60 69 66 20 48 41 56 45 5f 52 45 41 44 4c 49 4e 45  if HAVE_READLINE
17f70 20 7c 7c 20 48 41 56 45 5f 45 44 49 54 4c 49 4e   || HAVE_EDITLIN
17f80 45 0a 2f 2a 0a 2a 2a 20 52 65 61 64 6c 69 6e 65  E./*.** Readline
17f90 20 63 6f 6d 70 6c 65 74 69 6f 6e 20 63 61 6c 6c   completion call
17fa0 62 61 63 6b 73 0a 2a 2f 0a 73 74 61 74 69 63 20  backs.*/.static 
17fb0 63 68 61 72 20 2a 72 65 61 64 6c 69 6e 65 5f 63  char *readline_c
17fc0 6f 6d 70 6c 65 74 69 6f 6e 5f 67 65 6e 65 72 61  ompletion_genera
17fd0 74 6f 72 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  tor(const char *
17fe0 74 65 78 74 2c 20 69 6e 74 20 73 74 61 74 65 29  text, int state)
17ff0 7b 0a 20 20 73 74 61 74 69 63 20 73 71 6c 69 74  {.  static sqlit
18000 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d  e3_stmt *pStmt =
18010 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a 52 65 74   0;.  char *zRet
18020 3b 0a 20 20 69 66 28 20 73 74 61 74 65 3d 3d 30  ;.  if( state==0
18030 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   ){.    char *zS
18040 71 6c 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  ql;.    sqlite3_
18050 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
18060 0a 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69  .    zSql = sqli
18070 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 53 45 4c  te3_mprintf("SEL
18080 45 43 54 20 44 49 53 54 49 4e 43 54 20 63 61 6e  ECT DISTINCT can
18090 64 69 64 61 74 65 20 43 4f 4c 4c 41 54 45 20 6e  didate COLLATE n
180a0 6f 63 61 73 65 22 0a 20 20 20 20 20 20 20 20 20  ocase".         
180b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
180c0 20 20 22 20 20 46 52 4f 4d 20 63 6f 6d 70 6c 65    "  FROM comple
180d0 74 69 6f 6e 28 25 51 29 20 4f 52 44 45 52 20 42  tion(%Q) ORDER B
180e0 59 20 31 22 2c 20 74 65 78 74 29 3b 0a 20 20 20  Y 1", text);.   
180f0 20 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65   sqlite3_prepare
18100 5f 76 32 28 67 6c 6f 62 61 6c 44 62 2c 20 7a 53  _v2(globalDb, zS
18110 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20  ql, -1, &pStmt, 
18120 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
18130 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20 20 7d 0a  free(zSql);.  }.
18140 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74    if( sqlite3_st
18150 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54  ep(pStmt)==SQLIT
18160 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 7a 52 65  E_ROW ){.    zRe
18170 74 20 3d 20 73 74 72 64 75 70 28 28 63 6f 6e 73  t = strdup((cons
18180 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
18190 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
181a0 74 2c 20 30 29 29 3b 0a 20 20 7d 65 6c 73 65 7b  t, 0));.  }else{
181b0 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e  .    sqlite3_fin
181c0 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
181d0 20 20 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 20    pStmt = 0;.   
181e0 20 7a 52 65 74 20 3d 20 30 3b 0a 20 20 7d 0a 20   zRet = 0;.  }. 
181f0 20 72 65 74 75 72 6e 20 7a 52 65 74 3b 0a 7d 0a   return zRet;.}.
18200 73 74 61 74 69 63 20 63 68 61 72 20 2a 2a 72 65  static char **re
18210 61 64 6c 69 6e 65 5f 63 6f 6d 70 6c 65 74 69 6f  adline_completio
18220 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54  n(const char *zT
18230 65 78 74 2c 20 69 6e 74 20 69 53 74 61 72 74 2c  ext, int iStart,
18240 20 69 6e 74 20 69 45 6e 64 29 7b 0a 20 20 72 6c   int iEnd){.  rl
18250 5f 61 74 74 65 6d 70 74 65 64 5f 63 6f 6d 70 6c  _attempted_compl
18260 65 74 69 6f 6e 5f 6f 76 65 72 20 3d 20 31 3b 0a  etion_over = 1;.
18270 20 20 72 65 74 75 72 6e 20 72 6c 5f 63 6f 6d 70    return rl_comp
18280 6c 65 74 69 6f 6e 5f 6d 61 74 63 68 65 73 28 7a  letion_matches(z
18290 54 65 78 74 2c 20 72 65 61 64 6c 69 6e 65 5f 63  Text, readline_c
182a0 6f 6d 70 6c 65 74 69 6f 6e 5f 67 65 6e 65 72 61  ompletion_genera
182b0 74 6f 72 29 3b 0a 7d 0a 0a 23 65 6c 69 66 20 48  tor);.}..#elif H
182c0 41 56 45 5f 4c 49 4e 45 4e 4f 49 53 45 0a 2f 2a  AVE_LINENOISE./*
182d0 0a 2a 2a 20 4c 69 6e 65 6e 6f 69 73 65 20 63 6f  .** Linenoise co
182e0 6d 70 6c 65 74 69 6f 6e 20 63 61 6c 6c 62 61 63  mpletion callbac
182f0 6b 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  k.*/.static void
18300 20 6c 69 6e 65 6e 6f 69 73 65 5f 63 6f 6d 70 6c   linenoise_compl
18310 65 74 69 6f 6e 28 63 6f 6e 73 74 20 63 68 61 72  etion(const char
18320 20 2a 7a 4c 69 6e 65 2c 20 6c 69 6e 65 6e 6f 69   *zLine, linenoi
18330 73 65 43 6f 6d 70 6c 65 74 69 6f 6e 73 20 2a 6c  seCompletions *l
18340 63 29 7b 0a 20 20 69 6e 74 20 6e 4c 69 6e 65 20  c){.  int nLine 
18350 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28 7a 4c  = (int)strlen(zL
18360 69 6e 65 29 3b 0a 20 20 69 6e 74 20 69 2c 20 69  ine);.  int i, i
18370 53 74 61 72 74 3b 0a 20 20 73 71 6c 69 74 65 33  Start;.  sqlite3
18380 5f 73 74 6d 74 20 2a 70 53 74 6d 74 20 3d 20 30  _stmt *pStmt = 0
18390 3b 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 3b 0a  ;.  char *zSql;.
183a0 20 20 63 68 61 72 20 7a 42 75 66 5b 31 30 30 30    char zBuf[1000
183b0 5d 3b 0a 0a 20 20 69 66 28 20 6e 4c 69 6e 65 3e  ];..  if( nLine>
183c0 73 69 7a 65 6f 66 28 7a 42 75 66 29 2d 33 30 20  sizeof(zBuf)-30 
183d0 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
183e0 7a 4c 69 6e 65 5b 30 5d 3d 3d 27 2e 27 20 29 20  zLine[0]=='.' ) 
183f0 72 65 74 75 72 6e 3b 0a 20 20 66 6f 72 28 69 3d  return;.  for(i=
18400 6e 4c 69 6e 65 2d 31 3b 20 69 3e 3d 30 20 26 26  nLine-1; i>=0 &&
18410 20 28 69 73 61 6c 6e 75 6d 28 7a 4c 69 6e 65 5b   (isalnum(zLine[
18420 69 5d 29 20 7c 7c 20 7a 4c 69 6e 65 5b 69 5d 3d  i]) || zLine[i]=
18430 3d 27 5f 27 29 3b 20 69 2d 2d 29 7b 7d 0a 20 20  ='_'); i--){}.  
18440 69 66 28 20 69 3d 3d 6e 4c 69 6e 65 2d 31 20 29  if( i==nLine-1 )
18450 20 72 65 74 75 72 6e 3b 0a 20 20 69 53 74 61 72   return;.  iStar
18460 74 20 3d 20 69 2b 31 3b 0a 20 20 6d 65 6d 63 70  t = i+1;.  memcp
18470 79 28 7a 42 75 66 2c 20 7a 4c 69 6e 65 2c 20 69  y(zBuf, zLine, i
18480 53 74 61 72 74 29 3b 0a 20 20 7a 53 71 6c 20 3d  Start);.  zSql =
18490 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66   sqlite3_mprintf
184a0 28 22 53 45 4c 45 43 54 20 44 49 53 54 49 4e 43  ("SELECT DISTINC
184b0 54 20 63 61 6e 64 69 64 61 74 65 20 43 4f 4c 4c  T candidate COLL
184c0 41 54 45 20 6e 6f 63 61 73 65 22 0a 20 20 20 20  ATE nocase".    
184d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
184e0 20 20 20 20 20 22 20 20 46 52 4f 4d 20 63 6f 6d       "  FROM com
184f0 70 6c 65 74 69 6f 6e 28 25 51 2c 25 51 29 20 4f  pletion(%Q,%Q) O
18500 52 44 45 52 20 42 59 20 31 22 2c 0a 20 20 20 20  RDER BY 1",.    
18510 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18520 20 20 20 20 20 26 7a 4c 69 6e 65 5b 69 53 74 61       &zLine[iSta
18530 72 74 5d 2c 20 7a 4c 69 6e 65 29 3b 0a 20 20 73  rt], zLine);.  s
18540 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
18550 32 28 67 6c 6f 62 61 6c 44 62 2c 20 7a 53 71 6c  2(globalDb, zSql
18560 2c 20 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29  , -1, &pStmt, 0)
18570 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65  ;.  sqlite3_free
18580 28 7a 53 71 6c 29 3b 0a 20 20 73 71 6c 69 74 65  (zSql);.  sqlite
18590 33 5f 65 78 65 63 28 67 6c 6f 62 61 6c 44 62 2c  3_exec(globalDb,
185a0 20 22 50 52 41 47 4d 41 20 70 61 67 65 5f 63 6f   "PRAGMA page_co
185b0 75 6e 74 22 2c 20 30 2c 20 30 2c 20 30 29 3b 20  unt", 0, 0, 0); 
185c0 2f 2a 20 4c 6f 61 64 20 74 68 65 20 73 63 68 65  /* Load the sche
185d0 6d 61 20 2a 2f 0a 20 20 77 68 69 6c 65 28 20 73  ma */.  while( s
185e0 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d  qlite3_step(pStm
185f0 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  t)==SQLITE_ROW )
18600 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
18610 20 2a 7a 43 6f 6d 70 6c 65 74 69 6f 6e 20 3d 20   *zCompletion = 
18620 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
18630 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74  ite3_column_text
18640 28 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  (pStmt, 0);.    
18650 69 6e 74 20 6e 43 6f 6d 70 6c 65 74 69 6f 6e 20  int nCompletion 
18660 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  = sqlite3_column
18670 5f 62 79 74 65 73 28 70 53 74 6d 74 2c 20 30 29  _bytes(pStmt, 0)
18680 3b 0a 20 20 20 20 69 66 28 20 69 53 74 61 72 74  ;.    if( iStart
18690 2b 6e 43 6f 6d 70 6c 65 74 69 6f 6e 20 3c 20 73  +nCompletion < s
186a0 69 7a 65 6f 66 28 7a 42 75 66 29 2d 31 20 29 7b  izeof(zBuf)-1 ){
186b0 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 42  .      memcpy(zB
186c0 75 66 2b 69 53 74 61 72 74 2c 20 7a 43 6f 6d 70  uf+iStart, zComp
186d0 6c 65 74 69 6f 6e 2c 20 6e 43 6f 6d 70 6c 65 74  letion, nComplet
186e0 69 6f 6e 2b 31 29 3b 0a 20 20 20 20 20 20 6c 69  ion+1);.      li
186f0 6e 65 6e 6f 69 73 65 41 64 64 43 6f 6d 70 6c 65  nenoiseAddComple
18700 74 69 6f 6e 28 6c 63 2c 20 7a 42 75 66 29 3b 0a  tion(lc, zBuf);.
18710 20 20 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69      }.  }.  sqli
18720 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
18730 6d 74 29 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f  mt);.}.#endif../
18740 2a 0a 2a 2a 20 44 6f 20 43 2d 6c 61 6e 67 75 61  *.** Do C-langua
18750 67 65 20 73 74 79 6c 65 20 64 65 71 75 6f 74 69  ge style dequoti
18760 6e 67 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 5c 61 20  ng..**.**    \a 
18770 20 20 20 2d 3e 20 61 6c 61 72 6d 0a 2a 2a 20 20     -> alarm.**  
18780 20 20 5c 62 20 20 20 20 2d 3e 20 62 61 63 6b 73    \b    -> backs
18790 70 61 63 65 0a 2a 2a 20 20 20 20 5c 74 20 20 20  pace.**    \t   
187a0 20 2d 3e 20 74 61 62 0a 2a 2a 20 20 20 20 5c 6e   -> tab.**    \n
187b0 20 20 20 20 2d 3e 20 6e 65 77 6c 69 6e 65 0a 2a      -> newline.*
187c0 2a 20 20 20 20 5c 76 20 20 20 20 2d 3e 20 76 65  *    \v    -> ve
187d0 72 74 69 63 61 6c 20 74 61 62 0a 2a 2a 20 20 20  rtical tab.**   
187e0 20 5c 66 20 20 20 20 2d 3e 20 66 6f 72 6d 20 66   \f    -> form f
187f0 65 65 64 0a 2a 2a 20 20 20 20 5c 72 20 20 20 20  eed.**    \r    
18800 2d 3e 20 63 61 72 72 69 61 67 65 20 72 65 74 75  -> carriage retu
18810 72 6e 0a 2a 2a 20 20 20 20 5c 73 20 20 20 20 2d  rn.**    \s    -
18820 3e 20 73 70 61 63 65 0a 2a 2a 20 20 20 20 5c 22  > space.**    \"
18830 20 20 20 20 2d 3e 20 22 0a 2a 2a 20 20 20 20 5c      -> ".**    \
18840 27 20 20 20 20 2d 3e 20 27 0a 2a 2a 20 20 20 20  '    -> '.**    
18850 5c 5c 20 20 20 20 2d 3e 20 62 61 63 6b 73 6c 61  \\    -> backsla
18860 73 68 0a 2a 2a 20 20 20 20 5c 4e 4e 4e 20 20 2d  sh.**    \NNN  -
18870 3e 20 61 73 63 69 69 20 63 68 61 72 61 63 74 65  > ascii characte
18880 72 20 4e 4e 4e 20 69 6e 20 6f 63 74 61 6c 0a 2a  r NNN in octal.*
18890 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72 65  /.static void re
188a0 73 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68 65  solve_backslashe
188b0 73 28 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 6e  s(char *z){.  in
188c0 74 20 69 2c 20 6a 3b 0a 20 20 63 68 61 72 20 63  t i, j;.  char c
188d0 3b 0a 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26  ;.  while( *z &&
188e0 20 2a 7a 21 3d 27 5c 5c 27 20 29 20 7a 2b 2b 3b   *z!='\\' ) z++;
188f0 0a 20 20 66 6f 72 28 69 3d 6a 3d 30 3b 20 28 63  .  for(i=j=0; (c
18900 20 3d 20 7a 5b 69 5d 29 21 3d 30 3b 20 69 2b 2b   = z[i])!=0; i++
18910 2c 20 6a 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  , j++){.    if( 
18920 63 3d 3d 27 5c 5c 27 20 26 26 20 7a 5b 69 2b 31  c=='\\' && z[i+1
18930 5d 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 20  ]!=0 ){.      c 
18940 3d 20 7a 5b 2b 2b 69 5d 3b 0a 20 20 20 20 20 20  = z[++i];.      
18950 69 66 28 20 63 3d 3d 27 61 27 20 29 7b 0a 20 20  if( c=='a' ){.  
18960 20 20 20 20 20 20 63 20 3d 20 27 5c 61 27 3b 0a        c = '\a';.
18970 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
18980 63 3d 3d 27 62 27 20 29 7b 0a 20 20 20 20 20 20  c=='b' ){.      
18990 20 20 63 20 3d 20 27 5c 62 27 3b 0a 20 20 20 20    c = '\b';.    
189a0 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
189b0 74 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  t' ){.        c 
189c0 3d 20 27 5c 74 27 3b 0a 20 20 20 20 20 20 7d 65  = '\t';.      }e
189d0 6c 73 65 20 69 66 28 20 63 3d 3d 27 6e 27 20 29  lse if( c=='n' )
189e0 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 5c  {.        c = '\
189f0 6e 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  n';.      }else 
18a00 69 66 28 20 63 3d 3d 27 76 27 20 29 7b 0a 20 20  if( c=='v' ){.  
18a10 20 20 20 20 20 20 63 20 3d 20 27 5c 76 27 3b 0a        c = '\v';.
18a20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
18a30 63 3d 3d 27 66 27 20 29 7b 0a 20 20 20 20 20 20  c=='f' ){.      
18a40 20 20 63 20 3d 20 27 5c 66 27 3b 0a 20 20 20 20    c = '\f';.    
18a50 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27    }else if( c=='
18a60 72 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63 20  r' ){.        c 
18a70 3d 20 27 5c 72 27 3b 0a 20 20 20 20 20 20 7d 65  = '\r';.      }e
18a80 6c 73 65 20 69 66 28 20 63 3d 3d 27 22 27 20 29  lse if( c=='"' )
18a90 7b 0a 20 20 20 20 20 20 20 20 63 20 3d 20 27 22  {.        c = '"
18aa0 27 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  ';.      }else i
18ab0 66 28 20 63 3d 3d 27 5c 27 27 20 29 7b 0a 20 20  f( c=='\'' ){.  
18ac0 20 20 20 20 20 20 63 20 3d 20 27 5c 27 27 3b 0a        c = '\'';.
18ad0 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
18ae0 63 3d 3d 27 5c 5c 27 20 29 7b 0a 20 20 20 20 20  c=='\\' ){.     
18af0 20 20 20 63 20 3d 20 27 5c 5c 27 3b 0a 20 20 20     c = '\\';.   
18b00 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 3e 3d     }else if( c>=
18b10 27 30 27 20 26 26 20 63 3c 3d 27 37 27 20 29 7b  '0' && c<='7' ){
18b20 0a 20 20 20 20 20 20 20 20 63 20 2d 3d 20 27 30  .        c -= '0
18b30 27 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  ';.        if( z
18b40 5b 69 2b 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b  [i+1]>='0' && z[
18b50 69 2b 31 5d 3c 3d 27 37 27 20 29 7b 0a 20 20 20  i+1]<='7' ){.   
18b60 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
18b70 20 20 20 20 20 20 63 20 3d 20 28 63 3c 3c 33 29        c = (c<<3)
18b80 20 2b 20 7a 5b 69 5d 20 2d 20 27 30 27 3b 0a 20   + z[i] - '0';. 
18b90 20 20 20 20 20 20 20 20 20 69 66 28 20 7a 5b 69           if( z[i
18ba0 2b 31 5d 3e 3d 27 30 27 20 26 26 20 7a 5b 69 2b  +1]>='0' && z[i+
18bb0 31 5d 3c 3d 27 37 27 20 29 7b 0a 20 20 20 20 20  1]<='7' ){.     
18bc0 20 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20 20         i++;.    
18bd0 20 20 20 20 20 20 20 20 63 20 3d 20 28 63 3c 3c          c = (c<<
18be0 33 29 20 2b 20 7a 5b 69 5d 20 2d 20 27 30 27 3b  3) + z[i] - '0';
18bf0 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
18c00 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
18c10 20 20 20 7d 0a 20 20 20 20 7a 5b 6a 5d 20 3d 20     }.    z[j] = 
18c20 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6a 3c 69  c;.  }.  if( j<i
18c30 20 29 20 7a 5b 6a 5d 20 3d 20 30 3b 0a 7d 0a 0a   ) z[j] = 0;.}..
18c40 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
18c50 20 76 61 6c 75 65 20 6f 66 20 61 20 68 65 78 61   value of a hexa
18c60 64 65 63 69 6d 61 6c 20 64 69 67 69 74 2e 20 20  decimal digit.  
18c70 52 65 74 75 72 6e 20 2d 31 20 69 66 20 74 68 65  Return -1 if the
18c80 20 69 6e 70 75 74 0a 2a 2a 20 69 73 20 6e 6f 74   input.** is not
18c90 20 61 20 68 65 78 20 64 69 67 69 74 2e 0a 2a 2f   a hex digit..*/
18ca0 0a 73 74 61 74 69 63 20 69 6e 74 20 68 65 78 44  .static int hexD
18cb0 69 67 69 74 56 61 6c 75 65 28 63 68 61 72 20 63  igitValue(char c
18cc0 29 7b 0a 20 20 69 66 28 20 63 3e 3d 27 30 27 20  ){.  if( c>='0' 
18cd0 26 26 20 63 3c 3d 27 39 27 20 29 20 72 65 74 75  && c<='9' ) retu
18ce0 72 6e 20 63 20 2d 20 27 30 27 3b 0a 20 20 69 66  rn c - '0';.  if
18cf0 28 20 63 3e 3d 27 61 27 20 26 26 20 63 3c 3d 27  ( c>='a' && c<='
18d00 66 27 20 29 20 72 65 74 75 72 6e 20 63 20 2d 20  f' ) return c - 
18d10 27 61 27 20 2b 20 31 30 3b 0a 20 20 69 66 28 20  'a' + 10;.  if( 
18d20 63 3e 3d 27 41 27 20 26 26 20 63 3c 3d 27 46 27  c>='A' && c<='F'
18d30 20 29 20 72 65 74 75 72 6e 20 63 20 2d 20 27 41   ) return c - 'A
18d40 27 20 2b 20 31 30 3b 0a 20 20 72 65 74 75 72 6e  ' + 10;.  return
18d50 20 2d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e   -1;.}../*.** In
18d60 74 65 72 70 72 65 74 20 7a 41 72 67 20 61 73 20  terpret zArg as 
18d70 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  an integer value
18d80 2c 20 70 6f 73 73 69 62 6c 79 20 77 69 74 68 20  , possibly with 
18d90 73 75 66 66 69 78 65 73 2e 0a 2a 2f 0a 73 74 61  suffixes..*/.sta
18da0 74 69 63 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  tic sqlite3_int6
18db0 34 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28 63  4 integerValue(c
18dc0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 41 72 67 29  onst char *zArg)
18dd0 7b 0a 20 20 73 71 6c 69 74 65 33 5f 69 6e 74 36  {.  sqlite3_int6
18de0 34 20 76 20 3d 20 30 3b 0a 20 20 73 74 61 74 69  4 v = 0;.  stati
18df0 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b  c const struct {
18e00 20 63 68 61 72 20 2a 7a 53 75 66 66 69 78 3b 20   char *zSuffix; 
18e10 69 6e 74 20 69 4d 75 6c 74 3b 20 7d 20 61 4d 75  int iMult; } aMu
18e20 6c 74 5b 5d 20 3d 20 7b 0a 20 20 20 20 7b 20 22  lt[] = {.    { "
18e30 4b 69 42 22 2c 20 31 30 32 34 20 7d 2c 0a 20 20  KiB", 1024 },.  
18e40 20 20 7b 20 22 4d 69 42 22 2c 20 31 30 32 34 2a    { "MiB", 1024*
18e50 31 30 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22 47  1024 },.    { "G
18e60 69 42 22 2c 20 31 30 32 34 2a 31 30 32 34 2a 31  iB", 1024*1024*1
18e70 30 32 34 20 7d 2c 0a 20 20 20 20 7b 20 22 4b 42  024 },.    { "KB
18e80 22 2c 20 20 31 30 30 30 20 7d 2c 0a 20 20 20 20  ",  1000 },.    
18e90 7b 20 22 4d 42 22 2c 20 20 31 30 30 30 30 30 30  { "MB",  1000000
18ea0 20 7d 2c 0a 20 20 20 20 7b 20 22 47 42 22 2c 20   },.    { "GB", 
18eb0 20 31 30 30 30 30 30 30 30 30 30 20 7d 2c 0a 20   1000000000 },. 
18ec0 20 20 20 7b 20 22 4b 22 2c 20 20 20 31 30 30 30     { "K",   1000
18ed0 20 7d 2c 0a 20 20 20 20 7b 20 22 4d 22 2c 20 20   },.    { "M",  
18ee0 20 31 30 30 30 30 30 30 20 7d 2c 0a 20 20 20 20   1000000 },.    
18ef0 7b 20 22 47 22 2c 20 20 20 31 30 30 30 30 30 30  { "G",   1000000
18f00 30 30 30 20 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e  000 },.  };.  in
18f10 74 20 69 3b 0a 20 20 69 6e 74 20 69 73 4e 65 67  t i;.  int isNeg
18f20 20 3d 20 30 3b 0a 20 20 69 66 28 20 7a 41 72 67   = 0;.  if( zArg
18f30 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20 20 20 20  [0]=='-' ){.    
18f40 69 73 4e 65 67 20 3d 20 31 3b 0a 20 20 20 20 7a  isNeg = 1;.    z
18f50 41 72 67 2b 2b 3b 0a 20 20 7d 65 6c 73 65 20 69  Arg++;.  }else i
18f60 66 28 20 7a 41 72 67 5b 30 5d 3d 3d 27 2b 27 20  f( zArg[0]=='+' 
18f70 29 7b 0a 20 20 20 20 7a 41 72 67 2b 2b 3b 0a 20  ){.    zArg++;. 
18f80 20 7d 0a 20 20 69 66 28 20 7a 41 72 67 5b 30 5d   }.  if( zArg[0]
18f90 3d 3d 27 30 27 20 26 26 20 7a 41 72 67 5b 31 5d  =='0' && zArg[1]
18fa0 3d 3d 27 78 27 20 29 7b 0a 20 20 20 20 69 6e 74  =='x' ){.    int
18fb0 20 78 3b 0a 20 20 20 20 7a 41 72 67 20 2b 3d 20   x;.    zArg += 
18fc0 32 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 78  2;.    while( (x
18fd0 20 3d 20 68 65 78 44 69 67 69 74 56 61 6c 75 65   = hexDigitValue
18fe0 28 7a 41 72 67 5b 30 5d 29 29 3e 3d 30 20 29 7b  (zArg[0]))>=0 ){
18ff0 0a 20 20 20 20 20 20 76 20 3d 20 28 76 3c 3c 34  .      v = (v<<4
19000 29 20 2b 20 78 3b 0a 20 20 20 20 20 20 7a 41 72  ) + x;.      zAr
19010 67 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  g++;.    }.  }el
19020 73 65 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 49  se{.    while( I
19030 73 44 69 67 69 74 28 7a 41 72 67 5b 30 5d 29 20  sDigit(zArg[0]) 
19040 29 7b 0a 20 20 20 20 20 20 76 20 3d 20 76 2a 31  ){.      v = v*1
19050 30 20 2b 20 7a 41 72 67 5b 30 5d 20 2d 20 27 30  0 + zArg[0] - '0
19060 27 3b 0a 20 20 20 20 20 20 7a 41 72 67 2b 2b 3b  ';.      zArg++;
19070 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 66 6f 72  .    }.  }.  for
19080 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a  (i=0; i<ArraySiz
19090 65 28 61 4d 75 6c 74 29 3b 20 69 2b 2b 29 7b 0a  e(aMult); i++){.
190a0 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
190b0 73 74 72 69 63 6d 70 28 61 4d 75 6c 74 5b 69 5d  stricmp(aMult[i]
190c0 2e 7a 53 75 66 66 69 78 2c 20 7a 41 72 67 29 3d  .zSuffix, zArg)=
190d0 3d 30 20 29 7b 0a 20 20 20 20 20 20 76 20 2a 3d  =0 ){.      v *=
190e0 20 61 4d 75 6c 74 5b 69 5d 2e 69 4d 75 6c 74 3b   aMult[i].iMult;
190f0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
19100 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
19110 20 69 73 4e 65 67 3f 20 2d 76 20 3a 20 76 3b 0a   isNeg? -v : v;.
19120 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6e 74 65 72 70 72  }../*.** Interpr
19130 65 74 20 7a 41 72 67 20 61 73 20 65 69 74 68 65  et zArg as eithe
19140 72 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20  r an integer or 
19150 61 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 2e  a boolean value.
19160 20 20 52 65 74 75 72 6e 20 31 20 6f 72 20 30 0a    Return 1 or 0.
19170 2a 2a 20 66 6f 72 20 54 52 55 45 20 61 6e 64 20  ** for TRUE and 
19180 46 41 4c 53 45 2e 20 20 52 65 74 75 72 6e 20 74  FALSE.  Return t
19190 68 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65  he integer value
191a0 20 69 66 20 61 70 70 72 6f 70 72 69 61 74 65 2e   if appropriate.
191b0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 62  .*/.static int b
191c0 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 63 6f 6e 73  ooleanValue(cons
191d0 74 20 63 68 61 72 20 2a 7a 41 72 67 29 7b 0a 20  t char *zArg){. 
191e0 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 7a 41   int i;.  if( zA
191f0 72 67 5b 30 5d 3d 3d 27 30 27 20 26 26 20 7a 41  rg[0]=='0' && zA
19200 72 67 5b 31 5d 3d 3d 27 78 27 20 29 7b 0a 20 20  rg[1]=='x' ){.  
19210 20 20 66 6f 72 28 69 3d 32 3b 20 68 65 78 44 69    for(i=2; hexDi
19220 67 69 74 56 61 6c 75 65 28 7a 41 72 67 5b 69 5d  gitValue(zArg[i]
19230 29 3e 3d 30 3b 20 69 2b 2b 29 7b 7d 0a 20 20 7d  )>=0; i++){}.  }
19240 65 6c 73 65 7b 0a 20 20 20 20 66 6f 72 28 69 3d  else{.    for(i=
19250 30 3b 20 7a 41 72 67 5b 69 5d 3e 3d 27 30 27 20  0; zArg[i]>='0' 
19260 26 26 20 7a 41 72 67 5b 69 5d 3c 3d 27 39 27 3b  && zArg[i]<='9';
19270 20 69 2b 2b 29 7b 7d 0a 20 20 7d 0a 20 20 69 66   i++){}.  }.  if
19280 28 20 69 3e 30 20 26 26 20 7a 41 72 67 5b 69 5d  ( i>0 && zArg[i]
19290 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 28 69 6e  ==0 ) return (in
192a0 74 29 28 69 6e 74 65 67 65 72 56 61 6c 75 65 28  t)(integerValue(
192b0 7a 41 72 67 29 20 26 20 30 78 66 66 66 66 66 66  zArg) & 0xffffff
192c0 66 66 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ff);.  if( sqlit
192d0 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c  e3_stricmp(zArg,
192e0 20 22 6f 6e 22 29 3d 3d 30 20 7c 7c 20 73 71 6c   "on")==0 || sql
192f0 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a 41 72  ite3_stricmp(zAr
19300 67 2c 22 79 65 73 22 29 3d 3d 30 20 29 7b 0a 20  g,"yes")==0 ){. 
19310 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
19320 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73  .  if( sqlite3_s
19330 74 72 69 63 6d 70 28 7a 41 72 67 2c 20 22 6f 66  tricmp(zArg, "of
19340 66 22 29 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  f")==0 || sqlite
19350 33 5f 73 74 72 69 63 6d 70 28 7a 41 72 67 2c 22  3_stricmp(zArg,"
19360 6e 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72  no")==0 ){.    r
19370 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 75  eturn 0;.  }.  u
19380 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
19390 72 2c 20 22 45 52 52 4f 52 3a 20 4e 6f 74 20 61  r, "ERROR: Not a
193a0 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 3a 20   boolean value: 
193b0 5c 22 25 73 5c 22 2e 20 41 73 73 75 6d 69 6e 67  \"%s\". Assuming
193c0 20 5c 22 6e 6f 5c 22 2e 5c 6e 22 2c 0a 20 20 20   \"no\".\n",.   
193d0 20 20 20 20 20 20 20 7a 41 72 67 29 3b 0a 20 20         zArg);.  
193e0 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
193f0 2a 2a 20 53 65 74 20 6f 72 20 63 6c 65 61 72 20  ** Set or clear 
19400 61 20 73 68 65 6c 6c 20 66 6c 61 67 20 61 63 63  a shell flag acc
19410 6f 72 64 69 6e 67 20 74 6f 20 61 20 62 6f 6f 6c  ording to a bool
19420 65 61 6e 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74  ean value..*/.st
19430 61 74 69 63 20 76 6f 69 64 20 73 65 74 4f 72 43  atic void setOrC
19440 6c 65 61 72 46 6c 61 67 28 53 68 65 6c 6c 53 74  learFlag(ShellSt
19450 61 74 65 20 2a 70 2c 20 75 6e 73 69 67 6e 65 64  ate *p, unsigned
19460 20 6d 46 6c 61 67 2c 20 63 6f 6e 73 74 20 63 68   mFlag, const ch
19470 61 72 20 2a 7a 41 72 67 29 7b 0a 20 20 69 66 28  ar *zArg){.  if(
19480 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 7a 41   booleanValue(zA
19490 72 67 29 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c  rg) ){.    Shell
194a0 53 65 74 46 6c 61 67 28 70 2c 20 6d 46 6c 61 67  SetFlag(p, mFlag
194b0 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  );.  }else{.    
194c0 53 68 65 6c 6c 43 6c 65 61 72 46 6c 61 67 28 70  ShellClearFlag(p
194d0 2c 20 6d 46 6c 61 67 29 3b 0a 20 20 7d 0a 7d 0a  , mFlag);.  }.}.
194e0 0a 2f 2a 0a 2a 2a 20 43 6c 6f 73 65 20 61 6e 20  ./*.** Close an 
194f0 6f 75 74 70 75 74 20 66 69 6c 65 2c 20 61 73 73  output file, ass
19500 75 6d 69 6e 67 20 69 74 20 69 73 20 6e 6f 74 20  uming it is not 
19510 73 74 64 65 72 72 20 6f 72 20 73 74 64 6f 75 74  stderr or stdout
19520 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
19530 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73  output_file_clos
19540 65 28 46 49 4c 45 20 2a 66 29 7b 0a 20 20 69 66  e(FILE *f){.  if
19550 28 20 66 20 26 26 20 66 21 3d 73 74 64 6f 75 74  ( f && f!=stdout
19560 20 26 26 20 66 21 3d 73 74 64 65 72 72 20 29 20   && f!=stderr ) 
19570 66 63 6c 6f 73 65 28 66 29 3b 0a 7d 0a 0a 2f 2a  fclose(f);.}../*
19580 0a 2a 2a 20 54 72 79 20 74 6f 20 6f 70 65 6e 20  .** Try to open 
19590 61 6e 20 6f 75 74 70 75 74 20 66 69 6c 65 2e 20  an output file. 
195a0 20 20 54 68 65 20 6e 61 6d 65 73 20 22 73 74 64    The names "std
195b0 6f 75 74 22 20 61 6e 64 20 22 73 74 64 65 72 72  out" and "stderr
195c0 22 20 61 72 65 0a 2a 2a 20 72 65 63 6f 67 6e 69  " are.** recogni
195d0 7a 65 64 20 61 6e 64 20 64 6f 20 74 68 65 20 72  zed and do the r
195e0 69 67 68 74 20 74 68 69 6e 67 2e 20 20 4e 55 4c  ight thing.  NUL
195f0 4c 20 69 73 20 72 65 74 75 72 6e 65 64 20 69 66  L is returned if
19600 20 74 68 65 20 6f 75 74 70 75 74 0a 2a 2a 20 66   the output.** f
19610 69 6c 65 6e 61 6d 65 20 69 73 20 22 6f 66 66 22  ilename is "off"
19620 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 46 49 4c 45  ..*/.static FILE
19630 20 2a 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70   *output_file_op
19640 65 6e 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  en(const char *z
19650 46 69 6c 65 29 7b 0a 20 20 46 49 4c 45 20 2a 66  File){.  FILE *f
19660 3b 0a 20 20 69 66 28 20 73 74 72 63 6d 70 28 7a  ;.  if( strcmp(z
19670 46 69 6c 65 2c 22 73 74 64 6f 75 74 22 29 3d 3d  File,"stdout")==
19680 30 20 29 7b 0a 20 20 20 20 66 20 3d 20 73 74 64  0 ){.    f = std
19690 6f 75 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  out;.  }else if(
196a0 20 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 20 22   strcmp(zFile, "
196b0 73 74 64 65 72 72 22 29 3d 3d 30 20 29 7b 0a 20  stderr")==0 ){. 
196c0 20 20 20 66 20 3d 20 73 74 64 65 72 72 3b 0a 20     f = stderr;. 
196d0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
196e0 70 28 7a 46 69 6c 65 2c 20 22 6f 66 66 22 29 3d  p(zFile, "off")=
196f0 3d 30 20 29 7b 0a 20 20 20 20 66 20 3d 20 30 3b  =0 ){.    f = 0;
19700 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 66 20  .  }else{.    f 
19710 3d 20 66 6f 70 65 6e 28 7a 46 69 6c 65 2c 20 22  = fopen(zFile, "
19720 77 62 22 29 3b 0a 20 20 20 20 69 66 28 20 66 3d  wb");.    if( f=
19730 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  =0 ){.      utf8
19740 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
19750 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f  "Error: cannot o
19760 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a  pen \"%s\"\n", z
19770 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  File);.    }.  }
19780 0a 20 20 72 65 74 75 72 6e 20 66 3b 0a 7d 0a 0a  .  return f;.}..
19790 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
197a0 49 54 45 5f 55 4e 54 45 53 54 41 42 4c 45 29 0a  ITE_UNTESTABLE).
197b0 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c  #if !defined(SQL
197c0 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45 29 20  ITE_OMIT_TRACE) 
197d0 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
197e0 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e 47  TE_OMIT_FLOATING
197f0 5f 50 4f 49 4e 54 29 0a 2f 2a 0a 2a 2a 20 41 20  _POINT)./*.** A 
19800 72 6f 75 74 69 6e 65 20 66 6f 72 20 68 61 6e 64  routine for hand
19810 6c 69 6e 67 20 6f 75 74 70 75 74 20 66 72 6f 6d  ling output from
19820 20 73 71 6c 69 74 65 33 5f 74 72 61 63 65 28 29   sqlite3_trace()
19830 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
19840 73 71 6c 5f 74 72 61 63 65 5f 63 61 6c 6c 62 61  sql_trace_callba
19850 63 6b 28 0a 20 20 75 6e 73 69 67 6e 65 64 20 6d  ck(.  unsigned m
19860 54 79 70 65 2c 0a 20 20 76 6f 69 64 20 2a 70 41  Type,.  void *pA
19870 72 67 2c 0a 20 20 76 6f 69 64 20 2a 70 50 2c 0a  rg,.  void *pP,.
19880 20 20 76 6f 69 64 20 2a 70 58 0a 29 7b 0a 20 20    void *pX.){.  
19890 46 49 4c 45 20 2a 66 20 3d 20 28 46 49 4c 45 2a  FILE *f = (FILE*
198a0 29 70 41 72 67 3b 0a 20 20 55 4e 55 53 45 44 5f  )pArg;.  UNUSED_
198b0 50 41 52 41 4d 45 54 45 52 28 6d 54 79 70 65 29  PARAMETER(mType)
198c0 3b 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d  ;.  UNUSED_PARAM
198d0 45 54 45 52 28 70 50 29 3b 0a 20 20 69 66 28 20  ETER(pP);.  if( 
198e0 66 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63  f ){.    const c
198f0 68 61 72 20 2a 7a 20 3d 20 28 63 6f 6e 73 74 20  har *z = (const 
19900 63 68 61 72 2a 29 70 58 3b 0a 20 20 20 20 69 6e  char*)pX;.    in
19910 74 20 69 20 3d 20 28 69 6e 74 29 73 74 72 6c 65  t i = (int)strle
19920 6e 28 7a 29 3b 0a 20 20 20 20 77 68 69 6c 65 28  n(z);.    while(
19930 20 69 3e 30 20 26 26 20 7a 5b 69 2d 31 5d 3d 3d   i>0 && z[i-1]==
19940 27 3b 27 20 29 7b 20 69 2d 2d 3b 20 7d 0a 20 20  ';' ){ i--; }.  
19950 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 66 2c    utf8_printf(f,
19960 20 22 25 2e 2a 73 3b 5c 6e 22 2c 20 69 2c 20 7a   "%.*s;\n", i, z
19970 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
19980 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 23 65 6e 64  0;.}.#endif.#end
19990 69 66 0a 0a 2f 2a 0a 2a 2a 20 41 20 6e 6f 2d 6f  if../*.** A no-o
199a0 70 20 72 6f 75 74 69 6e 65 20 74 68 61 74 20 72  p routine that r
199b0 75 6e 73 20 77 69 74 68 20 74 68 65 20 22 2e 62  uns with the ".b
199c0 72 65 61 6b 70 6f 69 6e 74 22 20 64 6f 63 2d 63  reakpoint" doc-c
199d0 6f 6d 6d 61 6e 64 2e 20 20 54 68 69 73 20 69 73  ommand.  This is
199e0 0a 2a 2a 20 61 20 75 73 65 66 75 6c 20 73 70 6f  .** a useful spo
199f0 74 20 74 6f 20 73 65 74 20 61 20 64 65 62 75 67  t to set a debug
19a00 67 65 72 20 62 72 65 61 6b 70 6f 69 6e 74 2e 0a  ger breakpoint..
19a10 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74  */.static void t
19a20 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 76  est_breakpoint(v
19a30 6f 69 64 29 7b 0a 20 20 73 74 61 74 69 63 20 69  oid){.  static i
19a40 6e 74 20 6e 43 61 6c 6c 20 3d 20 30 3b 0a 20 20  nt nCall = 0;.  
19a50 6e 43 61 6c 6c 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a  nCall++;.}../*.*
19a60 2a 20 41 6e 20 6f 62 6a 65 63 74 20 75 73 65 64  * An object used
19a70 20 74 6f 20 72 65 61 64 20 61 20 43 53 56 20 61   to read a CSV a
19a80 6e 64 20 6f 74 68 65 72 20 66 69 6c 65 73 20 66  nd other files f
19a90 6f 72 20 69 6d 70 6f 72 74 2e 0a 2a 2f 0a 74 79  or import..*/.ty
19aa0 70 65 64 65 66 20 73 74 72 75 63 74 20 49 6d 70  pedef struct Imp
19ab0 6f 72 74 43 74 78 20 49 6d 70 6f 72 74 43 74 78  ortCtx ImportCtx
19ac0 3b 0a 73 74 72 75 63 74 20 49 6d 70 6f 72 74 43  ;.struct ImportC
19ad0 74 78 20 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  tx {.  const cha
19ae0 72 20 2a 7a 46 69 6c 65 3b 20 20 2f 2a 20 4e 61  r *zFile;  /* Na
19af0 6d 65 20 6f 66 20 74 68 65 20 69 6e 70 75 74 20  me of the input 
19b00 66 69 6c 65 20 2a 2f 0a 20 20 46 49 4c 45 20 2a  file */.  FILE *
19b10 69 6e 3b 20 20 20 20 20 20 20 20 20 20 20 2f 2a  in;           /*
19b20 20 52 65 61 64 20 74 68 65 20 43 53 56 20 74 65   Read the CSV te
19b30 78 74 20 66 72 6f 6d 20 74 68 69 73 20 69 6e 70  xt from this inp
19b40 75 74 20 73 74 72 65 61 6d 20 2a 2f 0a 20 20 63  ut stream */.  c
19b50 68 61 72 20 2a 7a 3b 20 20 20 20 20 20 20 20 20  har *z;         
19b60 20 20 20 2f 2a 20 41 63 63 75 6d 75 6c 61 74 65     /* Accumulate
19b70 64 20 74 65 78 74 20 66 6f 72 20 61 20 66 69 65  d text for a fie
19b80 6c 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 3b 20 20  ld */.  int n;  
19b90 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
19ba0 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 69  umber of bytes i
19bb0 6e 20 7a 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 6c  n z */.  int nAl
19bc0 6c 6f 63 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  loc;         /* 
19bd0 53 70 61 63 65 20 61 6c 6c 6f 63 61 74 65 64 20  Space allocated 
19be0 66 6f 72 20 7a 5b 5d 20 2a 2f 0a 20 20 69 6e 74  for z[] */.  int
19bf0 20 6e 4c 69 6e 65 3b 20 20 20 20 20 20 20 20 20   nLine;         
19c00 20 2f 2a 20 43 75 72 72 65 6e 74 20 6c 69 6e 65   /* Current line
19c10 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74   number */.  int
19c20 20 62 4e 6f 74 46 69 72 73 74 3b 20 20 20 20 20   bNotFirst;     
19c30 20 2f 2a 20 54 72 75 65 20 69 66 20 6f 6e 65 20   /* True if one 
19c40 6f 72 20 6d 6f 72 65 20 62 79 74 65 73 20 61 6c  or more bytes al
19c50 72 65 61 64 79 20 72 65 61 64 20 2a 2f 0a 20 20  ready read */.  
19c60 69 6e 74 20 63 54 65 72 6d 3b 20 20 20 20 20 20  int cTerm;      
19c70 20 20 20 20 2f 2a 20 43 68 61 72 61 63 74 65 72      /* Character
19c80 20 74 68 61 74 20 74 65 72 6d 69 6e 61 74 65 64   that terminated
19c90 20 74 68 65 20 6d 6f 73 74 20 72 65 63 65 6e 74   the most recent
19ca0 20 66 69 65 6c 64 20 2a 2f 0a 20 20 69 6e 74 20   field */.  int 
19cb0 63 43 6f 6c 53 65 70 3b 20 20 20 20 20 20 20 20  cColSep;        
19cc0 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 20 73 65  /* The column se
19cd0 70 61 72 61 74 6f 72 20 63 68 61 72 61 63 74 65  parator characte
19ce0 72 2e 20 20 28 55 73 75 61 6c 6c 79 20 22 2c 22  r.  (Usually ","
19cf0 29 20 2a 2f 0a 20 20 69 6e 74 20 63 52 6f 77 53  ) */.  int cRowS
19d00 65 70 3b 20 20 20 20 20 20 20 20 2f 2a 20 54 68  ep;        /* Th
19d10 65 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72 20  e row separator 
19d20 63 68 61 72 61 63 74 65 72 2e 20 20 28 55 73 75  character.  (Usu
19d30 61 6c 6c 79 20 22 5c 6e 22 29 20 2a 2f 0a 7d 3b  ally "\n") */.};
19d40 0a 0a 2f 2a 20 41 70 70 65 6e 64 20 61 20 73 69  ../* Append a si
19d50 6e 67 6c 65 20 62 79 74 65 20 74 6f 20 7a 5b 5d  ngle byte to z[]
19d60 20 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20   */.static void 
19d70 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68  import_append_ch
19d80 61 72 28 49 6d 70 6f 72 74 43 74 78 20 2a 70 2c  ar(ImportCtx *p,
19d90 20 69 6e 74 20 63 29 7b 0a 20 20 69 66 28 20 70   int c){.  if( p
19da0 2d 3e 6e 2b 31 3e 3d 70 2d 3e 6e 41 6c 6c 6f 63  ->n+1>=p->nAlloc
19db0 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 41 6c 6c 6f   ){.    p->nAllo
19dc0 63 20 2b 3d 20 70 2d 3e 6e 41 6c 6c 6f 63 20 2b  c += p->nAlloc +
19dd0 20 31 30 30 3b 0a 20 20 20 20 70 2d 3e 7a 20 3d   100;.    p->z =
19de0 20 73 71 6c 69 74 65 33 5f 72 65 61 6c 6c 6f 63   sqlite3_realloc
19df0 36 34 28 70 2d 3e 7a 2c 20 70 2d 3e 6e 41 6c 6c  64(p->z, p->nAll
19e00 6f 63 29 3b 0a 20 20 20 20 69 66 28 20 70 2d 3e  oc);.    if( p->
19e10 7a 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61  z==0 ){.      ra
19e20 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
19e30 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c   "out of memory\
19e40 6e 22 29 3b 0a 20 20 20 20 20 20 65 78 69 74 28  n");.      exit(
19e50 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  1);.    }.  }.  
19e60 70 2d 3e 7a 5b 70 2d 3e 6e 2b 2b 5d 20 3d 20 28  p->z[p->n++] = (
19e70 63 68 61 72 29 63 3b 0a 7d 0a 0a 2f 2a 20 52 65  char)c;.}../* Re
19e80 61 64 20 61 20 73 69 6e 67 6c 65 20 66 69 65 6c  ad a single fiel
19e90 64 20 6f 66 20 43 53 56 20 74 65 78 74 2e 20 20  d of CSV text.  
19ea0 43 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  Compatible with 
19eb0 72 66 63 34 31 38 30 20 61 6e 64 20 65 78 74 65  rfc4180 and exte
19ec0 6e 64 65 64 0a 2a 2a 20 77 69 74 68 20 74 68 65  nded.** with the
19ed0 20 6f 70 74 69 6f 6e 20 6f 66 20 68 61 76 69 6e   option of havin
19ee0 67 20 61 20 73 65 70 61 72 61 74 6f 72 20 6f 74  g a separator ot
19ef0 68 65 72 20 74 68 61 6e 20 22 2c 22 2e 0a 2a 2a  her than ","..**
19f00 0a 2a 2a 20 20 20 2b 20 20 49 6e 70 75 74 20 63  .**   +  Input c
19f10 6f 6d 65 73 20 66 72 6f 6d 20 70 2d 3e 69 6e 2e  omes from p->in.
19f20 0a 2a 2a 20 20 20 2b 20 20 53 74 6f 72 65 20 72  .**   +  Store r
19f30 65 73 75 6c 74 73 20 69 6e 20 70 2d 3e 7a 20 6f  esults in p->z o
19f40 66 20 6c 65 6e 67 74 68 20 70 2d 3e 6e 2e 20 20  f length p->n.  
19f50 53 70 61 63 65 20 74 6f 20 68 6f 6c 64 20 70 2d  Space to hold p-
19f60 3e 7a 20 63 6f 6d 65 73 0a 2a 2a 20 20 20 20 20  >z comes.**     
19f70 20 66 72 6f 6d 20 73 71 6c 69 74 65 33 5f 6d 61   from sqlite3_ma
19f80 6c 6c 6f 63 36 34 28 29 2e 0a 2a 2a 20 20 20 2b  lloc64()..**   +
19f90 20 20 55 73 65 20 70 2d 3e 63 53 65 70 20 61 73    Use p->cSep as
19fa0 20 74 68 65 20 63 6f 6c 75 6d 6e 20 73 65 70 61   the column sepa
19fb0 72 61 74 6f 72 2e 20 20 54 68 65 20 64 65 66 61  rator.  The defa
19fc0 75 6c 74 20 69 73 20 22 2c 22 2e 0a 2a 2a 20 20  ult is ","..**  
19fd0 20 2b 20 20 55 73 65 20 70 2d 3e 72 53 65 70 20   +  Use p->rSep 
19fe0 61 73 20 74 68 65 20 72 6f 77 20 73 65 70 61 72  as the row separ
19ff0 61 74 6f 72 2e 20 20 54 68 65 20 64 65 66 61 75  ator.  The defau
1a000 6c 74 20 69 73 20 22 5c 6e 22 2e 0a 2a 2a 20 20  lt is "\n"..**  
1a010 20 2b 20 20 4b 65 65 70 20 74 72 61 63 6b 20 6f   +  Keep track o
1a020 66 20 74 68 65 20 6c 69 6e 65 20 6e 75 6d 62 65  f the line numbe
1a030 72 20 69 6e 20 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a  r in p->nLine..*
1a040 2a 20 20 20 2b 20 20 53 74 6f 72 65 20 74 68 65  *   +  Store the
1a050 20 63 68 61 72 61 63 74 65 72 20 74 68 61 74 20   character that 
1a060 74 65 72 6d 69 6e 61 74 65 73 20 74 68 65 20 66  terminates the f
1a070 69 65 6c 64 20 69 6e 20 70 2d 3e 63 54 65 72 6d  ield in p->cTerm
1a080 2e 20 20 53 74 6f 72 65 0a 2a 2a 20 20 20 20 20  .  Store.**     
1a090 20 45 4f 46 20 6f 6e 20 65 6e 64 2d 6f 66 2d 66   EOF on end-of-f
1a0a0 69 6c 65 2e 0a 2a 2a 20 20 20 2b 20 20 52 65 70  ile..**   +  Rep
1a0b0 6f 72 74 20 73 79 6e 74 61 78 20 65 72 72 6f 72  ort syntax error
1a0c0 73 20 6f 6e 20 73 74 64 65 72 72 0a 2a 2f 0a 73  s on stderr.*/.s
1a0d0 74 61 74 69 63 20 63 68 61 72 20 2a 53 51 4c 49  tatic char *SQLI
1a0e0 54 45 5f 43 44 45 43 4c 20 63 73 76 5f 72 65 61  TE_CDECL csv_rea
1a0f0 64 5f 6f 6e 65 5f 66 69 65 6c 64 28 49 6d 70 6f  d_one_field(Impo
1a100 72 74 43 74 78 20 2a 70 29 7b 0a 20 20 69 6e 74  rtCtx *p){.  int
1a110 20 63 3b 0a 20 20 69 6e 74 20 63 53 65 70 20 3d   c;.  int cSep =
1a120 20 70 2d 3e 63 43 6f 6c 53 65 70 3b 0a 20 20 69   p->cColSep;.  i
1a130 6e 74 20 72 53 65 70 20 3d 20 70 2d 3e 63 52 6f  nt rSep = p->cRo
1a140 77 53 65 70 3b 0a 20 20 70 2d 3e 6e 20 3d 20 30  wSep;.  p->n = 0
1a150 3b 0a 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d  ;.  c = fgetc(p-
1a160 3e 69 6e 29 3b 0a 20 20 69 66 28 20 63 3d 3d 45  >in);.  if( c==E
1a170 4f 46 20 7c 7c 20 73 65 65 6e 49 6e 74 65 72 72  OF || seenInterr
1a180 75 70 74 20 29 7b 0a 20 20 20 20 70 2d 3e 63 54  upt ){.    p->cT
1a190 65 72 6d 20 3d 20 45 4f 46 3b 0a 20 20 20 20 72  erm = EOF;.    r
1a1a0 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
1a1b0 66 28 20 63 3d 3d 27 22 27 20 29 7b 0a 20 20 20  f( c=='"' ){.   
1a1c0 20 69 6e 74 20 70 63 2c 20 70 70 63 3b 0a 20 20   int pc, ppc;.  
1a1d0 20 20 69 6e 74 20 73 74 61 72 74 4c 69 6e 65 20    int startLine 
1a1e0 3d 20 70 2d 3e 6e 4c 69 6e 65 3b 0a 20 20 20 20  = p->nLine;.    
1a1f0 69 6e 74 20 63 51 75 6f 74 65 20 3d 20 63 3b 0a  int cQuote = c;.
1a200 20 20 20 20 70 63 20 3d 20 70 70 63 20 3d 20 30      pc = ppc = 0
1a210 3b 0a 20 20 20 20 77 68 69 6c 65 28 20 31 20 29  ;.    while( 1 )
1a220 7b 0a 20 20 20 20 20 20 63 20 3d 20 66 67 65 74  {.      c = fget
1a230 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 20 20 20 20  c(p->in);.      
1a240 69 66 28 20 63 3d 3d 72 53 65 70 20 29 20 70 2d  if( c==rSep ) p-
1a250 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20  >nLine++;.      
1a260 69 66 28 20 63 3d 3d 63 51 75 6f 74 65 20 29 7b  if( c==cQuote ){
1a270 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 63 3d  .        if( pc=
1a280 3d 63 51 75 6f 74 65 20 29 7b 0a 20 20 20 20 20  =cQuote ){.     
1a290 20 20 20 20 20 70 63 20 3d 20 30 3b 0a 20 20 20       pc = 0;.   
1a2a0 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
1a2b0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1a2c0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 28 63 3d   }.      if( (c=
1a2d0 3d 63 53 65 70 20 26 26 20 70 63 3d 3d 63 51 75  =cSep && pc==cQu
1a2e0 6f 74 65 29 0a 20 20 20 20 20 20 20 7c 7c 20 28  ote).       || (
1a2f0 63 3d 3d 72 53 65 70 20 26 26 20 70 63 3d 3d 63  c==rSep && pc==c
1a300 51 75 6f 74 65 29 0a 20 20 20 20 20 20 20 7c 7c  Quote).       ||
1a310 20 28 63 3d 3d 72 53 65 70 20 26 26 20 70 63 3d   (c==rSep && pc=
1a320 3d 27 5c 72 27 20 26 26 20 70 70 63 3d 3d 63 51  ='\r' && ppc==cQ
1a330 75 6f 74 65 29 0a 20 20 20 20 20 20 20 7c 7c 20  uote).       || 
1a340 28 63 3d 3d 45 4f 46 20 26 26 20 70 63 3d 3d 63  (c==EOF && pc==c
1a350 51 75 6f 74 65 29 0a 20 20 20 20 20 20 29 7b 0a  Quote).      ){.
1a360 20 20 20 20 20 20 20 20 64 6f 7b 20 70 2d 3e 6e          do{ p->n
1a370 2d 2d 3b 20 7d 77 68 69 6c 65 28 20 70 2d 3e 7a  --; }while( p->z
1a380 5b 70 2d 3e 6e 5d 21 3d 63 51 75 6f 74 65 20 29  [p->n]!=cQuote )
1a390 3b 0a 20 20 20 20 20 20 20 20 70 2d 3e 63 54 65  ;.        p->cTe
1a3a0 72 6d 20 3d 20 63 3b 0a 20 20 20 20 20 20 20 20  rm = c;.        
1a3b0 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
1a3c0 20 20 20 20 20 69 66 28 20 70 63 3d 3d 63 51 75       if( pc==cQu
1a3d0 6f 74 65 20 26 26 20 63 21 3d 27 5c 72 27 20 29  ote && c!='\r' )
1a3e0 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  {.        utf8_p
1a3f0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25  rintf(stderr, "%
1a400 73 3a 25 64 3a 20 75 6e 65 73 63 61 70 65 64 20  s:%d: unescaped 
1a410 25 63 20 63 68 61 72 61 63 74 65 72 5c 6e 22 2c  %c character\n",
1a420 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1a430 20 70 2d 3e 7a 46 69 6c 65 2c 20 70 2d 3e 6e 4c   p->zFile, p->nL
1a440 69 6e 65 2c 20 63 51 75 6f 74 65 29 3b 0a 20 20  ine, cQuote);.  
1a450 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1a460 63 3d 3d 45 4f 46 20 29 7b 0a 20 20 20 20 20 20  c==EOF ){.      
1a470 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
1a480 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 75 6e  derr, "%s:%d: un
1a490 74 65 72 6d 69 6e 61 74 65 64 20 25 63 2d 71 75  terminated %c-qu
1a4a0 6f 74 65 64 20 66 69 65 6c 64 5c 6e 22 2c 0a 20  oted field\n",. 
1a4b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
1a4c0 2d 3e 7a 46 69 6c 65 2c 20 73 74 61 72 74 4c 69  ->zFile, startLi
1a4d0 6e 65 2c 20 63 51 75 6f 74 65 29 3b 0a 20 20 20  ne, cQuote);.   
1a4e0 20 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20       p->cTerm = 
1a4f0 63 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  c;.        break
1a500 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
1a510 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68  import_append_ch
1a520 61 72 28 70 2c 20 63 29 3b 0a 20 20 20 20 20 20  ar(p, c);.      
1a530 70 70 63 20 3d 20 70 63 3b 0a 20 20 20 20 20 20  ppc = pc;.      
1a540 70 63 20 3d 20 63 3b 0a 20 20 20 20 7d 0a 20 20  pc = c;.    }.  
1a550 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 49 66  }else{.    /* If
1a560 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
1a570 73 74 20 66 69 65 6c 64 20 62 65 69 6e 67 20 70  st field being p
1a580 61 72 73 65 64 20 61 6e 64 20 69 74 20 62 65 67  arsed and it beg
1a590 69 6e 73 20 77 69 74 68 20 74 68 65 0a 20 20 20  ins with the.   
1a5a0 20 2a 2a 20 55 54 46 2d 38 20 42 4f 4d 20 20 28   ** UTF-8 BOM  (
1a5b0 30 78 45 46 20 42 42 20 42 46 29 20 74 68 65 6e  0xEF BB BF) then
1a5c0 20 73 6b 69 70 20 74 68 65 20 42 4f 4d 20 2a 2f   skip the BOM */
1a5d0 0a 20 20 20 20 69 66 28 20 28 63 26 30 78 66 66  .    if( (c&0xff
1a5e0 29 3d 3d 30 78 65 66 20 26 26 20 70 2d 3e 62 4e  )==0xef && p->bN
1a5f0 6f 74 46 69 72 73 74 3d 3d 30 20 29 7b 0a 20 20  otFirst==0 ){.  
1a600 20 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e      import_appen
1a610 64 5f 63 68 61 72 28 70 2c 20 63 29 3b 0a 20 20  d_char(p, c);.  
1a620 20 20 20 20 63 20 3d 20 66 67 65 74 63 28 70 2d      c = fgetc(p-
1a630 3e 69 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20  >in);.      if( 
1a640 28 63 26 30 78 66 66 29 3d 3d 30 78 62 62 20 29  (c&0xff)==0xbb )
1a650 7b 0a 20 20 20 20 20 20 20 20 69 6d 70 6f 72 74  {.        import
1a660 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70 2c 20  _append_char(p, 
1a670 63 29 3b 0a 20 20 20 20 20 20 20 20 63 20 3d 20  c);.        c = 
1a680 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20  fgetc(p->in);.  
1a690 20 20 20 20 20 20 69 66 28 20 28 63 26 30 78 66        if( (c&0xf
1a6a0 66 29 3d 3d 30 78 62 66 20 29 7b 0a 20 20 20 20  f)==0xbf ){.    
1a6b0 20 20 20 20 20 20 70 2d 3e 62 4e 6f 74 46 69 72        p->bNotFir
1a6c0 73 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  st = 1;.        
1a6d0 20 20 70 2d 3e 6e 20 3d 20 30 3b 0a 20 20 20 20    p->n = 0;.    
1a6e0 20 20 20 20 20 20 72 65 74 75 72 6e 20 63 73 76        return csv
1a6f0 5f 72 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 28  _read_one_field(
1a700 70 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  p);.        }.  
1a710 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20      }.    }.    
1a720 77 68 69 6c 65 28 20 63 21 3d 45 4f 46 20 26 26  while( c!=EOF &&
1a730 20 63 21 3d 63 53 65 70 20 26 26 20 63 21 3d 72   c!=cSep && c!=r
1a740 53 65 70 20 29 7b 0a 20 20 20 20 20 20 69 6d 70  Sep ){.      imp
1a750 6f 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28  ort_append_char(
1a760 70 2c 20 63 29 3b 0a 20 20 20 20 20 20 63 20 3d  p, c);.      c =
1a770 20 66 67 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20   fgetc(p->in);. 
1a780 20 20 20 7d 0a 20 20 20 20 69 66 28 20 63 3d 3d     }.    if( c==
1a790 72 53 65 70 20 29 7b 0a 20 20 20 20 20 20 70 2d  rSep ){.      p-
1a7a0 3e 6e 4c 69 6e 65 2b 2b 3b 0a 20 20 20 20 20 20  >nLine++;.      
1a7b0 69 66 28 20 70 2d 3e 6e 3e 30 20 26 26 20 70 2d  if( p->n>0 && p-
1a7c0 3e 7a 5b 70 2d 3e 6e 2d 31 5d 3d 3d 27 5c 72 27  >z[p->n-1]=='\r'
1a7d0 20 29 20 70 2d 3e 6e 2d 2d 3b 0a 20 20 20 20 7d   ) p->n--;.    }
1a7e0 0a 20 20 20 20 70 2d 3e 63 54 65 72 6d 20 3d 20  .    p->cTerm = 
1a7f0 63 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 2d 3e  c;.  }.  if( p->
1a800 7a 20 29 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d  z ) p->z[p->n] =
1a810 20 30 3b 0a 20 20 70 2d 3e 62 4e 6f 74 46 69 72   0;.  p->bNotFir
1a820 73 74 20 3d 20 31 3b 0a 20 20 72 65 74 75 72 6e  st = 1;.  return
1a830 20 70 2d 3e 7a 3b 0a 7d 0a 0a 2f 2a 20 52 65 61   p->z;.}../* Rea
1a840 64 20 61 20 73 69 6e 67 6c 65 20 66 69 65 6c 64  d a single field
1a850 20 6f 66 20 41 53 43 49 49 20 64 65 6c 69 6d 69   of ASCII delimi
1a860 74 65 64 20 74 65 78 74 2e 0a 2a 2a 0a 2a 2a 20  ted text..**.** 
1a870 20 20 2b 20 20 49 6e 70 75 74 20 63 6f 6d 65 73    +  Input comes
1a880 20 66 72 6f 6d 20 70 2d 3e 69 6e 2e 0a 2a 2a 20   from p->in..** 
1a890 20 20 2b 20 20 53 74 6f 72 65 20 72 65 73 75 6c    +  Store resul
1a8a0 74 73 20 69 6e 20 70 2d 3e 7a 20 6f 66 20 6c 65  ts in p->z of le
1a8b0 6e 67 74 68 20 70 2d 3e 6e 2e 20 20 53 70 61 63  ngth p->n.  Spac
1a8c0 65 20 74 6f 20 68 6f 6c 64 20 70 2d 3e 7a 20 63  e to hold p->z c
1a8d0 6f 6d 65 73 0a 2a 2a 20 20 20 20 20 20 66 72 6f  omes.**      fro
1a8e0 6d 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  m sqlite3_malloc
1a8f0 36 34 28 29 2e 0a 2a 2a 20 20 20 2b 20 20 55 73  64()..**   +  Us
1a900 65 20 70 2d 3e 63 53 65 70 20 61 73 20 74 68 65  e p->cSep as the
1a910 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f   column separato
1a920 72 2e 20 20 54 68 65 20 64 65 66 61 75 6c 74 20  r.  The default 
1a930 69 73 20 22 5c 78 31 46 22 2e 0a 2a 2a 20 20 20  is "\x1F"..**   
1a940 2b 20 20 55 73 65 20 70 2d 3e 72 53 65 70 20 61  +  Use p->rSep a
1a950 73 20 74 68 65 20 72 6f 77 20 73 65 70 61 72 61  s the row separa
1a960 74 6f 72 2e 20 20 54 68 65 20 64 65 66 61 75 6c  tor.  The defaul
1a970 74 20 69 73 20 22 5c 78 31 45 22 2e 0a 2a 2a 20  t is "\x1E"..** 
1a980 20 20 2b 20 20 4b 65 65 70 20 74 72 61 63 6b 20    +  Keep track 
1a990 6f 66 20 74 68 65 20 72 6f 77 20 6e 75 6d 62 65  of the row numbe
1a9a0 72 20 69 6e 20 70 2d 3e 6e 4c 69 6e 65 2e 0a 2a  r in p->nLine..*
1a9b0 2a 20 20 20 2b 20 20 53 74 6f 72 65 20 74 68 65  *   +  Store the
1a9c0 20 63 68 61 72 61 63 74 65 72 20 74 68 61 74 20   character that 
1a9d0 74 65 72 6d 69 6e 61 74 65 73 20 74 68 65 20 66  terminates the f
1a9e0 69 65 6c 64 20 69 6e 20 70 2d 3e 63 54 65 72 6d  ield in p->cTerm
1a9f0 2e 20 20 53 74 6f 72 65 0a 2a 2a 20 20 20 20 20  .  Store.**     
1aa00 20 45 4f 46 20 6f 6e 20 65 6e 64 2d 6f 66 2d 66   EOF on end-of-f
1aa10 69 6c 65 2e 0a 2a 2a 20 20 20 2b 20 20 52 65 70  ile..**   +  Rep
1aa20 6f 72 74 20 73 79 6e 74 61 78 20 65 72 72 6f 72  ort syntax error
1aa30 73 20 6f 6e 20 73 74 64 65 72 72 0a 2a 2f 0a 73  s on stderr.*/.s
1aa40 74 61 74 69 63 20 63 68 61 72 20 2a 53 51 4c 49  tatic char *SQLI
1aa50 54 45 5f 43 44 45 43 4c 20 61 73 63 69 69 5f 72  TE_CDECL ascii_r
1aa60 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 28 49 6d  ead_one_field(Im
1aa70 70 6f 72 74 43 74 78 20 2a 70 29 7b 0a 20 20 69  portCtx *p){.  i
1aa80 6e 74 20 63 3b 0a 20 20 69 6e 74 20 63 53 65 70  nt c;.  int cSep
1aa90 20 3d 20 70 2d 3e 63 43 6f 6c 53 65 70 3b 0a 20   = p->cColSep;. 
1aaa0 20 69 6e 74 20 72 53 65 70 20 3d 20 70 2d 3e 63   int rSep = p->c
1aab0 52 6f 77 53 65 70 3b 0a 20 20 70 2d 3e 6e 20 3d  RowSep;.  p->n =
1aac0 20 30 3b 0a 20 20 63 20 3d 20 66 67 65 74 63 28   0;.  c = fgetc(
1aad0 70 2d 3e 69 6e 29 3b 0a 20 20 69 66 28 20 63 3d  p->in);.  if( c=
1aae0 3d 45 4f 46 20 7c 7c 20 73 65 65 6e 49 6e 74 65  =EOF || seenInte
1aaf0 72 72 75 70 74 20 29 7b 0a 20 20 20 20 70 2d 3e  rrupt ){.    p->
1ab00 63 54 65 72 6d 20 3d 20 45 4f 46 3b 0a 20 20 20  cTerm = EOF;.   
1ab10 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
1ab20 20 77 68 69 6c 65 28 20 63 21 3d 45 4f 46 20 26   while( c!=EOF &
1ab30 26 20 63 21 3d 63 53 65 70 20 26 26 20 63 21 3d  & c!=cSep && c!=
1ab40 72 53 65 70 20 29 7b 0a 20 20 20 20 69 6d 70 6f  rSep ){.    impo
1ab50 72 74 5f 61 70 70 65 6e 64 5f 63 68 61 72 28 70  rt_append_char(p
1ab60 2c 20 63 29 3b 0a 20 20 20 20 63 20 3d 20 66 67  , c);.    c = fg
1ab70 65 74 63 28 70 2d 3e 69 6e 29 3b 0a 20 20 7d 0a  etc(p->in);.  }.
1ab80 20 20 69 66 28 20 63 3d 3d 72 53 65 70 20 29 7b    if( c==rSep ){
1ab90 0a 20 20 20 20 70 2d 3e 6e 4c 69 6e 65 2b 2b 3b  .    p->nLine++;
1aba0 0a 20 20 7d 0a 20 20 70 2d 3e 63 54 65 72 6d 20  .  }.  p->cTerm 
1abb0 3d 20 63 3b 0a 20 20 69 66 28 20 70 2d 3e 7a 20  = c;.  if( p->z 
1abc0 29 20 70 2d 3e 7a 5b 70 2d 3e 6e 5d 20 3d 20 30  ) p->z[p->n] = 0
1abd0 3b 0a 20 20 72 65 74 75 72 6e 20 70 2d 3e 7a 3b  ;.  return p->z;
1abe0 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  .}../*.** Try to
1abf0 20 74 72 61 6e 73 66 65 72 20 64 61 74 61 20 66   transfer data f
1ac00 6f 72 20 74 61 62 6c 65 20 7a 54 61 62 6c 65 2e  or table zTable.
1ac10 20 20 49 66 20 61 6e 20 65 72 72 6f 72 20 69 73    If an error is
1ac20 20 73 65 65 6e 20 77 68 69 6c 65 0a 2a 2a 20 6d   seen while.** m
1ac30 6f 76 69 6e 67 20 66 6f 72 77 61 72 64 2c 20 74  oving forward, t
1ac40 72 79 20 74 6f 20 67 6f 20 62 61 63 6b 77 61 72  ry to go backwar
1ac50 64 73 2e 20 20 54 68 65 20 62 61 63 6b 77 61 72  ds.  The backwar
1ac60 64 73 20 6d 6f 76 65 6d 65 6e 74 20 77 6f 6e 27  ds movement won'
1ac70 74 0a 2a 2a 20 77 6f 72 6b 20 66 6f 72 20 57 49  t.** work for WI
1ac80 54 48 4f 55 54 20 52 4f 57 49 44 20 74 61 62 6c  THOUT ROWID tabl
1ac90 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  es..*/.static vo
1aca0 69 64 20 74 72 79 54 6f 43 6c 6f 6e 65 44 61 74  id tryToCloneDat
1acb0 61 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  a(.  ShellState 
1acc0 2a 70 2c 0a 20 20 73 71 6c 69 74 65 33 20 2a 6e  *p,.  sqlite3 *n
1acd0 65 77 44 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  ewDb,.  const ch
1ace0 61 72 20 2a 7a 54 61 62 6c 65 0a 29 7b 0a 20 20  ar *zTable.){.  
1acf0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 51  sqlite3_stmt *pQ
1ad00 75 65 72 79 20 3d 20 30 3b 0a 20 20 73 71 6c 69  uery = 0;.  sqli
1ad10 74 65 33 5f 73 74 6d 74 20 2a 70 49 6e 73 65 72  te3_stmt *pInser
1ad20 74 20 3d 20 30 3b 0a 20 20 63 68 61 72 20 2a 7a  t = 0;.  char *z
1ad30 51 75 65 72 79 20 3d 20 30 3b 0a 20 20 63 68 61  Query = 0;.  cha
1ad40 72 20 2a 7a 49 6e 73 65 72 74 20 3d 20 30 3b 0a  r *zInsert = 0;.
1ad50 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 6e 74 20    int rc;.  int 
1ad60 69 2c 20 6a 2c 20 6e 3b 0a 20 20 69 6e 74 20 6e  i, j, n;.  int n
1ad70 54 61 62 6c 65 20 3d 20 28 69 6e 74 29 73 74 72  Table = (int)str
1ad80 6c 65 6e 28 7a 54 61 62 6c 65 29 3b 0a 20 20 69  len(zTable);.  i
1ad90 6e 74 20 6b 20 3d 20 30 3b 0a 20 20 69 6e 74 20  nt k = 0;.  int 
1ada0 63 6e 74 20 3d 20 30 3b 0a 20 20 63 6f 6e 73 74  cnt = 0;.  const
1adb0 20 69 6e 74 20 73 70 69 6e 52 61 74 65 20 3d 20   int spinRate = 
1adc0 31 30 30 30 30 3b 0a 0a 20 20 7a 51 75 65 72 79  10000;..  zQuery
1add0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
1ade0 74 66 28 22 53 45 4c 45 43 54 20 2a 20 46 52 4f  tf("SELECT * FRO
1adf0 4d 20 5c 22 25 77 5c 22 22 2c 20 7a 54 61 62 6c  M \"%w\"", zTabl
1ae00 65 29 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74  e);.  rc = sqlit
1ae10 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d  e3_prepare_v2(p-
1ae20 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31 2c  >db, zQuery, -1,
1ae30 20 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20   &pQuery, 0);.  
1ae40 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 75 74  if( rc ){.    ut
1ae50 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
1ae60 2c 20 22 45 72 72 6f 72 20 25 64 3a 20 25 73 20  , "Error %d: %s 
1ae70 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20  on [%s]\n",.    
1ae80 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1ae90 65 78 74 65 6e 64 65 64 5f 65 72 72 63 6f 64 65  extended_errcode
1aea0 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69 74 65 33  (p->db), sqlite3
1aeb0 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 2c 0a  _errmsg(p->db),.
1aec0 20 20 20 20 20 20 20 20 20 20 20 20 7a 51 75 65              zQue
1aed0 72 79 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65 6e  ry);.    goto en
1aee0 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20 20 7d  d_data_xfer;.  }
1aef0 0a 20 20 6e 20 3d 20 73 71 6c 69 74 65 33 5f 63  .  n = sqlite3_c
1af00 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28 70 51 75 65  olumn_count(pQue
1af10 72 79 29 3b 0a 20 20 7a 49 6e 73 65 72 74 20 3d  ry);.  zInsert =
1af20 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 36   sqlite3_malloc6
1af30 34 28 32 30 30 20 2b 20 6e 54 61 62 6c 65 20 2b  4(200 + nTable +
1af40 20 6e 2a 33 29 3b 0a 20 20 69 66 28 20 7a 49 6e   n*3);.  if( zIn
1af50 73 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  sert==0 ){.    r
1af60 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
1af70 2c 20 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  , "out of memory
1af80 5c 6e 22 29 3b 0a 20 20 20 20 67 6f 74 6f 20 65  \n");.    goto e
1af90 6e 64 5f 64 61 74 61 5f 78 66 65 72 3b 0a 20 20  nd_data_xfer;.  
1afa0 7d 0a 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72  }.  sqlite3_snpr
1afb0 69 6e 74 66 28 32 30 30 2b 6e 54 61 62 6c 65 2c  intf(200+nTable,
1afc0 7a 49 6e 73 65 72 74 2c 0a 20 20 20 20 20 20 20  zInsert,.       
1afd0 20 20 20 20 20 20 20 20 20 20 20 20 22 49 4e 53              "INS
1afe0 45 52 54 20 4f 52 20 49 47 4e 4f 52 45 20 49 4e  ERT OR IGNORE IN
1aff0 54 4f 20 5c 22 25 73 5c 22 20 56 41 4c 55 45 53  TO \"%s\" VALUES
1b000 28 3f 22 2c 20 7a 54 61 62 6c 65 29 3b 0a 20 20  (?", zTable);.  
1b010 69 20 3d 20 28 69 6e 74 29 73 74 72 6c 65 6e 28  i = (int)strlen(
1b020 7a 49 6e 73 65 72 74 29 3b 0a 20 20 66 6f 72 28  zInsert);.  for(
1b030 6a 3d 31 3b 20 6a 3c 6e 3b 20 6a 2b 2b 29 7b 0a  j=1; j<n; j++){.
1b040 20 20 20 20 6d 65 6d 63 70 79 28 7a 49 6e 73 65      memcpy(zInse
1b050 72 74 2b 69 2c 20 22 2c 3f 22 2c 20 32 29 3b 0a  rt+i, ",?", 2);.
1b060 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 7d 0a      i += 2;.  }.
1b070 20 20 6d 65 6d 63 70 79 28 7a 49 6e 73 65 72 74    memcpy(zInsert
1b080 2b 69 2c 20 22 29 3b 22 2c 20 33 29 3b 0a 20 20  +i, ");", 3);.  
1b090 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
1b0a0 70 61 72 65 5f 76 32 28 6e 65 77 44 62 2c 20 7a  pare_v2(newDb, z
1b0b0 49 6e 73 65 72 74 2c 20 2d 31 2c 20 26 70 49 6e  Insert, -1, &pIn
1b0c0 73 65 72 74 2c 20 30 29 3b 0a 20 20 69 66 28 20  sert, 0);.  if( 
1b0d0 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70  rc ){.    utf8_p
1b0e0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
1b0f0 72 72 6f 72 20 25 64 3a 20 25 73 20 6f 6e 20 5b  rror %d: %s on [
1b100 25 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  %s]\n",.        
1b110 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65      sqlite3_exte
1b120 6e 64 65 64 5f 65 72 72 63 6f 64 65 28 6e 65 77  nded_errcode(new
1b130 44 62 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  Db), sqlite3_err
1b140 6d 73 67 28 6e 65 77 44 62 29 2c 0a 20 20 20 20  msg(newDb),.    
1b150 20 20 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b          zQuery);
1b160 0a 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 64 61  .    goto end_da
1b170 74 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20 66  ta_xfer;.  }.  f
1b180 6f 72 28 6b 3d 30 3b 20 6b 3c 32 3b 20 6b 2b 2b  or(k=0; k<2; k++
1b190 29 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72  ){.    while( (r
1b1a0 63 20 3d 20 73 71 6c 69 74 65 33 5f 73 74 65 70  c = sqlite3_step
1b1b0 28 70 51 75 65 72 79 29 29 3d 3d 53 51 4c 49 54  (pQuery))==SQLIT
1b1c0 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 66  E_ROW ){.      f
1b1d0 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  or(i=0; i<n; i++
1b1e0 29 7b 0a 20 20 20 20 20 20 20 20 73 77 69 74 63  ){.        switc
1b1f0 68 28 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  h( sqlite3_colum
1b200 6e 5f 74 79 70 65 28 70 51 75 65 72 79 2c 20 69  n_type(pQuery, i
1b210 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63  ) ){.          c
1b220 61 73 65 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 3a  ase SQLITE_NULL:
1b230 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73   {.            s
1b240 71 6c 69 74 65 33 5f 62 69 6e 64 5f 6e 75 6c 6c  qlite3_bind_null
1b250 28 70 49 6e 73 65 72 74 2c 20 69 2b 31 29 3b 0a  (pInsert, i+1);.
1b260 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
1b270 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
1b280 20 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51           case SQ
1b290 4c 49 54 45 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  LITE_INTEGER: {.
1b2a0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
1b2b0 74 65 33 5f 62 69 6e 64 5f 69 6e 74 36 34 28 70  te3_bind_int64(p
1b2c0 49 6e 73 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c  Insert, i+1, sql
1b2d0 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e 74 36  ite3_column_int6
1b2e0 34 28 70 51 75 65 72 79 2c 69 29 29 3b 0a 20 20  4(pQuery,i));.  
1b2f0 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
1b300 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
1b310 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
1b320 54 45 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20  TE_FLOAT: {.    
1b330 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1b340 62 69 6e 64 5f 64 6f 75 62 6c 65 28 70 49 6e 73  bind_double(pIns
1b350 65 72 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65  ert, i+1, sqlite
1b360 33 5f 63 6f 6c 75 6d 6e 5f 64 6f 75 62 6c 65 28  3_column_double(
1b370 70 51 75 65 72 79 2c 69 29 29 3b 0a 20 20 20 20  pQuery,i));.    
1b380 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
1b390 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1b3a0 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45       case SQLITE
1b3b0 5f 54 45 58 54 3a 20 7b 0a 20 20 20 20 20 20 20  _TEXT: {.       
1b3c0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 62 69 6e       sqlite3_bin
1b3d0 64 5f 74 65 78 74 28 70 49 6e 73 65 72 74 2c 20  d_text(pInsert, 
1b3e0 69 2b 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  i+1,.           
1b3f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b400 20 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73    (const char*)s
1b410 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
1b420 78 74 28 70 51 75 65 72 79 2c 69 29 2c 0a 20 20  xt(pQuery,i),.  
1b430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b440 20 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 53             -1, S
1b450 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
1b460 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1b470 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1b480 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c          case SQL
1b490 49 54 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20  ITE_BLOB: {.    
1b4a0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f          sqlite3_
1b4b0 62 69 6e 64 5f 62 6c 6f 62 28 70 49 6e 73 65 72  bind_blob(pInser
1b4c0 74 2c 20 69 2b 31 2c 20 73 71 6c 69 74 65 33 5f  t, i+1, sqlite3_
1b4d0 63 6f 6c 75 6d 6e 5f 62 6c 6f 62 28 70 51 75 65  column_blob(pQue
1b4e0 72 79 2c 69 29 2c 0a 20 20 20 20 20 20 20 20 20  ry,i),.         
1b4f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b500 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b510 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d     sqlite3_colum
1b520 6e 5f 62 79 74 65 73 28 70 51 75 65 72 79 2c 69  n_bytes(pQuery,i
1b530 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
1b540 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
1b560 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a 20  QLITE_STATIC);. 
1b570 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
1b580 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
1b590 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20        }.      } 
1b5a0 2f 2a 20 45 6e 64 20 66 6f 72 20 2a 2f 0a 20 20  /* End for */.  
1b5b0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1b5c0 5f 73 74 65 70 28 70 49 6e 73 65 72 74 29 3b 0a  _step(pInsert);.
1b5d0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1b5e0 4c 49 54 45 5f 4f 4b 20 26 26 20 72 63 21 3d 53  LITE_OK && rc!=S
1b5f0 51 4c 49 54 45 5f 52 4f 57 20 26 26 20 72 63 21  QLITE_ROW && rc!
1b600 3d 53 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a  =SQLITE_DONE ){.
1b610 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
1b620 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
1b630 6f 72 20 25 64 3a 20 25 73 5c 6e 22 2c 20 73 71  or %d: %s\n", sq
1b640 6c 69 74 65 33 5f 65 78 74 65 6e 64 65 64 5f 65  lite3_extended_e
1b650 72 72 63 6f 64 65 28 6e 65 77 44 62 29 2c 0a 20  rrcode(newDb),. 
1b660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b670 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
1b680 72 72 6d 73 67 28 6e 65 77 44 62 29 29 3b 0a 20  rrmsg(newDb));. 
1b690 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
1b6a0 69 74 65 33 5f 72 65 73 65 74 28 70 49 6e 73 65  ite3_reset(pInse
1b6b0 72 74 29 3b 0a 20 20 20 20 20 20 63 6e 74 2b 2b  rt);.      cnt++
1b6c0 3b 0a 20 20 20 20 20 20 69 66 28 20 28 63 6e 74  ;.      if( (cnt
1b6d0 25 73 70 69 6e 52 61 74 65 29 3d 3d 30 20 29 7b  %spinRate)==0 ){
1b6e0 0a 20 20 20 20 20 20 20 20 70 72 69 6e 74 66 28  .        printf(
1b6f0 22 25 63 5c 62 22 2c 20 22 7c 2f 2d 5c 5c 22 5b  "%c\b", "|/-\\"[
1b700 28 63 6e 74 2f 73 70 69 6e 52 61 74 65 29 25 34  (cnt/spinRate)%4
1b710 5d 29 3b 0a 20 20 20 20 20 20 20 20 66 66 6c 75  ]);.        fflu
1b720 73 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20  sh(stdout);.    
1b730 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 45 6e 64    }.    } /* End
1b740 20 77 68 69 6c 65 20 2a 2f 0a 20 20 20 20 69 66   while */.    if
1b750 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 44 4f 4e  ( rc==SQLITE_DON
1b760 45 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 73  E ) break;.    s
1b770 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
1b780 70 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c  pQuery);.    sql
1b790 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79  ite3_free(zQuery
1b7a0 29 3b 0a 20 20 20 20 7a 51 75 65 72 79 20 3d 20  );.    zQuery = 
1b7b0 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
1b7c0 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 5c  "SELECT * FROM \
1b7d0 22 25 77 5c 22 20 4f 52 44 45 52 20 42 59 20 72  "%w\" ORDER BY r
1b7e0 6f 77 69 64 20 44 45 53 43 3b 22 2c 0a 20 20 20  owid DESC;",.   
1b7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b800 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 6c 65            zTable
1b810 29 3b 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69  );.    rc = sqli
1b820 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
1b830 2d 3e 64 62 2c 20 7a 51 75 65 72 79 2c 20 2d 31  ->db, zQuery, -1
1b840 2c 20 26 70 51 75 65 72 79 2c 20 30 29 3b 0a 20  , &pQuery, 0);. 
1b850 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20     if( rc ){.   
1b860 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73     utf8_printf(s
1b870 74 64 65 72 72 2c 20 22 57 61 72 6e 69 6e 67 3a  tderr, "Warning:
1b880 20 63 61 6e 6e 6f 74 20 73 74 65 70 20 5c 22 25   cannot step \"%
1b890 73 5c 22 20 62 61 63 6b 77 61 72 64 73 22 2c 20  s\" backwards", 
1b8a0 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 62  zTable);.      b
1b8b0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 20  reak;.    }.  } 
1b8c0 2f 2a 20 45 6e 64 20 66 6f 72 28 6b 3d 30 2e 2e  /* End for(k=0..
1b8d0 2e 29 20 2a 2f 0a 0a 65 6e 64 5f 64 61 74 61 5f  .) */..end_data_
1b8e0 78 66 65 72 3a 0a 20 20 73 71 6c 69 74 65 33 5f  xfer:.  sqlite3_
1b8f0 66 69 6e 61 6c 69 7a 65 28 70 51 75 65 72 79 29  finalize(pQuery)
1b900 3b 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  ;.  sqlite3_fina
1b910 6c 69 7a 65 28 70 49 6e 73 65 72 74 29 3b 0a 20  lize(pInsert);. 
1b920 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51   sqlite3_free(zQ
1b930 75 65 72 79 29 3b 0a 20 20 73 71 6c 69 74 65 33  uery);.  sqlite3
1b940 5f 66 72 65 65 28 7a 49 6e 73 65 72 74 29 3b 0a  _free(zInsert);.
1b950 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 72 79 20 74 6f  }.../*.** Try to
1b960 20 74 72 61 6e 73 66 65 72 20 61 6c 6c 20 72 6f   transfer all ro
1b970 77 73 20 6f 66 20 74 68 65 20 73 63 68 65 6d 61  ws of the schema
1b980 20 74 68 61 74 20 6d 61 74 63 68 20 7a 57 68 65   that match zWhe
1b990 72 65 2e 20 20 46 6f 72 0a 2a 2a 20 65 61 63 68  re.  For.** each
1b9a0 20 72 6f 77 2c 20 69 6e 76 6f 6b 65 20 78 46 6f   row, invoke xFo
1b9b0 72 45 61 63 68 28 29 20 6f 6e 20 74 68 65 20 6f  rEach() on the o
1b9c0 62 6a 65 63 74 20 64 65 66 69 6e 65 64 20 62 79  bject defined by
1b9d0 20 74 68 61 74 20 72 6f 77 2e 0a 2a 2a 20 49 66   that row..** If
1b9e0 20 61 6e 20 65 72 72 6f 72 20 69 73 20 65 6e 63   an error is enc
1b9f0 6f 75 6e 74 65 72 65 64 20 77 68 69 6c 65 20 6d  ountered while m
1ba00 6f 76 69 6e 67 20 66 6f 72 77 61 72 64 20 74 68  oving forward th
1ba10 72 6f 75 67 68 20 74 68 65 0a 2a 2a 20 73 71 6c  rough the.** sql
1ba20 69 74 65 5f 6d 61 73 74 65 72 20 74 61 62 6c 65  ite_master table
1ba30 2c 20 74 72 79 20 61 67 61 69 6e 20 6d 6f 76 69  , try again movi
1ba40 6e 67 20 62 61 63 6b 77 61 72 64 73 2e 0a 2a 2f  ng backwards..*/
1ba50 0a 73 74 61 74 69 63 20 76 6f 69 64 20 74 72 79  .static void try
1ba60 54 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 0a 20  ToCloneSchema(. 
1ba70 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 0a   ShellState *p,.
1ba80 20 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44 62    sqlite3 *newDb
1ba90 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
1baa0 7a 57 68 65 72 65 2c 0a 20 20 76 6f 69 64 20 28  zWhere,.  void (
1bab0 2a 78 46 6f 72 45 61 63 68 29 28 53 68 65 6c 6c  *xForEach)(Shell
1bac0 53 74 61 74 65 2a 2c 73 71 6c 69 74 65 33 2a 2c  State*,sqlite3*,
1bad0 63 6f 6e 73 74 20 63 68 61 72 2a 29 0a 29 7b 0a  const char*).){.
1bae0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1baf0 70 51 75 65 72 79 20 3d 20 30 3b 0a 20 20 63 68  pQuery = 0;.  ch
1bb00 61 72 20 2a 7a 51 75 65 72 79 20 3d 20 30 3b 0a  ar *zQuery = 0;.
1bb10 20 20 69 6e 74 20 72 63 3b 0a 20 20 63 6f 6e 73    int rc;.  cons
1bb20 74 20 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20  t unsigned char 
1bb30 2a 7a 4e 61 6d 65 3b 0a 20 20 63 6f 6e 73 74 20  *zName;.  const 
1bb40 75 6e 73 69 67 6e 65 64 20 63 68 61 72 20 2a 7a  unsigned char *z
1bb50 53 71 6c 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72  Sql;.  char *zEr
1bb60 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 7a 51 75  rMsg = 0;..  zQu
1bb70 65 72 79 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  ery = sqlite3_mp
1bb80 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20 6e 61  rintf("SELECT na
1bb90 6d 65 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c  me, sql FROM sql
1bba0 69 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20  ite_master".    
1bbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bbc0 20 20 20 20 20 20 20 22 20 57 48 45 52 45 20 25         " WHERE %
1bbd0 73 22 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 72  s", zWhere);.  r
1bbe0 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65 70  c = sqlite3_prep
1bbf0 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a 51  are_v2(p->db, zQ
1bc00 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65 72  uery, -1, &pQuer
1bc10 79 2c 20 30 29 3b 0a 20 20 69 66 28 20 72 63 20  y, 0);.  if( rc 
1bc20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  ){.    utf8_prin
1bc30 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
1bc40 72 3a 20 28 25 64 29 20 25 73 20 6f 6e 20 5b 25  r: (%d) %s on [%
1bc50 73 5d 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20  s]\n",.         
1bc60 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
1bc70 65 33 5f 65 78 74 65 6e 64 65 64 5f 65 72 72 63  e3_extended_errc
1bc80 6f 64 65 28 70 2d 3e 64 62 29 2c 20 73 71 6c 69  ode(p->db), sqli
1bc90 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
1bca0 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
1bcb0 20 20 20 20 20 20 20 7a 51 75 65 72 79 29 3b 0a         zQuery);.
1bcc0 20 20 20 20 67 6f 74 6f 20 65 6e 64 5f 73 63 68      goto end_sch
1bcd0 65 6d 61 5f 78 66 65 72 3b 0a 20 20 7d 0a 20 20  ema_xfer;.  }.  
1bce0 77 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c  while( (rc = sql
1bcf0 69 74 65 33 5f 73 74 65 70 28 70 51 75 65 72 79  ite3_step(pQuery
1bd00 29 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29  ))==SQLITE_ROW )
1bd10 7b 0a 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73 71  {.    zName = sq
1bd20 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
1bd30 74 28 70 51 75 65 72 79 2c 20 30 29 3b 0a 20 20  t(pQuery, 0);.  
1bd40 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
1bd50 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 51 75  _column_text(pQu
1bd60 65 72 79 2c 20 31 29 3b 0a 20 20 20 20 70 72 69  ery, 1);.    pri
1bd70 6e 74 66 28 22 25 73 2e 2e 2e 20 22 2c 20 7a 4e  ntf("%s... ", zN
1bd80 61 6d 65 29 3b 20 66 66 6c 75 73 68 28 73 74 64  ame); fflush(std
1bd90 6f 75 74 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  out);.    sqlite
1bda0 33 5f 65 78 65 63 28 6e 65 77 44 62 2c 20 28 63  3_exec(newDb, (c
1bdb0 6f 6e 73 74 20 63 68 61 72 2a 29 7a 53 71 6c 2c  onst char*)zSql,
1bdc0 20 30 2c 20 30 2c 20 26 7a 45 72 72 4d 73 67 29   0, 0, &zErrMsg)
1bdd0 3b 0a 20 20 20 20 69 66 28 20 7a 45 72 72 4d 73  ;.    if( zErrMs
1bde0 67 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  g ){.      utf8_
1bdf0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1be00 45 72 72 6f 72 3a 20 25 73 5c 6e 53 51 4c 3a 20  Error: %s\nSQL: 
1be10 5b 25 73 5d 5c 6e 22 2c 20 7a 45 72 72 4d 73 67  [%s]\n", zErrMsg
1be20 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 73  , zSql);.      s
1be30 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72  qlite3_free(zErr
1be40 4d 73 67 29 3b 0a 20 20 20 20 20 20 7a 45 72 72  Msg);.      zErr
1be50 4d 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Msg = 0;.    }. 
1be60 20 20 20 69 66 28 20 78 46 6f 72 45 61 63 68 20     if( xForEach 
1be70 29 7b 0a 20 20 20 20 20 20 78 46 6f 72 45 61 63  ){.      xForEac
1be80 68 28 70 2c 20 6e 65 77 44 62 2c 20 28 63 6f 6e  h(p, newDb, (con
1be90 73 74 20 63 68 61 72 2a 29 7a 4e 61 6d 65 29 3b  st char*)zName);
1bea0 0a 20 20 20 20 7d 0a 20 20 20 20 70 72 69 6e 74  .    }.    print
1beb0 66 28 22 64 6f 6e 65 5c 6e 22 29 3b 0a 20 20 7d  f("done\n");.  }
1bec0 0a 20 20 69 66 28 20 72 63 21 3d 53 51 4c 49 54  .  if( rc!=SQLIT
1bed0 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20 73 71  E_DONE ){.    sq
1bee0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
1bef0 51 75 65 72 79 29 3b 0a 20 20 20 20 73 71 6c 69  Query);.    sqli
1bf00 74 65 33 5f 66 72 65 65 28 7a 51 75 65 72 79 29  te3_free(zQuery)
1bf10 3b 0a 20 20 20 20 7a 51 75 65 72 79 20 3d 20 73  ;.    zQuery = s
1bf20 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1bf30 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 73 71 6c  SELECT name, sql
1bf40 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
1bf50 74 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20  ter".           
1bf60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bf70 20 20 22 20 57 48 45 52 45 20 25 73 20 4f 52 44    " WHERE %s ORD
1bf80 45 52 20 42 59 20 72 6f 77 69 64 20 44 45 53 43  ER BY rowid DESC
1bf90 22 2c 20 7a 57 68 65 72 65 29 3b 0a 20 20 20 20  ", zWhere);.    
1bfa0 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70 72 65  rc = sqlite3_pre
1bfb0 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 20 7a  pare_v2(p->db, z
1bfc0 51 75 65 72 79 2c 20 2d 31 2c 20 26 70 51 75 65  Query, -1, &pQue
1bfd0 72 79 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20  ry, 0);.    if( 
1bfe0 72 63 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38  rc ){.      utf8
1bff0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
1c000 22 45 72 72 6f 72 3a 20 28 25 64 29 20 25 73 20  "Error: (%d) %s 
1c010 6f 6e 20 5b 25 73 5d 5c 6e 22 2c 0a 20 20 20 20  on [%s]\n",.    
1c020 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c030 20 20 73 71 6c 69 74 65 33 5f 65 78 74 65 6e 64    sqlite3_extend
1c040 65 64 5f 65 72 72 63 6f 64 65 28 70 2d 3e 64 62  ed_errcode(p->db
1c050 29 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73  ), sqlite3_errms
1c060 67 28 70 2d 3e 64 62 29 2c 0a 20 20 20 20 20 20  g(p->db),.      
1c070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c080 7a 51 75 65 72 79 29 3b 0a 20 20 20 20 20 20 67  zQuery);.      g
1c090 6f 74 6f 20 65 6e 64 5f 73 63 68 65 6d 61 5f 78  oto end_schema_x
1c0a0 66 65 72 3b 0a 20 20 20 20 7d 0a 20 20 20 20 77  fer;.    }.    w
1c0b0 68 69 6c 65 28 20 28 72 63 20 3d 20 73 71 6c 69  hile( (rc = sqli
1c0c0 74 65 33 5f 73 74 65 70 28 70 51 75 65 72 79 29  te3_step(pQuery)
1c0d0 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 20 29 7b  )==SQLITE_ROW ){
1c0e0 0a 20 20 20 20 20 20 7a 4e 61 6d 65 20 3d 20 73  .      zName = s
1c0f0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
1c100 78 74 28 70 51 75 65 72 79 2c 20 30 29 3b 0a 20  xt(pQuery, 0);. 
1c110 20 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69       zSql = sqli
1c120 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28  te3_column_text(
1c130 70 51 75 65 72 79 2c 20 31 29 3b 0a 20 20 20 20  pQuery, 1);.    
1c140 20 20 70 72 69 6e 74 66 28 22 25 73 2e 2e 2e 20    printf("%s... 
1c150 22 2c 20 7a 4e 61 6d 65 29 3b 20 66 66 6c 75 73  ", zName); fflus
1c160 68 28 73 74 64 6f 75 74 29 3b 0a 20 20 20 20 20  h(stdout);.     
1c170 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65   sqlite3_exec(ne
1c180 77 44 62 2c 20 28 63 6f 6e 73 74 20 63 68 61 72  wDb, (const char
1c190 2a 29 7a 53 71 6c 2c 20 30 2c 20 30 2c 20 26 7a  *)zSql, 0, 0, &z
1c1a0 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 69  ErrMsg);.      i
1c1b0 66 28 20 7a 45 72 72 4d 73 67 20 29 7b 0a 20 20  f( zErrMsg ){.  
1c1c0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
1c1d0 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
1c1e0 3a 20 25 73 5c 6e 53 51 4c 3a 20 5b 25 73 5d 5c  : %s\nSQL: [%s]\
1c1f0 6e 22 2c 20 7a 45 72 72 4d 73 67 2c 20 7a 53 71  n", zErrMsg, zSq
1c200 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
1c210 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d 73 67  te3_free(zErrMsg
1c220 29 3b 0a 20 20 20 20 20 20 20 20 7a 45 72 72 4d  );.        zErrM
1c230 73 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a  sg = 0;.      }.
1c240 20 20 20 20 20 20 69 66 28 20 78 46 6f 72 45 61        if( xForEa
1c250 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 78 46  ch ){.        xF
1c260 6f 72 45 61 63 68 28 70 2c 20 6e 65 77 44 62 2c  orEach(p, newDb,
1c270 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 7a 4e   (const char*)zN
1c280 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
1c290 20 20 20 20 70 72 69 6e 74 66 28 22 64 6f 6e 65      printf("done
1c2a0 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  \n");.    }.  }.
1c2b0 65 6e 64 5f 73 63 68 65 6d 61 5f 78 66 65 72 3a  end_schema_xfer:
1c2c0 0a 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c  .  sqlite3_final
1c2d0 69 7a 65 28 70 51 75 65 72 79 29 3b 0a 20 20 73  ize(pQuery);.  s
1c2e0 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 51 75 65  qlite3_free(zQue
1c2f0 72 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 70  ry);.}../*.** Op
1c300 65 6e 20 61 20 6e 65 77 20 64 61 74 61 62 61 73  en a new databas
1c310 65 20 66 69 6c 65 20 6e 61 6d 65 64 20 22 7a 4e  e file named "zN
1c320 65 77 44 62 22 2e 20 20 54 72 79 20 74 6f 20 72  ewDb".  Try to r
1c330 65 63 6f 76 65 72 20 61 73 20 6d 75 63 68 20 69  ecover as much i
1c340 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 61 73  nformation.** as
1c350 20 70 6f 73 73 69 62 6c 65 20 6f 75 74 20 6f 66   possible out of
1c360 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
1c370 73 65 20 28 77 68 69 63 68 20 6d 69 67 68 74 20  se (which might 
1c380 62 65 20 63 6f 72 72 75 70 74 29 20 61 6e 64 20  be corrupt) and 
1c390 77 72 69 74 65 20 69 74 0a 2a 2a 20 69 6e 74 6f  write it.** into
1c3a0 20 7a 4e 65 77 44 62 2e 0a 2a 2f 0a 73 74 61 74   zNewDb..*/.stat
1c3b0 69 63 20 76 6f 69 64 20 74 72 79 54 6f 43 6c 6f  ic void tryToClo
1c3c0 6e 65 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  ne(ShellState *p
1c3d0 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e  , const char *zN
1c3e0 65 77 44 62 29 7b 0a 20 20 69 6e 74 20 72 63 3b  ewDb){.  int rc;
1c3f0 0a 20 20 73 71 6c 69 74 65 33 20 2a 6e 65 77 44  .  sqlite3 *newD
1c400 62 20 3d 20 30 3b 0a 20 20 69 66 28 20 61 63 63  b = 0;.  if( acc
1c410 65 73 73 28 7a 4e 65 77 44 62 2c 30 29 3d 3d 30  ess(zNewDb,0)==0
1c420 20 29 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69   ){.    utf8_pri
1c430 6e 74 66 28 73 74 64 65 72 72 2c 20 22 46 69 6c  ntf(stderr, "Fil
1c440 65 20 5c 22 25 73 5c 22 20 61 6c 72 65 61 64 79  e \"%s\" already
1c450 20 65 78 69 73 74 73 2e 5c 6e 22 2c 20 7a 4e 65   exists.\n", zNe
1c460 77 44 62 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  wDb);.    return
1c470 3b 0a 20 20 7d 0a 20 20 72 63 20 3d 20 73 71 6c  ;.  }.  rc = sql
1c480 69 74 65 33 5f 6f 70 65 6e 28 7a 4e 65 77 44 62  ite3_open(zNewDb
1c490 2c 20 26 6e 65 77 44 62 29 3b 0a 20 20 69 66 28  , &newDb);.  if(
1c4a0 20 72 63 20 29 7b 0a 20 20 20 20 75 74 66 38 5f   rc ){.    utf8_
1c4b0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
1c4c0 43 61 6e 6e 6f 74 20 63 72 65 61 74 65 20 6f 75  Cannot create ou
1c4d0 74 70 75 74 20 64 61 74 61 62 61 73 65 3a 20 25  tput database: %
1c4e0 73 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s\n",.          
1c4f0 20 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67    sqlite3_errmsg
1c500 28 6e 65 77 44 62 29 29 3b 0a 20 20 7d 65 6c 73  (newDb));.  }els
1c510 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65  e{.    sqlite3_e
1c520 78 65 63 28 70 2d 3e 64 62 2c 20 22 50 52 41 47  xec(p->db, "PRAG
1c530 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65  MA writable_sche
1c540 6d 61 3d 4f 4e 3b 22 2c 20 30 2c 20 30 2c 20 30  ma=ON;", 0, 0, 0
1c550 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65  );.    sqlite3_e
1c560 78 65 63 28 6e 65 77 44 62 2c 20 22 42 45 47 49  xec(newDb, "BEGI
1c570 4e 20 45 58 43 4c 55 53 49 56 45 3b 22 2c 20 30  N EXCLUSIVE;", 0
1c580 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 74 72 79  , 0, 0);.    try
1c590 54 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 70 2c  ToCloneSchema(p,
1c5a0 20 6e 65 77 44 62 2c 20 22 74 79 70 65 3d 27 74   newDb, "type='t
1c5b0 61 62 6c 65 27 22 2c 20 74 72 79 54 6f 43 6c 6f  able'", tryToClo
1c5c0 6e 65 44 61 74 61 29 3b 0a 20 20 20 20 74 72 79  neData);.    try
1c5d0 54 6f 43 6c 6f 6e 65 53 63 68 65 6d 61 28 70 2c  ToCloneSchema(p,
1c5e0 20 6e 65 77 44 62 2c 20 22 74 79 70 65 21 3d 27   newDb, "type!='
1c5f0 74 61 62 6c 65 27 22 2c 20 30 29 3b 0a 20 20 20  table'", 0);.   
1c600 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 6e 65   sqlite3_exec(ne
1c610 77 44 62 2c 20 22 43 4f 4d 4d 49 54 3b 22 2c 20  wDb, "COMMIT;", 
1c620 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71  0, 0, 0);.    sq
1c630 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62  lite3_exec(p->db
1c640 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62  , "PRAGMA writab
1c650 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 22 2c  le_schema=OFF;",
1c660 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 20   0, 0, 0);.  }. 
1c670 20 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 6e   sqlite3_close(n
1c680 65 77 44 62 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ewDb);.}../*.** 
1c690 43 68 61 6e 67 65 20 74 68 65 20 6f 75 74 70 75  Change the outpu
1c6a0 74 20 66 69 6c 65 20 62 61 63 6b 20 74 6f 20 73  t file back to s
1c6b0 74 64 6f 75 74 0a 2a 2f 0a 73 74 61 74 69 63 20  tdout.*/.static 
1c6c0 76 6f 69 64 20 6f 75 74 70 75 74 5f 72 65 73 65  void output_rese
1c6d0 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 29  t(ShellState *p)
1c6e0 7b 0a 20 20 69 66 28 20 70 2d 3e 6f 75 74 66 69  {.  if( p->outfi
1c6f0 6c 65 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69  le[0]=='|' ){.#i
1c700 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
1c710 54 5f 50 4f 50 45 4e 0a 20 20 20 20 70 63 6c 6f  T_POPEN.    pclo
1c720 73 65 28 70 2d 3e 6f 75 74 29 3b 0a 23 65 6e 64  se(p->out);.#end
1c730 69 66 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  if.  }else{.    
1c740 6f 75 74 70 75 74 5f 66 69 6c 65 5f 63 6c 6f 73  output_file_clos
1c750 65 28 70 2d 3e 6f 75 74 29 3b 0a 20 20 7d 0a 20  e(p->out);.  }. 
1c760 20 70 2d 3e 6f 75 74 66 69 6c 65 5b 30 5d 20 3d   p->outfile[0] =
1c770 20 30 3b 0a 20 20 70 2d 3e 6f 75 74 20 3d 20 73   0;.  p->out = s
1c780 74 64 6f 75 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  tdout;.}../*.** 
1c790 52 75 6e 20 61 6e 20 53 51 4c 20 63 6f 6d 6d 61  Run an SQL comma
1c7a0 6e 64 20 61 6e 64 20 72 65 74 75 72 6e 20 74 68  nd and return th
1c7b0 65 20 73 69 6e 67 6c 65 20 69 6e 74 65 67 65 72  e single integer
1c7c0 20 72 65 73 75 6c 74 2e 0a 2a 2f 0a 73 74 61 74   result..*/.stat
1c7d0 69 63 20 69 6e 74 20 64 62 5f 69 6e 74 28 53 68  ic int db_int(Sh
1c7e0 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 63 6f 6e  ellState *p, con
1c7f0 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 29 7b 0a  st char *zSql){.
1c800 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1c810 70 53 74 6d 74 3b 0a 20 20 69 6e 74 20 72 65 73  pStmt;.  int res
1c820 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 5f   = 0;.  sqlite3_
1c830 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
1c840 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74  , zSql, -1, &pSt
1c850 6d 74 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 53  mt, 0);.  if( pS
1c860 74 6d 74 20 26 26 20 73 71 6c 69 74 65 33 5f 73  tmt && sqlite3_s
1c870 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
1c880 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 72 65  TE_ROW ){.    re
1c890 73 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75  s = sqlite3_colu
1c8a0 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 30 29 3b  mn_int(pStmt,0);
1c8b0 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66  .  }.  sqlite3_f
1c8c0 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
1c8d0 20 20 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a    return res;.}.
1c8e0 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
1c8f0 20 32 2d 62 79 74 65 20 6f 72 20 34 2d 62 79 74   2-byte or 4-byt
1c900 65 20 62 69 67 2d 65 6e 64 69 61 6e 20 69 6e 74  e big-endian int
1c910 65 67 65 72 20 69 6e 74 6f 20 61 20 6e 61 74 69  eger into a nati
1c920 76 65 20 69 6e 74 65 67 65 72 0a 2a 2f 0a 73 74  ve integer.*/.st
1c930 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e  atic unsigned in
1c940 74 20 67 65 74 32 62 79 74 65 49 6e 74 28 75 6e  t get2byteInt(un
1c950 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 29 7b  signed char *a){
1c960 0a 20 20 72 65 74 75 72 6e 20 28 61 5b 30 5d 3c  .  return (a[0]<
1c970 3c 38 29 20 2b 20 61 5b 31 5d 3b 0a 7d 0a 73 74  <8) + a[1];.}.st
1c980 61 74 69 63 20 75 6e 73 69 67 6e 65 64 20 69 6e  atic unsigned in
1c990 74 20 67 65 74 34 62 79 74 65 49 6e 74 28 75 6e  t get4byteInt(un
1c9a0 73 69 67 6e 65 64 20 63 68 61 72 20 2a 61 29 7b  signed char *a){
1c9b0 0a 20 20 72 65 74 75 72 6e 20 28 61 5b 30 5d 3c  .  return (a[0]<
1c9c0 3c 32 34 29 20 2b 20 28 61 5b 31 5d 3c 3c 31 36  <24) + (a[1]<<16
1c9d0 29 20 2b 20 28 61 5b 32 5d 3c 3c 38 29 20 2b 20  ) + (a[2]<<8) + 
1c9e0 61 5b 33 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  a[3];.}../*.** I
1c9f0 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66  mplementation of
1ca00 20 74 68 65 20 22 2e 69 6e 66 6f 22 20 63 6f 6d   the ".info" com
1ca10 6d 61 6e 64 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  mand..**.** Retu
1ca20 72 6e 20 31 20 6f 6e 20 65 72 72 6f 72 2c 20 32  rn 1 on error, 2
1ca30 20 74 6f 20 65 78 69 74 2c 20 61 6e 64 20 30 20   to exit, and 0 
1ca40 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a 73 74  otherwise..*/.st
1ca50 61 74 69 63 20 69 6e 74 20 73 68 65 6c 6c 5f 64  atic int shell_d
1ca60 62 69 6e 66 6f 5f 63 6f 6d 6d 61 6e 64 28 53 68  binfo_command(Sh
1ca70 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20 69 6e 74  ellState *p, int
1ca80 20 6e 41 72 67 2c 20 63 68 61 72 20 2a 2a 61 7a   nArg, char **az
1ca90 41 72 67 29 7b 0a 20 20 73 74 61 74 69 63 20 63  Arg){.  static c
1caa0 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 20 63 6f  onst struct { co
1cab0 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b  nst char *zName;
1cac0 20 69 6e 74 20 6f 66 73 74 3b 20 7d 20 61 46 69   int ofst; } aFi
1cad0 65 6c 64 5b 5d 20 3d 20 7b 0a 20 20 20 20 20 7b  eld[] = {.     {
1cae0 20 22 66 69 6c 65 20 63 68 61 6e 67 65 20 63 6f   "file change co
1caf0 75 6e 74 65 72 3a 22 2c 20 20 32 34 20 20 7d 2c  unter:",  24  },
1cb00 0a 20 20 20 20 20 7b 20 22 64 61 74 61 62 61 73  .     { "databas
1cb10 65 20 70 61 67 65 20 63 6f 75 6e 74 3a 22 2c 20  e page count:", 
1cb20 20 32 38 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22   28  },.     { "
1cb30 66 72 65 65 6c 69 73 74 20 70 61 67 65 20 63 6f  freelist page co
1cb40 75 6e 74 3a 22 2c 20 20 33 36 20 20 7d 2c 0a 20  unt:",  36  },. 
1cb50 20 20 20 20 7b 20 22 73 63 68 65 6d 61 20 63 6f      { "schema co
1cb60 6f 6b 69 65 3a 22 2c 20 20 20 20 20 20 20 20 34  okie:",        4
1cb70 30 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 63  0  },.     { "sc
1cb80 68 65 6d 61 20 66 6f 72 6d 61 74 3a 22 2c 20 20  hema format:",  
1cb90 20 20 20 20 20 20 34 34 20 20 7d 2c 0a 20 20 20        44  },.   
1cba0 20 20 7b 20 22 64 65 66 61 75 6c 74 20 63 61 63    { "default cac
1cbb0 68 65 20 73 69 7a 65 3a 22 2c 20 20 20 34 38 20  he size:",   48 
1cbc0 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 75 74 6f   },.     { "auto
1cbd0 76 61 63 75 75 6d 20 74 6f 70 20 72 6f 6f 74 3a  vacuum top root:
1cbe0 22 2c 20 20 35 32 20 20 7d 2c 0a 20 20 20 20 20  ",  52  },.     
1cbf0 7b 20 22 69 6e 63 72 65 6d 65 6e 74 61 6c 20 76  { "incremental v
1cc00 61 63 75 75 6d 3a 22 2c 20 20 20 36 34 20 20 7d  acuum:",   64  }
1cc10 2c 0a 20 20 20 20 20 7b 20 22 74 65 78 74 20 65  ,.     { "text e
1cc20 6e 63 6f 64 69 6e 67 3a 22 2c 20 20 20 20 20 20  ncoding:",      
1cc30 20 20 35 36 20 20 7d 2c 0a 20 20 20 20 20 7b 20    56  },.     { 
1cc40 22 75 73 65 72 20 76 65 72 73 69 6f 6e 3a 22 2c  "user version:",
1cc50 20 20 20 20 20 20 20 20 20 36 30 20 20 7d 2c 0a           60  },.
1cc60 20 20 20 20 20 7b 20 22 61 70 70 6c 69 63 61 74       { "applicat
1cc70 69 6f 6e 20 69 64 3a 22 2c 20 20 20 20 20 20 20  ion id:",       
1cc80 36 38 20 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73  68  },.     { "s
1cc90 6f 66 74 77 61 72 65 20 76 65 72 73 69 6f 6e 3a  oftware version:
1cca0 22 2c 20 20 20 20 20 39 36 20 20 7d 2c 0a 20 20  ",     96  },.  
1ccb0 7d 3b 0a 20 20 73 74 61 74 69 63 20 63 6f 6e 73  };.  static cons
1ccc0 74 20 73 74 72 75 63 74 20 7b 20 63 6f 6e 73 74  t struct { const
1ccd0 20 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 20 63 6f   char *zName; co
1cce0 6e 73 74 20 63 68 61 72 20 2a 7a 53 71 6c 3b 20  nst char *zSql; 
1ccf0 7d 20 61 51 75 65 72 79 5b 5d 20 3d 20 7b 0a 20  } aQuery[] = {. 
1cd00 20 20 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66      { "number of
1cd10 20 74 61 62 6c 65 73 3a 22 2c 0a 20 20 20 20 20   tables:",.     
1cd20 20 20 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28    "SELECT count(
1cd30 2a 29 20 46 52 4f 4d 20 25 73 20 57 48 45 52 45  *) FROM %s WHERE
1cd40 20 74 79 70 65 3d 27 74 61 62 6c 65 27 22 20 7d   type='table'" }
1cd50 2c 0a 20 20 20 20 20 7b 20 22 6e 75 6d 62 65 72  ,.     { "number
1cd60 20 6f 66 20 69 6e 64 65 78 65 73 3a 22 2c 0a 20   of indexes:",. 
1cd70 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 63 6f        "SELECT co
1cd80 75 6e 74 28 2a 29 20 46 52 4f 4d 20 25 73 20 57  unt(*) FROM %s W
1cd90 48 45 52 45 20 74 79 70 65 3d 27 69 6e 64 65 78  HERE type='index
1cda0 27 22 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6e 75  '" },.     { "nu
1cdb0 6d 62 65 72 20 6f 66 20 74 72 69 67 67 65 72 73  mber of triggers
1cdc0 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c 45  :",.       "SELE
1cdd0 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f 4d  CT count(*) FROM
1cde0 20 25 73 20 57 48 45 52 45 20 74 79 70 65 3d 27   %s WHERE type='
1cdf0 74 72 69 67 67 65 72 27 22 20 7d 2c 0a 20 20 20  trigger'" },.   
1ce00 20 20 7b 20 22 6e 75 6d 62 65 72 20 6f 66 20 76    { "number of v
1ce10 69 65 77 73 3a 22 2c 0a 20 20 20 20 20 20 20 22  iews:",.       "
1ce20 53 45 4c 45 43 54 20 63 6f 75 6e 74 28 2a 29 20  SELECT count(*) 
1ce30 46 52 4f 4d 20 25 73 20 57 48 45 52 45 20 74 79  FROM %s WHERE ty
1ce40 70 65 3d 27 76 69 65 77 27 22 20 7d 2c 0a 20 20  pe='view'" },.  
1ce50 20 20 20 7b 20 22 73 63 68 65 6d 61 20 73 69 7a     { "schema siz
1ce60 65 3a 22 2c 0a 20 20 20 20 20 20 20 22 53 45 4c  e:",.       "SEL
1ce70 45 43 54 20 74 6f 74 61 6c 28 6c 65 6e 67 74 68  ECT total(length
1ce80 28 73 71 6c 29 29 20 46 52 4f 4d 20 25 73 22 20  (sql)) FROM %s" 
1ce90 7d 2c 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b  },.  };.  int i;
1cea0 0a 20 20 63 68 61 72 20 2a 7a 53 63 68 65 6d 61  .  char *zSchema
1ceb0 54 61 62 3b 0a 20 20 63 68 61 72 20 2a 7a 44 62  Tab;.  char *zDb
1cec0 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a 41   = nArg>=2 ? azA
1ced0 72 67 5b 31 5d 20 3a 20 22 6d 61 69 6e 22 3b 0a  rg[1] : "main";.
1cee0 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1cef0 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20 75 6e 73  pStmt = 0;.  uns
1cf00 69 67 6e 65 64 20 63 68 61 72 20 61 48 64 72 5b  igned char aHdr[
1cf10 31 30 30 5d 3b 0a 20 20 6f 70 65 6e 5f 64 62 28  100];.  open_db(
1cf20 70 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 2d 3e  p, 0);.  if( p->
1cf30 64 62 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  db==0 ) return 1
1cf40 3b 0a 20 20 73 71 6c 69 74 65 33 5f 70 72 65 70  ;.  sqlite3_prep
1cf50 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c 22 53 45  are_v2(p->db,"SE
1cf60 4c 45 43 54 20 64 61 74 61 20 46 52 4f 4d 20 73  LECT data FROM s
1cf70 71 6c 69 74 65 5f 64 62 70 61 67 65 28 3f 31 29  qlite_dbpage(?1)
1cf80 20 57 48 45 52 45 20 70 67 6e 6f 3d 31 22 2c 0a   WHERE pgno=1",.
1cf90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cfa0 20 20 20 20 20 2d 31 2c 20 26 70 53 74 6d 74 2c       -1, &pStmt,
1cfb0 20 30 29 3b 0a 20 20 73 71 6c 69 74 65 33 5f 62   0);.  sqlite3_b
1cfc0 69 6e 64 5f 74 65 78 74 28 70 53 74 6d 74 2c 20  ind_text(pStmt, 
1cfd0 31 2c 20 7a 44 62 2c 20 2d 31 2c 20 53 51 4c 49  1, zDb, -1, SQLI
1cfe0 54 45 5f 53 54 41 54 49 43 29 3b 0a 20 20 69 66  TE_STATIC);.  if
1cff0 28 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ( sqlite3_step(p
1d000 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f  Stmt)==SQLITE_RO
1d010 57 0a 20 20 20 26 26 20 73 71 6c 69 74 65 33 5f  W.   && sqlite3_
1d020 63 6f 6c 75 6d 6e 5f 62 79 74 65 73 28 70 53 74  column_bytes(pSt
1d030 6d 74 2c 30 29 3e 31 30 30 0a 20 20 29 7b 0a 20  mt,0)>100.  ){. 
1d040 20 20 20 6d 65 6d 63 70 79 28 61 48 64 72 2c 20     memcpy(aHdr, 
1d050 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 62  sqlite3_column_b
1d060 6c 6f 62 28 70 53 74 6d 74 2c 30 29 2c 20 31 30  lob(pStmt,0), 10
1d070 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  0);.    sqlite3_
1d080 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b  finalize(pStmt);
1d090 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 61  .  }else{.    ra
1d0a0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
1d0b0 20 22 75 6e 61 62 6c 65 20 74 6f 20 72 65 61 64   "unable to read
1d0c0 20 64 61 74 61 62 61 73 65 20 68 65 61 64 65 72   database header
1d0d0 5c 6e 22 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  \n");.    sqlite
1d0e0 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74  3_finalize(pStmt
1d0f0 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  );.    return 1;
1d100 0a 20 20 7d 0a 20 20 69 20 3d 20 67 65 74 32 62  .  }.  i = get2b
1d110 79 74 65 49 6e 74 28 61 48 64 72 2b 31 36 29 3b  yteInt(aHdr+16);
1d120 0a 20 20 69 66 28 20 69 3d 3d 31 20 29 20 69 20  .  if( i==1 ) i 
1d130 3d 20 36 35 35 33 36 3b 0a 20 20 75 74 66 38 5f  = 65536;.  utf8_
1d140 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
1d150 25 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22 64 61  %-20s %d\n", "da
1d160 74 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65  tabase page size
1d170 3a 22 2c 20 69 29 3b 0a 20 20 75 74 66 38 5f 70  :", i);.  utf8_p
1d180 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
1d190 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22 77 72 69  -20s %d\n", "wri
1d1a0 74 65 20 66 6f 72 6d 61 74 3a 22 2c 20 61 48 64  te format:", aHd
1d1b0 72 5b 31 38 5d 29 3b 0a 20 20 75 74 66 38 5f 70  r[18]);.  utf8_p
1d1c0 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
1d1d0 2d 32 30 73 20 25 64 5c 6e 22 2c 20 22 72 65 61  -20s %d\n", "rea
1d1e0 64 20 66 6f 72 6d 61 74 3a 22 2c 20 61 48 64 72  d format:", aHdr
1d1f0 5b 31 39 5d 29 3b 0a 20 20 75 74 66 38 5f 70 72  [19]);.  utf8_pr
1d200 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d  intf(p->out, "%-
1d210 32 30 73 20 25 64 5c 6e 22 2c 20 22 72 65 73 65  20s %d\n", "rese
1d220 72 76 65 64 20 62 79 74 65 73 3a 22 2c 20 61 48  rved bytes:", aH
1d230 64 72 5b 32 30 5d 29 3b 0a 20 20 66 6f 72 28 69  dr[20]);.  for(i
1d240 3d 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28  =0; i<ArraySize(
1d250 61 46 69 65 6c 64 29 3b 20 69 2b 2b 29 7b 0a 20  aField); i++){. 
1d260 20 20 20 69 6e 74 20 6f 66 73 74 20 3d 20 61 46     int ofst = aF
1d270 69 65 6c 64 5b 69 5d 2e 6f 66 73 74 3b 0a 20 20  ield[i].ofst;.  
1d280 20 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 76    unsigned int v
1d290 61 6c 20 3d 20 67 65 74 34 62 79 74 65 49 6e 74  al = get4byteInt
1d2a0 28 61 48 64 72 20 2b 20 6f 66 73 74 29 3b 0a 20  (aHdr + ofst);. 
1d2b0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
1d2c0 2d 3e 6f 75 74 2c 20 22 25 2d 32 30 73 20 25 75  ->out, "%-20s %u
1d2d0 22 2c 20 61 46 69 65 6c 64 5b 69 5d 2e 7a 4e 61  ", aField[i].zNa
1d2e0 6d 65 2c 20 76 61 6c 29 3b 0a 20 20 20 20 73 77  me, val);.    sw
1d2f0 69 74 63 68 28 20 6f 66 73 74 20 29 7b 0a 20 20  itch( ofst ){.  
1d300 20 20 20 20 63 61 73 65 20 35 36 3a 20 7b 0a 20      case 56: {. 
1d310 20 20 20 20 20 20 20 69 66 28 20 76 61 6c 3d 3d         if( val==
1d320 31 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70  1 ) raw_printf(p
1d330 2d 3e 6f 75 74 2c 20 22 20 28 75 74 66 38 29 22  ->out, " (utf8)"
1d340 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 76  );.        if( v
1d350 61 6c 3d 3d 32 20 29 20 72 61 77 5f 70 72 69 6e  al==2 ) raw_prin
1d360 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 28 75 74  tf(p->out, " (ut
1d370 66 31 36 6c 65 29 22 29 3b 0a 20 20 20 20 20 20  f16le)");.      
1d380 20 20 69 66 28 20 76 61 6c 3d 3d 33 20 29 20 72    if( val==3 ) r
1d390 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
1d3a0 2c 20 22 20 28 75 74 66 31 36 62 65 29 22 29 3b  , " (utf16be)");
1d3b0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
1d3c0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d     raw_printf(p-
1d3d0 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d  >out, "\n");.  }
1d3e0 0a 20 20 69 66 28 20 7a 44 62 3d 3d 30 20 29 7b  .  if( zDb==0 ){
1d3f0 0a 20 20 20 20 7a 53 63 68 65 6d 61 54 61 62 20  .    zSchemaTab 
1d400 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1d410 66 28 22 6d 61 69 6e 2e 73 71 6c 69 74 65 5f 6d  f("main.sqlite_m
1d420 61 73 74 65 72 22 29 3b 0a 20 20 7d 65 6c 73 65  aster");.  }else
1d430 20 69 66 28 20 73 74 72 63 6d 70 28 7a 44 62 2c   if( strcmp(zDb,
1d440 22 74 65 6d 70 22 29 3d 3d 30 20 29 7b 0a 20 20  "temp")==0 ){.  
1d450 20 20 7a 53 63 68 65 6d 61 54 61 62 20 3d 20 73    zSchemaTab = s
1d460 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
1d470 25 73 22 2c 20 22 73 71 6c 69 74 65 5f 74 65 6d  %s", "sqlite_tem
1d480 70 5f 6d 61 73 74 65 72 22 29 3b 0a 20 20 7d 65  p_master");.  }e
1d490 6c 73 65 7b 0a 20 20 20 20 7a 53 63 68 65 6d 61  lse{.    zSchema
1d4a0 54 61 62 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70  Tab = sqlite3_mp
1d4b0 72 69 6e 74 66 28 22 5c 22 25 77 5c 22 2e 73 71  rintf("\"%w\".sq
1d4c0 6c 69 74 65 5f 6d 61 73 74 65 72 22 2c 20 7a 44  lite_master", zD
1d4d0 62 29 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  b);.  }.  for(i=
1d4e0 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
1d4f0 51 75 65 72 79 29 3b 20 69 2b 2b 29 7b 0a 20 20  Query); i++){.  
1d500 20 20 63 68 61 72 20 2a 7a 53 71 6c 20 3d 20 73    char *zSql = s
1d510 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 61  qlite3_mprintf(a
1d520 51 75 65 72 79 5b 69 5d 2e 7a 53 71 6c 2c 20 7a  Query[i].zSql, z
1d530 53 63 68 65 6d 61 54 61 62 29 3b 0a 20 20 20 20  SchemaTab);.    
1d540 69 6e 74 20 76 61 6c 20 3d 20 64 62 5f 69 6e 74  int val = db_int
1d550 28 70 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 73  (p, zSql);.    s
1d560 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
1d570 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e  );.    utf8_prin
1d580 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 2d 32 30  tf(p->out, "%-20
1d590 73 20 25 64 5c 6e 22 2c 20 61 51 75 65 72 79 5b  s %d\n", aQuery[
1d5a0 69 5d 2e 7a 4e 61 6d 65 2c 20 76 61 6c 29 3b 0a  i].zName, val);.
1d5b0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 5f 66 72    }.  sqlite3_fr
1d5c0 65 65 28 7a 53 63 68 65 6d 61 54 61 62 29 3b 0a  ee(zSchemaTab);.
1d5d0 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
1d5e0 2a 0a 2a 2a 20 50 72 69 6e 74 20 74 68 65 20 63  *.** Print the c
1d5f0 75 72 72 65 6e 74 20 73 71 6c 69 74 65 33 5f 65  urrent sqlite3_e
1d600 72 72 6d 73 67 28 29 20 76 61 6c 75 65 20 74 6f  rrmsg() value to
1d610 20 73 74 64 65 72 72 20 61 6e 64 20 72 65 74 75   stderr and retu
1d620 72 6e 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rn 1..*/.static 
1d630 69 6e 74 20 73 68 65 6c 6c 44 61 74 61 62 61 73  int shellDatabas
1d640 65 45 72 72 6f 72 28 73 71 6c 69 74 65 33 20 2a  eError(sqlite3 *
1d650 64 62 29 7b 0a 20 20 63 6f 6e 73 74 20 63 68 61  db){.  const cha
1d660 72 20 2a 7a 45 72 72 20 3d 20 73 71 6c 69 74 65  r *zErr = sqlite
1d670 33 5f 65 72 72 6d 73 67 28 64 62 29 3b 0a 20 20  3_errmsg(db);.  
1d680 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65  utf8_printf(stde
1d690 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e  rr, "Error: %s\n
1d6a0 22 2c 20 7a 45 72 72 29 3b 0a 20 20 72 65 74 75  ", zErr);.  retu
1d6b0 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 50  rn 1;.}../*.** P
1d6c0 72 69 6e 74 20 61 6e 20 6f 75 74 2d 6f 66 2d 6d  rint an out-of-m
1d6d0 65 6d 6f 72 79 20 6d 65 73 73 61 67 65 20 74 6f  emory message to
1d6e0 20 73 74 64 65 72 72 20 61 6e 64 20 72 65 74 75   stderr and retu
1d6f0 72 6e 20 31 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rn 1..*/.static 
1d700 69 6e 74 20 73 68 65 6c 6c 4e 6f 6d 65 6d 45 72  int shellNomemEr
1d710 72 6f 72 28 76 6f 69 64 29 7b 0a 20 20 72 61 77  ror(void){.  raw
1d720 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
1d730 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d  "Error: out of m
1d740 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 72 65 74  emory\n");.  ret
1d750 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 1;.}../*.** 
1d760 43 6f 6d 70 61 72 65 20 74 68 65 20 70 61 74 74  Compare the patt
1d770 65 72 6e 20 69 6e 20 7a 47 6c 6f 62 5b 5d 20 61  ern in zGlob[] a
1d780 67 61 69 6e 73 74 20 74 68 65 20 74 65 78 74 20  gainst the text 
1d790 69 6e 20 7a 5b 5d 2e 20 20 52 65 74 75 72 6e 20  in z[].  Return 
1d7a0 54 52 55 45 0a 2a 2a 20 69 66 20 74 68 65 79 20  TRUE.** if they 
1d7b0 6d 61 74 63 68 20 61 6e 64 20 46 41 4c 53 45 20  match and FALSE 
1d7c0 28 30 29 20 69 66 20 74 68 65 79 20 64 6f 20 6e  (0) if they do n
1d7d0 6f 74 20 6d 61 74 63 68 2e 0a 2a 2a 0a 2a 2a 20  ot match..**.** 
1d7e0 47 6c 6f 62 62 69 6e 67 20 72 75 6c 65 73 3a 0a  Globbing rules:.
1d7f0 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 2a 27 20 20  **.**      '*'  
1d800 20 20 20 20 20 4d 61 74 63 68 65 73 20 61 6e 79       Matches any
1d810 20 73 65 71 75 65 6e 63 65 20 6f 66 20 7a 65 72   sequence of zer
1d820 6f 20 6f 72 20 6d 6f 72 65 20 63 68 61 72 61 63  o or more charac
1d830 74 65 72 73 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ters..**.**     
1d840 20 27 3f 27 20 20 20 20 20 20 20 4d 61 74 63 68   '?'       Match
1d850 65 73 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 63  es exactly one c
1d860 68 61 72 61 63 74 65 72 2e 0a 2a 2a 0a 2a 2a 20  haracter..**.** 
1d870 20 20 20 20 5b 2e 2e 2e 5d 20 20 20 20 20 20 4d      [...]      M
1d880 61 74 63 68 65 73 20 6f 6e 65 20 63 68 61 72 61  atches one chara
1d890 63 74 65 72 20 66 72 6f 6d 20 74 68 65 20 65 6e  cter from the en
1d8a0 63 6c 6f 73 65 64 20 6c 69 73 74 20 6f 66 0a 2a  closed list of.*
1d8b0 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1d8c0 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2a 0a   characters..**.
1d8d0 2a 2a 20 20 20 20 20 5b 5e 2e 2e 2e 5d 20 20 20  **     [^...]   
1d8e0 20 20 4d 61 74 63 68 65 73 20 6f 6e 65 20 63 68    Matches one ch
1d8f0 61 72 61 63 74 65 72 20 6e 6f 74 20 69 6e 20 74  aracter not in t
1d900 68 65 20 65 6e 63 6c 6f 73 65 64 20 6c 69 73 74  he enclosed list
1d910 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 27 23 27  ..**.**      '#'
1d920 20 20 20 20 20 20 20 4d 61 74 63 68 65 73 20 61         Matches a
1d930 6e 79 20 73 65 71 75 65 6e 63 65 20 6f 66 20 6f  ny sequence of o
1d940 6e 65 20 6f 72 20 6d 6f 72 65 20 64 69 67 69 74  ne or more digit
1d950 73 20 77 69 74 68 20 61 6e 0a 2a 2a 20 20 20 20  s with an.**    
1d960 20 20 20 20 20 20 20 20 20 20 20 20 6f 70 74 69              opti
1d970 6f 6e 61 6c 20 2b 20 6f 72 20 2d 20 73 69 67 6e  onal + or - sign
1d980 20 69 6e 20 66 72 6f 6e 74 0a 2a 2a 0a 2a 2a 20   in front.**.** 
1d990 20 20 20 20 20 27 20 27 20 20 20 20 20 20 20 41       ' '       A
1d9a0 6e 79 20 73 70 61 6e 20 6f 66 20 77 68 69 74 65  ny span of white
1d9b0 73 70 61 63 65 20 6d 61 74 63 68 65 73 20 61 6e  space matches an
1d9c0 79 20 6f 74 68 65 72 20 73 70 61 6e 20 6f 66 0a  y other span of.
1d9d0 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1d9e0 20 20 77 68 69 74 65 73 70 61 63 65 2e 0a 2a 2a    whitespace..**
1d9f0 0a 2a 2a 20 45 78 74 72 61 20 77 68 69 74 65 73  .** Extra whites
1da00 70 61 63 65 20 61 74 20 74 68 65 20 65 6e 64 20  pace at the end 
1da10 6f 66 20 7a 5b 5d 20 69 73 20 69 67 6e 6f 72 65  of z[] is ignore
1da20 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  d..*/.static int
1da30 20 74 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 63   testcase_glob(c
1da40 6f 6e 73 74 20 63 68 61 72 20 2a 7a 47 6c 6f 62  onst char *zGlob
1da50 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29  , const char *z)
1da60 7b 0a 20 20 69 6e 74 20 63 2c 20 63 32 3b 0a 20  {.  int c, c2;. 
1da70 20 69 6e 74 20 69 6e 76 65 72 74 3b 0a 20 20 69   int invert;.  i
1da80 6e 74 20 73 65 65 6e 3b 0a 0a 20 20 77 68 69 6c  nt seen;..  whil
1da90 65 28 20 28 63 20 3d 20 28 2a 28 7a 47 6c 6f 62  e( (c = (*(zGlob
1daa0 2b 2b 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20  ++)))!=0 ){.    
1dab0 69 66 28 20 49 73 53 70 61 63 65 28 63 29 20 29  if( IsSpace(c) )
1dac0 7b 0a 20 20 20 20 20 20 69 66 28 20 21 49 73 53  {.      if( !IsS
1dad0 70 61 63 65 28 2a 7a 29 20 29 20 72 65 74 75 72  pace(*z) ) retur
1dae0 6e 20 30 3b 0a 20 20 20 20 20 20 77 68 69 6c 65  n 0;.      while
1daf0 28 20 49 73 53 70 61 63 65 28 2a 7a 47 6c 6f 62  ( IsSpace(*zGlob
1db00 29 20 29 20 7a 47 6c 6f 62 2b 2b 3b 0a 20 20 20  ) ) zGlob++;.   
1db10 20 20 20 77 68 69 6c 65 28 20 49 73 53 70 61 63     while( IsSpac
1db20 65 28 2a 7a 29 20 29 20 7a 2b 2b 3b 0a 20 20 20  e(*z) ) z++;.   
1db30 20 7d 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 2a   }else if( c=='*
1db40 27 20 29 7b 0a 20 20 20 20 20 20 77 68 69 6c 65  ' ){.      while
1db50 28 20 28 63 3d 28 2a 28 7a 47 6c 6f 62 2b 2b 29  ( (c=(*(zGlob++)
1db60 29 29 20 3d 3d 20 27 2a 27 20 7c 7c 20 63 3d 3d  )) == '*' || c==
1db70 27 3f 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  '?' ){.        i
1db80 66 28 20 63 3d 3d 27 3f 27 20 26 26 20 28 2a 28  f( c=='?' && (*(
1db90 7a 2b 2b 29 29 3d 3d 30 20 29 20 72 65 74 75 72  z++))==0 ) retur
1dba0 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
1dbb0 20 20 20 69 66 28 20 63 3d 3d 30 20 29 7b 0a 20     if( c==0 ){. 
1dbc0 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
1dbd0 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
1dbe0 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20 20 20   c=='[' ){.     
1dbf0 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20     while( *z && 
1dc00 74 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 7a 47  testcase_glob(zG
1dc10 6c 6f 62 2d 31 2c 7a 29 3d 3d 30 20 29 7b 0a 20  lob-1,z)==0 ){. 
1dc20 20 20 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20           z++;.  
1dc30 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1dc40 72 65 74 75 72 6e 20 28 2a 7a 29 21 3d 30 3b 0a  return (*z)!=0;.
1dc50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77 68        }.      wh
1dc60 69 6c 65 28 20 28 63 32 20 3d 20 28 2a 28 7a 2b  ile( (c2 = (*(z+
1dc70 2b 29 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  +)))!=0 ){.     
1dc80 20 20 20 77 68 69 6c 65 28 20 63 32 21 3d 63 20     while( c2!=c 
1dc90 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 32 20  ){.          c2 
1dca0 3d 20 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 20 20  = *(z++);.      
1dcb0 20 20 20 20 69 66 28 20 63 32 3d 3d 30 20 29 20      if( c2==0 ) 
1dcc0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
1dcd0 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
1dce0 74 65 73 74 63 61 73 65 5f 67 6c 6f 62 28 7a 47  testcase_glob(zG
1dcf0 6c 6f 62 2c 7a 29 20 29 20 72 65 74 75 72 6e 20  lob,z) ) return 
1dd00 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
1dd10 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
1dd20 65 6c 73 65 20 69 66 28 20 63 3d 3d 27 3f 27 20  else if( c=='?' 
1dd30 29 7b 0a 20 20 20 20 20 20 69 66 28 20 28 2a 28  ){.      if( (*(
1dd40 7a 2b 2b 29 29 3d 3d 30 20 29 20 72 65 74 75 72  z++))==0 ) retur
1dd50 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  n 0;.    }else i
1dd60 66 28 20 63 3d 3d 27 5b 27 20 29 7b 0a 20 20 20  f( c=='[' ){.   
1dd70 20 20 20 69 6e 74 20 70 72 69 6f 72 5f 63 20 3d     int prior_c =
1dd80 20 30 3b 0a 20 20 20 20 20 20 73 65 65 6e 20 3d   0;.      seen =
1dd90 20 30 3b 0a 20 20 20 20 20 20 69 6e 76 65 72 74   0;.      invert
1dda0 20 3d 20 30 3b 0a 20 20 20 20 20 20 63 20 3d 20   = 0;.      c = 
1ddb0 2a 28 7a 2b 2b 29 3b 0a 20 20 20 20 20 20 69 66  *(z++);.      if
1ddc0 28 20 63 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( c==0 ) return 
1ddd0 30 3b 0a 20 20 20 20 20 20 63 32 20 3d 20 2a 28  0;.      c2 = *(
1dde0 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20 20 20  zGlob++);.      
1ddf0 69 66 28 20 63 32 3d 3d 27 5e 27 20 29 7b 0a 20  if( c2=='^' ){. 
1de00 20 20 20 20 20 20 20 69 6e 76 65 72 74 20 3d 20         invert = 
1de10 31 3b 0a 20 20 20 20 20 20 20 20 63 32 20 3d 20  1;.        c2 = 
1de20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20 20 20  *(zGlob++);.    
1de30 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 63 32    }.      if( c2
1de40 3d 3d 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20  ==']' ){.       
1de50 20 69 66 28 20 63 3d 3d 27 5d 27 20 29 20 73 65   if( c==']' ) se
1de60 65 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  en = 1;.        
1de70 63 32 20 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b  c2 = *(zGlob++);
1de80 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 77  .      }.      w
1de90 68 69 6c 65 28 20 63 32 20 26 26 20 63 32 21 3d  hile( c2 && c2!=
1dea0 27 5d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ']' ){.        i
1deb0 66 28 20 63 32 3d 3d 27 2d 27 20 26 26 20 7a 47  f( c2=='-' && zG
1dec0 6c 6f 62 5b 30 5d 21 3d 27 5d 27 20 26 26 20 7a  lob[0]!=']' && z
1ded0 47 6c 6f 62 5b 30 5d 21 3d 30 20 26 26 20 70 72  Glob[0]!=0 && pr
1dee0 69 6f 72 5f 63 3e 30 20 29 7b 0a 20 20 20 20 20  ior_c>0 ){.     
1def0 20 20 20 20 20 63 32 20 3d 20 2a 28 7a 47 6c 6f       c2 = *(zGlo
1df00 62 2b 2b 29 3b 0a 20 20 20 20 20 20 20 20 20 20  b++);.          
1df10 69 66 28 20 63 3e 3d 70 72 69 6f 72 5f 63 20 26  if( c>=prior_c &
1df20 26 20 63 3c 3d 63 32 20 29 20 73 65 65 6e 20 3d  & c<=c2 ) seen =
1df30 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 72   1;.          pr
1df40 69 6f 72 5f 63 20 3d 20 30 3b 0a 20 20 20 20 20  ior_c = 0;.     
1df50 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1df60 20 20 20 20 69 66 28 20 63 3d 3d 63 32 20 29 7b      if( c==c2 ){
1df70 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 65 65  .            see
1df80 6e 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  n = 1;.         
1df90 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 72 69   }.          pri
1dfa0 6f 72 5f 63 20 3d 20 63 32 3b 0a 20 20 20 20 20  or_c = c2;.     
1dfb0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63 32 20     }.        c2 
1dfc0 3d 20 2a 28 7a 47 6c 6f 62 2b 2b 29 3b 0a 20 20  = *(zGlob++);.  
1dfd0 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
1dfe0 63 32 3d 3d 30 20 7c 7c 20 28 73 65 65 6e 20 5e  c2==0 || (seen ^
1dff0 20 69 6e 76 65 72 74 29 3d 3d 30 20 29 20 72 65   invert)==0 ) re
1e000 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 65 6c 73  turn 0;.    }els
1e010 65 20 69 66 28 20 63 3d 3d 27 23 27 20 29 7b 0a  e if( c=='#' ){.
1e020 20 20 20 20 20 20 69 66 28 20 28 7a 5b 30 5d 3d        if( (z[0]=
1e030 3d 27 2d 27 20 7c 7c 20 7a 5b 30 5d 3d 3d 27 2b  ='-' || z[0]=='+
1e040 27 29 20 26 26 20 49 73 44 69 67 69 74 28 7a 5b  ') && IsDigit(z[
1e050 31 5d 29 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20  1]) ) z++;.     
1e060 20 69 66 28 20 21 49 73 44 69 67 69 74 28 7a 5b   if( !IsDigit(z[
1e070 30 5d 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  0]) ) return 0;.
1e080 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20        z++;.     
1e090 20 77 68 69 6c 65 28 20 49 73 44 69 67 69 74 28   while( IsDigit(
1e0a0 7a 5b 30 5d 29 20 29 7b 20 7a 2b 2b 3b 20 7d 0a  z[0]) ){ z++; }.
1e0b0 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1e0c0 20 69 66 28 20 63 21 3d 28 2a 28 7a 2b 2b 29 29   if( c!=(*(z++))
1e0d0 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
1e0e0 20 7d 0a 20 20 7d 0a 20 20 77 68 69 6c 65 28 20   }.  }.  while( 
1e0f0 49 73 53 70 61 63 65 28 2a 7a 29 20 29 7b 20 7a  IsSpace(*z) ){ z
1e100 2b 2b 3b 20 7d 0a 20 20 72 65 74 75 72 6e 20 2a  ++; }.  return *
1e110 7a 3d 3d 30 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  z==0;.}.../*.** 
1e120 43 6f 6d 70 61 72 65 20 74 68 65 20 73 74 72 69  Compare the stri
1e130 6e 67 20 61 73 20 61 20 63 6f 6d 6d 61 6e 64 2d  ng as a command-
1e140 6c 69 6e 65 20 6f 70 74 69 6f 6e 20 77 69 74 68  line option with
1e150 20 65 69 74 68 65 72 20 6f 6e 65 20 6f 72 20 74   either one or t
1e160 77 6f 0a 2a 2a 20 69 6e 69 74 69 61 6c 20 22 2d  wo.** initial "-
1e170 22 20 63 68 61 72 61 63 74 65 72 73 2e 0a 2a 2f  " characters..*/
1e180 0a 73 74 61 74 69 63 20 69 6e 74 20 6f 70 74 69  .static int opti
1e190 6f 6e 4d 61 74 63 68 28 63 6f 6e 73 74 20 63 68  onMatch(const ch
1e1a0 61 72 20 2a 7a 53 74 72 2c 20 63 6f 6e 73 74 20  ar *zStr, const 
1e1b0 63 68 61 72 20 2a 7a 4f 70 74 29 7b 0a 20 20 69  char *zOpt){.  i
1e1c0 66 28 20 7a 53 74 72 5b 30 5d 21 3d 27 2d 27 20  f( zStr[0]!='-' 
1e1d0 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7a 53  ) return 0;.  zS
1e1e0 74 72 2b 2b 3b 0a 20 20 69 66 28 20 7a 53 74 72  tr++;.  if( zStr
1e1f0 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a 53 74 72 2b  [0]=='-' ) zStr+
1e200 2b 3b 0a 20 20 72 65 74 75 72 6e 20 73 74 72 63  +;.  return strc
1e210 6d 70 28 7a 53 74 72 2c 20 7a 4f 70 74 29 3d 3d  mp(zStr, zOpt)==
1e220 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65  0;.}../*.** Dele
1e230 74 65 20 61 20 66 69 6c 65 2e 0a 2a 2f 0a 69 6e  te a file..*/.in
1e240 74 20 73 68 65 6c 6c 44 65 6c 65 74 65 46 69 6c  t shellDeleteFil
1e250 65 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46  e(const char *zF
1e260 69 6c 65 6e 61 6d 65 29 7b 0a 20 20 69 6e 74 20  ilename){.  int 
1e270 72 63 3b 0a 23 69 66 64 65 66 20 5f 57 49 4e 33  rc;.#ifdef _WIN3
1e280 32 0a 20 20 77 63 68 61 72 5f 74 20 2a 7a 20 3d  2.  wchar_t *z =
1e290 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32 5f 75   sqlite3_win32_u
1e2a0 74 66 38 5f 74 6f 5f 75 6e 69 63 6f 64 65 28 7a  tf8_to_unicode(z
1e2b0 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 72 63 20  Filename);.  rc 
1e2c0 3d 20 5f 77 75 6e 6c 69 6e 6b 28 7a 29 3b 0a 20  = _wunlink(z);. 
1e2d0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 29   sqlite3_free(z)
1e2e0 3b 0a 23 65 6c 73 65 0a 20 20 72 63 20 3d 20 75  ;.#else.  rc = u
1e2f0 6e 6c 69 6e 6b 28 7a 46 69 6c 65 6e 61 6d 65 29  nlink(zFilename)
1e300 3b 0a 23 65 6e 64 69 66 0a 20 20 72 65 74 75 72  ;.#endif.  retur
1e310 6e 20 72 63 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  n rc;.}.../*.** 
1e320 54 68 65 20 69 6d 70 6c 65 6d 65 6e 74 61 74 69  The implementati
1e330 6f 6e 20 6f 66 20 53 51 4c 20 73 63 61 6c 61 72  on of SQL scalar
1e340 20 66 75 6e 63 74 69 6f 6e 20 66 6b 65 79 5f 63   function fkey_c
1e350 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 29 2c  ollate_clause(),
1e360 20 75 73 65 64 0a 2a 2a 20 62 79 20 74 68 65 20   used.** by the 
1e370 22 2e 6c 69 6e 74 20 66 6b 65 79 2d 69 6e 64 65  ".lint fkey-inde
1e380 78 65 73 22 20 63 6f 6d 6d 61 6e 64 2e 20 54 68  xes" command. Th
1e390 69 73 20 73 63 61 6c 61 72 20 66 75 6e 63 74 69  is scalar functi
1e3a0 6f 6e 20 69 73 20 61 6c 77 61 79 73 0a 2a 2a 20  on is always.** 
1e3b0 63 61 6c 6c 65 64 20 77 69 74 68 20 66 6f 75 72  called with four
1e3c0 20 61 72 67 75 6d 65 6e 74 73 20 2d 20 74 68 65   arguments - the
1e3d0 20 70 61 72 65 6e 74 20 74 61 62 6c 65 20 6e 61   parent table na
1e3e0 6d 65 2c 20 74 68 65 20 70 61 72 65 6e 74 20 63  me, the parent c
1e3f0 6f 6c 75 6d 6e 20 6e 61 6d 65 2c 0a 2a 2a 20 74  olumn name,.** t
1e400 68 65 20 63 68 69 6c 64 20 74 61 62 6c 65 20 6e  he child table n
1e410 61 6d 65 20 61 6e 64 20 74 68 65 20 63 68 69 6c  ame and the chil
1e420 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a  d column name..*
1e430 2a 0a 2a 2a 20 20 20 66 6b 65 79 5f 63 6f 6c 6c  *.**   fkey_coll
1e440 61 74 65 5f 63 6c 61 75 73 65 28 27 70 61 72 65  ate_clause('pare
1e450 6e 74 2d 74 61 62 27 2c 20 27 70 61 72 65 6e 74  nt-tab', 'parent
1e460 2d 63 6f 6c 27 2c 20 27 63 68 69 6c 64 2d 74 61  -col', 'child-ta
1e470 62 27 2c 20 27 63 68 69 6c 64 2d 63 6f 6c 27 29  b', 'child-col')
1e480 0a 2a 2a 0a 2a 2a 20 49 66 20 65 69 74 68 65 72  .**.** If either
1e490 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 20 74 61   of the named ta
1e4a0 62 6c 65 73 20 6f 72 20 63 6f 6c 75 6d 6e 73 20  bles or columns 
1e4b0 64 6f 20 6e 6f 74 20 65 78 69 73 74 2c 20 74 68  do not exist, th
1e4c0 69 73 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 72  is function.** r
1e4d0 65 74 75 72 6e 73 20 61 6e 20 65 6d 70 74 79 20  eturns an empty 
1e4e0 73 74 72 69 6e 67 2e 20 41 6e 20 65 6d 70 74 79  string. An empty
1e4f0 20 73 74 72 69 6e 67 20 69 73 20 61 6c 73 6f 20   string is also 
1e500 72 65 74 75 72 6e 65 64 20 69 66 20 62 6f 74 68  returned if both
1e510 20 74 61 62 6c 65 73 0a 2a 2a 20 61 6e 64 20 63   tables.** and c
1e520 6f 6c 75 6d 6e 73 20 65 78 69 73 74 20 62 75 74  olumns exist but
1e530 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 64   have the same d
1e540 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e  efault collation
1e550 20 73 65 71 75 65 6e 63 65 2e 20 4f 72 2c 0a 2a   sequence. Or,.*
1e560 2a 20 69 66 20 62 6f 74 68 20 65 78 69 73 74 20  * if both exist 
1e570 62 75 74 20 74 68 65 20 64 65 66 61 75 6c 74 20  but the default 
1e580 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
1e590 63 65 73 20 61 72 65 20 64 69 66 66 65 72 65 6e  ces are differen
1e5a0 74 2c 20 74 68 69 73 0a 2a 2a 20 66 75 6e 63 74  t, this.** funct
1e5b0 69 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20  ion returns the 
1e5c0 73 74 72 69 6e 67 20 22 20 43 4f 4c 4c 41 54 45  string " COLLATE
1e5d0 20 3c 70 61 72 65 6e 74 2d 63 6f 6c 6c 61 74 69   <parent-collati
1e5e0 6f 6e 3e 22 2c 20 77 68 65 72 65 0a 2a 2a 20 3c  on>", where.** <
1e5f0 70 61 72 65 6e 74 2d 63 6f 6c 6c 61 74 69 6f 6e  parent-collation
1e600 3e 20 69 73 20 74 68 65 20 64 65 66 61 75 6c 74  > is the default
1e610 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
1e620 6e 63 65 20 6f 66 20 74 68 65 20 70 61 72 65 6e  nce of the paren
1e630 74 20 63 6f 6c 75 6d 6e 2e 0a 2a 2f 0a 73 74 61  t column..*/.sta
1e640 74 69 63 20 76 6f 69 64 20 73 68 65 6c 6c 46 6b  tic void shellFk
1e650 65 79 43 6f 6c 6c 61 74 65 43 6c 61 75 73 65 28  eyCollateClause(
1e660 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65  .  sqlite3_conte
1e670 78 74 20 2a 70 43 74 78 2c 0a 20 20 69 6e 74 20  xt *pCtx,.  int 
1e680 6e 56 61 6c 2c 0a 20 20 73 71 6c 69 74 65 33 5f  nVal,.  sqlite3_
1e690 76 61 6c 75 65 20 2a 2a 61 70 56 61 6c 0a 29 7b  value **apVal.){
1e6a0 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
1e6b0 20 73 71 6c 69 74 65 33 5f 63 6f 6e 74 65 78 74   sqlite3_context
1e6c0 5f 64 62 5f 68 61 6e 64 6c 65 28 70 43 74 78 29  _db_handle(pCtx)
1e6d0 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ;.  const char *
1e6e0 7a 50 61 72 65 6e 74 3b 0a 20 20 63 6f 6e 73 74  zParent;.  const
1e6f0 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 43 6f   char *zParentCo
1e700 6c 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  l;.  const char 
1e710 2a 7a 50 61 72 65 6e 74 53 65 71 3b 0a 20 20 63  *zParentSeq;.  c
1e720 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 69 6c  onst char *zChil
1e730 64 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  d;.  const char 
1e740 2a 7a 43 68 69 6c 64 43 6f 6c 3b 0a 20 20 63 6f  *zChildCol;.  co
1e750 6e 73 74 20 63 68 61 72 20 2a 7a 43 68 69 6c 64  nst char *zChild
1e760 53 65 71 20 3d 20 30 3b 20 20 2f 2a 20 49 6e 69  Seq = 0;  /* Ini
1e770 74 69 61 6c 69 7a 65 20 74 6f 20 61 76 6f 69 64  tialize to avoid
1e780 20 66 61 6c 73 65 2d 70 6f 73 69 74 69 76 65 20   false-positive 
1e790 77 61 72 6e 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  warning */.  int
1e7a0 20 72 63 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   rc;..  assert( 
1e7b0 6e 56 61 6c 3d 3d 34 20 29 3b 0a 20 20 7a 50 61  nVal==4 );.  zPa
1e7c0 72 65 6e 74 20 3d 20 28 63 6f 6e 73 74 20 63 68  rent = (const ch
1e7d0 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
1e7e0 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 30 5d 29  e_text(apVal[0])
1e7f0 3b 0a 20 20 7a 50 61 72 65 6e 74 43 6f 6c 20 3d  ;.  zParentCol =
1e800 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
1e810 6c 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74  lite3_value_text
1e820 28 61 70 56 61 6c 5b 31 5d 29 3b 0a 20 20 7a 43  (apVal[1]);.  zC
1e830 68 69 6c 64 20 3d 20 28 63 6f 6e 73 74 20 63 68  hild = (const ch
1e840 61 72 2a 29 73 71 6c 69 74 65 33 5f 76 61 6c 75  ar*)sqlite3_valu
1e850 65 5f 74 65 78 74 28 61 70 56 61 6c 5b 32 5d 29  e_text(apVal[2])
1e860 3b 0a 20 20 7a 43 68 69 6c 64 43 6f 6c 20 3d 20  ;.  zChildCol = 
1e870 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71 6c  (const char*)sql
1e880 69 74 65 33 5f 76 61 6c 75 65 5f 74 65 78 74 28  ite3_value_text(
1e890 61 70 56 61 6c 5b 33 5d 29 3b 0a 0a 20 20 73 71  apVal[3]);..  sq
1e8a0 6c 69 74 65 33 5f 72 65 73 75 6c 74 5f 74 65 78  lite3_result_tex
1e8b0 74 28 70 43 74 78 2c 20 22 22 2c 20 2d 31 2c 20  t(pCtx, "", -1, 
1e8c0 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
1e8d0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 74    rc = sqlite3_t
1e8e0 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d 65 74 61  able_column_meta
1e8f0 64 61 74 61 28 0a 20 20 20 20 20 20 64 62 2c 20  data(.      db, 
1e900 22 6d 61 69 6e 22 2c 20 7a 50 61 72 65 6e 74 2c  "main", zParent,
1e910 20 7a 50 61 72 65 6e 74 43 6f 6c 2c 20 30 2c 20   zParentCol, 0, 
1e920 26 7a 50 61 72 65 6e 74 53 65 71 2c 20 30 2c 20  &zParentSeq, 0, 
1e930 30 2c 20 30 0a 20 20 29 3b 0a 20 20 69 66 28 20  0, 0.  );.  if( 
1e940 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  rc==SQLITE_OK ){
1e950 0a 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65  .    rc = sqlite
1e960 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f 6d  3_table_column_m
1e970 65 74 61 64 61 74 61 28 0a 20 20 20 20 20 20 20  etadata(.       
1e980 20 64 62 2c 20 22 6d 61 69 6e 22 2c 20 7a 43 68   db, "main", zCh
1e990 69 6c 64 2c 20 7a 43 68 69 6c 64 43 6f 6c 2c 20  ild, zChildCol, 
1e9a0 30 2c 20 26 7a 43 68 69 6c 64 53 65 71 2c 20 30  0, &zChildSeq, 0
1e9b0 2c 20 30 2c 20 30 0a 20 20 20 20 29 3b 0a 20 20  , 0, 0.    );.  
1e9c0 7d 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  }..  if( rc==SQL
1e9d0 49 54 45 5f 4f 4b 20 26 26 20 73 71 6c 69 74 65  ITE_OK && sqlite
1e9e0 33 5f 73 74 72 69 63 6d 70 28 7a 50 61 72 65 6e  3_stricmp(zParen
1e9f0 74 53 65 71 2c 20 7a 43 68 69 6c 64 53 65 71 29  tSeq, zChildSeq)
1ea00 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20   ){.    char *z 
1ea10 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
1ea20 66 28 22 20 43 4f 4c 4c 41 54 45 20 25 73 22 2c  f(" COLLATE %s",
1ea30 20 7a 50 61 72 65 6e 74 53 65 71 29 3b 0a 20 20   zParentSeq);.  
1ea40 20 20 73 71 6c 69 74 65 33 5f 72 65 73 75 6c 74    sqlite3_result
1ea50 5f 74 65 78 74 28 70 43 74 78 2c 20 7a 2c 20 2d  _text(pCtx, z, -
1ea60 31 2c 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49  1, SQLITE_TRANSI
1ea70 45 4e 54 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  ENT);.    sqlite
1ea80 33 5f 66 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 7d  3_free(z);.  }.}
1ea90 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 69 6d 70  .../*.** The imp
1eaa0 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 64  lementation of d
1eab0 6f 74 2d 63 6f 6d 6d 61 6e 64 20 22 2e 6c 69 6e  ot-command ".lin
1eac0 74 20 66 6b 65 79 2d 69 6e 64 65 78 65 73 22 2e  t fkey-indexes".
1ead0 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c  .*/.static int l
1eae0 69 6e 74 46 6b 65 79 49 6e 64 65 78 65 73 28 0a  intFkeyIndexes(.
1eaf0 20 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 53    ShellState *pS
1eb00 74 61 74 65 2c 20 20 20 20 20 20 20 20 20 20 20  tate,           
1eb10 20 20 2f 2a 20 43 75 72 72 65 6e 74 20 73 68 65    /* Current she
1eb20 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65 20 2a 2f  ll tool state */
1eb30 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41 72 67 2c  .  char **azArg,
1eb40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eb50 20 20 20 2f 2a 20 41 72 72 61 79 20 6f 66 20 61     /* Array of a
1eb60 72 67 75 6d 65 6e 74 73 20 70 61 73 73 65 64 20  rguments passed 
1eb70 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e 64 20 2a  to dot command *
1eb80 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20 20 20 20  /.  int nArg    
1eb90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1eba0 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1ebb0 20 65 6e 74 72 69 65 73 20 69 6e 20 61 7a 41 72   entries in azAr
1ebc0 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69  g[] */.){.  sqli
1ebd0 74 65 33 20 2a 64 62 20 3d 20 70 53 74 61 74 65  te3 *db = pState
1ebe0 2d 3e 64 62 3b 20 20 20 20 20 20 20 2f 2a 20 44  ->db;       /* D
1ebf0 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20 74  atabase handle t
1ec00 6f 20 71 75 65 72 79 20 22 6d 61 69 6e 22 20 64  o query "main" d
1ec10 62 20 6f 66 20 2a 2f 0a 20 20 46 49 4c 45 20 2a  b of */.  FILE *
1ec20 6f 75 74 20 3d 20 70 53 74 61 74 65 2d 3e 6f 75  out = pState->ou
1ec30 74 3b 20 20 20 20 20 20 20 20 2f 2a 20 53 74 72  t;        /* Str
1ec40 65 61 6d 20 74 6f 20 77 72 69 74 65 20 6e 6f 6e  eam to write non
1ec50 2d 65 72 72 6f 72 20 6f 75 74 70 75 74 20 74 6f  -error output to
1ec60 20 2a 2f 0a 20 20 69 6e 74 20 62 56 65 72 62 6f   */.  int bVerbo
1ec70 73 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  se = 0;         
1ec80 20 20 20 20 20 20 2f 2a 20 49 66 20 2d 76 65 72        /* If -ver
1ec90 62 6f 73 65 20 69 73 20 70 72 65 73 65 6e 74 20  bose is present 
1eca0 2a 2f 0a 20 20 69 6e 74 20 62 47 72 6f 75 70 42  */.  int bGroupB
1ecb0 79 50 61 72 65 6e 74 20 3d 20 30 3b 20 20 20 20  yParent = 0;    
1ecc0 20 20 20 20 20 2f 2a 20 49 66 20 2d 67 72 6f 75       /* If -grou
1ecd0 70 62 79 70 61 72 65 6e 74 20 69 73 20 70 72 65  pbyparent is pre
1ece0 73 65 6e 74 20 2a 2f 0a 20 20 69 6e 74 20 69 3b  sent */.  int i;
1ecf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed00 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 6f 20            /* To 
1ed10 69 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 20  iterate through 
1ed20 61 7a 41 72 67 5b 5d 20 2a 2f 0a 20 20 63 6f 6e  azArg[] */.  con
1ed30 73 74 20 63 68 61 72 20 2a 7a 49 6e 64 65 6e 74  st char *zIndent
1ed40 20 3d 20 22 22 3b 20 20 20 20 20 20 20 2f 2a 20   = "";       /* 
1ed50 48 6f 77 20 6d 75 63 68 20 74 6f 20 69 6e 64 65  How much to inde
1ed60 6e 74 20 43 52 45 41 54 45 20 49 4e 44 45 58 20  nt CREATE INDEX 
1ed70 62 79 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20  by */.  int rc; 
1ed80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ed90 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
1eda0 6e 20 63 6f 64 65 20 2a 2f 0a 20 20 73 71 6c 69  n code */.  sqli
1edb0 74 65 33 5f 73 74 6d 74 20 2a 70 53 71 6c 20 3d  te3_stmt *pSql =
1edc0 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 43   0;         /* C
1edd0 6f 6d 70 69 6c 65 64 20 76 65 72 73 69 6f 6e 20  ompiled version 
1ede0 6f 66 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  of SQL statement
1edf0 20 62 65 6c 6f 77 20 2a 2f 0a 0a 20 20 2f 2a 0a   below */..  /*.
1ee00 20 20 2a 2a 20 54 68 69 73 20 53 45 4c 45 43 54    ** This SELECT
1ee10 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72   statement retur
1ee20 6e 73 20 6f 6e 65 20 72 6f 77 20 66 6f 72 20 65  ns one row for e
1ee30 61 63 68 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  ach foreign key 
1ee40 63 6f 6e 73 74 72 61 69 6e 74 0a 20 20 2a 2a 20  constraint.  ** 
1ee50 69 6e 20 74 68 65 20 73 63 68 65 6d 61 20 6f 66  in the schema of
1ee60 20 74 68 65 20 6d 61 69 6e 20 64 61 74 61 62 61   the main databa
1ee70 73 65 2e 20 54 68 65 20 63 6f 6c 75 6d 6e 20 76  se. The column v
1ee80 61 6c 75 65 73 20 61 72 65 3a 0a 20 20 2a 2a 0a  alues are:.  **.
1ee90 20 20 2a 2a 20 30 2e 20 54 68 65 20 74 65 78 74    ** 0. The text
1eea0 20 6f 66 20 61 6e 20 53 51 4c 20 73 74 61 74 65   of an SQL state
1eeb0 6d 65 6e 74 20 73 69 6d 69 6c 61 72 20 74 6f 3a  ment similar to:
1eec0 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
1eed0 22 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50  "EXPLAIN QUERY P
1eee0 4c 41 4e 20 53 45 4c 45 43 54 20 31 20 46 52 4f  LAN SELECT 1 FRO
1eef0 4d 20 63 68 69 6c 64 5f 74 61 62 6c 65 20 57 48  M child_table WH
1ef00 45 52 45 20 63 68 69 6c 64 5f 6b 65 79 3d 3f 22  ERE child_key=?"
1ef10 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 54 68  .  **.  **    Th
1ef20 69 73 20 53 45 4c 45 43 54 20 69 73 20 73 69 6d  is SELECT is sim
1ef30 69 6c 61 72 20 74 6f 20 74 68 65 20 6f 6e 65 20  ilar to the one 
1ef40 74 68 61 74 20 74 68 65 20 66 6f 72 65 69 67 6e  that the foreign
1ef50 20 6b 65 79 73 20 69 6d 70 6c 65 6d 65 6e 74 61   keys implementa
1ef60 74 69 6f 6e 0a 20 20 2a 2a 20 20 20 20 6e 65 65  tion.  **    nee
1ef70 64 73 20 74 6f 20 72 75 6e 20 69 6e 74 65 72 6e  ds to run intern
1ef80 61 6c 6c 79 20 6f 6e 20 63 68 69 6c 64 20 74 61  ally on child ta
1ef90 62 6c 65 73 2e 20 49 66 20 74 68 65 72 65 20 69  bles. If there i
1efa0 73 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  s an index that 
1efb0 63 61 6e 0a 20 20 2a 2a 20 20 20 20 62 65 20 75  can.  **    be u
1efc0 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65 20  sed to optimize 
1efd0 74 68 69 73 20 71 75 65 72 79 2c 20 74 68 65 6e  this query, then
1efe0 20 69 74 20 63 61 6e 20 61 6c 73 6f 20 62 65 20   it can also be 
1eff0 75 73 65 64 20 62 79 20 74 68 65 20 46 4b 0a 20  used by the FK. 
1f000 20 2a 2a 20 20 20 20 69 6d 70 6c 65 6d 65 6e 74   **    implement
1f010 61 74 69 6f 6e 20 74 6f 20 6f 70 74 69 6d 69 7a  ation to optimiz
1f020 65 20 44 45 4c 45 54 45 20 6f 72 20 55 50 44 41  e DELETE or UPDA
1f030 54 45 20 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e  TE statements on
1f040 20 74 68 65 20 70 61 72 65 6e 74 0a 20 20 2a 2a   the parent.  **
1f050 20 20 20 20 74 61 62 6c 65 2e 0a 20 20 2a 2a 0a      table..  **.
1f060 20 20 2a 2a 20 31 2e 20 41 20 47 4c 4f 42 20 70    ** 1. A GLOB p
1f070 61 74 74 65 72 6e 20 73 75 69 74 61 62 6c 65 20  attern suitable 
1f080 66 6f 72 20 73 71 6c 69 74 65 33 5f 73 74 72 67  for sqlite3_strg
1f090 6c 6f 62 28 29 2e 20 49 66 20 74 68 65 20 70 6c  lob(). If the pl
1f0a0 61 6e 20 6f 75 74 70 75 74 20 62 79 0a 20 20 2a  an output by.  *
1f0b0 2a 20 20 20 20 74 68 65 20 45 58 50 4c 41 49 4e  *    the EXPLAIN
1f0c0 20 51 55 45 52 59 20 50 4c 41 4e 20 63 6f 6d 6d   QUERY PLAN comm
1f0d0 61 6e 64 20 6d 61 74 63 68 65 73 20 74 68 69 73  and matches this
1f0e0 20 70 61 74 74 65 72 6e 2c 20 74 68 65 6e 20 74   pattern, then t
1f0f0 68 65 20 73 63 68 65 6d 61 0a 20 20 2a 2a 20 20  he schema.  **  
1f100 20 20 63 6f 6e 74 61 69 6e 73 20 61 6e 20 69 6e    contains an in
1f110 64 65 78 20 74 68 61 74 20 63 61 6e 20 62 65 20  dex that can be 
1f120 75 73 65 64 20 74 6f 20 6f 70 74 69 6d 69 7a 65  used to optimize
1f130 20 74 68 65 20 71 75 65 72 79 2e 0a 20 20 2a 2a   the query..  **
1f140 0a 20 20 2a 2a 20 32 2e 20 48 75 6d 61 6e 20 72  .  ** 2. Human r
1f150 65 61 64 61 62 6c 65 20 74 65 78 74 20 74 68 61  eadable text tha
1f160 74 20 64 65 73 63 72 69 62 65 73 20 74 68 65 20  t describes the 
1f170 63 68 69 6c 64 20 74 61 62 6c 65 20 61 6e 64 20  child table and 
1f180 63 6f 6c 75 6d 6e 73 2e 20 65 2e 67 2e 0a 20 20  columns. e.g..  
1f190 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 22 63  **.  **       "c
1f1a0 68 69 6c 64 5f 74 61 62 6c 65 28 63 68 69 6c 64  hild_table(child
1f1b0 5f 6b 65 79 31 2c 20 63 68 69 6c 64 5f 6b 65 79  _key1, child_key
1f1c0 32 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 33 2e  2)".  **.  ** 3.
1f1d0 20 48 75 6d 61 6e 20 72 65 61 64 61 62 6c 65 20   Human readable 
1f1e0 74 65 78 74 20 74 68 61 74 20 64 65 73 63 72 69  text that descri
1f1f0 62 65 73 20 74 68 65 20 70 61 72 65 6e 74 20 74  bes the parent t
1f200 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 73  able and columns
1f210 2e 20 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a  . e.g..  **.  **
1f220 20 20 20 20 20 20 20 22 70 61 72 65 6e 74 5f 74         "parent_t
1f230 61 62 6c 65 28 70 61 72 65 6e 74 5f 6b 65 79 31  able(parent_key1
1f240 2c 20 70 61 72 65 6e 74 5f 6b 65 79 32 29 22 0a  , parent_key2)".
1f250 20 20 2a 2a 0a 20 20 2a 2a 20 34 2e 20 41 20 66    **.  ** 4. A f
1f260 75 6c 6c 20 43 52 45 41 54 45 20 49 4e 44 45 58  ull CREATE INDEX
1f270 20 73 74 61 74 65 6d 65 6e 74 20 66 6f 72 20 61   statement for a
1f280 6e 20 69 6e 64 65 78 20 74 68 61 74 20 63 6f 75  n index that cou
1f290 6c 64 20 62 65 20 75 73 65 64 20 74 6f 0a 20 20  ld be used to.  
1f2a0 2a 2a 20 20 20 20 6f 70 74 69 6d 69 7a 65 20 44  **    optimize D
1f2b0 45 4c 45 54 45 20 6f 72 20 55 50 44 41 54 45 20  ELETE or UPDATE 
1f2c0 73 74 61 74 65 6d 65 6e 74 73 20 6f 6e 20 74 68  statements on th
1f2d0 65 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2e 20  e parent table. 
1f2e0 65 2e 67 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  e.g..  **.  **  
1f2f0 20 20 20 20 20 22 43 52 45 41 54 45 20 49 4e 44       "CREATE IND
1f300 45 58 20 63 68 69 6c 64 5f 74 61 62 6c 65 5f 63  EX child_table_c
1f310 68 69 6c 64 5f 6b 65 79 20 4f 4e 20 63 68 69 6c  hild_key ON chil
1f320 64 5f 74 61 62 6c 65 28 63 68 69 6c 64 5f 6b 65  d_table(child_ke
1f330 79 29 22 0a 20 20 2a 2a 0a 20 20 2a 2a 20 35 2e  y)".  **.  ** 5.
1f340 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   The name of the
1f350 20 70 61 72 65 6e 74 20 74 61 62 6c 65 2e 0a 20   parent table.. 
1f360 20 2a 2a 0a 20 20 2a 2a 20 54 68 65 73 65 20 73   **.  ** These s
1f370 69 78 20 76 61 6c 75 65 73 20 61 72 65 20 75 73  ix values are us
1f380 65 64 20 62 79 20 74 68 65 20 43 20 6c 6f 67 69  ed by the C logi
1f390 63 20 62 65 6c 6f 77 20 74 6f 20 67 65 6e 65 72  c below to gener
1f3a0 61 74 65 20 74 68 65 20 72 65 70 6f 72 74 2e 0a  ate the report..
1f3b0 20 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61    */.  const cha
1f3c0 72 20 2a 7a 53 71 6c 20 3d 0a 20 20 22 53 45 4c  r *zSql =.  "SEL
1f3d0 45 43 54 20 22 0a 20 20 20 20 22 20 20 20 20 20  ECT ".    "     
1f3e0 27 45 58 50 4c 41 49 4e 20 51 55 45 52 59 20 50  'EXPLAIN QUERY P
1f3f0 4c 41 4e 20 53 45 4c 45 43 54 20 31 20 46 52 4f  LAN SELECT 1 FRO
1f400 4d 20 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e  M ' || quote(s.n
1f410 61 6d 65 29 20 7c 7c 20 27 20 57 48 45 52 45 20  ame) || ' WHERE 
1f420 27 22 0a 20 20 20 20 22 20 20 7c 7c 20 67 72 6f  '".    "  || gro
1f430 75 70 5f 63 6f 6e 63 61 74 28 71 75 6f 74 65 28  up_concat(quote(
1f440 73 2e 6e 61 6d 65 29 20 7c 7c 20 27 2e 27 20 7c  s.name) || '.' |
1f450 7c 20 71 75 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d  | quote(f.[from]
1f460 29 20 7c 7c 20 27 3d 3f 27 20 22 0a 20 20 20 20  ) || '=?' ".    
1f470 22 20 20 7c 7c 20 66 6b 65 79 5f 63 6f 6c 6c 61  "  || fkey_colla
1f480 74 65 5f 63 6c 61 75 73 65 28 22 0a 20 20 20 20  te_clause(".    
1f490 22 20 20 20 20 20 20 20 66 2e 5b 74 61 62 6c 65  "       f.[table
1f4a0 5d 2c 20 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74  ], COALESCE(f.[t
1f4b0 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73  o], p.[name]), s
1f4c0 2e 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29  .name, f.[from])
1f4d0 2c 27 20 41 4e 44 20 27 29 22 0a 20 20 20 20 22  ,' AND ')".    "
1f4e0 2c 20 22 0a 20 20 20 20 22 20 20 20 20 20 27 53  , ".    "     'S
1f4f0 45 41 52 43 48 20 54 41 42 4c 45 20 27 20 7c 7c  EARCH TABLE ' ||
1f500 20 73 2e 6e 61 6d 65 20 7c 7c 20 27 20 55 53 49   s.name || ' USI
1f510 4e 47 20 43 4f 56 45 52 49 4e 47 20 49 4e 44 45  NG COVERING INDE
1f520 58 2a 28 27 22 0a 20 20 20 20 22 20 20 7c 7c 20  X*('".    "  || 
1f530 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28 27 2a 3d  group_concat('*=
1f540 3f 27 2c 20 27 20 41 4e 44 20 27 29 20 7c 7c 20  ?', ' AND ') || 
1f550 27 29 27 22 0a 20 20 20 20 22 2c 20 22 0a 20 20  ')'".    ", ".  
1f560 20 20 22 20 20 20 20 20 73 2e 6e 61 6d 65 20 20    "     s.name  
1f570 7c 7c 20 27 28 27 20 7c 7c 20 67 72 6f 75 70 5f  || '(' || group_
1f580 63 6f 6e 63 61 74 28 66 2e 5b 66 72 6f 6d 5d 2c  concat(f.[from],
1f590 20 20 27 2c 20 27 29 20 7c 7c 20 27 29 27 22 0a    ', ') || ')'".
1f5a0 20 20 20 20 22 2c 20 22 0a 20 20 20 20 22 20 20      ", ".    "  
1f5b0 20 20 20 66 2e 5b 74 61 62 6c 65 5d 20 7c 7c 20     f.[table] || 
1f5c0 27 28 27 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e  '(' || group_con
1f5d0 63 61 74 28 43 4f 41 4c 45 53 43 45 28 66 2e 5b  cat(COALESCE(f.[
1f5e0 74 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 29 20  to], p.[name])) 
1f5f0 7c 7c 20 27 29 27 22 0a 20 20 20 20 22 2c 20 22  || ')'".    ", "
1f600 0a 20 20 20 20 22 20 20 20 20 20 27 43 52 45 41  .    "     'CREA
1f610 54 45 20 49 4e 44 45 58 20 27 20 7c 7c 20 71 75  TE INDEX ' || qu
1f620 6f 74 65 28 73 2e 6e 61 6d 65 20 7c 7c 27 5f 27  ote(s.name ||'_'
1f630 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  || group_concat(
1f640 66 2e 5b 66 72 6f 6d 5d 2c 20 27 5f 27 29 29 22  f.[from], '_'))"
1f650 0a 20 20 20 20 22 20 20 7c 7c 20 27 20 4f 4e 20  .    "  || ' ON 
1f660 27 20 7c 7c 20 71 75 6f 74 65 28 73 2e 6e 61 6d  ' || quote(s.nam
1f670 65 29 20 7c 7c 20 27 28 27 22 0a 20 20 20 20 22  e) || '('".    "
1f680 20 20 7c 7c 20 67 72 6f 75 70 5f 63 6f 6e 63 61    || group_conca
1f690 74 28 71 75 6f 74 65 28 66 2e 5b 66 72 6f 6d 5d  t(quote(f.[from]
1f6a0 29 20 7c 7c 22 0a 20 20 20 20 22 20 20 20 20 20  ) ||".    "     
1f6b0 20 20 20 66 6b 65 79 5f 63 6f 6c 6c 61 74 65 5f     fkey_collate_
1f6c0 63 6c 61 75 73 65 28 22 0a 20 20 20 20 22 20 20  clause(".    "  
1f6d0 20 20 20 20 20 20 20 20 66 2e 5b 74 61 62 6c 65          f.[table
1f6e0 5d 2c 20 43 4f 41 4c 45 53 43 45 28 66 2e 5b 74  ], COALESCE(f.[t
1f6f0 6f 5d 2c 20 70 2e 5b 6e 61 6d 65 5d 29 2c 20 73  o], p.[name]), s
1f700 2e 6e 61 6d 65 2c 20 66 2e 5b 66 72 6f 6d 5d 29  .name, f.[from])
1f710 2c 20 27 2c 20 27 29 22 0a 20 20 20 20 22 20 20  , ', ')".    "  
1f720 7c 7c 20 27 29 3b 27 22 0a 20 20 20 20 22 2c 20  || ');'".    ", 
1f730 22 0a 20 20 20 20 22 20 20 20 20 20 66 2e 5b 74  ".    "     f.[t
1f740 61 62 6c 65 5d 20 22 0a 20 20 20 20 22 46 52 4f  able] ".    "FRO
1f750 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 20  M sqlite_master 
1f760 41 53 20 73 2c 20 70 72 61 67 6d 61 5f 66 6f 72  AS s, pragma_for
1f770 65 69 67 6e 5f 6b 65 79 5f 6c 69 73 74 28 73 2e  eign_key_list(s.
1f780 6e 61 6d 65 29 20 41 53 20 66 20 22 0a 20 20 20  name) AS f ".   
1f790 20 22 4c 45 46 54 20 4a 4f 49 4e 20 70 72 61 67   "LEFT JOIN prag
1f7a0 6d 61 5f 74 61 62 6c 65 5f 69 6e 66 6f 20 41 53  ma_table_info AS
1f7b0 20 70 20 4f 4e 20 28 70 6b 2d 31 3d 73 65 71 20   p ON (pk-1=seq 
1f7c0 41 4e 44 20 70 2e 61 72 67 3d 66 2e 5b 74 61 62  AND p.arg=f.[tab
1f7d0 6c 65 5d 29 20 22 0a 20 20 20 20 22 47 52 4f 55  le]) ".    "GROU
1f7e0 50 20 42 59 20 73 2e 6e 61 6d 65 2c 20 66 2e 69  P BY s.name, f.i
1f7f0 64 20 22 0a 20 20 20 20 22 4f 52 44 45 52 20 42  d ".    "ORDER B
1f800 59 20 28 43 41 53 45 20 57 48 45 4e 20 3f 20 54  Y (CASE WHEN ? T
1f810 48 45 4e 20 66 2e 5b 74 61 62 6c 65 5d 20 45 4c  HEN f.[table] EL
1f820 53 45 20 73 2e 6e 61 6d 65 20 45 4e 44 29 22 0a  SE s.name END)".
1f830 20 20 3b 0a 20 20 63 6f 6e 73 74 20 63 68 61 72    ;.  const char
1f840 20 2a 7a 47 6c 6f 62 49 50 4b 20 3d 20 22 53 45   *zGlobIPK = "SE
1f850 41 52 43 48 20 54 41 42 4c 45 20 2a 20 55 53 49  ARCH TABLE * USI
1f860 4e 47 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  NG INTEGER PRIMA
1f870 52 59 20 4b 45 59 20 28 72 6f 77 69 64 3d 3f 29  RY KEY (rowid=?)
1f880 22 3b 0a 0a 20 20 66 6f 72 28 69 3d 32 3b 20 69  ";..  for(i=2; i
1f890 3c 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20  <nArg; i++){.   
1f8a0 20 69 6e 74 20 6e 20 3d 20 28 69 6e 74 29 73 74   int n = (int)st
1f8b0 72 6c 65 6e 28 61 7a 41 72 67 5b 69 5d 29 3b 0a  rlen(azArg[i]);.
1f8c0 20 20 20 20 69 66 28 20 6e 3e 31 20 26 26 20 73      if( n>1 && s
1f8d0 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28  qlite3_strnicmp(
1f8e0 22 2d 76 65 72 62 6f 73 65 22 2c 20 61 7a 41 72  "-verbose", azAr
1f8f0 67 5b 69 5d 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  g[i], n)==0 ){. 
1f900 20 20 20 20 20 62 56 65 72 62 6f 73 65 20 3d 20       bVerbose = 
1f910 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  1;.    }.    els
1f920 65 20 69 66 28 20 6e 3e 31 20 26 26 20 73 71 6c  e if( n>1 && sql
1f930 69 74 65 33 5f 73 74 72 6e 69 63 6d 70 28 22 2d  ite3_strnicmp("-
1f940 67 72 6f 75 70 62 79 70 61 72 65 6e 74 22 2c 20  groupbyparent", 
1f950 61 7a 41 72 67 5b 69 5d 2c 20 6e 29 3d 3d 30 20  azArg[i], n)==0 
1f960 29 7b 0a 20 20 20 20 20 20 62 47 72 6f 75 70 42  ){.      bGroupB
1f970 79 50 61 72 65 6e 74 20 3d 20 31 3b 0a 20 20 20  yParent = 1;.   
1f980 20 20 20 7a 49 6e 64 65 6e 74 20 3d 20 22 20 20     zIndent = "  
1f990 20 20 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65    ";.    }.    e
1f9a0 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
1f9b0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
1f9c0 73 61 67 65 3a 20 25 73 20 25 73 20 3f 2d 76 65  sage: %s %s ?-ve
1f9d0 72 62 6f 73 65 3f 20 3f 2d 67 72 6f 75 70 62 79  rbose? ?-groupby
1f9e0 70 61 72 65 6e 74 3f 5c 6e 22 2c 0a 20 20 20 20  parent?\n",.    
1f9f0 20 20 20 20 20 20 61 7a 41 72 67 5b 30 5d 2c 20        azArg[0], 
1fa00 61 7a 41 72 67 5b 31 5d 0a 20 20 20 20 20 20 29  azArg[1].      )
1fa10 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  ;.      return S
1fa20 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20  QLITE_ERROR;.   
1fa30 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 67   }.  }..  /* Reg
1fa40 69 73 74 65 72 20 74 68 65 20 66 6b 65 79 5f 63  ister the fkey_c
1fa50 6f 6c 6c 61 74 65 5f 63 6c 61 75 73 65 28 29 20  ollate_clause() 
1fa60 53 51 4c 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  SQL function */.
1fa70 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 63    rc = sqlite3_c
1fa80 72 65 61 74 65 5f 66 75 6e 63 74 69 6f 6e 28 64  reate_function(d
1fa90 62 2c 20 22 66 6b 65 79 5f 63 6f 6c 6c 61 74 65  b, "fkey_collate
1faa0 5f 63 6c 61 75 73 65 22 2c 20 34 2c 20 53 51 4c  _clause", 4, SQL
1fab0 49 54 45 5f 55 54 46 38 2c 0a 20 20 20 20 20 20  ITE_UTF8,.      
1fac0 30 2c 20 73 68 65 6c 6c 46 6b 65 79 43 6f 6c 6c  0, shellFkeyColl
1fad0 61 74 65 43 6c 61 75 73 65 2c 20 30 2c 20 30 0a  ateClause, 0, 0.
1fae0 20 20 29 3b 0a 0a 0a 20 20 69 66 28 20 72 63 3d    );...  if( rc=
1faf0 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1fb00 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
1fb10 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20 7a 53  repare_v2(db, zS
1fb20 71 6c 2c 20 2d 31 2c 20 26 70 53 71 6c 2c 20 30  ql, -1, &pSql, 0
1fb30 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 72 63 3d  );.  }.  if( rc=
1fb40 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
1fb50 20 20 73 71 6c 69 74 65 33 5f 62 69 6e 64 5f 69    sqlite3_bind_i
1fb60 6e 74 28 70 53 71 6c 2c 20 31 2c 20 62 47 72 6f  nt(pSql, 1, bGro
1fb70 75 70 42 79 50 61 72 65 6e 74 29 3b 0a 20 20 7d  upByParent);.  }
1fb80 0a 0a 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  ..  if( rc==SQLI
1fb90 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 69 6e 74  TE_OK ){.    int
1fba0 20 72 63 32 3b 0a 20 20 20 20 63 68 61 72 20 2a   rc2;.    char *
1fbb0 7a 50 72 65 76 20 3d 20 30 3b 0a 20 20 20 20 77  zPrev = 0;.    w
1fbc0 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57  hile( SQLITE_ROW
1fbd0 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
1fbe0 53 71 6c 29 20 29 7b 0a 20 20 20 20 20 20 69 6e  Sql) ){.      in
1fbf0 74 20 72 65 73 20 3d 20 2d 31 3b 0a 20 20 20 20  t res = -1;.    
1fc00 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a    sqlite3_stmt *
1fc10 70 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20  pExplain = 0;.  
1fc20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
1fc30 7a 45 51 50 20 3d 20 28 63 6f 6e 73 74 20 63 68  zEQP = (const ch
1fc40 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75  ar*)sqlite3_colu
1fc50 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 30 29  mn_text(pSql, 0)
1fc60 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
1fc70 61 72 20 2a 7a 47 6c 6f 62 20 3d 20 28 63 6f 6e  ar *zGlob = (con
1fc80 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33  st char*)sqlite3
1fc90 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71  _column_text(pSq
1fca0 6c 2c 20 31 29 3b 0a 20 20 20 20 20 20 63 6f 6e  l, 1);.      con
1fcb0 73 74 20 63 68 61 72 20 2a 7a 46 72 6f 6d 20 3d  st char *zFrom =
1fcc0 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
1fcd0 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
1fce0 74 28 70 53 71 6c 2c 20 32 29 3b 0a 20 20 20 20  t(pSql, 2);.    
1fcf0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
1fd00 61 72 67 65 74 20 3d 20 28 63 6f 6e 73 74 20 63  arget = (const c
1fd10 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
1fd20 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c 2c 20 33  umn_text(pSql, 3
1fd30 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  );.      const c
1fd40 68 61 72 20 2a 7a 43 49 20 3d 20 28 63 6f 6e 73  har *zCI = (cons
1fd50 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
1fd60 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 71 6c  column_text(pSql
1fd70 2c 20 34 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73  , 4);.      cons
1fd80 74 20 63 68 61 72 20 2a 7a 50 61 72 65 6e 74 20  t char *zParent 
1fd90 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
1fda0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
1fdb0 78 74 28 70 53 71 6c 2c 20 35 29 3b 0a 0a 20 20  xt(pSql, 5);..  
1fdc0 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
1fdd0 5f 70 72 65 70 61 72 65 5f 76 32 28 64 62 2c 20  _prepare_v2(db, 
1fde0 7a 45 51 50 2c 20 2d 31 2c 20 26 70 45 78 70 6c  zEQP, -1, &pExpl
1fdf0 61 69 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  ain, 0);.      i
1fe00 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f 4b  f( rc!=SQLITE_OK
1fe10 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
1fe20 69 66 28 20 53 51 4c 49 54 45 5f 52 4f 57 3d 3d  if( SQLITE_ROW==
1fe30 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 45 78  sqlite3_step(pEx
1fe40 70 6c 61 69 6e 29 20 29 7b 0a 20 20 20 20 20 20  plain) ){.      
1fe50 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 50    const char *zP
1fe60 6c 61 6e 20 3d 20 28 63 6f 6e 73 74 20 63 68 61  lan = (const cha
1fe70 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d  r*)sqlite3_colum
1fe80 6e 5f 74 65 78 74 28 70 45 78 70 6c 61 69 6e 2c  n_text(pExplain,
1fe90 20 33 29 3b 0a 20 20 20 20 20 20 20 20 72 65 73   3);.        res
1fea0 20 3d 20 28 0a 20 20 20 20 20 20 20 20 20 20 20   = (.           
1feb0 20 20 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74     0==sqlite3_st
1fec0 72 67 6c 6f 62 28 7a 47 6c 6f 62 2c 20 7a 50 6c  rglob(zGlob, zPl
1fed0 61 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c  an).           |
1fee0 7c 20 30 3d 3d 73 71 6c 69 74 65 33 5f 73 74 72  | 0==sqlite3_str
1fef0 67 6c 6f 62 28 7a 47 6c 6f 62 49 50 4b 2c 20 7a  glob(zGlobIPK, z
1ff00 50 6c 61 6e 29 0a 20 20 20 20 20 20 20 20 29 3b  Plan).        );
1ff10 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
1ff20 63 20 3d 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  c = sqlite3_fina
1ff30 6c 69 7a 65 28 70 45 78 70 6c 61 69 6e 29 3b 0a  lize(pExplain);.
1ff40 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
1ff50 4c 49 54 45 5f 4f 4b 20 29 20 62 72 65 61 6b 3b  LITE_OK ) break;
1ff60 0a 0a 20 20 20 20 20 20 69 66 28 20 72 65 73 3c  ..      if( res<
1ff70 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  0 ){.        raw
1ff80 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
1ff90 22 45 72 72 6f 72 3a 20 69 6e 74 65 72 6e 61 6c  "Error: internal
1ffa0 20 65 72 72 6f 72 22 29 3b 0a 20 20 20 20 20 20   error");.      
1ffb0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
1ffc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 66  else{.        if
1ffd0 28 20 62 47 72 6f 75 70 42 79 50 61 72 65 6e 74  ( bGroupByParent
1ffe0 0a 20 20 20 20 20 20 20 20 26 26 20 28 62 56 65  .        && (bVe
1fff0 72 62 6f 73 65 20 7c 7c 20 72 65 73 3d 3d 30 29  rbose || res==0)
20000 0a 20 20 20 20 20 20 20 20 26 26 20 28 7a 50 72  .        && (zPr
20010 65 76 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33  ev==0 || sqlite3
20020 5f 73 74 72 69 63 6d 70 28 7a 50 61 72 65 6e 74  _stricmp(zParent
20030 2c 20 7a 50 72 65 76 29 29 0a 20 20 20 20 20 20  , zPrev)).      
20040 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72    ){.          r
20050 61 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22  aw_printf(out, "
20060 2d 2d 20 50 61 72 65 6e 74 20 74 61 62 6c 65 20  -- Parent table 
20070 25 73 5c 6e 22 2c 20 7a 50 61 72 65 6e 74 29 3b  %s\n", zParent);
20080 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
20090 65 33 5f 66 72 65 65 28 7a 50 72 65 76 29 3b 0a  e3_free(zPrev);.
200a0 20 20 20 20 20 20 20 20 20 20 7a 50 72 65 76 20            zPrev 
200b0 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
200c0 66 28 22 25 73 22 2c 20 7a 50 61 72 65 6e 74 29  f("%s", zParent)
200d0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
200e0 20 20 20 20 20 69 66 28 20 72 65 73 3d 3d 30 20       if( res==0 
200f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  ){.          raw
20100 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25 73  _printf(out, "%s
20110 25 73 20 2d 2d 3e 20 25 73 5c 6e 22 2c 20 7a 49  %s --> %s\n", zI
20120 6e 64 65 6e 74 2c 20 7a 43 49 2c 20 7a 54 61 72  ndent, zCI, zTar
20130 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  get);.        }e
20140 6c 73 65 20 69 66 28 20 62 56 65 72 62 6f 73 65  lse if( bVerbose
20150 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61   ){.          ra
20160 77 5f 70 72 69 6e 74 66 28 6f 75 74 2c 20 22 25  w_printf(out, "%
20170 73 2f 2a 20 6e 6f 20 65 78 74 72 61 20 69 6e 64  s/* no extra ind
20180 65 78 65 73 20 72 65 71 75 69 72 65 64 20 66 6f  exes required fo
20190 72 20 25 73 20 2d 3e 20 25 73 20 2a 2f 5c 6e 22  r %s -> %s */\n"
201a0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
201b0 7a 49 6e 64 65 6e 74 2c 20 7a 46 72 6f 6d 2c 20  zIndent, zFrom, 
201c0 7a 54 61 72 67 65 74 0a 20 20 20 20 20 20 20 20  zTarget.        
201d0 20 20 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20    );.        }. 
201e0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
201f0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 50   sqlite3_free(zP
20200 72 65 76 29 3b 0a 0a 20 20 20 20 69 66 28 20 72  rev);..    if( r
20210 63 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  c!=SQLITE_OK ){.
20220 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
20230 28 73 74 64 65 72 72 2c 20 22 25 73 5c 6e 22 2c  (stderr, "%s\n",
20240 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
20250 64 62 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  db));.    }..   
20260 20 72 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 66   rc2 = sqlite3_f
20270 69 6e 61 6c 69 7a 65 28 70 53 71 6c 29 3b 0a 20  inalize(pSql);. 
20280 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49 54     if( rc==SQLIT
20290 45 5f 4f 4b 20 26 26 20 72 63 32 21 3d 53 51 4c  E_OK && rc2!=SQL
202a0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
202b0 72 63 20 3d 20 72 63 32 3b 0a 20 20 20 20 20 20  rc = rc2;.      
202c0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
202d0 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71 6c 69 74  r, "%s\n", sqlit
202e0 65 33 5f 65 72 72 6d 73 67 28 64 62 29 29 3b 0a  e3_errmsg(db));.
202f0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20      }.  }else{. 
20300 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
20310 64 65 72 72 2c 20 22 25 73 5c 6e 22 2c 20 73 71  derr, "%s\n", sq
20320 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 64 62 29  lite3_errmsg(db)
20330 29 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72 6e  );.  }..  return
20340 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d   rc;.}../*.** Im
20350 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20  plementation of 
20360 22 2e 6c 69 6e 74 22 20 64 6f 74 20 63 6f 6d 6d  ".lint" dot comm
20370 61 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  and..*/.static i
20380 6e 74 20 6c 69 6e 74 44 6f 74 43 6f 6d 6d 61 6e  nt lintDotComman
20390 64 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65 20  d(.  ShellState 
203a0 2a 70 53 74 61 74 65 2c 20 20 20 20 20 20 20 20  *pState,        
203b0 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 20       /* Current 
203c0 73 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74 65  shell tool state
203d0 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a 41   */.  char **azA
203e0 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  rg,             
203f0 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20 6f        /* Array o
20400 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73 73  f arguments pass
20410 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61 6e  ed to dot comman
20420 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 20  d */.  int nArg 
20430 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
20440 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
20450 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20 61   of entries in a
20460 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20 69  zArg[] */.){.  i
20470 6e 74 20 6e 3b 0a 20 20 6e 20 3d 20 28 6e 41 72  nt n;.  n = (nAr
20480 67 3e 3d 32 20 3f 20 28 69 6e 74 29 73 74 72 6c  g>=2 ? (int)strl
20490 65 6e 28 61 7a 41 72 67 5b 31 5d 29 20 3a 20 30  en(azArg[1]) : 0
204a0 29 3b 0a 20 20 69 66 28 20 6e 3c 31 20 7c 7c 20  );.  if( n<1 || 
204b0 73 71 6c 69 74 65 33 5f 73 74 72 6e 69 63 6d 70  sqlite3_strnicmp
204c0 28 61 7a 41 72 67 5b 31 5d 2c 20 22 66 6b 65 79  (azArg[1], "fkey
204d0 2d 69 6e 64 65 78 65 73 22 2c 20 6e 29 20 29 20  -indexes", n) ) 
204e0 67 6f 74 6f 20 75 73 61 67 65 3b 0a 20 20 72 65  goto usage;.  re
204f0 74 75 72 6e 20 6c 69 6e 74 46 6b 65 79 49 6e 64  turn lintFkeyInd
20500 65 78 65 73 28 70 53 74 61 74 65 2c 20 61 7a 41  exes(pState, azA
20510 72 67 2c 20 6e 41 72 67 29 3b 0a 0a 20 75 73 61  rg, nArg);.. usa
20520 67 65 3a 0a 20 20 72 61 77 5f 70 72 69 6e 74 66  ge:.  raw_printf
20530 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 20  (stderr, "Usage 
20540 25 73 20 73 75 62 2d 63 6f 6d 6d 61 6e 64 20 3f  %s sub-command ?
20550 73 77 69 74 63 68 65 73 2e 2e 2e 3f 5c 6e 22 2c  switches...?\n",
20560 20 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 72 61   azArg[0]);.  ra
20570 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
20580 20 22 57 68 65 72 65 20 73 75 62 2d 63 6f 6d 6d   "Where sub-comm
20590 61 6e 64 73 20 61 72 65 3a 5c 6e 22 29 3b 0a 20  ands are:\n");. 
205a0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
205b0 72 72 2c 20 22 20 20 20 20 66 6b 65 79 2d 69 6e  rr, "    fkey-in
205c0 64 65 78 65 73 5c 6e 22 29 3b 0a 20 20 72 65 74  dexes\n");.  ret
205d0 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  urn SQLITE_ERROR
205e0 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 6d 70 6c 65  ;.}../*.** Imple
205f0 6d 65 6e 74 61 74 69 6f 6e 20 6f 66 20 22 2e 65  mentation of ".e
20600 78 70 65 72 74 22 20 64 6f 74 20 63 6f 6d 6d 61  xpert" dot comma
20610 6e 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  nd..*/.static in
20620 74 20 65 78 70 65 72 74 44 6f 74 43 6f 6d 6d 61  t expertDotComma
20630 6e 64 28 0a 20 20 53 68 65 6c 6c 53 74 61 74 65  nd(.  ShellState
20640 20 2a 70 53 74 61 74 65 2c 20 20 20 20 20 20 20   *pState,       
20650 20 20 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74        /* Current
20660 20 73 68 65 6c 6c 20 74 6f 6f 6c 20 73 74 61 74   shell tool stat
20670 65 20 2a 2f 0a 20 20 63 68 61 72 20 2a 2a 61 7a  e */.  char **az
20680 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 20 20  Arg,            
20690 20 20 20 20 20 20 20 2f 2a 20 41 72 72 61 79 20         /* Array 
206a0 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 70 61 73  of arguments pas
206b0 73 65 64 20 74 6f 20 64 6f 74 20 63 6f 6d 6d 61  sed to dot comma
206c0 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67  nd */.  int nArg
206d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
206e0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
206f0 72 20 6f 66 20 65 6e 74 72 69 65 73 20 69 6e 20  r of entries in 
20700 61 7a 41 72 67 5b 5d 20 2a 2f 0a 29 7b 0a 20 20  azArg[] */.){.  
20710 69 6e 74 20 72 63 20 3d 20 53 51 4c 49 54 45 5f  int rc = SQLITE_
20720 4f 4b 3b 0a 20 20 63 68 61 72 20 2a 7a 45 72 72  OK;.  char *zErr
20730 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20   = 0;.  int i;. 
20740 20 69 6e 74 20 69 53 61 6d 70 6c 65 20 3d 20 30   int iSample = 0
20750 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 53 74  ;..  assert( pSt
20760 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45 78 70  ate->expert.pExp
20770 65 72 74 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73  ert==0 );.  mems
20780 65 74 28 26 70 53 74 61 74 65 2d 3e 65 78 70 65  et(&pState->expe
20790 72 74 2c 20 30 2c 20 73 69 7a 65 6f 66 28 45 78  rt, 0, sizeof(Ex
207a0 70 65 72 74 49 6e 66 6f 29 29 3b 0a 0a 20 20 66  pertInfo));..  f
207b0 6f 72 28 69 3d 31 3b 20 72 63 3d 3d 53 51 4c 49  or(i=1; rc==SQLI
207c0 54 45 5f 4f 4b 20 26 26 20 69 3c 6e 41 72 67 3b  TE_OK && i<nArg;
207d0 20 69 2b 2b 29 7b 0a 20 20 20 20 63 68 61 72 20   i++){.    char 
207e0 2a 7a 20 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20  *z = azArg[i];. 
207f0 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 69 66     int n;.    if
20800 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 26 26 20 7a  ( z[0]=='-' && z
20810 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b 3b 0a  [1]=='-' ) z++;.
20820 20 20 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30      n = strlen30
20830 28 7a 29 3b 0a 20 20 20 20 69 66 28 20 6e 3e 3d  (z);.    if( n>=
20840 32 20 26 26 20 30 3d 3d 73 74 72 6e 63 6d 70 28  2 && 0==strncmp(
20850 7a 2c 20 22 2d 76 65 72 62 6f 73 65 22 2c 20 6e  z, "-verbose", n
20860 29 20 29 7b 0a 20 20 20 20 20 20 70 53 74 61 74  ) ){.      pStat
20870 65 2d 3e 65 78 70 65 72 74 2e 62 56 65 72 62 6f  e->expert.bVerbo
20880 73 65 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  se = 1;.    }.  
20890 20 20 65 6c 73 65 20 69 66 28 20 6e 3e 3d 32 20    else if( n>=2 
208a0 26 26 20 30 3d 3d 73 74 72 6e 63 6d 70 28 7a 2c  && 0==strncmp(z,
208b0 20 22 2d 73 61 6d 70 6c 65 22 2c 20 6e 29 20 29   "-sample", n) )
208c0 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3d 3d 28  {.      if( i==(
208d0 6e 41 72 67 2d 31 29 20 29 7b 0a 20 20 20 20 20  nArg-1) ){.     
208e0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
208f0 64 65 72 72 2c 20 22 6f 70 74 69 6f 6e 20 72 65  derr, "option re
20900 71 75 69 72 65 73 20 61 6e 20 61 72 67 75 6d 65  quires an argume
20910 6e 74 3a 20 25 73 5c 6e 22 2c 20 7a 29 3b 0a 20  nt: %s\n", z);. 
20920 20 20 20 20 20 20 20 72 63 20 3d 20 53 51 4c 49         rc = SQLI
20930 54 45 5f 45 52 52 4f 52 3b 0a 20 20 20 20 20 20  TE_ERROR;.      
20940 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
20950 53 61 6d 70 6c 65 20 3d 20 28 69 6e 74 29 69 6e  Sample = (int)in
20960 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67  tegerValue(azArg
20970 5b 2b 2b 69 5d 29 3b 0a 20 20 20 20 20 20 20 20  [++i]);.        
20980 69 66 28 20 69 53 61 6d 70 6c 65 3c 30 20 7c 7c  if( iSample<0 ||
20990 20 69 53 61 6d 70 6c 65 3e 31 30 30 20 29 7b 0a   iSample>100 ){.
209a0 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
209b0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 76 61  intf(stderr, "va
209c0 6c 75 65 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  lue out of range
209d0 3a 20 25 73 5c 6e 22 2c 20 61 7a 41 72 67 5b 69  : %s\n", azArg[i
209e0 5d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63  ]);.          rc
209f0 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
20a00 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
20a10 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73   }.    }.    els
20a20 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
20a30 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e 6b  ntf(stderr, "unk
20a40 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25 73 5c  nown option: %s\
20a50 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 72 63  n", z);.      rc
20a60 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
20a70 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
20a80 28 20 72 63 3d 3d 53 51 4c 49 54 45 5f 4f 4b 20  ( rc==SQLITE_OK 
20a90 29 7b 0a 20 20 20 20 70 53 74 61 74 65 2d 3e 65  ){.    pState->e
20aa0 78 70 65 72 74 2e 70 45 78 70 65 72 74 20 3d 20  xpert.pExpert = 
20ab0 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74 5f 6e  sqlite3_expert_n
20ac0 65 77 28 70 53 74 61 74 65 2d 3e 64 62 2c 20 26  ew(pState->db, &
20ad0 7a 45 72 72 29 3b 0a 20 20 20 20 69 66 28 20 70  zErr);.    if( p
20ae0 53 74 61 74 65 2d 3e 65 78 70 65 72 74 2e 70 45  State->expert.pE
20af0 78 70 65 72 74 3d 3d 30 20 29 7b 0a 20 20 20 20  xpert==0 ){.    
20b00 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
20b10 65 72 72 2c 20 22 73 71 6c 69 74 65 33 5f 65 78  err, "sqlite3_ex
20b20 70 65 72 74 5f 6e 65 77 3a 20 25 73 5c 6e 22 2c  pert_new: %s\n",
20b30 20 7a 45 72 72 29 3b 0a 20 20 20 20 20 20 72 63   zErr);.      rc
20b40 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b   = SQLITE_ERROR;
20b50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
20b60 20 20 73 71 6c 69 74 65 33 5f 65 78 70 65 72 74    sqlite3_expert
20b70 5f 63 6f 6e 66 69 67 28 0a 20 20 20 20 20 20 20  _config(.       
20b80 20 20 20 70 53 74 61 74 65 2d 3e 65 78 70 65 72     pState->exper
20b90 74 2e 70 45 78 70 65 72 74 2c 20 45 58 50 45 52  t.pExpert, EXPER
20ba0 54 5f 43 4f 4e 46 49 47 5f 53 41 4d 50 4c 45 2c  T_CONFIG_SAMPLE,
20bb0 20 69 53 61 6d 70 6c 65 0a 20 20 20 20 20 20 29   iSample.      )
20bc0 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 72  ;.    }.  }..  r
20bd0 65 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 0a 0a 2f  eturn rc;.}..../
20be0 2a 0a 2a 2a 20 49 66 20 61 6e 20 69 6e 70 75 74  *.** If an input
20bf0 20 6c 69 6e 65 20 62 65 67 69 6e 73 20 77 69 74   line begins wit
20c00 68 20 22 2e 22 20 74 68 65 6e 20 69 6e 76 6f 6b  h "." then invok
20c10 65 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 74  e this routine t
20c20 6f 0a 2a 2a 20 70 72 6f 63 65 73 73 20 74 68 61  o.** process tha
20c30 74 20 6c 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 52 65  t line..**.** Re
20c40 74 75 72 6e 20 31 20 6f 6e 20 65 72 72 6f 72 2c  turn 1 on error,
20c50 20 32 20 74 6f 20 65 78 69 74 2c 20 61 6e 64 20   2 to exit, and 
20c60 30 20 6f 74 68 65 72 77 69 73 65 2e 0a 2a 2f 0a  0 otherwise..*/.
20c70 73 74 61 74 69 63 20 69 6e 74 20 64 6f 5f 6d 65  static int do_me
20c80 74 61 5f 63 6f 6d 6d 61 6e 64 28 63 68 61 72 20  ta_command(char 
20c90 2a 7a 4c 69 6e 65 2c 20 53 68 65 6c 6c 53 74 61  *zLine, ShellSta
20ca0 74 65 20 2a 70 29 7b 0a 20 20 69 6e 74 20 68 20  te *p){.  int h 
20cb0 3d 20 31 3b 0a 20 20 69 6e 74 20 6e 41 72 67 20  = 1;.  int nArg 
20cc0 3d 20 30 3b 0a 20 20 69 6e 74 20 6e 2c 20 63 3b  = 0;.  int n, c;
20cd0 0a 20 20 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20  .  int rc = 0;. 
20ce0 20 63 68 61 72 20 2a 61 7a 41 72 67 5b 35 30 5d   char *azArg[50]
20cf0 3b 0a 0a 20 20 69 66 28 20 70 2d 3e 65 78 70 65  ;..  if( p->expe
20d00 72 74 2e 70 45 78 70 65 72 74 20 29 7b 0a 20 20  rt.pExpert ){.  
20d10 20 20 65 78 70 65 72 74 46 69 6e 69 73 68 28 70    expertFinish(p
20d20 2c 20 31 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20  , 1, 0);.  }..  
20d30 2f 2a 20 50 61 72 73 65 20 74 68 65 20 69 6e 70  /* Parse the inp
20d40 75 74 20 6c 69 6e 65 20 69 6e 74 6f 20 74 6f 6b  ut line into tok
20d50 65 6e 73 2e 0a 20 20 2a 2f 0a 20 20 77 68 69 6c  ens..  */.  whil
20d60 65 28 20 7a 4c 69 6e 65 5b 68 5d 20 26 26 20 6e  e( zLine[h] && n
20d70 41 72 67 3c 41 72 72 61 79 53 69 7a 65 28 61 7a  Arg<ArraySize(az
20d80 41 72 67 29 20 29 7b 0a 20 20 20 20 77 68 69 6c  Arg) ){.    whil
20d90 65 28 20 49 73 53 70 61 63 65 28 7a 4c 69 6e 65  e( IsSpace(zLine
20da0 5b 68 5d 29 20 29 7b 20 68 2b 2b 3b 20 7d 0a 20  [h]) ){ h++; }. 
20db0 20 20 20 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d     if( zLine[h]=
20dc0 3d 30 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  =0 ) break;.    
20dd0 69 66 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 27 5c  if( zLine[h]=='\
20de0 27 27 20 7c 7c 20 7a 4c 69 6e 65 5b 68 5d 3d 3d  '' || zLine[h]==
20df0 27 22 27 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  '"' ){.      int
20e00 20 64 65 6c 69 6d 20 3d 20 7a 4c 69 6e 65 5b 68   delim = zLine[h
20e10 2b 2b 5d 3b 0a 20 20 20 20 20 20 61 7a 41 72 67  ++];.      azArg
20e20 5b 6e 41 72 67 2b 2b 5d 20 3d 20 26 7a 4c 69 6e  [nArg++] = &zLin
20e30 65 5b 68 5d 3b 0a 20 20 20 20 20 20 77 68 69 6c  e[h];.      whil
20e40 65 28 20 7a 4c 69 6e 65 5b 68 5d 20 26 26 20 7a  e( zLine[h] && z
20e50 4c 69 6e 65 5b 68 5d 21 3d 64 65 6c 69 6d 20 29  Line[h]!=delim )
20e60 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 4c  {.        if( zL
20e70 69 6e 65 5b 68 5d 3d 3d 27 5c 5c 27 20 26 26 20  ine[h]=='\\' && 
20e80 64 65 6c 69 6d 3d 3d 27 22 27 20 26 26 20 7a 4c  delim=='"' && zL
20e90 69 6e 65 5b 68 2b 31 5d 21 3d 30 20 29 20 68 2b  ine[h+1]!=0 ) h+
20ea0 2b 3b 0a 20 20 20 20 20 20 20 20 68 2b 2b 3b 0a  +;.        h++;.
20eb0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
20ec0 28 20 7a 4c 69 6e 65 5b 68 5d 3d 3d 64 65 6c 69  ( zLine[h]==deli
20ed0 6d 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4c 69  m ){.        zLi
20ee0 6e 65 5b 68 2b 2b 5d 20 3d 20 30 3b 0a 20 20 20  ne[h++] = 0;.   
20ef0 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 64     }.      if( d
20f00 65 6c 69 6d 3d 3d 27 22 27 20 29 20 72 65 73 6f  elim=='"' ) reso
20f10 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68 65 73 28  lve_backslashes(
20f20 61 7a 41 72 67 5b 6e 41 72 67 2d 31 5d 29 3b 0a  azArg[nArg-1]);.
20f30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20f40 20 61 7a 41 72 67 5b 6e 41 72 67 2b 2b 5d 20 3d   azArg[nArg++] =
20f50 20 26 7a 4c 69 6e 65 5b 68 5d 3b 0a 20 20 20 20   &zLine[h];.    
20f60 20 20 77 68 69 6c 65 28 20 7a 4c 69 6e 65 5b 68    while( zLine[h
20f70 5d 20 26 26 20 21 49 73 53 70 61 63 65 28 7a 4c  ] && !IsSpace(zL
20f80 69 6e 65 5b 68 5d 29 20 29 7b 20 68 2b 2b 3b 20  ine[h]) ){ h++; 
20f90 7d 0a 20 20 20 20 20 20 69 66 28 20 7a 4c 69 6e  }.      if( zLin
20fa0 65 5b 68 5d 20 29 20 7a 4c 69 6e 65 5b 68 2b 2b  e[h] ) zLine[h++
20fb0 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 73  ] = 0;.      res
20fc0 6f 6c 76 65 5f 62 61 63 6b 73 6c 61 73 68 65 73  olve_backslashes
20fd0 28 61 7a 41 72 67 5b 6e 41 72 67 2d 31 5d 29 3b  (azArg[nArg-1]);
20fe0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
20ff0 20 50 72 6f 63 65 73 73 20 74 68 65 20 69 6e 70   Process the inp
21000 75 74 20 6c 69 6e 65 2e 0a 20 20 2a 2f 0a 20 20  ut line..  */.  
21010 69 66 28 20 6e 41 72 67 3d 3d 30 20 29 20 72 65  if( nArg==0 ) re
21020 74 75 72 6e 20 30 3b 20 2f 2a 20 6e 6f 20 74 6f  turn 0; /* no to
21030 6b 65 6e 73 2c 20 6e 6f 20 65 72 72 6f 72 20 2a  kens, no error *
21040 2f 0a 20 20 6e 20 3d 20 73 74 72 6c 65 6e 33 30  /.  n = strlen30
21050 28 61 7a 41 72 67 5b 30 5d 29 3b 0a 20 20 63 20  (azArg[0]);.  c 
21060 3d 20 61 7a 41 72 67 5b 30 5d 5b 30 5d 3b 0a 0a  = azArg[0][0];..
21070 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
21080 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
21090 4e 0a 20 20 69 66 28 20 63 3d 3d 27 61 27 20 26  N.  if( c=='a' &
210a0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
210b0 30 5d 2c 20 22 61 75 74 68 22 2c 20 6e 29 3d 3d  0], "auth", n)==
210c0 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72  0 ){.    if( nAr
210d0 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 61  g!=2 ){.      ra
210e0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
210f0 20 22 55 73 61 67 65 3a 20 2e 61 75 74 68 20 4f   "Usage: .auth O
21100 4e 7c 4f 46 46 5c 6e 22 29 3b 0a 20 20 20 20 20  N|OFF\n");.     
21110 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67   rc = 1;.      g
21120 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
21130 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
21140 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a   open_db(p, 0);.
21150 20 20 20 20 69 66 28 20 62 6f 6f 6c 65 61 6e 56      if( booleanV
21160 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 20 29  alue(azArg[1]) )
21170 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f  {.      sqlite3_
21180 73 65 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70  set_authorizer(p
21190 2d 3e 64 62 2c 20 73 68 65 6c 6c 41 75 74 68 2c  ->db, shellAuth,
211a0 20 70 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   p);.    }else{.
211b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 65        sqlite3_se
211c0 74 5f 61 75 74 68 6f 72 69 7a 65 72 28 70 2d 3e  t_authorizer(p->
211d0 64 62 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 7d  db, 0, 0);.    }
211e0 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 0a  .  }else.#endif.
211f0 0a 20 20 69 66 28 20 28 63 3d 3d 27 62 27 20 26  .  if( (c=='b' &
21200 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d  & n>=3 && strncm
21210 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 62 61 63  p(azArg[0], "bac
21220 6b 75 70 22 2c 20 6e 29 3d 3d 30 29 0a 20 20 20  kup", n)==0).   
21230 7c 7c 20 28 63 3d 3d 27 73 27 20 26 26 20 6e 3e  || (c=='s' && n>
21240 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =3 && strncmp(az
21250 41 72 67 5b 30 5d 2c 20 22 73 61 76 65 22 2c 20  Arg[0], "save", 
21260 6e 29 3d 3d 30 29 0a 20 20 29 7b 0a 20 20 20 20  n)==0).  ){.    
21270 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 65 73  const char *zDes
21280 74 46 69 6c 65 20 3d 20 30 3b 0a 20 20 20 20 63  tFile = 0;.    c
21290 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 20 3d  onst char *zDb =
212a0 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 20   0;.    sqlite3 
212b0 2a 70 44 65 73 74 3b 0a 20 20 20 20 73 71 6c 69  *pDest;.    sqli
212c0 74 65 33 5f 62 61 63 6b 75 70 20 2a 70 42 61 63  te3_backup *pBac
212d0 6b 75 70 3b 0a 20 20 20 20 69 6e 74 20 6a 3b 0a  kup;.    int j;.
212e0 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a 3c 6e      for(j=1; j<n
212f0 41 72 67 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  Arg; j++){.     
21300 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d   const char *z =
21310 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20 20 20   azArg[j];.     
21320 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29   if( z[0]=='-' )
21330 7b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65 28  {.        while(
21340 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 20 7a 2b 2b   z[0]=='-' ) z++
21350 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 20  ;.        /* No 
21360 6f 70 74 69 6f 6e 73 20 74 6f 20 70 72 6f 63 65  options to proce
21370 73 73 20 61 74 20 74 68 69 73 20 74 69 6d 65 20  ss at this time 
21380 2a 2f 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  */.        {.   
21390 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e         utf8_prin
213a0 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e 6b 6e  tf(stderr, "unkn
213b0 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25 73 5c 6e  own option: %s\n
213c0 22 2c 20 61 7a 41 72 67 5b 6a 5d 29 3b 0a 20 20  ", azArg[j]);.  
213d0 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
213e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
213f0 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 44 65 73    }else if( zDes
21400 74 46 69 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  tFile==0 ){.    
21410 20 20 20 20 7a 44 65 73 74 46 69 6c 65 20 3d 20      zDestFile = 
21420 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20 20 20 20  azArg[j];.      
21430 7d 65 6c 73 65 20 69 66 28 20 7a 44 62 3d 3d 30  }else if( zDb==0
21440 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 44 62 20   ){.        zDb 
21450 3d 20 7a 44 65 73 74 46 69 6c 65 3b 0a 20 20 20  = zDestFile;.   
21460 20 20 20 20 20 7a 44 65 73 74 46 69 6c 65 20 3d       zDestFile =
21470 20 61 7a 41 72 67 5b 6a 5d 3b 0a 20 20 20 20 20   azArg[j];.     
21480 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
21490 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
214a0 72 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 61 72 67  r, "too many arg
214b0 75 6d 65 6e 74 73 20 74 6f 20 2e 62 61 63 6b 75  uments to .backu
214c0 70 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72  p\n");.        r
214d0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
214e0 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a  .    }.    if( z
214f0 44 65 73 74 46 69 6c 65 3d 3d 30 20 29 7b 0a 20  DestFile==0 ){. 
21500 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
21510 73 74 64 65 72 72 2c 20 22 6d 69 73 73 69 6e 67  stderr, "missing
21520 20 46 49 4c 45 4e 41 4d 45 20 61 72 67 75 6d 65   FILENAME argume
21530 6e 74 20 6f 6e 20 2e 62 61 63 6b 75 70 5c 6e 22  nt on .backup\n"
21540 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
21550 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  1;.    }.    if(
21560 20 7a 44 62 3d 3d 30 20 29 20 7a 44 62 20 3d 20   zDb==0 ) zDb = 
21570 22 6d 61 69 6e 22 3b 0a 20 20 20 20 72 63 20 3d  "main";.    rc =
21580 20 73 71 6c 69 74 65 33 5f 6f 70 65 6e 28 7a 44   sqlite3_open(zD
21590 65 73 74 46 69 6c 65 2c 20 26 70 44 65 73 74 29  estFile, &pDest)
215a0 3b 0a 20 20 20 20 69 66 28 20 72 63 21 3d 53 51  ;.    if( rc!=SQ
215b0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
215c0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
215d0 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e  err, "Error: can
215e0 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c  not open \"%s\"\
215f0 6e 22 2c 20 7a 44 65 73 74 46 69 6c 65 29 3b 0a  n", zDestFile);.
21600 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c        sqlite3_cl
21610 6f 73 65 28 70 44 65 73 74 29 3b 0a 20 20 20 20  ose(pDest);.    
21620 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
21630 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  }.    open_db(p,
21640 20 30 29 3b 0a 20 20 20 20 70 42 61 63 6b 75 70   0);.    pBackup
21650 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75   = sqlite3_backu
21660 70 5f 69 6e 69 74 28 70 44 65 73 74 2c 20 22 6d  p_init(pDest, "m
21670 61 69 6e 22 2c 20 70 2d 3e 64 62 2c 20 7a 44 62  ain", p->db, zDb
21680 29 3b 0a 20 20 20 20 69 66 28 20 70 42 61 63 6b  );.    if( pBack
21690 75 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75  up==0 ){.      u
216a0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
216b0 72 2c 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22  r, "Error: %s\n"
216c0 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67  , sqlite3_errmsg
216d0 28 70 44 65 73 74 29 29 3b 0a 20 20 20 20 20 20  (pDest));.      
216e0 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44  sqlite3_close(pD
216f0 65 73 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75  est);.      retu
21700 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 1;.    }.    
21710 77 68 69 6c 65 28 20 20 28 72 63 20 3d 20 73 71  while(  (rc = sq
21720 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f 73 74 65  lite3_backup_ste
21730 70 28 70 42 61 63 6b 75 70 2c 31 30 30 29 29 3d  p(pBackup,100))=
21740 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 7d 0a 20  =SQLITE_OK ){}. 
21750 20 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75     sqlite3_backu
21760 70 5f 66 69 6e 69 73 68 28 70 42 61 63 6b 75 70  p_finish(pBackup
21770 29 3b 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53  );.    if( rc==S
21780 51 4c 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20  QLITE_DONE ){.  
21790 20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20      rc = 0;.    
217a0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 74 66  }else{.      utf
217b0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
217c0 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20   "Error: %s\n", 
217d0 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
217e0 44 65 73 74 29 29 3b 0a 20 20 20 20 20 20 72 63  Dest));.      rc
217f0 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
21800 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 44  sqlite3_close(pD
21810 65 73 74 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  est);.  }else.. 
21820 20 69 66 28 20 63 3d 3d 27 62 27 20 26 26 20 6e   if( c=='b' && n
21830 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61  >=3 && strncmp(a
21840 7a 41 72 67 5b 30 5d 2c 20 22 62 61 69 6c 22 2c  zArg[0], "bail",
21850 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   n)==0 ){.    if
21860 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20  ( nArg==2 ){.   
21870 20 20 20 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f 72     bail_on_error
21880 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28   = booleanValue(
21890 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d  azArg[1]);.    }
218a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f  else{.      raw_
218b0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
218c0 55 73 61 67 65 3a 20 2e 62 61 69 6c 20 6f 6e 7c  Usage: .bail on|
218d0 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  off\n");.      r
218e0 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
218f0 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
21900 62 27 20 26 26 20 6e 3e 3d 33 20 26 26 20 73 74  b' && n>=3 && st
21910 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
21920 22 62 69 6e 61 72 79 22 2c 20 6e 29 3d 3d 30 20  "binary", n)==0 
21930 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  ){.    if( nArg=
21940 3d 32 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =2 ){.      if( 
21950 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41  booleanValue(azA
21960 72 67 5b 31 5d 29 20 29 7b 0a 20 20 20 20 20 20  rg[1]) ){.      
21970 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28    setBinaryMode(
21980 70 2d 3e 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20  p->out, 1);.    
21990 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
219a0 20 73 65 74 54 65 78 74 4d 6f 64 65 28 70 2d 3e   setTextMode(p->
219b0 6f 75 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d  out, 1);.      }
219c0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
219d0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
219e0 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 62 69  err, "Usage: .bi
219f0 6e 61 72 79 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b  nary on|off\n");
21a00 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
21a10 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
21a20 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20 73 74  if( c=='c' && st
21a30 72 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22 63  rcmp(azArg[0],"c
21a40 64 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66  d")==0 ){.    if
21a50 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 23 69 66  ( nArg==2 ){.#if
21a60 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29   defined(_WIN32)
21a70 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33   || defined(WIN3
21a80 32 29 0a 20 20 20 20 20 20 77 63 68 61 72 5f 74  2).      wchar_t
21a90 20 2a 7a 20 3d 20 73 71 6c 69 74 65 33 5f 77 69   *z = sqlite3_wi
21aa0 6e 33 32 5f 75 74 66 38 5f 74 6f 5f 75 6e 69 63  n32_utf8_to_unic
21ab0 6f 64 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  ode(azArg[1]);. 
21ac0 20 20 20 20 20 72 63 20 3d 20 21 53 65 74 43 75       rc = !SetCu
21ad0 72 72 65 6e 74 44 69 72 65 63 74 6f 72 79 57 28  rrentDirectoryW(
21ae0 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  z);.      sqlite
21af0 33 5f 66 72 65 65 28 7a 29 3b 0a 23 65 6c 73 65  3_free(z);.#else
21b00 0a 20 20 20 20 20 20 72 63 20 3d 20 63 68 64 69  .      rc = chdi
21b10 72 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 23 65 6e  r(azArg[1]);.#en
21b20 64 69 66 0a 20 20 20 20 20 20 69 66 28 20 72 63  dif.      if( rc
21b30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38   ){.        utf8
21b40 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
21b50 22 43 61 6e 6e 6f 74 20 63 68 61 6e 67 65 20 74  "Cannot change t
21b60 6f 20 64 69 72 65 63 74 6f 72 79 20 5c 22 25 73  o directory \"%s
21b70 5c 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29  \"\n", azArg[1])
21b80 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
21b90 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
21ba0 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
21bb0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
21bc0 73 61 67 65 3a 20 2e 63 64 20 44 49 52 45 43 54  sage: .cd DIRECT
21bd0 4f 52 59 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  ORY\n");.      r
21be0 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
21bf0 65 6c 73 65 0a 0a 20 20 2f 2a 20 54 68 65 20 75  else..  /* The u
21c00 6e 64 6f 63 75 6d 65 6e 74 65 64 20 22 2e 62 72  ndocumented ".br
21c10 65 61 6b 70 6f 69 6e 74 22 20 63 6f 6d 6d 61 6e  eakpoint" comman
21c20 64 20 63 61 75 73 65 73 20 61 20 63 61 6c 6c 20  d causes a call 
21c30 74 6f 20 74 68 65 20 6e 6f 2d 6f 70 0a 20 20 2a  to the no-op.  *
21c40 2a 20 72 6f 75 74 69 6e 65 20 6e 61 6d 65 64 20  * routine named 
21c50 74 65 73 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28  test_breakpoint(
21c60 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 3d  )..  */.  if( c=
21c70 3d 27 62 27 20 26 26 20 6e 3e 3d 33 20 26 26 20  ='b' && n>=3 && 
21c80 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
21c90 2c 20 22 62 72 65 61 6b 70 6f 69 6e 74 22 2c 20  , "breakpoint", 
21ca0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 74 65 73  n)==0 ){.    tes
21cb0 74 5f 62 72 65 61 6b 70 6f 69 6e 74 28 29 3b 0a  t_breakpoint();.
21cc0 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
21cd0 3d 3d 27 63 27 20 26 26 20 6e 3e 3d 33 20 26 26  =='c' && n>=3 &&
21ce0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
21cf0 5d 2c 20 22 63 68 61 6e 67 65 73 22 2c 20 6e 29  ], "changes", n)
21d00 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
21d10 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg==2 ){.      
21d20 73 65 74 4f 72 43 6c 65 61 72 46 6c 61 67 28 70  setOrClearFlag(p
21d30 2c 20 53 48 46 4c 47 5f 43 6f 75 6e 74 43 68 61  , SHFLG_CountCha
21d40 6e 67 65 73 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  nges, azArg[1]);
21d50 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
21d60 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
21d70 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 63 68  err, "Usage: .ch
21d80 61 6e 67 65 73 20 6f 6e 7c 6f 66 66 5c 6e 22 29  anges on|off\n")
21d90 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
21da0 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20      }.  }else.. 
21db0 20 2f 2a 20 43 61 6e 63 65 6c 20 6f 75 74 70 75   /* Cancel outpu
21dc0 74 20 72 65 64 69 72 65 63 74 69 6f 6e 2c 20 69  t redirection, i
21dd0 66 20 69 74 20 69 73 20 63 75 72 72 65 6e 74 6c  f it is currentl
21de0 79 20 73 65 74 20 28 62 79 20 2e 74 65 73 74 63  y set (by .testc
21df0 61 73 65 29 0a 20 20 2a 2a 20 54 68 65 6e 20 72  ase).  ** Then r
21e00 65 61 64 20 74 68 65 20 63 6f 6e 74 65 6e 74 20  ead the content 
21e10 6f 66 20 74 68 65 20 74 65 73 74 63 61 73 65 2d  of the testcase-
21e20 6f 75 74 2e 74 78 74 20 66 69 6c 65 20 61 6e 64  out.txt file and
21e30 20 63 6f 6d 70 61 72 65 20 61 67 61 69 6e 73 74   compare against
21e40 0a 20 20 2a 2a 20 61 7a 41 72 67 5b 31 5d 2e 20  .  ** azArg[1]. 
21e50 20 49 66 20 74 68 65 72 65 20 61 72 65 20 64 69   If there are di
21e60 66 66 65 72 65 6e 63 65 73 2c 20 72 65 70 6f 72  fferences, repor
21e70 74 20 61 6e 20 65 72 72 6f 72 20 61 6e 64 20 65  t an error and e
21e80 78 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  xit..  */.  if( 
21e90 63 3d 3d 27 63 27 20 26 26 20 6e 3e 3d 33 20 26  c=='c' && n>=3 &
21ea0 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
21eb0 30 5d 2c 20 22 63 68 65 63 6b 22 2c 20 6e 29 3d  0], "check", n)=
21ec0 3d 30 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =0 ){.    char *
21ed0 7a 52 65 73 20 3d 20 30 3b 0a 20 20 20 20 6f 75  zRes = 0;.    ou
21ee0 74 70 75 74 5f 72 65 73 65 74 28 70 29 3b 0a 20  tput_reset(p);. 
21ef0 20 20 20 69 66 28 20 6e 41 72 67 21 3d 32 20 29     if( nArg!=2 )
21f00 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
21f10 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67  tf(stderr, "Usag
21f20 65 3a 20 2e 63 68 65 63 6b 20 47 4c 4f 42 2d 50  e: .check GLOB-P
21f30 41 54 54 45 52 4e 5c 6e 22 29 3b 0a 20 20 20 20  ATTERN\n");.    
21f40 20 20 72 63 20 3d 20 32 3b 0a 20 20 20 20 7d 65    rc = 2;.    }e
21f50 6c 73 65 20 69 66 28 20 28 7a 52 65 73 20 3d 20  lse if( (zRes = 
21f60 72 65 61 64 46 69 6c 65 28 22 74 65 73 74 63 61  readFile("testca
21f70 73 65 2d 6f 75 74 2e 74 78 74 22 2c 20 30 29 29  se-out.txt", 0))
21f80 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77  ==0 ){.      raw
21f90 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
21fa0 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 72  "Error: cannot r
21fb0 65 61 64 20 27 74 65 73 74 63 61 73 65 2d 6f 75  ead 'testcase-ou
21fc0 74 2e 74 78 74 27 5c 6e 22 29 3b 0a 20 20 20 20  t.txt'\n");.    
21fd0 20 20 72 63 20 3d 20 32 3b 0a 20 20 20 20 7d 65    rc = 2;.    }e
21fe0 6c 73 65 20 69 66 28 20 74 65 73 74 63 61 73 65  lse if( testcase
21ff0 5f 67 6c 6f 62 28 61 7a 41 72 67 5b 31 5d 2c 7a  _glob(azArg[1],z
22000 52 65 73 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Res)==0 ){.     
22010 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
22020 65 72 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  err,.           
22030 20 20 20 20 20 20 22 74 65 73 74 63 61 73 65 2d        "testcase-
22040 25 73 20 46 41 49 4c 45 44 5c 6e 20 45 78 70 65  %s FAILED\n Expe
22050 63 74 65 64 3a 20 5b 25 73 5d 5c 6e 20 20 20 20  cted: [%s]\n    
22060 20 20 47 6f 74 3a 20 5b 25 73 5d 5c 6e 22 2c 0a    Got: [%s]\n",.
22070 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22080 20 70 2d 3e 7a 54 65 73 74 63 61 73 65 2c 20 61   p->zTestcase, a
22090 7a 41 72 67 5b 31 5d 2c 20 7a 52 65 73 29 3b 0a  zArg[1], zRes);.
220a0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
220b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75    }else{.      u
220c0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 6f 75  tf8_printf(stdou
220d0 74 2c 20 22 74 65 73 74 63 61 73 65 2d 25 73 20  t, "testcase-%s 
220e0 6f 6b 5c 6e 22 2c 20 70 2d 3e 7a 54 65 73 74 63  ok\n", p->zTestc
220f0 61 73 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 6e  ase);.      p->n
22100 43 68 65 63 6b 2b 2b 3b 0a 20 20 20 20 7d 0a 20  Check++;.    }. 
22110 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
22120 7a 52 65 73 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a  zRes);.  }else..
22130 20 20 69 66 28 20 63 3d 3d 27 63 27 20 26 26 20    if( c=='c' && 
22140 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
22150 2c 20 22 63 6c 6f 6e 65 22 2c 20 6e 29 3d 3d 30  , "clone", n)==0
22160 20 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   ){.    if( nArg
22170 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 74 72 79  ==2 ){.      try
22180 54 6f 43 6c 6f 6e 65 28 70 2c 20 61 7a 41 72 67  ToClone(p, azArg
22190 5b 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  [1]);.    }else{
221a0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
221b0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
221c0 3a 20 2e 63 6c 6f 6e 65 20 46 49 4c 45 4e 41 4d  : .clone FILENAM
221d0 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  E\n");.      rc 
221e0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
221f0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64 27  se..  if( c=='d'
22200 20 26 26 20 6e 3e 31 20 26 26 20 73 74 72 6e 63   && n>1 && strnc
22210 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 64 61  mp(azArg[0], "da
22220 74 61 62 61 73 65 73 22 2c 20 6e 29 3d 3d 30 20  tabases", n)==0 
22230 29 7b 0a 20 20 20 20 53 68 65 6c 6c 53 74 61 74  ){.    ShellStat
22240 65 20 64 61 74 61 3b 0a 20 20 20 20 63 68 61 72  e data;.    char
22250 20 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20   *zErrMsg = 0;. 
22260 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29     open_db(p, 0)
22270 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 26 64 61  ;.    memcpy(&da
22280 74 61 2c 20 70 2c 20 73 69 7a 65 6f 66 28 64 61  ta, p, sizeof(da
22290 74 61 29 29 3b 0a 20 20 20 20 64 61 74 61 2e 73  ta));.    data.s
222a0 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20  howHeader = 0;. 
222b0 20 20 20 64 61 74 61 2e 63 4d 6f 64 65 20 3d 20     data.cMode = 
222c0 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45  data.mode = MODE
222d0 5f 4c 69 73 74 3b 0a 20 20 20 20 73 71 6c 69 74  _List;.    sqlit
222e0 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65  e3_snprintf(size
222f0 6f 66 28 64 61 74 61 2e 63 6f 6c 53 65 70 61 72  of(data.colSepar
22300 61 74 6f 72 29 2c 64 61 74 61 2e 63 6f 6c 53 65  ator),data.colSe
22310 70 61 72 61 74 6f 72 2c 22 3a 20 22 29 3b 0a 20  parator,": ");. 
22320 20 20 20 64 61 74 61 2e 63 6e 74 20 3d 20 30 3b     data.cnt = 0;
22330 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65 78 65  .    sqlite3_exe
22340 63 28 70 2d 3e 64 62 2c 20 22 53 45 4c 45 43 54  c(p->db, "SELECT
22350 20 6e 61 6d 65 2c 20 66 69 6c 65 20 46 52 4f 4d   name, file FROM
22360 20 70 72 61 67 6d 61 5f 64 61 74 61 62 61 73 65   pragma_database
22370 5f 6c 69 73 74 22 2c 0a 20 20 20 20 20 20 20 20  _list",.        
22380 20 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61 63           callbac
22390 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d  k, &data, &zErrM
223a0 73 67 29 3b 0a 20 20 20 20 69 66 28 20 7a 45 72  sg);.    if( zEr
223b0 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 75 74  rMsg ){.      ut
223c0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
223d0 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20  ,"Error: %s\n", 
223e0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
223f0 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72  sqlite3_free(zEr
22400 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 63 20  rMsg);.      rc 
22410 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
22420 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 64 27  se..  if( c=='d'
22430 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
22440 67 5b 30 5d 2c 20 22 64 62 69 6e 66 6f 22 2c 20  g[0], "dbinfo", 
22450 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 72 63 20  n)==0 ){.    rc 
22460 3d 20 73 68 65 6c 6c 5f 64 62 69 6e 66 6f 5f 63  = shell_dbinfo_c
22470 6f 6d 6d 61 6e 64 28 70 2c 20 6e 41 72 67 2c 20  ommand(p, nArg, 
22480 61 7a 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a  azArg);.  }else.
22490 0a 20 20 69 66 28 20 63 3d 3d 27 64 27 20 26 26  .  if( c=='d' &&
224a0 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
224b0 5d 2c 20 22 64 75 6d 70 22 2c 20 6e 29 3d 3d 30  ], "dump", n)==0
224c0 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
224d0 61 72 20 2a 7a 4c 69 6b 65 20 3d 20 30 3b 0a 20  ar *zLike = 0;. 
224e0 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 69 6e     int i;.    in
224f0 74 20 73 61 76 65 64 53 68 6f 77 48 65 61 64 65  t savedShowHeade
22500 72 20 3d 20 70 2d 3e 73 68 6f 77 48 65 61 64 65  r = p->showHeade
22510 72 3b 0a 20 20 20 20 53 68 65 6c 6c 43 6c 65 61  r;.    ShellClea
22520 72 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 50  rFlag(p, SHFLG_P
22530 72 65 73 65 72 76 65 52 6f 77 69 64 7c 53 48 46  reserveRowid|SHF
22540 4c 47 5f 4e 65 77 6c 69 6e 65 73 29 3b 0a 20 20  LG_Newlines);.  
22550 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72    for(i=1; i<nAr
22560 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  g; i++){.      i
22570 66 28 20 61 7a 41 72 67 5b 69 5d 5b 30 5d 3d 3d  f( azArg[i][0]==
22580 27 2d 27 20 29 7b 0a 20 20 20 20 20 20 20 20 63  '-' ){.        c
22590 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61  onst char *z = a
225a0 7a 41 72 67 5b 69 5d 2b 31 3b 0a 20 20 20 20 20  zArg[i]+1;.     
225b0 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27     if( z[0]=='-'
225c0 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20 20   ) z++;.        
225d0 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 70 72  if( strcmp(z,"pr
225e0 65 73 65 72 76 65 2d 72 6f 77 69 64 73 22 29 3d  eserve-rowids")=
225f0 3d 30 20 29 7b 0a 23 69 66 64 65 66 20 53 51 4c  =0 ){.#ifdef SQL
22600 49 54 45 5f 4f 4d 49 54 5f 56 49 52 54 55 41 4c  ITE_OMIT_VIRTUAL
22610 54 41 42 4c 45 0a 20 20 20 20 20 20 20 20 20 20  TABLE.          
22620 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
22630 72 2c 20 22 54 68 65 20 2d 2d 70 72 65 73 65 72  r, "The --preser
22640 76 65 2d 72 6f 77 69 64 73 20 6f 70 74 69 6f 6e  ve-rowids option
22650 20 69 73 20 6e 6f 74 20 63 6f 6d 70 61 74 69 62   is not compatib
22660 6c 65 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  le".            
22670 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22680 20 22 20 77 69 74 68 20 53 51 4c 49 54 45 5f 4f   " with SQLITE_O
22690 4d 49 54 5f 56 49 52 54 55 41 4c 54 41 42 4c 45  MIT_VIRTUALTABLE
226a0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  \n");.          
226b0 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
226c0 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
226d0 61 6e 64 5f 65 78 69 74 3b 0a 23 65 6c 73 65 0a  and_exit;.#else.
226e0 20 20 20 20 20 20 20 20 20 20 53 68 65 6c 6c 53            ShellS
226f0 65 74 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f  etFlag(p, SHFLG_
22700 50 72 65 73 65 72 76 65 52 6f 77 69 64 29 3b 0a  PreserveRowid);.
22710 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d  #endif.        }
22720 65 6c 73 65 0a 20 20 20 20 20 20 20 20 69 66 28  else.        if(
22730 20 73 74 72 63 6d 70 28 7a 2c 22 6e 65 77 6c 69   strcmp(z,"newli
22740 6e 65 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nes")==0 ){.    
22750 20 20 20 20 20 20 53 68 65 6c 6c 53 65 74 46 6c        ShellSetFl
22760 61 67 28 70 2c 20 53 48 46 4c 47 5f 4e 65 77 6c  ag(p, SHFLG_Newl
22770 69 6e 65 73 29 3b 0a 20 20 20 20 20 20 20 20 7d  ines);.        }
22780 65 6c 73 65 0a 20 20 20 20 20 20 20 20 7b 0a 20  else.        {. 
22790 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69           raw_pri
227a0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 6e 6b  ntf(stderr, "Unk
227b0 6e 6f 77 6e 20 6f 70 74 69 6f 6e 20 5c 22 25 73  nown option \"%s
227c0 5c 22 20 6f 6e 20 5c 22 2e 64 75 6d 70 5c 22 5c  \" on \".dump\"\
227d0 6e 22 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20  n", azArg[i]);. 
227e0 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b           rc = 1;
227f0 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74 6f 20  .          goto 
22800 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
22810 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  t;.        }.   
22820 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 4c 69     }else if( zLi
22830 6b 65 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61  ke ){.        ra
22840 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
22850 20 22 55 73 61 67 65 3a 20 2e 64 75 6d 70 20 3f   "Usage: .dump ?
22860 2d 2d 70 72 65 73 65 72 76 65 2d 72 6f 77 69 64  --preserve-rowid
22870 73 3f 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  s? ".           
22880 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
22890 22 3f 2d 2d 6e 65 77 6c 69 6e 65 73 3f 20 3f 4c  "?--newlines? ?L
228a0 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e 22 29  IKE-PATTERN?\n")
228b0 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
228c0 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  ;.        goto m
228d0 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
228e0 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
228f0 20 20 20 20 20 20 20 7a 4c 69 6b 65 20 3d 20 61         zLike = a
22900 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 7d  zArg[i];.      }
22910 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f  .    }.    open_
22920 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 2f 2a  db(p, 0);.    /*
22930 20 57 68 65 6e 20 70 6c 61 79 69 6e 67 20 62 61   When playing ba
22940 63 6b 20 61 20 22 64 75 6d 70 22 2c 20 74 68 65  ck a "dump", the
22950 20 63 6f 6e 74 65 6e 74 20 6d 69 67 68 74 20 61   content might a
22960 70 70 65 61 72 20 69 6e 20 61 6e 20 6f 72 64 65  ppear in an orde
22970 72 0a 20 20 20 20 2a 2a 20 77 68 69 63 68 20 63  r.    ** which c
22980 61 75 73 65 73 20 69 6d 6d 65 64 69 61 74 65 20  auses immediate 
22990 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73  foreign key cons
229a0 74 72 61 69 6e 74 73 20 74 6f 20 62 65 20 76 69  traints to be vi
229b0 6f 6c 61 74 65 64 2e 0a 20 20 20 20 2a 2a 20 53  olated..    ** S
229c0 6f 20 64 69 73 61 62 6c 65 20 66 6f 72 65 69 67  o disable foreig
229d0 6e 2d 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74  n-key constraint
229e0 20 65 6e 66 6f 72 63 65 6d 65 6e 74 20 74 6f 20   enforcement to 
229f0 70 72 65 76 65 6e 74 20 70 72 6f 62 6c 65 6d 73  prevent problems
22a00 2e 20 2a 2f 0a 20 20 20 20 72 61 77 5f 70 72 69  . */.    raw_pri
22a10 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 50 52 41  ntf(p->out, "PRA
22a20 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73  GMA foreign_keys
22a30 3d 4f 46 46 3b 5c 6e 22 29 3b 0a 20 20 20 20 72  =OFF;\n");.    r
22a40 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
22a50 2c 20 22 42 45 47 49 4e 20 54 52 41 4e 53 41 43  , "BEGIN TRANSAC
22a60 54 49 4f 4e 3b 5c 6e 22 29 3b 0a 20 20 20 20 70  TION;\n");.    p
22a70 2d 3e 77 72 69 74 61 62 6c 65 53 63 68 65 6d 61  ->writableSchema
22a80 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e 73 68 6f   = 0;.    p->sho
22a90 77 48 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20  wHeader = 0;.   
22aa0 20 2f 2a 20 53 65 74 20 77 72 69 74 61 62 6c 65   /* Set writable
22ab0 5f 73 63 68 65 6d 61 3d 4f 4e 20 73 69 6e 63 65  _schema=ON since
22ac0 20 64 6f 69 6e 67 20 73 6f 20 66 6f 72 63 65 73   doing so forces
22ad0 20 53 51 4c 69 74 65 20 74 6f 20 69 6e 69 74 69   SQLite to initi
22ae0 61 6c 69 7a 65 0a 20 20 20 20 2a 2a 20 61 73 20  alize.    ** as 
22af0 6d 75 63 68 20 6f 66 20 74 68 65 20 73 63 68 65  much of the sche
22b00 6d 61 20 61 73 20 69 74 20 63 61 6e 20 65 76 65  ma as it can eve
22b10 6e 20 69 66 20 74 68 65 20 73 71 6c 69 74 65 5f  n if the sqlite_
22b20 6d 61 73 74 65 72 20 74 61 62 6c 65 20 69 73 0a  master table is.
22b30 20 20 20 20 2a 2a 20 63 6f 72 72 75 70 74 2e 20      ** corrupt. 
22b40 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 65  */.    sqlite3_e
22b50 78 65 63 28 70 2d 3e 64 62 2c 20 22 53 41 56 45  xec(p->db, "SAVE
22b60 50 4f 49 4e 54 20 64 75 6d 70 3b 20 50 52 41 47  POINT dump; PRAG
22b70 4d 41 20 77 72 69 74 61 62 6c 65 5f 73 63 68 65  MA writable_sche
22b80 6d 61 3d 4f 4e 22 2c 20 30 2c 20 30 2c 20 30 29  ma=ON", 0, 0, 0)
22b90 3b 0a 20 20 20 20 70 2d 3e 6e 45 72 72 20 3d 20  ;.    p->nErr = 
22ba0 30 3b 0a 20 20 20 20 69 66 28 20 7a 4c 69 6b 65  0;.    if( zLike
22bb0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 75 6e  ==0 ){.      run
22bc0 5f 73 63 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65  _schema_dump_que
22bd0 72 79 28 70 2c 0a 20 20 20 20 20 20 20 20 22 53  ry(p,.        "S
22be0 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79 70 65  ELECT name, type
22bf0 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74  , sql FROM sqlit
22c00 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20  e_master ".     
22c10 20 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e 4f     "WHERE sql NO
22c20 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79 70 65 3d  T NULL AND type=
22c30 3d 27 74 61 62 6c 65 27 20 41 4e 44 20 6e 61 6d  ='table' AND nam
22c40 65 21 3d 27 73 71 6c 69 74 65 5f 73 65 71 75 65  e!='sqlite_seque
22c50 6e 63 65 27 22 0a 20 20 20 20 20 20 29 3b 0a 20  nce'".      );. 
22c60 20 20 20 20 20 72 75 6e 5f 73 63 68 65 6d 61 5f       run_schema_
22c70 64 75 6d 70 5f 71 75 65 72 79 28 70 2c 0a 20 20  dump_query(p,.  
22c80 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e 61        "SELECT na
22c90 6d 65 2c 20 74 79 70 65 2c 20 73 71 6c 20 46 52  me, type, sql FR
22ca0 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65 72  OM sqlite_master
22cb0 20 22 0a 20 20 20 20 20 20 20 20 22 57 48 45 52   ".        "WHER
22cc0 45 20 6e 61 6d 65 3d 3d 27 73 71 6c 69 74 65 5f  E name=='sqlite_
22cd0 73 65 71 75 65 6e 63 65 27 22 0a 20 20 20 20 20  sequence'".     
22ce0 20 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 74 61   );.      run_ta
22cf0 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28 70  ble_dump_query(p
22d00 2c 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43  ,.        "SELEC
22d10 54 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74  T sql FROM sqlit
22d20 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20  e_master ".     
22d30 20 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e 4f     "WHERE sql NO
22d40 54 20 4e 55 4c 4c 20 41 4e 44 20 74 79 70 65 20  T NULL AND type 
22d50 49 4e 20 28 27 69 6e 64 65 78 27 2c 27 74 72 69  IN ('index','tri
22d60 67 67 65 72 27 2c 27 76 69 65 77 27 29 22 2c 20  gger','view')", 
22d70 30 0a 20 20 20 20 20 20 29 3b 0a 20 20 20 20 7d  0.      );.    }
22d80 65 6c 73 65 7b 0a 20 20 20 20 20 20 63 68 61 72  else{.      char
22d90 20 2a 7a 53 71 6c 3b 0a 20 20 20 20 20 20 7a 53   *zSql;.      zS
22da0 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72  ql = sqlite3_mpr
22db0 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 22 53  intf(.        "S
22dc0 45 4c 45 43 54 20 6e 61 6d 65 2c 20 74 79 70 65  ELECT name, type
22dd0 2c 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74  , sql FROM sqlit
22de0 65 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20  e_master ".     
22df0 20 20 20 22 57 48 45 52 45 20 74 62 6c 5f 6e 61     "WHERE tbl_na
22e00 6d 65 20 4c 49 4b 45 20 25 51 20 41 4e 44 20 74  me LIKE %Q AND t
22e10 79 70 65 3d 3d 27 74 61 62 6c 65 27 22 0a 20 20  ype=='table'".  
22e20 20 20 20 20 20 20 22 20 20 41 4e 44 20 73 71 6c        "  AND sql
22e30 20 4e 4f 54 20 4e 55 4c 4c 22 2c 20 7a 4c 69 6b   NOT NULL", zLik
22e40 65 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 73 63  e);.      run_sc
22e50 68 65 6d 61 5f 64 75 6d 70 5f 71 75 65 72 79 28  hema_dump_query(
22e60 70 2c 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 73  p,zSql);.      s
22e70 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c  qlite3_free(zSql
22e80 29 3b 0a 20 20 20 20 20 20 7a 53 71 6c 20 3d 20  );.      zSql = 
22e90 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28  sqlite3_mprintf(
22ea0 0a 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54  .        "SELECT
22eb0 20 73 71 6c 20 46 52 4f 4d 20 73 71 6c 69 74 65   sql FROM sqlite
22ec0 5f 6d 61 73 74 65 72 20 22 0a 20 20 20 20 20 20  _master ".      
22ed0 20 20 22 57 48 45 52 45 20 73 71 6c 20 4e 4f 54    "WHERE sql NOT
22ee0 20 4e 55 4c 4c 22 0a 20 20 20 20 20 20 20 20 22   NULL".        "
22ef0 20 20 41 4e 44 20 74 79 70 65 20 49 4e 20 28 27    AND type IN ('
22f00 69 6e 64 65 78 27 2c 27 74 72 69 67 67 65 72 27  index','trigger'
22f10 2c 27 76 69 65 77 27 29 22 0a 20 20 20 20 20 20  ,'view')".      
22f20 20 20 22 20 20 41 4e 44 20 74 62 6c 5f 6e 61 6d    "  AND tbl_nam
22f30 65 20 4c 49 4b 45 20 25 51 22 2c 20 7a 4c 69 6b  e LIKE %Q", zLik
22f40 65 29 3b 0a 20 20 20 20 20 20 72 75 6e 5f 74 61  e);.      run_ta
22f50 62 6c 65 5f 64 75 6d 70 5f 71 75 65 72 79 28 70  ble_dump_query(p
22f60 2c 20 7a 53 71 6c 2c 20 30 29 3b 0a 20 20 20 20  , zSql, 0);.    
22f70 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
22f80 53 71 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Sql);.    }.    
22f90 69 66 28 20 70 2d 3e 77 72 69 74 61 62 6c 65 53  if( p->writableS
22fa0 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20 20 72  chema ){.      r
22fb0 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
22fc0 2c 20 22 50 52 41 47 4d 41 20 77 72 69 74 61 62  , "PRAGMA writab
22fd0 6c 65 5f 73 63 68 65 6d 61 3d 4f 46 46 3b 5c 6e  le_schema=OFF;\n
22fe0 22 29 3b 0a 20 20 20 20 20 20 70 2d 3e 77 72 69  ");.      p->wri
22ff0 74 61 62 6c 65 53 63 68 65 6d 61 20 3d 20 30 3b  tableSchema = 0;
23000 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
23010 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 22  e3_exec(p->db, "
23020 50 52 41 47 4d 41 20 77 72 69 74 61 62 6c 65 5f  PRAGMA writable_
23030 73 63 68 65 6d 61 3d 4f 46 46 3b 22 2c 20 30 2c  schema=OFF;", 0,
23040 20 30 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69   0, 0);.    sqli
23050 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20  te3_exec(p->db, 
23060 22 52 45 4c 45 41 53 45 20 64 75 6d 70 3b 22 2c  "RELEASE dump;",
23070 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 72   0, 0, 0);.    r
23080 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  aw_printf(p->out
23090 2c 20 70 2d 3e 6e 45 72 72 20 3f 20 22 52 4f 4c  , p->nErr ? "ROL
230a0 4c 42 41 43 4b 3b 20 2d 2d 20 64 75 65 20 74 6f  LBACK; -- due to
230b0 20 65 72 72 6f 72 73 5c 6e 22 20 3a 20 22 43 4f   errors\n" : "CO
230c0 4d 4d 49 54 3b 5c 6e 22 29 3b 0a 20 20 20 20 70  MMIT;\n");.    p
230d0 2d 3e 73 68 6f 77 48 65 61 64 65 72 20 3d 20 73  ->showHeader = s
230e0 61 76 65 64 53 68 6f 77 48 65 61 64 65 72 3b 0a  avedShowHeader;.
230f0 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
23100 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70  =='e' && strncmp
23110 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 63 68 6f  (azArg[0], "echo
23120 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
23130 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20  if( nArg==2 ){. 
23140 20 20 20 20 20 73 65 74 4f 72 43 6c 65 61 72 46       setOrClearF
23150 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 45 63 68  lag(p, SHFLG_Ech
23160 6f 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  o, azArg[1]);.  
23170 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
23180 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
23190 2c 20 22 55 73 61 67 65 3a 20 2e 65 63 68 6f 20  , "Usage: .echo 
231a0 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20  on|off\n");.    
231b0 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
231c0 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
231d0 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70  =='e' && strncmp
231e0 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 71 70 22  (azArg[0], "eqp"
231f0 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
23200 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20 20  f( nArg==2 ){.  
23210 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
23220 7a 41 72 67 5b 31 5d 2c 22 66 75 6c 6c 22 29 3d  zArg[1],"full")=
23230 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 2d  =0 ){.        p-
23240 3e 61 75 74 6f 45 51 50 20 3d 20 41 55 54 4f 45  >autoEQP = AUTOE
23250 51 50 5f 66 75 6c 6c 3b 0a 20 20 20 20 20 20 7d  QP_full;.      }
23260 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
23270 61 7a 41 72 67 5b 31 5d 2c 22 74 72 69 67 67 65  azArg[1],"trigge
23280 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r")==0 ){.      
23290 20 20 70 2d 3e 61 75 74 6f 45 51 50 20 3d 20 41    p->autoEQP = A
232a0 55 54 4f 45 51 50 5f 74 72 69 67 67 65 72 3b 0a  UTOEQP_trigger;.
232b0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
232c0 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 51 50 20       p->autoEQP 
232d0 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61  = booleanValue(a
232e0 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20  zArg[1]);.      
232f0 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
23300 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
23310 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 65  derr, "Usage: .e
23320 71 70 20 6f 66 66 7c 6f 6e 7c 74 72 69 67 67 65  qp off|on|trigge
23330 72 7c 66 75 6c 6c 5c 6e 22 29 3b 0a 20 20 20 20  r|full\n");.    
23340 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a    rc = 1;.    }.
23350 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
23360 3d 3d 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70  =='e' && strncmp
23370 28 61 7a 41 72 67 5b 30 5d 2c 20 22 65 78 69 74  (azArg[0], "exit
23380 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
23390 69 66 28 20 6e 41 72 67 3e 31 20 26 26 20 28 72  if( nArg>1 && (r
233a0 63 20 3d 20 28 69 6e 74 29 69 6e 74 65 67 65 72  c = (int)integer
233b0 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 29  Value(azArg[1]))
233c0 21 3d 30 20 29 20 65 78 69 74 28 72 63 29 3b 0a  !=0 ) exit(rc);.
233d0 20 20 20 20 72 63 20 3d 20 32 3b 0a 20 20 7d 65      rc = 2;.  }e
233e0 6c 73 65 0a 0a 20 20 2f 2a 20 54 68 65 20 22 2e  lse..  /* The ".
233f0 65 78 70 6c 61 69 6e 22 20 63 6f 6d 6d 61 6e 64  explain" command
23400 20 69 73 20 61 75 74 6f 6d 61 74 69 63 20 6e 6f   is automatic no
23410 77 2e 20 20 49 74 20 69 73 20 6c 61 72 67 65 6c  w.  It is largel
23420 79 20 70 6f 69 6e 74 6c 65 73 73 2e 20 20 49 74  y pointless.  It
23430 0a 20 20 2a 2a 20 72 65 74 61 69 6e 65 64 20 70  .  ** retained p
23440 75 72 65 6c 79 20 66 6f 72 20 62 61 63 6b 77 61  urely for backwa
23450 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
23460 79 20 2a 2f 0a 20 20 69 66 28 20 63 3d 3d 27 65  y */.  if( c=='e
23470 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
23480 72 67 5b 30 5d 2c 20 22 65 78 70 6c 61 69 6e 22  rg[0], "explain"
23490 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
234a0 6e 74 20 76 61 6c 20 3d 20 31 3b 0a 20 20 20 20  nt val = 1;.    
234b0 69 66 28 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20  if( nArg>=2 ){. 
234c0 20 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28       if( strcmp(
234d0 61 7a 41 72 67 5b 31 5d 2c 22 61 75 74 6f 22 29  azArg[1],"auto")
234e0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 76  ==0 ){.        v
234f0 61 6c 20 3d 20 39 39 3b 0a 20 20 20 20 20 20 7d  al = 99;.      }
23500 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 76 61  else{.        va
23510 6c 20 3d 20 20 62 6f 6f 6c 65 61 6e 56 61 6c 75  l =  booleanValu
23520 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20  e(azArg[1]);.   
23530 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
23540 66 28 20 76 61 6c 3d 3d 31 20 26 26 20 70 2d 3e  f( val==1 && p->
23550 6d 6f 64 65 21 3d 4d 4f 44 45 5f 45 78 70 6c 61  mode!=MODE_Expla
23560 69 6e 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  in ){.      p->n
23570 6f 72 6d 61 6c 4d 6f 64 65 20 3d 20 70 2d 3e 6d  ormalMode = p->m
23580 6f 64 65 3b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f  ode;.      p->mo
23590 64 65 20 3d 20 4d 4f 44 45 5f 45 78 70 6c 61 69  de = MODE_Explai
235a0 6e 3b 0a 20 20 20 20 20 20 70 2d 3e 61 75 74 6f  n;.      p->auto
235b0 45 78 70 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20  Explain = 0;.   
235c0 20 7d 65 6c 73 65 20 69 66 28 20 76 61 6c 3d 3d   }else if( val==
235d0 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  0 ){.      if( p
235e0 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70  ->mode==MODE_Exp
235f0 6c 61 69 6e 20 29 20 70 2d 3e 6d 6f 64 65 20 3d  lain ) p->mode =
23600 20 70 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 0a   p->normalMode;.
23610 20 20 20 20 20 20 70 2d 3e 61 75 74 6f 45 78 70        p->autoExp
23620 6c 61 69 6e 20 3d 20 30 3b 0a 20 20 20 20 7d 65  lain = 0;.    }e
23630 6c 73 65 20 69 66 28 20 76 61 6c 3d 3d 39 39 20  lse if( val==99 
23640 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  ){.      if( p->
23650 6d 6f 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61  mode==MODE_Expla
23660 69 6e 20 29 20 70 2d 3e 6d 6f 64 65 20 3d 20 70  in ) p->mode = p
23670 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64 65 3b 0a 20 20  ->normalMode;.  
23680 20 20 20 20 70 2d 3e 61 75 74 6f 45 78 70 6c 61      p->autoExpla
23690 69 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  in = 1;.    }.  
236a0 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
236b0 27 65 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  'e' && strncmp(a
236c0 7a 41 72 67 5b 30 5d 2c 20 22 65 78 70 65 72 74  zArg[0], "expert
236d0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
236e0 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
236f0 20 20 20 65 78 70 65 72 74 44 6f 74 43 6f 6d 6d     expertDotComm
23700 61 6e 64 28 70 2c 20 61 7a 41 72 67 2c 20 6e 41  and(p, azArg, nA
23710 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20  rg);.  }else..  
23720 69 66 28 20 63 3d 3d 27 66 27 20 26 26 20 73 74  if( c=='f' && st
23730 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
23740 22 66 75 6c 6c 73 63 68 65 6d 61 22 2c 20 6e 29  "fullschema", n)
23750 3d 3d 30 20 29 7b 0a 20 20 20 20 53 68 65 6c 6c  ==0 ){.    Shell
23760 53 74 61 74 65 20 64 61 74 61 3b 0a 20 20 20 20  State data;.    
23770 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
23780 30 3b 0a 20 20 20 20 69 6e 74 20 64 6f 53 74 61  0;.    int doSta
23790 74 73 20 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 63  ts = 0;.    memc
237a0 70 79 28 26 64 61 74 61 2c 20 70 2c 20 73 69 7a  py(&data, p, siz
237b0 65 6f 66 28 64 61 74 61 29 29 3b 0a 20 20 20 20  eof(data));.    
237c0 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65 72 20  data.showHeader 
237d0 3d 20 30 3b 0a 20 20 20 20 64 61 74 61 2e 63 4d  = 0;.    data.cM
237e0 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20  ode = data.mode 
237f0 3d 20 4d 4f 44 45 5f 53 65 6d 69 3b 0a 20 20 20  = MODE_Semi;.   
23800 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 26 26 20   if( nArg==2 && 
23810 6f 70 74 69 6f 6e 4d 61 74 63 68 28 61 7a 41 72  optionMatch(azAr
23820 67 5b 31 5d 2c 20 22 69 6e 64 65 6e 74 22 29 20  g[1], "indent") 
23830 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 63 4d  ){.      data.cM
23840 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f 64 65 20  ode = data.mode 
23850 3d 20 4d 4f 44 45 5f 50 72 65 74 74 79 3b 0a 20  = MODE_Pretty;. 
23860 20 20 20 20 20 6e 41 72 67 20 3d 20 31 3b 0a 20       nArg = 1;. 
23870 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41 72     }.    if( nAr
23880 67 21 3d 31 20 29 7b 0a 20 20 20 20 20 20 72 61  g!=1 ){.      ra
23890 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
238a0 20 22 55 73 61 67 65 3a 20 2e 66 75 6c 6c 73 63   "Usage: .fullsc
238b0 68 65 6d 61 20 3f 2d 2d 69 6e 64 65 6e 74 3f 5c  hema ?--indent?\
238c0 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
238d0 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  1;.      goto me
238e0 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
238f0 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f  .    }.    open_
23900 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 72 63  db(p, 0);.    rc
23910 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
23920 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 22 53  p->db,.       "S
23930 45 4c 45 43 54 20 73 71 6c 20 46 52 4f 4d 22 0a  ELECT sql FROM".
23940 20 20 20 20 20 20 20 22 20 20 28 53 45 4c 45 43         "  (SELEC
23950 54 20 73 71 6c 20 73 71 6c 2c 20 74 79 70 65 20  T sql sql, type 
23960 74 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65 20 74  type, tbl_name t
23970 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d 65 20 6e 61  bl_name, name na
23980 6d 65 2c 20 72 6f 77 69 64 20 78 22 0a 20 20 20  me, rowid x".   
23990 20 20 20 20 22 20 20 20 20 20 46 52 4f 4d 20 73      "     FROM s
239a0 71 6c 69 74 65 5f 6d 61 73 74 65 72 20 55 4e 49  qlite_master UNI
239b0 4f 4e 20 41 4c 4c 22 0a 20 20 20 20 20 20 20 22  ON ALL".       "
239c0 20 20 20 53 45 4c 45 43 54 20 73 71 6c 2c 20 74     SELECT sql, t
239d0 79 70 65 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e  ype, tbl_name, n
239e0 61 6d 65 2c 20 72 6f 77 69 64 20 46 52 4f 4d 20  ame, rowid FROM 
239f0 73 71 6c 69 74 65 5f 74 65 6d 70 5f 6d 61 73 74  sqlite_temp_mast
23a00 65 72 29 20 22 0a 20 20 20 20 20 20 20 22 57 48  er) ".       "WH
23a10 45 52 45 20 74 79 70 65 21 3d 27 6d 65 74 61 27  ERE type!='meta'
23a20 20 41 4e 44 20 73 71 6c 20 4e 4f 54 4e 55 4c 4c   AND sql NOTNULL
23a30 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20 4c 49   AND name NOT LI
23a40 4b 45 20 27 73 71 6c 69 74 65 5f 25 27 20 22 0a  KE 'sqlite_%' ".
23a50 20 20 20 20 20 20 20 22 4f 52 44 45 52 20 42 59         "ORDER BY
23a60 20 72 6f 77 69 64 22 2c 0a 20 20 20 20 20 20 20   rowid",.       
23a70 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74 61 2c  callback, &data,
23a80 20 26 7a 45 72 72 4d 73 67 0a 20 20 20 20 29 3b   &zErrMsg.    );
23a90 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
23aa0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
23ab0 73 71 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53  sqlite3_stmt *pS
23ac0 74 6d 74 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  tmt;.      rc = 
23ad0 73 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f  sqlite3_prepare_
23ae0 76 32 28 70 2d 3e 64 62 2c 0a 20 20 20 20 20 20  v2(p->db,.      
23af0 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54           "SELECT
23b00 20 72 6f 77 69 64 20 46 52 4f 4d 20 73 71 6c 69   rowid FROM sqli
23b10 74 65 5f 6d 61 73 74 65 72 22 0a 20 20 20 20 20  te_master".     
23b20 20 20 20 20 20 20 20 20 20 20 22 20 57 48 45 52            " WHER
23b30 45 20 6e 61 6d 65 20 47 4c 4f 42 20 27 73 71 6c  E name GLOB 'sql
23b40 69 74 65 5f 73 74 61 74 5b 31 33 34 5d 27 22 2c  ite_stat[134]'",
23b50 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
23b60 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
23b70 20 20 20 20 20 20 64 6f 53 74 61 74 73 20 3d 20        doStats = 
23b80 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53 74  sqlite3_step(pSt
23b90 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 3b  mt)==SQLITE_ROW;
23ba0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
23bb0 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
23bc0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 6f      }.    if( do
23bd0 53 74 61 74 73 3d 3d 30 20 29 7b 0a 20 20 20 20  Stats==0 ){.    
23be0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
23bf0 6f 75 74 2c 20 22 2f 2a 20 4e 6f 20 53 54 41 54  out, "/* No STAT
23c00 20 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c   tables availabl
23c10 65 20 2a 2f 5c 6e 22 29 3b 0a 20 20 20 20 7d 65  e */\n");.    }e
23c20 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  lse{.      raw_p
23c30 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 41  rintf(p->out, "A
23c40 4e 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61  NALYZE sqlite_ma
23c50 73 74 65 72 3b 5c 6e 22 29 3b 0a 20 20 20 20 20  ster;\n");.     
23c60 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d   sqlite3_exec(p-
23c70 3e 64 62 2c 20 22 53 45 4c 45 43 54 20 27 41 4e  >db, "SELECT 'AN
23c80 41 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73  ALYZE sqlite_mas
23c90 74 65 72 27 22 2c 0a 20 20 20 20 20 20 20 20 20  ter'",.         
23ca0 20 20 20 20 20 20 20 20 20 20 63 61 6c 6c 62 61            callba
23cb0 63 6b 2c 20 26 64 61 74 61 2c 20 26 7a 45 72 72  ck, &data, &zErr
23cc0 4d 73 67 29 3b 0a 20 20 20 20 20 20 64 61 74 61  Msg);.      data
23cd0 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e 6d 6f  .cMode = data.mo
23ce0 64 65 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74  de = MODE_Insert
23cf0 3b 0a 20 20 20 20 20 20 64 61 74 61 2e 7a 44 65  ;.      data.zDe
23d00 73 74 54 61 62 6c 65 20 3d 20 22 73 71 6c 69 74  stTable = "sqlit
23d10 65 5f 73 74 61 74 31 22 3b 0a 20 20 20 20 20 20  e_stat1";.      
23d20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2d 3e 64 62  shell_exec(p->db
23d30 2c 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  , "SELECT * FROM
23d40 20 73 71 6c 69 74 65 5f 73 74 61 74 31 22 2c 0a   sqlite_stat1",.
23d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23d60 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 2c   shell_callback,
23d70 20 26 64 61 74 61 2c 26 7a 45 72 72 4d 73 67 29   &data,&zErrMsg)
23d80 3b 0a 20 20 20 20 20 20 64 61 74 61 2e 7a 44 65  ;.      data.zDe
23d90 73 74 54 61 62 6c 65 20 3d 20 22 73 71 6c 69 74  stTable = "sqlit
23da0 65 5f 73 74 61 74 33 22 3b 0a 20 20 20 20 20 20  e_stat3";.      
23db0 73 68 65 6c 6c 5f 65 78 65 63 28 70 2d 3e 64 62  shell_exec(p->db
23dc0 2c 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  , "SELECT * FROM
23dd0 20 73 71 6c 69 74 65 5f 73 74 61 74 33 22 2c 0a   sqlite_stat3",.
23de0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23df0 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 2c   shell_callback,
23e00 20 26 64 61 74 61 2c 26 7a 45 72 72 4d 73 67 29   &data,&zErrMsg)
23e10 3b 0a 20 20 20 20 20 20 64 61 74 61 2e 7a 44 65  ;.      data.zDe
23e20 73 74 54 61 62 6c 65 20 3d 20 22 73 71 6c 69 74  stTable = "sqlit
23e30 65 5f 73 74 61 74 34 22 3b 0a 20 20 20 20 20 20  e_stat4";.      
23e40 73 68 65 6c 6c 5f 65 78 65 63 28 70 2d 3e 64 62  shell_exec(p->db
23e50 2c 20 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  , "SELECT * FROM
23e60 20 73 71 6c 69 74 65 5f 73 74 61 74 34 22 2c 0a   sqlite_stat4",.
23e70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23e80 20 73 68 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 2c   shell_callback,
23e90 20 26 64 61 74 61 2c 20 26 7a 45 72 72 4d 73 67   &data, &zErrMsg
23ea0 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  );.      raw_pri
23eb0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 41 4e 41  ntf(p->out, "ANA
23ec0 4c 59 5a 45 20 73 71 6c 69 74 65 5f 6d 61 73 74  LYZE sqlite_mast
23ed0 65 72 3b 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 20  er;\n");.    }. 
23ee0 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
23ef0 3d 27 68 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='h' && strncmp(
23f00 61 7a 41 72 67 5b 30 5d 2c 20 22 68 65 61 64 65  azArg[0], "heade
23f10 72 73 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  rs", n)==0 ){.  
23f20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b    if( nArg==2 ){
23f30 0a 20 20 20 20 20 20 70 2d 3e 73 68 6f 77 48 65  .      p->showHe
23f40 61 64 65 72 20 3d 20 62 6f 6f 6c 65 61 6e 56 61  ader = booleanVa
23f50 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20  lue(azArg[1]);. 
23f60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
23f70 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
23f80 72 2c 20 22 55 73 61 67 65 3a 20 2e 68 65 61 64  r, "Usage: .head
23f90 65 72 73 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b 0a  ers on|off\n");.
23fa0 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
23fb0 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
23fc0 66 28 20 63 3d 3d 27 68 27 20 26 26 20 73 74 72  f( c=='h' && str
23fd0 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
23fe0 68 65 6c 70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  help", n)==0 ){.
23ff0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
24000 70 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 7a 48  p->out, "%s", zH
24010 65 6c 70 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20  elp);.  }else.. 
24020 20 69 66 28 20 63 3d 3d 27 69 27 20 26 26 20 73   if( c=='i' && s
24030 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
24040 20 22 69 6d 70 6f 72 74 22 2c 20 6e 29 3d 3d 30   "import", n)==0
24050 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 54   ){.    char *zT
24060 61 62 6c 65 3b 20 20 20 20 20 20 20 20 20 20 20  able;           
24070 20 20 20 20 2f 2a 20 49 6e 73 65 72 74 20 64 61      /* Insert da
24080 74 61 20 69 6e 74 6f 20 74 68 69 73 20 74 61 62  ta into this tab
24090 6c 65 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a  le */.    char *
240a0 7a 46 69 6c 65 3b 20 20 20 20 20 20 20 20 20 20  zFile;          
240b0 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
240c0 20 66 69 6c 65 20 74 6f 20 65 78 74 72 61 20 63   file to extra c
240d0 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 2a 2f 0a 20  ontent from */. 
240e0 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d 74 20     sqlite3_stmt 
240f0 2a 70 53 74 6d 74 20 3d 20 4e 55 4c 4c 3b 20 2f  *pStmt = NULL; /
24100 2a 20 41 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f  * A statement */
24110 0a 20 20 20 20 69 6e 74 20 6e 43 6f 6c 3b 20 20  .    int nCol;  
24120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
24130 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
24140 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 74 61 62  lumns in the tab
24150 6c 65 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 42  le */.    int nB
24160 79 74 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  yte;            
24170 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
24180 6f 66 20 62 79 74 65 73 20 69 6e 20 61 6e 20 53  of bytes in an S
24190 51 4c 20 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20  QL string */.   
241a0 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
241b0 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
241c0 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f  Loop counters */
241d0 0a 20 20 20 20 69 6e 74 20 6e 65 65 64 43 6f 6d  .    int needCom
241e0 6d 69 74 3b 20 20 20 20 20 20 20 20 20 20 20 20  mit;            
241f0 20 2f 2a 20 54 72 75 65 20 74 6f 20 43 4f 4d 4d   /* True to COMM
24200 49 54 20 6f 72 20 52 4f 4c 4c 42 41 43 4b 20 61  IT or ROLLBACK a
24210 74 20 65 6e 64 20 2a 2f 0a 20 20 20 20 69 6e 74  t end */.    int
24220 20 6e 53 65 70 3b 20 20 20 20 20 20 20 20 20 20   nSep;          
24230 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
24240 65 72 20 6f 66 20 62 79 74 65 73 20 69 6e 20 70  er of bytes in p
24250 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 5b 5d  ->colSeparator[]
24260 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   */.    char *zS
24270 71 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ql;             
24280 20 20 20 20 2f 2a 20 41 6e 20 53 51 4c 20 73 74      /* An SQL st
24290 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 49  atement */.    I
242a0 6d 70 6f 72 74 43 74 78 20 73 43 74 78 3b 20 20  mportCtx sCtx;  
242b0 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65             /* Re
242c0 61 64 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  ader context */.
242d0 20 20 20 20 63 68 61 72 20 2a 28 53 51 4c 49 54      char *(SQLIT
242e0 45 5f 43 44 45 43 4c 20 2a 78 52 65 61 64 29 28  E_CDECL *xRead)(
242f0 49 6d 70 6f 72 74 43 74 78 2a 29 3b 20 2f 2a 20  ImportCtx*); /* 
24300 46 75 6e 63 20 74 6f 20 72 65 61 64 20 6f 6e 65  Func to read one
24310 20 76 61 6c 75 65 20 2a 2f 0a 20 20 20 20 69 6e   value */.    in
24320 74 20 28 53 51 4c 49 54 45 5f 43 44 45 43 4c 20  t (SQLITE_CDECL 
24330 2a 78 43 6c 6f 73 65 72 29 28 46 49 4c 45 2a 29  *xCloser)(FILE*)
24340 3b 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 20 74  ;      /* Func t
24350 6f 20 63 6c 6f 73 65 20 66 69 6c 65 20 2a 2f 0a  o close file */.
24360 0a 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 33  .    if( nArg!=3
24370 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
24380 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
24390 61 67 65 3a 20 2e 69 6d 70 6f 72 74 20 46 49 4c  age: .import FIL
243a0 45 20 54 41 42 4c 45 5c 6e 22 29 3b 0a 20 20 20  E TABLE\n");.   
243b0 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
243c0 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d  mand_exit;.    }
243d0 0a 20 20 20 20 7a 46 69 6c 65 20 3d 20 61 7a 41  .    zFile = azA
243e0 72 67 5b 31 5d 3b 0a 20 20 20 20 7a 54 61 62 6c  rg[1];.    zTabl
243f0 65 20 3d 20 61 7a 41 72 67 5b 32 5d 3b 0a 20 20  e = azArg[2];.  
24400 20 20 73 65 65 6e 49 6e 74 65 72 72 75 70 74 20    seenInterrupt 
24410 3d 20 30 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  = 0;.    memset(
24420 26 73 43 74 78 2c 20 30 2c 20 73 69 7a 65 6f 66  &sCtx, 0, sizeof
24430 28 73 43 74 78 29 29 3b 0a 20 20 20 20 6f 70 65  (sCtx));.    ope
24440 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20  n_db(p, 0);.    
24450 6e 53 65 70 20 3d 20 73 74 72 6c 65 6e 33 30 28  nSep = strlen30(
24460 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29  p->colSeparator)
24470 3b 0a 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d  ;.    if( nSep==
24480 30 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  0 ){.      raw_p
24490 72 69 6e 74 66 28 73 74 64 65 72 72 2c 0a 20 20  rintf(stderr,.  
244a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
244b0 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75 6c 6c 20  Error: non-null 
244c0 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f 72  column separator
244d0 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 69 6d   required for im
244e0 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20  port\n");.      
244f0 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
24500 20 20 20 20 69 66 28 20 6e 53 65 70 3e 31 20 29      if( nSep>1 )
24510 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
24520 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
24530 72 3a 20 6d 75 6c 74 69 2d 63 68 61 72 61 63 74  r: multi-charact
24540 65 72 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61  er column separa
24550 74 6f 72 73 20 6e 6f 74 20 61 6c 6c 6f 77 65 64  tors not allowed
24560 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
24570 20 20 20 20 20 20 20 20 22 20 66 6f 72 20 69 6d          " for im
24580 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20  port\n");.      
24590 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
245a0 20 20 20 20 6e 53 65 70 20 3d 20 73 74 72 6c 65      nSep = strle
245b0 6e 33 30 28 70 2d 3e 72 6f 77 53 65 70 61 72 61  n30(p->rowSepara
245c0 74 6f 72 29 3b 0a 20 20 20 20 69 66 28 20 6e 53  tor);.    if( nS
245d0 65 70 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72  ep==0 ){.      r
245e0 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
245f0 2c 20 22 45 72 72 6f 72 3a 20 6e 6f 6e 2d 6e 75  , "Error: non-nu
24600 6c 6c 20 72 6f 77 20 73 65 70 61 72 61 74 6f 72  ll row separator
24610 20 72 65 71 75 69 72 65 64 20 66 6f 72 20 69 6d   required for im
24620 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20 20 20  port\n");.      
24630 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
24640 20 20 20 20 69 66 28 20 6e 53 65 70 3d 3d 32 20      if( nSep==2 
24650 26 26 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44 45  && p->mode==MODE
24660 5f 43 73 76 20 26 26 20 73 74 72 63 6d 70 28 70  _Csv && strcmp(p
24670 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20  ->rowSeparator, 
24680 53 45 50 5f 43 72 4c 66 29 3d 3d 30 20 29 7b 0a  SEP_CrLf)==0 ){.
24690 20 20 20 20 20 20 2f 2a 20 57 68 65 6e 20 69 6d        /* When im
246a0 70 6f 72 74 69 6e 67 20 43 53 56 20 28 6f 6e 6c  porting CSV (onl
246b0 79 29 2c 20 69 66 20 74 68 65 20 72 6f 77 20 73  y), if the row s
246c0 65 70 61 72 61 74 6f 72 20 69 73 20 73 65 74 20  eparator is set 
246d0 74 6f 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  to the.      ** 
246e0 64 65 66 61 75 6c 74 20 6f 75 74 70 75 74 20 72  default output r
246f0 6f 77 20 73 65 70 61 72 61 74 6f 72 2c 20 63 68  ow separator, ch
24700 61 6e 67 65 20 69 74 20 74 6f 20 74 68 65 20 64  ange it to the d
24710 65 66 61 75 6c 74 20 69 6e 70 75 74 0a 20 20 20  efault input.   
24720 20 20 20 2a 2a 20 72 6f 77 20 73 65 70 61 72 61     ** row separa
24730 74 6f 72 2e 20 20 54 68 69 73 20 61 76 6f 69 64  tor.  This avoid
24740 73 20 68 61 76 69 6e 67 20 74 6f 20 6d 61 69 6e  s having to main
24750 74 61 69 6e 20 64 69 66 66 65 72 65 6e 74 20 69  tain different i
24760 6e 70 75 74 0a 20 20 20 20 20 20 2a 2a 20 61 6e  nput.      ** an
24770 64 20 6f 75 74 70 75 74 20 72 6f 77 20 73 65 70  d output row sep
24780 61 72 61 74 6f 72 73 2e 20 2a 2f 0a 20 20 20 20  arators. */.    
24790 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
247a0 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77  tf(sizeof(p->row
247b0 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72  Separator), p->r
247c0 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50  owSeparator, SEP
247d0 5f 52 6f 77 29 3b 0a 20 20 20 20 20 20 6e 53 65  _Row);.      nSe
247e0 70 20 3d 20 73 74 72 6c 65 6e 33 30 28 70 2d 3e  p = strlen30(p->
247f0 72 6f 77 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  rowSeparator);. 
24800 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 53 65     }.    if( nSe
24810 70 3e 31 20 29 7b 0a 20 20 20 20 20 20 72 61 77  p>1 ){.      raw
24820 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
24830 22 45 72 72 6f 72 3a 20 6d 75 6c 74 69 2d 63 68  "Error: multi-ch
24840 61 72 61 63 74 65 72 20 72 6f 77 20 73 65 70 61  aracter row sepa
24850 72 61 74 6f 72 73 20 6e 6f 74 20 61 6c 6c 6f 77  rators not allow
24860 65 64 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  ed".            
24870 20 20 20 20 20 20 20 20 20 20 22 20 66 6f 72 20            " for 
24880 69 6d 70 6f 72 74 5c 6e 22 29 3b 0a 20 20 20 20  import\n");.    
24890 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
248a0 7d 0a 20 20 20 20 73 43 74 78 2e 7a 46 69 6c 65  }.    sCtx.zFile
248b0 20 3d 20 7a 46 69 6c 65 3b 0a 20 20 20 20 73 43   = zFile;.    sC
248c0 74 78 2e 6e 4c 69 6e 65 20 3d 20 31 3b 0a 20 20  tx.nLine = 1;.  
248d0 20 20 69 66 28 20 73 43 74 78 2e 7a 46 69 6c 65    if( sCtx.zFile
248e0 5b 30 5d 3d 3d 27 7c 27 20 29 7b 0a 23 69 66 64  [0]=='|' ){.#ifd
248f0 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50  ef SQLITE_OMIT_P
24900 4f 50 45 4e 0a 20 20 20 20 20 20 72 61 77 5f 70  OPEN.      raw_p
24910 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45  rintf(stderr, "E
24920 72 72 6f 72 3a 20 70 69 70 65 73 20 61 72 65 20  rror: pipes are 
24930 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 69 6e  not supported in
24940 20 74 68 69 73 20 4f 53 5c 6e 22 29 3b 0a 20 20   this OS\n");.  
24950 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 23 65      return 1;.#e
24960 6c 73 65 0a 20 20 20 20 20 20 73 43 74 78 2e 69  lse.      sCtx.i
24970 6e 20 3d 20 70 6f 70 65 6e 28 73 43 74 78 2e 7a  n = popen(sCtx.z
24980 46 69 6c 65 2b 31 2c 20 22 72 22 29 3b 0a 20 20  File+1, "r");.  
24990 20 20 20 20 73 43 74 78 2e 7a 46 69 6c 65 20 3d      sCtx.zFile =
249a0 20 22 3c 70 69 70 65 3e 22 3b 0a 20 20 20 20 20   "<pipe>";.     
249b0 20 78 43 6c 6f 73 65 72 20 3d 20 70 63 6c 6f 73   xCloser = pclos
249c0 65 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65  e;.#endif.    }e
249d0 6c 73 65 7b 0a 20 20 20 20 20 20 73 43 74 78 2e  lse{.      sCtx.
249e0 69 6e 20 3d 20 66 6f 70 65 6e 28 73 43 74 78 2e  in = fopen(sCtx.
249f0 7a 46 69 6c 65 2c 20 22 72 62 22 29 3b 0a 20 20  zFile, "rb");.  
24a00 20 20 20 20 78 43 6c 6f 73 65 72 20 3d 20 66 63      xCloser = fc
24a10 6c 6f 73 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20  lose;.    }.    
24a20 69 66 28 20 70 2d 3e 6d 6f 64 65 3d 3d 4d 4f 44  if( p->mode==MOD
24a30 45 5f 41 73 63 69 69 20 29 7b 0a 20 20 20 20 20  E_Ascii ){.     
24a40 20 78 52 65 61 64 20 3d 20 61 73 63 69 69 5f 72   xRead = ascii_r
24a50 65 61 64 5f 6f 6e 65 5f 66 69 65 6c 64 3b 0a 20  ead_one_field;. 
24a60 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
24a70 78 52 65 61 64 20 3d 20 63 73 76 5f 72 65 61 64  xRead = csv_read
24a80 5f 6f 6e 65 5f 66 69 65 6c 64 3b 0a 20 20 20 20  _one_field;.    
24a90 7d 0a 20 20 20 20 69 66 28 20 73 43 74 78 2e 69  }.    if( sCtx.i
24aa0 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 75 74  n==0 ){.      ut
24ab0 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
24ac0 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74  , "Error: cannot
24ad0 20 6f 70 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c   open \"%s\"\n",
24ae0 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 72   zFile);.      r
24af0 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
24b00 20 20 20 73 43 74 78 2e 63 43 6f 6c 53 65 70 20     sCtx.cColSep 
24b10 3d 20 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f  = p->colSeparato
24b20 72 5b 30 5d 3b 0a 20 20 20 20 73 43 74 78 2e 63  r[0];.    sCtx.c
24b30 52 6f 77 53 65 70 20 3d 20 70 2d 3e 72 6f 77 53  RowSep = p->rowS
24b40 65 70 61 72 61 74 6f 72 5b 30 5d 3b 0a 20 20 20  eparator[0];.   
24b50 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
24b60 6d 70 72 69 6e 74 66 28 22 53 45 4c 45 43 54 20  mprintf("SELECT 
24b70 2a 20 46 52 4f 4d 20 25 73 22 2c 20 7a 54 61 62  * FROM %s", zTab
24b80 6c 65 29 3b 0a 20 20 20 20 69 66 28 20 7a 53 71  le);.    if( zSq
24b90 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 61  l==0 ){.      ra
24ba0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
24bb0 20 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20   "Error: out of 
24bc0 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20  memory\n");.    
24bd0 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69    xCloser(sCtx.i
24be0 6e 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  n);.      return
24bf0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 42   1;.    }.    nB
24c00 79 74 65 20 3d 20 73 74 72 6c 65 6e 33 30 28 7a  yte = strlen30(z
24c10 53 71 6c 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  Sql);.    rc = s
24c20 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
24c30 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  2(p->db, zSql, -
24c40 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
24c50 20 20 20 69 6d 70 6f 72 74 5f 61 70 70 65 6e 64     import_append
24c60 5f 63 68 61 72 28 26 73 43 74 78 2c 20 30 29 3b  _char(&sCtx, 0);
24c70 20 20 20 20 2f 2a 20 54 6f 20 65 6e 73 75 72 65      /* To ensure
24c80 20 73 43 74 78 2e 7a 20 69 73 20 61 6c 6c 6f 63   sCtx.z is alloc
24c90 61 74 65 64 20 2a 2f 0a 20 20 20 20 69 66 28 20  ated */.    if( 
24ca0 72 63 20 26 26 20 73 71 6c 69 74 65 33 5f 73 74  rc && sqlite3_st
24cb0 72 67 6c 6f 62 28 22 6e 6f 20 73 75 63 68 20 74  rglob("no such t
24cc0 61 62 6c 65 3a 20 2a 22 2c 20 73 71 6c 69 74 65  able: *", sqlite
24cd0 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29  3_errmsg(p->db))
24ce0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 63 68 61  ==0 ){.      cha
24cf0 72 20 2a 7a 43 72 65 61 74 65 20 3d 20 73 71 6c  r *zCreate = sql
24d00 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 43 52  ite3_mprintf("CR
24d10 45 41 54 45 20 54 41 42 4c 45 20 25 73 22 2c 20  EATE TABLE %s", 
24d20 7a 54 61 62 6c 65 29 3b 0a 20 20 20 20 20 20 63  zTable);.      c
24d30 68 61 72 20 63 53 65 70 20 3d 20 27 28 27 3b 0a  har cSep = '(';.
24d40 20 20 20 20 20 20 77 68 69 6c 65 28 20 78 52 65        while( xRe
24d50 61 64 28 26 73 43 74 78 29 20 29 7b 0a 20 20 20  ad(&sCtx) ){.   
24d60 20 20 20 20 20 7a 43 72 65 61 74 65 20 3d 20 73       zCreate = s
24d70 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74 66 28 22  qlite3_mprintf("
24d80 25 7a 25 63 5c 6e 20 20 5c 22 25 77 5c 22 20 54  %z%c\n  \"%w\" T
24d90 45 58 54 22 2c 20 7a 43 72 65 61 74 65 2c 20 63  EXT", zCreate, c
24da0 53 65 70 2c 20 73 43 74 78 2e 7a 29 3b 0a 20 20  Sep, sCtx.z);.  
24db0 20 20 20 20 20 20 63 53 65 70 20 3d 20 27 2c 27        cSep = ','
24dc0 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 43  ;.        if( sC
24dd0 74 78 2e 63 54 65 72 6d 21 3d 73 43 74 78 2e 63  tx.cTerm!=sCtx.c
24de0 43 6f 6c 53 65 70 20 29 20 62 72 65 61 6b 3b 0a  ColSep ) break;.
24df0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
24e00 28 20 63 53 65 70 3d 3d 27 28 27 20 29 7b 0a 20  ( cSep=='(' ){. 
24e10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
24e20 72 65 65 28 7a 43 72 65 61 74 65 29 3b 0a 20 20  ree(zCreate);.  
24e30 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
24e40 65 65 28 73 43 74 78 2e 7a 29 3b 0a 20 20 20 20  ee(sCtx.z);.    
24e50 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78      xCloser(sCtx
24e60 2e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 75 74  .in);.        ut
24e70 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
24e80 2c 22 25 73 3a 20 65 6d 70 74 79 20 66 69 6c 65  ,"%s: empty file
24e90 5c 6e 22 2c 20 73 43 74 78 2e 7a 46 69 6c 65 29  \n", sCtx.zFile)
24ea0 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
24eb0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
24ec0 20 20 7a 43 72 65 61 74 65 20 3d 20 73 71 6c 69    zCreate = sqli
24ed0 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 7a 5c  te3_mprintf("%z\
24ee0 6e 29 22 2c 20 7a 43 72 65 61 74 65 29 3b 0a 20  n)", zCreate);. 
24ef0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
24f00 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c 20 7a 43  3_exec(p->db, zC
24f10 72 65 61 74 65 2c 20 30 2c 20 30 2c 20 30 29 3b  reate, 0, 0, 0);
24f20 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66  .      sqlite3_f
24f30 72 65 65 28 7a 43 72 65 61 74 65 29 3b 0a 20 20  ree(zCreate);.  
24f40 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20 20      if( rc ){.  
24f50 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
24f60 66 28 73 74 64 65 72 72 2c 20 22 43 52 45 41 54  f(stderr, "CREAT
24f70 45 20 54 41 42 4c 45 20 25 73 28 2e 2e 2e 29 20  E TABLE %s(...) 
24f80 66 61 69 6c 65 64 3a 20 25 73 5c 6e 22 2c 20 7a  failed: %s\n", z
24f90 54 61 62 6c 65 2c 0a 20 20 20 20 20 20 20 20 20  Table,.         
24fa0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 65         sqlite3_e
24fb0 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20  rrmsg(p->db));. 
24fc0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66         sqlite3_f
24fd0 72 65 65 28 73 43 74 78 2e 7a 29 3b 0a 20 20 20  ree(sCtx.z);.   
24fe0 20 20 20 20 20 78 43 6c 6f 73 65 72 28 73 43 74       xCloser(sCt
24ff0 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 72  x.in);.        r
25000 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
25010 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
25020 74 65 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70  te3_prepare_v2(p
25030 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20  ->db, zSql, -1, 
25040 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20  &pStmt, 0);.    
25050 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72  }.    sqlite3_fr
25060 65 65 28 7a 53 71 6c 29 3b 0a 20 20 20 20 69 66  ee(zSql);.    if
25070 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20 69 66  ( rc ){.      if
25080 20 28 70 53 74 6d 74 29 20 73 71 6c 69 74 65 33   (pStmt) sqlite3
25090 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29  _finalize(pStmt)
250a0 3b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  ;.      utf8_pri
250b0 6e 74 66 28 73 74 64 65 72 72 2c 22 45 72 72 6f  ntf(stderr,"Erro
250c0 72 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65  r: %s\n", sqlite
250d0 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29  3_errmsg(p->db))
250e0 3b 0a 20 20 20 20 20 20 78 43 6c 6f 73 65 72 28  ;.      xCloser(
250f0 73 43 74 78 2e 69 6e 29 3b 0a 20 20 20 20 20 20  sCtx.in);.      
25100 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
25110 20 20 20 20 6e 43 6f 6c 20 3d 20 73 71 6c 69 74      nCol = sqlit
25120 65 33 5f 63 6f 6c 75 6d 6e 5f 63 6f 75 6e 74 28  e3_column_count(
25130 70 53 74 6d 74 29 3b 0a 20 20 20 20 73 71 6c 69  pStmt);.    sqli
25140 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
25150 6d 74 29 3b 0a 20 20 20 20 70 53 74 6d 74 20 3d  mt);.    pStmt =
25160 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 43 6f 6c   0;.    if( nCol
25170 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 20  ==0 ) return 0; 
25180 2f 2a 20 6e 6f 20 63 6f 6c 75 6d 6e 73 2c 20 6e  /* no columns, n
25190 6f 20 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 7a  o error */.    z
251a0 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d 61  Sql = sqlite3_ma
251b0 6c 6c 6f 63 36 34 28 20 6e 42 79 74 65 2a 32 20  lloc64( nByte*2 
251c0 2b 20 32 30 20 2b 20 6e 43 6f 6c 2a 32 20 29 3b  + 20 + nCol*2 );
251d0 0a 20 20 20 20 69 66 28 20 7a 53 71 6c 3d 3d 30  .    if( zSql==0
251e0 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72   ){.      raw_pr
251f0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
25200 72 6f 72 3a 20 6f 75 74 20 6f 66 20 6d 65 6d 6f  ror: out of memo
25210 72 79 5c 6e 22 29 3b 0a 20 20 20 20 20 20 78 43  ry\n");.      xC
25220 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29 3b 0a  loser(sCtx.in);.
25230 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
25240 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
25250 33 5f 73 6e 70 72 69 6e 74 66 28 6e 42 79 74 65  3_snprintf(nByte
25260 2b 32 30 2c 20 7a 53 71 6c 2c 20 22 49 4e 53 45  +20, zSql, "INSE
25270 52 54 20 49 4e 54 4f 20 5c 22 25 77 5c 22 20 56  RT INTO \"%w\" V
25280 41 4c 55 45 53 28 3f 22 2c 20 7a 54 61 62 6c 65  ALUES(?", zTable
25290 29 3b 0a 20 20 20 20 6a 20 3d 20 73 74 72 6c 65  );.    j = strle
252a0 6e 33 30 28 7a 53 71 6c 29 3b 0a 20 20 20 20 66  n30(zSql);.    f
252b0 6f 72 28 69 3d 31 3b 20 69 3c 6e 43 6f 6c 3b 20  or(i=1; i<nCol; 
252c0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 53 71 6c  i++){.      zSql
252d0 5b 6a 2b 2b 5d 20 3d 20 27 2c 27 3b 0a 20 20 20  [j++] = ',';.   
252e0 20 20 20 7a 53 71 6c 5b 6a 2b 2b 5d 20 3d 20 27     zSql[j++] = '
252f0 3f 27 3b 0a 20 20 20 20 7d 0a 20 20 20 20 7a 53  ?';.    }.    zS
25300 71 6c 5b 6a 2b 2b 5d 20 3d 20 27 29 27 3b 0a 20  ql[j++] = ')';. 
25310 20 20 20 7a 53 71 6c 5b 6a 5d 20 3d 20 30 3b 0a     zSql[j] = 0;.
25320 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
25330 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
25340 62 2c 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53  b, zSql, -1, &pS
25350 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  tmt, 0);.    sql
25360 69 74 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b  ite3_free(zSql);
25370 0a 20 20 20 20 69 66 28 20 72 63 20 29 7b 0a 20  .    if( rc ){. 
25380 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
25390 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
253a0 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f   %s\n", sqlite3_
253b0 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a  errmsg(p->db));.
253c0 20 20 20 20 20 20 69 66 20 28 70 53 74 6d 74 29        if (pStmt)
253d0 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a   sqlite3_finaliz
253e0 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20 20  e(pStmt);.      
253f0 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69 6e 29  xCloser(sCtx.in)
25400 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
25410 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6e 65 65 64  ;.    }.    need
25420 43 6f 6d 6d 69 74 20 3d 20 73 71 6c 69 74 65 33  Commit = sqlite3
25430 5f 67 65 74 5f 61 75 74 6f 63 6f 6d 6d 69 74 28  _get_autocommit(
25440 70 2d 3e 64 62 29 3b 0a 20 20 20 20 69 66 28 20  p->db);.    if( 
25450 6e 65 65 64 43 6f 6d 6d 69 74 20 29 20 73 71 6c  needCommit ) sql
25460 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64 62 2c  ite3_exec(p->db,
25470 20 22 42 45 47 49 4e 22 2c 20 30 2c 20 30 2c 20   "BEGIN", 0, 0, 
25480 30 29 3b 0a 20 20 20 20 64 6f 7b 0a 20 20 20 20  0);.    do{.    
25490 20 20 69 6e 74 20 73 74 61 72 74 4c 69 6e 65 20    int startLine 
254a0 3d 20 73 43 74 78 2e 6e 4c 69 6e 65 3b 0a 20 20  = sCtx.nLine;.  
254b0 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
254c0 43 6f 6c 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Col; i++){.     
254d0 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 78 52 65     char *z = xRe
254e0 61 64 28 26 73 43 74 78 29 3b 0a 20 20 20 20 20  ad(&sCtx);.     
254f0 20 20 20 2f 2a 0a 20 20 20 20 20 20 20 20 2a 2a     /*.        **
25500 20 44 69 64 20 77 65 20 72 65 61 63 68 20 65 6e   Did we reach en
25510 64 2d 6f 66 2d 66 69 6c 65 20 62 65 66 6f 72 65  d-of-file before
25520 20 66 69 6e 64 69 6e 67 20 61 6e 79 20 63 6f 6c   finding any col
25530 75 6d 6e 73 3f 0a 20 20 20 20 20 20 20 20 2a 2a  umns?.        **
25540 20 49 66 20 73 6f 2c 20 73 74 6f 70 20 69 6e 73   If so, stop ins
25550 74 65 61 64 20 6f 66 20 4e 55 4c 4c 20 66 69 6c  tead of NULL fil
25560 6c 69 6e 67 20 74 68 65 20 72 65 6d 61 69 6e 69  ling the remaini
25570 6e 67 20 63 6f 6c 75 6d 6e 73 2e 0a 20 20 20 20  ng columns..    
25580 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
25590 66 28 20 7a 3d 3d 30 20 26 26 20 69 3d 3d 30 20  f( z==0 && i==0 
255a0 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20  ) break;.       
255b0 20 2f 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 44   /*.        ** D
255c0 69 64 20 77 65 20 72 65 61 63 68 20 65 6e 64 2d  id we reach end-
255d0 6f 66 2d 66 69 6c 65 20 4f 52 20 65 6e 64 2d 6f  of-file OR end-o
255e0 66 2d 6c 69 6e 65 20 62 65 66 6f 72 65 20 66 69  f-line before fi
255f0 6e 64 69 6e 67 20 61 6e 79 0a 20 20 20 20 20 20  nding any.      
25600 20 20 2a 2a 20 63 6f 6c 75 6d 6e 73 20 69 6e 20    ** columns in 
25610 41 53 43 49 49 20 6d 6f 64 65 3f 20 20 49 66 20  ASCII mode?  If 
25620 73 6f 2c 20 73 74 6f 70 20 69 6e 73 74 65 61 64  so, stop instead
25630 20 6f 66 20 4e 55 4c 4c 20 66 69 6c 6c 69 6e 67   of NULL filling
25640 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
25650 72 65 6d 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e  remaining column
25660 73 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  s..        */.  
25670 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6d 6f 64        if( p->mod
25680 65 3d 3d 4d 4f 44 45 5f 41 73 63 69 69 20 26 26  e==MODE_Ascii &&
25690 20 28 7a 3d 3d 30 20 7c 7c 20 7a 5b 30 5d 3d 3d   (z==0 || z[0]==
256a0 30 29 20 26 26 20 69 3d 3d 30 20 29 20 62 72 65  0) && i==0 ) bre
256b0 61 6b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ak;.        sqli
256c0 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53  te3_bind_text(pS
256d0 74 6d 74 2c 20 69 2b 31 2c 20 7a 2c 20 2d 31 2c  tmt, i+1, z, -1,
256e0 20 53 51 4c 49 54 45 5f 54 52 41 4e 53 49 45 4e   SQLITE_TRANSIEN
256f0 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  T);.        if( 
25700 69 3c 6e 43 6f 6c 2d 31 20 26 26 20 73 43 74 78  i<nCol-1 && sCtx
25710 2e 63 54 65 72 6d 21 3d 73 43 74 78 2e 63 43 6f  .cTerm!=sCtx.cCo
25720 6c 53 65 70 20 29 7b 0a 20 20 20 20 20 20 20 20  lSep ){.        
25730 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
25740 64 65 72 72 2c 20 22 25 73 3a 25 64 3a 20 65 78  derr, "%s:%d: ex
25750 70 65 63 74 65 64 20 25 64 20 63 6f 6c 75 6d 6e  pected %d column
25760 73 20 62 75 74 20 66 6f 75 6e 64 20 25 64 20 2d  s but found %d -
25770 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
25780 20 20 20 20 20 20 20 20 20 20 20 20 20 22 66 69               "fi
25790 6c 6c 69 6e 67 20 74 68 65 20 72 65 73 74 20 77  lling the rest w
257a0 69 74 68 20 4e 55 4c 4c 5c 6e 22 2c 0a 20 20 20  ith NULL\n",.   
257b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
257c0 20 20 20 20 20 20 20 73 43 74 78 2e 7a 46 69 6c         sCtx.zFil
257d0 65 2c 20 73 74 61 72 74 4c 69 6e 65 2c 20 6e 43  e, startLine, nC
257e0 6f 6c 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20  ol, i+1);.      
257f0 20 20 20 20 69 20 2b 3d 20 32 3b 0a 20 20 20 20      i += 2;.    
25800 20 20 20 20 20 20 77 68 69 6c 65 28 20 69 3c 3d        while( i<=
25810 6e 43 6f 6c 20 29 7b 20 73 71 6c 69 74 65 33 5f  nCol ){ sqlite3_
25820 62 69 6e 64 5f 6e 75 6c 6c 28 70 53 74 6d 74 2c  bind_null(pStmt,
25830 20 69 29 3b 20 69 2b 2b 3b 20 7d 0a 20 20 20 20   i); i++; }.    
25840 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
25850 20 20 20 20 69 66 28 20 73 43 74 78 2e 63 54 65      if( sCtx.cTe
25860 72 6d 3d 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70  rm==sCtx.cColSep
25870 20 29 7b 0a 20 20 20 20 20 20 20 20 64 6f 7b 0a   ){.        do{.
25880 20 20 20 20 20 20 20 20 20 20 78 52 65 61 64 28            xRead(
25890 26 73 43 74 78 29 3b 0a 20 20 20 20 20 20 20 20  &sCtx);.        
258a0 20 20 69 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d    i++;.        }
258b0 77 68 69 6c 65 28 20 73 43 74 78 2e 63 54 65 72  while( sCtx.cTer
258c0 6d 3d 3d 73 43 74 78 2e 63 43 6f 6c 53 65 70 20  m==sCtx.cColSep 
258d0 29 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  );.        utf8_
258e0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
258f0 25 73 3a 25 64 3a 20 65 78 70 65 63 74 65 64 20  %s:%d: expected 
25900 25 64 20 63 6f 6c 75 6d 6e 73 20 62 75 74 20 66  %d columns but f
25910 6f 75 6e 64 20 25 64 20 2d 20 22 0a 20 20 20 20  ound %d - ".    
25920 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25930 20 20 20 20 22 65 78 74 72 61 73 20 69 67 6e 6f      "extras igno
25940 72 65 64 5c 6e 22 2c 0a 20 20 20 20 20 20 20 20  red\n",.        
25950 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25960 73 43 74 78 2e 7a 46 69 6c 65 2c 20 73 74 61 72  sCtx.zFile, star
25970 74 4c 69 6e 65 2c 20 6e 43 6f 6c 2c 20 69 29 3b  tLine, nCol, i);
25980 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
25990 66 28 20 69 3e 3d 6e 43 6f 6c 20 29 7b 0a 20 20  f( i>=nCol ){.  
259a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74        sqlite3_st
259b0 65 70 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 20  ep(pStmt);.     
259c0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
259d0 72 65 73 65 74 28 70 53 74 6d 74 29 3b 0a 20 20  reset(pStmt);.  
259e0 20 20 20 20 20 20 69 66 28 20 72 63 21 3d 53 51        if( rc!=SQ
259f0 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20  LITE_OK ){.     
25a00 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
25a10 28 73 74 64 65 72 72 2c 20 22 25 73 3a 25 64 3a  (stderr, "%s:%d:
25a20 20 49 4e 53 45 52 54 20 66 61 69 6c 65 64 3a 20   INSERT failed: 
25a30 25 73 5c 6e 22 2c 20 73 43 74 78 2e 7a 46 69 6c  %s\n", sCtx.zFil
25a40 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
25a50 20 20 20 20 20 20 20 20 20 73 74 61 72 74 4c 69           startLi
25a60 6e 65 2c 20 73 71 6c 69 74 65 33 5f 65 72 72 6d  ne, sqlite3_errm
25a70 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20  sg(p->db));.    
25a80 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
25a90 20 20 7d 77 68 69 6c 65 28 20 73 43 74 78 2e 63    }while( sCtx.c
25aa0 54 65 72 6d 21 3d 45 4f 46 20 29 3b 0a 0a 20 20  Term!=EOF );..  
25ab0 20 20 78 43 6c 6f 73 65 72 28 73 43 74 78 2e 69    xCloser(sCtx.i
25ac0 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f  n);.    sqlite3_
25ad0 66 72 65 65 28 73 43 74 78 2e 7a 29 3b 0a 20 20  free(sCtx.z);.  
25ae0 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69    sqlite3_finali
25af0 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69  ze(pStmt);.    i
25b00 66 28 20 6e 65 65 64 43 6f 6d 6d 69 74 20 29 20  f( needCommit ) 
25b10 73 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e  sqlite3_exec(p->
25b20 64 62 2c 20 22 43 4f 4d 4d 49 54 22 2c 20 30 2c  db, "COMMIT", 0,
25b30 20 30 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 0a   0, 0);.  }else.
25b40 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
25b50 55 4e 54 45 53 54 41 42 4c 45 0a 20 20 69 66 28  UNTESTABLE.  if(
25b60 20 63 3d 3d 27 69 27 20 26 26 20 73 74 72 6e 63   c=='i' && strnc
25b70 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69 6d  mp(azArg[0], "im
25b80 70 6f 73 74 65 72 22 2c 20 6e 29 3d 3d 30 20 29  poster", n)==0 )
25b90 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71 6c  {.    char *zSql
25ba0 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c  ;.    char *zCol
25bb0 6c 69 73 74 20 3d 20 30 3b 0a 20 20 20 20 73 71  list = 0;.    sq
25bc0 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
25bd0 74 3b 0a 20 20 20 20 69 6e 74 20 74 6e 75 6d 20  t;.    int tnum 
25be0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  = 0;.    int i;.
25bf0 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 33 20      if( nArg!=3 
25c00 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  ){.      utf8_pr
25c10 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73  intf(stderr, "Us
25c20 61 67 65 3a 20 2e 69 6d 70 6f 73 74 65 72 20 49  age: .imposter I
25c30 4e 44 45 58 20 49 4d 50 4f 53 54 45 52 5c 6e 22  NDEX IMPOSTER\n"
25c40 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b  );.      rc = 1;
25c50 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61  .      goto meta
25c60 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20  _command_exit;. 
25c70 20 20 20 7d 0a 20 20 20 20 6f 70 65 6e 5f 64 62     }.    open_db
25c80 28 70 2c 20 30 29 3b 0a 20 20 20 20 7a 53 71 6c  (p, 0);.    zSql
25c90 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
25ca0 74 66 28 22 53 45 4c 45 43 54 20 72 6f 6f 74 70  tf("SELECT rootp
25cb0 61 67 65 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f  age FROM sqlite_
25cc0 6d 61 73 74 65 72 22 0a 20 20 20 20 20 20 20 20  master".        
25cd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25ce0 20 20 20 22 20 57 48 45 52 45 20 6e 61 6d 65 3d     " WHERE name=
25cf0 27 25 71 27 20 41 4e 44 20 74 79 70 65 3d 27 69  '%q' AND type='i
25d00 6e 64 65 78 27 22 2c 20 61 7a 41 72 67 5b 31 5d  ndex'", azArg[1]
25d10 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 70  );.    sqlite3_p
25d20 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
25d30 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
25d40 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
25d50 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
25d60 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
25d70 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49  tep(pStmt)==SQLI
25d80 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20  TE_ROW ){.      
25d90 74 6e 75 6d 20 3d 20 73 71 6c 69 74 65 33 5f 63  tnum = sqlite3_c
25da0 6f 6c 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c  olumn_int(pStmt,
25db0 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73   0);.    }.    s
25dc0 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28  qlite3_finalize(
25dd0 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28 20  pStmt);.    if( 
25de0 74 6e 75 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  tnum==0 ){.     
25df0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64   utf8_printf(std
25e00 65 72 72 2c 20 22 6e 6f 20 73 75 63 68 20 69 6e  err, "no such in
25e10 64 65 78 3a 20 5c 22 25 73 5c 22 5c 6e 22 2c 20  dex: \"%s\"\n", 
25e20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20  azArg[1]);.     
25e30 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67   rc = 1;.      g
25e40 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
25e50 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20  _exit;.    }.   
25e60 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f   zSql = sqlite3_
25e70 6d 70 72 69 6e 74 66 28 22 50 52 41 47 4d 41 20  mprintf("PRAGMA 
25e80 69 6e 64 65 78 5f 78 69 6e 66 6f 3d 27 25 71 27  index_xinfo='%q'
25e90 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ", azArg[1]);.  
25ea0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 70    rc = sqlite3_p
25eb0 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62 2c  repare_v2(p->db,
25ec0 20 7a 53 71 6c 2c 20 2d 31 2c 20 26 70 53 74 6d   zSql, -1, &pStm
25ed0 74 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  t, 0);.    sqlit
25ee0 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
25ef0 20 20 20 69 20 3d 20 30 3b 0a 20 20 20 20 77 68     i = 0;.    wh
25f00 69 6c 65 28 20 73 71 6c 69 74 65 33 5f 73 74 65  ile( sqlite3_ste
25f10 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c 49 54 45  p(pStmt)==SQLITE
25f20 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20 20 63 68  _ROW ){.      ch
25f30 61 72 20 7a 4c 61 62 65 6c 5b 32 30 5d 3b 0a 20  ar zLabel[20];. 
25f40 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
25f50 2a 7a 43 6f 6c 20 3d 20 28 63 6f 6e 73 74 20 63  *zCol = (const c
25f60 68 61 72 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c  har*)sqlite3_col
25f70 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d 74 2c 32  umn_text(pStmt,2
25f80 29 3b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20  );.      i++;.  
25f90 20 20 20 20 69 66 28 20 7a 43 6f 6c 3d 3d 30 20      if( zCol==0 
25fa0 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
25fb0 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 69 6e  qlite3_column_in
25fc0 74 28 70 53 74 6d 74 2c 31 29 3d 3d 2d 31 20 29  t(pStmt,1)==-1 )
25fd0 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 43 6f 6c  {.          zCol
25fe0 20 3d 20 22 5f 52 4f 57 49 44 5f 22 3b 0a 20 20   = "_ROWID_";.  
25ff0 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
26000 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73         sqlite3_s
26010 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
26020 4c 61 62 65 6c 29 2c 7a 4c 61 62 65 6c 2c 22 65  Label),zLabel,"e
26030 78 70 72 25 64 22 2c 69 29 3b 0a 20 20 20 20 20  xpr%d",i);.     
26040 20 20 20 20 20 7a 43 6f 6c 20 3d 20 7a 4c 61 62       zCol = zLab
26050 65 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  el;.        }.  
26060 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
26070 7a 43 6f 6c 6c 69 73 74 3d 3d 30 20 29 7b 0a 20  zCollist==0 ){. 
26080 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74 20         zCollist 
26090 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
260a0 66 28 22 5c 22 25 77 5c 22 22 2c 20 7a 43 6f 6c  f("\"%w\"", zCol
260b0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
260c0 20 20 20 20 20 20 20 20 7a 43 6f 6c 6c 69 73 74          zCollist
260d0 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
260e0 74 66 28 22 25 7a 2c 5c 22 25 77 5c 22 22 2c 20  tf("%z,\"%w\"", 
260f0 7a 43 6f 6c 6c 69 73 74 2c 20 7a 43 6f 6c 29 3b  zCollist, zCol);
26100 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
26110 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c     sqlite3_final
26120 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20 20 20  ize(pStmt);.    
26130 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33 5f 6d  zSql = sqlite3_m
26140 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
26150 20 20 22 43 52 45 41 54 45 20 54 41 42 4c 45 20    "CREATE TABLE 
26160 5c 22 25 77 5c 22 28 25 73 2c 50 52 49 4d 41 52  \"%w\"(%s,PRIMAR
26170 59 20 4b 45 59 28 25 73 29 29 57 49 54 48 4f 55  Y KEY(%s))WITHOU
26180 54 20 52 4f 57 49 44 22 2c 0a 20 20 20 20 20 20  T ROWID",.      
26190 20 20 20 20 61 7a 41 72 67 5b 32 5d 2c 20 7a 43      azArg[2], zC
261a0 6f 6c 6c 69 73 74 2c 20 7a 43 6f 6c 6c 69 73 74  ollist, zCollist
261b0 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  );.    sqlite3_f
261c0 72 65 65 28 7a 43 6f 6c 6c 69 73 74 29 3b 0a 20  ree(zCollist);. 
261d0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
261e0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 53 51 4c  test_control(SQL
261f0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50  ITE_TESTCTRL_IMP
26200 4f 53 54 45 52 2c 20 70 2d 3e 64 62 2c 20 22 6d  OSTER, p->db, "m
26210 61 69 6e 22 2c 20 31 2c 20 74 6e 75 6d 29 3b 0a  ain", 1, tnum);.
26220 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c 49      if( rc==SQLI
26230 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72  TE_OK ){.      r
26240 63 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63  c = sqlite3_exec
26250 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 30 2c  (p->db, zSql, 0,
26260 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
26270 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
26280 6f 6c 28 53 51 4c 49 54 45 5f 54 45 53 54 43 54  ol(SQLITE_TESTCT
26290 52 4c 5f 49 4d 50 4f 53 54 45 52 2c 20 70 2d 3e  RL_IMPOSTER, p->
262a0 64 62 2c 20 22 6d 61 69 6e 22 2c 20 30 2c 20 30  db, "main", 0, 0
262b0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
262c0 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
262d0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
262e0 45 72 72 6f 72 20 69 6e 20 5b 25 73 5d 3a 20 25  Error in [%s]: %
262f0 73 5c 6e 22 2c 20 7a 53 71 6c 2c 20 73 71 6c 69  s\n", zSql, sqli
26300 74 65 33 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62  te3_errmsg(p->db
26310 29 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  ));.      }else{
26320 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
26330 69 6e 74 66 28 73 74 64 6f 75 74 2c 20 22 25 73  intf(stdout, "%s
26340 3b 5c 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20  ;\n", zSql);.   
26350 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
26360 73 74 64 6f 75 74 2c 0a 20 20 20 20 20 20 20 20  stdout,.        
26370 20 20 20 22 57 41 52 4e 49 4e 47 3a 20 77 72 69     "WARNING: wri
26380 74 69 6e 67 20 74 6f 20 61 6e 20 69 6d 70 6f 73  ting to an impos
26390 74 65 72 20 74 61 62 6c 65 20 77 69 6c 6c 20 63  ter table will c
263a0 6f 72 72 75 70 74 20 74 68 65 20 69 6e 64 65 78  orrupt the index
263b0 21 5c 6e 22 0a 20 20 20 20 20 20 20 20 29 3b 0a  !\n".        );.
263c0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
263d0 65 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  e{.      raw_pri
263e0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53 51 4c  ntf(stderr, "SQL
263f0 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 4d 50  ITE_TESTCTRL_IMP
26400 4f 53 54 45 52 20 72 65 74 75 72 6e 73 20 25 64  OSTER returns %d
26410 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20 20 20  \n", rc);.      
26420 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20  rc = 1;.    }.  
26430 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
26440 53 71 6c 29 3b 0a 20 20 7d 65 6c 73 65 0a 23 65  Sql);.  }else.#e
26450 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e 65 64  ndif /* !defined
26460 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 45 53  (SQLITE_OMIT_TES
26470 54 5f 43 4f 4e 54 52 4f 4c 29 20 2a 2f 0a 0a 23  T_CONTROL) */..#
26480 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41  ifdef SQLITE_ENA
26490 42 4c 45 5f 49 4f 54 52 41 43 45 0a 20 20 69 66  BLE_IOTRACE.  if
264a0 28 20 63 3d 3d 27 69 27 20 26 26 20 73 74 72 6e  ( c=='i' && strn
264b0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 69  cmp(azArg[0], "i
264c0 6f 74 72 61 63 65 22 2c 20 6e 29 3d 3d 30 20 29  otrace", n)==0 )
264d0 7b 0a 20 20 20 20 53 51 4c 49 54 45 5f 41 50 49  {.    SQLITE_API
264e0 20 65 78 74 65 72 6e 20 76 6f 69 64 20 28 53 51   extern void (SQ
264f0 4c 49 54 45 5f 43 44 45 43 4c 20 2a 73 71 6c 69  LITE_CDECL *sqli
26500 74 65 33 49 6f 54 72 61 63 65 29 28 63 6f 6e 73  te3IoTrace)(cons
26510 74 20 63 68 61 72 2a 2c 20 2e 2e 2e 29 3b 0a 20  t char*, ...);. 
26520 20 20 20 69 66 28 20 69 6f 74 72 61 63 65 20 26     if( iotrace &
26530 26 20 69 6f 74 72 61 63 65 21 3d 73 74 64 6f 75  & iotrace!=stdou
26540 74 20 29 20 66 63 6c 6f 73 65 28 69 6f 74 72 61  t ) fclose(iotra
26550 63 65 29 3b 0a 20 20 20 20 69 6f 74 72 61 63 65  ce);.    iotrace
26560 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 41   = 0;.    if( nA
26570 72 67 3c 32 20 29 7b 0a 20 20 20 20 20 20 73 71  rg<2 ){.      sq
26580 6c 69 74 65 33 49 6f 54 72 61 63 65 20 3d 20 30  lite3IoTrace = 0
26590 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
265a0 73 74 72 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  strcmp(azArg[1],
265b0 20 22 2d 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20   "-")==0 ){.    
265c0 20 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65    sqlite3IoTrace
265d0 20 3d 20 69 6f 74 72 61 63 65 50 72 69 6e 74 66   = iotracePrintf
265e0 3b 0a 20 20 20 20 20 20 69 6f 74 72 61 63 65 20  ;.      iotrace 
265f0 3d 20 73 74 64 6f 75 74 3b 0a 20 20 20 20 7d 65  = stdout;.    }e
26600 6c 73 65 7b 0a 20 20 20 20 20 20 69 6f 74 72 61  lse{.      iotra
26610 63 65 20 3d 20 66 6f 70 65 6e 28 61 7a 41 72 67  ce = fopen(azArg
26620 5b 31 5d 2c 20 22 77 22 29 3b 0a 20 20 20 20 20  [1], "w");.     
26630 20 69 66 28 20 69 6f 74 72 61 63 65 3d 3d 30 20   if( iotrace==0 
26640 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
26650 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
26660 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70  Error: cannot op
26670 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 61 7a  en \"%s\"\n", az
26680 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[1]);.       
26690 20 73 71 6c 69 74 65 33 49 6f 54 72 61 63 65 20   sqlite3IoTrace 
266a0 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 72 63 20  = 0;.        rc 
266b0 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
266c0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
266d0 33 49 6f 54 72 61 63 65 20 3d 20 69 6f 74 72 61  3IoTrace = iotra
266e0 63 65 50 72 69 6e 74 66 3b 0a 20 20 20 20 20 20  cePrintf;.      
266f0 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  }.    }.  }else.
26700 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 3d  #endif..  if( c=
26710 3d 27 6c 27 20 26 26 20 6e 3e 3d 35 20 26 26 20  ='l' && n>=5 && 
26720 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
26730 2c 20 22 6c 69 6d 69 74 73 22 2c 20 6e 29 3d 3d  , "limits", n)==
26740 30 20 29 7b 0a 20 20 20 20 73 74 61 74 69 63 20  0 ){.    static 
26750 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a 20  const struct {. 
26760 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
26770 20 2a 7a 4c 69 6d 69 74 4e 61 6d 65 3b 20 20 20   *zLimitName;   
26780 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20 6c 69 6d  /* Name of a lim
26790 69 74 20 2a 2f 0a 20 20 20 20 20 20 20 69 6e 74  it */.       int
267a0 20 6c 69 6d 69 74 43 6f 64 65 3b 20 20 20 20 20   limitCode;     
267b0 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65         /* Intege
267c0 72 20 63 6f 64 65 20 66 6f 72 20 74 68 61 74 20  r code for that 
267d0 6c 69 6d 69 74 20 2a 2f 0a 20 20 20 20 7d 20 61  limit */.    } a
267e0 4c 69 6d 69 74 5b 5d 20 3d 20 7b 0a 20 20 20 20  Limit[] = {.    
267f0 20 20 7b 20 22 6c 65 6e 67 74 68 22 2c 20 20 20    { "length",   
26800 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
26810 49 54 45 5f 4c 49 4d 49 54 5f 4c 45 4e 47 54 48  ITE_LIMIT_LENGTH
26820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26830 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22      },.      { "
26840 73 71 6c 5f 6c 65 6e 67 74 68 22 2c 20 20 20 20  sql_length",    
26850 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c          SQLITE_L
26860 49 4d 49 54 5f 53 51 4c 5f 4c 45 4e 47 54 48 20  IMIT_SQL_LENGTH 
26870 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
26880 2c 0a 20 20 20 20 20 20 7b 20 22 63 6f 6c 75 6d  ,.      { "colum
26890 6e 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  n",             
268a0 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f     SQLITE_LIMIT_
268b0 43 4f 4c 55 4d 4e 20 20 20 20 20 20 20 20 20 20  COLUMN          
268c0 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
268d0 20 20 20 7b 20 22 65 78 70 72 5f 64 65 70 74 68     { "expr_depth
268e0 22 2c 20 20 20 20 20 20 20 20 20 20 20 20 53 51  ",            SQ
268f0 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50 52 5f  LITE_LIMIT_EXPR_
26900 44 45 50 54 48 20 20 20 20 20 20 20 20 20 20 20  DEPTH           
26910 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
26920 22 63 6f 6d 70 6f 75 6e 64 5f 73 65 6c 65 63 74  "compound_select
26930 22 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f  ",       SQLITE_
26940 4c 49 4d 49 54 5f 43 4f 4d 50 4f 55 4e 44 5f 53  LIMIT_COMPOUND_S
26950 45 4c 45 43 54 20 20 20 20 20 20 20 20 20 20 20  ELECT           
26960 7d 2c 0a 20 20 20 20 20 20 7b 20 22 76 64 62 65  },.      { "vdbe
26970 5f 6f 70 22 2c 20 20 20 20 20 20 20 20 20 20 20  _op",           
26980 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49 54      SQLITE_LIMIT
26990 5f 56 44 42 45 5f 4f 50 20 20 20 20 20 20 20 20  _VDBE_OP        
269a0 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20             },.  
269b0 20 20 20 20 7b 20 22 66 75 6e 63 74 69 6f 6e 5f      { "function_
269c0 61 72 67 22 2c 20 20 20 20 20 20 20 20 20 20 53  arg",          S
269d0 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 46 55 4e 43  QLITE_LIMIT_FUNC
269e0 54 49 4f 4e 5f 41 52 47 20 20 20 20 20 20 20 20  TION_ARG        
269f0 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b        },.      {
26a00 20 22 61 74 74 61 63 68 65 64 22 2c 20 20 20 20   "attached",    
26a10 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
26a20 5f 4c 49 4d 49 54 5f 41 54 54 41 43 48 45 44 20  _LIMIT_ATTACHED 
26a30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a40 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 6c 69 6b   },.      { "lik
26a50 65 5f 70 61 74 74 65 72 6e 5f 6c 65 6e 67 74 68  e_pattern_length
26a60 22 2c 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d 49  ",   SQLITE_LIMI
26a70 54 5f 4c 49 4b 45 5f 50 41 54 54 45 52 4e 5f 4c  T_LIKE_PATTERN_L
26a80 45 4e 47 54 48 20 20 20 20 20 20 20 7d 2c 0a 20  ENGTH       },. 
26a90 20 20 20 20 20 7b 20 22 76 61 72 69 61 62 6c 65       { "variable
26aa0 5f 6e 75 6d 62 65 72 22 2c 20 20 20 20 20 20 20  _number",       
26ab0 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
26ac0 49 41 42 4c 45 5f 4e 55 4d 42 45 52 20 20 20 20  IABLE_NUMBER    
26ad0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
26ae0 7b 20 22 74 72 69 67 67 65 72 5f 64 65 70 74 68  { "trigger_depth
26af0 22 2c 20 20 20 20 20 20 20 20 20 53 51 4c 49 54  ",         SQLIT
26b00 45 5f 4c 49 4d 49 54 5f 54 52 49 47 47 45 52 5f  E_LIMIT_TRIGGER_
26b10 44 45 50 54 48 20 20 20 20 20 20 20 20 20 20 20  DEPTH           
26b20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 77 6f    },.      { "wo
26b30 72 6b 65 72 5f 74 68 72 65 61 64 73 22 2c 20 20  rker_threads",  
26b40 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4c 49 4d        SQLITE_LIM
26b50 49 54 5f 57 4f 52 4b 45 52 5f 54 48 52 45 41 44  IT_WORKER_THREAD
26b60 53 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a  S            },.
26b70 20 20 20 20 7d 3b 0a 20 20 20 20 69 6e 74 20 69      };.    int i
26b80 2c 20 6e 32 3b 0a 20 20 20 20 6f 70 65 6e 5f 64  , n2;.    open_d
26b90 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28  b(p, 0);.    if(
26ba0 20 6e 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20 20   nArg==1 ){.    
26bb0 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72    for(i=0; i<Arr
26bc0 61 79 53 69 7a 65 28 61 4c 69 6d 69 74 29 3b 20  aySize(aLimit); 
26bd0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 70 72  i++){.        pr
26be0 69 6e 74 66 28 22 25 32 30 73 20 25 64 5c 6e 22  intf("%20s %d\n"
26bf0 2c 20 61 4c 69 6d 69 74 5b 69 5d 2e 7a 4c 69 6d  , aLimit[i].zLim
26c00 69 74 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20  itName,.        
26c10 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c         sqlite3_l
26c20 69 6d 69 74 28 70 2d 3e 64 62 2c 20 61 4c 69 6d  imit(p->db, aLim
26c30 69 74 5b 69 5d 2e 6c 69 6d 69 74 43 6f 64 65 2c  it[i].limitCode,
26c40 20 2d 31 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20   -1));.      }. 
26c50 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 41 72     }else if( nAr
26c60 67 3e 33 20 29 7b 0a 20 20 20 20 20 20 72 61 77  g>3 ){.      raw
26c70 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
26c80 22 55 73 61 67 65 3a 20 2e 6c 69 6d 69 74 20 4e  "Usage: .limit N
26c90 41 4d 45 20 3f 4e 45 57 2d 56 41 4c 55 45 3f 5c  AME ?NEW-VALUE?\
26ca0 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  n");.      rc = 
26cb0 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  1;.      goto me
26cc0 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
26cd0 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
26ce0 20 20 69 6e 74 20 69 4c 69 6d 69 74 20 3d 20 2d    int iLimit = -
26cf0 31 3b 0a 20 20 20 20 20 20 6e 32 20 3d 20 73 74  1;.      n2 = st
26d00 72 6c 65 6e 33 30 28 61 7a 41 72 67 5b 31 5d 29  rlen30(azArg[1])
26d10 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
26d20 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61 4c 69   i<ArraySize(aLi
26d30 6d 69 74 29 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  mit); i++){.    
26d40 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f      if( sqlite3_
26d50 73 74 72 6e 69 63 6d 70 28 61 4c 69 6d 69 74 5b  strnicmp(aLimit[
26d60 69 5d 2e 7a 4c 69 6d 69 74 4e 61 6d 65 2c 20 61  i].zLimitName, a
26d70 7a 41 72 67 5b 31 5d 2c 20 6e 32 29 3d 3d 30 20  zArg[1], n2)==0 
26d80 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
26d90 20 69 4c 69 6d 69 74 3c 30 20 29 7b 0a 20 20 20   iLimit<0 ){.   
26da0 20 20 20 20 20 20 20 20 20 69 4c 69 6d 69 74 20           iLimit 
26db0 3d 20 69 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = i;.          }
26dc0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
26dd0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
26de0 64 65 72 72 2c 20 22 61 6d 62 69 67 75 6f 75 73  derr, "ambiguous
26df0 20 6c 69 6d 69 74 3a 20 5c 22 25 73 5c 22 5c 6e   limit: \"%s\"\n
26e00 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ", azArg[1]);.  
26e10 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 31            rc = 1
26e20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 6f  ;.            go
26e30 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  to meta_command_
26e40 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 20 20  exit;.          
26e50 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
26e60 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 4c    }.      if( iL
26e70 69 6d 69 74 3c 30 20 29 7b 0a 20 20 20 20 20 20  imit<0 ){.      
26e80 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
26e90 64 65 72 72 2c 20 22 75 6e 6b 6e 6f 77 6e 20 6c  derr, "unknown l
26ea0 69 6d 69 74 3a 20 5c 22 25 73 5c 22 5c 6e 22 0a  imit: \"%s\"\n".
26eb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26ec0 20 20 20 20 20 20 20 20 22 65 6e 74 65 72 20 5c          "enter \
26ed0 22 2e 6c 69 6d 69 74 73 5c 22 20 77 69 74 68 20  ".limits\" with 
26ee0 6e 6f 20 61 72 67 75 6d 65 6e 74 73 20 66 6f 72  no arguments for
26ef0 20 61 20 6c 69 73 74 2e 5c 6e 22 2c 0a 20 20 20   a list.\n",.   
26f00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26f10 20 20 20 20 20 20 61 7a 41 72 67 5b 31 5d 29 3b        azArg[1]);
26f20 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
26f30 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  .        goto me
26f40 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
26f50 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
26f60 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20 20  f( nArg==3 ){.  
26f70 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 69        sqlite3_li
26f80 6d 69 74 28 70 2d 3e 64 62 2c 20 61 4c 69 6d 69  mit(p->db, aLimi
26f90 74 5b 69 4c 69 6d 69 74 5d 2e 6c 69 6d 69 74 43  t[iLimit].limitC
26fa0 6f 64 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ode,.           
26fb0 20 20 20 20 20 20 20 20 20 20 20 28 69 6e 74 29             (int)
26fc0 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41  integerValue(azA
26fd0 72 67 5b 32 5d 29 29 3b 0a 20 20 20 20 20 20 7d  rg[2]));.      }
26fe0 0a 20 20 20 20 20 20 70 72 69 6e 74 66 28 22 25  .      printf("%
26ff0 32 30 73 20 25 64 5c 6e 22 2c 20 61 4c 69 6d 69  20s %d\n", aLimi
27000 74 5b 69 4c 69 6d 69 74 5d 2e 7a 4c 69 6d 69 74  t[iLimit].zLimit
27010 4e 61 6d 65 2c 0a 20 20 20 20 20 20 20 20 20 20  Name,.          
27020 20 20 20 73 71 6c 69 74 65 33 5f 6c 69 6d 69 74     sqlite3_limit
27030 28 70 2d 3e 64 62 2c 20 61 4c 69 6d 69 74 5b 69  (p->db, aLimit[i
27040 4c 69 6d 69 74 5d 2e 6c 69 6d 69 74 43 6f 64 65  Limit].limitCode
27050 2c 20 2d 31 29 29 3b 0a 20 20 20 20 7d 0a 20 20  , -1));.    }.  
27060 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
27070 27 6c 27 20 26 26 20 6e 3e 32 20 26 26 20 73 74  'l' && n>2 && st
27080 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
27090 22 6c 69 6e 74 22 2c 20 6e 29 3d 3d 30 20 29 7b  "lint", n)==0 ){
270a0 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20  .    open_db(p, 
270b0 30 29 3b 0a 20 20 20 20 6c 69 6e 74 44 6f 74 43  0);.    lintDotC
270c0 6f 6d 6d 61 6e 64 28 70 2c 20 61 7a 41 72 67 2c  ommand(p, azArg,
270d0 20 6e 41 72 67 29 3b 0a 20 20 7d 65 6c 73 65 0a   nArg);.  }else.
270e0 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
270f0 4f 4d 49 54 5f 4c 4f 41 44 5f 45 58 54 45 4e 53  OMIT_LOAD_EXTENS
27100 49 4f 4e 0a 20 20 69 66 28 20 63 3d 3d 27 6c 27  ION.  if( c=='l'
27110 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
27120 67 5b 30 5d 2c 20 22 6c 6f 61 64 22 2c 20 6e 29  g[0], "load", n)
27130 3d 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74  ==0 ){.    const
27140 20 63 68 61 72 20 2a 7a 46 69 6c 65 2c 20 2a 7a   char *zFile, *z
27150 50 72 6f 63 3b 0a 20 20 20 20 63 68 61 72 20 2a  Proc;.    char *
27160 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20 20  zErrMsg = 0;.   
27170 20 69 66 28 20 6e 41 72 67 3c 32 20 29 7b 0a 20   if( nArg<2 ){. 
27180 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
27190 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
271a0 2e 6c 6f 61 64 20 46 49 4c 45 20 3f 45 4e 54 52  .load FILE ?ENTR
271b0 59 50 4f 49 4e 54 3f 5c 6e 22 29 3b 0a 20 20 20  YPOINT?\n");.   
271c0 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
271d0 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
271e0 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20  nd_exit;.    }. 
271f0 20 20 20 7a 46 69 6c 65 20 3d 20 61 7a 41 72 67     zFile = azArg
27200 5b 31 5d 3b 0a 20 20 20 20 7a 50 72 6f 63 20 3d  [1];.    zProc =
27210 20 6e 41 72 67 3e 3d 33 20 3f 20 61 7a 41 72 67   nArg>=3 ? azArg
27220 5b 32 5d 20 3a 20 30 3b 0a 20 20 20 20 6f 70 65  [2] : 0;.    ope
27230 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20  n_db(p, 0);.    
27240 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 6c 6f 61  rc = sqlite3_loa
27250 64 5f 65 78 74 65 6e 73 69 6f 6e 28 70 2d 3e 64  d_extension(p->d
27260 62 2c 20 7a 46 69 6c 65 2c 20 7a 50 72 6f 63 2c  b, zFile, zProc,
27270 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20   &zErrMsg);.    
27280 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
27290 4b 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  K ){.      utf8_
272a0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
272b0 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20 7a 45  Error: %s\n", zE
272c0 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71  rrMsg);.      sq
272d0 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
272e0 73 67 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20  sg);.      rc = 
272f0 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  1;.    }.  }else
27300 0a 23 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63  .#endif..  if( c
27310 3d 3d 27 6c 27 20 26 26 20 73 74 72 6e 63 6d 70  =='l' && strncmp
27320 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6c 6f 67 22  (azArg[0], "log"
27330 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  , n)==0 ){.    i
27340 66 28 20 6e 41 72 67 21 3d 32 20 29 7b 0a 20 20  f( nArg!=2 ){.  
27350 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
27360 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
27370 6c 6f 67 20 46 49 4c 45 4e 41 4d 45 5c 6e 22 29  log FILENAME\n")
27380 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
27390 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
273a0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 46 69   const char *zFi
273b0 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20  le = azArg[1];. 
273c0 20 20 20 20 20 6f 75 74 70 75 74 5f 66 69 6c 65       output_file
273d0 5f 63 6c 6f 73 65 28 70 2d 3e 70 4c 6f 67 29 3b  _close(p->pLog);
273e0 0a 20 20 20 20 20 20 70 2d 3e 70 4c 6f 67 20 3d  .      p->pLog =
273f0 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65   output_file_ope
27400 6e 28 7a 46 69 6c 65 29 3b 0a 20 20 20 20 7d 0a  n(zFile);.    }.
27410 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63    }else..  if( c
27420 3d 3d 27 6d 27 20 26 26 20 73 74 72 6e 63 6d 70  =='m' && strncmp
27430 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6d 6f 64 65  (azArg[0], "mode
27440 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
27450 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 6f 64  const char *zMod
27460 65 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61 7a  e = nArg>=2 ? az
27470 41 72 67 5b 31 5d 20 3a 20 22 22 3b 0a 20 20 20  Arg[1] : "";.   
27480 20 69 6e 74 20 6e 32 20 3d 20 28 69 6e 74 29 73   int n2 = (int)s
27490 74 72 6c 65 6e 28 7a 4d 6f 64 65 29 3b 0a 20 20  trlen(zMode);.  
274a0 20 20 69 6e 74 20 63 32 20 3d 20 7a 4d 6f 64 65    int c2 = zMode
274b0 5b 30 5d 3b 0a 20 20 20 20 69 66 28 20 63 32 3d  [0];.    if( c2=
274c0 3d 27 6c 27 20 26 26 20 6e 32 3e 32 20 26 26 20  ='l' && n2>2 && 
274d0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d  strncmp(azArg[1]
274e0 2c 22 6c 69 6e 65 73 22 2c 6e 32 29 3d 3d 30 20  ,"lines",n2)==0 
274f0 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  ){.      p->mode
27500 20 3d 20 4d 4f 44 45 5f 4c 69 6e 65 3b 0a 20 20   = MODE_Line;.  
27510 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72      sqlite3_snpr
27520 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72  intf(sizeof(p->r
27530 6f 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d  owSeparator), p-
27540 3e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53  >rowSeparator, S
27550 45 50 5f 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c  EP_Row);.    }el
27560 73 65 20 69 66 28 20 63 32 3d 3d 27 63 27 20 26  se if( c2=='c' &
27570 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
27580 31 5d 2c 22 63 6f 6c 75 6d 6e 73 22 2c 6e 32 29  1],"columns",n2)
27590 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e  ==0 ){.      p->
275a0 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43 6f 6c 75  mode = MODE_Colu
275b0 6d 6e 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  mn;.      sqlite
275c0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
275d0 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  f(p->rowSeparato
275e0 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  r), p->rowSepara
275f0 74 6f 72 2c 20 53 45 50 5f 52 6f 77 29 3b 0a 20  tor, SEP_Row);. 
27600 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d     }else if( c2=
27610 3d 27 6c 27 20 26 26 20 6e 32 3e 32 20 26 26 20  ='l' && n2>2 && 
27620 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d  strncmp(azArg[1]
27630 2c 22 6c 69 73 74 22 2c 6e 32 29 3d 3d 30 20 29  ,"list",n2)==0 )
27640 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20  {.      p->mode 
27650 3d 20 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20  = MODE_List;.   
27660 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
27670 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f  ntf(sizeof(p->co
27680 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e  lSeparator), p->
27690 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 53 45  colSeparator, SE
276a0 50 5f 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  P_Column);.     
276b0 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
276c0 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53  f(sizeof(p->rowS
276d0 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f  eparator), p->ro
276e0 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f  wSeparator, SEP_
276f0 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Row);.    }else 
27700 69 66 28 20 63 32 3d 3d 27 68 27 20 26 26 20 73  if( c2=='h' && s
27710 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  trncmp(azArg[1],
27720 22 68 74 6d 6c 22 2c 6e 32 29 3d 3d 30 20 29 7b  "html",n2)==0 ){
27730 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d  .      p->mode =
27740 20 4d 4f 44 45 5f 48 74 6d 6c 3b 0a 20 20 20 20   MODE_Html;.    
27750 7d 65 6c 73 65 20 69 66 28 20 63 32 3d 3d 27 74  }else if( c2=='t
27760 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
27770 72 67 5b 31 5d 2c 22 74 63 6c 22 2c 6e 32 29 3d  rg[1],"tcl",n2)=
27780 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d  =0 ){.      p->m
27790 6f 64 65 20 3d 20 4d 4f 44 45 5f 54 63 6c 3b 0a  ode = MODE_Tcl;.
277a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
277b0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
277c0 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c 20  >colSeparator), 
277d0 70 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c  p->colSeparator,
277e0 20 53 45 50 5f 53 70 61 63 65 29 3b 0a 20 20 20   SEP_Space);.   
277f0 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
27800 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 72 6f  ntf(sizeof(p->ro
27810 77 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e  wSeparator), p->
27820 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 20 53 45  rowSeparator, SE
27830 50 5f 52 6f 77 29 3b 0a 20 20 20 20 7d 65 6c 73  P_Row);.    }els
27840 65 20 69 66 28 20 63 32 3d 3d 27 63 27 20 26 26  e if( c2=='c' &&
27850 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31   strncmp(azArg[1
27860 5d 2c 22 63 73 76 22 2c 6e 32 29 3d 3d 30 20 29  ],"csv",n2)==0 )
27870 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20  {.      p->mode 
27880 3d 20 4d 4f 44 45 5f 43 73 76 3b 0a 20 20 20 20  = MODE_Csv;.    
27890 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
278a0 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c  tf(sizeof(p->col
278b0 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63  Separator), p->c
278c0 6f 6c 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50  olSeparator, SEP
278d0 5f 43 6f 6d 6d 61 29 3b 0a 20 20 20 20 20 20 73  _Comma);.      s
278e0 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
278f0 73 69 7a 65 6f 66 28 70 2d 3e 72 6f 77 53 65 70  sizeof(p->rowSep
27900 61 72 61 74 6f 72 29 2c 20 70 2d 3e 72 6f 77 53  arator), p->rowS
27910 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f 43 72  eparator, SEP_Cr
27920 4c 66 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  Lf);.    }else i
27930 66 28 20 63 32 3d 3d 27 74 27 20 26 26 20 73 74  f( c2=='t' && st
27940 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c 22  rncmp(azArg[1],"
27950 74 61 62 73 22 2c 6e 32 29 3d 3d 30 20 29 7b 0a  tabs",n2)==0 ){.
27960 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65 20 3d 20        p->mode = 
27970 4d 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 20 20 20  MODE_List;.     
27980 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
27990 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53  f(sizeof(p->colS
279a0 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e 63 6f  eparator), p->co
279b0 6c 53 65 70 61 72 61 74 6f 72 2c 20 53 45 50 5f  lSeparator, SEP_
279c0 54 61 62 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Tab);.    }else 
279d0 69 66 28 20 63 32 3d 3d 27 69 27 20 26 26 20 73  if( c2=='i' && s
279e0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d 2c  trncmp(azArg[1],
279f0 22 69 6e 73 65 72 74 22 2c 6e 32 29 3d 3d 30 20  "insert",n2)==0 
27a00 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  ){.      p->mode
27a10 20 3d 20 4d 4f 44 45 5f 49 6e 73 65 72 74 3b 0a   = MODE_Insert;.
27a20 20 20 20 20 20 20 73 65 74 5f 74 61 62 6c 65 5f        set_table_
27a30 6e 61 6d 65 28 70 2c 20 6e 41 72 67 3e 3d 33 20  name(p, nArg>=3 
27a40 3f 20 61 7a 41 72 67 5b 32 5d 20 3a 20 22 74 61  ? azArg[2] : "ta
27a50 62 6c 65 22 29 3b 0a 20 20 20 20 7d 65 6c 73 65  ble");.    }else
27a60 20 69 66 28 20 63 32 3d 3d 27 71 27 20 26 26 20   if( c2=='q' && 
27a70 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 31 5d  strncmp(azArg[1]
27a80 2c 22 71 75 6f 74 65 22 2c 6e 32 29 3d 3d 30 20  ,"quote",n2)==0 
27a90 29 7b 0a 20 20 20 20 20 20 70 2d 3e 6d 6f 64 65  ){.      p->mode
27aa0 20 3d 20 4d 4f 44 45 5f 51 75 6f 74 65 3b 0a 20   = MODE_Quote;. 
27ab0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 63 32 3d     }else if( c2=
27ac0 3d 27 61 27 20 26 26 20 73 74 72 6e 63 6d 70 28  ='a' && strncmp(
27ad0 61 7a 41 72 67 5b 31 5d 2c 22 61 73 63 69 69 22  azArg[1],"ascii"
27ae0 2c 6e 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ,n2)==0 ){.     
27af0 20 70 2d 3e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f   p->mode = MODE_
27b00 41 73 63 69 69 3b 0a 20 20 20 20 20 20 73 71 6c  Ascii;.      sql
27b10 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69  ite3_snprintf(si
27b20 7a 65 6f 66 28 70 2d 3e 63 6f 6c 53 65 70 61 72  zeof(p->colSepar
27b30 61 74 6f 72 29 2c 20 70 2d 3e 63 6f 6c 53 65 70  ator), p->colSep
27b40 61 72 61 74 6f 72 2c 20 53 45 50 5f 55 6e 69 74  arator, SEP_Unit
27b50 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
27b60 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
27b70 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f 72  (p->rowSeparator
27b80 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ), p->rowSeparat
27b90 6f 72 2c 20 53 45 50 5f 52 65 63 6f 72 64 29 3b  or, SEP_Record);
27ba0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  .    }else if( n
27bb0 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Arg==1 ){.      
27bc0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
27bd0 74 2c 20 22 63 75 72 72 65 6e 74 20 6f 75 74 70  t, "current outp
27be0 75 74 20 6d 6f 64 65 3a 20 25 73 5c 6e 22 2c 20  ut mode: %s\n", 
27bf0 6d 6f 64 65 44 65 73 63 72 5b 70 2d 3e 6d 6f 64  modeDescr[p->mod
27c00 65 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  e]);.    }else{.
27c10 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
27c20 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
27c30 20 6d 6f 64 65 20 73 68 6f 75 6c 64 20 62 65 20   mode should be 
27c40 6f 6e 65 20 6f 66 3a 20 22 0a 20 20 20 20 20 20  one of: ".      
27c50 20 20 20 22 61 73 63 69 69 20 63 6f 6c 75 6d 6e     "ascii column
27c60 20 63 73 76 20 68 74 6d 6c 20 69 6e 73 65 72 74   csv html insert
27c70 20 6c 69 6e 65 20 6c 69 73 74 20 71 75 6f 74 65   line list quote
27c80 20 74 61 62 73 20 74 63 6c 5c 6e 22 29 3b 0a 20   tabs tcl\n");. 
27c90 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
27ca0 20 7d 0a 20 20 20 20 70 2d 3e 63 4d 6f 64 65 20   }.    p->cMode 
27cb0 3d 20 70 2d 3e 6d 6f 64 65 3b 0a 20 20 7d 65 6c  = p->mode;.  }el
27cc0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6e 27  se..  if( c=='n'
27cd0 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
27ce0 67 5b 30 5d 2c 20 22 6e 75 6c 6c 76 61 6c 75 65  g[0], "nullvalue
27cf0 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
27d00 69 66 28 20 6e 41 72 67 3d 3d 32 20 29 7b 0a 20  if( nArg==2 ){. 
27d10 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
27d20 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e  rintf(sizeof(p->
27d30 6e 75 6c 6c 56 61 6c 75 65 29 2c 20 70 2d 3e 6e  nullValue), p->n
27d40 75 6c 6c 56 61 6c 75 65 2c 0a 20 20 20 20 20 20  ullValue,.      
27d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
27d60 20 22 25 2e 2a 73 22 2c 20 28 69 6e 74 29 41 72   "%.*s", (int)Ar
27d70 72 61 79 53 69 7a 65 28 70 2d 3e 6e 75 6c 6c 56  raySize(p->nullV
27d80 61 6c 75 65 29 2d 31 2c 20 61 7a 41 72 67 5b 31  alue)-1, azArg[1
27d90 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ]);.    }else{. 
27da0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
27db0 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
27dc0 2e 6e 75 6c 6c 76 61 6c 75 65 20 53 54 52 49 4e  .nullvalue STRIN
27dd0 47 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20  G\n");.      rc 
27de0 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  = 1;.    }.  }el
27df0 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 6f 27  se..  if( c=='o'
27e00 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72   && strncmp(azAr
27e10 67 5b 30 5d 2c 20 22 6f 70 65 6e 22 2c 20 6e 29  g[0], "open", n)
27e20 3d 3d 30 20 26 26 20 6e 3e 3d 32 20 29 7b 0a 20  ==0 && n>=2 ){. 
27e30 20 20 20 63 68 61 72 20 2a 7a 4e 65 77 46 69 6c     char *zNewFil
27e40 65 6e 61 6d 65 3b 20 20 2f 2a 20 4e 61 6d 65 20  ename;  /* Name 
27e50 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
27e60 66 69 6c 65 20 74 6f 20 6f 70 65 6e 20 2a 2f 0a  file to open */.
27e70 20 20 20 20 69 6e 74 20 69 4e 61 6d 65 20 3d 20      int iName = 
27e80 31 3b 20 20 20 20 20 20 20 2f 2a 20 49 6e 64 65  1;       /* Inde
27e90 78 20 69 6e 20 61 7a 41 72 67 5b 5d 20 6f 66 20  x in azArg[] of 
27ea0 74 68 65 20 66 69 6c 65 6e 61 6d 65 20 2a 2f 0a  the filename */.
27eb0 20 20 20 20 69 6e 74 20 6e 65 77 46 6c 61 67 20      int newFlag 
27ec0 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65  = 0;     /* True
27ed0 20 74 6f 20 64 65 6c 65 74 65 20 66 69 6c 65 20   to delete file 
27ee0 62 65 66 6f 72 65 20 6f 70 65 6e 69 6e 67 20 2a  before opening *
27ef0 2f 0a 20 20 20 20 2f 2a 20 43 6c 6f 73 65 20 74  /.    /* Close t
27f00 68 65 20 65 78 69 73 74 69 6e 67 20 64 61 74 61  he existing data
27f10 62 61 73 65 20 2a 2f 0a 20 20 20 20 73 65 73 73  base */.    sess
27f20 69 6f 6e 5f 63 6c 6f 73 65 5f 61 6c 6c 28 70 29  ion_close_all(p)
27f30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6c  ;.    sqlite3_cl
27f40 6f 73 65 28 70 2d 3e 64 62 29 3b 0a 20 20 20 20  ose(p->db);.    
27f50 70 2d 3e 64 62 20 3d 20 30 3b 0a 20 20 20 20 70  p->db = 0;.    p
27f60 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d 20  ->zDbFilename = 
27f70 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 66  0;.    sqlite3_f
27f80 72 65 65 28 70 2d 3e 7a 46 72 65 65 4f 6e 43 6c  ree(p->zFreeOnCl
27f90 6f 73 65 29 3b 0a 20 20 20 20 70 2d 3e 7a 46 72  ose);.    p->zFr
27fa0 65 65 4f 6e 43 6c 6f 73 65 20 3d 20 30 3b 0a 20  eeOnClose = 0;. 
27fb0 20 20 20 2f 2a 20 43 68 65 63 6b 20 66 6f 72 20     /* Check for 
27fc0 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20 61 72 67  command-line arg
27fd0 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 66 6f  uments */.    fo
27fe0 72 28 69 4e 61 6d 65 3d 31 3b 20 69 4e 61 6d 65  r(iName=1; iName
27ff0 3c 6e 41 72 67 20 26 26 20 61 7a 41 72 67 5b 69  <nArg && azArg[i
28000 4e 61 6d 65 5d 5b 30 5d 3d 3d 27 2d 27 3b 20 69  Name][0]=='-'; i
28010 4e 61 6d 65 2b 2b 29 7b 0a 20 20 20 20 20 20 63  Name++){.      c
28020 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61  onst char *z = a
28030 7a 41 72 67 5b 69 4e 61 6d 65 5d 3b 0a 20 20 20  zArg[iName];.   
28040 20 20 20 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74     if( optionMat
28050 63 68 28 7a 2c 22 6e 65 77 22 29 20 29 7b 0a 20  ch(z,"new") ){. 
28060 20 20 20 20 20 20 20 6e 65 77 46 6c 61 67 20 3d         newFlag =
28070 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20   1;.      }else 
28080 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b  if( z[0]=='-' ){
28090 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
280a0 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 75 6e  intf(stderr, "un
280b0 6b 6e 6f 77 6e 20 6f 70 74 69 6f 6e 3a 20 25 73  known option: %s
280c0 5c 6e 22 2c 20 7a 29 3b 0a 20 20 20 20 20 20 20  \n", z);.       
280d0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
280e0 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
280f0 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d  nd_exit;.      }
28100 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 66  .    }.    /* If
28110 20 61 20 66 69 6c 65 6e 61 6d 65 20 69 73 20 73   a filename is s
28120 70 65 63 69 66 69 65 64 2c 20 74 72 79 20 74 6f  pecified, try to
28130 20 6f 70 65 6e 20 69 74 20 66 69 72 73 74 20 2a   open it first *
28140 2f 0a 20 20 20 20 7a 4e 65 77 46 69 6c 65 6e 61  /.    zNewFilena
28150 6d 65 20 3d 20 6e 41 72 67 3e 69 4e 61 6d 65 20  me = nArg>iName 
28160 3f 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  ? sqlite3_mprint
28170 66 28 22 25 73 22 2c 20 61 7a 41 72 67 5b 69 4e  f("%s", azArg[iN
28180 61 6d 65 5d 29 20 3a 20 30 3b 0a 20 20 20 20 69  ame]) : 0;.    i
28190 66 28 20 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 20  f( zNewFilename 
281a0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 65 77  ){.      if( new
281b0 46 6c 61 67 20 29 20 73 68 65 6c 6c 44 65 6c 65  Flag ) shellDele
281c0 74 65 46 69 6c 65 28 7a 4e 65 77 46 69 6c 65 6e  teFile(zNewFilen
281d0 61 6d 65 29 3b 0a 20 20 20 20 20 20 70 2d 3e 7a  ame);.      p->z
281e0 44 62 46 69 6c 65 6e 61 6d 65 20 3d 20 7a 4e 65  DbFilename = zNe
281f0 77 46 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20  wFilename;.     
28200 20 6f 70 65 6e 5f 64 62 28 70 2c 20 31 29 3b 0a   open_db(p, 1);.
28210 20 20 20 20 20 20 69 66 28 20 70 2d 3e 64 62 3d        if( p->db=
28220 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74  =0 ){.        ut
28230 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
28240 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74  , "Error: cannot
28250 20 6f 70 65 6e 20 27 25 73 27 5c 6e 22 2c 20 7a   open '%s'\n", z
28260 4e 65 77 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20  NewFilename);.  
28270 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
28280 65 65 28 7a 4e 65 77 46 69 6c 65 6e 61 6d 65 29  ee(zNewFilename)
28290 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
282a0 20 20 20 20 20 20 20 70 2d 3e 7a 46 72 65 65 4f         p->zFreeO
282b0 6e 43 6c 6f 73 65 20 3d 20 7a 4e 65 77 46 69 6c  nClose = zNewFil
282c0 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 7d 0a 20  ename;.      }. 
282d0 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 2d 3e     }.    if( p->
282e0 64 62 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  db==0 ){.      /
282f0 2a 20 41 73 20 61 20 66 61 6c 6c 2d 62 61 63 6b  * As a fall-back
28300 20 6f 70 65 6e 20 61 20 54 45 4d 50 20 64 61 74   open a TEMP dat
28310 61 62 61 73 65 20 2a 2f 0a 20 20 20 20 20 20 70  abase */.      p
28320 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d 20  ->zDbFilename = 
28330 30 3b 0a 20 20 20 20 20 20 6f 70 65 6e 5f 64 62  0;.      open_db
28340 28 70 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20  (p, 0);.    }.  
28350 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
28360 27 6f 27 0a 20 20 20 26 26 20 28 73 74 72 6e 63  'o'.   && (strnc
28370 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f 75  mp(azArg[0], "ou
28380 74 70 75 74 22 2c 20 6e 29 3d 3d 30 20 7c 7c 20  tput", n)==0 || 
28390 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
283a0 2c 20 22 6f 6e 63 65 22 2c 20 6e 29 3d 3d 30 29  , "once", n)==0)
283b0 0a 20 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  .  ){.    const 
283c0 63 68 61 72 20 2a 7a 46 69 6c 65 20 3d 20 6e 41  char *zFile = nA
283d0 72 67 3e 3d 32 20 3f 20 61 7a 41 72 67 5b 31 5d  rg>=2 ? azArg[1]
283e0 20 3a 20 22 73 74 64 6f 75 74 22 3b 0a 20 20 20   : "stdout";.   
283f0 20 69 66 28 20 6e 41 72 67 3e 32 20 29 7b 0a 20   if( nArg>2 ){. 
28400 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
28410 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
28420 20 2e 25 73 20 46 49 4c 45 5c 6e 22 2c 20 61 7a   .%s FILE\n", az
28430 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 72  Arg[0]);.      r
28440 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74  c = 1;.      got
28450 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
28460 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  xit;.    }.    i
28470 66 28 20 6e 3e 31 20 26 26 20 73 74 72 6e 63 6d  f( n>1 && strncm
28480 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 6f 6e 63  p(azArg[0], "onc
28490 65 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  e", n)==0 ){.   
284a0 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20 29 7b     if( nArg<2 ){
284b0 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
284c0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
284d0 67 65 3a 20 2e 6f 6e 63 65 20 46 49 4c 45 5c 6e  ge: .once FILE\n
284e0 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ");.        rc =
284f0 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
28500 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
28510 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  it;.      }.    
28520 20 20 70 2d 3e 6f 75 74 43 6f 75 6e 74 20 3d 20    p->outCount = 
28530 32 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  2;.    }else{.  
28540 20 20 20 20 70 2d 3e 6f 75 74 43 6f 75 6e 74 20      p->outCount 
28550 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f  = 0;.    }.    o
28560 75 74 70 75 74 5f 72 65 73 65 74 28 70 29 3b 0a  utput_reset(p);.
28570 20 20 20 20 69 66 28 20 7a 46 69 6c 65 5b 30 5d      if( zFile[0]
28580 3d 3d 27 7c 27 20 29 7b 0a 23 69 66 64 65 66 20  =='|' ){.#ifdef 
28590 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 50 4f 50 45  SQLITE_OMIT_POPE
285a0 4e 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  N.      raw_prin
285b0 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f  tf(stderr, "Erro
285c0 72 3a 20 70 69 70 65 73 20 61 72 65 20 6e 6f 74  r: pipes are not
285d0 20 73 75 70 70 6f 72 74 65 64 20 69 6e 20 74 68   supported in th
285e0 69 73 20 4f 53 5c 6e 22 29 3b 0a 20 20 20 20 20  is OS\n");.     
285f0 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 70   rc = 1;.      p
28600 2d 3e 6f 75 74 20 3d 20 73 74 64 6f 75 74 3b 0a  ->out = stdout;.
28610 23 65 6c 73 65 0a 20 20 20 20 20 20 70 2d 3e 6f  #else.      p->o
28620 75 74 20 3d 20 70 6f 70 65 6e 28 7a 46 69 6c 65  ut = popen(zFile
28630 20 2b 20 31 2c 20 22 77 22 29 3b 0a 20 20 20 20   + 1, "w");.    
28640 20 20 69 66 28 20 70 2d 3e 6f 75 74 3d 3d 30 20    if( p->out==0 
28650 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
28660 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
28670 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70 65  rror: cannot ope
28680 6e 20 70 69 70 65 20 5c 22 25 73 5c 22 5c 6e 22  n pipe \"%s\"\n"
28690 2c 20 7a 46 69 6c 65 20 2b 20 31 29 3b 0a 20 20  , zFile + 1);.  
286a0 20 20 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 73        p->out = s
286b0 74 64 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 72  tdout;.        r
286c0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  c = 1;.      }el
286d0 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
286e0 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
286f0 65 6f 66 28 70 2d 3e 6f 75 74 66 69 6c 65 29 2c  eof(p->outfile),
28700 20 70 2d 3e 6f 75 74 66 69 6c 65 2c 20 22 25 73   p->outfile, "%s
28710 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20  ", zFile);.     
28720 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 7d 65   }.#endif.    }e
28730 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6f 75  lse{.      p->ou
28740 74 20 3d 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f  t = output_file_
28750 6f 70 65 6e 28 7a 46 69 6c 65 29 3b 0a 20 20 20  open(zFile);.   
28760 20 20 20 69 66 28 20 70 2d 3e 6f 75 74 3d 3d 30     if( p->out==0
28770 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20   ){.        if( 
28780 73 74 72 63 6d 70 28 7a 46 69 6c 65 2c 22 6f 66  strcmp(zFile,"of
28790 66 22 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  f")!=0 ){.      
287a0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
287b0 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 63  stderr,"Error: c
287c0 61 6e 6e 6f 74 20 77 72 69 74 65 20 74 6f 20 5c  annot write to \
287d0 22 25 73 5c 22 5c 6e 22 2c 20 7a 46 69 6c 65 29  "%s\"\n", zFile)
287e0 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
287f0 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20 73 74 64      p->out = std
28800 6f 75 74 3b 0a 20 20 20 20 20 20 20 20 72 63 20  out;.        rc 
28810 3d 20 31 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73  = 1;.      } els
28820 65 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  e {.        sqli
28830 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
28840 65 6f 66 28 70 2d 3e 6f 75 74 66 69 6c 65 29 2c  eof(p->outfile),
28850 20 70 2d 3e 6f 75 74 66 69 6c 65 2c 20 22 25 73   p->outfile, "%s
28860 22 2c 20 7a 46 69 6c 65 29 3b 0a 20 20 20 20 20  ", zFile);.     
28870 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
28880 0a 0a 20 20 69 66 28 20 63 3d 3d 27 70 27 20 26  ..  if( c=='p' &
28890 26 20 6e 3e 3d 33 20 26 26 20 73 74 72 6e 63 6d  & n>=3 && strncm
288a0 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 70 72 69  p(azArg[0], "pri
288b0 6e 74 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  nt", n)==0 ){.  
288c0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72    int i;.    for
288d0 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69 2b  (i=1; i<nArg; i+
288e0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 69 3e  +){.      if( i>
288f0 31 20 29 20 72 61 77 5f 70 72 69 6e 74 66 28 70  1 ) raw_printf(p
28900 2d 3e 6f 75 74 2c 20 22 20 22 29 3b 0a 20 20 20  ->out, " ");.   
28910 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
28920 2d 3e 6f 75 74 2c 20 22 25 73 22 2c 20 61 7a 41  ->out, "%s", azA
28930 72 67 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20  rg[i]);.    }.  
28940 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
28950 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 7d 65  out, "\n");.  }e
28960 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 70  lse..  if( c=='p
28970 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
28980 72 67 5b 30 5d 2c 20 22 70 72 6f 6d 70 74 22 2c  rg[0], "prompt",
28990 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66   n)==0 ){.    if
289a0 28 20 6e 41 72 67 20 3e 3d 20 32 29 20 7b 0a 20  ( nArg >= 2) {. 
289b0 20 20 20 20 20 73 74 72 6e 63 70 79 28 6d 61 69       strncpy(mai
289c0 6e 50 72 6f 6d 70 74 2c 61 7a 41 72 67 5b 31 5d  nPrompt,azArg[1]
289d0 2c 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28  ,(int)ArraySize(
289e0 6d 61 69 6e 50 72 6f 6d 70 74 29 2d 31 29 3b 0a  mainPrompt)-1);.
289f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41      }.    if( nA
28a00 72 67 20 3e 3d 20 33 29 20 7b 0a 20 20 20 20 20  rg >= 3) {.     
28a10 20 73 74 72 6e 63 70 79 28 63 6f 6e 74 69 6e 75   strncpy(continu
28a20 65 50 72 6f 6d 70 74 2c 61 7a 41 72 67 5b 32 5d  ePrompt,azArg[2]
28a30 2c 28 69 6e 74 29 41 72 72 61 79 53 69 7a 65 28  ,(int)ArraySize(
28a40 63 6f 6e 74 69 6e 75 65 50 72 6f 6d 70 74 29 2d  continuePrompt)-
28a50 31 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73  1);.    }.  }els
28a60 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 71 27 20  e..  if( c=='q' 
28a70 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
28a80 5b 30 5d 2c 20 22 71 75 69 74 22 2c 20 6e 29 3d  [0], "quit", n)=
28a90 3d 30 20 29 7b 0a 20 20 20 20 72 63 20 3d 20 32  =0 ){.    rc = 2
28aa0 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28  ;.  }else..  if(
28ab0 20 63 3d 3d 27 72 27 20 26 26 20 6e 3e 3d 33 20   c=='r' && n>=3 
28ac0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
28ad0 5b 30 5d 2c 20 22 72 65 61 64 22 2c 20 6e 29 3d  [0], "read", n)=
28ae0 3d 30 20 29 7b 0a 20 20 20 20 46 49 4c 45 20 2a  =0 ){.    FILE *
28af0 61 6c 74 3b 0a 20 20 20 20 69 66 28 20 6e 41 72  alt;.    if( nAr
28b00 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 61  g!=2 ){.      ra
28b10 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
28b20 20 22 55 73 61 67 65 3a 20 2e 72 65 61 64 20 46   "Usage: .read F
28b30 49 4c 45 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  ILE\n");.      r
28b40 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 67 6f 74  c = 1;.      got
28b50 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
28b60 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  xit;.    }.    a
28b70 6c 74 20 3d 20 66 6f 70 65 6e 28 61 7a 41 72 67  lt = fopen(azArg
28b80 5b 31 5d 2c 20 22 72 62 22 29 3b 0a 20 20 20 20  [1], "rb");.    
28b90 69 66 28 20 61 6c 74 3d 3d 30 20 29 7b 0a 20 20  if( alt==0 ){.  
28ba0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
28bb0 73 74 64 65 72 72 2c 22 45 72 72 6f 72 3a 20 63  stderr,"Error: c
28bc0 61 6e 6e 6f 74 20 6f 70 65 6e 20 5c 22 25 73 5c  annot open \"%s\
28bd0 22 5c 6e 22 2c 20 61 7a 41 72 67 5b 31 5d 29 3b  "\n", azArg[1]);
28be0 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
28bf0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
28c00 72 63 20 3d 20 70 72 6f 63 65 73 73 5f 69 6e 70  rc = process_inp
28c10 75 74 28 70 2c 20 61 6c 74 29 3b 0a 20 20 20 20  ut(p, alt);.    
28c20 20 20 66 63 6c 6f 73 65 28 61 6c 74 29 3b 0a 20    fclose(alt);. 
28c30 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
28c40 69 66 28 20 63 3d 3d 27 72 27 20 26 26 20 6e 3e  if( c=='r' && n>
28c50 3d 33 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  =3 && strncmp(az
28c60 41 72 67 5b 30 5d 2c 20 22 72 65 73 74 6f 72 65  Arg[0], "restore
28c70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
28c80 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 72 63  const char *zSrc
28c90 46 69 6c 65 3b 0a 20 20 20 20 63 6f 6e 73 74 20  File;.    const 
28ca0 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 20 20 73  char *zDb;.    s
28cb0 71 6c 69 74 65 33 20 2a 70 53 72 63 3b 0a 20 20  qlite3 *pSrc;.  
28cc0 20 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70    sqlite3_backup
28cd0 20 2a 70 42 61 63 6b 75 70 3b 0a 20 20 20 20 69   *pBackup;.    i
28ce0 6e 74 20 6e 54 69 6d 65 6f 75 74 20 3d 20 30 3b  nt nTimeout = 0;
28cf0 0a 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d  ..    if( nArg==
28d00 32 20 29 7b 0a 20 20 20 20 20 20 7a 53 72 63 46  2 ){.      zSrcF
28d10 69 6c 65 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a  ile = azArg[1];.
28d20 20 20 20 20 20 20 7a 44 62 20 3d 20 22 6d 61 69        zDb = "mai
28d30 6e 22 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  n";.    }else if
28d40 28 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20 20 20  ( nArg==3 ){.   
28d50 20 20 20 7a 53 72 63 46 69 6c 65 20 3d 20 61 7a     zSrcFile = az
28d60 41 72 67 5b 32 5d 3b 0a 20 20 20 20 20 20 7a 44  Arg[2];.      zD
28d70 62 20 3d 20 61 7a 41 72 67 5b 31 5d 3b 0a 20 20  b = azArg[1];.  
28d80 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72    }else{.      r
28d90 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  aw_printf(stderr
28da0 2c 20 22 55 73 61 67 65 3a 20 2e 72 65 73 74 6f  , "Usage: .resto
28db0 72 65 20 3f 44 42 3f 20 46 49 4c 45 5c 6e 22 29  re ?DB? FILE\n")
28dc0 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a  ;.      rc = 1;.
28dd0 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
28de0 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
28df0 20 20 7d 0a 20 20 20 20 72 63 20 3d 20 73 71 6c    }.    rc = sql
28e00 69 74 65 33 5f 6f 70 65 6e 28 7a 53 72 63 46 69  ite3_open(zSrcFi
28e10 6c 65 2c 20 26 70 53 72 63 29 3b 0a 20 20 20 20  le, &pSrc);.    
28e20 69 66 28 20 72 63 21 3d 53 51 4c 49 54 45 5f 4f  if( rc!=SQLITE_O
28e30 4b 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  K ){.      utf8_
28e40 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
28e50 45 72 72 6f 72 3a 20 63 61 6e 6e 6f 74 20 6f 70  Error: cannot op
28e60 65 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 20 7a 53  en \"%s\"\n", zS
28e70 72 63 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 73  rcFile);.      s
28e80 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 53 72  qlite3_close(pSr
28e90 63 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  c);.      return
28ea0 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 6f 70   1;.    }.    op
28eb0 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
28ec0 20 70 42 61 63 6b 75 70 20 3d 20 73 71 6c 69 74   pBackup = sqlit
28ed0 65 33 5f 62 61 63 6b 75 70 5f 69 6e 69 74 28 70  e3_backup_init(p
28ee0 2d 3e 64 62 2c 20 7a 44 62 2c 20 70 53 72 63 2c  ->db, zDb, pSrc,
28ef0 20 22 6d 61 69 6e 22 29 3b 0a 20 20 20 20 69 66   "main");.    if
28f00 28 20 70 42 61 63 6b 75 70 3d 3d 30 20 29 7b 0a  ( pBackup==0 ){.
28f10 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
28f20 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
28f30 3a 20 25 73 5c 6e 22 2c 20 73 71 6c 69 74 65 33  : %s\n", sqlite3
28f40 5f 65 72 72 6d 73 67 28 70 2d 3e 64 62 29 29 3b  _errmsg(p->db));
28f50 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63  .      sqlite3_c
28f60 6c 6f 73 65 28 70 53 72 63 29 3b 0a 20 20 20 20  lose(pSrc);.    
28f70 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
28f80 7d 0a 20 20 20 20 77 68 69 6c 65 28 20 28 72 63  }.    while( (rc
28f90 20 3d 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75   = sqlite3_backu
28fa0 70 5f 73 74 65 70 28 70 42 61 63 6b 75 70 2c 31  p_step(pBackup,1
28fb0 30 30 29 29 3d 3d 53 51 4c 49 54 45 5f 4f 4b 0a  00))==SQLITE_OK.
28fc0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 72 63 3d            || rc=
28fd0 3d 53 51 4c 49 54 45 5f 42 55 53 59 20 20 29 7b  =SQLITE_BUSY  ){
28fe0 0a 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 53  .      if( rc==S
28ff0 51 4c 49 54 45 5f 42 55 53 59 20 29 7b 0a 20 20  QLITE_BUSY ){.  
29000 20 20 20 20 20 20 69 66 28 20 6e 54 69 6d 65 6f        if( nTimeo
29010 75 74 2b 2b 20 3e 3d 20 33 20 29 20 62 72 65 61  ut++ >= 3 ) brea
29020 6b 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  k;.        sqlit
29030 65 33 5f 73 6c 65 65 70 28 31 30 30 29 3b 0a 20  e3_sleep(100);. 
29040 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
29050 20 73 71 6c 69 74 65 33 5f 62 61 63 6b 75 70 5f   sqlite3_backup_
29060 66 69 6e 69 73 68 28 70 42 61 63 6b 75 70 29 3b  finish(pBackup);
29070 0a 20 20 20 20 69 66 28 20 72 63 3d 3d 53 51 4c  .    if( rc==SQL
29080 49 54 45 5f 44 4f 4e 45 20 29 7b 0a 20 20 20 20  ITE_DONE ){.    
29090 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 7d 65    rc = 0;.    }e
290a0 6c 73 65 20 69 66 28 20 72 63 3d 3d 53 51 4c 49  lse if( rc==SQLI
290b0 54 45 5f 42 55 53 59 20 7c 7c 20 72 63 3d 3d 53  TE_BUSY || rc==S
290c0 51 4c 49 54 45 5f 4c 4f 43 4b 45 44 20 29 7b 0a  QLITE_LOCKED ){.
290d0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
290e0 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72 3a  (stderr, "Error:
290f0 20 73 6f 75 72 63 65 20 64 61 74 61 62 61 73 65   source database
29100 20 69 73 20 62 75 73 79 5c 6e 22 29 3b 0a 20 20   is busy\n");.  
29110 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
29120 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 75 74 66  }else{.      utf
29130 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
29140 20 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c 20   "Error: %s\n", 
29150 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28 70  sqlite3_errmsg(p
29160 2d 3e 64 62 29 29 3b 0a 20 20 20 20 20 20 72 63  ->db));.      rc
29170 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20   = 1;.    }.    
29180 73 71 6c 69 74 65 33 5f 63 6c 6f 73 65 28 70 53  sqlite3_close(pS
29190 72 63 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 0a 20  rc);.  }else... 
291a0 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20 73   if( c=='s' && s
291b0 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
291c0 20 22 73 63 61 6e 73 74 61 74 73 22 2c 20 6e 29   "scanstats", n)
291d0 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 6e  ==0 ){.    if( n
291e0 41 72 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20  Arg==2 ){.      
291f0 70 2d 3e 73 63 61 6e 73 74 61 74 73 4f 6e 20 3d  p->scanstatsOn =
29200 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a   booleanValue(az
29210 41 72 67 5b 31 5d 29 3b 0a 23 69 66 6e 64 65 66  Arg[1]);.#ifndef
29220 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 53   SQLITE_ENABLE_S
29230 54 4d 54 5f 53 43 41 4e 53 54 41 54 55 53 0a 20  TMT_SCANSTATUS. 
29240 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
29250 73 74 64 65 72 72 2c 20 22 57 61 72 6e 69 6e 67  stderr, "Warning
29260 3a 20 2e 73 63 61 6e 73 74 61 74 73 20 6e 6f 74  : .scanstats not
29270 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20 74 68   available in th
29280 69 73 20 62 75 69 6c 64 2e 5c 6e 22 29 3b 0a 23  is build.\n");.#
29290 65 6e 64 69 66 0a 20 20 20 20 7d 65 6c 73 65 7b  endif.    }else{
292a0 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74  .      raw_print
292b0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
292c0 3a 20 2e 73 63 61 6e 73 74 61 74 73 20 6f 6e 7c  : .scanstats on|
292d0 6f 66 66 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72  off\n");.      r
292e0 63 20 3d 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  c = 1;.    }.  }
292f0 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
29300 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  s' && strncmp(az
29310 41 72 67 5b 30 5d 2c 20 22 73 63 68 65 6d 61 22  Arg[0], "schema"
29320 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 53  , n)==0 ){.    S
29330 68 65 6c 6c 54 65 78 74 20 73 53 65 6c 65 63 74  hellText sSelect
29340 3b 0a 20 20 20 20 53 68 65 6c 6c 53 74 61 74 65  ;.    ShellState
29350 20 64 61 74 61 3b 0a 20 20 20 20 63 68 61 72 20   data;.    char 
29360 2a 7a 45 72 72 4d 73 67 20 3d 20 30 3b 0a 20 20  *zErrMsg = 0;.  
29370 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44    const char *zD
29380 69 76 20 3d 20 22 28 22 3b 0a 20 20 20 20 63 6f  iv = "(";.    co
29390 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 20  nst char *zName 
293a0 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 53 63  = 0;.    int iSc
293b0 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 69 6e  hema = 0;.    in
293c0 74 20 62 44 65 62 75 67 20 3d 20 30 3b 0a 20 20  t bDebug = 0;.  
293d0 20 20 69 6e 74 20 69 69 3b 0a 0a 20 20 20 20 6f    int ii;..    o
293e0 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
293f0 20 20 6d 65 6d 63 70 79 28 26 64 61 74 61 2c 20    memcpy(&data, 
29400 70 2c 20 73 69 7a 65 6f 66 28 64 61 74 61 29 29  p, sizeof(data))
29410 3b 0a 20 20 20 20 64 61 74 61 2e 73 68 6f 77 48  ;.    data.showH
29420 65 61 64 65 72 20 3d 20 30 3b 0a 20 20 20 20 64  eader = 0;.    d
29430 61 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61  ata.cMode = data
29440 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 53 65 6d  .mode = MODE_Sem
29450 69 3b 0a 20 20 20 20 69 6e 69 74 54 65 78 74 28  i;.    initText(
29460 26 73 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 66  &sSelect);.    f
29470 6f 72 28 69 69 3d 31 3b 20 69 69 3c 6e 41 72 67  or(ii=1; ii<nArg
29480 3b 20 69 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  ; ii++){.      i
29490 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28 61  f( optionMatch(a
294a0 7a 41 72 67 5b 69 69 5d 2c 22 69 6e 64 65 6e 74  zArg[ii],"indent
294b0 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 64 61  ") ){.        da
294c0 74 61 2e 63 4d 6f 64 65 20 3d 20 64 61 74 61 2e  ta.cMode = data.
294d0 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 50 72 65 74  mode = MODE_Pret
294e0 74 79 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ty;.      }else 
294f0 69 66 28 20 6f 70 74 69 6f 6e 4d 61 74 63 68 28  if( optionMatch(
29500 61 7a 41 72 67 5b 69 69 5d 2c 22 64 65 62 75 67  azArg[ii],"debug
29510 22 29 20 29 7b 0a 20 20 20 20 20 20 20 20 62 44  ") ){.        bD
29520 65 62 75 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  ebug = 1;.      
29530 7d 65 6c 73 65 20 69 66 28 20 7a 4e 61 6d 65 3d  }else if( zName=
29540 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 4e  =0 ){.        zN
29550 61 6d 65 20 3d 20 61 7a 41 72 67 5b 69 69 5d 3b  ame = azArg[ii];
29560 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
29570 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
29580 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a  (stderr, "Usage:
29590 20 2e 73 63 68 65 6d 61 20 3f 2d 2d 69 6e 64 65   .schema ?--inde
295a0 6e 74 3f 20 3f 4c 49 4b 45 2d 50 41 54 54 45 52  nt? ?LIKE-PATTER
295b0 4e 3f 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20  N?\n");.        
295c0 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  rc = 1;.        
295d0 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
295e0 64 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a  d_exit;.      }.
295f0 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 4e      }.    if( zN
29600 61 6d 65 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ame!=0 ){.      
29610 69 6e 74 20 69 73 4d 61 73 74 65 72 20 3d 20 73  int isMaster = s
29620 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28 7a  qlite3_strlike(z
29630 4e 61 6d 65 2c 20 22 73 71 6c 69 74 65 5f 6d 61  Name, "sqlite_ma
29640 73 74 65 72 22 2c 20 30 29 3d 3d 30 3b 0a 20 20  ster", 0)==0;.  
29650 20 20 20 20 69 66 28 20 69 73 4d 61 73 74 65 72      if( isMaster
29660 20 7c 7c 20 73 71 6c 69 74 65 33 5f 73 74 72 6c   || sqlite3_strl
29670 69 6b 65 28 7a 4e 61 6d 65 2c 22 73 71 6c 69 74  ike(zName,"sqlit
29680 65 5f 74 65 6d 70 5f 6d 61 73 74 65 72 22 2c 30  e_temp_master",0
29690 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
296a0 63 68 61 72 20 2a 6e 65 77 5f 61 72 67 76 5b 32  char *new_argv[2
296b0 5d 2c 20 2a 6e 65 77 5f 63 6f 6c 76 5b 32 5d 3b  ], *new_colv[2];
296c0 0a 20 20 20 20 20 20 20 20 6e 65 77 5f 61 72 67  .        new_arg
296d0 76 5b 30 5d 20 3d 20 73 71 6c 69 74 65 33 5f 6d  v[0] = sqlite3_m
296e0 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20  printf(.        
296f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 43                "C
29700 52 45 41 54 45 20 54 41 42 4c 45 20 25 73 20 28  REATE TABLE %s (
29710 5c 6e 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  \n".            
29720 20 20 20 20 20 20 20 20 20 20 22 20 20 74 79 70            "  typ
29730 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20 20 20  e text,\n".     
29740 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29750 20 22 20 20 6e 61 6d 65 20 74 65 78 74 2c 5c 6e   "  name text,\n
29760 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
29770 20 20 20 20 20 20 20 20 22 20 20 74 62 6c 5f 6e          "  tbl_n
29780 61 6d 65 20 74 65 78 74 2c 5c 6e 22 0a 20 20 20  ame text,\n".   
29790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
297a0 20 20 20 22 20 20 72 6f 6f 74 70 61 67 65 20 69     "  rootpage i
297b0 6e 74 65 67 65 72 2c 5c 6e 22 0a 20 20 20 20 20  nteger,\n".     
297c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
297d0 20 22 20 20 73 71 6c 20 74 65 78 74 5c 6e 22 0a   "  sql text\n".
297e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
297f0 20 20 20 20 20 20 22 29 22 2c 20 69 73 4d 61 73        ")", isMas
29800 74 65 72 20 3f 20 22 73 71 6c 69 74 65 5f 6d 61  ter ? "sqlite_ma
29810 73 74 65 72 22 20 3a 20 22 73 71 6c 69 74 65 5f  ster" : "sqlite_
29820 74 65 6d 70 5f 6d 61 73 74 65 72 22 29 3b 0a 20  temp_master");. 
29830 20 20 20 20 20 20 20 6e 65 77 5f 61 72 67 76 5b         new_argv[
29840 31 5d 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  1] = 0;.        
29850 6e 65 77 5f 63 6f 6c 76 5b 30 5d 20 3d 20 22 73  new_colv[0] = "s
29860 71 6c 22 3b 0a 20 20 20 20 20 20 20 20 6e 65 77  ql";.        new
29870 5f 63 6f 6c 76 5b 31 5d 20 3d 20 30 3b 0a 20 20  _colv[1] = 0;.  
29880 20 20 20 20 20 20 63 61 6c 6c 62 61 63 6b 28 26        callback(&
29890 64 61 74 61 2c 20 31 2c 20 6e 65 77 5f 61 72 67  data, 1, new_arg
298a0 76 2c 20 6e 65 77 5f 63 6f 6c 76 29 3b 0a 20 20  v, new_colv);.  
298b0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72        sqlite3_fr
298c0 65 65 28 6e 65 77 5f 61 72 67 76 5b 30 5d 29 3b  ee(new_argv[0]);
298d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
298e0 20 20 20 69 66 28 20 7a 44 69 76 20 29 7b 0a 20     if( zDiv ){. 
298f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 74 6d       sqlite3_stm
29900 74 20 2a 70 53 74 6d 74 20 3d 20 30 3b 0a 20 20  t *pStmt = 0;.  
29910 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33      rc = sqlite3
29920 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64  _prepare_v2(p->d
29930 62 2c 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20  b, "SELECT name 
29940 46 52 4f 4d 20 70 72 61 67 6d 61 5f 64 61 74 61  FROM pragma_data
29950 62 61 73 65 5f 6c 69 73 74 22 2c 0a 20 20 20 20  base_list",.    
29960 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29970 20 20 20 20 20 20 20 20 20 20 2d 31 2c 20 26 70            -1, &p
29980 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20  Stmt, 0);.      
29990 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
299a0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
299b0 64 65 72 72 2c 20 22 45 72 72 6f 72 3a 20 25 73  derr, "Error: %s
299c0 5c 6e 22 2c 20 73 71 6c 69 74 65 33 5f 65 72 72  \n", sqlite3_err
299d0 6d 73 67 28 70 2d 3e 64 62 29 29 3b 0a 20 20 20  msg(p->db));.   
299e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6e       sqlite3_fin
299f0 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a 20 20  alize(pStmt);.  
29a00 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
29a10 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
29a20 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
29a30 20 20 20 20 7d 0a 20 20 20 20 20 20 61 70 70 65      }.      appe
29a40 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
29a50 20 22 53 45 4c 45 43 54 20 73 71 6c 20 46 52 4f   "SELECT sql FRO
29a60 4d 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 53  M", 0);.      iS
29a70 63 68 65 6d 61 20 3d 20 30 3b 0a 20 20 20 20 20  chema = 0;.     
29a80 20 77 68 69 6c 65 28 20 73 71 6c 69 74 65 33 5f   while( sqlite3_
29a90 73 74 65 70 28 70 53 74 6d 74 29 3d 3d 53 51 4c  step(pStmt)==SQL
29aa0 49 54 45 5f 52 4f 57 20 29 7b 0a 20 20 20 20 20  ITE_ROW ){.     
29ab0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
29ac0 44 62 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72  Db = (const char
29ad0 2a 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  *)sqlite3_column
29ae0 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 3b  _text(pStmt, 0);
29af0 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 7a 53  .        char zS
29b00 63 4e 75 6d 5b 33 30 5d 3b 0a 20 20 20 20 20 20  cNum[30];.      
29b10 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
29b20 74 66 28 73 69 7a 65 6f 66 28 7a 53 63 4e 75 6d  tf(sizeof(zScNum
29b30 29 2c 20 7a 53 63 4e 75 6d 2c 20 22 25 64 22 2c  ), zScNum, "%d",
29b40 20 2b 2b 69 53 63 68 65 6d 61 29 3b 0a 20 20 20   ++iSchema);.   
29b50 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
29b60 26 73 53 65 6c 65 63 74 2c 20 7a 44 69 76 2c 20  &sSelect, zDiv, 
29b70 30 29 3b 0a 20 20 20 20 20 20 20 20 7a 44 69 76  0);.        zDiv
29b80 20 3d 20 22 20 55 4e 49 4f 4e 20 41 4c 4c 20 22   = " UNION ALL "
29b90 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ;.        append
29ba0 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22  Text(&sSelect, "
29bb0 53 45 4c 45 43 54 20 73 68 65 6c 6c 5f 61 64 64  SELECT shell_add
29bc0 5f 73 63 68 65 6d 61 28 73 71 6c 2c 22 2c 20 30  _schema(sql,", 0
29bd0 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  );.        if( s
29be0 71 6c 69 74 65 33 5f 73 74 72 69 63 6d 70 28 7a  qlite3_stricmp(z
29bf0 44 62 2c 20 22 6d 61 69 6e 22 29 21 3d 30 20 29  Db, "main")!=0 )
29c00 7b 0a 20 20 20 20 20 20 20 20 20 20 61 70 70 65  {.          appe
29c10 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c  ndText(&sSelect,
29c20 20 7a 44 62 2c 20 27 22 27 29 3b 0a 20 20 20 20   zDb, '"');.    
29c30 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
29c40 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
29c50 26 73 53 65 6c 65 63 74 2c 20 22 4e 55 4c 4c 22  &sSelect, "NULL"
29c60 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
29c70 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
29c80 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 2c 6e  xt(&sSelect, ",n
29c90 61 6d 65 29 20 41 53 20 73 71 6c 2c 20 74 79 70  ame) AS sql, typ
29ca0 65 2c 20 74 62 6c 5f 6e 61 6d 65 2c 20 6e 61 6d  e, tbl_name, nam
29cb0 65 2c 20 72 6f 77 69 64 2c 22 2c 20 30 29 3b 0a  e, rowid,", 0);.
29cc0 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65          appendTe
29cd0 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a 53 63  xt(&sSelect, zSc
29ce0 4e 75 6d 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  Num, 0);.       
29cf0 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
29d00 6c 65 63 74 2c 20 22 20 41 53 20 73 6e 75 6d 2c  lect, " AS snum,
29d10 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   ", 0);.        
29d20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c  appendText(&sSel
29d30 65 63 74 2c 20 7a 44 62 2c 20 27 5c 27 27 29 3b  ect, zDb, '\'');
29d40 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
29d50 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 22 20  ext(&sSelect, " 
29d60 41 53 20 73 6e 61 6d 65 20 46 52 4f 4d 20 22 2c  AS sname FROM ",
29d70 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70   0);.        app
29d80 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63 74  endText(&sSelect
29d90 2c 20 7a 44 62 2c 20 27 22 27 29 3b 0a 20 20 20  , zDb, '"');.   
29da0 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
29db0 26 73 53 65 6c 65 63 74 2c 20 22 2e 73 71 6c 69  &sSelect, ".sqli
29dc0 74 65 5f 6d 61 73 74 65 72 22 2c 20 30 29 3b 0a  te_master", 0);.
29dd0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
29de0 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70  lite3_finalize(p
29df0 53 74 6d 74 29 3b 0a 23 69 66 64 65 66 20 53 51  Stmt);.#ifdef SQ
29e00 4c 49 54 45 5f 49 4e 54 52 4f 53 50 45 43 54 49  LITE_INTROSPECTI
29e10 4f 4e 5f 50 52 41 47 4d 41 53 0a 20 20 20 20 20  ON_PRAGMAS.     
29e20 20 69 66 28 20 7a 4e 61 6d 65 20 29 7b 0a 20 20   if( zName ){.  
29e30 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
29e40 28 26 73 53 65 6c 65 63 74 2c 0a 20 20 20 20 20  (&sSelect,.     
29e50 20 20 20 20 20 20 22 20 55 4e 49 4f 4e 20 41 4c        " UNION AL
29e60 4c 20 53 45 4c 45 43 54 20 73 68 65 6c 6c 5f 6d  L SELECT shell_m
29e70 6f 64 75 6c 65 5f 73 63 68 65 6d 61 28 6e 61 6d  odule_schema(nam
29e80 65 29 2c 22 0a 20 20 20 20 20 20 20 20 20 20 20  e),".           
29e90 22 20 27 74 61 62 6c 65 27 2c 20 6e 61 6d 65 2c  " 'table', name,
29ea0 20 6e 61 6d 65 2c 20 6e 61 6d 65 2c 20 39 65 2b   name, name, 9e+
29eb0 39 39 2c 20 27 6d 61 69 6e 27 20 46 52 4f 4d 20  99, 'main' FROM 
29ec0 70 72 61 67 6d 61 5f 6d 6f 64 75 6c 65 5f 6c 69  pragma_module_li
29ed0 73 74 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  st", 0);.      }
29ee0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 61 70  .#endif.      ap
29ef0 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65 63  pendText(&sSelec
29f00 74 2c 20 22 29 20 57 48 45 52 45 20 22 2c 20 30  t, ") WHERE ", 0
29f10 29 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4e 61  );.      if( zNa
29f20 6d 65 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68  me ){.        ch
29f30 61 72 20 2a 7a 51 61 72 67 20 3d 20 73 71 6c 69  ar *zQarg = sqli
29f40 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 51 22  te3_mprintf("%Q"
29f50 2c 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  , zName);.      
29f60 20 20 69 66 28 20 73 74 72 63 68 72 28 7a 4e 61    if( strchr(zNa
29f70 6d 65 2c 20 27 2e 27 29 20 29 7b 0a 20 20 20 20  me, '.') ){.    
29f80 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
29f90 28 26 73 53 65 6c 65 63 74 2c 20 22 6c 6f 77 65  (&sSelect, "lowe
29fa0 72 28 70 72 69 6e 74 66 28 27 25 73 2e 25 73 27  r(printf('%s.%s'
29fb0 2c 73 6e 61 6d 65 2c 74 62 6c 5f 6e 61 6d 65 29  ,sname,tbl_name)
29fc0 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  )", 0);.        
29fd0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
29fe0 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53 65   appendText(&sSe
29ff0 6c 65 63 74 2c 20 22 6c 6f 77 65 72 28 74 62 6c  lect, "lower(tbl
2a000 5f 6e 61 6d 65 29 22 2c 20 30 29 3b 0a 20 20 20  _name)", 0);.   
2a010 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
2a020 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
2a030 63 74 2c 20 73 74 72 63 68 72 28 7a 4e 61 6d 65  ct, strchr(zName
2a040 2c 20 27 2a 27 29 20 3f 20 22 20 47 4c 4f 42 20  , '*') ? " GLOB 
2a050 22 20 3a 20 22 20 4c 49 4b 45 20 22 2c 20 30 29  " : " LIKE ", 0)
2a060 3b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  ;.        append
2a070 54 65 78 74 28 26 73 53 65 6c 65 63 74 2c 20 7a  Text(&sSelect, z
2a080 51 61 72 67 2c 20 30 29 3b 0a 20 20 20 20 20 20  Qarg, 0);.      
2a090 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
2a0a0 65 6c 65 63 74 2c 20 22 20 41 4e 44 20 22 2c 20  elect, " AND ", 
2a0b0 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
2a0c0 74 65 33 5f 66 72 65 65 28 7a 51 61 72 67 29 3b  te3_free(zQarg);
2a0d0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61  .      }.      a
2a0e0 70 70 65 6e 64 54 65 78 74 28 26 73 53 65 6c 65  ppendText(&sSele
2a0f0 63 74 2c 20 22 74 79 70 65 21 3d 27 6d 65 74 61  ct, "type!='meta
2a100 27 20 41 4e 44 20 73 71 6c 20 49 53 20 4e 4f 54  ' AND sql IS NOT
2a110 20 4e 55 4c 4c 22 0a 20 20 20 20 20 20 20 20 20   NULL".         
2a120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a130 20 20 22 20 4f 52 44 45 52 20 42 59 20 73 6e 75    " ORDER BY snu
2a140 6d 2c 20 72 6f 77 69 64 22 2c 20 30 29 3b 0a 20  m, rowid", 0);. 
2a150 20 20 20 20 20 69 66 28 20 62 44 65 62 75 67 20       if( bDebug 
2a160 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  ){.        utf8_
2a170 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
2a180 53 51 4c 3a 20 25 73 3b 5c 6e 22 2c 20 73 53 65  SQL: %s;\n", sSe
2a190 6c 65 63 74 2e 7a 29 3b 0a 20 20 20 20 20 20 7d  lect.z);.      }
2a1a0 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 72 63  else{.        rc
2a1b0 20 3d 20 73 71 6c 69 74 65 33 5f 65 78 65 63 28   = sqlite3_exec(
2a1c0 70 2d 3e 64 62 2c 20 73 53 65 6c 65 63 74 2e 7a  p->db, sSelect.z
2a1d0 2c 20 63 61 6c 6c 62 61 63 6b 2c 20 26 64 61 74  , callback, &dat
2a1e0 61 2c 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20  a, &zErrMsg);.  
2a1f0 20 20 20 20 7d 0a 20 20 20 20 20 20 66 72 65 65      }.      free
2a200 54 65 78 74 28 26 73 53 65 6c 65 63 74 29 3b 0a  Text(&sSelect);.
2a210 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 45      }.    if( zE
2a220 72 72 4d 73 67 20 29 7b 0a 20 20 20 20 20 20 75  rrMsg ){.      u
2a230 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
2a240 72 2c 22 45 72 72 6f 72 3a 20 25 73 5c 6e 22 2c  r,"Error: %s\n",
2a250 20 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20   zErrMsg);.     
2a260 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a 45   sqlite3_free(zE
2a270 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 72 63  rrMsg);.      rc
2a280 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20   = 1;.    }else 
2a290 69 66 28 20 72 63 20 21 3d 20 53 51 4c 49 54 45  if( rc != SQLITE
2a2a0 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 72 61 77  _OK ){.      raw
2a2b0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22  _printf(stderr,"
2a2c0 45 72 72 6f 72 3a 20 71 75 65 72 79 69 6e 67 20  Error: querying 
2a2d0 73 63 68 65 6d 61 20 69 6e 66 6f 72 6d 61 74 69  schema informati
2a2e0 6f 6e 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63  on\n");.      rc
2a2f0 20 3d 20 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b   = 1;.    }else{
2a300 0a 20 20 20 20 20 20 72 63 20 3d 20 30 3b 0a 20  .      rc = 0;. 
2a310 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 23 69     }.  }else..#i
2a320 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45  f defined(SQLITE
2a330 5f 44 45 42 55 47 29 20 26 26 20 64 65 66 69 6e  _DEBUG) && defin
2a340 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
2a350 5f 53 45 4c 45 43 54 54 52 41 43 45 29 0a 20 20  _SELECTTRACE).  
2a360 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20 6e 3d  if( c=='s' && n=
2a370 3d 31 31 20 26 26 20 73 74 72 6e 63 6d 70 28 61  =11 && strncmp(a
2a380 7a 41 72 67 5b 30 5d 2c 20 22 73 65 6c 65 63 74  zArg[0], "select
2a390 74 72 61 63 65 22 2c 20 6e 29 3d 3d 30 20 29 7b  trace", n)==0 ){
2a3a0 0a 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65  .    sqlite3Sele
2a3b0 63 74 54 72 61 63 65 20 3d 20 28 69 6e 74 29 69  ctTrace = (int)i
2a3c0 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72  ntegerValue(azAr
2a3d0 67 5b 31 5d 29 3b 0a 20 20 7d 65 6c 73 65 0a 23  g[1]);.  }else.#
2a3e0 65 6e 64 69 66 0a 0a 23 69 66 20 64 65 66 69 6e  endif..#if defin
2a3f0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
2a400 5f 53 45 53 53 49 4f 4e 29 0a 20 20 69 66 28 20  _SESSION).  if( 
2a410 63 3d 3d 27 73 27 20 26 26 20 73 74 72 6e 63 6d  c=='s' && strncm
2a420 70 28 61 7a 41 72 67 5b 30 5d 2c 22 73 65 73 73  p(azArg[0],"sess
2a430 69 6f 6e 22 2c 6e 29 3d 3d 30 20 26 26 20 6e 3e  ion",n)==0 && n>
2a440 3d 33 20 29 7b 0a 20 20 20 20 4f 70 65 6e 53 65  =3 ){.    OpenSe
2a450 73 73 69 6f 6e 20 2a 70 53 65 73 73 69 6f 6e 20  ssion *pSession 
2a460 3d 20 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 30  = &p->aSession[0
2a470 5d 3b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 7a  ];.    char **az
2a480 43 6d 64 20 3d 20 26 61 7a 41 72 67 5b 31 5d 3b  Cmd = &azArg[1];
2a490 0a 20 20 20 20 69 6e 74 20 69 53 65 73 20 3d 20  .    int iSes = 
2a4a0 30 3b 0a 20 20 20 20 69 6e 74 20 6e 43 6d 64 20  0;.    int nCmd 
2a4b0 3d 20 6e 41 72 67 20 2d 20 31 3b 0a 20 20 20 20  = nArg - 1;.    
2a4c0 69 6e 74 20 69 3b 0a 20 20 20 20 69 66 28 20 6e  int i;.    if( n
2a4d0 41 72 67 3c 3d 31 20 29 20 67 6f 74 6f 20 73 65  Arg<=1 ) goto se
2a4e0 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72  ssion_syntax_err
2a4f0 6f 72 3b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28  or;.    open_db(
2a500 70 2c 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e  p, 0);.    if( n
2a510 41 72 67 3e 3d 33 20 29 7b 0a 20 20 20 20 20 20  Arg>=3 ){.      
2a520 66 6f 72 28 69 53 65 73 3d 30 3b 20 69 53 65 73  for(iSes=0; iSes
2a530 3c 70 2d 3e 6e 53 65 73 73 69 6f 6e 3b 20 69 53  <p->nSession; iS
2a540 65 73 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69  es++){.        i
2a550 66 28 20 73 74 72 63 6d 70 28 70 2d 3e 61 53 65  f( strcmp(p->aSe
2a560 73 73 69 6f 6e 5b 69 53 65 73 5d 2e 7a 4e 61 6d  ssion[iSes].zNam
2a570 65 2c 20 61 7a 41 72 67 5b 31 5d 29 3d 3d 30 20  e, azArg[1])==0 
2a580 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d  ) break;.      }
2a590 0a 20 20 20 20 20 20 69 66 28 20 69 53 65 73 3c  .      if( iSes<
2a5a0 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a 20  p->nSession ){. 
2a5b0 20 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e 20         pSession 
2a5c0 3d 20 26 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 69  = &p->aSession[i
2a5d0 53 65 73 5d 3b 0a 20 20 20 20 20 20 20 20 61 7a  Ses];.        az
2a5e0 43 6d 64 2b 2b 3b 0a 20 20 20 20 20 20 20 20 6e  Cmd++;.        n
2a5f0 43 6d 64 2d 2d 3b 0a 20 20 20 20 20 20 7d 65 6c  Cmd--;.      }el
2a600 73 65 7b 0a 20 20 20 20 20 20 20 20 70 53 65 73  se{.        pSes
2a610 73 69 6f 6e 20 3d 20 26 70 2d 3e 61 53 65 73 73  sion = &p->aSess
2a620 69 6f 6e 5b 30 5d 3b 0a 20 20 20 20 20 20 20 20  ion[0];.        
2a630 69 53 65 73 20 3d 20 30 3b 0a 20 20 20 20 20 20  iSes = 0;.      
2a640 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  }.    }..    /* 
2a650 2e 73 65 73 73 69 6f 6e 20 61 74 74 61 63 68 20  .session attach 
2a660 54 41 42 4c 45 0a 20 20 20 20 2a 2a 20 49 6e 76  TABLE.    ** Inv
2a670 6f 6b 65 20 74 68 65 20 73 71 6c 69 74 65 33 73  oke the sqlite3s
2a680 65 73 73 69 6f 6e 5f 61 74 74 61 63 68 28 29 20  ession_attach() 
2a690 69 6e 74 65 72 66 61 63 65 20 74 6f 20 61 74 74  interface to att
2a6a0 61 63 68 20 61 20 70 61 72 74 69 63 75 6c 61 72  ach a particular
2a6b0 0a 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 73 6f  .    ** table so
2a6c0 20 74 68 61 74 20 69 74 20 69 73 20 6e 65 76 65   that it is neve
2a6d0 72 20 66 69 6c 74 65 72 65 64 2e 0a 20 20 20 20  r filtered..    
2a6e0 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  */.    if( strcm
2a6f0 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 61 74 74 61  p(azCmd[0],"atta
2a700 63 68 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ch")==0 ){.     
2a710 20 69 66 28 20 6e 43 6d 64 21 3d 32 20 29 20 67   if( nCmd!=2 ) g
2a720 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74  oto session_synt
2a730 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  ax_error;.      
2a740 69 66 28 20 70 53 65 73 73 69 6f 6e 2d 3e 70 3d  if( pSession->p=
2a750 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 65  =0 ){.        se
2a760 73 73 69 6f 6e 5f 6e 6f 74 5f 6f 70 65 6e 3a 0a  ssion_not_open:.
2a770 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e          raw_prin
2a780 74 66 28 73 74 64 65 72 72 2c 20 22 45 52 52 4f  tf(stderr, "ERRO
2a790 52 3a 20 4e 6f 20 73 65 73 73 69 6f 6e 73 20 61  R: No sessions a
2a7a0 72 65 20 6f 70 65 6e 5c 6e 22 29 3b 0a 20 20 20  re open\n");.   
2a7b0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2a7c0 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 73 65    rc = sqlite3se
2a7d0 73 73 69 6f 6e 5f 61 74 74 61 63 68 28 70 53 65  ssion_attach(pSe
2a7e0 73 73 69 6f 6e 2d 3e 70 2c 20 61 7a 43 6d 64 5b  ssion->p, azCmd[
2a7f0 31 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  1]);.        if(
2a800 20 72 63 20 29 7b 0a 20 20 20 20 20 20 20 20 20   rc ){.         
2a810 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2a820 72 72 2c 20 22 45 52 52 4f 52 3a 20 73 71 6c 69  rr, "ERROR: sqli
2a830 74 65 33 73 65 73 73 69 6f 6e 5f 61 74 74 61 63  te3session_attac
2a840 68 28 29 20 72 65 74 75 72 6e 73 20 25 64 5c 6e  h() returns %d\n
2a850 22 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20  ", rc);.        
2a860 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 20 20    rc = 0;.      
2a870 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
2a880 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73  }else..    /* .s
2a890 65 73 73 69 6f 6e 20 63 68 61 6e 67 65 73 65 74  ession changeset
2a8a0 20 46 49 4c 45 0a 20 20 20 20 2a 2a 20 2e 73 65   FILE.    ** .se
2a8b0 73 73 69 6f 6e 20 70 61 74 63 68 73 65 74 20 46  ssion patchset F
2a8c0 49 4c 45 0a 20 20 20 20 2a 2a 20 57 72 69 74 65  ILE.    ** Write
2a8d0 20 61 20 63 68 61 6e 67 65 73 65 74 20 6f 72 20   a changeset or 
2a8e0 70 61 74 63 68 73 65 74 20 69 6e 74 6f 20 61 20  patchset into a 
2a8f0 66 69 6c 65 2e 20 20 54 68 65 20 66 69 6c 65 20  file.  The file 
2a900 69 73 20 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a  is overwritten..
2a910 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73      */.    if( s
2a920 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22  trcmp(azCmd[0],"
2a930 63 68 61 6e 67 65 73 65 74 22 29 3d 3d 30 20 7c  changeset")==0 |
2a940 7c 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30  | strcmp(azCmd[0
2a950 5d 2c 22 70 61 74 63 68 73 65 74 22 29 3d 3d 30  ],"patchset")==0
2a960 20 29 7b 0a 20 20 20 20 20 20 46 49 4c 45 20 2a   ){.      FILE *
2a970 6f 75 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 69  out = 0;.      i
2a980 66 28 20 6e 43 6d 64 21 3d 32 20 29 20 67 6f 74  f( nCmd!=2 ) got
2a990 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78  o session_syntax
2a9a0 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 66  _error;.      if
2a9b0 28 20 70 53 65 73 73 69 6f 6e 2d 3e 70 3d 3d 30  ( pSession->p==0
2a9c0 20 29 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f   ) goto session_
2a9d0 6e 6f 74 5f 6f 70 65 6e 3b 0a 20 20 20 20 20 20  not_open;.      
2a9e0 6f 75 74 20 3d 20 66 6f 70 65 6e 28 61 7a 43 6d  out = fopen(azCm
2a9f0 64 5b 31 5d 2c 20 22 77 62 22 29 3b 0a 20 20 20  d[1], "wb");.   
2aa00 20 20 20 69 66 28 20 6f 75 74 3d 3d 30 20 29 7b     if( out==0 ){
2aa10 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
2aa20 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 52  intf(stderr, "ER
2aa30 52 4f 52 3a 20 63 61 6e 6e 6f 74 20 6f 70 65 6e  ROR: cannot open
2aa40 20 5c 22 25 73 5c 22 20 66 6f 72 20 77 72 69 74   \"%s\" for writ
2aa50 69 6e 67 5c 6e 22 2c 20 61 7a 43 6d 64 5b 31 5d  ing\n", azCmd[1]
2aa60 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
2aa70 20 20 20 20 20 20 20 20 69 6e 74 20 73 7a 43 68          int szCh
2aa80 6e 67 3b 0a 20 20 20 20 20 20 20 20 76 6f 69 64  ng;.        void
2aa90 20 2a 70 43 68 6e 67 3b 0a 20 20 20 20 20 20 20   *pChng;.       
2aaa0 20 69 66 28 20 61 7a 43 6d 64 5b 30 5d 5b 30 5d   if( azCmd[0][0]
2aab0 3d 3d 27 63 27 20 29 7b 0a 20 20 20 20 20 20 20  =='c' ){.       
2aac0 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 73     rc = sqlite3s
2aad0 65 73 73 69 6f 6e 5f 63 68 61 6e 67 65 73 65 74  ession_changeset
2aae0 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 26 73  (pSession->p, &s
2aaf0 7a 43 68 6e 67 2c 20 26 70 43 68 6e 67 29 3b 0a  zChng, &pChng);.
2ab00 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
2ab10 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 71           rc = sq
2ab20 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 70 61 74  lite3session_pat
2ab30 63 68 73 65 74 28 70 53 65 73 73 69 6f 6e 2d 3e  chset(pSession->
2ab40 70 2c 20 26 73 7a 43 68 6e 67 2c 20 26 70 43 68  p, &szChng, &pCh
2ab50 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ng);.        }. 
2ab60 20 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b         if( rc ){
2ab70 0a 20 20 20 20 20 20 20 20 20 20 70 72 69 6e 74  .          print
2ab80 66 28 22 45 72 72 6f 72 3a 20 65 72 72 6f 72 20  f("Error: error 
2ab90 63 6f 64 65 20 25 64 5c 6e 22 2c 20 72 63 29 3b  code %d\n", rc);
2aba0 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2abb0 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
2abc0 20 20 20 20 20 69 66 28 20 70 43 68 6e 67 0a 20       if( pChng. 
2abd0 20 20 20 20 20 20 20 20 20 26 26 20 66 77 72 69           && fwri
2abe0 74 65 28 70 43 68 6e 67 2c 20 73 7a 43 68 6e 67  te(pChng, szChng
2abf0 2c 20 31 2c 20 6f 75 74 29 21 3d 31 20 29 7b 0a  , 1, out)!=1 ){.
2ac00 20 20 20 20 20 20 20 20 20 20 72 61 77 5f 70 72            raw_pr
2ac10 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 52  intf(stderr, "ER
2ac20 52 4f 52 3a 20 46 61 69 6c 65 64 20 74 6f 20 77  ROR: Failed to w
2ac30 72 69 74 65 20 65 6e 74 69 72 65 20 25 64 2d 62  rite entire %d-b
2ac40 79 74 65 20 6f 75 74 70 75 74 5c 6e 22 2c 0a 20  yte output\n",. 
2ac50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac60 20 73 7a 43 68 6e 67 29 3b 0a 20 20 20 20 20 20   szChng);.      
2ac70 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
2ac80 74 65 33 5f 66 72 65 65 28 70 43 68 6e 67 29 3b  te3_free(pChng);
2ac90 0a 20 20 20 20 20 20 20 20 66 63 6c 6f 73 65 28  .        fclose(
2aca0 6f 75 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  out);.      }.  
2acb0 20 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20    }else..    /* 
2acc0 2e 73 65 73 73 69 6f 6e 20 63 6c 6f 73 65 0a 20  .session close. 
2acd0 20 20 20 2a 2a 20 43 6c 6f 73 65 20 74 68 65 20     ** Close the 
2ace0 69 64 65 6e 74 69 66 69 65 64 20 73 65 73 73 69  identified sessi
2acf0 6f 6e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  on.    */.    if
2ad00 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b 30  ( strcmp(azCmd[0
2ad10 5d 2c 20 22 63 6c 6f 73 65 22 29 3d 3d 30 20 29  ], "close")==0 )
2ad20 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 43 6d 64  {.      if( nCmd
2ad30 21 3d 31 20 29 20 67 6f 74 6f 20 73 65 73 73 69  !=1 ) goto sessi
2ad40 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f 72 3b  on_syntax_error;
2ad50 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 53  .      if( p->nS
2ad60 65 73 73 69 6f 6e 20 29 7b 0a 20 20 20 20 20 20  ession ){.      
2ad70 20 20 73 65 73 73 69 6f 6e 5f 63 6c 6f 73 65 28    session_close(
2ad80 70 53 65 73 73 69 6f 6e 29 3b 0a 20 20 20 20 20  pSession);.     
2ad90 20 20 20 70 2d 3e 61 53 65 73 73 69 6f 6e 5b 69     p->aSession[i
2ada0 53 65 73 5d 20 3d 20 70 2d 3e 61 53 65 73 73 69  Ses] = p->aSessi
2adb0 6f 6e 5b 2d 2d 70 2d 3e 6e 53 65 73 73 69 6f 6e  on[--p->nSession
2adc0 5d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  ];.      }.    }
2add0 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65  else..    /* .se
2ade0 73 73 69 6f 6e 20 65 6e 61 62 6c 65 20 3f 42 4f  ssion enable ?BO
2adf0 4f 4c 45 41 4e 3f 0a 20 20 20 20 2a 2a 20 51 75  OLEAN?.    ** Qu
2ae00 65 72 79 20 6f 72 20 73 65 74 20 74 68 65 20 65  ery or set the e
2ae10 6e 61 62 6c 65 20 66 6c 61 67 0a 20 20 20 20 2a  nable flag.    *
2ae20 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  /.    if( strcmp
2ae30 28 61 7a 43 6d 64 5b 30 5d 2c 20 22 65 6e 61 62  (azCmd[0], "enab
2ae40 6c 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  le")==0 ){.     
2ae50 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 69   int ii;.      i
2ae60 66 28 20 6e 43 6d 64 3e 32 20 29 20 67 6f 74 6f  f( nCmd>2 ) goto
2ae70 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f   session_syntax_
2ae80 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 69 20  error;.      ii 
2ae90 3d 20 6e 43 6d 64 3d 3d 31 20 3f 20 2d 31 20 3a  = nCmd==1 ? -1 :
2aea0 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a   booleanValue(az
2aeb0 43 6d 64 5b 31 5d 29 3b 0a 20 20 20 20 20 20 69  Cmd[1]);.      i
2aec0 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29  f( p->nSession )
2aed0 7b 0a 20 20 20 20 20 20 20 20 69 69 20 3d 20 73  {.        ii = s
2aee0 71 6c 69 74 65 33 73 65 73 73 69 6f 6e 5f 65 6e  qlite3session_en
2aef0 61 62 6c 65 28 70 53 65 73 73 69 6f 6e 2d 3e 70  able(pSession->p
2af00 2c 20 69 69 29 3b 0a 20 20 20 20 20 20 20 20 75  , ii);.        u
2af10 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
2af20 74 2c 20 22 73 65 73 73 69 6f 6e 20 25 73 20 65  t, "session %s e
2af30 6e 61 62 6c 65 20 66 6c 61 67 20 3d 20 25 64 5c  nable flag = %d\
2af40 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
2af50 20 20 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e          pSession
2af60 2d 3e 7a 4e 61 6d 65 2c 20 69 69 29 3b 0a 20 20  ->zName, ii);.  
2af70 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a      }.    }else.
2af80 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e  .    /* .session
2af90 20 66 69 6c 74 65 72 20 47 4c 4f 42 20 2e 2e 2e   filter GLOB ...
2afa0 2e 0a 20 20 20 20 2a 2a 20 53 65 74 20 61 20 6c  ..    ** Set a l
2afb0 69 73 74 20 6f 66 20 47 4c 4f 42 20 70 61 74 74  ist of GLOB patt
2afc0 65 72 6e 73 20 6f 66 20 74 61 62 6c 65 20 6e 61  erns of table na
2afd0 6d 65 73 20 74 6f 20 62 65 20 65 78 63 6c 75 64  mes to be exclud
2afe0 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
2aff0 66 28 20 73 74 72 63 6d 70 28 61 7a 43 6d 64 5b  f( strcmp(azCmd[
2b000 30 5d 2c 20 22 66 69 6c 74 65 72 22 29 3d 3d 30  0], "filter")==0
2b010 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 69   ){.      int ii
2b020 2c 20 6e 42 79 74 65 3b 0a 20 20 20 20 20 20 69  , nByte;.      i
2b030 66 28 20 6e 43 6d 64 3c 32 20 29 20 67 6f 74 6f  f( nCmd<2 ) goto
2b040 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f   session_syntax_
2b050 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 66 28  error;.      if(
2b060 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a   p->nSession ){.
2b070 20 20 20 20 20 20 20 20 66 6f 72 28 69 69 3d 30          for(ii=0
2b080 3b 20 69 69 3c 70 53 65 73 73 69 6f 6e 2d 3e 6e  ; ii<pSession->n
2b090 46 69 6c 74 65 72 3b 20 69 69 2b 2b 29 7b 0a 20  Filter; ii++){. 
2b0a0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2b0b0 5f 66 72 65 65 28 70 53 65 73 73 69 6f 6e 2d 3e  _free(pSession->
2b0c0 61 7a 46 69 6c 74 65 72 5b 69 69 5d 29 3b 0a 20  azFilter[ii]);. 
2b0d0 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2b0e0 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 70 53   sqlite3_free(pS
2b0f0 65 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72  ession->azFilter
2b100 29 3b 0a 20 20 20 20 20 20 20 20 6e 42 79 74 65  );.        nByte
2b110 20 3d 20 73 69 7a 65 6f 66 28 70 53 65 73 73 69   = sizeof(pSessi
2b120 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 5b 30 5d 29  on->azFilter[0])
2b130 2a 28 6e 43 6d 64 2d 31 29 3b 0a 20 20 20 20 20  *(nCmd-1);.     
2b140 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 61 7a 46     pSession->azF
2b150 69 6c 74 65 72 20 3d 20 73 71 6c 69 74 65 33 5f  ilter = sqlite3_
2b160 6d 61 6c 6c 6f 63 28 20 6e 42 79 74 65 20 29 3b  malloc( nByte );
2b170 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 53 65  .        if( pSe
2b180 73 73 69 6f 6e 2d 3e 61 7a 46 69 6c 74 65 72 3d  ssion->azFilter=
2b190 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2b1a0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2b1b0 72 2c 20 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f  r, "Error: out o
2b1c0 72 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20  r memory\n");.  
2b1d0 20 20 20 20 20 20 20 20 65 78 69 74 28 31 29 3b          exit(1);
2b1e0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2b1f0 20 20 20 66 6f 72 28 69 69 3d 31 3b 20 69 69 3c     for(ii=1; ii<
2b200 6e 43 6d 64 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  nCmd; ii++){.   
2b210 20 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d         pSession-
2b220 3e 61 7a 46 69 6c 74 65 72 5b 69 69 2d 31 5d 20  >azFilter[ii-1] 
2b230 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e 74  = sqlite3_mprint
2b240 66 28 22 25 73 22 2c 20 61 7a 43 6d 64 5b 69 69  f("%s", azCmd[ii
2b250 5d 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ]);.        }.  
2b260 20 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e        pSession->
2b270 6e 46 69 6c 74 65 72 20 3d 20 69 69 2d 31 3b 0a  nFilter = ii-1;.
2b280 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73        }.    }els
2b290 65 0a 0a 20 20 20 20 2f 2a 20 2e 73 65 73 73 69  e..    /* .sessi
2b2a0 6f 6e 20 69 6e 64 69 72 65 63 74 20 3f 42 4f 4f  on indirect ?BOO
2b2b0 4c 45 41 4e 3f 0a 20 20 20 20 2a 2a 20 51 75 65  LEAN?.    ** Que
2b2c0 72 79 20 6f 72 20 73 65 74 20 74 68 65 20 69 6e  ry or set the in
2b2d0 64 69 72 65 63 74 20 66 6c 61 67 0a 20 20 20 20  direct flag.    
2b2e0 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  */.    if( strcm
2b2f0 70 28 61 7a 43 6d 64 5b 30 5d 2c 20 22 69 6e 64  p(azCmd[0], "ind
2b300 69 72 65 63 74 22 29 3d 3d 30 20 29 7b 0a 20 20  irect")==0 ){.  
2b310 20 20 20 20 69 6e 74 20 69 69 3b 0a 20 20 20 20      int ii;.    
2b320 20 20 69 66 28 20 6e 43 6d 64 3e 32 20 29 20 67    if( nCmd>2 ) g
2b330 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74  oto session_synt
2b340 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20 20 20  ax_error;.      
2b350 69 69 20 3d 20 6e 43 6d 64 3d 3d 31 20 3f 20 2d  ii = nCmd==1 ? -
2b360 31 20 3a 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  1 : booleanValue
2b370 28 61 7a 43 6d 64 5b 31 5d 29 3b 0a 20 20 20 20  (azCmd[1]);.    
2b380 20 20 69 66 28 20 70 2d 3e 6e 53 65 73 73 69 6f    if( p->nSessio
2b390 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 69 69 20  n ){.        ii 
2b3a0 3d 20 73 71 6c 69 74 65 33 73 65 73 73 69 6f 6e  = sqlite3session
2b3b0 5f 69 6e 64 69 72 65 63 74 28 70 53 65 73 73 69  _indirect(pSessi
2b3c0 6f 6e 2d 3e 70 2c 20 69 69 29 3b 0a 20 20 20 20  on->p, ii);.    
2b3d0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2b3e0 70 2d 3e 6f 75 74 2c 20 22 73 65 73 73 69 6f 6e  p->out, "session
2b3f0 20 25 73 20 69 6e 64 69 72 65 63 74 20 66 6c 61   %s indirect fla
2b400 67 20 3d 20 25 64 5c 6e 22 2c 0a 20 20 20 20 20  g = %d\n",.     
2b410 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2b420 53 65 73 73 69 6f 6e 2d 3e 7a 4e 61 6d 65 2c 20  Session->zName, 
2b430 69 69 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ii);.      }.   
2b440 20 7d 65 6c 73 65 0a 0a 20 20 20 20 2f 2a 20 2e   }else..    /* .
2b450 73 65 73 73 69 6f 6e 20 69 73 65 6d 70 74 79 0a  session isempty.
2b460 20 20 20 20 2a 2a 20 44 65 74 65 72 6d 69 6e 65      ** Determine
2b470 20 69 66 20 74 68 65 20 73 65 73 73 69 6f 6e 20   if the session 
2b480 69 73 20 65 6d 70 74 79 0a 20 20 20 20 2a 2f 0a  is empty.    */.
2b490 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 61      if( strcmp(a
2b4a0 7a 43 6d 64 5b 30 5d 2c 20 22 69 73 65 6d 70 74  zCmd[0], "isempt
2b4b0 79 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  y")==0 ){.      
2b4c0 69 6e 74 20 69 69 3b 0a 20 20 20 20 20 20 69 66  int ii;.      if
2b4d0 28 20 6e 43 6d 64 21 3d 31 20 29 20 67 6f 74 6f  ( nCmd!=1 ) goto
2b4e0 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f   session_syntax_
2b4f0 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 69 66 28  error;.      if(
2b500 20 70 2d 3e 6e 53 65 73 73 69 6f 6e 20 29 7b 0a   p->nSession ){.
2b510 20 20 20 20 20 20 20 20 69 69 20 3d 20 73 71 6c          ii = sql
2b520 69 74 65 33 73 65 73 73 69 6f 6e 5f 69 73 65 6d  ite3session_isem
2b530 70 74 79 28 70 53 65 73 73 69 6f 6e 2d 3e 70 29  pty(pSession->p)
2b540 3b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70  ;.        utf8_p
2b550 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 73  rintf(p->out, "s
2b560 65 73 73 69 6f 6e 20 25 73 20 69 73 65 6d 70 74  ession %s isempt
2b570 79 20 66 6c 61 67 20 3d 20 25 64 5c 6e 22 2c 0a  y flag = %d\n",.
2b580 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b590 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 7a 4e      pSession->zN
2b5a0 61 6d 65 2c 20 69 69 29 3b 0a 20 20 20 20 20 20  ame, ii);.      
2b5b0 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20 20 20  }.    }else..   
2b5c0 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 6c 69 73   /* .session lis
2b5d0 74 0a 20 20 20 20 2a 2a 20 4c 69 73 74 20 61 6c  t.    ** List al
2b5e0 6c 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e  l currently open
2b5f0 20 73 65 73 73 69 6f 6e 73 0a 20 20 20 20 2a 2f   sessions.    */
2b600 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70 28  .    if( strcmp(
2b610 61 7a 43 6d 64 5b 30 5d 2c 22 6c 69 73 74 22 29  azCmd[0],"list")
2b620 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ==0 ){.      for
2b630 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 65 73 73  (i=0; i<p->nSess
2b640 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ion; i++){.     
2b650 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
2b660 2d 3e 6f 75 74 2c 20 22 25 64 20 25 73 5c 6e 22  ->out, "%d %s\n"
2b670 2c 20 69 2c 20 70 2d 3e 61 53 65 73 73 69 6f 6e  , i, p->aSession
2b680 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  [i].zName);.    
2b690 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 0a 0a 20    }.    }else.. 
2b6a0 20 20 20 2f 2a 20 2e 73 65 73 73 69 6f 6e 20 6f     /* .session o
2b6b0 70 65 6e 20 44 42 20 4e 41 4d 45 0a 20 20 20 20  pen DB NAME.    
2b6c0 2a 2a 20 4f 70 65 6e 20 61 20 6e 65 77 20 73 65  ** Open a new se
2b6d0 73 73 69 6f 6e 20 63 61 6c 6c 65 64 20 4e 41 4d  ssion called NAM
2b6e0 45 20 6f 6e 20 74 68 65 20 61 74 74 61 63 68 65  E on the attache
2b6f0 64 20 64 61 74 61 62 61 73 65 20 44 42 2e 0a 20  d database DB.. 
2b700 20 20 20 2a 2a 20 44 42 20 69 73 20 6e 6f 72 6d     ** DB is norm
2b710 61 6c 6c 79 20 22 6d 61 69 6e 22 2e 0a 20 20 20  ally "main"..   
2b720 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 74 72 63   */.    if( strc
2b730 6d 70 28 61 7a 43 6d 64 5b 30 5d 2c 22 6f 70 65  mp(azCmd[0],"ope
2b740 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n")==0 ){.      
2b750 63 68 61 72 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20  char *zName;.   
2b760 20 20 20 69 66 28 20 6e 43 6d 64 21 3d 33 20 29     if( nCmd!=3 )
2b770 20 67 6f 74 6f 20 73 65 73 73 69 6f 6e 5f 73 79   goto session_sy
2b780 6e 74 61 78 5f 65 72 72 6f 72 3b 0a 20 20 20 20  ntax_error;.    
2b790 20 20 7a 4e 61 6d 65 20 3d 20 61 7a 43 6d 64 5b    zName = azCmd[
2b7a0 32 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 4e  2];.      if( zN
2b7b0 61 6d 65 5b 30 5d 3d 3d 30 20 29 20 67 6f 74 6f  ame[0]==0 ) goto
2b7c0 20 73 65 73 73 69 6f 6e 5f 73 79 6e 74 61 78 5f   session_syntax_
2b7d0 65 72 72 6f 72 3b 0a 20 20 20 20 20 20 66 6f 72  error;.      for
2b7e0 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 65 73 73  (i=0; i<p->nSess
2b7f0 69 6f 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  ion; i++){.     
2b800 20 20 20 69 66 28 20 73 74 72 63 6d 70 28 70 2d     if( strcmp(p-
2b810 3e 61 53 65 73 73 69 6f 6e 5b 69 5d 2e 7a 4e 61  >aSession[i].zNa
2b820 6d 65 2c 7a 4e 61 6d 65 29 3d 3d 30 20 29 7b 0a  me,zName)==0 ){.
2b830 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
2b840 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 53  rintf(stderr, "S
2b850 65 73 73 69 6f 6e 20 5c 22 25 73 5c 22 20 61 6c  ession \"%s\" al
2b860 72 65 61 64 79 20 65 78 69 73 74 73 5c 6e 22 2c  ready exists\n",
2b870 20 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20   zName);.       
2b880 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
2b890 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20  mand_exit;.     
2b8a0 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
2b8b0 20 20 20 69 66 28 20 70 2d 3e 6e 53 65 73 73 69     if( p->nSessi
2b8c0 6f 6e 3e 3d 41 72 72 61 79 53 69 7a 65 28 70 2d  on>=ArraySize(p-
2b8d0 3e 61 53 65 73 73 69 6f 6e 29 20 29 7b 0a 20 20  >aSession) ){.  
2b8e0 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66        raw_printf
2b8f0 28 73 74 64 65 72 72 2c 20 22 4d 61 78 69 6d 75  (stderr, "Maximu
2b900 6d 20 6f 66 20 25 64 20 73 65 73 73 69 6f 6e 73  m of %d sessions
2b910 5c 6e 22 2c 20 41 72 72 61 79 53 69 7a 65 28 70  \n", ArraySize(p
2b920 2d 3e 61 53 65 73 73 69 6f 6e 29 29 3b 0a 20 20  ->aSession));.  
2b930 20 20 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f        goto meta_
2b940 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20  command_exit;.  
2b950 20 20 20 20 7d 0a 20 20 20 20 20 20 70 53 65 73      }.      pSes
2b960 73 69 6f 6e 20 3d 20 26 70 2d 3e 61 53 65 73 73  sion = &p->aSess
2b970 69 6f 6e 5b 70 2d 3e 6e 53 65 73 73 69 6f 6e 5d  ion[p->nSession]
2b980 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c  ;.      rc = sql
2b990 69 74 65 33 73 65 73 73 69 6f 6e 5f 63 72 65 61  ite3session_crea
2b9a0 74 65 28 70 2d 3e 64 62 2c 20 61 7a 43 6d 64 5b  te(p->db, azCmd[
2b9b0 31 5d 2c 20 26 70 53 65 73 73 69 6f 6e 2d 3e 70  1], &pSession->p
2b9c0 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
2b9d0 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  ){.        raw_p
2b9e0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 43  rintf(stderr, "C
2b9f0 61 6e 6e 6f 74 20 6f 70 65 6e 20 73 65 73 73 69  annot open sessi
2ba00 6f 6e 3a 20 65 72 72 6f 72 20 63 6f 64 65 3d 25  on: error code=%
2ba10 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20 20 20  d\n", rc);.     
2ba20 20 20 20 72 63 20 3d 20 30 3b 0a 20 20 20 20 20     rc = 0;.     
2ba30 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
2ba40 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 20  mand_exit;.     
2ba50 20 7d 0a 20 20 20 20 20 20 70 53 65 73 73 69 6f   }.      pSessio
2ba60 6e 2d 3e 6e 46 69 6c 74 65 72 20 3d 20 30 3b 0a  n->nFilter = 0;.
2ba70 20 20 20 20 20 20 73 71 6c 69 74 65 33 73 65 73        sqlite3ses
2ba80 73 69 6f 6e 5f 74 61 62 6c 65 5f 66 69 6c 74 65  sion_table_filte
2ba90 72 28 70 53 65 73 73 69 6f 6e 2d 3e 70 2c 20 73  r(pSession->p, s
2baa0 65 73 73 69 6f 6e 5f 66 69 6c 74 65 72 2c 20 70  ession_filter, p
2bab0 53 65 73 73 69 6f 6e 29 3b 0a 20 20 20 20 20 20  Session);.      
2bac0 70 2d 3e 6e 53 65 73 73 69 6f 6e 2b 2b 3b 0a 20  p->nSession++;. 
2bad0 20 20 20 20 20 70 53 65 73 73 69 6f 6e 2d 3e 7a       pSession->z
2bae0 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 5f 6d  Name = sqlite3_m
2baf0 70 72 69 6e 74 66 28 22 25 73 22 2c 20 7a 4e 61  printf("%s", zNa
2bb00 6d 65 29 3b 0a 20 20 20 20 7d 65 6c 73 65 0a 20  me);.    }else. 
2bb10 20 20 20 2f 2a 20 49 66 20 6e 6f 20 63 6f 6d 6d     /* If no comm
2bb20 61 6e 64 20 6e 61 6d 65 20 6d 61 74 63 68 65 73  and name matches
2bb30 2c 20 73 68 6f 77 20 61 20 73 79 6e 74 61 78 20  , show a syntax 
2bb40 65 72 72 6f 72 20 2a 2f 0a 20 20 20 20 73 65 73  error */.    ses
2bb50 73 69 6f 6e 5f 73 79 6e 74 61 78 5f 65 72 72 6f  sion_syntax_erro
2bb60 72 3a 0a 20 20 20 20 73 65 73 73 69 6f 6e 5f 68  r:.    session_h
2bb70 65 6c 70 28 70 29 3b 0a 20 20 7d 65 6c 73 65 0a  elp(p);.  }else.
2bb80 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
2bb90 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 2f 2a  QLITE_DEBUG.  /*
2bba0 20 55 6e 64 6f 63 75 6d 65 6e 74 65 64 20 63 6f   Undocumented co
2bbb0 6d 6d 61 6e 64 73 20 66 6f 72 20 69 6e 74 65 72  mmands for inter
2bbc0 6e 61 6c 20 74 65 73 74 69 6e 67 2e 20 20 53 75  nal testing.  Su
2bbd0 62 6a 65 63 74 20 74 6f 20 63 68 61 6e 67 65 0a  bject to change.
2bbe0 20 20 2a 2a 20 77 69 74 68 6f 75 74 20 6e 6f 74    ** without not
2bbf0 69 63 65 2e 20 2a 2f 0a 20 20 69 66 28 20 63 3d  ice. */.  if( c=
2bc00 3d 27 73 27 20 26 26 20 6e 3e 3d 31 30 20 26 26  ='s' && n>=10 &&
2bc10 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2bc20 5d 2c 20 22 73 65 6c 66 74 65 73 74 2d 22 2c 20  ], "selftest-", 
2bc30 39 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28  9)==0 ){.    if(
2bc40 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30   strncmp(azArg[0
2bc50 5d 2b 39 2c 20 22 62 6f 6f 6c 65 61 6e 22 2c 20  ]+9, "boolean", 
2bc60 6e 2d 39 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  n-9)==0 ){.     
2bc70 20 69 6e 74 20 69 2c 20 76 3b 0a 20 20 20 20 20   int i, v;.     
2bc80 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67   for(i=1; i<nArg
2bc90 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
2bca0 76 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  v = booleanValue
2bcb0 28 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20 20 20  (azArg[i]);.    
2bcc0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
2bcd0 70 2d 3e 6f 75 74 2c 20 22 25 73 3a 20 25 64 20  p->out, "%s: %d 
2bce0 30 78 25 78 5c 6e 22 2c 20 61 7a 41 72 67 5b 69  0x%x\n", azArg[i
2bcf0 5d 2c 20 76 2c 20 76 29 3b 0a 20 20 20 20 20 20  ], v, v);.      
2bd00 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
2bd10 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2bd20 2b 39 2c 20 22 69 6e 74 65 67 65 72 22 2c 20 6e  +9, "integer", n
2bd30 2d 39 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  -9)==0 ){.      
2bd40 69 6e 74 20 69 3b 20 73 71 6c 69 74 65 33 5f 69  int i; sqlite3_i
2bd50 6e 74 36 34 20 76 3b 0a 20 20 20 20 20 20 66 6f  nt64 v;.      fo
2bd60 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67 3b 20 69  r(i=1; i<nArg; i
2bd70 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
2bd80 72 20 7a 42 75 66 5b 32 30 30 5d 3b 0a 20 20 20  r zBuf[200];.   
2bd90 20 20 20 20 20 76 20 3d 20 69 6e 74 65 67 65 72       v = integer
2bda0 56 61 6c 75 65 28 61 7a 41 72 67 5b 69 5d 29 3b  Value(azArg[i]);
2bdb0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
2bdc0 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66  _snprintf(sizeof
2bdd0 28 7a 42 75 66 29 2c 7a 42 75 66 2c 22 25 73 3a  (zBuf),zBuf,"%s:
2bde0 20 25 6c 6c 64 20 30 78 25 6c 6c 78 5c 6e 22 2c   %lld 0x%llx\n",
2bdf0 20 61 7a 41 72 67 5b 69 5d 2c 76 2c 76 29 3b 0a   azArg[i],v,v);.
2be00 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72 69          utf8_pri
2be10 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 22  ntf(p->out, "%s"
2be20 2c 20 7a 42 75 66 29 3b 0a 20 20 20 20 20 20 7d  , zBuf);.      }
2be30 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 23  .    }.  }else.#
2be40 65 6e 64 69 66 0a 0a 20 20 69 66 28 20 63 3d 3d  endif..  if( c==
2be50 27 73 27 20 26 26 20 6e 3e 3d 34 20 26 26 20 73  's' && n>=4 && s
2be60 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2be70 22 73 65 6c 66 74 65 73 74 22 2c 6e 29 3d 3d 30  "selftest",n)==0
2be80 20 29 7b 0a 20 20 20 20 69 6e 74 20 62 49 73 49   ){.    int bIsI
2be90 6e 69 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  nit = 0;        
2bea0 20 2f 2a 20 54 72 75 65 20 74 6f 20 69 6e 69 74   /* True to init
2beb0 69 61 6c 69 7a 65 20 74 68 65 20 53 45 4c 46 54  ialize the SELFT
2bec0 45 53 54 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  EST table */.   
2bed0 20 69 6e 74 20 62 56 65 72 62 6f 73 65 20 3d 20   int bVerbose = 
2bee0 30 3b 20 20 20 20 20 20 20 20 2f 2a 20 56 65 72  0;        /* Ver
2bef0 62 6f 73 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20  bose output */. 
2bf00 20 20 20 69 6e 74 20 62 53 65 6c 66 74 65 73 74     int bSelftest
2bf10 45 78 69 73 74 73 3b 20 20 20 20 20 2f 2a 20 54  Exists;     /* T
2bf20 72 75 65 20 69 66 20 53 45 4c 46 54 45 53 54 20  rue if SELFTEST 
2bf30 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 2a  already exists *
2bf40 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20 6b 3b 20  /.    int i, k; 
2bf50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
2bf60 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
2bf70 2a 2f 0a 20 20 20 20 69 6e 74 20 6e 54 65 73 74  */.    int nTest
2bf80 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
2bf90 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 73  /* Number of tes
2bfa0 74 73 20 72 75 6e 73 20 2a 2f 0a 20 20 20 20 69  ts runs */.    i
2bfb0 6e 74 20 6e 45 72 72 20 3d 20 30 3b 20 20 20 20  nt nErr = 0;    
2bfc0 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
2bfd0 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e  r of errors seen
2bfe0 20 2a 2f 0a 20 20 20 20 53 68 65 6c 6c 54 65 78   */.    ShellTex
2bff0 74 20 73 74 72 3b 20 20 20 20 20 20 20 20 20 20  t str;          
2c000 20 2f 2a 20 41 6e 73 77 65 72 20 66 6f 72 20 61   /* Answer for a
2c010 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 73 71   query */.    sq
2c020 6c 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d  lite3_stmt *pStm
2c030 74 20 3d 20 30 3b 20 2f 2a 20 51 75 65 72 79 20  t = 0; /* Query 
2c040 61 67 61 69 6e 73 74 20 74 68 65 20 53 45 4c 46  against the SELF
2c050 54 45 53 54 20 74 61 62 6c 65 20 2a 2f 0a 0a 20  TEST table */.. 
2c060 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 30 29 3b     open_db(p,0);
2c070 0a 20 20 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c  .    for(i=1; i<
2c080 6e 41 72 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nArg; i++){.    
2c090 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20    const char *z 
2c0a0 3d 20 61 7a 41 72 67 5b 69 5d 3b 0a 20 20 20 20  = azArg[i];.    
2c0b0 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20    if( z[0]=='-' 
2c0c0 26 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a  && z[1]=='-' ) z
2c0d0 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 73 74  ++;.      if( st
2c0e0 72 63 6d 70 28 7a 2c 22 2d 69 6e 69 74 22 29 3d  rcmp(z,"-init")=
2c0f0 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 49  =0 ){.        bI
2c100 73 49 6e 69 74 20 3d 20 31 3b 0a 20 20 20 20 20  sInit = 1;.     
2c110 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 69 66 28   }else.      if(
2c120 20 73 74 72 63 6d 70 28 7a 2c 22 2d 76 22 29 3d   strcmp(z,"-v")=
2c130 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 62 56  =0 ){.        bV
2c140 65 72 62 6f 73 65 2b 2b 3b 0a 20 20 20 20 20 20  erbose++;.      
2c150 7d 65 6c 73 65 0a 20 20 20 20 20 20 7b 0a 20 20  }else.      {.  
2c160 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2c170 66 28 73 74 64 65 72 72 2c 20 22 55 6e 6b 6e 6f  f(stderr, "Unkno
2c180 77 6e 20 6f 70 74 69 6f 6e 20 5c 22 25 73 5c 22  wn option \"%s\"
2c190 20 6f 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20   on \"%s\"\n",. 
2c1a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c1b0 20 20 20 61 7a 41 72 67 5b 69 5d 2c 20 61 7a 41     azArg[i], azA
2c1c0 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20 20  rg[0]);.        
2c1d0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
2c1e0 72 2c 20 22 53 68 6f 75 6c 64 20 62 65 20 6f 6e  r, "Should be on
2c1f0 65 20 6f 66 3a 20 2d 2d 69 6e 69 74 20 2d 76 5c  e of: --init -v\
2c200 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  n");.        rc 
2c210 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 1;.        got
2c220 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
2c230 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xit;.      }.   
2c240 20 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74   }.    if( sqlit
2c250 65 33 5f 74 61 62 6c 65 5f 63 6f 6c 75 6d 6e 5f  e3_table_column_
2c260 6d 65 74 61 64 61 74 61 28 70 2d 3e 64 62 2c 22  metadata(p->db,"
2c270 6d 61 69 6e 22 2c 22 73 65 6c 66 74 65 73 74 22  main","selftest"
2c280 2c 30 2c 30 2c 30 2c 30 2c 30 2c 30 29 0a 20 20  ,0,0,0,0,0,0).  
2c290 20 20 20 20 20 20 20 20 20 21 3d 20 53 51 4c 49           != SQLI
2c2a0 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20 62  TE_OK ){.      b
2c2b0 53 65 6c 66 74 65 73 74 45 78 69 73 74 73 20 3d  SelftestExists =
2c2c0 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
2c2d0 20 20 20 20 20 62 53 65 6c 66 74 65 73 74 45 78       bSelftestEx
2c2e0 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20 7d 0a  ists = 1;.    }.
2c2f0 20 20 20 20 69 66 28 20 62 49 73 49 6e 69 74 20      if( bIsInit 
2c300 29 7b 0a 20 20 20 20 20 20 63 72 65 61 74 65 53  ){.      createS
2c310 65 6c 66 74 65 73 74 54 61 62 6c 65 28 70 29 3b  elftestTable(p);
2c320 0a 20 20 20 20 20 20 62 53 65 6c 66 74 65 73 74  .      bSelftest
2c330 45 78 69 73 74 73 20 3d 20 31 3b 0a 20 20 20 20  Exists = 1;.    
2c340 7d 0a 20 20 20 20 69 6e 69 74 54 65 78 74 28 26  }.    initText(&
2c350 73 74 72 29 3b 0a 20 20 20 20 61 70 70 65 6e 64  str);.    append
2c360 54 65 78 74 28 26 73 74 72 2c 20 22 78 22 2c 20  Text(&str, "x", 
2c370 30 29 3b 0a 20 20 20 20 66 6f 72 28 6b 3d 62 53  0);.    for(k=bS
2c380 65 6c 66 74 65 73 74 45 78 69 73 74 73 3b 20 6b  elftestExists; k
2c390 3e 3d 30 3b 20 6b 2d 2d 29 7b 0a 20 20 20 20 20  >=0; k--){.     
2c3a0 20 69 66 28 20 6b 3d 3d 31 20 29 7b 0a 20 20 20   if( k==1 ){.   
2c3b0 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2c3c0 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
2c3d0 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
2c3e0 22 53 45 4c 45 43 54 20 74 6e 6f 2c 6f 70 2c 63  "SELECT tno,op,c
2c3f0 6d 64 2c 61 6e 73 20 46 52 4f 4d 20 73 65 6c 66  md,ans FROM self
2c400 74 65 73 74 20 4f 52 44 45 52 20 42 59 20 74 6e  test ORDER BY tn
2c410 6f 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  o",.            
2c420 2d 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a  -1, &pStmt, 0);.
2c430 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
2c440 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65       rc = sqlite
2c450 33 5f 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e  3_prepare_v2(p->
2c460 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 22 56  db,.          "V
2c470 41 4c 55 45 53 28 30 2c 27 6d 65 6d 6f 27 2c 27  ALUES(0,'memo','
2c480 4d 69 73 73 69 6e 67 20 53 45 4c 46 54 45 53 54  Missing SELFTEST
2c490 20 74 61 62 6c 65 20 2d 20 64 65 66 61 75 6c 74   table - default
2c4a0 20 63 68 65 63 6b 73 20 6f 6e 6c 79 27 2c 27 27   checks only',''
2c4b0 29 2c 22 0a 20 20 20 20 20 20 20 20 20 20 22 20  ),".          " 
2c4c0 20 20 20 20 20 28 31 2c 27 72 75 6e 27 2c 27 50       (1,'run','P
2c4d0 52 41 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f  RAGMA integrity_
2c4e0 63 68 65 63 6b 27 2c 27 6f 6b 27 29 22 2c 0a 20  check','ok')",. 
2c4f0 20 20 20 20 20 20 20 20 20 2d 31 2c 20 26 70 53           -1, &pS
2c500 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  tmt, 0);.      }
2c510 0a 20 20 20 20 20 20 69 66 28 20 72 63 20 29 7b  .      if( rc ){
2c520 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70 72 69  .        raw_pri
2c530 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72 72  ntf(stderr, "Err
2c540 6f 72 20 71 75 65 72 79 69 6e 67 20 74 68 65 20  or querying the 
2c550 73 65 6c 66 74 65 73 74 20 74 61 62 6c 65 5c 6e  selftest table\n
2c560 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ");.        rc =
2c570 20 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   1;.        sqli
2c580 74 65 33 5f 66 69 6e 61 6c 69 7a 65 28 70 53 74  te3_finalize(pSt
2c590 6d 74 29 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  mt);.        got
2c5a0 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
2c5b0 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xit;.      }.   
2c5c0 20 20 20 66 6f 72 28 69 3d 31 3b 20 73 71 6c 69     for(i=1; sqli
2c5d0 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29 3d  te3_step(pStmt)=
2c5e0 3d 53 51 4c 49 54 45 5f 52 4f 57 3b 20 69 2b 2b  =SQLITE_ROW; i++
2c5f0 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 74  ){.        int t
2c600 6e 6f 20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6c  no = sqlite3_col
2c610 75 6d 6e 5f 69 6e 74 28 70 53 74 6d 74 2c 20 30  umn_int(pStmt, 0
2c620 29 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74  );.        const
2c630 20 63 68 61 72 20 2a 7a 4f 70 20 3d 20 28 63 6f   char *zOp = (co
2c640 6e 73 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65  nst char*)sqlite
2c650 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53  3_column_text(pS
2c660 74 6d 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  tmt, 1);.       
2c670 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 71   const char *zSq
2c680 6c 20 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a  l = (const char*
2c690 29 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f  )sqlite3_column_
2c6a0 74 65 78 74 28 70 53 74 6d 74 2c 20 32 29 3b 0a  text(pStmt, 2);.
2c6b0 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
2c6c0 61 72 20 2a 7a 41 6e 73 20 3d 20 28 63 6f 6e 73  ar *zAns = (cons
2c6d0 74 20 63 68 61 72 2a 29 73 71 6c 69 74 65 33 5f  t char*)sqlite3_
2c6e0 63 6f 6c 75 6d 6e 5f 74 65 78 74 28 70 53 74 6d  column_text(pStm
2c6f0 74 2c 20 33 29 3b 0a 0a 20 20 20 20 20 20 20 20  t, 3);..        
2c700 6b 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 69  k = 0;.        i
2c710 66 28 20 62 56 65 72 62 6f 73 65 3e 30 20 29 7b  f( bVerbose>0 ){
2c720 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
2c730 2a 7a 51 75 6f 74 65 20 3d 20 73 71 6c 69 74 65  *zQuote = sqlite
2c740 33 5f 6d 70 72 69 6e 74 66 28 22 25 71 22 2c 20  3_mprintf("%q", 
2c750 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  zSql);.         
2c760 20 70 72 69 6e 74 66 28 22 25 64 3a 20 25 73 20   printf("%d: %s 
2c770 25 73 5c 6e 22 2c 20 74 6e 6f 2c 20 7a 4f 70 2c  %s\n", tno, zOp,
2c780 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20 20 20 20   zSql);.        
2c790 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
2c7a0 51 75 6f 74 65 29 3b 0a 20 20 20 20 20 20 20 20  Quote);.        
2c7b0 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74  }.        if( st
2c7c0 72 63 6d 70 28 7a 4f 70 2c 22 6d 65 6d 6f 22 29  rcmp(zOp,"memo")
2c7d0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2c7e0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
2c7f0 6f 75 74 2c 20 22 25 73 5c 6e 22 2c 20 7a 53 71  out, "%s\n", zSq
2c800 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  l);.        }els
2c810 65 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 74  e.        if( st
2c820 72 63 6d 70 28 7a 4f 70 2c 22 72 75 6e 22 29 3d  rcmp(zOp,"run")=
2c830 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2c840 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20 3d 20  char *zErrMsg = 
2c850 30 3b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  0;.          str
2c860 2e 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  .n = 0;.        
2c870 20 20 73 74 72 2e 7a 5b 30 5d 20 3d 20 30 3b 0a    str.z[0] = 0;.
2c880 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20 73            rc = s
2c890 71 6c 69 74 65 33 5f 65 78 65 63 28 70 2d 3e 64  qlite3_exec(p->d
2c8a0 62 2c 20 7a 53 71 6c 2c 20 63 61 70 74 75 72 65  b, zSql, capture
2c8b0 4f 75 74 70 75 74 43 61 6c 6c 62 61 63 6b 2c 20  OutputCallback, 
2c8c0 26 73 74 72 2c 20 26 7a 45 72 72 4d 73 67 29 3b  &str, &zErrMsg);
2c8d0 0a 20 20 20 20 20 20 20 20 20 20 6e 54 65 73 74  .          nTest
2c8e0 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ++;.          if
2c8f0 28 20 62 56 65 72 62 6f 73 65 20 29 7b 0a 20 20  ( bVerbose ){.  
2c900 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70            utf8_p
2c910 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 52  rintf(p->out, "R
2c920 65 73 75 6c 74 3a 20 25 73 5c 6e 22 2c 20 73 74  esult: %s\n", st
2c930 72 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20 20 20  r.z);.          
2c940 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
2c950 72 63 20 7c 7c 20 7a 45 72 72 4d 73 67 20 29 7b  rc || zErrMsg ){
2c960 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 45 72  .            nEr
2c970 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  r++;.           
2c980 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20   rc = 1;.       
2c990 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2c9a0 28 70 2d 3e 6f 75 74 2c 20 22 25 64 3a 20 65 72  (p->out, "%d: er
2c9b0 72 6f 72 2d 63 6f 64 65 2d 25 64 3a 20 25 73 5c  ror-code-%d: %s\
2c9c0 6e 22 2c 20 74 6e 6f 2c 20 72 63 2c 20 7a 45 72  n", tno, rc, zEr
2c9d0 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  rMsg);.         
2c9e0 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28     sqlite3_free(
2c9f0 7a 45 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20  zErrMsg);.      
2ca00 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
2ca10 72 63 6d 70 28 7a 41 6e 73 2c 73 74 72 2e 7a 29  rcmp(zAns,str.z)
2ca20 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
2ca30 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20     nErr++;.     
2ca40 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20         rc = 1;. 
2ca50 20 20 20 20 20 20 20 20 20 20 20 75 74 66 38 5f             utf8_
2ca60 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22  printf(p->out, "
2ca70 25 64 3a 20 45 78 70 65 63 74 65 64 3a 20 5b 25  %d: Expected: [%
2ca80 73 5d 5c 6e 22 2c 20 74 6e 6f 2c 20 7a 41 6e 73  s]\n", tno, zAns
2ca90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 75  );.            u
2caa0 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  tf8_printf(p->ou
2cab0 74 2c 20 22 25 64 3a 20 20 20 20 20 20 47 6f 74  t, "%d:      Got
2cac0 3a 20 5b 25 73 5d 5c 6e 22 2c 20 74 6e 6f 2c 20  : [%s]\n", tno, 
2cad0 73 74 72 2e 7a 29 3b 0a 20 20 20 20 20 20 20 20  str.z);.        
2cae0 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 65 6c 73    }.        }els
2caf0 65 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  e.        {.    
2cb00 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
2cb10 66 28 73 74 64 65 72 72 2c 0a 20 20 20 20 20 20  f(stderr,.      
2cb20 20 20 20 20 20 20 22 55 6e 6b 6e 6f 77 6e 20 6f        "Unknown o
2cb30 70 65 72 61 74 69 6f 6e 20 5c 22 25 73 5c 22 20  peration \"%s\" 
2cb40 6f 6e 20 73 65 6c 66 74 65 73 74 20 6c 69 6e 65  on selftest line
2cb50 20 25 64 5c 6e 22 2c 20 7a 4f 70 2c 20 74 6e 6f   %d\n", zOp, tno
2cb60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
2cb70 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 1;.          b
2cb80 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
2cb90 20 20 20 20 20 20 7d 20 2f 2a 20 45 6e 64 20 6c        } /* End l
2cba0 6f 6f 70 20 6f 76 65 72 20 72 6f 77 73 20 6f 66  oop over rows of
2cbb0 20 63 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 53 45   content from SE
2cbc0 4c 46 54 45 53 54 20 2a 2f 0a 20 20 20 20 20 20  LFTEST */.      
2cbd0 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
2cbe0 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 7d 20 2f  (pStmt);.    } /
2cbf0 2a 20 45 6e 64 20 6c 6f 6f 70 20 6f 76 65 72 20  * End loop over 
2cc00 6b 20 2a 2f 0a 20 20 20 20 66 72 65 65 54 65 78  k */.    freeTex
2cc10 74 28 26 73 74 72 29 3b 0a 20 20 20 20 75 74 66  t(&str);.    utf
2cc20 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
2cc30 20 22 25 64 20 65 72 72 6f 72 73 20 6f 75 74 20   "%d errors out 
2cc40 6f 66 20 25 64 20 74 65 73 74 73 5c 6e 22 2c 20  of %d tests\n", 
2cc50 6e 45 72 72 2c 20 6e 54 65 73 74 29 3b 0a 20 20  nErr, nTest);.  
2cc60 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d  }else..  if( c==
2cc70 27 73 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61  's' && strncmp(a
2cc80 7a 41 72 67 5b 30 5d 2c 20 22 73 65 70 61 72 61  zArg[0], "separa
2cc90 74 6f 72 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  tor", n)==0 ){. 
2cca0 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20 7c 7c     if( nArg<2 ||
2ccb0 20 6e 41 72 67 3e 33 20 29 7b 0a 20 20 20 20 20   nArg>3 ){.     
2ccc0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2ccd0 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73 65 70  rr, "Usage: .sep
2cce0 61 72 61 74 6f 72 20 43 4f 4c 20 3f 52 4f 57 3f  arator COL ?ROW?
2ccf0 5c 6e 22 29 3b 0a 20 20 20 20 20 20 72 63 20 3d  \n");.      rc =
2cd00 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66   1;.    }.    if
2cd10 28 20 6e 41 72 67 3e 3d 32 20 29 7b 0a 20 20 20  ( nArg>=2 ){.   
2cd20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69     sqlite3_snpri
2cd30 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d 3e 63 6f  ntf(sizeof(p->co
2cd40 6c 53 65 70 61 72 61 74 6f 72 29 2c 20 70 2d 3e  lSeparator), p->
2cd50 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 0a 20 20  colSeparator,.  
2cd60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd70 20 20 20 20 20 22 25 2e 2a 73 22 2c 20 28 69 6e       "%.*s", (in
2cd80 74 29 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 63  t)ArraySize(p->c
2cd90 6f 6c 53 65 70 61 72 61 74 6f 72 29 2d 31 2c 20  olSeparator)-1, 
2cda0 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 7d  azArg[1]);.    }
2cdb0 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3e 3d 33  .    if( nArg>=3
2cdc0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
2cdd0 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f  3_snprintf(sizeo
2cde0 66 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  f(p->rowSeparato
2cdf0 72 29 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61  r), p->rowSepara
2ce00 74 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  tor,.           
2ce10 20 20 20 20 20 20 20 20 20 20 20 20 22 25 2e 2a              "%.*
2ce20 73 22 2c 20 28 69 6e 74 29 41 72 72 61 79 53 69  s", (int)ArraySi
2ce30 7a 65 28 70 2d 3e 72 6f 77 53 65 70 61 72 61 74  ze(p->rowSeparat
2ce40 6f 72 29 2d 31 2c 20 61 7a 41 72 67 5b 32 5d 29  or)-1, azArg[2])
2ce50 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a  ;.    }.  }else.
2ce60 0a 20 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26  .  if( c=='s' &&
2ce70 20 6e 3e 3d 34 20 26 26 20 73 74 72 6e 63 6d 70   n>=4 && strncmp
2ce80 28 61 7a 41 72 67 5b 30 5d 2c 22 73 68 61 33 73  (azArg[0],"sha3s
2ce90 75 6d 22 2c 6e 29 3d 3d 30 20 29 7b 0a 20 20 20  um",n)==0 ){.   
2cea0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4c 69   const char *zLi
2ceb0 6b 65 20 3d 20 30 3b 20 20 20 2f 2a 20 57 68 69  ke = 0;   /* Whi
2cec0 63 68 20 74 61 62 6c 65 20 74 6f 20 63 68 65 63  ch table to chec
2ced0 6b 73 75 6d 2e 20 30 20 6d 65 61 6e 73 20 65 76  ksum. 0 means ev
2cee0 65 72 79 74 68 69 6e 67 20 2a 2f 0a 20 20 20 20  erything */.    
2cef0 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
2cf00 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
2cf10 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
2cf20 69 6e 74 20 62 53 63 68 65 6d 61 20 3d 20 30 3b  int bSchema = 0;
2cf30 20 20 20 20 20 20 20 20 20 2f 2a 20 41 6c 73 6f           /* Also
2cf40 20 68 61 73 68 20 74 68 65 20 73 63 68 65 6d 61   hash the schema
2cf50 20 2a 2f 0a 20 20 20 20 69 6e 74 20 62 53 65 70   */.    int bSep
2cf60 61 72 61 74 65 20 3d 20 30 3b 20 20 20 20 20 20  arate = 0;      
2cf70 20 2f 2a 20 48 61 73 68 20 65 61 63 68 20 74 61   /* Hash each ta
2cf80 62 6c 65 20 73 65 70 61 72 61 74 65 6c 79 20 2a  ble separately *
2cf90 2f 0a 20 20 20 20 69 6e 74 20 69 53 69 7a 65 20  /.    int iSize 
2cfa0 3d 20 32 32 34 3b 20 20 20 20 20 20 20 20 20 2f  = 224;         /
2cfb0 2a 20 48 61 73 68 20 61 6c 67 6f 72 69 74 68 6d  * Hash algorithm
2cfc0 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20 20 20 69   to use */.    i
2cfd0 6e 74 20 62 44 65 62 75 67 20 3d 20 30 3b 20 20  nt bDebug = 0;  
2cfe0 20 20 20 20 20 20 20 20 2f 2a 20 4f 6e 6c 79 20          /* Only 
2cff0 73 68 6f 77 20 74 68 65 20 71 75 65 72 79 20 74  show the query t
2d000 68 61 74 20 77 6f 75 6c 64 20 68 61 76 65 20 72  hat would have r
2d010 75 6e 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65  un */.    sqlite
2d020 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74 3b 20 20  3_stmt *pStmt;  
2d030 20 20 20 2f 2a 20 46 6f 72 20 71 75 65 72 79 69     /* For queryi
2d040 6e 67 20 74 61 62 6c 65 73 20 6e 61 6d 65 73 20  ng tables names 
2d050 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53 71  */.    char *zSq
2d060 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
2d070 2f 2a 20 53 51 4c 20 74 6f 20 62 65 20 72 75 6e  /* SQL to be run
2d080 20 2a 2f 0a 20 20 20 20 63 68 61 72 20 2a 7a 53   */.    char *zS
2d090 65 70 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ep;             
2d0a0 20 2f 2a 20 53 65 70 61 72 61 74 6f 72 20 2a 2f   /* Separator */
2d0b0 0a 20 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73  .    ShellText s
2d0c0 53 71 6c 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  Sql;          /*
2d0d0 20 43 6f 6d 70 6c 65 74 65 20 53 51 4c 20 66 6f   Complete SQL fo
2d0e0 72 20 74 68 65 20 71 75 65 72 79 20 74 6f 20 72  r the query to r
2d0f0 75 6e 20 74 68 65 20 68 61 73 68 20 2a 2f 0a 20  un the hash */. 
2d100 20 20 20 53 68 65 6c 6c 54 65 78 74 20 73 51 75     ShellText sQu
2d110 65 72 79 3b 20 20 20 20 20 20 20 20 2f 2a 20 53  ery;        /* S
2d120 65 74 20 6f 66 20 71 75 65 72 69 65 73 20 75 73  et of queries us
2d130 65 64 20 74 6f 20 72 65 61 64 20 61 6c 6c 20 63  ed to read all c
2d140 6f 6e 74 65 6e 74 20 2a 2f 0a 20 20 20 20 6f 70  ontent */.    op
2d150 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 20  en_db(p, 0);.   
2d160 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6e 41 72 67   for(i=1; i<nArg
2d170 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f  ; i++){.      co
2d180 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 61 7a  nst char *z = az
2d190 41 72 67 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66  Arg[i];.      if
2d1a0 28 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 0a 20  ( z[0]=='-' ){. 
2d1b0 20 20 20 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20         z++;.    
2d1c0 20 20 20 20 69 66 28 20 7a 5b 30 5d 3d 3d 27 2d      if( z[0]=='-
2d1d0 27 20 29 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 20  ' ) z++;.       
2d1e0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 73   if( strcmp(z,"s
2d1f0 63 68 65 6d 61 22 29 3d 3d 30 20 29 7b 0a 20 20  chema")==0 ){.  
2d200 20 20 20 20 20 20 20 20 62 53 63 68 65 6d 61 20          bSchema 
2d210 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  = 1;.        }el
2d220 73 65 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  se.        if( s
2d230 74 72 63 6d 70 28 7a 2c 22 73 68 61 33 2d 32 32  trcmp(z,"sha3-22
2d240 34 22 29 3d 3d 30 20 7c 7c 20 73 74 72 63 6d 70  4")==0 || strcmp
2d250 28 7a 2c 22 73 68 61 33 2d 32 35 36 22 29 3d 3d  (z,"sha3-256")==
2d260 30 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74  0.         || st
2d270 72 63 6d 70 28 7a 2c 22 73 68 61 33 2d 33 38 34  rcmp(z,"sha3-384
2d280 22 29 3d 3d 30 20 7c 7c 20 73 74 72 63 6d 70 28  ")==0 || strcmp(
2d290 7a 2c 22 73 68 61 33 2d 35 31 32 22 29 3d 3d 30  z,"sha3-512")==0
2d2a0 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20  .        ){.    
2d2b0 20 20 20 20 20 20 69 53 69 7a 65 20 3d 20 61 74        iSize = at
2d2c0 6f 69 28 26 7a 5b 35 5d 29 3b 0a 20 20 20 20 20  oi(&z[5]);.     
2d2d0 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20     }else.       
2d2e0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 64   if( strcmp(z,"d
2d2f0 65 62 75 67 22 29 3d 3d 30 20 29 7b 0a 20 20 20  ebug")==0 ){.   
2d300 20 20 20 20 20 20 20 62 44 65 62 75 67 20 3d 20         bDebug = 
2d310 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
2d320 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
2d330 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
2d340 28 73 74 64 65 72 72 2c 20 22 55 6e 6b 6e 6f 77  (stderr, "Unknow
2d350 6e 20 6f 70 74 69 6f 6e 20 5c 22 25 73 5c 22 20  n option \"%s\" 
2d360 6f 6e 20 5c 22 25 73 5c 22 5c 6e 22 2c 0a 20 20  on \"%s\"\n",.  
2d370 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d380 20 20 20 20 61 7a 41 72 67 5b 69 5d 2c 20 61 7a      azArg[i], az
2d390 41 72 67 5b 30 5d 29 3b 0a 20 20 20 20 20 20 20  Arg[0]);.       
2d3a0 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
2d3b0 64 65 72 72 2c 20 22 53 68 6f 75 6c 64 20 62 65  derr, "Should be
2d3c0 20 6f 6e 65 20 6f 66 3a 20 2d 2d 73 63 68 65 6d   one of: --schem
2d3d0 61 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  a".             
2d3e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d3f0 22 20 2d 2d 73 68 61 33 2d 32 32 34 20 2d 2d 73  " --sha3-224 --s
2d400 68 61 33 2d 32 35 35 20 2d 2d 73 68 61 33 2d 33  ha3-255 --sha3-3
2d410 38 34 20 2d 2d 73 68 61 33 2d 35 31 32 5c 6e 22  84 --sha3-512\n"
2d420 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
2d430 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67  = 1;.          g
2d440 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
2d450 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d  _exit;.        }
2d460 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
2d470 20 7a 4c 69 6b 65 20 29 7b 0a 20 20 20 20 20 20   zLike ){.      
2d480 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
2d490 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 73 68  err, "Usage: .sh
2d4a0 61 33 73 75 6d 20 3f 4f 50 54 49 4f 4e 53 3f 20  a3sum ?OPTIONS? 
2d4b0 3f 4c 49 4b 45 2d 50 41 54 54 45 52 4e 3f 5c 6e  ?LIKE-PATTERN?\n
2d4c0 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d  ");.        rc =
2d4d0 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f   1;.        goto
2d4e0 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78   meta_command_ex
2d4f0 69 74 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  it;.      }else{
2d500 0a 20 20 20 20 20 20 20 20 7a 4c 69 6b 65 20 3d  .        zLike =
2d510 20 7a 3b 0a 20 20 20 20 20 20 20 20 62 53 65 70   z;.        bSep
2d520 61 72 61 74 65 20 3d 20 31 3b 0a 20 20 20 20 20  arate = 1;.     
2d530 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 73     if( sqlite3_s
2d540 74 72 6c 69 6b 65 28 22 73 71 6c 69 74 65 5f 25  trlike("sqlite_%
2d550 22 2c 20 7a 4c 69 6b 65 2c 20 30 29 3d 3d 30 20  ", zLike, 0)==0 
2d560 29 20 62 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  ) bSchema = 1;. 
2d570 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
2d580 20 69 66 28 20 62 53 63 68 65 6d 61 20 29 7b 0a   if( bSchema ){.
2d590 20 20 20 20 20 20 7a 53 71 6c 20 3d 20 22 53 45        zSql = "SE
2d5a0 4c 45 43 54 20 6c 6f 77 65 72 28 6e 61 6d 65 29  LECT lower(name)
2d5b0 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73   FROM sqlite_mas
2d5c0 74 65 72 22 0a 20 20 20 20 20 20 20 20 20 20 20  ter".           
2d5d0 20 20 22 20 57 48 45 52 45 20 74 79 70 65 3d 27    " WHERE type='
2d5e0 74 61 62 6c 65 27 20 41 4e 44 20 63 6f 61 6c 65  table' AND coale
2d5f0 73 63 65 28 72 6f 6f 74 70 61 67 65 2c 30 29 3e  sce(rootpage,0)>
2d600 31 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  1".             
2d610 22 20 55 4e 49 4f 4e 20 41 4c 4c 20 53 45 4c 45  " UNION ALL SELE
2d620 43 54 20 27 73 71 6c 69 74 65 5f 6d 61 73 74 65  CT 'sqlite_maste
2d630 72 27 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  r'".            
2d640 20 22 20 4f 52 44 45 52 20 42 59 20 31 20 63 6f   " ORDER BY 1 co
2d650 6c 6c 61 74 65 20 6e 6f 63 61 73 65 22 3b 0a 20  llate nocase";. 
2d660 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
2d670 7a 53 71 6c 20 3d 20 22 53 45 4c 45 43 54 20 6c  zSql = "SELECT l
2d680 6f 77 65 72 28 6e 61 6d 65 29 20 46 52 4f 4d 20  ower(name) FROM 
2d690 73 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 0a 20  sqlite_master". 
2d6a0 20 20 20 20 20 20 20 20 20 20 20 20 22 20 57 48              " WH
2d6b0 45 52 45 20 74 79 70 65 3d 27 74 61 62 6c 65 27  ERE type='table'
2d6c0 20 41 4e 44 20 63 6f 61 6c 65 73 63 65 28 72 6f   AND coalesce(ro
2d6d0 6f 74 70 61 67 65 2c 30 29 3e 31 22 0a 20 20 20  otpage,0)>1".   
2d6e0 20 20 20 20 20 20 20 20 20 20 22 20 41 4e 44 20            " AND 
2d6f0 6e 61 6d 65 20 4e 4f 54 20 4c 49 4b 45 20 27 73  name NOT LIKE 's
2d700 71 6c 69 74 65 5f 25 27 22 0a 20 20 20 20 20 20  qlite_%'".      
2d710 20 20 20 20 20 20 20 22 20 4f 52 44 45 52 20 42         " ORDER B
2d720 59 20 31 20 63 6f 6c 6c 61 74 65 20 6e 6f 63 61  Y 1 collate noca
2d730 73 65 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  se";.    }.    s
2d740 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
2d750 32 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 2d  2(p->db, zSql, -
2d760 31 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20  1, &pStmt, 0);. 
2d770 20 20 20 69 6e 69 74 54 65 78 74 28 26 73 51 75     initText(&sQu
2d780 65 72 79 29 3b 0a 20 20 20 20 69 6e 69 74 54 65  ery);.    initTe
2d790 78 74 28 26 73 53 71 6c 29 3b 0a 20 20 20 20 61  xt(&sSql);.    a
2d7a0 70 70 65 6e 64 54 65 78 74 28 26 73 53 71 6c 2c  ppendText(&sSql,
2d7b0 20 22 57 49 54 48 20 5b 73 68 61 33 73 75 6d 24   "WITH [sha3sum$
2d7c0 71 75 65 72 79 5d 28 61 2c 62 29 20 41 53 28 22  query](a,b) AS("
2d7d0 2c 30 29 3b 0a 20 20 20 20 7a 53 65 70 20 3d 20  ,0);.    zSep = 
2d7e0 22 56 41 4c 55 45 53 28 22 3b 0a 20 20 20 20 77  "VALUES(";.    w
2d7f0 68 69 6c 65 28 20 53 51 4c 49 54 45 5f 52 4f 57  hile( SQLITE_ROW
2d800 3d 3d 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70  ==sqlite3_step(p
2d810 53 74 6d 74 29 20 29 7b 0a 20 20 20 20 20 20 63  Stmt) ){.      c
2d820 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 20  onst char *zTab 
2d830 3d 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73  = (const char*)s
2d840 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65  qlite3_column_te
2d850 78 74 28 70 53 74 6d 74 2c 30 29 3b 0a 20 20 20  xt(pStmt,0);.   
2d860 20 20 20 69 66 28 20 7a 4c 69 6b 65 20 26 26 20     if( zLike && 
2d870 73 71 6c 69 74 65 33 5f 73 74 72 6c 69 6b 65 28  sqlite3_strlike(
2d880 7a 4c 69 6b 65 2c 20 7a 54 61 62 2c 20 30 29 21  zLike, zTab, 0)!
2d890 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
2d8a0 20 20 20 20 20 69 66 28 20 73 74 72 6e 63 6d 70       if( strncmp
2d8b0 28 7a 54 61 62 2c 20 22 73 71 6c 69 74 65 5f 22  (zTab, "sqlite_"
2d8c0 2c 37 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ,7)!=0 ){.      
2d8d0 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 51    appendText(&sQ
2d8e0 75 65 72 79 2c 22 53 45 4c 45 43 54 20 2a 20 46  uery,"SELECT * F
2d8f0 52 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 20  ROM ", 0);.     
2d900 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
2d910 51 75 65 72 79 2c 7a 54 61 62 2c 27 22 27 29 3b  Query,zTab,'"');
2d920 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
2d930 65 78 74 28 26 73 51 75 65 72 79 2c 22 20 4e 4f  ext(&sQuery," NO
2d940 54 20 49 4e 44 45 58 45 44 3b 22 2c 20 30 29 3b  T INDEXED;", 0);
2d950 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
2d960 20 73 74 72 63 6d 70 28 7a 54 61 62 2c 20 22 73   strcmp(zTab, "s
2d970 71 6c 69 74 65 5f 6d 61 73 74 65 72 22 29 3d 3d  qlite_master")==
2d980 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61 70 70  0 ){.        app
2d990 65 6e 64 54 65 78 74 28 26 73 51 75 65 72 79 2c  endText(&sQuery,
2d9a0 22 53 45 4c 45 43 54 20 74 79 70 65 2c 6e 61 6d  "SELECT type,nam
2d9b0 65 2c 74 62 6c 5f 6e 61 6d 65 2c 73 71 6c 20 46  e,tbl_name,sql F
2d9c0 52 4f 4d 20 73 71 6c 69 74 65 5f 6d 61 73 74 65  ROM sqlite_maste
2d9d0 72 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r".             
2d9e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 20                " 
2d9f0 4f 52 44 45 52 20 42 59 20 6e 61 6d 65 3b 22 2c  ORDER BY name;",
2da00 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   0);.      }else
2da10 20 69 66 28 20 73 74 72 63 6d 70 28 7a 54 61 62   if( strcmp(zTab
2da20 2c 20 22 73 71 6c 69 74 65 5f 73 65 71 75 65 6e  , "sqlite_sequen
2da30 63 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ce")==0 ){.     
2da40 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
2da50 51 75 65 72 79 2c 22 53 45 4c 45 43 54 20 6e 61  Query,"SELECT na
2da60 6d 65 2c 73 65 71 20 46 52 4f 4d 20 73 71 6c 69  me,seq FROM sqli
2da70 74 65 5f 73 65 71 75 65 6e 63 65 22 0a 20 20 20  te_sequence".   
2da80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2da90 20 20 20 20 20 20 20 20 22 20 4f 52 44 45 52 20          " ORDER 
2daa0 42 59 20 6e 61 6d 65 3b 22 2c 20 30 29 3b 0a 20  BY name;", 0);. 
2dab0 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73       }else if( s
2dac0 74 72 63 6d 70 28 7a 54 61 62 2c 20 22 73 71 6c  trcmp(zTab, "sql
2dad0 69 74 65 5f 73 74 61 74 31 22 29 3d 3d 30 20 29  ite_stat1")==0 )
2dae0 7b 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64  {.        append
2daf0 54 65 78 74 28 26 73 51 75 65 72 79 2c 22 53 45  Text(&sQuery,"SE
2db00 4c 45 43 54 20 74 62 6c 2c 69 64 78 2c 73 74 61  LECT tbl,idx,sta
2db10 74 20 46 52 4f 4d 20 73 71 6c 69 74 65 5f 73 74  t FROM sqlite_st
2db20 61 74 31 22 0a 20 20 20 20 20 20 20 20 20 20 20  at1".           
2db30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2db40 22 20 4f 52 44 45 52 20 42 59 20 74 62 6c 2c 69  " ORDER BY tbl,i
2db50 64 78 3b 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  dx;", 0);.      
2db60 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
2db70 28 7a 54 61 62 2c 20 22 73 71 6c 69 74 65 5f 73  (zTab, "sqlite_s
2db80 74 61 74 33 22 29 3d 3d 30 0a 20 20 20 20 20 20  tat3")==0.      
2db90 20 20 20 20 20 20 20 7c 7c 20 73 74 72 63 6d 70         || strcmp
2dba0 28 7a 54 61 62 2c 20 22 73 71 6c 69 74 65 5f 73  (zTab, "sqlite_s
2dbb0 74 61 74 34 22 29 3d 3d 30 20 29 7b 0a 20 20 20  tat4")==0 ){.   
2dbc0 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
2dbd0 26 73 51 75 65 72 79 2c 20 22 53 45 4c 45 43 54  &sQuery, "SELECT
2dbe0 20 2a 20 46 52 4f 4d 20 22 2c 20 30 29 3b 0a 20   * FROM ", 0);. 
2dbf0 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
2dc00 74 28 26 73 51 75 65 72 79 2c 20 7a 54 61 62 2c  t(&sQuery, zTab,
2dc10 20 30 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70   0);.        app
2dc20 65 6e 64 54 65 78 74 28 26 73 51 75 65 72 79 2c  endText(&sQuery,
2dc30 20 22 20 4f 52 44 45 52 20 42 59 20 74 62 6c 2c   " ORDER BY tbl,
2dc40 20 69 64 78 2c 20 72 6f 77 69 64 3b 5c 6e 22 2c   idx, rowid;\n",
2dc50 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
2dc60 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
2dc70 53 71 6c 2c 20 7a 53 65 70 2c 20 30 29 3b 0a 20  Sql, zSep, 0);. 
2dc80 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28       appendText(
2dc90 26 73 53 71 6c 2c 20 73 51 75 65 72 79 2e 7a 2c  &sSql, sQuery.z,
2dca0 20 27 5c 27 27 29 3b 0a 20 20 20 20 20 20 73 51   '\'');.      sQ
2dcb0 75 65 72 79 2e 6e 20 3d 20 30 3b 0a 20 20 20 20  uery.n = 0;.    
2dcc0 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73 53    appendText(&sS
2dcd0 71 6c 2c 20 22 2c 22 2c 20 30 29 3b 0a 20 20 20  ql, ",", 0);.   
2dce0 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
2dcf0 53 71 6c 2c 20 7a 54 61 62 2c 20 27 5c 27 27 29  Sql, zTab, '\'')
2dd00 3b 0a 20 20 20 20 20 20 7a 53 65 70 20 3d 20 22  ;.      zSep = "
2dd10 29 2c 28 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ),(";.    }.    
2dd20 73 71 6c 69 74 65 33 5f 66 69 6e 61 6c 69 7a 65  sqlite3_finalize
2dd30 28 70 53 74 6d 74 29 3b 0a 20 20 20 20 69 66 28  (pStmt);.    if(
2dd40 20 62 53 65 70 61 72 61 74 65 20 29 7b 0a 20 20   bSeparate ){.  
2dd50 20 20 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74      zSql = sqlit
2dd60 65 33 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20  e3_mprintf(.    
2dd70 20 20 20 20 20 20 22 25 73 29 29 22 0a 20 20 20        "%s))".   
2dd80 20 20 20 20 20 20 20 22 20 53 45 4c 45 43 54 20         " SELECT 
2dd90 6c 6f 77 65 72 28 68 65 78 28 73 68 61 33 5f 71  lower(hex(sha3_q
2dda0 75 65 72 79 28 61 2c 25 64 29 29 29 20 41 53 20  uery(a,%d))) AS 
2ddb0 68 61 73 68 2c 20 62 20 41 53 20 6c 61 62 65 6c  hash, b AS label
2ddc0 22 0a 20 20 20 20 20 20 20 20 20 20 22 20 20 20  ".          "   
2ddd0 46 52 4f 4d 20 5b 73 68 61 33 73 75 6d 24 71 75  FROM [sha3sum$qu
2dde0 65 72 79 5d 22 2c 0a 20 20 20 20 20 20 20 20 20  ery]",.         
2ddf0 20 73 53 71 6c 2e 7a 2c 20 69 53 69 7a 65 29 3b   sSql.z, iSize);
2de00 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2de10 20 20 7a 53 71 6c 20 3d 20 73 71 6c 69 74 65 33    zSql = sqlite3
2de20 5f 6d 70 72 69 6e 74 66 28 0a 20 20 20 20 20 20  _mprintf(.      
2de30 20 20 20 20 22 25 73 29 29 22 0a 20 20 20 20 20      "%s))".     
2de40 20 20 20 20 20 22 20 53 45 4c 45 43 54 20 6c 6f       " SELECT lo
2de50 77 65 72 28 68 65 78 28 73 68 61 33 5f 71 75 65  wer(hex(sha3_que
2de60 72 79 28 67 72 6f 75 70 5f 63 6f 6e 63 61 74 28  ry(group_concat(
2de70 61 2c 27 27 29 2c 25 64 29 29 29 20 41 53 20 68  a,''),%d))) AS h
2de80 61 73 68 22 0a 20 20 20 20 20 20 20 20 20 20 22  ash".          "
2de90 20 20 20 46 52 4f 4d 20 5b 73 68 61 33 73 75 6d     FROM [sha3sum
2dea0 24 71 75 65 72 79 5d 22 2c 0a 20 20 20 20 20 20  $query]",.      
2deb0 20 20 20 20 73 53 71 6c 2e 7a 2c 20 69 53 69 7a      sSql.z, iSiz
2dec0 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 72  e);.    }.    fr
2ded0 65 65 54 65 78 74 28 26 73 51 75 65 72 79 29 3b  eeText(&sQuery);
2dee0 0a 20 20 20 20 66 72 65 65 54 65 78 74 28 26 73  .    freeText(&s
2def0 53 71 6c 29 3b 0a 20 20 20 20 69 66 28 20 62 44  Sql);.    if( bD
2df00 65 62 75 67 20 29 7b 0a 20 20 20 20 20 20 75 74  ebug ){.      ut
2df10 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
2df20 2c 20 22 25 73 5c 6e 22 2c 20 7a 53 71 6c 29 3b  , "%s\n", zSql);
2df30 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
2df40 20 20 73 68 65 6c 6c 5f 65 78 65 63 28 70 2d 3e    shell_exec(p->
2df50 64 62 2c 20 7a 53 71 6c 2c 20 73 68 65 6c 6c 5f  db, zSql, shell_
2df60 63 61 6c 6c 62 61 63 6b 2c 20 70 2c 20 30 29 3b  callback, p, 0);
2df70 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
2df80 65 33 5f 66 72 65 65 28 7a 53 71 6c 29 3b 0a 20  e3_free(zSql);. 
2df90 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d   }else..  if( c=
2dfa0 3d 27 73 27 0a 20 20 20 26 26 20 28 73 74 72 6e  ='s'.   && (strn
2dfb0 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 73  cmp(azArg[0], "s
2dfc0 68 65 6c 6c 22 2c 20 6e 29 3d 3d 30 20 7c 7c 20  hell", n)==0 || 
2dfd0 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d  strncmp(azArg[0]
2dfe0 2c 22 73 79 73 74 65 6d 22 2c 6e 29 3d 3d 30 29  ,"system",n)==0)
2dff0 0a 20 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  .  ){.    char *
2e000 7a 43 6d 64 3b 0a 20 20 20 20 69 6e 74 20 69 2c  zCmd;.    int i,
2e010 20 78 3b 0a 20 20 20 20 69 66 28 20 6e 41 72 67   x;.    if( nArg
2e020 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 61 77 5f  <2 ){.      raw_
2e030 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
2e040 55 73 61 67 65 3a 20 2e 73 79 73 74 65 6d 20 43  Usage: .system C
2e050 4f 4d 4d 41 4e 44 5c 6e 22 29 3b 0a 20 20 20 20  OMMAND\n");.    
2e060 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20 20    rc = 1;.      
2e070 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e  goto meta_comman
2e080 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20 20  d_exit;.    }.  
2e090 20 20 7a 43 6d 64 20 3d 20 73 71 6c 69 74 65 33    zCmd = sqlite3
2e0a0 5f 6d 70 72 69 6e 74 66 28 73 74 72 63 68 72 28  _mprintf(strchr(
2e0b0 61 7a 41 72 67 5b 31 5d 2c 27 20 27 29 3d 3d 30  azArg[1],' ')==0
2e0c0 3f 22 25 73 22 3a 22 5c 22 25 73 5c 22 22 2c 20  ?"%s":"\"%s\"", 
2e0d0 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20 20 20 66  azArg[1]);.    f
2e0e0 6f 72 28 69 3d 32 3b 20 69 3c 6e 41 72 67 3b 20  or(i=2; i<nArg; 
2e0f0 69 2b 2b 29 7b 0a 20 20 20 20 20 20 7a 43 6d 64  i++){.      zCmd
2e100 20 3d 20 73 71 6c 69 74 65 33 5f 6d 70 72 69 6e   = sqlite3_mprin
2e110 74 66 28 73 74 72 63 68 72 28 61 7a 41 72 67 5b  tf(strchr(azArg[
2e120 69 5d 2c 27 20 27 29 3d 3d 30 3f 22 25 7a 20 25  i],' ')==0?"%z %
2e130 73 22 3a 22 25 7a 20 5c 22 25 73 5c 22 22 2c 0a  s":"%z \"%s\"",.
2e140 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e150 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 43 6d               zCm
2e160 64 2c 20 61 7a 41 72 67 5b 69 5d 29 3b 0a 20 20  d, azArg[i]);.  
2e170 20 20 7d 0a 20 20 20 20 78 20 3d 20 73 79 73 74    }.    x = syst
2e180 65 6d 28 7a 43 6d 64 29 3b 0a 20 20 20 20 73 71  em(zCmd);.    sq
2e190 6c 69 74 65 33 5f 66 72 65 65 28 7a 43 6d 64 29  lite3_free(zCmd)
2e1a0 3b 0a 20 20 20 20 69 66 28 20 78 20 29 20 72 61  ;.    if( x ) ra
2e1b0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
2e1c0 20 22 53 79 73 74 65 6d 20 63 6f 6d 6d 61 6e 64   "System command
2e1d0 20 72 65 74 75 72 6e 73 20 25 64 5c 6e 22 2c 20   returns %d\n", 
2e1e0 78 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69  x);.  }else..  i
2e1f0 66 28 20 63 3d 3d 27 73 27 20 26 26 20 73 74 72  f( c=='s' && str
2e200 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
2e210 73 68 6f 77 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a  show", n)==0 ){.
2e220 20 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74      static const
2e230 20 63 68 61 72 20 2a 61 7a 42 6f 6f 6c 5b 5d 20   char *azBool[] 
2e240 3d 20 7b 20 22 6f 66 66 22 2c 20 22 6f 6e 22 2c  = { "off", "on",
2e250 20 22 74 72 69 67 67 65 72 22 2c 20 22 66 75 6c   "trigger", "ful
2e260 6c 22 7d 3b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  l"};.    int i;.
2e270 20 20 20 20 69 66 28 20 6e 41 72 67 21 3d 31 20      if( nArg!=1 
2e280 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
2e290 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
2e2a0 67 65 3a 20 2e 73 68 6f 77 5c 6e 22 29 3b 0a 20  ge: .show\n");. 
2e2b0 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
2e2c0 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d     goto meta_com
2e2d0 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d  mand_exit;.    }
2e2e0 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66  .    utf8_printf
2e2f0 28 70 2d 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32  (p->out, "%12.12
2e300 73 3a 20 25 73 5c 6e 22 2c 22 65 63 68 6f 22 2c  s: %s\n","echo",
2e310 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2e320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e330 20 20 20 61 7a 42 6f 6f 6c 5b 53 68 65 6c 6c 48     azBool[ShellH
2e340 61 73 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f  asFlag(p, SHFLG_
2e350 45 63 68 6f 29 5d 29 3b 0a 20 20 20 20 75 74 66  Echo)]);.    utf
2e360 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
2e370 20 22 25 31 32 2e 31 32 73 3a 20 25 73 5c 6e 22   "%12.12s: %s\n"
2e380 2c 22 65 71 70 22 2c 20 61 7a 42 6f 6f 6c 5b 70  ,"eqp", azBool[p
2e390 2d 3e 61 75 74 6f 45 51 50 26 33 5d 29 3b 0a 20  ->autoEQP&3]);. 
2e3a0 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
2e3b0 2d 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32 73 3a  ->out, "%12.12s:
2e3c0 20 25 73 5c 6e 22 2c 22 65 78 70 6c 61 69 6e 22   %s\n","explain"
2e3d0 2c 0a 20 20 20 20 20 20 20 20 20 70 2d 3e 6d 6f  ,.         p->mo
2e3e0 64 65 3d 3d 4d 4f 44 45 5f 45 78 70 6c 61 69 6e  de==MODE_Explain
2e3f0 20 3f 20 22 6f 6e 22 20 3a 20 70 2d 3e 61 75 74   ? "on" : p->aut
2e400 6f 45 78 70 6c 61 69 6e 20 3f 20 22 61 75 74 6f  oExplain ? "auto
2e410 22 20 3a 20 22 6f 66 66 22 29 3b 0a 20 20 20 20  " : "off");.    
2e420 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f  utf8_printf(p->o
2e430 75 74 2c 22 25 31 32 2e 31 32 73 3a 20 25 73 5c  ut,"%12.12s: %s\
2e440 6e 22 2c 22 68 65 61 64 65 72 73 22 2c 20 61 7a  n","headers", az
2e450 42 6f 6f 6c 5b 70 2d 3e 73 68 6f 77 48 65 61 64  Bool[p->showHead
2e460 65 72 21 3d 30 5d 29 3b 0a 20 20 20 20 75 74 66  er!=0]);.    utf
2e470 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
2e480 20 22 25 31 32 2e 31 32 73 3a 20 25 73 5c 6e 22   "%12.12s: %s\n"
2e490 2c 22 6d 6f 64 65 22 2c 20 6d 6f 64 65 44 65 73  ,"mode", modeDes
2e4a0 63 72 5b 70 2d 3e 6d 6f 64 65 5d 29 3b 0a 20 20  cr[p->mode]);.  
2e4b0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
2e4c0 3e 6f 75 74 2c 20 22 25 31 32 2e 31 32 73 3a 20  >out, "%12.12s: 
2e4d0 22 2c 20 22 6e 75 6c 6c 76 61 6c 75 65 22 29 3b  ", "nullvalue");
2e4e0 0a 20 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f  .      output_c_
2e4f0 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 70  string(p->out, p
2e500 2d 3e 6e 75 6c 6c 56 61 6c 75 65 29 3b 0a 20 20  ->nullValue);.  
2e510 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
2e520 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20 20  ->out, "\n");.  
2e530 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d    utf8_printf(p-
2e540 3e 6f 75 74 2c 22 25 31 32 2e 31 32 73 3a 20 25  >out,"%12.12s: %
2e550 73 5c 6e 22 2c 22 6f 75 74 70 75 74 22 2c 0a 20  s\n","output",. 
2e560 20 20 20 20 20 20 20 20 20 20 20 73 74 72 6c 65             strle
2e570 6e 33 30 28 70 2d 3e 6f 75 74 66 69 6c 65 29 20  n30(p->outfile) 
2e580 3f 20 70 2d 3e 6f 75 74 66 69 6c 65 20 3a 20 22  ? p->outfile : "
2e590 73 74 64 6f 75 74 22 29 3b 0a 20 20 20 20 75 74  stdout");.    ut
2e5a0 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
2e5b0 2c 22 25 31 32 2e 31 32 73 3a 20 22 2c 20 22 63  ,"%12.12s: ", "c
2e5c0 6f 6c 73 65 70 61 72 61 74 6f 72 22 29 3b 0a 20  olseparator");. 
2e5d0 20 20 20 20 20 6f 75 74 70 75 74 5f 63 5f 73 74       output_c_st
2e5e0 72 69 6e 67 28 70 2d 3e 6f 75 74 2c 20 70 2d 3e  ring(p->out, p->
2e5f0 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 3b 0a 20  colSeparator);. 
2e600 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2e610 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  p->out, "\n");. 
2e620 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
2e630 2d 3e 6f 75 74 2c 22 25 31 32 2e 31 32 73 3a 20  ->out,"%12.12s: 
2e640 22 2c 20 22 72 6f 77 73 65 70 61 72 61 74 6f 72  ", "rowseparator
2e650 22 29 3b 0a 20 20 20 20 20 20 6f 75 74 70 75 74  ");.      output
2e660 5f 63 5f 73 74 72 69 6e 67 28 70 2d 3e 6f 75 74  _c_string(p->out
2e670 2c 20 70 2d 3e 72 6f 77 53 65 70 61 72 61 74 6f  , p->rowSeparato
2e680 72 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70 72  r);.      raw_pr
2e690 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 5c 6e  intf(p->out, "\n
2e6a0 22 29 3b 0a 20 20 20 20 75 74 66 38 5f 70 72 69  ");.    utf8_pri
2e6b0 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25 31 32  ntf(p->out, "%12
2e6c0 2e 31 32 73 3a 20 25 73 5c 6e 22 2c 22 73 74 61  .12s: %s\n","sta
2e6d0 74 73 22 2c 20 61 7a 42 6f 6f 6c 5b 70 2d 3e 73  ts", azBool[p->s
2e6e0 74 61 74 73 4f 6e 21 3d 30 5d 29 3b 0a 20 20 20  tatsOn!=0]);.   
2e6f0 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
2e700 6f 75 74 2c 20 22 25 31 32 2e 31 32 73 3a 20 22  out, "%12.12s: "
2e710 2c 20 22 77 69 64 74 68 22 29 3b 0a 20 20 20 20  , "width");.    
2e720 66 6f 72 20 28 69 3d 30 3b 69 3c 28 69 6e 74 29  for (i=0;i<(int)
2e730 41 72 72 61 79 53 69 7a 65 28 70 2d 3e 63 6f 6c  ArraySize(p->col
2e740 57 69 64 74 68 29 20 26 26 20 70 2d 3e 63 6f 6c  Width) && p->col
2e750 57 69 64 74 68 5b 69 5d 20 21 3d 20 30 3b 69 2b  Width[i] != 0;i+
2e760 2b 29 20 7b 0a 20 20 20 20 20 20 72 61 77 5f 70  +) {.      raw_p
2e770 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 25  rintf(p->out, "%
2e780 64 20 22 2c 20 70 2d 3e 63 6f 6c 57 69 64 74 68  d ", p->colWidth
2e790 5b 69 5d 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  [i]);.    }.    
2e7a0 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75  raw_printf(p->ou
2e7b0 74 2c 20 22 5c 6e 22 29 3b 0a 20 20 20 20 75 74  t, "\n");.    ut
2e7c0 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74  f8_printf(p->out
2e7d0 2c 20 22 25 31 32 2e 31 32 73 3a 20 25 73 5c 6e  , "%12.12s: %s\n
2e7e0 22 2c 20 22 66 69 6c 65 6e 61 6d 65 22 2c 0a 20  ", "filename",. 
2e7f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
2e800 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3f 20  ->zDbFilename ? 
2e810 70 2d 3e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3a  p->zDbFilename :
2e820 20 22 22 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20   "");.  }else.. 
2e830 20 69 66 28 20 63 3d 3d 27 73 27 20 26 26 20 73   if( c=='s' && s
2e840 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c  trncmp(azArg[0],
2e850 20 22 73 74 61 74 73 22 2c 20 6e 29 3d 3d 30 20   "stats", n)==0 
2e860 29 7b 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3d  ){.    if( nArg=
2e870 3d 32 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 73  =2 ){.      p->s
2e880 74 61 74 73 4f 6e 20 3d 20 62 6f 6f 6c 65 61 6e  tatsOn = boolean
2e890 56 61 6c 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b  Value(azArg[1]);
2e8a0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e  .    }else if( n
2e8b0 41 72 67 3d 3d 31 20 29 7b 0a 20 20 20 20 20 20  Arg==1 ){.      
2e8c0 64 69 73 70 6c 61 79 5f 73 74 61 74 73 28 70 2d  display_stats(p-
2e8d0 3e 64 62 2c 20 70 2c 20 30 29 3b 0a 20 20 20 20  >db, p, 0);.    
2e8e0 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 61 77  }else{.      raw
2e8f0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
2e900 22 55 73 61 67 65 3a 20 2e 73 74 61 74 73 20 3f  "Usage: .stats ?
2e910 6f 6e 7c 6f 66 66 3f 5c 6e 22 29 3b 0a 20 20 20  on|off?\n");.   
2e920 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 7d     rc = 1;.    }
2e930 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69 66 28 20  .  }else..  if( 
2e940 28 63 3d 3d 27 74 27 20 26 26 20 6e 3e 31 20 26  (c=='t' && n>1 &
2e950 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2e960 30 5d 2c 20 22 74 61 62 6c 65 73 22 2c 20 6e 29  0], "tables", n)
2e970 3d 3d 30 29 0a 20 20 20 7c 7c 20 28 63 3d 3d 27  ==0).   || (c=='
2e980 69 27 20 26 26 20 28 73 74 72 6e 63 6d 70 28 61  i' && (strncmp(a
2e990 7a 41 72 67 5b 30 5d 2c 20 22 69 6e 64 69 63 65  zArg[0], "indice
2e9a0 73 22 2c 20 6e 29 3d 3d 30 0a 20 20 20 20 20 20  s", n)==0.      
2e9b0 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 74             || st
2e9c0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
2e9d0 22 69 6e 64 65 78 65 73 22 2c 20 6e 29 3d 3d 30  "indexes", n)==0
2e9e0 29 20 29 0a 20 20 29 7b 0a 20 20 20 20 73 71 6c  ) ).  ){.    sql
2e9f0 69 74 65 33 5f 73 74 6d 74 20 2a 70 53 74 6d 74  ite3_stmt *pStmt
2ea00 3b 0a 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 52  ;.    char **azR
2ea10 65 73 75 6c 74 3b 0a 20 20 20 20 69 6e 74 20 6e  esult;.    int n
2ea20 52 6f 77 2c 20 6e 41 6c 6c 6f 63 3b 0a 20 20 20  Row, nAlloc;.   
2ea30 20 69 6e 74 20 69 69 3b 0a 20 20 20 20 53 68 65   int ii;.    She
2ea40 6c 6c 54 65 78 74 20 73 3b 0a 20 20 20 20 69 6e  llText s;.    in
2ea50 69 74 54 65 78 74 28 26 73 29 3b 0a 20 20 20 20  itText(&s);.    
2ea60 6f 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20  open_db(p, 0);. 
2ea70 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
2ea80 70 72 65 70 61 72 65 5f 76 32 28 70 2d 3e 64 62  prepare_v2(p->db
2ea90 2c 20 22 50 52 41 47 4d 41 20 64 61 74 61 62 61  , "PRAGMA databa
2eaa0 73 65 5f 6c 69 73 74 22 2c 20 2d 31 2c 20 26 70  se_list", -1, &p
2eab0 53 74 6d 74 2c 20 30 29 3b 0a 20 20 20 20 69 66  Stmt, 0);.    if
2eac0 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 73 68  ( rc ) return sh
2ead0 65 6c 6c 44 61 74 61 62 61 73 65 45 72 72 6f 72  ellDatabaseError
2eae0 28 70 2d 3e 64 62 29 3b 0a 0a 20 20 20 20 69 66  (p->db);..    if
2eaf0 28 20 6e 41 72 67 3e 32 20 26 26 20 63 3d 3d 27  ( nArg>2 && c=='
2eb00 69 27 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 49  i' ){.      /* I
2eb10 74 20 69 73 20 61 6e 20 68 69 73 74 6f 72 69 63  t is an historic
2eb20 61 6c 20 61 63 63 69 64 65 6e 74 20 74 68 61 74  al accident that
2eb30 20 74 68 65 20 2e 69 6e 64 65 78 65 73 20 63 6f   the .indexes co
2eb40 6d 6d 61 6e 64 20 73 68 6f 77 73 20 61 6e 20 65  mmand shows an e
2eb50 72 72 6f 72 0a 20 20 20 20 20 20 2a 2a 20 77 68  rror.      ** wh
2eb60 65 6e 20 63 61 6c 6c 65 64 20 77 69 74 68 20 74  en called with t
2eb70 68 65 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20  he wrong number 
2eb80 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 77 68 65  of arguments whe
2eb90 72 65 61 73 20 74 68 65 20 2e 74 61 62 6c 65 73  reas the .tables
2eba0 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6d 6d 61 6e  .      ** comman
2ebb0 64 20 64 6f 65 73 20 6e 6f 74 2e 20 2a 2f 0a 20  d does not. */. 
2ebc0 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2ebd0 73 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20  stderr, "Usage: 
2ebe0 2e 69 6e 64 65 78 65 73 20 3f 4c 49 4b 45 2d 50  .indexes ?LIKE-P
2ebf0 41 54 54 45 52 4e 3f 5c 6e 22 29 3b 0a 20 20 20  ATTERN?\n");.   
2ec00 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20 20     rc = 1;.     
2ec10 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61   goto meta_comma
2ec20 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a 20  nd_exit;.    }. 
2ec30 20 20 20 66 6f 72 28 69 69 3d 30 3b 20 73 71 6c     for(ii=0; sql
2ec40 69 74 65 33 5f 73 74 65 70 28 70 53 74 6d 74 29  ite3_step(pStmt)
2ec50 3d 3d 53 51 4c 49 54 45 5f 52 4f 57 3b 20 69 69  ==SQLITE_ROW; ii
2ec60 2b 2b 29 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ++){.      const
2ec70 20 63 68 61 72 20 2a 7a 44 62 4e 61 6d 65 20 3d   char *zDbName =
2ec80 20 28 63 6f 6e 73 74 20 63 68 61 72 2a 29 73 71   (const char*)sq
2ec90 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e 5f 74 65 78  lite3_column_tex
2eca0 74 28 70 53 74 6d 74 2c 20 31 29 3b 0a 20 20 20  t(pStmt, 1);.   
2ecb0 20 20 20 69 66 28 20 7a 44 62 4e 61 6d 65 3d 3d     if( zDbName==
2ecc0 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
2ecd0 20 20 20 20 69 66 28 20 73 2e 7a 20 26 26 20 73      if( s.z && s
2ece0 2e 7a 5b 30 5d 20 29 20 61 70 70 65 6e 64 54 65  .z[0] ) appendTe
2ecf0 78 74 28 26 73 2c 20 22 20 55 4e 49 4f 4e 20 41  xt(&s, " UNION A
2ed00 4c 4c 20 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  LL ", 0);.      
2ed10 69 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 69  if( sqlite3_stri
2ed20 63 6d 70 28 7a 44 62 4e 61 6d 65 2c 20 22 6d 61  cmp(zDbName, "ma
2ed30 69 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  in")==0 ){.     
2ed40 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
2ed50 2c 20 22 53 45 4c 45 43 54 20 6e 61 6d 65 20 46  , "SELECT name F
2ed60 52 4f 4d 20 22 2c 20 30 29 3b 0a 20 20 20 20 20  ROM ", 0);.     
2ed70 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
2ed80 61 70 70 65 6e 64 54 65 78 74 28 26 73 2c 20 22  appendText(&s, "
2ed90 53 45 4c 45 43 54 20 22 2c 20 30 29 3b 0a 20 20  SELECT ", 0);.  
2eda0 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78 74        appendText
2edb0 28 26 73 2c 20 7a 44 62 4e 61 6d 65 2c 20 27 5c  (&s, zDbName, '\
2edc0 27 27 29 3b 0a 20 20 20 20 20 20 20 20 61 70 70  '');.        app
2edd0 65 6e 64 54 65 78 74 28 26 73 2c 20 22 7c 7c 27  endText(&s, "||'
2ede0 2e 27 7c 7c 6e 61 6d 65 20 46 52 4f 4d 20 22 2c  .'||name FROM ",
2edf0 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
2ee00 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26 73     appendText(&s
2ee10 2c 20 7a 44 62 4e 61 6d 65 2c 20 27 22 27 29 3b  , zDbName, '"');
2ee20 0a 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78  .      appendTex
2ee30 74 28 26 73 2c 20 22 2e 73 71 6c 69 74 65 5f 6d  t(&s, ".sqlite_m
2ee40 61 73 74 65 72 20 22 2c 20 30 29 3b 0a 20 20 20  aster ", 0);.   
2ee50 20 20 20 69 66 28 20 63 3d 3d 27 74 27 20 29 7b     if( c=='t' ){
2ee60 0a 20 20 20 20 20 20 20 20 61 70 70 65 6e 64 54  .        appendT
2ee70 65 78 74 28 26 73 2c 22 20 57 48 45 52 45 20 74  ext(&s," WHERE t
2ee80 79 70 65 20 49 4e 20 28 27 74 61 62 6c 65 27 2c  ype IN ('table',
2ee90 27 76 69 65 77 27 29 22 0a 20 20 20 20 20 20 20  'view')".       
2eea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
2eeb0 20 20 20 41 4e 44 20 6e 61 6d 65 20 4e 4f 54 20     AND name NOT 
2eec0 4c 49 4b 45 20 27 73 71 6c 69 74 65 5f 25 27 22  LIKE 'sqlite_%'"
2eed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2eee0 20 20 20 20 20 20 20 22 20 20 20 41 4e 44 20 6e         "   AND n
2eef0 61 6d 65 20 4c 49 4b 45 20 3f 31 22 2c 20 30 29  ame LIKE ?1", 0)
2ef00 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
2ef10 20 20 20 20 20 20 20 61 70 70 65 6e 64 54 65 78         appendTex
2ef20 74 28 26 73 2c 22 20 57 48 45 52 45 20 74 79 70  t(&s," WHERE typ
2ef30 65 3d 27 69 6e 64 65 78 27 22 0a 20 20 20 20 20  e='index'".     
2ef40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ef50 20 22 20 20 20 41 4e 44 20 74 62 6c 5f 6e 61 6d   "   AND tbl_nam
2ef60 65 20 4c 49 4b 45 20 3f 31 22 2c 20 30 29 3b 0a  e LIKE ?1", 0);.
2ef70 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
2ef80 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 66    rc = sqlite3_f
2ef90 69 6e 61 6c 69 7a 65 28 70 53 74 6d 74 29 3b 0a  inalize(pStmt);.
2efa0 20 20 20 20 61 70 70 65 6e 64 54 65 78 74 28 26      appendText(&
2efb0 73 2c 20 22 20 4f 52 44 45 52 20 42 59 20 31 22  s, " ORDER BY 1"
2efc0 2c 20 30 29 3b 0a 20 20 20 20 72 63 20 3d 20 73  , 0);.    rc = s
2efd0 71 6c 69 74 65 33 5f 70 72 65 70 61 72 65 5f 76  qlite3_prepare_v
2efe0 32 28 70 2d 3e 64 62 2c 20 73 2e 7a 2c 20 2d 31  2(p->db, s.z, -1
2eff0 2c 20 26 70 53 74 6d 74 2c 20 30 29 3b 0a 20 20  , &pStmt, 0);.  
2f000 20 20 66 72 65 65 54 65 78 74 28 26 73 29 3b 0a    freeText(&s);.
2f010 20 20 20 20 69 66 28 20 72 63 20 29 20 72 65 74      if( rc ) ret
2f020 75 72 6e 20 73 68 65 6c 6c 44 61 74 61 62 61 73  urn shellDatabas
2f030 65 45 72 72 6f 72 28 70 2d 3e 64 62 29 3b 0a 0a  eError(p->db);..
2f040 20 20 20 20 2f 2a 20 52 75 6e 20 74 68 65 20 53      /* Run the S
2f050 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 70 72 65  QL statement pre
2f060 70 61 72 65 64 20 62 79 20 74 68 65 20 61 62 6f  pared by the abo
2f070 76 65 20 62 6c 6f 63 6b 2e 20 53 74 6f 72 65 20  ve block. Store 
2f080 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20  the results.    
2f090 2a 2a 20 61 73 20 61 6e 20 61 72 72 61 79 20 6f  ** as an array o
2f0a0 66 20 6e 75 6c 2d 74 65 72 6d 69 6e 61 74 65 64  f nul-terminated
2f0b0 20 73 74 72 69 6e 67 73 20 69 6e 20 61 7a 52 65   strings in azRe
2f0c0 73 75 6c 74 5b 5d 2e 20 20 2a 2f 0a 20 20 20 20  sult[].  */.    
2f0d0 6e 52 6f 77 20 3d 20 6e 41 6c 6c 6f 63 20 3d 20  nRow = nAlloc = 
2f0e0 30 3b 0a 20 20 20 20 61 7a 52 65 73 75 6c 74 20  0;.    azResult 
2f0f0 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 6e 41 72  = 0;.    if( nAr
2f100 67 3e 31 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  g>1 ){.      sql
2f110 69 74 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70  ite3_bind_text(p
2f120 53 74 6d 74 2c 20 31 2c 20 61 7a 41 72 67 5b 31  Stmt, 1, azArg[1
2f130 5d 2c 20 2d 31 2c 20 53 51 4c 49 54 45 5f 54 52  ], -1, SQLITE_TR
2f140 41 4e 53 49 45 4e 54 29 3b 0a 20 20 20 20 7d 65  ANSIENT);.    }e
2f150 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
2f160 65 33 5f 62 69 6e 64 5f 74 65 78 74 28 70 53 74  e3_bind_text(pSt
2f170 6d 74 2c 20 31 2c 20 22 25 22 2c 20 2d 31 2c 20  mt, 1, "%", -1, 
2f180 53 51 4c 49 54 45 5f 53 54 41 54 49 43 29 3b 0a  SQLITE_STATIC);.
2f190 20 20 20 20 7d 0a 20 20 20 20 77 68 69 6c 65 28      }.    while(
2f1a0 20 73 71 6c 69 74 65 33 5f 73 74 65 70 28 70 53   sqlite3_step(pS
2f1b0 74 6d 74 29 3d 3d 53 51 4c 49 54 45 5f 52 4f 57  tmt)==SQLITE_ROW
2f1c0 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 52   ){.      if( nR
2f1d0 6f 77 3e 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  ow>=nAlloc ){.  
2f1e0 20 20 20 20 20 20 63 68 61 72 20 2a 2a 61 7a 4e        char **azN
2f1f0 65 77 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ew;.        int 
2f200 6e 32 20 3d 20 6e 41 6c 6c 6f 63 2a 32 20 2b 20  n2 = nAlloc*2 + 
2f210 31 30 3b 0a 20 20 20 20 20 20 20 20 61 7a 4e 65  10;.        azNe
2f220 77 20 3d 20 73 71 6c 69 74 65 33 5f 72 65 61 6c  w = sqlite3_real
2f230 6c 6f 63 36 34 28 61 7a 52 65 73 75 6c 74 2c 20  loc64(azResult, 
2f240 73 69 7a 65 6f 66 28 61 7a 52 65 73 75 6c 74 5b  sizeof(azResult[
2f250 30 5d 29 2a 6e 32 29 3b 0a 20 20 20 20 20 20 20  0])*n2);.       
2f260 20 69 66 28 20 61 7a 4e 65 77 3d 3d 30 20 29 7b   if( azNew==0 ){
2f270 0a 20 20 20 20 20 20 20 20 20 20 72 63 20 3d 20  .          rc = 
2f280 73 68 65 6c 6c 4e 6f 6d 65 6d 45 72 72 6f 72 28  shellNomemError(
2f290 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
2f2a0 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
2f2b0 20 20 20 20 20 20 6e 41 6c 6c 6f 63 20 3d 20 6e        nAlloc = n
2f2c0 32 3b 0a 20 20 20 20 20 20 20 20 61 7a 52 65 73  2;.        azRes
2f2d0 75 6c 74 20 3d 20 61 7a 4e 65 77 3b 0a 20 20 20  ult = azNew;.   
2f2e0 20 20 20 7d 0a 20 20 20 20 20 20 61 7a 52 65 73     }.      azRes
2f2f0 75 6c 74 5b 6e 52 6f 77 5d 20 3d 20 73 71 6c 69  ult[nRow] = sqli
2f300 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 22  te3_mprintf("%s"
2f310 2c 20 73 71 6c 69 74 65 33 5f 63 6f 6c 75 6d 6e  , sqlite3_column
2f320 5f 74 65 78 74 28 70 53 74 6d 74 2c 20 30 29 29  _text(pStmt, 0))
2f330 3b 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 61  ;.      if( 0==a
2f340 7a 52 65 73 75 6c 74 5b 6e 52 6f 77 5d 20 29 7b  zResult[nRow] ){
2f350 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 73 68  .        rc = sh
2f360 65 6c 6c 4e 6f 6d 65 6d 45 72 72 6f 72 28 29 3b  ellNomemError();
2f370 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
2f380 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e 52        }.      nR
2f390 6f 77 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ow++;.    }.    
2f3a0 69 66 28 20 73 71 6c 69 74 65 33 5f 66 69 6e 61  if( sqlite3_fina
2f3b0 6c 69 7a 65 28 70 53 74 6d 74 29 21 3d 53 51 4c  lize(pStmt)!=SQL
2f3c0 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
2f3d0 72 63 20 3d 20 73 68 65 6c 6c 44 61 74 61 62 61  rc = shellDataba
2f3e0 73 65 45 72 72 6f 72 28 70 2d 3e 64 62 29 3b 0a  seError(p->db);.
2f3f0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 72      }..    /* Pr
2f400 65 74 74 79 2d 70 72 69 6e 74 20 74 68 65 20 63  etty-print the c
2f410 6f 6e 74 65 6e 74 73 20 6f 66 20 61 72 72 61 79  ontents of array
2f420 20 61 7a 52 65 73 75 6c 74 5b 5d 20 74 6f 20 74   azResult[] to t
2f430 68 65 20 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20  he output */.   
2f440 20 69 66 28 20 72 63 3d 3d 30 20 26 26 20 6e 52   if( rc==0 && nR
2f450 6f 77 3e 30 20 29 7b 0a 20 20 20 20 20 20 69 6e  ow>0 ){.      in
2f460 74 20 6c 65 6e 2c 20 6d 61 78 6c 65 6e 20 3d 20  t len, maxlen = 
2f470 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 2c 20  0;.      int i, 
2f480 6a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 50 72  j;.      int nPr
2f490 69 6e 74 43 6f 6c 2c 20 6e 50 72 69 6e 74 52 6f  intCol, nPrintRo
2f4a0 77 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  w;.      for(i=0
2f4b0 3b 20 69 3c 6e 52 6f 77 3b 20 69 2b 2b 29 7b 0a  ; i<nRow; i++){.
2f4c0 20 20 20 20 20 20 20 20 6c 65 6e 20 3d 20 73 74          len = st
2f4d0 72 6c 65 6e 33 30 28 61 7a 52 65 73 75 6c 74 5b  rlen30(azResult[
2f4e0 69 5d 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  i]);.        if(
2f4f0 20 6c 65 6e 3e 6d 61 78 6c 65 6e 20 29 20 6d 61   len>maxlen ) ma
2f500 78 6c 65 6e 20 3d 20 6c 65 6e 3b 0a 20 20 20 20  xlen = len;.    
2f510 20 20 7d 0a 20 20 20 20 20 20 6e 50 72 69 6e 74    }.      nPrint
2f520 43 6f 6c 20 3d 20 38 30 2f 28 6d 61 78 6c 65 6e  Col = 80/(maxlen
2f530 2b 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  +2);.      if( n
2f540 50 72 69 6e 74 43 6f 6c 3c 31 20 29 20 6e 50 72  PrintCol<1 ) nPr
2f550 69 6e 74 43 6f 6c 20 3d 20 31 3b 0a 20 20 20 20  intCol = 1;.    
2f560 20 20 6e 50 72 69 6e 74 52 6f 77 20 3d 20 28 6e    nPrintRow = (n
2f570 52 6f 77 20 2b 20 6e 50 72 69 6e 74 43 6f 6c 20  Row + nPrintCol 
2f580 2d 20 31 29 2f 6e 50 72 69 6e 74 43 6f 6c 3b 0a  - 1)/nPrintCol;.
2f590 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
2f5a0 3c 6e 50 72 69 6e 74 52 6f 77 3b 20 69 2b 2b 29  <nPrintRow; i++)
2f5b0 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  {.        for(j=
2f5c0 69 3b 20 6a 3c 6e 52 6f 77 3b 20 6a 2b 3d 6e 50  i; j<nRow; j+=nP
2f5d0 72 69 6e 74 52 6f 77 29 7b 0a 20 20 20 20 20 20  rintRow){.      
2f5e0 20 20 20 20 63 68 61 72 20 2a 7a 53 70 20 3d 20      char *zSp = 
2f5f0 6a 3c 6e 50 72 69 6e 74 52 6f 77 20 3f 20 22 22  j<nPrintRow ? ""
2f600 20 3a 20 22 20 20 22 3b 0a 20 20 20 20 20 20 20   : "  ";.       
2f610 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70     utf8_printf(p
2f620 2d 3e 6f 75 74 2c 20 22 25 73 25 2d 2a 73 22 2c  ->out, "%s%-*s",
2f630 20 7a 53 70 2c 20 6d 61 78 6c 65 6e 2c 0a 20 20   zSp, maxlen,.  
2f640 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f650 20 20 20 20 61 7a 52 65 73 75 6c 74 5b 6a 5d 20      azResult[j] 
2f660 3f 20 61 7a 52 65 73 75 6c 74 5b 6a 5d 3a 22 22  ? azResult[j]:""
2f670 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
2f680 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28       raw_printf(
2f690 70 2d 3e 6f 75 74 2c 20 22 5c 6e 22 29 3b 0a 20  p->out, "\n");. 
2f6a0 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
2f6b0 20 20 66 6f 72 28 69 69 3d 30 3b 20 69 69 3c 6e    for(ii=0; ii<n
2f6c0 52 6f 77 3b 20 69 69 2b 2b 29 20 73 71 6c 69 74  Row; ii++) sqlit
2f6d0 65 33 5f 66 72 65 65 28 61 7a 52 65 73 75 6c 74  e3_free(azResult
2f6e0 5b 69 69 5d 29 3b 0a 20 20 20 20 73 71 6c 69 74  [ii]);.    sqlit
2f6f0 65 33 5f 66 72 65 65 28 61 7a 52 65 73 75 6c 74  e3_free(azResult
2f700 29 3b 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 2f 2a  );.  }else..  /*
2f710 20 42 65 67 69 6e 20 72 65 64 69 72 65 63 74 69   Begin redirecti
2f720 6e 67 20 6f 75 74 70 75 74 20 74 6f 20 74 68 65  ng output to the
2f730 20 66 69 6c 65 20 22 74 65 73 74 63 61 73 65 2d   file "testcase-
2f740 6f 75 74 2e 74 78 74 22 20 2a 2f 0a 20 20 69 66  out.txt" */.  if
2f750 28 20 63 3d 3d 27 74 27 20 26 26 20 73 74 72 63  ( c=='t' && strc
2f760 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 22 74 65 73  mp(azArg[0],"tes
2f770 74 63 61 73 65 22 29 3d 3d 30 20 29 7b 0a 20 20  tcase")==0 ){.  
2f780 20 20 6f 75 74 70 75 74 5f 72 65 73 65 74 28 70    output_reset(p
2f790 29 3b 0a 20 20 20 20 70 2d 3e 6f 75 74 20 3d 20  );.    p->out = 
2f7a0 6f 75 74 70 75 74 5f 66 69 6c 65 5f 6f 70 65 6e  output_file_open
2f7b0 28 22 74 65 73 74 63 61 73 65 2d 6f 75 74 2e 74  ("testcase-out.t
2f7c0 78 74 22 29 3b 0a 20 20 20 20 69 66 28 20 70 2d  xt");.    if( p-
2f7d0 3e 6f 75 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >out==0 ){.     
2f7e0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
2f7f0 72 72 2c 20 22 45 72 72 6f 72 3a 20 63 61 6e 6e  rr, "Error: cann
2f800 6f 74 20 6f 70 65 6e 20 27 74 65 73 74 63 61 73  ot open 'testcas
2f810 65 2d 6f 75 74 2e 74 78 74 27 5c 6e 22 29 3b 0a  e-out.txt'\n");.
2f820 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 6e 41      }.    if( nA
2f830 72 67 3e 3d 32 20 29 7b 0a 20 20 20 20 20 20 73  rg>=2 ){.      s
2f840 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
2f850 73 69 7a 65 6f 66 28 70 2d 3e 7a 54 65 73 74 63  sizeof(p->zTestc
2f860 61 73 65 29 2c 20 70 2d 3e 7a 54 65 73 74 63 61  ase), p->zTestca
2f870 73 65 2c 20 22 25 73 22 2c 20 61 7a 41 72 67 5b  se, "%s", azArg[
2f880 31 5d 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  1]);.    }else{.
2f890 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e        sqlite3_sn
2f8a0 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 70 2d  printf(sizeof(p-
2f8b0 3e 7a 54 65 73 74 63 61 73 65 29 2c 20 70 2d 3e  >zTestcase), p->
2f8c0 7a 54 65 73 74 63 61 73 65 2c 20 22 3f 22 29 3b  zTestcase, "?");
2f8d0 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a  .    }.  }else..
2f8e0 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 55  #ifndef SQLITE_U
2f8f0 4e 54 45 53 54 41 42 4c 45 0a 20 20 69 66 28 20  NTESTABLE.  if( 
2f900 63 3d 3d 27 74 27 20 26 26 20 6e 3e 3d 38 20 26  c=='t' && n>=8 &
2f910 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67 5b  & strncmp(azArg[
2f920 30 5d 2c 20 22 74 65 73 74 63 74 72 6c 22 2c 20  0], "testctrl", 
2f930 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 61  n)==0 ){.    sta
2f940 74 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74  tic const struct
2f950 20 7b 0a 20 20 20 20 20 20 20 63 6f 6e 73 74 20   {.       const 
2f960 63 68 61 72 20 2a 7a 43 74 72 6c 4e 61 6d 65 3b  char *zCtrlName;
2f970 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 61 20     /* Name of a 
2f980 74 65 73 74 2d 63 6f 6e 74 72 6f 6c 20 6f 70 74  test-control opt
2f990 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 20 69 6e  ion */.       in
2f9a0 74 20 63 74 72 6c 43 6f 64 65 3b 20 20 20 20 20  t ctrlCode;     
2f9b0 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 67 65         /* Intege
2f9c0 72 20 63 6f 64 65 20 66 6f 72 20 74 68 61 74 20  r code for that 
2f9d0 6f 70 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  option */.      
2f9e0 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 55 73   const char *zUs
2f9f0 61 67 65 3b 20 20 20 20 20 20 2f 2a 20 55 73 61  age;      /* Usa
2fa00 67 65 20 6e 6f 74 65 73 20 2a 2f 0a 20 20 20 20  ge notes */.    
2fa10 7d 20 61 43 74 72 6c 5b 5d 20 3d 20 7b 0a 20 20  } aCtrl[] = {.  
2fa20 20 20 20 20 7b 20 22 61 6c 77 61 79 73 22 2c 20      { "always", 
2fa30 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 49              SQLI
2fa40 54 45 5f 54 45 53 54 43 54 52 4c 5f 41 4c 57 41  TE_TESTCTRL_ALWA
2fa50 59 53 2c 20 20 20 20 20 20 20 20 22 42 4f 4f 4c  YS,        "BOOL
2fa60 45 41 4e 22 20 20 20 20 20 20 20 20 20 20 20 20  EAN"            
2fa70 7d 2c 0a 20 20 20 20 20 20 7b 20 22 61 73 73 65  },.      { "asse
2fa80 72 74 22 2c 20 20 20 20 20 20 20 20 20 20 20 20  rt",            
2fa90 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
2faa0 5f 41 53 53 45 52 54 2c 20 20 20 20 20 20 20 20  _ASSERT,        
2fab0 22 42 4f 4f 4c 45 41 4e 22 20 20 20 20 20 20 20  "BOOLEAN"       
2fac0 20 20 20 20 20 7d 2c 0a 20 20 20 20 2f 2a 7b 20       },.    /*{ 
2fad0 22 62 65 6e 69 67 6e 5f 6d 61 6c 6c 6f 63 5f 68  "benign_malloc_h
2fae0 6f 6f 6b 73 22 2c 53 51 4c 49 54 45 5f 54 45 53  ooks",SQLITE_TES
2faf0 54 43 54 52 4c 5f 42 45 4e 49 47 4e 5f 4d 41 4c  TCTRL_BENIGN_MAL
2fb00 4c 4f 43 5f 48 4f 4f 4b 53 2c 20 22 22 20 20 20  LOC_HOOKS, ""   
2fb10 20 20 20 20 20 20 20 7d 2c 2a 2f 0a 20 20 20 20         },*/.    
2fb20 2f 2a 7b 20 22 62 69 74 76 65 63 5f 74 65 73 74  /*{ "bitvec_test
2fb30 22 2c 20 20 20 20 20 20 20 20 53 51 4c 49 54 45  ",        SQLITE
2fb40 5f 54 45 53 54 43 54 52 4c 5f 42 49 54 56 45 43  _TESTCTRL_BITVEC
2fb50 5f 54 45 53 54 2c 20 20 20 22 22 20 20 20 20 20  _TEST,   ""     
2fb60 20 20 20 20 20 20 20 20 20 20 20 7d 2c 2a 2f 0a             },*/.
2fb70 20 20 20 20 20 20 7b 20 22 62 79 74 65 6f 72 64        { "byteord
2fb80 65 72 22 2c 20 20 20 20 20 20 20 20 20 20 53 51  er",          SQ
2fb90 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42 59  LITE_TESTCTRL_BY
2fba0 54 45 4f 52 44 45 52 2c 20 20 20 20 20 22 22 20  TEORDER,     "" 
2fbb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fbc0 20 20 7d 2c 0a 20 20 20 20 2f 2a 7b 20 22 66 61    },.    /*{ "fa
2fbd0 75 6c 74 5f 69 6e 73 74 61 6c 6c 22 2c 20 20 20  ult_install",   
2fbe0 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54     SQLITE_TESTCT
2fbf0 52 4c 5f 46 41 55 4c 54 5f 49 4e 53 54 41 4c 4c  RL_FAULT_INSTALL
2fc00 2c 20 22 22 20 20 20 20 20 20 20 20 20 20 20 20  , ""            
2fc10 20 20 20 20 7d 2c 20 2a 2f 0a 20 20 20 20 20 20      }, */.      
2fc20 7b 20 22 69 6d 70 6f 73 74 65 72 22 2c 20 20 20  { "imposter",   
2fc30 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54          SQLITE_T
2fc40 45 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52  ESTCTRL_IMPOSTER
2fc50 2c 20 20 20 22 53 43 48 45 4d 41 20 4f 4e 2f 4f  ,   "SCHEMA ON/O
2fc60 46 46 20 52 4f 4f 54 50 41 47 45 22 7d 2c 0a 23  FF ROOTPAGE"},.#
2fc70 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4e 5f 4b  ifdef SQLITE_N_K
2fc80 45 59 57 4f 52 44 0a 20 20 20 20 20 20 7b 20 22  EYWORD.      { "
2fc90 69 73 6b 65 79 77 6f 72 64 22 2c 20 20 20 20 20  iskeyword",     
2fca0 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54       SQLITE_TEST
2fcb0 43 54 52 4c 5f 49 53 4b 45 59 57 4f 52 44 2c 20  CTRL_ISKEYWORD, 
2fcc0 20 20 20 20 22 49 44 45 4e 54 49 46 49 45 52 22      "IDENTIFIER"
2fcd0 20 20 20 20 20 20 20 20 20 7d 2c 0a 23 65 6e 64           },.#end
2fce0 69 66 0a 20 20 20 20 20 20 7b 20 22 6c 6f 63 61  if.      { "loca
2fcf0 6c 74 69 6d 65 5f 66 61 75 6c 74 22 2c 20 20 20  ltime_fault",   
2fd00 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c   SQLITE_TESTCTRL
2fd10 5f 4c 4f 43 41 4c 54 49 4d 45 5f 46 41 55 4c 54  _LOCALTIME_FAULT
2fd20 2c 22 42 4f 4f 4c 45 41 4e 22 20 20 20 20 20 20  ,"BOOLEAN"      
2fd30 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20       },.      { 
2fd40 22 6e 65 76 65 72 5f 63 6f 72 72 75 70 74 22 2c  "never_corrupt",
2fd50 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54 45 53        SQLITE_TES
2fd60 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52  TCTRL_NEVER_CORR
2fd70 55 50 54 2c 20 22 42 4f 4f 4c 45 41 4e 22 20 20  UPT, "BOOLEAN"  
2fd80 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20 20 20            },.   
2fd90 20 20 20 7b 20 22 6f 70 74 69 6d 69 7a 61 74 69     { "optimizati
2fda0 6f 6e 73 22 2c 20 20 20 20 20 20 53 51 4c 49 54  ons",      SQLIT
2fdb0 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
2fdc0 49 5a 41 54 49 4f 4e 53 2c 20 22 44 49 53 41 42  IZATIONS, "DISAB
2fdd0 4c 45 2d 4d 41 53 4b 22 20 20 20 20 20 20 20 7d  LE-MASK"       }
2fde0 2c 0a 23 69 66 64 65 66 20 59 59 43 4f 56 45 52  ,.#ifdef YYCOVER
2fdf0 41 47 45 0a 20 20 20 20 20 20 7b 20 22 70 61 72  AGE.      { "par
2fe00 73 65 72 5f 63 6f 76 65 72 61 67 65 22 2c 20 20  ser_coverage",  
2fe10 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52    SQLITE_TESTCTR
2fe20 4c 5f 50 41 52 53 45 52 5f 43 4f 56 45 52 41 47  L_PARSER_COVERAG
2fe30 45 2c 20 22 22 20 20 20 20 20 20 20 20 20 20 20  E, ""           
2fe40 20 20 20 20 20 20 7d 2c 0a 23 65 6e 64 69 66 0a        },.#endif.
2fe50 20 20 20 20 20 20 7b 20 22 70 65 6e 64 69 6e 67        { "pending
2fe60 5f 62 79 74 65 22 2c 20 20 20 20 20 20 20 53 51  _byte",       SQ
2fe70 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45  LITE_TESTCTRL_PE
2fe80 4e 44 49 4e 47 5f 42 59 54 45 2c 20 20 22 4f 46  NDING_BYTE,  "OF
2fe90 46 53 45 54 20 20 22 20 20 20 20 20 20 20 20 20  FSET  "         
2fea0 20 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 70 72    },.      { "pr
2feb0 6e 67 5f 72 65 73 65 74 22 2c 20 20 20 20 20 20  ng_reset",      
2fec0 20 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54     SQLITE_TESTCT
2fed0 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54 2c 20 20  RL_PRNG_RESET,  
2fee0 20 20 22 22 20 20 20 20 20 20 20 20 20 20 20 20    ""            
2fef0 20 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20         },.      
2ff00 7b 20 22 70 72 6e 67 5f 72 65 73 74 6f 72 65 22  { "prng_restore"
2ff10 2c 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 54  ,       SQLITE_T
2ff20 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53  ESTCTRL_PRNG_RES
2ff30 54 4f 52 45 2c 20 20 22 22 20 20 20 20 20 20 20  TORE,  ""       
2ff40 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a 20              },. 
2ff50 20 20 20 20 20 7b 20 22 70 72 6e 67 5f 73 61 76       { "prng_sav
2ff60 65 22 2c 20 20 20 20 20 20 20 20 20 20 53 51 4c  e",          SQL
2ff70 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e  ITE_TESTCTRL_PRN
2ff80 47 5f 53 41 56 45 2c 20 20 20 20 20 22 22 20 20  G_SAVE,     ""  
2ff90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ffa0 20 7d 2c 0a 20 20 20 20 20 20 7b 20 22 72 65 73   },.      { "res
2ffb0 65 72 76 65 22 2c 20 20 20 20 20 20 20 20 20 20  erve",          
2ffc0 20 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52    SQLITE_TESTCTR
2ffd0 4c 5f 52 45 53 45 52 56 45 2c 20 20 20 20 20 20  L_RESERVE,      
2ffe0 20 22 42 59 54 45 53 2d 4f 46 2d 52 45 53 45 52   "BYTES-OF-RESER
2fff0 56 45 22 20 20 20 7d 2c 0a 20 20 20 20 7d 3b 0a  VE"   },.    };.
30000 20 20 20 20 69 6e 74 20 74 65 73 74 63 74 72 6c      int testctrl
30010 20 3d 20 2d 31 3b 0a 20 20 20 20 69 6e 74 20 69   = -1;.    int i
30020 43 74 72 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 69  Ctrl = -1;.    i
30030 6e 74 20 72 63 32 20 3d 20 30 3b 20 20 20 20 2f  nt rc2 = 0;    /
30040 2a 20 30 3a 20 75 73 61 67 65 2e 20 20 31 3a 20  * 0: usage.  1: 
30050 25 64 20 20 32 3a 20 25 78 20 20 33 3a 20 6e 6f  %d  2: %x  3: no
30060 2d 6f 75 74 70 75 74 20 2a 2f 0a 20 20 20 20 69  -output */.    i
30070 6e 74 20 69 73 4f 6b 20 3d 20 30 3b 0a 20 20 20  nt isOk = 0;.   
30080 20 69 6e 74 20 69 2c 20 6e 32 3b 0a 20 20 20 20   int i, n2;.    
30090 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6d 64  const char *zCmd
300a0 20 3d 20 30 3b 0a 0a 20 20 20 20 6f 70 65 6e 5f   = 0;..    open_
300b0 64 62 28 70 2c 20 30 29 3b 0a 20 20 20 20 7a 43  db(p, 0);.    zC
300c0 6d 64 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 61  md = nArg>=2 ? a
300d0 7a 41 72 67 5b 31 5d 20 3a 20 22 68 65 6c 70 22  zArg[1] : "help"
300e0 3b 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 61 72  ;..    /* The ar
300f0 67 75 6d 65 6e 74 20 63 61 6e 20 6f 70 74 69 6f  gument can optio
30100 6e 61 6c 6c 79 20 62 65 67 69 6e 20 77 69 74 68  nally begin with
30110 20 22 2d 22 20 6f 72 20 22 2d 2d 22 20 2a 2f 0a   "-" or "--" */.
30120 20 20 20 20 69 66 28 20 7a 43 6d 64 5b 30 5d 3d      if( zCmd[0]=
30130 3d 27 2d 27 20 26 26 20 7a 43 6d 64 5b 31 5d 20  ='-' && zCmd[1] 
30140 29 7b 0a 20 20 20 20 20 20 7a 43 6d 64 2b 2b 3b  ){.      zCmd++;
30150 0a 20 20 20 20 20 20 69 66 28 20 7a 43 6d 64 5b  .      if( zCmd[
30160 30 5d 3d 3d 27 2d 27 20 26 26 20 7a 43 6d 64 5b  0]=='-' && zCmd[
30170 31 5d 20 29 20 7a 43 6d 64 2b 2b 3b 0a 20 20 20  1] ) zCmd++;.   
30180 20 7d 0a 0a 20 20 20 20 2f 2a 20 2d 2d 68 65 6c   }..    /* --hel
30190 70 20 6c 69 73 74 73 20 61 6c 6c 20 74 65 73 74  p lists all test
301a0 2d 63 6f 6e 74 72 6f 6c 73 20 2a 2f 0a 20 20 20  -controls */.   
301b0 20 69 66 28 20 73 74 72 63 6d 70 28 7a 43 6d 64   if( strcmp(zCmd
301c0 2c 22 68 65 6c 70 22 29 3d 3d 30 20 29 7b 0a 20  ,"help")==0 ){. 
301d0 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66       utf8_printf
301e0 28 70 2d 3e 6f 75 74 2c 20 22 41 76 61 69 6c 61  (p->out, "Availa
301f0 62 6c 65 20 74 65 73 74 2d 63 6f 6e 74 72 6f 6c  ble test-control
30200 73 3a 5c 6e 22 29 3b 0a 20 20 20 20 20 20 66 6f  s:\n");.      fo
30210 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53 69  r(i=0; i<ArraySi
30220 7a 65 28 61 43 74 72 6c 29 3b 20 69 2b 2b 29 7b  ze(aCtrl); i++){
30230 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72  .        utf8_pr
30240 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 20 20  intf(p->out, "  
30250 2e 74 65 73 74 63 74 72 6c 20 25 73 20 25 73 5c  .testctrl %s %s\
30260 6e 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  n",.            
30270 20 20 20 20 20 20 20 20 61 43 74 72 6c 5b 69 5d          aCtrl[i]
30280 2e 7a 43 74 72 6c 4e 61 6d 65 2c 20 61 43 74 72  .zCtrlName, aCtr
30290 6c 5b 69 5d 2e 7a 55 73 61 67 65 29 3b 0a 20 20  l[i].zUsage);.  
302a0 20 20 20 20 7d 0a 20 20 20 20 20 20 72 63 20 3d      }.      rc =
302b0 20 31 3b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6d   1;.      goto m
302c0 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
302d0 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
302e0 63 6f 6e 76 65 72 74 20 74 65 73 74 63 74 72 6c  convert testctrl
302f0 20 74 65 78 74 20 6f 70 74 69 6f 6e 20 74 6f 20   text option to 
30300 76 61 6c 75 65 2e 20 61 6c 6c 6f 77 20 61 6e 79  value. allow any
30310 20 75 6e 69 71 75 65 20 70 72 65 66 69 78 0a 20   unique prefix. 
30320 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6f 70 74     ** of the opt
30330 69 6f 6e 20 6e 61 6d 65 2c 20 6f 72 20 61 20 6e  ion name, or a n
30340 75 6d 65 72 69 63 61 6c 20 76 61 6c 75 65 2e 20  umerical value. 
30350 2a 2f 0a 20 20 20 20 6e 32 20 3d 20 73 74 72 6c  */.    n2 = strl
30360 65 6e 33 30 28 7a 43 6d 64 29 3b 0a 20 20 20 20  en30(zCmd);.    
30370 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79  for(i=0; i<Array
30380 53 69 7a 65 28 61 43 74 72 6c 29 3b 20 69 2b 2b  Size(aCtrl); i++
30390 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 74 72  ){.      if( str
303a0 6e 63 6d 70 28 7a 43 6d 64 2c 20 61 43 74 72 6c  ncmp(zCmd, aCtrl
303b0 5b 69 5d 2e 7a 43 74 72 6c 4e 61 6d 65 2c 20 6e  [i].zCtrlName, n
303c0 32 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  2)==0 ){.       
303d0 20 69 66 28 20 74 65 73 74 63 74 72 6c 3c 30 20   if( testctrl<0 
303e0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74 65 73  ){.          tes
303f0 74 63 74 72 6c 20 3d 20 61 43 74 72 6c 5b 69 5d  tctrl = aCtrl[i]
30400 2e 63 74 72 6c 43 6f 64 65 3b 0a 20 20 20 20 20  .ctrlCode;.     
30410 20 20 20 20 20 69 43 74 72 6c 20 3d 20 69 3b 0a       iCtrl = i;.
30420 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
30430 20 20 20 20 20 20 20 20 20 75 74 66 38 5f 70 72           utf8_pr
30440 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 45 72  intf(stderr, "Er
30450 72 6f 72 3a 20 61 6d 62 69 67 75 6f 75 73 20 74  ror: ambiguous t
30460 65 73 74 2d 63 6f 6e 74 72 6f 6c 3a 20 5c 22 25  est-control: \"%
30470 73 5c 22 5c 6e 22 0a 20 20 20 20 20 20 20 20 20  s\"\n".         
30480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30490 20 20 20 20 20 22 55 73 65 20 5c 22 2e 74 65 73       "Use \".tes
304a0 74 63 74 72 6c 20 2d 2d 68 65 6c 70 5c 22 20 66  tctrl --help\" f
304b0 6f 72 20 68 65 6c 70 5c 6e 22 2c 20 7a 43 6d 64  or help\n", zCmd
304c0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 63 20  );.          rc 
304d0 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 67  = 1;.          g
304e0 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64  oto meta_command
304f0 5f 65 78 69 74 3b 0a 20 20 20 20 20 20 20 20 7d  _exit;.        }
30500 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
30510 20 20 20 69 66 28 20 74 65 73 74 63 74 72 6c 3c     if( testctrl<
30520 30 20 29 7b 0a 20 20 20 20 20 20 75 74 66 38 5f  0 ){.      utf8_
30530 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 45  printf(stderr,"E
30540 72 72 6f 72 3a 20 75 6e 6b 6e 6f 77 6e 20 74 65  rror: unknown te
30550 73 74 2d 63 6f 6e 74 72 6f 6c 3a 20 25 73 5c 6e  st-control: %s\n
30560 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
30570 20 20 20 20 20 20 20 20 20 20 20 22 55 73 65 20             "Use 
30580 5c 22 2e 74 65 73 74 63 74 72 6c 20 2d 2d 68 65  \".testctrl --he
30590 6c 70 5c 22 20 66 6f 72 20 68 65 6c 70 5c 6e 22  lp\" for help\n"
305a0 2c 20 7a 43 6d 64 29 3b 0a 20 20 20 20 7d 65 6c  , zCmd);.    }el
305b0 73 65 7b 0a 20 20 20 20 20 20 73 77 69 74 63 68  se{.      switch
305c0 28 74 65 73 74 63 74 72 6c 29 7b 0a 0a 20 20 20  (testctrl){..   
305d0 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 5f       /* sqlite3_
305e0 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e 74  test_control(int
305f0 2c 20 64 62 2c 20 69 6e 74 29 20 2a 2f 0a 20 20  , db, int) */.  
30600 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
30610 45 5f 54 45 53 54 43 54 52 4c 5f 4f 50 54 49 4d  E_TESTCTRL_OPTIM
30620 49 5a 41 54 49 4f 4e 53 3a 0a 20 20 20 20 20 20  IZATIONS:.      
30630 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
30640 53 54 43 54 52 4c 5f 52 45 53 45 52 56 45 3a 0a  STCTRL_RESERVE:.
30650 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 41            if( nA
30660 72 67 3d 3d 33 20 29 7b 0a 20 20 20 20 20 20 20  rg==3 ){.       
30670 20 20 20 20 20 69 6e 74 20 6f 70 74 20 3d 20 28       int opt = (
30680 69 6e 74 29 73 74 72 74 6f 6c 28 61 7a 41 72 67  int)strtol(azArg
30690 5b 32 5d 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  [2], 0, 0);.    
306a0 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71          rc2 = sq
306b0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
306c0 6f 6c 28 74 65 73 74 63 74 72 6c 2c 20 70 2d 3e  ol(testctrl, p->
306d0 64 62 2c 20 6f 70 74 29 3b 0a 20 20 20 20 20 20  db, opt);.      
306e0 20 20 20 20 20 20 69 73 4f 6b 20 3d 20 33 3b 0a        isOk = 3;.
306f0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
30700 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
30710 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
30720 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e  _test_control(in
30730 74 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 63 61  t) */.        ca
30740 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43 54  se SQLITE_TESTCT
30750 52 4c 5f 50 52 4e 47 5f 53 41 56 45 3a 0a 20 20  RL_PRNG_SAVE:.  
30760 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49 54        case SQLIT
30770 45 5f 54 45 53 54 43 54 52 4c 5f 50 52 4e 47 5f  E_TESTCTRL_PRNG_
30780 52 45 53 54 4f 52 45 3a 0a 20 20 20 20 20 20 20  RESTORE:.       
30790 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
307a0 54 43 54 52 4c 5f 50 52 4e 47 5f 52 45 53 45 54  TCTRL_PRNG_RESET
307b0 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  :.        case S
307c0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 42  QLITE_TESTCTRL_B
307d0 59 54 45 4f 52 44 45 52 3a 0a 20 20 20 20 20 20  YTEORDER:.      
307e0 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20      if( nArg==2 
307f0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ){.            r
30800 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73  c2 = sqlite3_tes
30810 74 5f 63 6f 6e 74 72 6f 6c 28 74 65 73 74 63 74  t_control(testct
30820 72 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rl);.           
30830 20 69 73 4f 6b 20 3d 20 74 65 73 74 63 74 72 6c   isOk = testctrl
30840 3d 3d 53 51 4c 49 54 45 5f 54 45 53 54 43 54 52  ==SQLITE_TESTCTR
30850 4c 5f 42 59 54 45 4f 52 44 45 52 20 3f 20 31 20  L_BYTEORDER ? 1 
30860 3a 20 33 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  : 3;.          }
30870 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
30880 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 73 71  ;..        /* sq
30890 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
308a0 6f 6c 28 69 6e 74 2c 20 75 69 6e 74 29 20 2a 2f  ol(int, uint) */
308b0 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
308c0 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 45  LITE_TESTCTRL_PE
308d0 4e 44 49 4e 47 5f 42 59 54 45 3a 0a 20 20 20 20  NDING_BYTE:.    
308e0 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d        if( nArg==
308f0 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  3 ){.           
30900 20 75 6e 73 69 67 6e 65 64 20 69 6e 74 20 6f 70   unsigned int op
30910 74 20 3d 20 28 75 6e 73 69 67 6e 65 64 20 69 6e  t = (unsigned in
30920 74 29 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61  t)integerValue(a
30930 7a 41 72 67 5b 32 5d 29 3b 0a 20 20 20 20 20 20  zArg[2]);.      
30940 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69        rc2 = sqli
30950 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
30960 28 74 65 73 74 63 74 72 6c 2c 20 6f 70 74 29 3b  (testctrl, opt);
30970 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 73 4f  .            isO
30980 6b 20 3d 20 33 3b 0a 20 20 20 20 20 20 20 20 20  k = 3;.         
30990 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72 65   }.          bre
309a0 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ak;..        /* 
309b0 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e  sqlite3_test_con
309c0 74 72 6f 6c 28 69 6e 74 2c 20 69 6e 74 29 20 2a  trol(int, int) *
309d0 2f 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  /.        case S
309e0 51 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 41  QLITE_TESTCTRL_A
309f0 53 53 45 52 54 3a 0a 20 20 20 20 20 20 20 20 63  SSERT:.        c
30a00 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53 54 43  ase SQLITE_TESTC
30a10 54 52 4c 5f 41 4c 57 41 59 53 3a 0a 20 20 20 20  TRL_ALWAYS:.    
30a20 20 20 20 20 20 20 69 66 28 20 6e 41 72 67 3d 3d        if( nArg==
30a30 33 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  3 ){.           
30a40 20 69 6e 74 20 6f 70 74 20 3d 20 62 6f 6f 6c 65   int opt = boole
30a50 61 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 32 5d  anValue(azArg[2]
30a60 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
30a70 63 32 20 3d 20 73 71 6c 69 74 65 33 5f 74 65 73  c2 = sqlite3_tes
30a80 74 5f 63 6f 6e 74 72 6f 6c 28 74 65 73 74 63 74  t_control(testct
30a90 72 6c 2c 20 6f 70 74 29 3b 0a 20 20 20 20 20 20  rl, opt);.      
30aa0 20 20 20 20 20 20 69 73 4f 6b 20 3d 20 31 3b 0a        isOk = 1;.
30ab0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
30ac0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20        break;..  
30ad0 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
30ae0 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 69 6e  _test_control(in
30af0 74 2c 20 69 6e 74 29 20 2a 2f 0a 20 20 20 20 20  t, int) */.     
30b00 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54     case SQLITE_T
30b10 45 53 54 43 54 52 4c 5f 4c 4f 43 41 4c 54 49 4d  ESTCTRL_LOCALTIM
30b20 45 5f 46 41 55 4c 54 3a 0a 20 20 20 20 20 20 20  E_FAULT:.       
30b30 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45 53   case SQLITE_TES
30b40 54 43 54 52 4c 5f 4e 45 56 45 52 5f 43 4f 52 52  TCTRL_NEVER_CORR
30b50 55 50 54 3a 0a 20 20 20 20 20 20 20 20 20 20 69  UPT:.          i
30b60 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b 0a 20 20  f( nArg==3 ){.  
30b70 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70            int op
30b80 74 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65  t = booleanValue
30b90 28 61 7a 41 72 67 5b 32 5d 29 3b 0a 20 20 20 20  (azArg[2]);.    
30ba0 20 20 20 20 20 20 20 20 72 63 32 20 3d 20 73 71          rc2 = sq
30bb0 6c 69 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72  lite3_test_contr
30bc0 6f 6c 28 74 65 73 74 63 74 72 6c 2c 20 6f 70 74  ol(testctrl, opt
30bd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
30be0 73 4f 6b 20 3d 20 33 3b 0a 20 20 20 20 20 20 20  sOk = 3;.       
30bf0 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62     }.          b
30c00 72 65 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 2f  reak;..        /
30c10 2a 20 73 71 6c 69 74 65 33 5f 74 65 73 74 5f 63  * sqlite3_test_c
30c20 6f 6e 74 72 6f 6c 28 69 6e 74 2c 20 63 68 61 72  ontrol(int, char
30c30 20 2a 29 20 2a 2f 0a 23 69 66 64 65 66 20 53 51   *) */.#ifdef SQ
30c40 4c 49 54 45 5f 4e 5f 4b 45 59 57 4f 52 44 0a 20  LITE_N_KEYWORD. 
30c50 20 20 20 20 20 20 20 63 61 73 65 20 53 51 4c 49         case SQLI
30c60 54 45 5f 54 45 53 54 43 54 52 4c 5f 49 53 4b 45  TE_TESTCTRL_ISKE
30c70 59 57 4f 52 44 3a 0a 20 20 20 20 20 20 20 20 20  YWORD:.         
30c80 20 69 66 28 20 6e 41 72 67 3d 3d 33 20 29 7b 0a   if( nArg==3 ){.
30c90 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73              cons
30ca0 74 20 63 68 61 72 20 2a 6f 70 74 20 3d 20 61 7a  t char *opt = az
30cb0 41 72 67 5b 32 5d 3b 0a 20 20 20 20 20 20 20 20  Arg[2];.        
30cc0 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69 74 65      rc2 = sqlite
30cd0 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c 28 74  3_test_control(t
30ce0 65 73 74 63 74 72 6c 2c 20 6f 70 74 29 3b 0a 20  estctrl, opt);. 
30cf0 20 20 20 20 20 20 20 20 20 20 20 69 73 4f 6b 20             isOk 
30d00 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  = 1;.          }
30d10 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
30d20 3b 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 20 20  ;.#endif..      
30d30 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f 54 45    case SQLITE_TE
30d40 53 54 43 54 52 4c 5f 49 4d 50 4f 53 54 45 52 3a  STCTRL_IMPOSTER:
30d50 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
30d60 41 72 67 3d 3d 35 20 29 7b 0a 20 20 20 20 20 20  Arg==5 ){.      
30d70 20 20 20 20 20 20 72 63 32 20 3d 20 73 71 6c 69        rc2 = sqli
30d80 74 65 33 5f 74 65 73 74 5f 63 6f 6e 74 72 6f 6c  te3_test_control
30d90 28 74 65 73 74 63 74 72 6c 2c 20 70 2d 3e 64 62  (testctrl, p->db
30da0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
30db0 20 20 20 20 20 20 20 20 20 20 20 20 61 7a 41 72              azAr
30dc0 67 5b 32 5d 2c 0a 20 20 20 20 20 20 20 20 20 20  g[2],.          
30dd0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30de0 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61 7a 41  integerValue(azA
30df0 72 67 5b 33 5d 29 2c 0a 20 20 20 20 20 20 20 20  rg[3]),.        
30e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e10 20 20 69 6e 74 65 67 65 72 56 61 6c 75 65 28 61    integerValue(a
30e20 7a 41 72 67 5b 34 5d 29 29 3b 0a 20 20 20 20 20  zArg[4]));.     
30e30 20 20 20 20 20 20 20 69 73 4f 6b 20 3d 20 33 3b         isOk = 3;
30e40 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
30e50 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 23         break;..#
30e60 69 66 64 65 66 20 59 59 43 4f 56 45 52 41 47 45  ifdef YYCOVERAGE
30e70 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
30e80 4c 49 54 45 5f 54 45 53 54 43 54 52 4c 5f 50 41  LITE_TESTCTRL_PA
30e90 52 53 45 52 5f 43 4f 56 45 52 41 47 45 3a 0a 20  RSER_COVERAGE:. 
30ea0 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 41 72           if( nAr
30eb0 67 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20  g==2 ){.        
30ec0 20 20 20 20 73 71 6c 69 74 65 33 5f 74 65 73 74      sqlite3_test
30ed0 5f 63 6f 6e 74 72 6f 6c 28 74 65 73 74 63 74 72  _control(testctr
30ee0 6c 2c 20 70 2d 3e 6f 75 74 29 3b 0a 20 20 20 20  l, p->out);.    
30ef0 20 20 20 20 20 20 20 20 69 73 4f 6b 20 3d 20 33          isOk = 3
30f00 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65  ;.          }.#e
30f10 6e 64 69 66 0a 20 20 20 20 20 20 7d 0a 20 20 20  ndif.      }.   
30f20 20 7d 0a 20 20 20 20 69 66 28 20 69 73 4f 6b 3d   }.    if( isOk=
30f30 3d 30 20 26 26 20 69 43 74 72 6c 3e 3d 30 20 29  =0 && iCtrl>=0 )
30f40 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72 69  {.      utf8_pri
30f50 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 55 73 61  ntf(p->out, "Usa
30f60 67 65 3a 20 2e 74 65 73 74 63 74 72 6c 20 25 73  ge: .testctrl %s
30f70 20 25 73 5c 6e 22 2c 20 7a 43 6d 64 2c 20 61 43   %s\n", zCmd, aC
30f80 74 72 6c 5b 69 43 74 72 6c 5d 2e 7a 55 73 61 67  trl[iCtrl].zUsag
30f90 65 29 3b 0a 20 20 20 20 20 20 72 63 20 3d 20 31  e);.      rc = 1
30fa0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
30fb0 69 73 4f 6b 3d 3d 31 20 29 7b 0a 20 20 20 20 20  isOk==1 ){.     
30fc0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
30fd0 75 74 2c 20 22 25 64 5c 6e 22 2c 20 72 63 32 29  ut, "%d\n", rc2)
30fe0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
30ff0 69 73 4f 6b 3d 3d 32 20 29 7b 0a 20 20 20 20 20  isOk==2 ){.     
31000 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
31010 75 74 2c 20 22 30 78 25 30 38 78 5c 6e 22 2c 20  ut, "0x%08x\n", 
31020 72 63 32 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  rc2);.    }.  }e
31030 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64  lse.#endif /* !d
31040 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 55 4e  efined(SQLITE_UN
31050 54 45 53 54 41 42 4c 45 29 20 2a 2f 0a 0a 20 20  TESTABLE) */..  
31060 69 66 28 20 63 3d 3d 27 74 27 20 26 26 20 6e 3e  if( c=='t' && n>
31070 34 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  4 && strncmp(azA
31080 72 67 5b 30 5d 2c 20 22 74 69 6d 65 6f 75 74 22  rg[0], "timeout"
31090 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 6f  , n)==0 ){.    o
310a0 70 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20  pen_db(p, 0);.  
310b0 20 20 73 71 6c 69 74 65 33 5f 62 75 73 79 5f 74    sqlite3_busy_t
310c0 69 6d 65 6f 75 74 28 70 2d 3e 64 62 2c 20 6e 41  imeout(p->db, nA
310d0 72 67 3e 3d 32 20 3f 20 28 69 6e 74 29 69 6e 74  rg>=2 ? (int)int
310e0 65 67 65 72 56 61 6c 75 65 28 61 7a 41 72 67 5b  egerValue(azArg[
310f0 31 5d 29 20 3a 20 30 29 3b 0a 20 20 7d 65 6c 73  1]) : 0);.  }els
31100 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 74 27 20  e..  if( c=='t' 
31110 26 26 20 6e 3e 3d 35 20 26 26 20 73 74 72 6e 63  && n>=5 && strnc
31120 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22 74 69  mp(azArg[0], "ti
31130 6d 65 72 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  mer", n)==0 ){. 
31140 20 20 20 69 66 28 20 6e 41 72 67 3d 3d 32 20 29     if( nArg==2 )
31150 7b 0a 20 20 20 20 20 20 65 6e 61 62 6c 65 54 69  {.      enableTi
31160 6d 65 72 20 3d 20 62 6f 6f 6c 65 61 6e 56 61 6c  mer = booleanVal
31170 75 65 28 61 7a 41 72 67 5b 31 5d 29 3b 0a 20 20  ue(azArg[1]);.  
31180 20 20 20 20 69 66 28 20 65 6e 61 62 6c 65 54 69      if( enableTi
31190 6d 65 72 20 26 26 20 21 48 41 53 5f 54 49 4d 45  mer && !HAS_TIME
311a0 52 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77  R ){.        raw
311b0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
311c0 22 45 72 72 6f 72 3a 20 74 69 6d 65 72 20 6e 6f  "Error: timer no
311d0 74 20 61 76 61 69 6c 61 62 6c 65 20 6f 6e 20 74  t available on t
311e0 68 69 73 20 73 79 73 74 65 6d 2e 5c 6e 22 29 3b  his system.\n");
311f0 0a 20 20 20 20 20 20 20 20 65 6e 61 62 6c 65 54  .        enableT
31200 69 6d 65 72 20 3d 20 30 3b 0a 20 20 20 20 20 20  imer = 0;.      
31210 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  }.    }else{.   
31220 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
31230 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 74  derr, "Usage: .t
31240 69 6d 65 72 20 6f 6e 7c 6f 66 66 5c 6e 22 29 3b  imer on|off\n");
31250 0a 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20  .      rc = 1;. 
31260 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
31270 69 66 28 20 63 3d 3d 27 74 27 20 26 26 20 73 74  if( c=='t' && st
31280 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
31290 22 74 72 61 63 65 22 2c 20 6e 29 3d 3d 30 20 29  "trace", n)==0 )
312a0 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c  {.    open_db(p,
312b0 20 30 29 3b 0a 20 20 20 20 69 66 28 20 6e 41 72   0);.    if( nAr
312c0 67 21 3d 32 20 29 7b 0a 20 20 20 20 20 20 72 61  g!=2 ){.      ra
312d0 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
312e0 20 22 55 73 61 67 65 3a 20 2e 74 72 61 63 65 20   "Usage: .trace 
312f0 46 49 4c 45 7c 6f 66 66 5c 6e 22 29 3b 0a 20 20  FILE|off\n");.  
31300 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
31310 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
31320 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  and_exit;.    }.
31330 20 20 20 20 6f 75 74 70 75 74 5f 66 69 6c 65 5f      output_file_
31340 63 6c 6f 73 65 28 70 2d 3e 74 72 61 63 65 4f 75  close(p->traceOu
31350 74 29 3b 0a 20 20 20 20 70 2d 3e 74 72 61 63 65  t);.    p->trace
31360 4f 75 74 20 3d 20 6f 75 74 70 75 74 5f 66 69 6c  Out = output_fil
31370 65 5f 6f 70 65 6e 28 61 7a 41 72 67 5b 31 5d 29  e_open(azArg[1])
31380 3b 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  ;.#if !defined(S
31390 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 41 43 45  QLITE_OMIT_TRACE
313a0 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51  ) && !defined(SQ
313b0 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49  LITE_OMIT_FLOATI
313c0 4e 47 5f 50 4f 49 4e 54 29 0a 20 20 20 20 69 66  NG_POINT).    if
313d0 28 20 70 2d 3e 74 72 61 63 65 4f 75 74 3d 3d 30  ( p->traceOut==0
313e0 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
313f0 33 5f 74 72 61 63 65 5f 76 32 28 70 2d 3e 64 62  3_trace_v2(p->db
31400 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
31410 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
31420 69 74 65 33 5f 74 72 61 63 65 5f 76 32 28 70 2d  ite3_trace_v2(p-
31430 3e 64 62 2c 20 53 51 4c 49 54 45 5f 54 52 41 43  >db, SQLITE_TRAC
31440 45 5f 53 54 4d 54 2c 20 73 71 6c 5f 74 72 61 63  E_STMT, sql_trac
31450 65 5f 63 61 6c 6c 62 61 63 6b 2c 70 2d 3e 74 72  e_callback,p->tr
31460 61 63 65 4f 75 74 29 3b 0a 20 20 20 20 7d 0a 23  aceOut);.    }.#
31470 65 6e 64 69 66 0a 20 20 7d 65 6c 73 65 0a 0a 23  endif.  }else..#
31480 69 66 20 53 51 4c 49 54 45 5f 55 53 45 52 5f 41  if SQLITE_USER_A
31490 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 0a 20 20  UTHENTICATION.  
314a0 69 66 28 20 63 3d 3d 27 75 27 20 26 26 20 73 74  if( c=='u' && st
314b0 72 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20  rncmp(azArg[0], 
314c0 22 75 73 65 72 22 2c 20 6e 29 3d 3d 30 20 29 7b  "user", n)==0 ){
314d0 0a 20 20 20 20 69 66 28 20 6e 41 72 67 3c 32 20  .    if( nArg<2 
314e0 29 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69  ){.      raw_pri
314f0 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55 73 61  ntf(stderr, "Usa
31500 67 65 3a 20 2e 75 73 65 72 20 53 55 42 43 4f 4d  ge: .user SUBCOM
31510 4d 41 4e 44 20 2e 2e 2e 5c 6e 22 29 3b 0a 20 20  MAND ...\n");.  
31520 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20 20      rc = 1;.    
31530 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f 6d 6d    goto meta_comm
31540 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20 7d 0a  and_exit;.    }.
31550 20 20 20 20 6f 70 65 6e 5f 64 62 28 70 2c 20 30      open_db(p, 0
31560 29 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  );.    if( strcm
31570 70 28 61 7a 41 72 67 5b 31 5d 2c 22 6c 6f 67 69  p(azArg[1],"logi
31580 6e 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  n")==0 ){.      
31590 69 66 28 20 6e 41 72 67 21 3d 34 20 29 7b 0a 20  if( nArg!=4 ){. 
315a0 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
315b0 66 28 73 74 64 65 72 72 2c 20 22 55 73 61 67 65  f(stderr, "Usage
315c0 3a 20 2e 75 73 65 72 20 6c 6f 67 69 6e 20 55 53  : .user login US
315d0 45 52 20 50 41 53 53 57 4f 52 44 5c 6e 22 29 3b  ER PASSWORD\n");
315e0 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31 3b  .        rc = 1;
315f0 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d 65  .        goto me
31600 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74 3b  ta_command_exit;
31610 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
31620 63 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65 72  c = sqlite3_user
31630 5f 61 75 74 68 65 6e 74 69 63 61 74 65 28 70 2d  _authenticate(p-
31640 3e 64 62 2c 20 61 7a 41 72 67 5b 32 5d 2c 20 61  >db, azArg[2], a
31650 7a 41 72 67 5b 33 5d 2c 0a 20 20 20 20 20 20 20  zArg[3],.       
31660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31670 20 20 20 20 20 20 20 20 20 20 20 20 20 28 69 6e               (in
31680 74 29 73 74 72 6c 65 6e 28 61 7a 41 72 67 5b 33  t)strlen(azArg[3
31690 5d 29 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ]));.      if( r
316a0 63 20 29 7b 0a 20 20 20 20 20 20 20 20 75 74 66  c ){.        utf
316b0 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  8_printf(stderr,
316c0 20 22 41 75 74 68 65 6e 74 69 63 61 74 69 6f 6e   "Authentication
316d0 20 66 61 69 6c 65 64 20 66 6f 72 20 75 73 65 72   failed for user
316e0 20 25 73 5c 6e 22 2c 20 61 7a 41 72 67 5b 32 5d   %s\n", azArg[2]
316f0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
31700 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
31710 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
31720 61 7a 41 72 67 5b 31 5d 2c 22 61 64 64 22 29 3d  azArg[1],"add")=
31730 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  =0 ){.      if( 
31740 6e 41 72 67 21 3d 35 20 29 7b 0a 20 20 20 20 20  nArg!=5 ){.     
31750 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
31760 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e 75  derr, "Usage: .u
31770 73 65 72 20 61 64 64 20 55 53 45 52 20 50 41 53  ser add USER PAS
31780 53 57 4f 52 44 20 49 53 41 44 4d 49 4e 5c 6e 22  SWORD ISADMIN\n"
31790 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
317a0 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20  1;.        goto 
317b0 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69  meta_command_exi
317c0 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  t;.      }.     
317d0 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 75 73   rc = sqlite3_us
317e0 65 72 5f 61 64 64 28 70 2d 3e 64 62 2c 20 61 7a  er_add(p->db, az
317f0 41 72 67 5b 32 5d 2c 0a 20 20 20 20 20 20 20 20  Arg[2],.        
31800 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31810 20 20 20 20 61 7a 41 72 67 5b 33 5d 2c 20 28 69      azArg[3], (i
31820 6e 74 29 73 74 72 6c 65 6e 28 61 7a 41 72 67 5b  nt)strlen(azArg[
31830 33 5d 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  3]),.           
31840 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31850 20 62 6f 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a   booleanValue(az
31860 41 72 67 5b 34 5d 29 29 3b 0a 20 20 20 20 20 20  Arg[4]));.      
31870 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20 20  if( rc ){.      
31880 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64    raw_printf(std
31890 65 72 72 2c 20 22 55 73 65 72 2d 41 64 64 20 66  err, "User-Add f
318a0 61 69 6c 65 64 3a 20 25 64 5c 6e 22 2c 20 72 63  ailed: %d\n", rc
318b0 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20  );.        rc = 
318c0 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
318d0 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
318e0 61 7a 41 72 67 5b 31 5d 2c 22 65 64 69 74 22 29  azArg[1],"edit")
318f0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69 66 28  ==0 ){.      if(
31900 20 6e 41 72 67 21 3d 35 20 29 7b 0a 20 20 20 20   nArg!=5 ){.    
31910 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
31920 74 64 65 72 72 2c 20 22 55 73 61 67 65 3a 20 2e  tderr, "Usage: .
31930 75 73 65 72 20 65 64 69 74 20 55 53 45 52 20 50  user edit USER P
31940 41 53 53 57 4f 52 44 20 49 53 41 44 4d 49 4e 5c  ASSWORD ISADMIN\
31950 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 72 63 20  n");.        rc 
31960 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 67 6f 74  = 1;.        got
31970 6f 20 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65  o meta_command_e
31980 78 69 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xit;.      }.   
31990 20 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33 5f     rc = sqlite3_
319a0 75 73 65 72 5f 63 68 61 6e 67 65 28 70 2d 3e 64  user_change(p->d
319b0 62 2c 20 61 7a 41 72 67 5b 32 5d 2c 0a 20 20 20  b, azArg[2],.   
319c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
319d0 20 20 20 20 20 20 20 20 20 20 20 61 7a 41 72 67             azArg
319e0 5b 33 5d 2c 20 28 69 6e 74 29 73 74 72 6c 65 6e  [3], (int)strlen
319f0 28 61 7a 41 72 67 5b 33 5d 29 2c 0a 20 20 20 20  (azArg[3]),.    
31a00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
31a10 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 65 61            boolea
31a20 6e 56 61 6c 75 65 28 61 7a 41 72 67 5b 34 5d 29  nValue(azArg[4])
31a30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72 63 20  );.      if( rc 
31a40 29 7b 0a 20 20 20 20 20 20 20 20 72 61 77 5f 70  ){.        raw_p
31a50 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 55  rintf(stderr, "U
31a60 73 65 72 2d 45 64 69 74 20 66 61 69 6c 65 64 3a  ser-Edit failed:
31a70 20 25 64 5c 6e 22 2c 20 72 63 29 3b 0a 20 20 20   %d\n", rc);.   
31a80 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20 20       rc = 1;.   
31a90 20 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 20 69     }.    }else i
31aa0 66 28 20 73 74 72 63 6d 70 28 61 7a 41 72 67 5b  f( strcmp(azArg[
31ab0 31 5d 2c 22 64 65 6c 65 74 65 22 29 3d 3d 30 20  1],"delete")==0 
31ac0 29 7b 0a 20 20 20 20 20 20 69 66 28 20 6e 41 72  ){.      if( nAr
31ad0 67 21 3d 33 20 29 7b 0a 20 20 20 20 20 20 20 20  g!=3 ){.        
31ae0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
31af0 72 2c 20 22 55 73 61 67 65 3a 20 2e 75 73 65 72  r, "Usage: .user
31b00 20 64 65 6c 65 74 65 20 55 53 45 52 5c 6e 22 29   delete USER\n")
31b10 3b 0a 20 20 20 20 20 20 20 20 72 63 20 3d 20 31  ;.        rc = 1
31b20 3b 0a 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6d  ;.        goto m
31b30 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f 65 78 69 74  eta_command_exit
31b40 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
31b50 72 63 20 3d 20 73 71 6c 69 74 65 33 5f 75 73 65  rc = sqlite3_use
31b60 72 5f 64 65 6c 65 74 65 28 70 2d 3e 64 62 2c 20  r_delete(p->db, 
31b70 61 7a 41 72 67 5b 32 5d 29 3b 0a 20 20 20 20 20  azArg[2]);.     
31b80 20 69 66 28 20 72 63 20 29 7b 0a 20 20 20 20 20   if( rc ){.     
31b90 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74     raw_printf(st
31ba0 64 65 72 72 2c 20 22 55 73 65 72 2d 44 65 6c 65  derr, "User-Dele
31bb0 74 65 20 66 61 69 6c 65 64 3a 20 25 64 5c 6e 22  te failed: %d\n"
31bc0 2c 20 72 63 29 3b 0a 20 20 20 20 20 20 20 20 72  , rc);.        r
31bd0 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  c = 1;.      }. 
31be0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
31bf0 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72  raw_printf(stder
31c00 72 2c 20 22 55 73 61 67 65 3a 20 2e 75 73 65 72  r, "Usage: .user
31c10 20 6c 6f 67 69 6e 7c 61 64 64 7c 65 64 69 74 7c   login|add|edit|
31c20 64 65 6c 65 74 65 20 2e 2e 2e 5c 6e 22 29 3b 0a  delete ...\n");.
31c30 20 20 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20        rc = 1;.  
31c40 20 20 20 20 67 6f 74 6f 20 6d 65 74 61 5f 63 6f      goto meta_co
31c50 6d 6d 61 6e 64 5f 65 78 69 74 3b 0a 20 20 20 20  mmand_exit;.    
31c60 7d 0a 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66  }.  }else.#endif
31c70 20 2f 2a 20 53 51 4c 49 54 45 5f 55 53 45 52 5f   /* SQLITE_USER_
31c80 41 55 54 48 45 4e 54 49 43 41 54 49 4f 4e 20 2a  AUTHENTICATION *
31c90 2f 0a 0a 20 20 69 66 28 20 63 3d 3d 27 76 27 20  /..  if( c=='v' 
31ca0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
31cb0 5b 30 5d 2c 20 22 76 65 72 73 69 6f 6e 22 2c 20  [0], "version", 
31cc0 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 75 74 66  n)==0 ){.    utf
31cd0 38 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  8_printf(p->out,
31ce0 20 22 53 51 4c 69 74 65 20 25 73 20 25 73 5c 6e   "SQLite %s %s\n
31cf0 22 20 2f 2a 65 78 74 72 61 2d 76 65 72 73 69 6f  " /*extra-versio
31d00 6e 2d 69 6e 66 6f 2a 2f 2c 0a 20 20 20 20 20 20  n-info*/,.      
31d10 20 20 73 71 6c 69 74 65 33 5f 6c 69 62 76 65 72    sqlite3_libver
31d20 73 69 6f 6e 28 29 2c 20 73 71 6c 69 74 65 33 5f  sion(), sqlite3_
31d30 73 6f 75 72 63 65 69 64 28 29 29 3b 0a 20 20 7d  sourceid());.  }
31d40 65 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27  else..  if( c=='
31d50 76 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a  v' && strncmp(az
31d60 41 72 67 5b 30 5d 2c 20 22 76 66 73 69 6e 66 6f  Arg[0], "vfsinfo
31d70 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
31d80 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e  const char *zDbN
31d90 61 6d 65 20 3d 20 6e 41 72 67 3d 3d 32 20 3f 20  ame = nArg==2 ? 
31da0 61 7a 41 72 67 5b 31 5d 20 3a 20 22 6d 61 69 6e  azArg[1] : "main
31db0 22 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ";.    sqlite3_v
31dc0 66 73 20 2a 70 56 66 73 20 3d 20 30 3b 0a 20 20  fs *pVfs = 0;.  
31dd0 20 20 69 66 28 20 70 2d 3e 64 62 20 29 7b 0a 20    if( p->db ){. 
31de0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 69 6c       sqlite3_fil
31df0 65 5f 63 6f 6e 74 72 6f 6c 28 70 2d 3e 64 62 2c  e_control(p->db,
31e00 20 7a 44 62 4e 61 6d 65 2c 20 53 51 4c 49 54 45   zDbName, SQLITE
31e10 5f 46 43 4e 54 4c 5f 56 46 53 5f 50 4f 49 4e 54  _FCNTL_VFS_POINT
31e20 45 52 2c 20 26 70 56 66 73 29 3b 0a 20 20 20 20  ER, &pVfs);.    
31e30 20 20 69 66 28 20 70 56 66 73 20 29 7b 0a 20 20    if( pVfs ){.  
31e40 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
31e50 66 28 70 2d 3e 6f 75 74 2c 20 22 76 66 73 2e 7a  f(p->out, "vfs.z
31e60 4e 61 6d 65 20 20 20 20 20 20 3d 20 5c 22 25 73  Name      = \"%s
31e70 5c 22 5c 6e 22 2c 20 70 56 66 73 2d 3e 7a 4e 61  \"\n", pVfs->zNa
31e80 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 72 61 77  me);.        raw
31e90 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20  _printf(p->out, 
31ea0 22 76 66 73 2e 69 56 65 72 73 69 6f 6e 20 20 20  "vfs.iVersion   
31eb0 3d 20 25 64 5c 6e 22 2c 20 70 56 66 73 2d 3e 69  = %d\n", pVfs->i
31ec0 56 65 72 73 69 6f 6e 29 3b 0a 20 20 20 20 20 20  Version);.      
31ed0 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e    raw_printf(p->
31ee0 6f 75 74 2c 20 22 76 66 73 2e 73 7a 4f 73 46 69  out, "vfs.szOsFi
31ef0 6c 65 20 20 20 3d 20 25 64 5c 6e 22 2c 20 70 56  le   = %d\n", pV
31f00 66 73 2d 3e 73 7a 4f 73 46 69 6c 65 29 3b 0a 20  fs->szOsFile);. 
31f10 20 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e 74         raw_print
31f20 66 28 70 2d 3e 6f 75 74 2c 20 22 76 66 73 2e 6d  f(p->out, "vfs.m
31f30 78 50 61 74 68 6e 61 6d 65 20 3d 20 25 64 5c 6e  xPathname = %d\n
31f40 22 2c 20 70 56 66 73 2d 3e 6d 78 50 61 74 68 6e  ", pVfs->mxPathn
31f50 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
31f60 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20 69    }.  }else..  i
31f70 66 28 20 63 3d 3d 27 76 27 20 26 26 20 73 74 72  f( c=='v' && str
31f80 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
31f90 76 66 73 6c 69 73 74 22 2c 20 6e 29 3d 3d 30 20  vfslist", n)==0 
31fa0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 5f 76  ){.    sqlite3_v
31fb0 66 73 20 2a 70 56 66 73 3b 0a 20 20 20 20 73 71  fs *pVfs;.    sq
31fc0 6c 69 74 65 33 5f 76 66 73 20 2a 70 43 75 72 72  lite3_vfs *pCurr
31fd0 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  ent = 0;.    if(
31fe0 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20 20 20   p->db ){.      
31ff0 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f 6e  sqlite3_file_con
32000 74 72 6f 6c 28 70 2d 3e 64 62 2c 20 22 6d 61 69  trol(p->db, "mai
32010 6e 22 2c 20 53 51 4c 49 54 45 5f 46 43 4e 54 4c  n", SQLITE_FCNTL
32020 5f 56 46 53 5f 50 4f 49 4e 54 45 52 2c 20 26 70  _VFS_POINTER, &p
32030 43 75 72 72 65 6e 74 29 3b 0a 20 20 20 20 7d 0a  Current);.    }.
32040 20 20 20 20 66 6f 72 28 70 56 66 73 3d 73 71 6c      for(pVfs=sql
32050 69 74 65 33 5f 76 66 73 5f 66 69 6e 64 28 30 29  ite3_vfs_find(0)
32060 3b 20 70 56 66 73 3b 20 70 56 66 73 3d 70 56 66  ; pVfs; pVfs=pVf
32070 73 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 20  s->pNext){.     
32080 20 75 74 66 38 5f 70 72 69 6e 74 66 28 70 2d 3e   utf8_printf(p->
32090 6f 75 74 2c 20 22 76 66 73 2e 7a 4e 61 6d 65 20  out, "vfs.zName 
320a0 20 20 20 20 20 3d 20 5c 22 25 73 5c 22 25 73 5c       = \"%s\"%s\
320b0 6e 22 2c 20 70 56 66 73 2d 3e 7a 4e 61 6d 65 2c  n", pVfs->zName,
320c0 0a 20 20 20 20 20 20 20 20 20 20 20 70 56 66 73  .           pVfs
320d0 3d 3d 70 43 75 72 72 65 6e 74 20 3f 20 22 20 20  ==pCurrent ? "  
320e0 3c 2d 2d 2d 20 43 55 52 52 45 4e 54 22 20 3a 20  <--- CURRENT" : 
320f0 22 22 29 3b 0a 20 20 20 20 20 20 72 61 77 5f 70  "");.      raw_p
32100 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c 20 22 76  rintf(p->out, "v
32110 66 73 2e 69 56 65 72 73 69 6f 6e 20 20 20 3d 20  fs.iVersion   = 
32120 25 64 5c 6e 22 2c 20 70 56 66 73 2d 3e 69 56 65  %d\n", pVfs->iVe
32130 72 73 69 6f 6e 29 3b 0a 20 20 20 20 20 20 72 61  rsion);.      ra
32140 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f 75 74 2c  w_printf(p->out,
32150 20 22 76 66 73 2e 73 7a 4f 73 46 69 6c 65 20 20   "vfs.szOsFile  
32160 20 3d 20 25 64 5c 6e 22 2c 20 70 56 66 73 2d 3e   = %d\n", pVfs->
32170 73 7a 4f 73 46 69 6c 65 29 3b 0a 20 20 20 20 20  szOsFile);.     
32180 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
32190 75 74 2c 20 22 76 66 73 2e 6d 78 50 61 74 68 6e  ut, "vfs.mxPathn
321a0 61 6d 65 20 3d 20 25 64 5c 6e 22 2c 20 70 56 66  ame = %d\n", pVf
321b0 73 2d 3e 6d 78 50 61 74 68 6e 61 6d 65 29 3b 0a  s->mxPathname);.
321c0 20 20 20 20 20 20 69 66 28 20 70 56 66 73 2d 3e        if( pVfs->
321d0 70 4e 65 78 74 20 29 7b 0a 20 20 20 20 20 20 20  pNext ){.       
321e0 20 72 61 77 5f 70 72 69 6e 74 66 28 70 2d 3e 6f   raw_printf(p->o
321f0 75 74 2c 20 22 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ut, "-----------
32200 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
32210 2d 2d 2d 2d 2d 2d 2d 2d 5c 6e 22 29 3b 0a 20 20  --------\n");.  
32220 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
32230 6c 73 65 0a 0a 20 20 69 66 28 20 63 3d 3d 27 76  lse..  if( c=='v
32240 27 20 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41  ' && strncmp(azA
32250 72 67 5b 30 5d 2c 20 22 76 66 73 6e 61 6d 65 22  rg[0], "vfsname"
32260 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 63  , n)==0 ){.    c
32270 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 4e 61  onst char *zDbNa
32280 6d 65 20 3d 20 6e 41 72 67 3d 3d 32 20 3f 20 61  me = nArg==2 ? a
32290 7a 41 72 67 5b 31 5d 20 3a 20 22 6d 61 69 6e 22  zArg[1] : "main"
322a0 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 56 66 73  ;.    char *zVfs
322b0 4e 61 6d 65 20 3d 20 30 3b 0a 20 20 20 20 69 66  Name = 0;.    if
322c0 28 20 70 2d 3e 64 62 20 29 7b 0a 20 20 20 20 20  ( p->db ){.     
322d0 20 73 71 6c 69 74 65 33 5f 66 69 6c 65 5f 63 6f   sqlite3_file_co
322e0 6e 74 72 6f 6c 28 70 2d 3e 64 62 2c 20 7a 44 62  ntrol(p->db, zDb
322f0 4e 61 6d 65 2c 20 53 51 4c 49 54 45 5f 46 43 4e  Name, SQLITE_FCN
32300 54 4c 5f 56 46 53 4e 41 4d 45 2c 20 26 7a 56 66  TL_VFSNAME, &zVf
32310 73 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 69 66  sName);.      if
32320 28 20 7a 56 66 73 4e 61 6d 65 20 29 7b 0a 20 20  ( zVfsName ){.  
32330 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
32340 66 28 70 2d 3e 6f 75 74 2c 20 22 25 73 5c 6e 22  f(p->out, "%s\n"
32350 2c 20 7a 56 66 73 4e 61 6d 65 29 3b 0a 20 20 20  , zVfsName);.   
32360 20 20 20 20 20 73 71 6c 69 74 65 33 5f 66 72 65       sqlite3_fre
32370 65 28 7a 56 66 73 4e 61 6d 65 29 3b 0a 20 20 20  e(zVfsName);.   
32380 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
32390 73 65 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  se..#if defined(
323a0 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 26 26  SQLITE_DEBUG) &&
323b0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
323c0 45 4e 41 42 4c 45 5f 57 48 45 52 45 54 52 41 43  ENABLE_WHERETRAC
323d0 45 29 0a 20 20 69 66 28 20 63 3d 3d 27 77 27 20  E).  if( c=='w' 
323e0 26 26 20 73 74 72 6e 63 6d 70 28 61 7a 41 72 67  && strncmp(azArg
323f0 5b 30 5d 2c 20 22 77 68 65 72 65 74 72 61 63 65  [0], "wheretrace
32400 22 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20  ", n)==0 ){.    
32410 73 71 6c 69 74 65 33 57 68 65 72 65 54 72 61 63  sqlite3WhereTrac
32420 65 20 3d 20 6e 41 72 67 3e 3d 32 20 3f 20 62 6f  e = nArg>=2 ? bo
32430 6f 6c 65 61 6e 56 61 6c 75 65 28 61 7a 41 72 67  oleanValue(azArg
32440 5b 31 5d 29 20 3a 20 30 78 66 66 3b 0a 20 20 7d  [1]) : 0xff;.  }
32450 65 6c 73 65 0a 23 65 6e 64 69 66 0a 0a 20 20 69  else.#endif..  i
32460 66 28 20 63 3d 3d 27 77 27 20 26 26 20 73 74 72  f( c=='w' && str
32470 6e 63 6d 70 28 61 7a 41 72 67 5b 30 5d 2c 20 22  ncmp(azArg[0], "
32480 77 69 64 74 68 22 2c 20 6e 29 3d 3d 30 20 29 7b  width", n)==0 ){
32490 0a 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20  .    int j;.    
324a0 61 73 73 65 72 74 28 20 6e 41 72 67 3c 3d 41 72  assert( nArg<=Ar
324b0 72 61 79 53 69 7a 65 28 61 7a 41 72 67 29 20 29  raySize(azArg) )
324c0 3b 0a 20 20 20 20 66 6f 72 28 6a 3d 31 3b 20 6a  ;.    for(j=1; j
324d0 3c 6e 41 72 67 20 26 26 20 6a 3c 41 72 72 61 79  <nArg && j<Array
324e0 53 69 7a 65 28 70 2d 3e 63 6f 6c 57 69 64 74 68  Size(p->colWidth
324f0 29 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 70  ); j++){.      p
32500 2d 3e 63 6f 6c 57 69 64 74 68 5b 6a 2d 31 5d 20  ->colWidth[j-1] 
32510 3d 20 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61  = (int)integerVa
32520 6c 75 65 28 61 7a 41 72 67 5b 6a 5d 29 3b 0a 20  lue(azArg[j]);. 
32530 20 20 20 7d 0a 20 20 7d 65 6c 73 65 0a 0a 20 20     }.  }else..  
32540 7b 0a 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74  {.    utf8_print
32550 66 28 73 74 64 65 72 72 2c 20 22 45 72 72 6f 72  f(stderr, "Error
32560 3a 20 75 6e 6b 6e 6f 77 6e 20 63 6f 6d 6d 61 6e  : unknown comman
32570 64 20 6f 72 20 69 6e 76 61 6c 69 64 20 61 72 67  d or invalid arg
32580 75 6d 65 6e 74 73 3a 20 22 0a 20 20 20 20 20 20  uments: ".      
32590 22 20 5c 22 25 73 5c 22 2e 20 45 6e 74 65 72 20  " \"%s\". Enter 
325a0 5c 22 2e 68 65 6c 70 5c 22 20 66 6f 72 20 68 65  \".help\" for he
325b0 6c 70 5c 6e 22 2c 20 61 7a 41 72 67 5b 30 5d 29  lp\n", azArg[0])
325c0 3b 0a 20 20 20 20 72 63 20 3d 20 31 3b 0a 20 20  ;.    rc = 1;.  
325d0 7d 0a 0a 6d 65 74 61 5f 63 6f 6d 6d 61 6e 64 5f  }..meta_command_
325e0 65 78 69 74 3a 0a 20 20 69 66 28 20 70 2d 3e 6f  exit:.  if( p->o
325f0 75 74 43 6f 75 6e 74 20 29 7b 0a 20 20 20 20 70  utCount ){.    p
32600 2d 3e 6f 75 74 43 6f 75 6e 74 2d 2d 3b 0a 20 20  ->outCount--;.  
32610 20 20 69 66 28 20 70 2d 3e 6f 75 74 43 6f 75 6e    if( p->outCoun
32620 74 3d 3d 30 20 29 20 6f 75 74 70 75 74 5f 72 65  t==0 ) output_re
32630 73 65 74 28 70 29 3b 0a 20 20 7d 0a 20 20 72 65  set(p);.  }.  re
32640 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
32650 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
32660 20 61 20 73 65 6d 69 63 6f 6c 6f 6e 20 6f 63 63   a semicolon occ
32670 75 72 73 20 61 6e 79 77 68 65 72 65 20 69 6e 20  urs anywhere in 
32680 74 68 65 20 66 69 72 73 74 20 4e 20 63 68 61 72  the first N char
32690 61 63 74 65 72 73 0a 2a 2a 20 6f 66 20 73 74 72  acters.** of str
326a0 69 6e 67 20 7a 5b 5d 2e 0a 2a 2f 0a 73 74 61 74  ing z[]..*/.stat
326b0 69 63 20 69 6e 74 20 6c 69 6e 65 5f 63 6f 6e 74  ic int line_cont
326c0 61 69 6e 73 5f 73 65 6d 69 63 6f 6c 6f 6e 28 63  ains_semicolon(c
326d0 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
326e0 74 20 4e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  t N){.  int i;. 
326f0 20 66 6f 72 28 69 3d 30 3b 20 69 3c 4e 3b 20 69   for(i=0; i<N; i
32700 2b 2b 29 7b 20 20 69 66 28 20 7a 5b 69 5d 3d 3d  ++){  if( z[i]==
32710 27 3b 27 20 29 20 72 65 74 75 72 6e 20 31 3b 20  ';' ) return 1; 
32720 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
32730 0a 2f 2a 0a 2a 2a 20 54 65 73 74 20 74 6f 20 73  ./*.** Test to s
32740 65 65 20 69 66 20 61 20 6c 69 6e 65 20 63 6f 6e  ee if a line con
32750 73 69 73 74 73 20 65 6e 74 69 72 65 6c 79 20 6f  sists entirely o
32760 66 20 77 68 69 74 65 73 70 61 63 65 2e 0a 2a 2f  f whitespace..*/
32770 0a 73 74 61 74 69 63 20 69 6e 74 20 5f 61 6c 6c  .static int _all
32780 5f 77 68 69 74 65 73 70 61 63 65 28 63 6f 6e 73  _whitespace(cons
32790 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 66 6f  t char *z){.  fo
327a0 72 28 3b 20 2a 7a 3b 20 7a 2b 2b 29 7b 0a 20 20  r(; *z; z++){.  
327b0 20 20 69 66 28 20 49 73 53 70 61 63 65 28 7a 5b    if( IsSpace(z[
327c0 30 5d 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  0]) ) continue;.
327d0 20 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2f 27 20      if( *z=='/' 
327e0 26 26 20 7a 5b 31 5d 3d 3d 27 2a 27 20 29 7b 0a  && z[1]=='*' ){.
327f0 20 20 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20        z += 2;.  
32800 20 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26      while( *z &&
32810 20 28 2a 7a 21 3d 27 2a 27 20 7c 7c 20 7a 5b 31   (*z!='*' || z[1
32820 5d 21 3d 27 2f 27 29 20 29 7b 20 7a 2b 2b 3b 20  ]!='/') ){ z++; 
32830 7d 0a 20 20 20 20 20 20 69 66 28 20 2a 7a 3d 3d  }.      if( *z==
32840 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
32850 20 20 20 20 7a 2b 2b 3b 0a 20 20 20 20 20 20 63      z++;.      c
32860 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 20  ontinue;.    }. 
32870 20 20 20 69 66 28 20 2a 7a 3d 3d 27 2d 27 20 26     if( *z=='-' &
32880 26 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 7b 0a 20  & z[1]=='-' ){. 
32890 20 20 20 20 20 7a 20 2b 3d 20 32 3b 0a 20 20 20       z += 2;.   
328a0 20 20 20 77 68 69 6c 65 28 20 2a 7a 20 26 26 20     while( *z && 
328b0 2a 7a 21 3d 27 5c 6e 27 20 29 7b 20 7a 2b 2b 3b  *z!='\n' ){ z++;
328c0 20 7d 0a 20 20 20 20 20 20 69 66 28 20 2a 7a 3d   }.      if( *z=
328d0 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
328e0 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
328f0 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
32900 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
32910 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  1;.}../*.** Retu
32920 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6c  rn TRUE if the l
32930 69 6e 65 20 74 79 70 65 64 20 69 6e 20 69 73 20  ine typed in is 
32940 61 6e 20 53 51 4c 20 63 6f 6d 6d 61 6e 64 20 74  an SQL command t
32950 65 72 6d 69 6e 61 74 6f 72 20 6f 74 68 65 72 0a  erminator other.
32960 2a 2a 20 74 68 61 6e 20 61 20 73 65 6d 69 2d 63  ** than a semi-c
32970 6f 6c 6f 6e 2e 20 20 54 68 65 20 53 51 4c 20 53  olon.  The SQL S
32980 65 72 76 65 72 20 73 74 79 6c 65 20 22 67 6f 22  erver style "go"
32990 20 63 6f 6d 6d 61 6e 64 20 69 73 20 75 6e 64 65   command is unde
329a0 72 73 74 6f 6f 64 0a 2a 2a 20 61 73 20 69 73 20  rstood.** as is 
329b0 74 68 65 20 4f 72 61 63 6c 65 20 22 2f 22 2e 0a  the Oracle "/"..
329c0 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 69  */.static int li
329d0 6e 65 5f 69 73 5f 63 6f 6d 6d 61 6e 64 5f 74 65  ne_is_command_te
329e0 72 6d 69 6e 61 74 6f 72 28 63 6f 6e 73 74 20 63  rminator(const c
329f0 68 61 72 20 2a 7a 4c 69 6e 65 29 7b 0a 20 20 77  har *zLine){.  w
32a00 68 69 6c 65 28 20 49 73 53 70 61 63 65 28 7a 4c  hile( IsSpace(zL
32a10 69 6e 65 5b 30 5d 29 20 29 7b 20 7a 4c 69 6e 65  ine[0]) ){ zLine
32a20 2b 2b 3b 20 7d 3b 0a 20 20 69 66 28 20 7a 4c 69  ++; };.  if( zLi
32a30 6e 65 5b 30 5d 3d 3d 27 2f 27 20 26 26 20 5f 61  ne[0]=='/' && _a
32a40 6c 6c 5f 77 68 69 74 65 73 70 61 63 65 28 26 7a  ll_whitespace(&z
32a50 4c 69 6e 65 5b 31 5d 29 20 29 7b 0a 20 20 20 20  Line[1]) ){.    
32a60 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 4f 72  return 1;  /* Or
32a70 61 63 6c 65 20 2a 2f 0a 20 20 7d 0a 20 20 69 66  acle */.  }.  if
32a80 28 20 54 6f 4c 6f 77 65 72 28 7a 4c 69 6e 65 5b  ( ToLower(zLine[
32a90 30 5d 29 3d 3d 27 67 27 20 26 26 20 54 6f 4c 6f  0])=='g' && ToLo
32aa0 77 65 72 28 7a 4c 69 6e 65 5b 31 5d 29 3d 3d 27  wer(zLine[1])=='
32ab0 6f 27 0a 20 20 20 20 20 20 20 20 20 26 26 20 5f  o'.         && _
32ac0 61 6c 6c 5f 77 68 69 74 65 73 70 61 63 65 28 26  all_whitespace(&
32ad0 7a 4c 69 6e 65 5b 32 5d 29 20 29 7b 0a 20 20 20  zLine[2]) ){.   
32ae0 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 53   return 1;  /* S
32af0 51 4c 20 53 65 72 76 65 72 20 2a 2f 0a 20 20 7d  QL Server */.  }
32b00 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
32b10 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75  /*.** Return tru
32b20 65 20 69 66 20 7a 53 71 6c 20 69 73 20 61 20 63  e if zSql is a c
32b30 6f 6d 70 6c 65 74 65 20 53 51 4c 20 73 74 61 74  omplete SQL stat
32b40 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 66  ement.  Return f
32b50 61 6c 73 65 20 69 66 20 69 74 0a 2a 2a 20 65 6e  alse if it.** en
32b60 64 73 20 69 6e 20 74 68 65 20 6d 69 64 64 6c 65  ds in the middle
32b70 20 6f 66 20 61 20 73 74 72 69 6e 67 20 6c 69 74   of a string lit
32b80 65 72 61 6c 20 6f 72 20 43 2d 73 74 79 6c 65 20  eral or C-style 
32b90 63 6f 6d 6d 65 6e 74 2e 0a 2a 2f 0a 73 74 61 74  comment..*/.stat
32ba0 69 63 20 69 6e 74 20 6c 69 6e 65 5f 69 73 5f 63  ic int line_is_c
32bb0 6f 6d 70 6c 65 74 65 28 63 68 61 72 20 2a 7a 53  omplete(char *zS
32bc0 71 6c 2c 20 69 6e 74 20 6e 53 71 6c 29 7b 0a 20  ql, int nSql){. 
32bd0 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 7a   int rc;.  if( z
32be0 53 71 6c 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  Sql==0 ) return 
32bf0 31 3b 0a 20 20 7a 53 71 6c 5b 6e 53 71 6c 5d 20  1;.  zSql[nSql] 
32c00 3d 20 27 3b 27 3b 0a 20 20 7a 53 71 6c 5b 6e 53  = ';';.  zSql[nS
32c10 71 6c 2b 31 5d 20 3d 20 30 3b 0a 20 20 72 63 20  ql+1] = 0;.  rc 
32c20 3d 20 73 71 6c 69 74 65 33 5f 63 6f 6d 70 6c 65  = sqlite3_comple
32c30 74 65 28 7a 53 71 6c 29 3b 0a 20 20 7a 53 71 6c  te(zSql);.  zSql
32c40 5b 6e 53 71 6c 5d 20 3d 20 30 3b 0a 20 20 72 65  [nSql] = 0;.  re
32c50 74 75 72 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a  turn rc;.}../*.*
32c60 2a 20 52 75 6e 20 61 20 73 69 6e 67 6c 65 20 6c  * Run a single l
32c70 69 6e 65 20 6f 66 20 53 51 4c 0a 2a 2f 0a 73 74  ine of SQL.*/.st
32c80 61 74 69 63 20 69 6e 74 20 72 75 6e 4f 6e 65 53  atic int runOneS
32c90 71 6c 4c 69 6e 65 28 53 68 65 6c 6c 53 74 61 74  qlLine(ShellStat
32ca0 65 20 2a 70 2c 20 63 68 61 72 20 2a 7a 53 71 6c  e *p, char *zSql
32cb0 2c 20 46 49 4c 45 20 2a 69 6e 2c 20 69 6e 74 20  , FILE *in, int 
32cc0 73 74 61 72 74 6c 69 6e 65 29 7b 0a 20 20 69 6e  startline){.  in
32cd0 74 20 72 63 3b 0a 20 20 63 68 61 72 20 2a 7a 45  t rc;.  char *zE
32ce0 72 72 4d 73 67 20 3d 20 30 3b 0a 0a 20 20 6f 70  rrMsg = 0;..  op
32cf0 65 6e 5f 64 62 28 70 2c 20 30 29 3b 0a 20 20 69  en_db(p, 0);.  i
32d00 66 28 20 53 68 65 6c 6c 48 61 73 46 6c 61 67 28  f( ShellHasFlag(
32d10 70 2c 53 48 46 4c 47 5f 42 61 63 6b 73 6c 61 73  p,SHFLG_Backslas
32d20 68 29 20 29 20 72 65 73 6f 6c 76 65 5f 62 61 63  h) ) resolve_bac
32d30 6b 73 6c 61 73 68 65 73 28 7a 53 71 6c 29 3b 0a  kslashes(zSql);.
32d40 20 20 42 45 47 49 4e 5f 54 49 4d 45 52 3b 0a 20    BEGIN_TIMER;. 
32d50 20 72 63 20 3d 20 73 68 65 6c 6c 5f 65 78 65 63   rc = shell_exec
32d60 28 70 2d 3e 64 62 2c 20 7a 53 71 6c 2c 20 73 68  (p->db, zSql, sh
32d70 65 6c 6c 5f 63 61 6c 6c 62 61 63 6b 2c 20 70 2c  ell_callback, p,
32d80 20 26 7a 45 72 72 4d 73 67 29 3b 0a 20 20 45 4e   &zErrMsg);.  EN
32d90 44 5f 54 49 4d 45 52 3b 0a 20 20 69 66 28 20 72  D_TIMER;.  if( r
32da0 63 20 7c 7c 20 7a 45 72 72 4d 73 67 20 29 7b 0a  c || zErrMsg ){.
32db0 20 20 20 20 63 68 61 72 20 7a 50 72 65 66 69 78      char zPrefix
32dc0 5b 31 30 30 5d 3b 0a 20 20 20 20 69 66 28 20 69  [100];.    if( i
32dd0 6e 21 3d 30 20 7c 7c 20 21 73 74 64 69 6e 5f 69  n!=0 || !stdin_i
32de0 73 5f 69 6e 74 65 72 61 63 74 69 76 65 20 29 7b  s_interactive ){
32df0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73  .      sqlite3_s
32e00 6e 70 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 7a  nprintf(sizeof(z
32e10 50 72 65 66 69 78 29 2c 20 7a 50 72 65 66 69 78  Prefix), zPrefix
32e20 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
32e30 20 20 20 20 20 20 20 20 20 22 45 72 72 6f 72 3a           "Error:
32e40 20 6e 65 61 72 20 6c 69 6e 65 20 25 64 3a 22 2c   near line %d:",
32e50 20 73 74 61 72 74 6c 69 6e 65 29 3b 0a 20 20 20   startline);.   
32e60 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71   }else{.      sq
32e70 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73  lite3_snprintf(s
32e80 69 7a 65 6f 66 28 7a 50 72 65 66 69 78 29 2c 20  izeof(zPrefix), 
32e90 7a 50 72 65 66 69 78 2c 20 22 45 72 72 6f 72 3a  zPrefix, "Error:
32ea0 22 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66  ");.    }.    if
32eb0 28 20 7a 45 72 72 4d 73 67 21 3d 30 20 29 7b 0a  ( zErrMsg!=0 ){.
32ec0 20 20 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74        utf8_print
32ed0 66 28 73 74 64 65 72 72 2c 20 22 25 73 20 25 73  f(stderr, "%s %s
32ee0 5c 6e 22 2c 20 7a 50 72 65 66 69 78 2c 20 7a 45  \n", zPrefix, zE
32ef0 72 72 4d 73 67 29 3b 0a 20 20 20 20 20 20 73 71  rrMsg);.      sq
32f00 6c 69 74 65 33 5f 66 72 65 65 28 7a 45 72 72 4d  lite3_free(zErrM
32f10 73 67 29 3b 0a 20 20 20 20 20 20 7a 45 72 72 4d  sg);.      zErrM
32f20 73 67 20 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73  sg = 0;.    }els
32f30 65 7b 0a 20 20 20 20 20 20 75 74 66 38 5f 70 72  e{.      utf8_pr
32f40 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22 25 73  intf(stderr, "%s
32f50 20 25 73 5c 6e 22 2c 20 7a 50 72 65 66 69 78 2c   %s\n", zPrefix,
32f60 20 73 71 6c 69 74 65 33 5f 65 72 72 6d 73 67 28   sqlite3_errmsg(
32f70 70 2d 3e 64 62 29 29 3b 0a 20 20 20 20 7d 0a 20  p->db));.    }. 
32f80 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
32f90 65 6c 73 65 20 69 66 28 20 53 68 65 6c 6c 48 61  else if( ShellHa
32fa0 73 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 43  sFlag(p, SHFLG_C
32fb0 6f 75 6e 74 43 68 61 6e 67 65 73 29 20 29 7b 0a  ountChanges) ){.
32fc0 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 70      raw_printf(p
32fd0 2d 3e 6f 75 74 2c 20 22 63 68 61 6e 67 65 73 3a  ->out, "changes:
32fe0 20 25 33 64 20 20 20 74 6f 74 61 6c 5f 63 68 61   %3d   total_cha
32ff0 6e 67 65 73 3a 20 25 64 5c 6e 22 2c 0a 20 20 20  nges: %d\n",.   
33000 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
33010 5f 63 68 61 6e 67 65 73 28 70 2d 3e 64 62 29 2c  _changes(p->db),
33020 20 73 71 6c 69 74 65 33 5f 74 6f 74 61 6c 5f 63   sqlite3_total_c
33030 68 61 6e 67 65 73 28 70 2d 3e 64 62 29 29 3b 0a  hanges(p->db));.
33040 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
33050 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 69  }.../*.** Read i
33060 6e 70 75 74 20 66 72 6f 6d 20 2a 69 6e 20 61 6e  nput from *in an
33070 64 20 70 72 6f 63 65 73 73 20 69 74 2e 20 20 49  d process it.  I
33080 66 20 2a 69 6e 3d 3d 30 20 74 68 65 6e 20 69 6e  f *in==0 then in
33090 70 75 74 0a 2a 2a 20 69 73 20 69 6e 74 65 72 61  put.** is intera
330a0 63 74 69 76 65 20 2d 20 74 68 65 20 75 73 65 72  ctive - the user
330b0 20 69 73 20 74 79 70 69 6e 67 20 69 74 20 69 74   is typing it it
330c0 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 69 6e  .  Otherwise, in
330d0 70 75 74 0a 2a 2a 20 69 73 20 63 6f 6d 69 6e 67  put.** is coming
330e0 20 66 72 6f 6d 20 61 20 66 69 6c 65 20 6f 72 20   from a file or 
330f0 64 65 76 69 63 65 2e 20 20 41 20 70 72 6f 6d 70  device.  A promp
33100 74 20 69 73 20 69 73 73 75 65 64 20 61 6e 64 20  t is issued and 
33110 68 69 73 74 6f 72 79 0a 2a 2a 20 69 73 20 73 61  history.** is sa
33120 76 65 64 20 6f 6e 6c 79 20 69 66 20 69 6e 70 75  ved only if inpu
33130 74 20 69 73 20 69 6e 74 65 72 61 63 74 69 76 65  t is interactive
33140 2e 20 20 41 6e 20 69 6e 74 65 72 72 75 70 74 20  .  An interrupt 
33150 73 69 67 6e 61 6c 20 77 69 6c 6c 0a 2a 2a 20 63  signal will.** c
33160 61 75 73 65 20 74 68 69 73 20 72 6f 75 74 69 6e  ause this routin
33170 65 20 74 6f 20 65 78 69 74 20 69 6d 6d 65 64 69  e to exit immedi
33180 61 74 65 6c 79 2c 20 75 6e 6c 65 73 73 20 69 6e  ately, unless in
33190 70 75 74 20 69 73 20 69 6e 74 65 72 61 63 74 69  put is interacti
331a0 76 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ve..**.** Return
331b0 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
331c0 72 72 6f 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  rrors..*/.static
331d0 20 69 6e 74 20 70 72 6f 63 65 73 73 5f 69 6e 70   int process_inp
331e0 75 74 28 53 68 65 6c 6c 53 74 61 74 65 20 2a 70  ut(ShellState *p
331f0 2c 20 46 49 4c 45 20 2a 69 6e 29 7b 0a 20 20 63  , FILE *in){.  c
33200 68 61 72 20 2a 7a 4c 69 6e 65 20 3d 20 30 3b 20  har *zLine = 0; 
33210 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 73 69           /* A si
33220 6e 67 6c 65 20 69 6e 70 75 74 20 6c 69 6e 65 20  ngle input line 
33230 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 53 71 6c 20  */.  char *zSql 
33240 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 2f  = 0;           /
33250 2a 20 41 63 63 75 6d 75 6c 61 74 65 64 20 53 51  * Accumulated SQ
33260 4c 20 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  L text */.  int 
33270 6e 4c 69 6e 65 3b 20 20 20 20 20 20 20 20 20 20  nLine;          
33280 20 20 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20        /* Length 
33290 6f 66 20 63 75 72 72 65 6e 74 20 6c 69 6e 65 20  of current line 
332a0 2a 2f 0a 20 20 69 6e 74 20 6e 53 71 6c 20 3d 20  */.  int nSql = 
332b0 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
332c0 2a 20 42 79 74 65 73 20 6f 66 20 7a 53 71 6c 5b  * Bytes of zSql[
332d0 5d 20 75 73 65 64 20 2a 2f 0a 20 20 69 6e 74 20  ] used */.  int 
332e0 6e 41 6c 6c 6f 63 20 3d 20 30 3b 20 20 20 20 20  nAlloc = 0;     
332f0 20 20 20 20 20 20 2f 2a 20 41 6c 6c 6f 63 61 74        /* Allocat
33300 65 64 20 7a 53 71 6c 5b 5d 20 73 70 61 63 65 20  ed zSql[] space 
33310 2a 2f 0a 20 20 69 6e 74 20 6e 53 71 6c 50 72 69  */.  int nSqlPri
33320 6f 72 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  or = 0;        /
33330 2a 20 42 79 74 65 73 20 6f 66 20 7a 53 71 6c 5b  * Bytes of zSql[
33340 5d 20 75 73 65 64 20 62 79 20 70 72 69 6f 72 20  ] used by prior 
33350 6c 69 6e 65 20 2a 2f 0a 20 20 69 6e 74 20 72 63  line */.  int rc
33360 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
33370 20 20 20 20 2f 2a 20 45 72 72 6f 72 20 63 6f 64      /* Error cod
33380 65 20 2a 2f 0a 20 20 69 6e 74 20 65 72 72 43 6e  e */.  int errCn
33390 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  t = 0;          
333a0 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 65 72   /* Number of er
333b0 72 6f 72 73 20 73 65 65 6e 20 2a 2f 0a 20 20 69  rors seen */.  i
333c0 6e 74 20 6c 69 6e 65 6e 6f 20 3d 20 30 3b 20 20  nt lineno = 0;  
333d0 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 72           /* Curr
333e0 65 6e 74 20 6c 69 6e 65 20 6e 75 6d 62 65 72 20  ent line number 
333f0 2a 2f 0a 20 20 69 6e 74 20 73 74 61 72 74 6c 69  */.  int startli
33400 6e 65 20 3d 20 30 3b 20 20 20 20 20 20 20 20 2f  ne = 0;        /
33410 2a 20 4c 69 6e 65 20 6e 75 6d 62 65 72 20 66 6f  * Line number fo
33420 72 20 73 74 61 72 74 20 6f 66 20 63 75 72 72 65  r start of curre
33430 6e 74 20 69 6e 70 75 74 20 2a 2f 0a 0a 20 20 77  nt input */..  w
33440 68 69 6c 65 28 20 65 72 72 43 6e 74 3d 3d 30 20  hile( errCnt==0 
33450 7c 7c 20 21 62 61 69 6c 5f 6f 6e 5f 65 72 72 6f  || !bail_on_erro
33460 72 20 7c 7c 20 28 69 6e 3d 3d 30 20 26 26 20 73  r || (in==0 && s
33470 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63 74  tdin_is_interact
33480 69 76 65 29 20 29 7b 0a 20 20 20 20 66 66 6c 75  ive) ){.    fflu
33490 73 68 28 70 2d 3e 6f 75 74 29 3b 0a 20 20 20 20  sh(p->out);.    
334a0 7a 4c 69 6e 65 20 3d 20 6f 6e 65 5f 69 6e 70 75  zLine = one_inpu
334b0 74 5f 6c 69 6e 65 28 69 6e 2c 20 7a 4c 69 6e 65  t_line(in, zLine
334c0 2c 20 6e 53 71 6c 3e 30 29 3b 0a 20 20 20 20 69  , nSql>0);.    i
334d0 66 28 20 7a 4c 69 6e 65 3d 3d 30 20 29 7b 0a 20  f( zLine==0 ){. 
334e0 20 20 20 20 20 2f 2a 20 45 6e 64 20 6f 66 20 69       /* End of i
334f0 6e 70 75 74 20 2a 2f 0a 20 20 20 20 20 20 69 66  nput */.      if
33500 28 20 69 6e 3d 3d 30 20 26 26 20 73 74 64 69 6e  ( in==0 && stdin
33510 5f 69 73 5f 69 6e 74 65 72 61 63 74 69 76 65 20  _is_interactive 
33520 29 20 70 72 69 6e 74 66 28 22 5c 6e 22 29 3b 0a  ) printf("\n");.
33530 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
33540 20 7d 0a 20 20 20 20 69 66 28 20 73 65 65 6e 49   }.    if( seenI
33550 6e 74 65 72 72 75 70 74 20 29 7b 0a 20 20 20 20  nterrupt ){.    
33560 20 20 69 66 28 20 69 6e 21 3d 30 20 29 20 62 72    if( in!=0 ) br
33570 65 61 6b 3b 0a 20 20 20 20 20 20 73 65 65 6e 49  eak;.      seenI
33580 6e 74 65 72 72 75 70 74 20 3d 20 30 3b 0a 20 20  nterrupt = 0;.  
33590 20 20 7d 0a 20 20 20 20 6c 69 6e 65 6e 6f 2b 2b    }.    lineno++
335a0 3b 0a 20 20 20 20 69 66 28 20 6e 53 71 6c 3d 3d  ;.    if( nSql==
335b0 30 20 26 26 20 5f 61 6c 6c 5f 77 68 69 74 65 73  0 && _all_whites
335c0 70 61 63 65 28 7a 4c 69 6e 65 29 20 29 7b 0a 20  pace(zLine) ){. 
335d0 20 20 20 20 20 69 66 28 20 53 68 65 6c 6c 48 61       if( ShellHa
335e0 73 46 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 45  sFlag(p, SHFLG_E
335f0 63 68 6f 29 20 29 20 70 72 69 6e 74 66 28 22 25  cho) ) printf("%
33600 73 5c 6e 22 2c 20 7a 4c 69 6e 65 29 3b 0a 20 20  s\n", zLine);.  
33610 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
33620 20 20 7d 0a 20 20 20 20 69 66 28 20 7a 4c 69 6e    }.    if( zLin
33630 65 20 26 26 20 7a 4c 69 6e 65 5b 30 5d 3d 3d 27  e && zLine[0]=='
33640 2e 27 20 26 26 20 6e 53 71 6c 3d 3d 30 20 29 7b  .' && nSql==0 ){
33650 0a 20 20 20 20 20 20 69 66 28 20 53 68 65 6c 6c  .      if( Shell
33660 48 61 73 46 6c 61 67 28 70 2c 20 53 48 46 4c 47  HasFlag(p, SHFLG
33670 5f 45 63 68 6f 29 20 29 20 70 72 69 6e 74 66 28  _Echo) ) printf(
33680 22 25 73 5c 6e 22 2c 20 7a 4c 69 6e 65 29 3b 0a  "%s\n", zLine);.
33690 20 20 20 20 20 20 72 63 20 3d 20 64 6f 5f 6d 65        rc = do_me
336a0 74 61 5f 63 6f 6d 6d 61 6e 64 28 7a 4c 69 6e 65  ta_command(zLine
336b0 2c 20 70 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , p);.      if( 
336c0 72 63 3d 3d 32 20 29 7b 20 2f 2a 20 65 78 69 74  rc==2 ){ /* exit
336d0 20 72 65 71 75 65 73 74 65 64 20 2a 2f 0a 20 20   requested */.  
336e0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
336f0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 72 63 20     }else if( rc 
33700 29 7b 0a 20 20 20 20 20 20 20 20 65 72 72 43 6e  ){.        errCn
33710 74 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  t++;.      }.   
33720 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20     continue;.   
33730 20 7d 0a 20 20 20 20 69 66 28 20 6c 69 6e 65 5f   }.    if( line_
33740 69 73 5f 63 6f 6d 6d 61 6e 64 5f 74 65 72 6d 69  is_command_termi
33750 6e 61 74 6f 72 28 7a 4c 69 6e 65 29 20 26 26 20  nator(zLine) && 
33760 6c 69 6e 65 5f 69 73 5f 63 6f 6d 70 6c 65 74 65  line_is_complete
33770 28 7a 53 71 6c 2c 20 6e 53 71 6c 29 20 29 7b 0a  (zSql, nSql) ){.
33780 20 20 20 20 20 20 6d 65 6d 63 70 79 28 7a 4c 69        memcpy(zLi
33790 6e 65 2c 22 3b 22 2c 32 29 3b 0a 20 20 20 20 7d  ne,";",2);.    }
337a0 0a 20 20 20 20 6e 4c 69 6e 65 20 3d 20 73 74 72  .    nLine = str
337b0 6c 65 6e 33 30 28 7a 4c 69 6e 65 29 3b 0a 20 20  len30(zLine);.  
337c0 20 20 69 66 28 20 6e 53 71 6c 2b 6e 4c 69 6e 65    if( nSql+nLine
337d0 2b 32 3e 3d 6e 41 6c 6c 6f 63 20 29 7b 0a 20 20  +2>=nAlloc ){.  
337e0 20 20 20 20 6e 41 6c 6c 6f 63 20 3d 20 6e 53 71      nAlloc = nSq
337f0 6c 2b 6e 4c 69 6e 65 2b 31 30 30 3b 0a 20 20 20  l+nLine+100;.   
33800 20 20 20 7a 53 71 6c 20 3d 20 72 65 61 6c 6c 6f     zSql = reallo
33810 63 28 7a 53 71 6c 2c 20 6e 41 6c 6c 6f 63 29 3b  c(zSql, nAlloc);
33820 0a 20 20 20 20 20 20 69 66 28 20 7a 53 71 6c 3d  .      if( zSql=
33830 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 61  =0 ){.        ra
33840 77 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c  w_printf(stderr,
33850 20 22 45 72 72 6f 72 3a 20 6f 75 74 20 6f 66 20   "Error: out of 
33860 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20  memory\n");.    
33870 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 20      exit(1);.   
33880 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 6e     }.    }.    n
33890 53 71 6c 50 72 69 6f 72 20 3d 20 6e 53 71 6c 3b  SqlPrior = nSql;
338a0 0a 20 20 20 20 69 66 28 20 6e 53 71 6c 3d 3d 30  .    if( nSql==0
338b0 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   ){.      int i;
338c0 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
338d0 7a 4c 69 6e 65 5b 69 5d 20 26 26 20 49 73 53 70  zLine[i] && IsSp
338e0 61 63 65 28 7a 4c 69 6e 65 5b 69 5d 29 3b 20 69  ace(zLine[i]); i
338f0 2b 2b 29 7b 7d 0a 20 20 20 20 20 20 61 73 73 65  ++){}.      asse
33900 72 74 28 20 6e 41 6c 6c 6f 63 3e 30 20 26 26 20  rt( nAlloc>0 && 
33910 7a 53 71 6c 21 3d 30 20 29 3b 0a 20 20 20 20 20  zSql!=0 );.     
33920 20 6d 65 6d 63 70 79 28 7a 53 71 6c 2c 20 7a 4c   memcpy(zSql, zL
33930 69 6e 65 2b 69 2c 20 6e 4c 69 6e 65 2b 31 2d 69  ine+i, nLine+1-i
33940 29 3b 0a 20 20 20 20 20 20 73 74 61 72 74 6c 69  );.      startli
33950 6e 65 20 3d 20 6c 69 6e 65 6e 6f 3b 0a 20 20 20  ne = lineno;.   
33960 20 20 20 6e 53 71 6c 20 3d 20 6e 4c 69 6e 65 2d     nSql = nLine-
33970 69 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  i;.    }else{.  
33980 20 20 20 20 7a 53 71 6c 5b 6e 53 71 6c 2b 2b 5d      zSql[nSql++]
33990 20 3d 20 27 5c 6e 27 3b 0a 20 20 20 20 20 20 6d   = '\n';.      m
339a0 65 6d 63 70 79 28 7a 53 71 6c 2b 6e 53 71 6c 2c  emcpy(zSql+nSql,
339b0 20 7a 4c 69 6e 65 2c 20 6e 4c 69 6e 65 2b 31 29   zLine, nLine+1)
339c0 3b 0a 20 20 20 20 20 20 6e 53 71 6c 20 2b 3d 20  ;.      nSql += 
339d0 6e 4c 69 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20  nLine;.    }.   
339e0 20 69 66 28 20 6e 53 71 6c 20 26 26 20 6c 69 6e   if( nSql && lin
339f0 65 5f 63 6f 6e 74 61 69 6e 73 5f 73 65 6d 69 63  e_contains_semic
33a00 6f 6c 6f 6e 28 26 7a 53 71 6c 5b 6e 53 71 6c 50  olon(&zSql[nSqlP
33a10 72 69 6f 72 5d 2c 20 6e 53 71 6c 2d 6e 53 71 6c  rior], nSql-nSql
33a20 50 72 69 6f 72 29 0a 20 20 20 20 20 20 20 20 20  Prior).         
33a30 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
33a40 33 5f 63 6f 6d 70 6c 65 74 65 28 7a 53 71 6c 29  3_complete(zSql)
33a50 20 29 7b 0a 20 20 20 20 20 20 65 72 72 43 6e 74   ){.      errCnt
33a60 20 2b 3d 20 72 75 6e 4f 6e 65 53 71 6c 4c 69 6e   += runOneSqlLin
33a70 65 28 70 2c 20 7a 53 71 6c 2c 20 69 6e 2c 20 73  e(p, zSql, in, s
33a80 74 61 72 74 6c 69 6e 65 29 3b 0a 20 20 20 20 20  tartline);.     
33a90 20 6e 53 71 6c 20 3d 20 30 3b 0a 20 20 20 20 20   nSql = 0;.     
33aa0 20 69 66 28 20 70 2d 3e 6f 75 74 43 6f 75 6e 74   if( p->outCount
33ab0 20 29 7b 0a 20 20 20 20 20 20 20 20 6f 75 74 70   ){.        outp
33ac0 75 74 5f 72 65 73 65 74 28 70 29 3b 0a 20 20 20  ut_reset(p);.   
33ad0 20 20 20 20 20 70 2d 3e 6f 75 74 43 6f 75 6e 74       p->outCount
33ae0 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
33af0 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 53 71 6c    }else if( nSql
33b00 20 26 26 20 5f 61 6c 6c 5f 77 68 69 74 65 73 70   && _all_whitesp
33b10 61 63 65 28 7a 53 71 6c 29 20 29 7b 0a 20 20 20  ace(zSql) ){.   
33b20 20 20 20 69 66 28 20 53 68 65 6c 6c 48 61 73 46     if( ShellHasF
33b30 6c 61 67 28 70 2c 20 53 48 46 4c 47 5f 45 63 68  lag(p, SHFLG_Ech
33b40 6f 29 20 29 20 70 72 69 6e 74 66 28 22 25 73 5c  o) ) printf("%s\
33b50 6e 22 2c 20 7a 53 71 6c 29 3b 0a 20 20 20 20 20  n", zSql);.     
33b60 20 6e 53 71 6c 20 3d 20 30 3b 0a 20 20 20 20 7d   nSql = 0;.    }
33b70 0a 20 20 7d 0a 20 20 69 66 28 20 6e 53 71 6c 20  .  }.  if( nSql 
33b80 26 26 20 21 5f 61 6c 6c 5f 77 68 69 74 65 73 70  && !_all_whitesp
33b90 61 63 65 28 7a 53 71 6c 29 20 29 7b 0a 20 20 20  ace(zSql) ){.   
33ba0 20 72 75 6e 4f 6e 65 53 71 6c 4c 69 6e 65 28 70   runOneSqlLine(p
33bb0 2c 20 7a 53 71 6c 2c 20 69 6e 2c 20 73 74 61 72  , zSql, in, star
33bc0 74 6c 69 6e 65 29 3b 0a 20 20 7d 0a 20 20 66 72  tline);.  }.  fr
33bd0 65 65 28 7a 53 71 6c 29 3b 0a 20 20 66 72 65 65  ee(zSql);.  free
33be0 28 7a 4c 69 6e 65 29 3b 0a 20 20 72 65 74 75 72  (zLine);.  retur
33bf0 6e 20 65 72 72 43 6e 74 3e 30 3b 0a 7d 0a 0a 2f  n errCnt>0;.}../
33c00 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 61  *.** Return a pa
33c10 74 68 6e 61 6d 65 20 77 68 69 63 68 20 69 73 20  thname which is 
33c20 74 68 65 20 75 73 65 72 27 73 20 68 6f 6d 65 20  the user's home 
33c30 64 69 72 65 63 74 6f 72 79 2e 20 20 41 0a 2a 2a  directory.  A.**
33c40 20 30 20 72 65 74 75 72 6e 20 69 6e 64 69 63 61   0 return indica
33c50 74 65 73 20 61 6e 20 65 72 72 6f 72 20 6f 66 20  tes an error of 
33c60 73 6f 6d 65 20 6b 69 6e 64 2e 0a 2a 2f 0a 73 74  some kind..*/.st
33c70 61 74 69 63 20 63 68 61 72 20 2a 66 69 6e 64 5f  atic char *find_
33c80 68 6f 6d 65 5f 64 69 72 28 69 6e 74 20 63 6c 65  home_dir(int cle
33c90 61 72 46 6c 61 67 29 7b 0a 20 20 73 74 61 74 69  arFlag){.  stati
33ca0 63 20 63 68 61 72 20 2a 68 6f 6d 65 5f 64 69 72  c char *home_dir
33cb0 20 3d 20 4e 55 4c 4c 3b 0a 20 20 69 66 28 20 63   = NULL;.  if( c
33cc0 6c 65 61 72 46 6c 61 67 20 29 7b 0a 20 20 20 20  learFlag ){.    
33cd0 66 72 65 65 28 68 6f 6d 65 5f 64 69 72 29 3b 0a  free(home_dir);.
33ce0 20 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20 30      home_dir = 0
33cf0 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
33d00 20 20 7d 0a 20 20 69 66 28 20 68 6f 6d 65 5f 64    }.  if( home_d
33d10 69 72 20 29 20 72 65 74 75 72 6e 20 68 6f 6d 65  ir ) return home
33d20 5f 64 69 72 3b 0a 0a 23 69 66 20 21 64 65 66 69  _dir;..#if !defi
33d30 6e 65 64 28 5f 57 49 4e 33 32 29 20 26 26 20 21  ned(_WIN32) && !
33d40 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 20 26  defined(WIN32) &
33d50 26 20 21 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  & !defined(_WIN3
33d60 32 5f 57 43 45 29 20 5c 0a 20 20 20 20 20 26 26  2_WCE) \.     &&
33d70 20 21 64 65 66 69 6e 65 64 28 5f 5f 52 54 50 5f   !defined(__RTP_
33d80 5f 29 20 26 26 20 21 64 65 66 69 6e 65 64 28 5f  _) && !defined(_
33d90 57 52 53 5f 4b 45 52 4e 45 4c 29 0a 20 20 7b 0a  WRS_KERNEL).  {.
33da0 20 20 20 20 73 74 72 75 63 74 20 70 61 73 73 77      struct passw
33db0 64 20 2a 70 77 65 6e 74 3b 0a 20 20 20 20 75 69  d *pwent;.    ui
33dc0 64 5f 74 20 75 69 64 20 3d 20 67 65 74 75 69 64  d_t uid = getuid
33dd0 28 29 3b 0a 20 20 20 20 69 66 28 20 28 70 77 65  ();.    if( (pwe
33de0 6e 74 3d 67 65 74 70 77 75 69 64 28 75 69 64 29  nt=getpwuid(uid)
33df0 29 20 21 3d 20 4e 55 4c 4c 29 20 7b 0a 20 20 20  ) != NULL) {.   
33e00 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20 70 77     home_dir = pw
33e10 65 6e 74 2d 3e 70 77 5f 64 69 72 3b 0a 20 20 20  ent->pw_dir;.   
33e20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 23   }.  }.#endif..#
33e30 69 66 20 64 65 66 69 6e 65 64 28 5f 57 49 4e 33  if defined(_WIN3
33e40 32 5f 57 43 45 29 0a 20 20 2f 2a 20 57 69 6e 64  2_WCE).  /* Wind
33e50 6f 77 73 20 43 45 20 28 61 72 6d 2d 77 69 6e 63  ows CE (arm-winc
33e60 65 2d 6d 69 6e 67 77 33 32 63 65 2d 67 63 63 29  e-mingw32ce-gcc)
33e70 20 64 6f 65 73 20 6e 6f 74 20 70 72 6f 76 69 64   does not provid
33e80 65 20 67 65 74 65 6e 76 28 29 0a 20 20 20 2a 2f  e getenv().   */
33e90 0a 20 20 68 6f 6d 65 5f 64 69 72 20 3d 20 22 2f  .  home_dir = "/
33ea0 22 3b 0a 23 65 6c 73 65 0a 0a 23 69 66 20 64 65  ";.#else..#if de
33eb0 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c  fined(_WIN32) ||
33ec0 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 0a   defined(WIN32).
33ed0 20 20 69 66 20 28 21 68 6f 6d 65 5f 64 69 72 29    if (!home_dir)
33ee0 20 7b 0a 20 20 20 20 68 6f 6d 65 5f 64 69 72 20   {.    home_dir 
33ef0 3d 20 67 65 74 65 6e 76 28 22 55 53 45 52 50 52  = getenv("USERPR
33f00 4f 46 49 4c 45 22 29 3b 0a 20 20 7d 0a 23 65 6e  OFILE");.  }.#en
33f10 64 69 66 0a 0a 20 20 69 66 20 28 21 68 6f 6d 65  dif..  if (!home
33f20 5f 64 69 72 29 20 7b 0a 20 20 20 20 68 6f 6d 65  _dir) {.    home
33f30 5f 64 69 72 20 3d 20 67 65 74 65 6e 76 28 22 48  _dir = getenv("H
33f40 4f 4d 45 22 29 3b 0a 20 20 7d 0a 0a 23 69 66 20  OME");.  }..#if 
33f50 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32 29 20  defined(_WIN32) 
33f60 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e 33 32  || defined(WIN32
33f70 29 0a 20 20 69 66 20 28 21 68 6f 6d 65 5f 64 69  ).  if (!home_di
33f80 72 29 20 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  r) {.    char *z
33f90 44 72 69 76 65 2c 20 2a 7a 50 61 74 68 3b 0a 20  Drive, *zPath;. 
33fa0 20 20 20 69 6e 74 20 6e 3b 0a 20 20 20 20 7a 44     int n;.    zD
33fb0 72 69 76 65 20 3d 20 67 65 74 65 6e 76 28 22 48  rive = getenv("H
33fc0 4f 4d 45 44 52 49 56 45 22 29 3b 0a 20 20 20 20  OMEDRIVE");.    
33fd0 7a 50 61 74 68 20 3d 20 67 65 74 65 6e 76 28 22  zPath = getenv("
33fe0 48 4f 4d 45 50 41 54 48 22 29 3b 0a 20 20 20 20  HOMEPATH");.    
33ff0 69 66 28 20 7a 44 72 69 76 65 20 26 26 20 7a 50  if( zDrive && zP
34000 61 74 68 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d  ath ){.      n =
34010 20 73 74 72 6c 65 6e 33 30 28 7a 44 72 69 76 65   strlen30(zDrive
34020 29 20 2b 20 73 74 72 6c 65 6e 33 30 28 7a 50 61  ) + strlen30(zPa
34030 74 68 29 20 2b 20 31 3b 0a 20 20 20 20 20 20 68  th) + 1;.      h
34040 6f 6d 65 5f 64 69 72 20 3d 20 6d 61 6c 6c 6f 63  ome_dir = malloc
34050 28 20 6e 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ( n );.      if(
34060 20 68 6f 6d 65 5f 64 69 72 3d 3d 30 20 29 20 72   home_dir==0 ) r
34070 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 73  eturn 0;.      s
34080 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66 28  qlite3_snprintf(
34090 6e 2c 20 68 6f 6d 65 5f 64 69 72 2c 20 22 25 73  n, home_dir, "%s
340a0 25 73 22 2c 20 7a 44 72 69 76 65 2c 20 7a 50 61  %s", zDrive, zPa
340b0 74 68 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  th);.      retur
340c0 6e 20 68 6f 6d 65 5f 64 69 72 3b 0a 20 20 20 20  n home_dir;.    
340d0 7d 0a 20 20 20 20 68 6f 6d 65 5f 64 69 72 20 3d  }.    home_dir =
340e0 20 22 63 3a 5c 5c 22 3b 0a 20 20 7d 0a 23 65 6e   "c:\\";.  }.#en
340f0 64 69 66 0a 0a 23 65 6e 64 69 66 20 2f 2a 20 21  dif..#endif /* !
34100 5f 57 49 4e 33 32 5f 57 43 45 20 2a 2f 0a 0a 20  _WIN32_WCE */.. 
34110 20 69 66 28 20 68 6f 6d 65 5f 64 69 72 20 29 7b   if( home_dir ){
34120 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 73 74 72  .    int n = str
34130 6c 65 6e 33 30 28 68 6f 6d 65 5f 64 69 72 29 20  len30(home_dir) 
34140 2b 20 31 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a  + 1;.    char *z
34150 20 3d 20 6d 61 6c 6c 6f 63 28 20 6e 20 29 3b 0a   = malloc( n );.
34160 20 20 20 20 69 66 28 20 7a 20 29 20 6d 65 6d 63      if( z ) memc
34170 70 79 28 7a 2c 20 68 6f 6d 65 5f 64 69 72 2c 20  py(z, home_dir, 
34180 6e 29 3b 0a 20 20 20 20 68 6f 6d 65 5f 64 69 72  n);.    home_dir
34190 20 3d 20 7a 3b 0a 20 20 7d 0a 0a 20 20 72 65 74   = z;.  }..  ret
341a0 75 72 6e 20 68 6f 6d 65 5f 64 69 72 3b 0a 7d 0a  urn home_dir;.}.
341b0 0a 2f 2a 0a 2a 2a 20 52 65 61 64 20 69 6e 70 75  ./*.** Read inpu
341c0 74 20 66 72 6f 6d 20 74 68 65 20 66 69 6c 65 20  t from the file 
341d0 67 69 76 65 6e 20 62 79 20 73 71 6c 69 74 65 72  given by sqliter
341e0 63 5f 6f 76 65 72 72 69 64 65 2e 20 20 4f 72 20  c_override.  Or 
341f0 69 66 20 74 68 61 74 0a 2a 2a 20 70 61 72 61 6d  if that.** param
34200 65 74 65 72 20 69 73 20 4e 55 4c 4c 2c 20 74 61  eter is NULL, ta
34210 6b 65 20 69 6e 70 75 74 20 66 72 6f 6d 20 7e 2f  ke input from ~/
34220 2e 73 71 6c 69 74 65 72 63 0a 2a 2a 0a 2a 2a 20  .sqliterc.**.** 
34230 52 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62  Returns the numb
34240 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2f  er of errors..*/
34250 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70 72 6f  .static void pro
34260 63 65 73 73 5f 73 71 6c 69 74 65 72 63 28 0a 20  cess_sqliterc(. 
34270 20 53 68 65 6c 6c 53 74 61 74 65 20 2a 70 2c 20   ShellState *p, 
34280 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34290 20 2f 2a 20 43 6f 6e 66 69 67 75 72 61 74 69 6f   /* Configuratio
342a0 6e 20 64 61 74 61 20 2a 2f 0a 20 20 63 6f 6e 73  n data */.  cons
342b0 74 20 63 68 61 72 20 2a 73 71 6c 69 74 65 72 63  t char *sqliterc
342c0 5f 6f 76 65 72 72 69 64 65 20 20 20 2f 2a 20 4e  _override   /* N
342d0 61 6d 65 20 6f 66 20 63 6f 6e 66 69 67 20 66 69  ame of config fi
342e0 6c 65 2e 20 4e 55 4c 4c 20 74 6f 20 75 73 65 20  le. NULL to use 
342f0 64 65 66 61 75 6c 74 20 2a 2f 0a 29 7b 0a 20 20  default */.){.  
34300 63 68 61 72 20 2a 68 6f 6d 65 5f 64 69 72 20 3d  char *home_dir =
34310 20 4e 55 4c 4c 3b 0a 20 20 63 6f 6e 73 74 20 63   NULL;.  const c
34320 68 61 72 20 2a 73 71 6c 69 74 65 72 63 20 3d 20  har *sqliterc = 
34330 73 71 6c 69 74 65 72 63 5f 6f 76 65 72 72 69 64  sqliterc_overrid
34340 65 3b 0a 20 20 63 68 61 72 20 2a 7a 42 75 66 20  e;.  char *zBuf 
34350 3d 20 30 3b 0a 20 20 46 49 4c 45 20 2a 69 6e 20  = 0;.  FILE *in 
34360 3d 20 4e 55 4c 4c 3b 0a 0a 20 20 69 66 20 28 73  = NULL;..  if (s
34370 71 6c 69 74 65 72 63 20 3d 3d 20 4e 55 4c 4c 29  qliterc == NULL)
34380 20 7b 0a 20 20 20 20 68 6f 6d 65 5f 64 69 72 20   {.    home_dir 
34390 3d 20 66 69 6e 64 5f 68 6f 6d 65 5f 64 69 72 28  = find_home_dir(
343a0 30 29 3b 0a 20 20 20 20 69 66 28 20 68 6f 6d 65  0);.    if( home
343b0 5f 64 69 72 3d 3d 30 20 29 7b 0a 20 20 20 20 20  _dir==0 ){.     
343c0 20 72 61 77 5f 70 72 69 6e 74 66 28 73 74 64 65   raw_printf(stde
343d0 72 72 2c 20 22 2d 2d 20 77 61 72 6e 69 6e 67 3a  rr, "-- warning:
343e0 20 63 61 6e 6e 6f 74 20 66 69 6e 64 20 68 6f 6d   cannot find hom
343f0 65 20 64 69 72 65 63 74 6f 72 79 3b 22 0a 20 20  e directory;".  
34400 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
34410 20 20 20 20 22 20 63 61 6e 6e 6f 74 20 72 65 61      " cannot rea
34420 64 20 7e 2f 2e 73 71 6c 69 74 65 72 63 5c 6e 22  d ~/.sqliterc\n"
34430 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 3b  );.      return;
34440 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74  .    }.    sqlit
34450 65 33 5f 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b  e3_initialize();
34460 0a 20 20 20 20 7a 42 75 66 20 3d 20 73 71 6c 69  .    zBuf = sqli
34470 74 65 33 5f 6d 70 72 69 6e 74 66 28 22 25 73 2f  te3_mprintf("%s/
34480 2e 73 71 6c 69 74 65 72 63 22 2c 68 6f 6d 65 5f  .sqliterc",home_
34490 64 69 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  dir);.    sqlite
344a0 72 63 20 3d 20 7a 42 75 66 3b 0a 20 20 7d 0a 20  rc = zBuf;.  }. 
344b0 20 69 6e 20 3d 20 66 6f 70 65 6e 28 73 71 6c 69   in = fopen(sqli
344c0 74 65 72 63 2c 22 72 62 22 29 3b 0a 20 20 69 66  terc,"rb");.  if
344d0 28 20 69 6e 20 29 7b 0a 20 20 20 20 69 66 28 20  ( in ){.    if( 
344e0 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65 72 61 63  stdin_is_interac
344f0 74 69 76 65 20 29 7b 0a 20 20 20 20 20 20 75 74  tive ){.      ut
34500 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72  f8_printf(stderr
34510 2c 22 2d 2d 20 4c 6f 61 64 69 6e 67 20 72 65 73  ,"-- Loading res
34520 6f 75 72 63 65 73 20 66 72 6f 6d 20 25 73 5c 6e  ources from %s\n
34530 22 2c 73 71 6c 69 74 65 72 63 29 3b 0a 20 20 20  ",sqliterc);.   
34540 20 7d 0a 20 20 20 20 70 72 6f 63 65 73 73 5f 69   }.    process_i
34550 6e 70 75 74 28 70 2c 69 6e 29 3b 0a 20 20 20 20  nput(p,in);.    
34560 66 63 6c 6f 73 65 28 69 6e 29 3b 0a 20 20 7d 0a  fclose(in);.  }.
34570 20 20 73 71 6c 69 74 65 33 5f 66 72 65 65 28 7a    sqlite3_free(z
34580 42 75 66 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  Buf);.}../*.** S
34590 68 6f 77 20 61 76 61 69 6c 61 62 6c 65 20 63 6f  how available co
345a0 6d 6d 61 6e 64 20 6c 69 6e 65 20 6f 70 74 69 6f  mmand line optio
345b0 6e 73 0a 2a 2f 0a 73 74 61 74 69 63 20 63 6f 6e  ns.*/.static con
345c0 73 74 20 63 68 61 72 20 7a 4f 70 74 69 6f 6e 73  st char zOptions
345d0 5b 5d 20 3d 0a 20 20 22 20 20 20 2d 61 73 63 69  [] =.  "   -asci
345e0 69 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i               
345f0 73 65 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 20  set output mode 
34600 74 6f 20 27 61 73 63 69 69 27 5c 6e 22 0a 20 20  to 'ascii'\n".  
34610 22 20 20 20 2d 62 61 69 6c 20 20 20 20 20 20 20  "   -bail       
34620 20 20 20 20 20 20 20 20 20 73 74 6f 70 20 61 66           stop af
34630 74 65 72 20 68 69 74 74 69 6e 67 20 61 6e 20 65  ter hitting an e
34640 72 72 6f 72 5c 6e 22 0a 20 20 22 20 20 20 2d 62  rror\n".  "   -b
34650 61 74 63 68 20 20 20 20 20 20 20 20 20 20 20 20  atch            
34660 20 20 20 66 6f 72 63 65 20 62 61 74 63 68 20 49     force batch I
34670 2f 4f 5c 6e 22 0a 20 20 22 20 20 20 2d 63 6f 6c  /O\n".  "   -col
34680 75 6d 6e 20 20 20 20 20 20 20 20 20 20 20 20 20  umn             
34690 20 73 65 74 20 6f 75 74 70 75 74 20 6d 6f 64 65   set output mode
346a0 20 74 6f 20 27 63 6f 6c 75 6d 6e 27 5c 6e 22 0a   to 'column'\n".
346b0 20 20 22 20 20 20 2d 63 6d 64 20 43 4f 4d 4d 41    "   -cmd COMMA
346c0 4e 44 20 20 20 20 20 20 20 20 20 72 75 6e 20 5c  ND         run \
346d0 22 43 4f 4d 4d 41 4e 44 5c 22 20 62 65 66 6f 72  "COMMAND\" befor
346e0 65 20 72 65 61 64 69 6e 67 20 73 74 64 69 6e 5c  e reading stdin\
346f0 6e 22 0a 20 20 22 20 20 20 2d 63 73 76 20 20 20  n".  "   -csv   
34700 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
34710 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 74 6f  t output mode to
34720 20 27 63 73 76 27 5c 6e 22 0a 20 20 22 20 20 20   'csv'\n".  "   
34730 2d 65 63 68 6f 20 20 20 20 20 20 20 20 20 20 20  -echo           
34740 20 20 20 20 20 70 72 69 6e 74 20 63 6f 6d 6d 61       print comma
34750 6e 64 73 20 62 65 66 6f 72 65 20 65 78 65 63 75  nds before execu
34760 74 69 6f 6e 5c 6e 22 0a 20 20 22 20 20 20 2d 69  tion\n".  "   -i
34770 6e 69 74 20 46 49 4c 45 4e 41 4d 45 20 20 20 20  nit FILENAME    
34780 20 20 20 72 65 61 64 2f 70 72 6f 63 65 73 73 20     read/process 
34790 6e 61 6d 65 64 20 66 69 6c 65 5c 6e 22 0a 20 20  named file\n".  
347a0 22 20 20 20 2d 5b 6e 6f 5d 68 65 61 64 65 72 20  "   -[no]header 
347b0 20 20 20 20 20 20 20 20 20 74 75 72 6e 20 68 65           turn he
347c0 61 64 65 72 73 20 6f 6e 20 6f 72 20 6f 66 66 5c  aders on or off\
347d0 6e 22 0a 23 69 66 20 64 65 66 69 6e 65 64 28 53  n".#if defined(S
347e0 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d 45 4d  QLITE_ENABLE_MEM
347f0 53 59 53 33 29 20 7c 7c 20 64 65 66 69 6e 65 64  SYS3) || defined
34800 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4d  (SQLITE_ENABLE_M
34810 45 4d 53 59 53 35 29 0a 20 20 22 20 20 20 2d 68  EMSYS5).  "   -h
34820 65 61 70 20 53 49 5a 45 20 20 20 20 20 20 20 20  eap SIZE        
34830 20 20 20 53 69 7a 65 20 6f 66 20 68 65 61 70 20     Size of heap 
34840 66 6f 72 20 6d 65 6d 73 79 73 33 20 6f 72 20 6d  for memsys3 or m
34850 65 6d 73 79 73 35 5c 6e 22 0a 23 65 6e 64 69 66  emsys5\n".#endif
34860 0a 20 20 22 20 20 20 2d 68 65 6c 70 20 20 20 20  .  "   -help    
34870 20 20 20 20 20 20 20 20 20 20 20 20 73 68 6f 77              show
34880 20 74 68 69 73 20 6d 65 73 73 61 67 65 5c 6e 22   this message\n"
34890 0a 20 20 22 20 20 20 2d 68 74 6d 6c 20 20 20 20  .  "   -html    
348a0 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 20              set 
348b0 6f 75 74 70 75 74 20 6d 6f 64 65 20 74 6f 20 48  output mode to H
348c0 54 4d 4c 5c 6e 22 0a 20 20 22 20 20 20 2d 69 6e  TML\n".  "   -in
348d0 74 65 72 61 63 74 69 76 65 20 20 20 20 20 20 20  teractive       
348e0 20 20 66 6f 72 63 65 20 69 6e 74 65 72 61 63 74    force interact
348f0 69 76 65 20 49 2f 4f 5c 6e 22 0a 20 20 22 20 20  ive I/O\n".  "  
34900 20 2d 6c 69 6e 65 20 20 20 20 20 20 20 20 20 20   -line          
34910 20 20 20 20 20 20 73 65 74 20 6f 75 74 70 75 74        set output
34920 20 6d 6f 64 65 20 74 6f 20 27 6c 69 6e 65 27 5c   mode to 'line'\
34930 6e 22 0a 20 20 22 20 20 20 2d 6c 69 73 74 20 20  n".  "   -list  
34940 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
34950 74 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 74 6f  t output mode to
34960 20 27 6c 69 73 74 27 5c 6e 22 0a 20 20 22 20 20   'list'\n".  "  
34970 20 2d 6c 6f 6f 6b 61 73 69 64 65 20 53 49 5a 45   -lookaside SIZE
34980 20 4e 20 20 20 20 75 73 65 20 4e 20 65 6e 74 72   N    use N entr
34990 69 65 73 20 6f 66 20 53 5a 20 62 79 74 65 73 20  ies of SZ bytes 
349a0 66 6f 72 20 6c 6f 6f 6b 61 73 69 64 65 20 6d 65  for lookaside me
349b0 6d 6f 72 79 5c 6e 22 0a 20 20 22 20 20 20 2d 6d  mory\n".  "   -m
349c0 6d 61 70 20 4e 20 20 20 20 20 20 20 20 20 20 20  map N           
349d0 20 20 20 64 65 66 61 75 6c 74 20 6d 6d 61 70 20     default mmap 
349e0 73 69 7a 65 20 73 65 74 20 74 6f 20 4e 5c 6e 22  size set to N\n"
349f0 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
34a00 4e 41 42 4c 45 5f 4d 55 4c 54 49 50 4c 45 58 0a  NABLE_MULTIPLEX.
34a10 20 20 22 20 20 20 2d 6d 75 6c 74 69 70 6c 65 78    "   -multiplex
34a20 20 20 20 20 20 20 20 20 20 20 20 65 6e 61 62 6c             enabl
34a30 65 20 74 68 65 20 6d 75 6c 74 69 70 6c 65 78 6f  e the multiplexo
34a40 72 20 56 46 53 5c 6e 22 0a 23 65 6e 64 69 66 0a  r VFS\n".#endif.
34a50 20 20 22 20 20 20 2d 6e 65 77 6c 69 6e 65 20 53    "   -newline S
34a60 45 50 20 20 20 20 20 20 20 20 20 73 65 74 20 6f  EP         set o
34a70 75 74 70 75 74 20 72 6f 77 20 73 65 70 61 72 61  utput row separa
34a80 74 6f 72 2e 20 44 65 66 61 75 6c 74 3a 20 27 5c  tor. Default: '\
34a90 5c 6e 27 5c 6e 22 0a 20 20 22 20 20 20 2d 6e 75  \n'\n".  "   -nu
34aa0 6c 6c 76 61 6c 75 65 20 54 45 58 54 20 20 20 20  llvalue TEXT    
34ab0 20 20 73 65 74 20 74 65 78 74 20 73 74 72 69 6e    set text strin
34ac0 67 20 66 6f 72 20 4e 55 4c 4c 20 76 61 6c 75 65  g for NULL value
34ad0 73 2e 20 44 65 66 61 75 6c 74 20 27 27 5c 6e 22  s. Default ''\n"
34ae0 0a 20 20 22 20 20 20 2d 70 61 67 65 63 61 63 68  .  "   -pagecach
34af0 65 20 53 49 5a 45 20 4e 20 20 20 20 75 73 65 20  e SIZE N    use 
34b00 4e 20 73 6c 6f 74 73 20 6f 66 20 53 5a 20 62 79  N slots of SZ by
34b10 74 65 73 20 65 61 63 68 20 66 6f 72 20 70 61 67  tes each for pag
34b20 65 20 63 61 63 68 65 20 6d 65 6d 6f 72 79 5c 6e  e cache memory\n
34b30 22 0a 20 20 22 20 20 20 2d 71 75 6f 74 65 20 20  ".  "   -quote  
34b40 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
34b50 20 6f 75 74 70 75 74 20 6d 6f 64 65 20 74 6f 20   output mode to 
34b60 27 71 75 6f 74 65 27 5c 6e 22 0a 20 20 22 20 20  'quote'\n".  "  
34b70 20 2d 73 65 70 61 72 61 74 6f 72 20 53 45 50 20   -separator SEP 
34b80 20 20 20 20 20 20 73 65 74 20 6f 75 74 70 75 74        set output
34b90 20 63 6f 6c 75 6d 6e 20 73 65 70 61 72 61 74 6f   column separato
34ba0 72 2e 20 44 65 66 61 75 6c 74 3a 20 27 7c 27 5c  r. Default: '|'\
34bb0 6e 22 0a 20 20 22 20 20 20 2d 73 74 61 74 73 20  n".  "   -stats 
34bc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
34bd0 69 6e 74 20 6d 65 6d 6f 72 79 20 73 74 61 74 73  int memory stats
34be0 20 62 65 66 6f 72 65 20 65 61 63 68 20 66 69 6e   before each fin
34bf0 61 6c 69 7a 65 5c 6e 22 0a 20 20 22 20 20 20 2d  alize\n".  "   -
34c00 76 65 72 73 69 6f 6e 20 20 20 20 20 20 20 20 20  version         
34c10 20 20 20 20 73 68 6f 77 20 53 51 4c 69 74 65 20      show SQLite 
34c20 76 65 72 73 69 6f 6e 5c 6e 22 0a 20 20 22 20 20  version\n".  "  
34c30 20 2d 76 66 73 20 4e 41 4d 45 20 20 20 20 20 20   -vfs NAME      
34c40 20 20 20 20 20 20 75 73 65 20 4e 41 4d 45 20 61        use NAME a
34c50 73 20 74 68 65 20 64 65 66 61 75 6c 74 20 56 46  s the default VF
34c60 53 5c 6e 22 0a 23 69 66 64 65 66 20 53 51 4c 49  S\n".#ifdef SQLI
34c70 54 45 5f 45 4e 41 42 4c 45 5f 56 46 53 54 52 41  TE_ENABLE_VFSTRA
34c80 43 45 0a 20 20 22 20 20 20 2d 76 66 73 74 72 61  CE.  "   -vfstra
34c90 63 65 20 20 20 20 20 20 20 20 20 20 20 20 65 6e  ce            en
34ca0 61 62 6c 65 20 74 72 61 63 69 6e 67 20 6f 66 20  able tracing of 
34cb0 61 6c 6c 20 56 46 53 20 63 61 6c 6c 73 5c 6e 22  all VFS calls\n"
34cc0 0a 23 65 6e 64 69 66 0a 3b 0a 73 74 61 74 69 63  .#endif.;.static
34cd0 20 76 6f 69 64 20 75 73 61 67 65 28 69 6e 74 20   void usage(int 
34ce0 73 68 6f 77 44 65 74 61 69 6c 29 7b 0a 20 20 75  showDetail){.  u
34cf0 74 66 38 5f 70 72 69 6e 74 66 28 73 74 64 65 72  tf8_printf(stder
34d00 72 2c 0a 20 20 20 20 20 20 22 55 73 61 67 65 3a  r,.      "Usage:
34d10 20 25 73 20 5b 4f 50 54 49 4f 4e 53 5d 20 46 49   %s [OPTIONS] FI
34d20 4c 45 4e 41 4d 45 20 5b 53 51 4c 5d 5c 6e 22 0a  LENAME [SQL]\n".
34d30 20 20 20 20 20 20 22 46 49 4c 45 4e 41 4d 45 20        "FILENAME 
34d40 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61  is the name of a
34d50 6e 20 53 51 4c 69 74 65 20 64 61 74 61 62 61 73  n SQLite databas
34d60 65 2e 20 41 20 6e 65 77 20 64 61 74 61 62 61 73  e. A new databas
34d70 65 20 69 73 20 63 72 65 61 74 65 64 5c 6e 22 0a  e is created\n".
34d80 20 20 20 20 20 20 22 69 66 20 74 68 65 20 66 69        "if the fi
34d90 6c 65 20 64 6f 65 73 20 6e 6f 74 20 70 72 65 76  le does not prev
34da0 69 6f 75 73 6c 79 20 65 78 69 73 74 2e 5c 6e 22  iously exist.\n"
34db0 2c 20 41 72 67 76 30 29 3b 0a 20 20 69 66 28 20  , Argv0);.  if( 
34dc0 73 68 6f 77 44 65 74 61 69 6c 20 29 7b 0a 20 20  showDetail ){.  
34dd0 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
34de0 64 65 72 72 2c 20 22 4f 50 54 49 4f 4e 53 20 69  derr, "OPTIONS i
34df0 6e 63 6c 75 64 65 3a 5c 6e 25 73 22 2c 20 7a 4f  nclude:\n%s", zO
34e00 70 74 69 6f 6e 73 29 3b 0a 20 20 7d 65 6c 73 65  ptions);.  }else
34e10 7b 0a 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66  {.    raw_printf
34e20 28 73 74 64 65 72 72 2c 20 22 55 73 65 20 74 68  (stderr, "Use th
34e30 65 20 2d 68 65 6c 70 20 6f 70 74 69 6f 6e 20 66  e -help option f
34e40 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
34e50 66 6f 72 6d 61 74 69 6f 6e 5c 6e 22 29 3b 0a 20  formation\n");. 
34e60 20 7d 0a 20 20 65 78 69 74 28 31 29 3b 0a 7d 0a   }.  exit(1);.}.
34e70 0a 2f 2a 0a 2a 2a 20 49 6e 69 74 69 61 6c 69 7a  ./*.** Initializ
34e80 65 20 74 68 65 20 73 74 61 74 65 20 69 6e 66 6f  e the state info
34e90 72 6d 61 74 69 6f 6e 20 69 6e 20 64 61 74 61 0a  rmation in data.
34ea0 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6d  */.static void m
34eb0 61 69 6e 5f 69 6e 69 74 28 53 68 65 6c 6c 53 74  ain_init(ShellSt
34ec0 61 74 65 20 2a 64 61 74 61 29 20 7b 0a 20 20 6d  ate *data) {.  m
34ed0 65 6d 73 65 74 28 64 61 74 61 2c 20 30 2c 20 73  emset(data, 0, s
34ee0 69 7a 65 6f 66 28 2a 64 61 74 61 29 29 3b 0a 20  izeof(*data));. 
34ef0 20 64 61 74 61 2d 3e 6e 6f 72 6d 61 6c 4d 6f 64   data->normalMod
34f00 65 20 3d 20 64 61 74 61 2d 3e 63 4d 6f 64 65 20  e = data->cMode 
34f10 3d 20 64 61 74 61 2d 3e 6d 6f 64 65 20 3d 20 4d  = data->mode = M
34f20 4f 44 45 5f 4c 69 73 74 3b 0a 20 20 64 61 74 61  ODE_List;.  data
34f30 2d 3e 61 75 74 6f 45 78 70 6c 61 69 6e 20 3d 20  ->autoExplain = 
34f40 31 3b 0a 20 20 6d 65 6d 63 70 79 28 64 61 74 61  1;.  memcpy(data
34f50 2d 3e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 53  ->colSeparator,S
34f60 45 50 5f 43 6f 6c 75 6d 6e 2c 20 32 29 3b 0a 20  EP_Column, 2);. 
34f70 20 6d 65 6d 63 70 79 28 64 61 74 61 2d 3e 72 6f   memcpy(data->ro
34f80 77 53 65 70 61 72 61 74 6f 72 2c 53 45 50 5f 52  wSeparator,SEP_R
34f90 6f 77 2c 20 32 29 3b 0a 20 20 64 61 74 61 2d 3e  ow, 2);.  data->
34fa0 73 68 6f 77 48 65 61 64 65 72 20 3d 20 30 3b 0a  showHeader = 0;.
34fb0 20 20 64 61 74 61 2d 3e 73 68 65 6c 6c 46 6c 67    data->shellFlg
34fc0 73 20 3d 20 53 48 46 4c 47 5f 4c 6f 6f 6b 61 73  s = SHFLG_Lookas
34fd0 69 64 65 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63  ide;.  sqlite3_c
34fe0 6f 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e  onfig(SQLITE_CON
34ff0 46 49 47 5f 55 52 49 2c 20 31 29 3b 0a 20 20 73  FIG_URI, 1);.  s
35000 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
35010 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 4c 4f 47 2c  LITE_CONFIG_LOG,
35020 20 73 68 65 6c 6c 4c 6f 67 2c 20 64 61 74 61 29   shellLog, data)
35030 3b 0a 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66  ;.  sqlite3_conf
35040 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ig(SQLITE_CONFIG
35050 5f 4d 55 4c 54 49 54 48 52 45 41 44 29 3b 0a 20  _MULTITHREAD);. 
35060 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74   sqlite3_snprint
35070 66 28 73 69 7a 65 6f 66 28 6d 61 69 6e 50 72 6f  f(sizeof(mainPro
35080 6d 70 74 29 2c 20 6d 61 69 6e 50 72 6f 6d 70 74  mpt), mainPrompt
35090 2c 22 73 71 6c 69 74 65 3e 20 22 29 3b 0a 20 20  ,"sqlite> ");.  
350a0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
350b0 28 73 69 7a 65 6f 66 28 63 6f 6e 74 69 6e 75 65  (sizeof(continue
350c0 50 72 6f 6d 70 74 29 2c 20 63 6f 6e 74 69 6e 75  Prompt), continu
350d0 65 50 72 6f 6d 70 74 2c 22 20 20 20 2e 2e 2e 3e  ePrompt,"   ...>
350e0 20 22 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4f 75   ");.}../*.** Ou
350f0 74 70 75 74 20 74 65 78 74 20 74 6f 20 74 68 65  tput text to the
35100 20 63 6f 6e 73 6f 6c 65 20 69 6e 20 61 20 66 6f   console in a fo
35110 6e 74 20 74 68 61 74 20 61 74 74 72 61 63 74 73  nt that attracts
35120 20 65 78 74 72 61 20 61 74 74 65 6e 74 69 6f 6e   extra attention
35130 2e 0a 2a 2f 0a 23 69 66 64 65 66 20 5f 57 49 4e  ..*/.#ifdef _WIN
35140 33 32 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  32.static void p
35150 72 69 6e 74 42 6f 6c 64 28 63 6f 6e 73 74 20 63  rintBold(const c
35160 68 61 72 20 2a 7a 54 65 78 74 29 7b 0a 20 20 48  har *zText){.  H
35170 41 4e 44 4c 45 20 6f 75 74 20 3d 20 47 65 74 53  ANDLE out = GetS
35180 74 64 48 61 6e 64 6c 65 28 53 54 44 5f 4f 55 54  tdHandle(STD_OUT
35190 50 55 54 5f 48 41 4e 44 4c 45 29 3b 0a 20 20 43  PUT_HANDLE);.  C
351a0 4f 4e 53 4f 4c 45 5f 53 43 52 45 45 4e 5f 42 55  ONSOLE_SCREEN_BU
351b0 46 46 45 52 5f 49 4e 46 4f 20 64 65 66 61 75 6c  FFER_INFO defaul
351c0 74 53 63 72 65 65 6e 49 6e 66 6f 3b 0a 20 20 47  tScreenInfo;.  G
351d0 65 74 43 6f 6e 73 6f 6c 65 53 63 72 65 65 6e 42  etConsoleScreenB
351e0 75 66 66 65 72 49 6e 66 6f 28 6f 75 74 2c 20 26  ufferInfo(out, &
351f0 64 65 66 61 75 6c 74 53 63 72 65 65 6e 49 6e 66  defaultScreenInf
35200 6f 29 3b 0a 20 20 53 65 74 43 6f 6e 73 6f 6c 65  o);.  SetConsole
35210 54 65 78 74 41 74 74 72 69 62 75 74 65 28 6f 75  TextAttribute(ou
35220 74 2c 0a 20 20 20 20 20 20 20 20 20 46 4f 52 45  t,.         FORE
35230 47 52 4f 55 4e 44 5f 52 45 44 7c 46 4f 52 45 47  GROUND_RED|FOREG
35240 52 4f 55 4e 44 5f 49 4e 54 45 4e 53 49 54 59 0a  ROUND_INTENSITY.
35250 20 20 29 3b 0a 20 20 70 72 69 6e 74 66 28 22 25    );.  printf("%
35260 73 22 2c 20 7a 54 65 78 74 29 3b 0a 20 20 53 65  s", zText);.  Se
35270 74 43 6f 6e 73 6f 6c 65 54 65 78 74 41 74 74 72  tConsoleTextAttr
35280 69 62 75 74 65 28 6f 75 74 2c 20 64 65 66 61 75  ibute(out, defau
35290 6c 74 53 63 72 65 65 6e 49 6e 66 6f 2e 77 41 74  ltScreenInfo.wAt
352a0 74 72 69 62 75 74 65 73 29 3b 0a 7d 0a 23 65 6c  tributes);.}.#el
352b0 73 65 0a 73 74 61 74 69 63 20 76 6f 69 64 20 70  se.static void p
352c0 72 69 6e 74 42 6f 6c 64 28 63 6f 6e 73 74 20 63  rintBold(const c
352d0 68 61 72 20 2a 7a 54 65 78 74 29 7b 0a 20 20 70  har *zText){.  p
352e0 72 69 6e 74 66 28 22 5c 30 33 33 5b 31 6d 25 73  rintf("\033[1m%s
352f0 5c 30 33 33 5b 30 6d 22 2c 20 7a 54 65 78 74 29  \033[0m", zText)
35300 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
35310 2a 20 47 65 74 20 74 68 65 20 61 72 67 75 6d 65  * Get the argume
35320 6e 74 20 74 6f 20 61 6e 20 2d 2d 6f 70 74 69 6f  nt to an --optio
35330 6e 2e 20 20 54 68 72 6f 77 20 61 6e 20 65 72 72  n.  Throw an err
35340 6f 72 20 61 6e 64 20 64 69 65 20 69 66 20 6e 6f  or and die if no
35350 20 61 72 67 75 6d 65 6e 74 0a 2a 2a 20 69 73 20   argument.** is 
35360 61 76 61 69 6c 61 62 6c 65 2e 0a 2a 2f 0a 73 74  available..*/.st
35370 61 74 69 63 20 63 68 61 72 20 2a 63 6d 64 6c 69  atic char *cmdli
35380 6e 65 5f 6f 70 74 69 6f 6e 5f 76 61 6c 75 65 28  ne_option_value(
35390 69 6e 74 20 61 72 67 63 2c 20 63 68 61 72 20 2a  int argc, char *
353a0 2a 61 72 67 76 2c 20 69 6e 74 20 69 29 7b 0a 20  *argv, int i){. 
353b0 20 69 66 28 20 69 3d 3d 61 72 67 63 20 29 7b 0a   if( i==argc ){.
353c0 20 20 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28      utf8_printf(
353d0 73 74 64 65 72 72 2c 20 22 25 73 3a 20 45 72 72  stderr, "%s: Err
353e0 6f 72 3a 20 6d 69 73 73 69 6e 67 20 61 72 67 75  or: missing argu
353f0 6d 65 6e 74 20 74 6f 20 25 73 5c 6e 22 2c 0a 20  ment to %s\n",. 
35400 20 20 20 20 20 20 20 20 20 20 20 61 72 67 76 5b             argv[
35410 30 5d 2c 20 61 72 67 76 5b 61 72 67 63 2d 31 5d  0], argv[argc-1]
35420 29 3b 0a 20 20 20 20 65 78 69 74 28 31 29 3b 0a  );.    exit(1);.
35430 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 72 67    }.  return arg
35440 76 5b 69 5d 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66  v[i];.}..#ifndef
35450 20 53 51 4c 49 54 45 5f 53 48 45 4c 4c 5f 49 53   SQLITE_SHELL_IS
35460 5f 55 54 46 38 0a 23 20 20 69 66 20 28 64 65 66  _UTF8.#  if (def
35470 69 6e 65 64 28 5f 57 49 4e 33 32 29 20 7c 7c 20  ined(_WIN32) || 
35480 64 65 66 69 6e 65 64 28 57 49 4e 33 32 29 29 20  defined(WIN32)) 
35490 26 26 20 64 65 66 69 6e 65 64 28 5f 4d 53 43 5f  && defined(_MSC_
354a0 56 45 52 29 0a 23 20 20 20 20 64 65 66 69 6e 65  VER).#    define
354b0 20 53 51 4c 49 54 45 5f 53 48 45 4c 4c 5f 49 53   SQLITE_SHELL_IS
354c0 5f 55 54 46 38 20 20 20 20 20 20 20 20 20 20 28  _UTF8          (
354d0 30 29 0a 23 20 20 65 6c 73 65 0a 23 20 20 20 20  0).#  else.#    
354e0 64 65 66 69 6e 65 20 53 51 4c 49 54 45 5f 53 48  define SQLITE_SH
354f0 45 4c 4c 5f 49 53 5f 55 54 46 38 20 20 20 20 20  ELL_IS_UTF8     
35500 20 20 20 20 20 28 31 29 0a 23 20 20 65 6e 64 69       (1).#  endi
35510 66 0a 23 65 6e 64 69 66 0a 0a 23 69 66 20 53 51  f.#endif..#if SQ
35520 4c 49 54 45 5f 53 48 45 4c 4c 5f 49 53 5f 55 54  LITE_SHELL_IS_UT
35530 46 38 0a 69 6e 74 20 53 51 4c 49 54 45 5f 43 44  F8.int SQLITE_CD
35540 45 43 4c 20 6d 61 69 6e 28 69 6e 74 20 61 72 67  ECL main(int arg
35550 63 2c 20 63 68 61 72 20 2a 2a 61 72 67 76 29 7b  c, char **argv){
35560 0a 23 65 6c 73 65 0a 69 6e 74 20 53 51 4c 49 54  .#else.int SQLIT
35570 45 5f 43 44 45 43 4c 20 77 6d 61 69 6e 28 69 6e  E_CDECL wmain(in
35580 74 20 61 72 67 63 2c 20 77 63 68 61 72 5f 74 20  t argc, wchar_t 
35590 2a 2a 77 61 72 67 76 29 7b 0a 20 20 63 68 61 72  **wargv){.  char
355a0 20 2a 2a 61 72 67 76 3b 0a 23 65 6e 64 69 66 0a   **argv;.#endif.
355b0 20 20 63 68 61 72 20 2a 7a 45 72 72 4d 73 67 20    char *zErrMsg 
355c0 3d 20 30 3b 0a 20 20 53 68 65 6c 6c 53 74 61 74  = 0;.  ShellStat
355d0 65 20 64 61 74 61 3b 0a 20 20 63 6f 6e 73 74 20  e data;.  const 
355e0 63 68 61 72 20 2a 7a 49 6e 69 74 46 69 6c 65 20  char *zInitFile 
355f0 3d 20 30 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  = 0;.  int i;.  
35600 69 6e 74 20 72 63 20 3d 20 30 3b 0a 20 20 69 6e  int rc = 0;.  in
35610 74 20 77 61 72 6e 49 6e 6d 65 6d 6f 72 79 44 62  t warnInmemoryDb
35620 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 61 64   = 0;.  int read
35630 53 74 64 69 6e 20 3d 20 31 3b 0a 20 20 69 6e 74  Stdin = 1;.  int
35640 20 6e 43 6d 64 20 3d 20 30 3b 0a 20 20 63 68 61   nCmd = 0;.  cha
35650 72 20 2a 2a 61 7a 43 6d 64 20 3d 20 30 3b 0a 0a  r **azCmd = 0;..
35660 20 20 73 65 74 42 69 6e 61 72 79 4d 6f 64 65 28    setBinaryMode(
35670 73 74 64 69 6e 2c 20 30 29 3b 0a 20 20 73 65 74  stdin, 0);.  set
35680 76 62 75 66 28 73 74 64 65 72 72 2c 20 30 2c 20  vbuf(stderr, 0, 
35690 5f 49 4f 4e 42 46 2c 20 30 29 3b 20 2f 2a 20 4d  _IONBF, 0); /* M
356a0 61 6b 65 20 73 75 72 65 20 73 74 64 65 72 72 20  ake sure stderr 
356b0 69 73 20 75 6e 62 75 66 66 65 72 65 64 20 2a 2f  is unbuffered */
356c0 0a 20 20 73 74 64 69 6e 5f 69 73 5f 69 6e 74 65  .  stdin_is_inte
356d0 72 61 63 74 69 76 65 20 3d 20 69 73 61 74 74 79  ractive = isatty
356e0 28 30 29 3b 0a 20 20 73 74 64 6f 75 74 5f 69 73  (0);.  stdout_is
356f0 5f 63 6f 6e 73 6f 6c 65 20 3d 20 69 73 61 74 74  _console = isatt
35700 79 28 31 29 3b 0a 0a 23 69 66 20 55 53 45 5f 53  y(1);..#if USE_S
35710 59 53 54 45 4d 5f 53 51 4c 49 54 45 2b 30 21 3d  YSTEM_SQLITE+0!=
35720 31 0a 20 20 69 66 28 20 73 74 72 6e 63 6d 70 28  1.  if( strncmp(
35730 73 71 6c 69 74 65 33 5f 73 6f 75 72 63 65 69 64  sqlite3_sourceid
35740 28 29 2c 53 51 4c 49 54 45 5f 53 4f 55 52 43 45  (),SQLITE_SOURCE
35750 5f 49 44 2c 36 30 29 21 3d 30 20 29 7b 0a 20 20  _ID,60)!=0 ){.  
35760 20 20 75 74 66 38 5f 70 72 69 6e 74 66 28 73 74    utf8_printf(st
35770 64 65 72 72 2c 20 22 53 51 4c 69 74 65 20 68 65  derr, "SQLite he
35780 61 64 65 72 20 61 6e 64 20 73 6f 75 72 63 65 20  ader and source 
35790 76 65 72 73 69 6f 6e 20 6d 69 73 6d 61 74 63 68  version mismatch
357a0 5c 6e 25 73 5c 6e 25 73 5c 6e 22 2c 0a 20 20 20  \n%s\n%s\n",.   
357b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
357c0 5f 73 6f 75 72 63 65 69 64 28 29 2c 20 53 51 4c  _sourceid(), SQL
357d0 49 54 45 5f 53 4f 55 52 43 45 5f 49 44 29 3b 0a  ITE_SOURCE_ID);.
357e0 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20 7d      exit(1);.  }
357f0 0a 23 65 6e 64 69 66 0a 20 20 6d 61 69 6e 5f 69  .#endif.  main_i
35800 6e 69 74 28 26 64 61 74 61 29 3b 0a 23 69 66 20  nit(&data);.#if 
35810 21 53 51 4c 49 54 45 5f 53 48 45 4c 4c 5f 49 53  !SQLITE_SHELL_IS
35820 5f 55 54 46 38 0a 20 20 73 71 6c 69 74 65 33 5f  _UTF8.  sqlite3_
35830 69 6e 69 74 69 61 6c 69 7a 65 28 29 3b 0a 20 20  initialize();.  
35840 61 72 67 76 20 3d 20 73 71 6c 69 74 65 33 5f 6d  argv = sqlite3_m
35850 61 6c 6c 6f 63 36 34 28 73 69 7a 65 6f 66 28 61  alloc64(sizeof(a
35860 72 67 76 5b 30 5d 29 2a 61 72 67 63 29 3b 0a 20  rgv[0])*argc);. 
35870 20 69 66 28 20 61 72 67 76 3d 3d 30 20 29 7b 0a   if( argv==0 ){.
35880 20 20 20 20 72 61 77 5f 70 72 69 6e 74 66 28 73      raw_printf(s
35890 74 64 65 72 72 2c 20 22 6f 75 74 20 6f 66 20 6d  tderr, "out of m
358a0 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20 20 20 20 65  emory\n");.    e
358b0 78 69 74 28 31 29 3b 0a 20 20 7d 0a 20 20 66 6f  xit(1);.  }.  fo
358c0 72 28 69 3d 30 3b 20 69 3c 61 72 67 63 3b 20 69  r(i=0; i<argc; i
358d0 2b 2b 29 7b 0a 20 20 20 20 61 72 67 76 5b 69 5d  ++){.    argv[i]
358e0 20 3d 20 73 71 6c 69 74 65 33 5f 77 69 6e 33 32   = sqlite3_win32
358f0 5f 75 6e 69 63 6f 64 65 5f 74 6f 5f 75 74 66 38  _unicode_to_utf8
35900 28 77 61 72 67 76 5b 69 5d 29 3b 0a 20 20 20 20  (wargv[i]);.    
35910 69 66 28 20 61 72 67 76 5b 69 5d 3d 3d 30 20 29  if( argv[i]==0 )
35920 7b 0a 20 20 20 20 20 20 72 61 77 5f 70 72 69 6e  {.      raw_prin
35930 74 66 28 73 74 64 65 72 72 2c 20 22 6f 75 74 20  tf(stderr, "out 
35940 6f 66 20 6d 65 6d 6f 72 79 5c 6e 22 29 3b 0a 20  of memory\n");. 
35950 20 20 20 20 20 65 78 69 74 28 31 29 3b 0a 20 20       exit(1);.  
35960 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
35970 20 61 73 73 65 72 74 28 20 61 72 67 63 3e 3d 31   assert( argc>=1
35980 20 26 26 20 61 72 67 76 20 26 26 20 61 72 67 76   && argv && argv
35990 5b 30 5d 20 29 3b 0a 20 20 41 72 67 76 30 20 3d  [0] );.  Argv0 =
359a0 20 61 72 67 76 5b 30 5d 3b 0a 0a 20 20 2f 2a 20   argv[0];..  /* 
359b0 4d 61 6b 65 20 73 75 72 65 20 77 65 20 68 61 76  Make sure we hav
359c0 65 20 61 20 76 61 6c 69 64 20 73 69 67 6e 61 6c  e a valid signal
359d0 20 68 61 6e 64 6c 65 72 20 65 61 72 6c 79 2c 20   handler early, 
359e0 62 65 66 6f 72 65 20 61 6e 79 74 68 69 6e 67 0a  before anything.
359f0 20 20 2a 2a 20 65 6c 73 65 20 69 73 20 64 6f 6e    ** else is don
35a00 65 2e 0a 20 20 2a 2f 0a 23 69 66 64 65 66 20 53  e..  */.#ifdef S
35a10 49 47 49 4e 54 0a 20 20 73 69 67 6e 61 6c 28 53  IGINT.  signal(S
35a20 49 47 49 4e 54 2c 20 69 6e 74 65 72 72 75 70 74  IGINT, interrupt
35a30 5f 68 61 6e 64 6c 65 72 29 3b 0a 23 65 6c 69 66  _handler);.#elif
35a40 20 28 64 65 66 69 6e 65 64 28 5f 57 49 4e 33 32   (defined(_WIN32
35a50 29 20 7c 7c 20 64 65 66 69 6e 65 64 28 57 49 4e  ) || defined(WIN
35a60 33 32 29 29 20 26 26 20 21 64 65 66 69 6e 65 64  32)) && !defined
35a70 28 5f 57 49 4e 33 32 5f 57 43 45 29 0a 20 20 53  (_WIN32_WCE).  S
35a80 65 74 43 6f 6e 73 6f 6c 65 43 74 72 6c 48 61 6e  etConsoleCtrlHan
35a90 64 6c 65 72 28 43 6f 6e 73 6f 6c 65 43 74 72 6c  dler(ConsoleCtrl
35aa0 48 61 6e 64 6c 65 72 2c 20 54 52 55 45 29 3b 0a  Handler, TRUE);.
35ab0 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20 53  #endif..#ifdef S
35ac0 51 4c 49 54 45 5f 53 48 45 4c 4c 5f 44 42 4e 41  QLITE_SHELL_DBNA
35ad0 4d 45 5f 50 52 4f 43 0a 20 20 7b 0a 20 20 20 20  ME_PROC.  {.    
35ae0 2f 2a 20 49 66 20 74 68 65 20 53 51 4c 49 54 45  /* If the SQLITE
35af0 5f 53 48 45 4c 4c 5f 44 42 4e 41 4d 45 5f 50 52  _SHELL_DBNAME_PR
35b00 4f 43 20 6d 61 63 72 6f 20 69 73 20 64 65 66 69  OC macro is defi
35b10 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ned, then it is 
35b20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 2a 2a 20  the name.    ** 
35b30 6f 66 20 61 20 43 2d 66 75 6e 63 74 69 6f 6e 20  of a C-function 
35b40 74 68 61 74 20 77 69 6c 6c 20 70 72 6f 76 69 64  that will provid
35b50 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  e the name of th
35b60 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 2e  e database file.
35b70 20 20 55 73 65 0a 20 20 20 20 2a 2a 20 74 68 69    Use.    ** thi
35b80 73 20 63 6f 6d 70 69 6c 65 2d 74 69 6d 65 20 6f  s compile-time o
35b90 70 74 69 6f 6e 20 74 6f 20 65 6d 62 65 64 20 74  ption to embed t
35ba0 68 69 73 20 73 68 65 6c 6c 20 70 72 6f 67 72 61  his shell progra
35bb0 6d 20 69 6e 20 6c 61 72 67 65 72 0a 20 20 20 20  m in larger.    
35bc0 2a 2a 20 61 70 70 6c 69 63 61 74 69 6f 6e 73 2e  ** applications.
35bd0 20 2a 2f 0a 20 20 20 20 65 78 74 65 72 6e 20 76   */.    extern v
35be0 6f 69 64 20 53 51 4c 49 54 45 5f 53 48 45 4c 4c  oid SQLITE_SHELL
35bf0 5f 44 42 4e 41 4d 45 5f 50 52 4f 43 28 63 6f 6e  _DBNAME_PROC(con
35c00 73 74 20 63 68 61 72 2a 2a 29 3b 0a 20 20 20 20  st char**);.    
35c10 53 51 4c 49 54 45 5f 53 48 45 4c 4c 5f 44 42 4e  SQLITE_SHELL_DBN
35c20 41 4d 45 5f 50 52 4f 43 28 26 64 61 74 61 2e 7a  AME_PROC(&data.z
35c30 44 62 46 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20  DbFilename);.   
35c40 20 77 61 72 6e 49 6e 6d 65 6d 6f 72 79 44 62 20   warnInmemoryDb 
35c50 3d 20 30 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a  = 0;.  }.#endif.
35c60 0a 20 20 2f 2a 20 44 6f 20 61 6e 20 69 6e 69 74  .  /* Do an init
35c70 69 61 6c 20 70 61 73 73 20 74 68 72 6f 75 67 68  ial pass through
35c80 20 74 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e   the command-lin
35c90 65 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6c 6f  e argument to lo
35ca0 63 61 74 65 0a 20 20 2a 2a 20 74 68 65 20 6e 61  cate.  ** the na
35cb0 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
35cc0 73 65 20 66 69 6c 65 2c 20 74 68 65 20 6e 61 6d  se file, the nam
35cd0 65 20 6f 66 20 74 68 65 20 69 6e 69 74 69 61 6c  e of the initial
35ce0 69 7a 61 74 69 6f 6e 20 66 69 6c 65 2c 0a 20 20  ization file,.  
35cf0 2a 2a 20 74 68 65 20 73 69 7a 65 20 6f 66 20 74  ** the size of t
35d00 68 65 20 61 6c 74 65 72 6e 61 74 69 76 65 20 6d  he alternative m
35d10 61 6c 6c 6f 63 20 68 65 61 70 2c 0a 20 20 2a 2a  alloc heap,.  **
35d20 20 61 6e 64 20 74 68 65 20 66 69 72 73 74 20 63   and the first c
35d30 6f 6d 6d 61 6e 64 20 74 6f 20 65 78 65 63 75 74  ommand to execut
35d40 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  e..  */.  for(i=
35d50 31 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b  1; i<argc; i++){
35d60 0a 20 20 20 20 63 68 61 72 20 2a 7a 3b 0a 20 20  .    char *z;.  
35d70 20 20 7a 20 3d 20 61 72 67 76 5b 69 5d 3b 0a 20    z = argv[i];. 
35d80 20 20 20 69 66 28 20 7a 5b 30 5d 21 3d 27 2d 27     if( z[0]!='-'
35d90 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 64 61   ){.      if( da
35da0 74 61 2e 7a 44 62 46 69 6c 65 6e 61 6d 65 3d 3d  ta.zDbFilename==
35db0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 64 61 74  0 ){.        dat
35dc0 61 2e 7a 44 62 46 69 6c 65 6e 61 6d 65 20 3d 20  a.zDbFilename = 
35dd0 7a 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  z;.      }else{.
35de0 20 20 20 20 20 20 20 20 2f 2a 20 45 78 63 65 73          /* Exces
35df0 73 73 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  ss arguments are
35e00 20 69 6e 74 65 72 70 72 65 74 65 64 20 61 73 20   interpreted as 
35e10 53 51 4c 20 28 6f 72 20 64 6f 74 2d 63 6f 6d 6d  SQL (or dot-comm
35e20 61 6e 64 73 29 20 61 6e 64 0a 20 20 20 20 20 20  ands) and.      
35e30 20 20 2a 2a 20 6d 65 61 6e 20 74 68 61 74 20 6e    ** mean that n
35e40 6f 74 68 69 6e 67 20 69 73 20 72 65 61 64 20 66  othing is read f
35e50 72 6f 6d 20 73 74 64 69 6e 20 2a 2f 0a 20 20 20  rom stdin */.   
35e60 20 20 20 20 20 72 65 61 64 53 74 64 69 6e 20 3d       readStdin =
35e70 20 30 3b 0a 20 20 20 20 20 20 20 20 6e 43 6d 64   0;.        nCmd
35e80 2b 2b 3b 0a 20 20 20 20 20 20 20 20 61 7a 43 6d  ++;.        azCm
35e90 64 20 3d 20 72 65 61 6c 6c 6f 63 28 61 7a 43 6d  d = realloc(azCm
35ea0 64 2c 20 73 69 7a 65 6f 66 28 61 7a 43 6d 64 5b  d, sizeof(azCmd[
35eb0 30 5d 29 2a 6e 43 6d 64 29 3b 0a 20 20 20 20 20  0])*nCmd);.     
35ec0 20 20 20 69 66 28 20 61 7a 43 6d 64 3d 3d 30 20     if( azCmd==0 
35ed0 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72 61 77  ){.          raw
35ee0 5f 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20  _printf(stderr, 
35ef0 22 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 5c 6e  "out of memory\n
35f00 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 65 78  ");.          ex
35f10 69 74 28 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  it(1);.        }
35f20 0a 20 20 20 20 20 20 20 20 61 7a 43 6d 64 5b 6e  .        azCmd[n
35f30 43 6d 64 2d 31 5d 20 3d 20 7a 3b 0a 20 20 20 20  Cmd-1] = z;.    
35f40 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66    }.    }.    if
35f50 28 20 7a 5b 31 5d 3d 3d 27 2d 27 20 29 20 7a 2b  ( z[1]=='-' ) z+
35f60 2b 3b 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d  +;.    if( strcm
35f70 70 28 7a 2c 22 2d 73 65 70 61 72 61 74 6f 72 22  p(z,"-separator"
35f80 29 3d 3d 30 0a 20 20 20 20 20 7c 7c 20 73 74 72  )==0.     || str
35f90 63 6d 70 28 7a 2c 22 2d 6e 75 6c 6c 76 61 6c 75  cmp(z,"-nullvalu
35fa0 65 22 29 3d 3d 30 0a 20 20 20 20 20 7c 7c 20 73  e")==0.     || s
35fb0 74 72 63 6d 70 28 7a 2c 22 2d 6e 65 77 6c 69 6e  trcmp(z,"-newlin
35fc0 65 22 29 3d 3d 30 0a 20 20 20 20 20 7c 7c 20 73  e")==0.     || s
35fd0 74 72 63 6d 70 28 7a 2c 22 2d 63 6d 64 22 29 3d  trcmp(z,"-cmd")=
35fe0 3d 30 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20  =0.    ){.      
35ff0 28 76 6f 69 64 29 63 6d 64 6c 69 6e 65 5f 6f 70  (void)cmdline_op
36000 74 69 6f 6e 5f 76 61 6c 75 65 28 61 72 67 63 2c  tion_value(argc,
36010 20 61 72 67 76 2c 20 2b 2b 69 29 3b 0a 20 20 20   argv, ++i);.   
36020 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
36030 70 28 7a 2c 22 2d 69 6e 69 74 22 29 3d 3d 30 20  p(z,"-init")==0 
36040 29 7b 0a 20 20 20 20 20 20 7a 49 6e 69 74 46 69  ){.      zInitFi
36050 6c 65 20 3d 20 63 6d 64 6c 69 6e 65 5f 6f 70 74  le = cmdline_opt
36060 69 6f 6e 5f 76 61 6c 75 65 28 61 72 67 63 2c 20  ion_value(argc, 
36070 61 72 67 76 2c 20 2b 2b 69 29 3b 0a 20 20 20 20  argv, ++i);.    
36080 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70  }else if( strcmp
36090 28 7a 2c 22 2d 62 61 74 63 68 22 29 3d 3d 30 20  (z,"-batch")==0 
360a0 29 7b 0a 20 20 20 20 20 20 2f 2a 20 4e 65 65 64  ){.      /* Need
360b0 20 74 6f 20 63 68 65 63 6b 20 66 6f 72 20 62 61   to check for ba
360c0 74 63 68 20 6d 6f 64 65 20 68 65 72 65 20 74 6f  tch mode here to
360d0 20 73 6f 20 77 65 20 63 61 6e 20 61 76 6f 69 64   so we can avoid
360e0 20 70 72 69 6e 74 69 6e 67 0a 20 20 20 20 20 20   printing.      
360f0 2a 2a 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 61 6c  ** informational
36100 20 6d 65 73 73 61 67 65 73 20 28 6c 69 6b 65 20   messages (like 
36110 66 72 6f 6d 20 70 72 6f 63 65 73 73 5f 73 71 6c  from process_sql
36120 69 74 65 72 63 29 20 62 65 66 6f 72 65 0a 20 20  iterc) before.  
36130 20 20 20 20 2a 2a 20 77 65 20 64 6f 20 74 68 65      ** we do the
36140 20 61 63 74 75 61 6c 20 70 72 6f 63 65 73 73 69   actual processi
36150 6e 67 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  ng of arguments 
36160 6c 61 74 65 72 20 69 6e 20 61 20 73 65 63 6f 6e  later in a secon
36170 64 20 70 61 73 73 2e 0a 20 20 20 20 20 20 2a 2f  d pass..      */
36180 0a 20 20 20 20 20 20 73 74 64 69 6e 5f 69 73 5f  .      stdin_is_
36190 69 6e 74 65 72 61 63 74 69 76 65 20 3d 20 30 3b  interactive = 0;
361a0 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
361b0 74 72 63 6d 70 28 7a 2c 22 2d 68 65 61 70 22 29  trcmp(z,"-heap")
361c0 3d 3d 30 20 29 7b 0a 23 69 66 20 64 65 66 69 6e  ==0 ){.#if defin
361d0 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
361e0 5f 4d 45 4d 53 59 53 33 29 20 7c 7c 20 64 65 66  _MEMSYS3) || def
361f0 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
36200 4c 45 5f 4d 45 4d 53 59 53 35 29 0a 20 20 20 20  LE_MEMSYS5).    
36210 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53    const char *zS
36220 69 7a 65 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ize;.      sqlit
36230 65 33 5f 69 6e 74 36 34 20 73 7a 48 65 61 70 3b  e3_int64 szHeap;
36240 0a 0a 20 20 20 20 20 20 7a 53 69 7a 65 20 3d 20  ..      zSize = 
36250 63 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f 6e 5f 76  cmdline_option_v
36260 61 6c 75 65 28 61 72 67 63 2c 20 61 72 67 76 2c  alue(argc, argv,
36270 20 2b 2b 69 29 3b 0a 20 20 20 20 20 20 73 7a 48   ++i);.      szH
36280 65 61 70 20 3d 20 69 6e 74 65 67 65 72 56 61 6c  eap = integerVal
36290 75 65 28 7a 53 69 7a 65 29 3b 0a 20 20 20 20 20  ue(zSize);.     
362a0 20 69 66 28 20 73 7a 48 65 61 70 3e 30 78 37 66   if( szHeap>0x7f
362b0 66 66 30 30 30 30 20 29 20 73 7a 48 65 61 70 20  ff0000 ) szHeap 
362c0 3d 20 30 78 37 66 66 66 30 30 30 30 3b 0a 20 20  = 0x7fff0000;.  
362d0 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e 66      sqlite3_conf
362e0 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49 47  ig(SQLITE_CONFIG
362f0 5f 48 45 41 50 2c 20 6d 61 6c 6c 6f 63 28 28 69  _HEAP, malloc((i
36300 6e 74 29 73 7a 48 65 61 70 29 2c 20 28 69 6e 74  nt)szHeap), (int
36310 29 73 7a 48 65 61 70 2c 20 36 34 29 3b 0a 23 65  )szHeap, 64);.#e
36320 6c 73 65 0a 20 20 20 20 20 20 28 76 6f 69 64 29  lse.      (void)
36330 63 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f 6e 5f 76  cmdline_option_v
36340 61 6c 75 65 28 61 72 67 63 2c 20 61 72 67 76 2c  alue(argc, argv,
36350 20 2b 2b 69 29 3b 0a 23 65 6e 64 69 66 0a 20 20   ++i);.#endif.  
36360 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
36370 6d 70 28 7a 2c 22 2d 70 61 67 65 63 61 63 68 65  mp(z,"-pagecache
36380 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
36390 6e 74 20 6e 2c 20 73 7a 3b 0a 20 20 20 20 20 20  nt n, sz;.      
363a0 73 7a 20 3d 20 28 69 6e 74 29 69 6e 74 65 67 65  sz = (int)intege
363b0 72 56 61 6c 75 65 28 63 6d 64 6c 69 6e 65 5f 6f  rValue(cmdline_o
363c0 70 74 69 6f 6e 5f 76 61 6c 75 65 28 61 72 67 63  ption_value(argc
363d0 2c 61 72 67 76 2c 2b 2b 69 29 29 3b 0a 20 20 20  ,argv,++i));.   
363e0 20 20 20 69 66 28 20 73 7a 3e 37 30 30 30 30 20     if( sz>70000 
363f0 29 20 73 7a 20 3d 20 37 30 30 30 30 3b 0a 20 20  ) sz = 70000;.  
36400 20 20 20 20 69 66 28 20 73 7a 3c 30 20 29 20 73      if( sz<0 ) s
36410 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 20 3d  z = 0;.      n =
36420 20 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c   (int)integerVal
36430 75 65 28 63 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f  ue(cmdline_optio
36440 6e 5f 76 61 6c 75 65 28 61 72 67 63 2c 61 72 67  n_value(argc,arg
36450 76 2c 2b 2b 69 29 29 3b 0a 20 20 20 20 20 20 73  v,++i));.      s
36460 71 6c 69 74 65 33 5f 63 6f 6e 66 69 67 28 53 51  qlite3_config(SQ
36470 4c 49 54 45 5f 43 4f 4e 46 49 47 5f 50 41 47 45  LITE_CONFIG_PAGE
36480 43 41 43 48 45 2c 0a 20 20 20 20 20 20 20 20 20  CACHE,.         
36490 20 20 20 20 20 20 20 20 20 20 20 28 6e 3e 30 20             (n>0 
364a0 26 26 20 73 7a 3e 30 29 20 3f 20 6d 61 6c 6c 6f  && sz>0) ? mallo
364b0 63 28 6e 2a 73 7a 29 20 3a 20 30 2c 20 73 7a 2c  c(n*sz) : 0, sz,
364c0 20 6e 29 3b 0a 20 20 20 20 20 20 64 61 74 61 2e   n);.      data.
364d0 73 68 65 6c 6c 46 6c 67 73 20 7c 3d 20 53 48 46  shellFlgs |= SHF
364e0 4c 47 5f 50 61 67 65 63 61 63 68 65 3b 0a 20 20  LG_Pagecache;.  
364f0 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
36500 6d 70 28 7a 2c 22 2d 6c 6f 6f 6b 61 73 69 64 65  mp(z,"-lookaside
36510 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 69  ")==0 ){.      i
36520 6e 74 20 6e 2c 20 73 7a 3b 0a 20 20 20 20 20 20  nt n, sz;.      
36530 73 7a 20 3d 20 28 69 6e 74 29 69 6e 74 65 67 65  sz = (int)intege
36540 72 56 61 6c 75 65 28 63 6d 64 6c 69 6e 65 5f 6f  rValue(cmdline_o
36550 70 74 69 6f 6e 5f 76 61 6c 75 65 28 61 72 67 63  ption_value(argc
36560 2c 61 72 67 76 2c 2b 2b 69 29 29 3b 0a 20 20 20  ,argv,++i));.   
36570 20 20 20 69 66 28 20 73 7a 3c 30 20 29 20 73 7a     if( sz<0 ) sz
36580 20 3d 20 30 3b 0a 20 20 20 20 20 20 6e 20 3d 20   = 0;.      n = 
36590 28 69 6e 74 29 69 6e 74 65 67 65 72 56 61 6c 75  (int)integerValu
365a0 65 28 63 6d 64 6c 69 6e 65 5f 6f 70 74 69 6f 6e  e(cmdline_option
365b0 5f 76 61 6c 75 65 28 61 72 67 63 2c 61 72 67 76  _value(argc,argv
365c0 2c 2b 2b 69 29 29 3b 0a 20 20 20 20 20 20 69 66  ,++i));.      if
365d0 28 20 6e 3c 30 20 29 20 6e 20 3d 20 30 3b 0a 20  ( n<0 ) n = 0;. 
365e0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f 6e       sqlite3_con
365f0 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46 49  fig(SQLITE_CONFI
36600 47 5f 4c 4f 4f 4b 41 53 49 44 45 2c 20 73 7a 2c  G_LOOKASIDE, sz,
36610 20 6e 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73   n);.      if( s
36620 7a 2a 6e 3d 3d 30 20 29 20 64 61 74 61 2e 73 68  z*n==0 ) data.sh
36630 65 6c 6c 46 6c 67 73 20 26 3d 20 7e 53 48 46 4c  ellFlgs &= ~SHFL
36640 47 5f 4c 6f 6f 6b 61 73 69 64 65 3b 0a 23 69 66  G_Lookaside;.#if
36650 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
36660 45 5f 56 46 53 54 52 41 43 45 0a 20 20 20 20 7d  E_VFSTRACE.    }
36670 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
36680 7a 2c 22 2d 76 66 73 74 72 61 63 65 22 29 3d 3d  z,"-vfstrace")==
36690 30 20 29 7b 0a 20 20 20 20 20 20 65 78 74 65 72  0 ){.      exter
366a0 6e 20 69 6e 74 20 76 66 73 74 72 61 63 65 5f 72  n int vfstrace_r
366b0 65 67 69 73 74 65 72 28 0a 20 20 20 20 20 20 20  egister(.       
366c0 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
366d0 72 61 63 65 4e 61 6d 65 2c 0a 20 20 20 20 20 20  raceName,.      
366e0 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
366f0 4f 6c 64 56 66 73 4e 61 6d 65 2c 0a 20 20 20 20  OldVfsName,.    
36700 20 20 20 20 20 69 6e 74 20 28 2a 78 4f 75 74 29       int (*xOut)
36710 28 63 6f 6e 73 74 20 63 68 61 72 2a 2c 76 6f 69  (const char*,voi
36720 64 2a 29 2c 0a 20 20 20 20 20 20 20 20 20 76 6f  d*),.         vo
36730 69 64 20 2a 70 4f 75 74 41 72 67 2c 0a 20 20 20  id *pOutArg,.   
36740 20 20 20 20 20 20 69 6e 74 20 6d 61 6b 65 44 65        int makeDe
36750 66 61 75 6c 74 0a 20 20 20 20 20 20 29 3b 0a 20  fault.      );. 
36760 20 20 20 20 20 76 66 73 74 72 61 63 65 5f 72 65       vfstrace_re
36770 67 69 73 74 65 72 28 22 74 72 61 63 65 22 2c 30  gister("trace",0
36780 2c 28 69 6e 74 28 2a 29 28 63 6f 6e 73 74 20 63  ,(int(*)(const c
36790 68 61 72 2a 2c 76 6f 69 64 2a 29 29 66 70 75 74  har*,void*))fput
367a0 73 2c 73 74 64 65 72 72 2c 31 29 3b 0a 23 65 6e  s,stderr,1);.#en
367b0 64 69 66 0a 23 69 66 64 65 66 20 53 51 4c 49 54  dif.#ifdef SQLIT
367c0 45 5f 45 4e 41 42 4c 45 5f 4d 55 4c 54 49 50 4c  E_ENABLE_MULTIPL
367d0 45 58 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  EX.    }else if(
367e0 20 73 74 72 63 6d 70 28 7a 2c 22 2d 6d 75 6c 74   strcmp(z,"-mult
367f0 69 70 6c 65 78 22 29 3d 3d 30 20 29 7b 0a 20 20  iplex")==0 ){.  
36800 20 20 20 20 65 78 74 65 72 6e 20 69 6e 74 20 73      extern int s
36810 71 6c 69 74 65 33 5f 6d 75 6c 74 69 70 6c 65 5f  qlite3_multiple_
36820 69 6e 69 74 69 61 6c 69 7a 65 28 63 6f 6e 73 74  initialize(const
36830 20 63 68 61 72 2a 2c 69 6e 74 29 3b 0a 20 20 20   char*,int);.   
36840 20 20 20 73 71 6c 69 74 65 33 5f 6d 75 6c 74 69     sqlite3_multi
36850 70 6c 65 78 5f 69 6e 69 74 69 61 6c 69 7a 65 28  plex_initialize(
36860 30 2c 20 31 29 3b 0a 23 65 6e 64 69 66 0a 20 20  0, 1);.#endif.  
36870 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63    }else if( strc
36880 6d 70 28 7a 2c 22 2d 6d 6d 61 70 22 29 3d 3d 30  mp(z,"-mmap")==0
36890 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
368a0 33 5f 69 6e 74 36 34 20 73 7a 20 3d 20 69 6e 74  3_int64 sz = int
368b0 65 67 65 72 56 61 6c 75 65 28 63 6d 64 6c 69 6e  egerValue(cmdlin
368c0 65 5f 6f 70 74 69 6f 6e 5f 76 61 6c 75 65 28 61  e_option_value(a
368d0 72 67 63 2c 61 72 67 76 2c 2b 2b 69 29 29 3b 0a  rgc,argv,++i));.
368e0 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 63 6f        sqlite3_co
368f0 6e 66 69 67 28 53 51 4c 49 54 45 5f 43 4f 4e 46  nfig(SQLITE_CONF
36900 49 47 5f 4d 4d 41 50 5f 53 49 5a 45 2c 20 73 7a  IG_MMAP_SIZE, sz
36910 2c 20 73 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65  , sz);.    }else
36920 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d   if( strcmp(z,"-
36930 76 66 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  vfs")==0 ){.    
36940 20 20 73 71 6c 69 74 65 33 5f 76 66 73 20 2a 70    sqlite3_vfs *p
36950 56 66 73 20 3d 20 73 71 6c 69 74 65 33 5f 76 66  Vfs = sqlite3_vf
36960 73 5f 66 69 6e 64 28 63 6d 64 6c 69 6e 65 5f 6f  s_find(cmdline_o
36970 70 74 69 6f 6e 5f 76 61 6c 75 65 28 61 72 67 63  ption_value(argc
36980 2c 61 72 67 76 2c 2b 2b 69 29 29 3b 0a 20 20 20  ,argv,++i));.   
36990 20 20 20 69 66 28 20 70 56 66 73 20 29 7b 0a 20     if( pVfs ){. 
369a0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 76         sqlite3_v
369b0 66 73 5f 72 65 67 69 73 74 65 72 28 70 56 66 73  fs_register(pVfs
369c0 2c 20 31 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 1);.      }els
369d0 65 7b 0a 20 20 20 20 20 20 20 20 75 74 66 38 5f  e{.        utf8_
369e0 70 72 69 6e 74 66 28 73 74 64 65 72 72 2c 20 22  printf(stderr, "
369f0 6e 6f 20 73 75 63 68 20 56 46 53 3a 20 5c 22 25  no such VFS: \"%
36a00 73 5c 22 5c 6e 22 2c 20 61 72 67 76 5b 69 5d 29  s\"\n", argv[i])
36a10 3b 0a 20 20 20 20 20 20 20 20 65 78 69 74 28 31  ;.        exit(1
36a20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
36a30 0a 20 20 7d 0a 20 20 69 66 28 20 64 61 74 61 2e  .  }.  if( data.
36a40 7a 44 62 46 69 6c 65 6e 61 6d 65 3d 3d 30 20 29  zDbFilename==0 )
36a50 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
36a60 5f 4f 4d 49 54 5f 4d 45 4d 4f 52 59 44 42 0a 20  _OMIT_MEMORYDB. 
36a70 20 20 20 64 61 74 61 2e 7a 44 62 46 69 6c 65 6e     data.zDbFilen
36a80 61 6d 65 20 3d 20 22 3a 6d 65 6d 6f 72 79 3a 22  ame = ":memory:"
36a90 3b 0a 20 20 20 20 77 61 72 6e 49 6e 6d 65 6d 6f  ;.    warnInmemo
36aa0 72 79 44 62 20 3d 20 61 72 67 63 3d 3d 31 3b 0a  ryDb = argc==1;.
36ab0 23 65 6c 73 65 0a 20 20 20 20 75 74 66 38 5f 70  #else.    utf8_p
36ac0 72 69 6e 74 66 28 73 74 64 65 72 72 2c 22 25 73  rintf(stderr,"%s
36ad0 3a 20 45 72 72 6f 72 3a 20 6e 6f 20 64 61 74 61  : Error: no data
36ae0 62 61 73 65 20 66 69 6c 65 6e 61 6d 65 20 73 70  base filename sp
36af0 65 63 69 66 69 65 64 5c 6e 22 2c 20 41 72 67 76  ecified\n", Argv
36b00 30 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  0);.    return 1
36b10 3b 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20 64  ;.#endif.  }.  d
36b20 61 74 61 2e 6f 75 74 20 3d 20 73 74 64 6f 75 74  ata.out = stdout
36b30 3b 0a 0a 20 20 2f 2a 20 47 6f 20 61 68 65 61 64  ;..  /* Go ahead
36b40 20 61 6e 64 20 6f 70 65 6e 20 74 68 65 20 64 61   and open the da
36b50 74 61 62 61 73 65 20 66 69 6c 65 20 69 66 20 69  tabase file if i
36b60 74 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  t already exists
36b70 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 66  .  If the.  ** f
36b80 69 6c 65 20 64 6f 65 73 20 6e 6f 74 20 65 78 69  ile does not exi
36b90 73 74 2c 20 64 65 6c 61 79 20 6f 70 65 6e 69 6e  st, delay openin
36ba0 67 20 69 74 2e 20 20 54 68 69 73 20 70 72 65 76  g it.  This prev
36bb0 65 6e 74 73 20 65 6d 70 74 79 20 64 61 74 61 62  ents empty datab
36bc0 61 73 65 0a 20 20 2a 2a 20 66 69 6c 65 73 20 66  ase.  ** files f
36bd0 72 6f 6d 20 62 65 69 6e 67 20 63 72 65 61 74 65  rom being create
36be0 64 20 69 66 20 61 20 75 73 65 72 20 6d 69 73 74  d if a user mist
36bf0 79 70 65 73 20 74 68 65 20 64 61 74 61 62 61 73  ypes the databas
36c00 65 20 6e 61 6d 65 20 61 72 67 75 6d 65 6e 74 0a  e name argument.
36c10 20 20 2a 2a 20 74 6f 20 74 68 65 20 73 71 6c 69    ** to the sqli
36c20 74 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65 20  te command-line 
36c30 74 6f 6f 6c 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  tool..  */.  if(
36c40 20 61 63 63 65 73 73 28 64 61 74 61 2e 7a 44 62   access(data.zDb
36c50 46 69 6c 65 6e 61 6d 65 2c 20 30 29 3d 3d 30 20  Filename, 0)==0 
36c60 29 7b 0a 20 20 20 20 6f 70 65 6e 5f 64 62 28 26  ){.    open_db(&
36c70 64 61 74 61 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20  data, 0);.  }.. 
36c80 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20   /* Process the 
36c90 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66  initialization f
36ca0 69 6c 65 20 69 66 20 74 68 65 72 65 20 69 73 20  ile if there is 
36cb0 6f 6e 65 2e 20 20 49 66 20 6e 6f 20 2d 69 6e 69  one.  If no -ini
36cc0 74 20 6f 70 74 69 6f 6e 0a 20 20 2a 2a 20 69 73  t option.  ** is
36cd0 20 67 69 76 65 6e 20 6f 6e 20 74 68 65 20 63 6f   given on the co
36ce0 6d 6d 61 6e 64 20 6c 69 6e 65 2c 20 6c 6f 6f 6b  mmand line, look
36cf0 20 66 6f 72 20 61 20 66 69 6c 65 20 6e 61 6d 65   for a file name
36d00 64 20 7e 2f 2e 73 71 6c 69 74 65 72 63 20 61 6e  d ~/.sqliterc an
36d10 64 0a 20 20 2a 2a 20 74 72 79 20 74 6f 20 70 72  d.  ** try to pr
36d20 6f 63 65 73 73 20 69 74 2e 0a 20 20 2a 2f 0a 20  ocess it..  */. 
36d30 20 70 72 6f 63 65 73 73 5f 73 71 6c 69 74 65 72   process_sqliter
36d40 63 28 26 64 61 74 61 2c 7a 49 6e 69 74 46 69 6c  c(&data,zInitFil
36d50 65 29 3b 0a 0a 20 20 2f 2a 20 4d 61 6b 65 20 61  e);..  /* Make a
36d60 20 73 65 63 6f 6e 64 20 70 61 73 73 20 74 68 72   second pass thr
36d70 6f 75 67 68 20 74 68 65 20 63 6f 6d 6d 61 6e 64  ough the command
36d80 2d 6c 69 6e 65 20 61 72 67 75 6d 65 6e 74 20 61  -line argument a
36d90 6e 64 20 73 65 74 0a 20 20 2a 2a 20 6f 70 74 69  nd set.  ** opti
36da0 6f 6e 73 2e 20 20 54 68 69 73 20 73 65 63 6f 6e  ons.  This secon
36db0 64 20 70 61 73 73 20 69 73 20 64 65 6c 61 79 65  d pass is delaye
36dc0 64 20 75 6e 74 69 6c 20 61 66 74 65 72 20 74 68  d until after th
36dd0 65 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  e initialization
36de0 0a 20 20 2a 2a 20 66 69 6c 65 20 69 73 20 70 72  .  ** file is pr
36df0 6f 63 65 73 73 65 64 20 73 6f 20 74 68 61 74 20  ocessed so that 
36e00 74 68 65 20 63 6f 6d 6d 61 6e 64 2d 6c 69 6e 65  the command-line
36e10 20 61 72 67 75 6d 65 6e 74 73 20 77 69 6c 6c 20   arguments will 
36e20 6f 76 65 72 72 69 64 65 0a 20 20 2a 2a 20 73 65  override.  ** se
36e30 74 74 69 6e 67 73 20 69 6e 20 74 68 65 20 69 6e  ttings in the in
36e40 69 74 69 61 6c 69 7a 61 74 69 6f 6e 20 66 69 6c  itialization fil
36e50 65 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  e..  */.  for(i=
36e60 31 3b 20 69 3c 61 72 67 63 3b 20 69 2b 2b 29 7b  1; i<argc; i++){
36e70 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 61  .    char *z = a
36e80 72 67 76 5b 69 5d 3b 0a 20 20 20 20 69 66 28 20  rgv[i];.    if( 
36e90 7a 5b 30 5d 21 3d 27 2d 27 20 29 20 63 6f 6e 74  z[0]!='-' ) cont
36ea0 69 6e 75 65 3b 0a 20 20 20 20 69 66 28 20 7a 5b  inue;.    if( z[
36eb0 31 5d 3d 3d 27 2d 27 20 29 7b 20 7a 2b 2b 3b 20  1]=='-' ){ z++; 
36ec0 7d 0a 20 20 20 20 69 66 28 20 73 74 72 63 6d 70  }.    if( strcmp
36ed0 28 7a 2c 22 2d 69 6e 69 74 22 29 3d 3d 30 20 29  (z,"-init")==0 )
36ee0 7b 0a 20 20 20 20 20 20 69 2b 2b 3b 0a 20 20 20  {.      i++;.   
36ef0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
36f00 70 28 7a 2c 22 2d 68 74 6d 6c 22 29 3d 3d 30 20  p(z,"-html")==0 
36f10 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 6d 6f  ){.      data.mo
36f20 64 65 20 3d 20 4d 4f 44 45 5f 48 74 6d 6c 3b 0a  de = MODE_Html;.
36f30 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
36f40 72 63 6d 70 28 7a 2c 22 2d 6c 69 73 74 22 29 3d  rcmp(z,"-list")=
36f50 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61  =0 ){.      data
36f60 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 4c 69 73  .mode = MODE_Lis
36f70 74 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  t;.    }else if(
36f80 20 73 74 72 63 6d 70 28 7a 2c 22 2d 71 75 6f 74   strcmp(z,"-quot
36f90 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
36fa0 64 61 74 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45  data.mode = MODE
36fb0 5f 51 75 6f 74 65 3b 0a 20 20 20 20 7d 65 6c 73  _Quote;.    }els
36fc0 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22  e if( strcmp(z,"
36fd0 2d 6c 69 6e 65 22 29 3d 3d 30 20 29 7b 0a 20 20  -line")==0 ){.  
36fe0 20 20 20 20 64 61 74 61 2e 6d 6f 64 65 20 3d 20      data.mode = 
36ff0 4d 4f 44 45 5f 4c 69 6e 65 3b 0a 20 20 20 20 7d  MODE_Line;.    }
37000 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28  else if( strcmp(
37010 7a 2c 22 2d 63 6f 6c 75 6d 6e 22 29 3d 3d 30 20  z,"-column")==0 
37020 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e 6d 6f  ){.      data.mo
37030 64 65 20 3d 20 4d 4f 44 45 5f 43 6f 6c 75 6d 6e  de = MODE_Column
37040 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
37050 73 74 72 63 6d 70 28 7a 2c 22 2d 63 73 76 22 29  strcmp(z,"-csv")
37060 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 61 74  ==0 ){.      dat
37070 61 2e 6d 6f 64 65 20 3d 20 4d 4f 44 45 5f 43 73  a.mode = MODE_Cs
37080 76 3b 0a 20 20 20 20 20 20 6d 65 6d 63 70 79 28  v;.      memcpy(
37090 64 61 74 61 2e 63 6f 6c 53 65 70 61 72 61 74 6f  data.colSeparato
370a0 72 2c 22 2c 22 2c 32 29 3b 0a 20 20 20 20 7d 65  r,",",2);.    }e
370b0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
370c0 2c 22 2d 61 73 63 69 69 22 29 3d 3d 30 20 29 7b  ,"-ascii")==0 ){
370d0 0a 20 20 20 20 20 20 64 61 74 61 2e 6d 6f 64 65  .      data.mode
370e0 20 3d 20 4d 4f 44 45 5f 41 73 63 69 69 3b 0a 20   = MODE_Ascii;. 
370f0 20 20 20 20 20 73 71 6c 69 74 65 33 5f 73 6e 70       sqlite3_snp
37100 72 69 6e 74 66 28 73 69 7a 65 6f 66 28 64 61 74  rintf(sizeof(dat
37110 61 2e 63 6f 6c 53 65 70 61 72 61 74 6f 72 29 2c  a.colSeparator),
37120 20 64 61 74 61 2e 63 6f 6c 53 65 70 61 72 61 74   data.colSeparat
37130 6f 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  or,.            
37140 20 20 20 20 20 20 20 20 20 20 20 53 45 50 5f 55             SEP_U
37150 6e 69 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  nit);.      sqli
37160 74 65 33 5f 73 6e 70 72 69 6e 74 66 28 73 69 7a  te3_snprintf(siz
37170 65 6f 66 28 64 61 74 61 2e 72 6f 77 53 65 70 61  eof(data.rowSepa
37180 72 61 74 6f 72 29 2c 20 64 61 74 61 2e 72 6f 77  rator), data.row
37190 53 65 70 61 72 61 74 6f 72 2c 0a 20 20 20 20 20  Separator,.     
371a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
371b0 20 20 53 45 50 5f 52 65 63 6f 72 64 29 3b 0a 20    SEP_Record);. 
371c0 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72     }else if( str
371d0 63 6d 70 28 7a 2c 22 2d 73 65 70 61 72 61 74 6f  cmp(z,"-separato
371e0 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r")==0 ){.      
371f0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
37200 28 73 69 7a 65 6f 66 28 64 61 74 61 2e 63 6f 6c  (sizeof(data.col
37210 53 65 70 61 72 61 74 6f 72 29 2c 20 64 61 74 61  Separator), data
37220 2e 63 6f 6c 53 65 70 61 72 61 74 6f 72 2c 0a 20  .colSeparator,. 
37230 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
37240 20 20 20 20 20 20 22 25 73 22 2c 63 6d 64 6c 69        "%s",cmdli
37250 6e 65 5f 6f 70 74 69 6f 6e 5f 76 61 6c 75 65 28  ne_option_value(
37260 61 72 67 63 2c 61 72 67 76 2c 2b 2b 69 29 29 3b  argc,argv,++i));
37270 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
37280 74 72 63 6d 70 28 7a 2c 22 2d 6e 65 77 6c 69 6e  trcmp(z,"-newlin
37290 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  e")==0 ){.      
372a0 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e 74 66  sqlite3_snprintf
372b0 28 73 69 7a 65 6f 66 28 64 61 74 61 2e 72 6f 77  (sizeof(data.row
372c0 53 65 70 61 72 61 74 6f 72 29 2c 20 64 61 74 61  Separator), data
372d0 2e 72 6f 77 53 65 70 61 72 61 74 6f 72 2c 0a 20  .rowSeparator,. 
372e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
372f0 20 20 20 20 20 20 22 25 73 22 2c 63 6d 64 6c 69        "%s",cmdli
37300 6e 65 5f 6f 70 74 69 6f 6e 5f 76 61 6c 75 65 28  ne_option_value(
37310 61 72 67 63 2c 61 72 67 76 2c 2b 2b 69 29 29 3b  argc,argv,++i));
37320 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73  .    }else if( s
37330 74 72 63 6d 70 28 7a 2c 22 2d 6e 75 6c 6c 76 61  trcmp(z,"-nullva
37340 6c 75 65 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20  lue")==0 ){.    
37350 20 20 73 71 6c 69 74 65 33 5f 73 6e 70 72 69 6e    sqlite3_snprin
37360 74 66 28 73 69 7a 65 6f 66 28 64 61 74 61 2e 6e  tf(sizeof(data.n
37370 75 6c 6c 56 61 6c 75 65 29 2c 20 64 61 74 61 2e  ullValue), data.
37380 6e 75 6c 6c 56 61 6c 75 65 2c 0a 20 20 20 20 20  nullValue,.     
37390 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
373a0 20 20 22 25 73 22 2c 63 6d 64 6c 69 6e 65 5f 6f    "%s",cmdline_o
373b0 70 74 69 6f 6e 5f 76 61 6c 75 65 28 61 72 67 63  ption_value(argc
373c0 2c 61 72 67 76 2c 2b 2b 69 29 29 3b 0a 20 20 20  ,argv,++i));.   
373d0 20 7d 65 6c 73 65 20 69 66 28 20 73 74 72 63 6d   }else if( strcm
373e0 70 28 7a 2c 22 2d 68 65 61 64 65 72 22 29 3d 3d  p(z,"-header")==
373f0 30 20 29 7b 0a 20 20 20 20 20 20 64 61 74 61 2e  0 ){.      data.
37400 73 68 6f 77 48 65 61 64 65 72 20 3d 20 31 3b 0a  showHeader = 1;.
37410 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 73 74      }else if( st
37420 72 63 6d 70 28 7a 2c 22 2d 6e 6f 68 65 61 64 65  rcmp(z,"-noheade
37430 72 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  r")==0 ){.      
37440 64 61 74 61 2e 73 68 6f 77 48 65 61 64 65 72 20  data.showHeader 
37450 3d 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  = 0;.    }else i
37460 66 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 65 63  f( strcmp(z,"-ec
37470 68 6f 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ho")==0 ){.     
37480 20 53 68 65 6c 6c 53 65 74 46 6c 61 67 28 26 64   ShellSetFlag(&d
37490 61 74 61 2c 20 53 48 46 4c 47 5f 45 63 68 6f 29  ata, SHFLG_Echo)
374a0 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
374b0 73 74 72 63 6d 70 28 7a 2c 22 2d 65 71 70 22 29  strcmp(z,"-eqp")
374c0 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 64 61 74  ==0 ){.      dat
374d0 61 2e 61 75 74 6f 45 51 50 20 3d 20 41 55 54 4f  a.autoEQP = AUTO
374e0 45 51 50 5f 6f 6e 3b 0a 20 20 20 20 7d 65 6c 73  EQP_on;.    }els
374f0 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a 2c 22  e if( strcmp(z,"
37500 2d 65 71 70 66 75 6c 6c 22 29 3d 3d 30 20 29 7b  -eqpfull")==0 ){
37510 0a 20 20 20 20 20 20 64 61 74 61 2e 61 75 74 6f  .      data.auto
37520 45 51 50 20 3d 20 41 55 54 4f 45 51 50 5f 66 75  EQP = AUTOEQP_fu
37530 6c 6c 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  ll;.    }else if
37540 28 20 73 74 72 63 6d 70 28 7a 2c 22 2d 73 74 61  ( strcmp(z,"-sta
37550 74 73 22 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ts")==0 ){.     
37560 20 64 61 74 61 2e 73 74 61 74 73 4f 6e 20 3d 20   data.statsOn = 
37570 31 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  1;.    }else if(
37580 20 73 74 72 63 6d 70 28 7a 2c 22 2d 73 63 61 6e   strcmp(z,"-scan
37590 73 74 61 74 73 22 29 3d 3d 30 20 29 7b 0a 20 20  stats")==0 ){.  
375a0 20 20 20 20 64 61 74 61 2e 73 63 61 6e 73 74 61      data.scansta
375b0 74 73 4f 6e 20 3d 20 31 3b 0a 20 20 20 20 7d 65  tsOn = 1;.    }e
375c0 6c 73 65 20 69 66 28 20 73 74 72 63 6d 70 28 7a  lse if( strcmp(z
375d0 2c 22 2d 62 61 63 6b 73 6c 61 73 68 22 29 3d 3d  ,"-backslash")==
375e0 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 55 6e  0 ){.      /* Un
375f0 64 6f 63 75 6d 65 6e 74 65 64 20 63 6f 6d 6d 61  documented comma
37600 6e 64 2d 6c 69 6e 65 20 6f 70 74 69 6f 6e 3a 20  nd-line option: 
37610 2d 62 61 63 6b 73 6c 61 73 6